[gnu.gcc.bug] bug report for Gcc V1.34, m68k

bammi@DSRGSUN.CES.CWRU.EDU (Jwahar R. Bammi) (03/18/89)

Bug report for
    Gcc V1.34 (as distributed) -m68000 only (-m68020 OK)
Configuration: (config.gcc sun3 (3/50, SunOS 3.5))
	aux-output.c -> output-m68k.c
	config.h -> xm-m68k.h
	md -> m68k.md
	tm.h -> tm-sun3.h
Compile Command:
	gcc -O -S bug.c -m68000
Sample Program that shows the bug:
	main()
	{
	    char *s;
	    s = "...";
	    if (s[2] != '.') { /* bug from here */
		foo();
	    }
	}

Assembly Output:
#NO_APP
gcc_compiled.:
.text
LC0:
	.ascii "...\0"
	.even
.globl _main
_main:
	link a6,#0
	cmpb #46,LC0+2 <- bug here for m68000, LC0+2 is not a data alterable
	jeq L2            addressing mode. (OK on m68020 where data addressing
	jbsr _foo	  modes are allowed for second operand).
L2:
	unlk a6
	rts

Explaination:
	The cmpb instruction on the m68000 allows only a data alterable
addressing modes for the second operand. (On the m68020 data addressing
modes are allowed, so the above example is OK). As illustraed above, gcc
generates `LC0+2' for the second operand which is not a data alterable
addressing mode, as LC0: is in the text segment (strings not being writable).
I read and re-read Chapter 11 of the manual, but cannot see how to specify
the correct constraint for this situation to the template in m68k.md for
cmpqi. (BTW i was trying to run the code on a 68000 machine (AtariST) when
i discovered this. The above example shows up the problem  when
trying to run s25() of the c-torture-test suite on a m68000 system).
The cmpb instruction above, will generate an exception 4 (illegal instruction)
on a m68000 system.
--
usenet: {decvax,sun}!cwjcc!dsrgsun!bammi	jwahar r. bammi
csnet:       bammi@dsrgsun.ces.CWRU.edu
arpa:        bammi@dsrgsun.ces.CWRU.edu
compuServe:  71515,155