lgm@ODDJOB.UCHICAGO.EDU (12/26/88)
SYNOPSIS:
The '-fforce-addr' and '-fforce-mem' options cause GCC 1.32 to
generate incorrect memory references on the 680x0 architecture
in certain cases. In particular, the referencing of the 'char'
or 'short' portion of an 'int' generates assembly language
*without* the necessary offset into the longword (i.e., as if the
68000 were little-endian instead of the big-endian architecture
that it is).
MACHINE AND OS:
AT&T UNIX PC 3B1 (based on Motorola 68010 microprocessor) running
OS Version 3.5 (compatible with UNIX System V Release 2).
CONFIGURATION:
'config.gcc 3b1'
TRANSCRIPT (INPUT FILE, COMMAND LINE, OUTPUT):
_______________________________________
$ cat short.c
extern int i;
extern int arr[];
extern short s;
extern char c;
void
f( k )
int k;
{
s = i; /* 'int' => 'short' */
c = arr[ k ]; /* 'int' => 'char' */
}
$ ../src/stage1/gcc -B../src/stage1/ -v -S -O short.c
gcc version 1.32
../src/stage1/cpp -v -undef -D__GNUC__ -Dmc68k -Dunix -Dunixpc -D__mc68k__ -D__unix__ -D__unixpc__ -D__OPTIMIZE__ short.c /tmp/cca26036.cpp
GNU CPP version 1.32
../src/stage1/cc1 /tmp/cca26036.cpp -quiet -dumpbase short.c -O -version -o short.s
GNU C version 1.32 (68k, SGS/AT&T unixpc syntax) compiled by GNU C version 1.32.
$ cat short.s # With '-O' only
file "short.c"
text
even
global f
f:
link.w %a6,&0
mov.w i+2,s # get 'short' from 'i'
lea arr,%a0
mov.l 8(%fp),%d0
asl.l &2,%d0
mov.b 3(%a0,%d0.l),c # get 'char' from 'arr[ k ]'
unlk %a6
rts
$ ../src/stage1/gcc -B../src/stage1/ -v -S -O -fforce-mem short.c
gcc version 1.32
../src/stage1/cpp -v -undef -D__GNUC__ -Dmc68k -Dunix -Dunixpc -D__mc68k__ -D__unix__ -D__unixpc__ -D__OPTIMIZE__ short.c /tmp/cca26040.cpp
GNU CPP version 1.32
../src/stage1/cc1 /tmp/cca26040.cpp -quiet -dumpbase short.c -fforce-mem -O -version -o short.s
GNU C version 1.32 (68k, SGS/AT&T unixpc syntax) compiled by GNU C version 1.32.
$ cat short.s # With '-fforce-mem'
file "short.c"
text
even
global f
f:
link.w %a6,&0
mov.w i,s # No offset into 'i'!
lea arr,%a0
mov.l 8(%fp),%d0
asl.l &2,%d0
mov.b (%a0,%d0.l),c # No offset into 'arr[ k ]'!
unlk %a6
rts
$
_______________________________________
EXPLANATION OF TRANSCRIPT:
'-fforce-mem' seems to be removing the byte offset necessary to
extract a 'char' or 'short' from an 'int' in memory. Although
not shown here, '-fforce-addr' has the same problem.
Lawrence G. Mayka
Aurora, Illinois
lgm@lmayk.UUCP
chinet!lmayk!lgm