Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1 6/24/83; site unccvax.UUCP Path: utzoo!linus!philabs!cmcl2!seismo!harvard!talcott!panda!genrad!decvax!mcnc!unccvax!dsi From: dsi@unccvax.UUCP (Dataspan Inc) Newsgroups: net.micro.68k,net.lang.c Subject: Question of Ignorance Message-ID: <198@unccvax.UUCP> Date: Wed, 8-May-85 15:08:27 EDT Article-I.D.: unccvax.198 Posted: Wed May 8 15:08:27 1985 Date-Received: Sat, 11-May-85 08:44:48 EDT Organization: UNC-Charlotte Lines: 152 Xref: linus net.micro.68k:680 net.lang.c:4668 Pardon my excess stupididy, but I have a question about the ** CORRECT ** way a C-compiler (by definition) should handle the following program. Consider main.c, below /* * main.c */ char *charptr; short *shortptr; int *intptr; long *longptr; main() { if(charptr == 32); if(intptr == 32) ; if(longptr== 32) ; if(shortptr == 32 ); } /* * end main.c */ This is the assembly language that my VAX 4.2bsd included-in-the- distribution C-compiler takes care of main.c: LL0: .data .comm _charptr,4 .comm _shortptr,4 .comm _intptr,4 .comm _longptr,4 .text .align 1 .globl _main _main: .word L16 jbr L18 L19: cmpl _charptr,$32 jneq L20 L20: cmpl _intptr,$32 jneq L21 L21: cmpl _longptr,$32 jneq L22 L22: cmpl _shortptr,$32 jneq L23 L23: ret .set L16,0x0 L18: jbr L19 .data And * THIS * is the way the Alcyon C-compiler handles it: .globl _charptr .comm _charptr,4 .globl _shortptr .comm _shortptr,4 .globl _intptr .comm _intptr,4 .globl _longptr .comm _longptr,4 .globl _main .text _main: ~~main: ~_EnD__=8 link R14,#-4 *line 8 *line 8 cmp.l #32,_charptr bne L2 L2: *line 9 *line 9 cmp.l #64,_intptr bne L3 L3: *line 10 *line 10 cmp.l #128,_longptr bne L4 L4: *line 11 *line 11 cmp.l #64,_shortptr bne L5 L5: L1: unlk R14 rts .data Note that the Alcyon compiler leaves the constant alone if the thing is a char; shifts it left one if it is an int (2 bytes), and left two if it is a long (4 bytes). Bill Allen at Alcyon Corporation assures me that this is not a bug, that constants MUST BE MULTIPLIED BY THE NUMBER OF BYTES when doing a test with a pointer. He even swears that the regular C compiler cc must do this. When you are doing a proprietary product, it is sometimes nice to do stupid things like mixing types in an if() and having things be handled intelligently. Of course, you can do something like: long *longptr; long templong; main() { . . templong = longptr; if (templong == 32) ; /* do something nerdy */ . . } but this is just as bad as doing what you (thought?) you wanted inside the if, anyway (??). Jim Wiley, an associate, thinks that the Alcyon confuses alignment problem with longptr = longptr + 32; which of course means 32 boundaries, i.e. 128 would be the immediate operand. I'm really ignorant about C-language with this particular problem, and would greatly appreciate comments on these hypothetical programs and their .asm files. -dya- PS: If you have an oddball compiler, a listing generated from the first main() above would be interesting... PSS: The Whitesmiths handles it "correctly" (the immediate operand to cmpi.l is #32 in every case) David Anthony Senior Analog Nut DataSpan, Inc.