Thread View: gnu.gcc.bug
1 messages
1 total messages
Started by Hisashige Ando
Tue, 14 Apr 1992 00:37
gcc-2.1 for i386 bug report
Author: Hisashige Ando
Date: Tue, 14 Apr 1992 00:37
Date: Tue, 14 Apr 1992 00:37
262 lines
7603 bytes
7603 bytes
This bug report is made of 3 parts.
gcc-2.1 made with configure --host=sparc i386 generates code below.
hando@prd.cs.fujitsu.co.jp (Hisashige Ando)
****** 1st part of bug report *****************************
It generates, 80387 FPU code even with -msoft-float.
-----------------dialogue---------------------------------
gcc version 2.1
/home/hando/gcc2/gcc-2.1/cpp -lang-c -v -undef -D__GNUC__=2 -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ -D__sparc -D__sun -D__unix ftest.c /usr/tmp/cca00965.i
GNU CPP version 2.1 (80386, ATT syntax)
/home/hando/gcc2/gcc-2.1/cc1 /usr/tmp/cca00965.i -quiet -dumpbase ftest.c -msoft-float -version -o ftest.s
GNU C version 2.1 (80386, ATT syntax) compiled by CC.
------------------source-----------------------------------
double gdx;
float gfx;
double dfl(double x)
{
gdx = x;
return gdx;
}
float fl(float x)
{
gfx = x;
return gfx;
}
-----------------assembler output--------------------------
.file "ftest.c"
gcc2_compiled.:
.text
.align 4
.globl dfl
dfl:
pushl %ebp
movl %esp,%ebp
fldl 8(%ebp)
fstpl gdx
fldl gdx
jmp .L1
.align 4
.L1:
leave
ret
.align 4
.globl fl
fl:
pushl %ebp
movl %esp,%ebp
flds 8(%ebp)
fstps gfx
flds gfx
jmp .L2
.align 4
.L2:
leave
ret
.comm gdx,8
.comm gfx,4
-------------------------------------------------------------
I believe,
1. the portion below in i386sco.h (which is tm.h) has to
be enabled.
2. register constraint of movsf and movdf shoud have 'r' like below.
[(set (match_operand:SF 0 "general_operand" "=fr,frm,!*rf,!*rm")
(match_operand:SF 1 "general_operand" "frmG,fr,*rfm,*rfF"))]
3. i386.h REG_CLASS_FROM_LETTER(C) should be like this.
(C) == 'f' ? (TARGET_80387 ? FLOAT_REGS : NO_REGS) : \
4. unrelated to the above problem, but,
4.1 swapdf seems to need TARTGET_80387 as a condition.
-------------------i386sco.h(tm.h)---------------------------
#if 0 /* Not yet certain whether this is needed. */
/* If no 387, use the general regs to return floating values,
since this system does not emulate the 80387. */
#undef VALUE_REGNO(MODE)
#define VALUE_REGNO(MODE) \
((TARGET_80387 && ((MODE) == SFmode || (MODE) == DFmode)) \
? FIRST_FLOAT_REG : 0)
#undef HARD_REGNO_MODE_OK(REGNO, MODE)
#define HARD_REGNO_MODE_OK(REGNO, MODE) \
((REGNO) < 2 ? 1 \
: (REGNO) < 4 ? 1 \
: (REGNO) >= 8 ? ((GET_MODE_CLASS (MODE) == MODE_FLOAT \
|| GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT) \
&& TARGET_80387 \
&& GET_MODE_UNIT_SIZE (MODE) <= 8) \
: (MODE) != QImode)
#endif
-------------------i386.md(md)---------------------------------
(define_insn "movsf"
[(set (match_operand:SF 0 "general_operand" "=f,fm,!*rf,!*rm")
(match_operand:SF 1 "general_operand" "fmG,f,*rfm,*rfF"))]
""
"*
{
int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
/* First handle a `pop' insn or a `fld %st(0)' */
.
.
.
(define_insn "movdf"
[(set (match_operand:DF 0 "general_operand" "=f,fm,!*rf,!*rm")
(match_operand:DF 1 "general_operand" "fmG,f,*rfm,*rfF"))]
""
"*
{
int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
----------------------i386.h---------------------------------------
/* Get reg_class from a letter such as appears in the machine description. */
#define REG_CLASS_FROM_LETTER(C) \
((C) == 'r' ? GENERAL_REGS : \
(C) == 'q' ? Q_REGS : \
(C) == 'f' ? FLOAT_REGS : \
(C) == 't' ? FP_TOP_REG : \
(C) == 'u' ? FP_SECOND_REG : \
(C) == 'a' ? AREG : \
(C) == 'b' ? BREG : \
(C) == 'c' ? CREG : \
(C) == 'd' ? DREG : \
(C) == 'D' ? DIREG : \
(C) == 'S' ? SIREG : NO_REGS)
----------------------i386.md-----------------------------------
(define_insn "swapdf"
[(set (match_operand:DF 0 "register_operand" "f")
(match_operand:DF 1 "register_operand" "f"))
(set (match_dup 1)
(match_dup 0))]
""
"*
{
if (STACK_TOP_P (operands[0]))
return AS1 (fxch,%1);
else
return AS1 (fxch,%0);
}")
******* 2nd part of bug report *********************************
gcc-2.1 configured with " --host=sparc i386 " dies with following code
compiled with -O . This is the trimmed down version which reproduces
this problem and the action of this program is useless.
----------------source------------------------------------------
union llval { double d;
long long ll;
};
long long
mincase(double x, int n)
{
union llval val;
val.d = x;
if(n >= 0) {
val.ll <<= 63;
} else {
val.ll += 1 << -n;
val.ll >>= -n;
}
return val.ll;
}
---------------------------------------------------------------
gcc version 2.1
/home/hando/gcc2/gcc-2.1/cpp -lang-c -v -undef -D__GNUC__=2 -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ -D__sparc -D__sun -D__unix -D__OPTIMIZE__ mincase.c /usr/tmp/cca00280.i
GNU CPP version 2.1 (80386, ATT syntax)
/home/hando/gcc2/gcc-2.1/cc1 /usr/tmp/cca00280.i -quiet -dumpbase mincase.c -O -version -o mincase.s
GNU C version 2.1 (80386, ATT syntax) compiled by CC.
mincase.c: In function `midcase':
mincase.c:18: internal error--unrecognizable insn:
(insn 38 37 39 (parallel[
(set (reg:DI 31)
(ashiftrt:DI (reg/v:DI 23)
(subreg:QI (reg:SI 25) 0)))
(clobber (subreg:QI (reg:SI 30) 0))
] ) -1 (insn_list 34 (nil))
(expr_list:REG_DEAD (reg/v:DI 23)
(expr_list:REG_DEAD (reg:SI 25)
(expr_list:REG_UNUSED (reg:SI 30)
(nil)))))
gcc: Internal compiler error: program cc1 got fatal signal 6
***** 3rd part of bug report *******************************
This program compiles OK without -O, but assmbler output has
other problems.
------------------assembler output without -O ----------------
.file "mincase.c"
gcc2_compiled.:
.text
.align 4
.globl mincase
mincase:
pushl %ebp
movl %esp,%ebp
subl $8,%esp
pushl %edi
pushl %esi
pushl %ebx
fldl 8(%ebp)
fstpl -8(%ebp)
cmpl $0,16(%ebp)
jl .L2
movl -8(%ebp),%esi
movl -4(%ebp),%edi
movl %esi,%edi
xorl %esi,%esi
sal%edi $31,%edi <-----strange code
movl %esi,-8(%ebp)
movl %edi,-4(%ebp)
jmp .L3
.align 4
.L2:
movl 16(%ebp),%ecx
negl %ecx
movl $1,%ebx
sall %cl,%ebx
movl %ebx,%ecx
sarl $31,%ecx
movl %ebx,%eax
movl %ecx,%edx
movl %eax,%eax
movl %edx,%edx
addl %eax,-8(%ebp)
adcl %edx,-4(%ebp)
movl 16(%ebp),%ecx
negl %ecx
movl -8(%ebp),%esi
movl -4(%ebp),%edi
rorb $1,%cl
shrdl %edi,%esi <----- 386 gas does not like this format
sarl %cl,%edi it likes to have
shrdl %edi,%esi shrdl %cl, %edi, %esi
sarl %cl,%edi although %cl is redundant information
shrb $7,%cl
shrdl %edi,%esi
sarl %cl,%edi
movl %esi,-8(%ebp)
movl %edi,-4(%ebp)
.L3:
movl -8(%ebp),%eax
movl -4(%ebp),%edx
jmp .L1
.align 4
.L1:
leal -20(%ebp),%esp
popl %ebx
popl %esi
popl %edi
leave
ret
*********** end of bug report ********************************
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads