satz@CISCO.COM (03/12/89)
The following program when compiled on SunOS 3.5 (3/280) using gcc 1.34 loads the wrong byte from a volatile location. typedef struct foo1 { volatile unsigned short *data; volatile unsigned short *status; } footype; void test (ptr) footype *ptr; { register unsigned int status; register int flag; register unsigned char c; while ((status = *ptr->status) & 1) { c = *ptr->data; if (status & 128) { while (*ptr->status & 1) c = *ptr->data; c = 0; flag = doit(ptr,c,1); } } } The temporary variable c when declared as a char gets the upper byte of *ptr->data instead of the lower. The workaround we used was to declare c as an unsigned short. gcc version 1.34 /usr/src/gnu/gcc-1.34/cpp -v -DCSC2 -I../h -undef -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__OPTIMIZE__ -D__HAVE_68881__ -Dmc68020 foo.c /tmp/cca12938.cpp GNU CPP version 1.34 /usr/src/gnu/gcc-1.34/cc1 /tmp/cca12938.cpp -quiet -dumpbase foo.c -O -W -version -o foo.s GNU C version 1.34 (68k, MIT syntax) compiled by GNU C version 1.34. #NO_APP gcc_compiled.: .text .even .globl _test _test: link a6,#0 moveml #0x2020,sp@- movel a6@(8),a2 clrl d2 jra L2 L8: movel a2@,a0 moveb a0@(1),d0 <-- off by one tstb d2 jge L2 movel a2@(4),a1 jra L5 L7: movel a2@,a0 moveb a0@(1),d0 L5: movew a1@,d0 btst #0,d0 jne L7 pea 1:w clrl sp@- movel a2,sp@- jbsr _doit addw #12,sp L2: movel a2@(4),a0 movew a0@,a0 movew a0,d2 btst #0,d2 jne L8 moveml a6@(-8),#0x404 unlk a6 rts