[gnu.gcc.bug] '-fforce-addr', '-fforce-mem' problem in GCC 1.32 for 680x0

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