[gnu.gcc.bug] bug in ns32k.md

russo@M.CS.UIUC.EDU (Vince Russo) (12/19/88)

I think I posted this bug earlier but I'n not sure mail to the gnu
mailing lists is ever leaving out site.
Since I posted it, however, I have found the bug and a fix for it.
I included the fix at the end of this file.

			--Vince Russo
			russo@cs.uiuc.edu
-----------------------------------------------------------------------

The following program reveals an inconsistency between using inline functions
and non-inline functions with gcc-1.31 for the ns32000.
/*
 * The inline function.
 */
inline unsigned int
floor( unsigned int ia )
{
	ia &= (unsigned int) 0xfffff000;
	return( ia );
}

/*
 * An identical non-inline version.
 */
unsigned int
X1( unsigned int ia )
{
	ia &= (unsigned int) 0xfffff000;
	return( ia );
}

/*
 * A use of the inline version.
 */
unsigned int
X2( unsigned int ia )
{
	return( floor( ia ) );
}
------------------------------------------------------
When compiled for an Encore Multimax (tm-encore.h nm32k.md and output-ns32k.c),
the following (incorrect) code is generated. With or without -0 the same
bug appears.
----------------------------------------------------
.text
	.align 16
.globl _floor
_floor:
	enter [],0
	movd 8(fp),r0
	andw $61440,r0
	exit []
	ret 0
	.align 16
.globl _X1
_X1:
	enter [],0
	movd 8(fp),r0
	andw $61440,r0
	exit []
	ret 0
	.align 16
.globl _X2
_X2:
	enter [],0
	movd 8(fp),r0
	andd $61440,r0	<<<<<<< Why did this become andd instead of andw?
	exit []
	ret 0
----------------------------------------
One a SUN3 the correct code is generated
----------------------------------------
#NO_APP
.text
	.even
.globl _floor
_floor:
	link a6,#0
	movel a6@(8),d0
	andw #61440,d0
	unlk a6
	rts
	.even
.globl _X1
_X1:
	link a6,#0
	movel a6@(8),d0
	andw #61440,d0
	unlk a6
	rts
	.even
.globl _X2
_X2:
	link a6,#0
	movel a6@(8),d0
	andw #61440,d0		<<<<< Still andw here
	unlk a6
	rts


------------BUG FIX INCLUDED BELOW-----------------

% diff ns32k.md.AS-DISTRIBUTED ns32k.md

1088c1088,1089
<         INTVAL (operands[2]) &= 0xff;
---
> 	operands[2] = gen_rtx (CONST_INT, VOIDmode,
> 			INTVAL (operands[2]) & 0xff);
1095c1096,1097
<         INTVAL (operands[2]) &= 0xffff;
---
> 	operands[2] = gen_rtx (CONST_INT, VOIDmode,
> 			INTVAL (operands[2]) & 0xffff);
1114c1116,1117
<       INTVAL (operands[2]) &= 0xff;
---
>       operands[2] = gen_rtx (CONST_INT, VOIDmode,
> 				INTVAL (operands[2]) & 0xff);