grunwald@FOOBAR.COLORADO.EDU (Dirk Grunwald) (12/05/89)
Think I found that bug I mentioned a while back.
The following
----------
int foo(int i, float f)
{
return ( i + f );
}
main()
{
printf("foo is %d\n", foo(10,10.5));
}
----------
produces "foo is 10." If you change the float f to a double, it works.
the problem is the useless statement I saw...
mfc1 $6,$f4
in the output. This is actually part of the calling sequence -- we should
move scalar reg $6 (first float arg) to a float reg ($f4), but this does
it the other way around.
The patch is in mips.md,
(define_insn "movsf"
[(set (match_operand:SF 0 "general_operand" "=f,rf,m,f,!rf")
(match_operand:SF 1 "general_operand" "f,m,rf,F,rf"))
(clobber (reg:SI 24))]
""
"*
{
if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG)
{
if (REGNO (operands[0]) >= 32)
{
if (REGNO (operands[1]) >= 32)
return \"mov.s %0,%1\\t#movsf %1 -> %0 \";
return \"mfc1 %1,%0\";
}
if (REGNO (operands[1]) >= 32)
return \"mfc1 %0,%1\";
return \"add%: %0,$0,%1\";
---- should be...
(define_insn "movsf"
[(set (match_operand:SF 0 "general_operand" "=f,rf,m,f,!rf")
(match_operand:SF 1 "general_operand" "f,m,rf,F,rf"))
(clobber (reg:SI 24))]
""
"*
{
if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG)
{
if (REGNO (operands[0]) >= 32)
{
if (REGNO (operands[1]) >= 32)
! return \"mov.s %0,%1\\t#movsf %1 -> %0 \"; /* sf -> sf */
! return \"mtc1 %1,%0\"; /* si -> sf */
}
if (REGNO (operands[1]) >= 32)
! return \"mfc1 %0,%1\"; /* sf -> si */
return \"add%: %0,$0,%1\";
------
this bug is present in 1.36 and 1.36.9.