i386.c (output_fp_compare): Add generation of ftst instruction.
* config/i386/i386.c (output_fp_compare): Add generation of ftst instruction. * config/i386/i386.md (*cmpfp_0_sf, cmpfp_0_df, cmpfp_0_xf): Use output_fp_compare () function. (cmpfp_i, *cmpfp_i_sse, *cmpfp_i_sse_only): Fix insn constraint. (fix_truncdi_memory): Remove operands[5] copy. From-SVN: r87482
This commit is contained in:
parent
19525b57d1
commit
869d095e24
@ -1,3 +1,12 @@
|
|||||||
|
2004-09-14 Uros Bizjak <uros@kss-loka.si>
|
||||||
|
|
||||||
|
* config/i386/i386.c (output_fp_compare): Add generation
|
||||||
|
of ftst instruction.
|
||||||
|
* config/i386/i386.md (*cmpfp_0_sf, cmpfp_0_df, cmpfp_0_xf):
|
||||||
|
Use output_fp_compare () function.
|
||||||
|
(cmpfp_i, *cmpfp_i_sse, *cmpfp_i_sse_only): Fix insn constraint.
|
||||||
|
(fix_truncdi_memory): Remove operands[5] copy.
|
||||||
|
|
||||||
2004-09-14 Kazu Hirata <kazu@cs.umass.edu>
|
2004-09-14 Kazu Hirata <kazu@cs.umass.edu>
|
||||||
|
|
||||||
* config/m32r/m32r.md, config/m68k/m68kelf.h,
|
* config/m32r/m32r.md, config/m68k/m68kelf.h,
|
||||||
|
@ -7228,15 +7228,20 @@ const char *
|
|||||||
output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
|
output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
|
||||||
{
|
{
|
||||||
int stack_top_dies;
|
int stack_top_dies;
|
||||||
rtx cmp_op0 = operands[0];
|
rtx cmp_op0, cmp_op1;
|
||||||
rtx cmp_op1 = operands[1];
|
|
||||||
int is_sse = SSE_REG_P (operands[0]) | SSE_REG_P (operands[1]);
|
int is_sse = SSE_REG_P (operands[0]) | SSE_REG_P (operands[1]);
|
||||||
|
|
||||||
if (eflags_p == 2)
|
if (eflags_p == 2)
|
||||||
{
|
{
|
||||||
cmp_op0 = cmp_op1;
|
cmp_op0 = operands[1];
|
||||||
cmp_op1 = operands[2];
|
cmp_op1 = operands[2];
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cmp_op0 = operands[0];
|
||||||
|
cmp_op1 = operands[1];
|
||||||
|
}
|
||||||
|
|
||||||
if (is_sse)
|
if (is_sse)
|
||||||
{
|
{
|
||||||
if (GET_MODE (operands[0]) == SFmode)
|
if (GET_MODE (operands[0]) == SFmode)
|
||||||
@ -7256,6 +7261,17 @@ output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
|
|||||||
|
|
||||||
stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
|
stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
|
||||||
|
|
||||||
|
if (cmp_op1 == CONST0_RTX (GET_MODE (cmp_op1)))
|
||||||
|
{
|
||||||
|
if (stack_top_dies)
|
||||||
|
{
|
||||||
|
output_asm_insn ("ftst\n\tfnstsw\t%0", operands);
|
||||||
|
return TARGET_USE_FFREEP ? "ffreep\t%y1" : "fstp\t%y1";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return "ftst\n\tfnstsw\t%0";
|
||||||
|
}
|
||||||
|
|
||||||
if (STACK_REG_P (cmp_op1)
|
if (STACK_REG_P (cmp_op1)
|
||||||
&& stack_top_dies
|
&& stack_top_dies
|
||||||
&& find_regno_note (insn, REG_DEAD, REGNO (cmp_op1))
|
&& find_regno_note (insn, REG_DEAD, REGNO (cmp_op1))
|
||||||
|
@ -805,15 +805,7 @@
|
|||||||
(match_operand:SF 2 "const0_operand" "X"))]
|
(match_operand:SF 2 "const0_operand" "X"))]
|
||||||
UNSPEC_FNSTSW))]
|
UNSPEC_FNSTSW))]
|
||||||
"TARGET_80387"
|
"TARGET_80387"
|
||||||
{
|
"* return output_fp_compare (insn, operands, 2, 0);"
|
||||||
if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
|
|
||||||
{
|
|
||||||
output_asm_insn ("ftst\;fnstsw\t%0", operands);
|
|
||||||
return TARGET_USE_FFREEP ? "ffreep\t%y1" : "fstp\t%y1";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return "ftst\;fnstsw\t%0";
|
|
||||||
}
|
|
||||||
[(set_attr "type" "multi")
|
[(set_attr "type" "multi")
|
||||||
(set_attr "mode" "SF")])
|
(set_attr "mode" "SF")])
|
||||||
|
|
||||||
@ -825,15 +817,7 @@
|
|||||||
(match_operand:DF 2 "const0_operand" "X"))]
|
(match_operand:DF 2 "const0_operand" "X"))]
|
||||||
UNSPEC_FNSTSW))]
|
UNSPEC_FNSTSW))]
|
||||||
"TARGET_80387"
|
"TARGET_80387"
|
||||||
{
|
"* return output_fp_compare (insn, operands, 2, 0);"
|
||||||
if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
|
|
||||||
{
|
|
||||||
output_asm_insn ("ftst\;fnstsw\t%0", operands);
|
|
||||||
return TARGET_USE_FFREEP ? "ffreep\t%y1" : "fstp\t%y1";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return "ftst\;fnstsw\t%0";
|
|
||||||
}
|
|
||||||
[(set_attr "type" "multi")
|
[(set_attr "type" "multi")
|
||||||
(set_attr "mode" "DF")])
|
(set_attr "mode" "DF")])
|
||||||
|
|
||||||
@ -845,15 +829,7 @@
|
|||||||
(match_operand:XF 2 "const0_operand" "X"))]
|
(match_operand:XF 2 "const0_operand" "X"))]
|
||||||
UNSPEC_FNSTSW))]
|
UNSPEC_FNSTSW))]
|
||||||
"TARGET_80387"
|
"TARGET_80387"
|
||||||
{
|
"* return output_fp_compare (insn, operands, 2, 0);"
|
||||||
if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
|
|
||||||
{
|
|
||||||
output_asm_insn ("ftst\;fnstsw\t%0", operands);
|
|
||||||
return TARGET_USE_FFREEP ? "ffreep\t%y1" : "fstp\t%y1";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return "ftst\;fnstsw\t%0";
|
|
||||||
}
|
|
||||||
[(set_attr "type" "multi")
|
[(set_attr "type" "multi")
|
||||||
(set_attr "mode" "XF")])
|
(set_attr "mode" "XF")])
|
||||||
|
|
||||||
@ -1032,7 +1008,7 @@
|
|||||||
"TARGET_80387 && TARGET_CMOVE
|
"TARGET_80387 && TARGET_CMOVE
|
||||||
&& !SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
|
&& !SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
|
||||||
&& FLOAT_MODE_P (GET_MODE (operands[0]))
|
&& FLOAT_MODE_P (GET_MODE (operands[0]))
|
||||||
&& GET_MODE (operands[0]) == GET_MODE (operands[0])"
|
&& GET_MODE (operands[0]) == GET_MODE (operands[1])"
|
||||||
"* return output_fp_compare (insn, operands, 1, 0);"
|
"* return output_fp_compare (insn, operands, 1, 0);"
|
||||||
[(set_attr "type" "fcmp")
|
[(set_attr "type" "fcmp")
|
||||||
(set (attr "mode")
|
(set (attr "mode")
|
||||||
@ -1050,7 +1026,7 @@
|
|||||||
(match_operand 1 "nonimmediate_operand" "f#x,xm#f")))]
|
(match_operand 1 "nonimmediate_operand" "f#x,xm#f")))]
|
||||||
"TARGET_80387
|
"TARGET_80387
|
||||||
&& SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
|
&& SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
|
||||||
&& GET_MODE (operands[0]) == GET_MODE (operands[0])"
|
&& GET_MODE (operands[0]) == GET_MODE (operands[1])"
|
||||||
"* return output_fp_compare (insn, operands, 1, 0);"
|
"* return output_fp_compare (insn, operands, 1, 0);"
|
||||||
[(set_attr "type" "fcmp,ssecomi")
|
[(set_attr "type" "fcmp,ssecomi")
|
||||||
(set (attr "mode")
|
(set (attr "mode")
|
||||||
@ -1064,7 +1040,7 @@
|
|||||||
(compare:CCFP (match_operand 0 "register_operand" "x")
|
(compare:CCFP (match_operand 0 "register_operand" "x")
|
||||||
(match_operand 1 "nonimmediate_operand" "xm")))]
|
(match_operand 1 "nonimmediate_operand" "xm")))]
|
||||||
"SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
|
"SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
|
||||||
&& GET_MODE (operands[0]) == GET_MODE (operands[0])"
|
&& GET_MODE (operands[0]) == GET_MODE (operands[1])"
|
||||||
"* return output_fp_compare (insn, operands, 1, 0);"
|
"* return output_fp_compare (insn, operands, 1, 0);"
|
||||||
[(set_attr "type" "ssecomi")
|
[(set_attr "type" "ssecomi")
|
||||||
(set (attr "mode")
|
(set (attr "mode")
|
||||||
@ -4161,7 +4137,7 @@
|
|||||||
(clobber (match_scratch:DF 4 "=&1f"))]
|
(clobber (match_scratch:DF 4 "=&1f"))]
|
||||||
"TARGET_80387 && FLOAT_MODE_P (GET_MODE (operands[1]))
|
"TARGET_80387 && FLOAT_MODE_P (GET_MODE (operands[1]))
|
||||||
&& (!SSE_FLOAT_MODE_P (GET_MODE (operands[1])) || !TARGET_64BIT)"
|
&& (!SSE_FLOAT_MODE_P (GET_MODE (operands[1])) || !TARGET_64BIT)"
|
||||||
"* operands[5] = operands[4]; return output_fix_trunc (insn, operands);"
|
"* return output_fix_trunc (insn, operands);"
|
||||||
[(set_attr "type" "fistp")
|
[(set_attr "type" "fistp")
|
||||||
(set_attr "i387_cw" "trunc")
|
(set_attr "i387_cw" "trunc")
|
||||||
(set_attr "mode" "DI")])
|
(set_attr "mode" "DI")])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user