diff options
Diffstat (limited to 'gcc/config/m68k/m68k.md')
-rw-r--r-- | gcc/config/m68k/m68k.md | 77 |
1 files changed, 37 insertions, 40 deletions
diff --git a/gcc/config/m68k/m68k.md b/gcc/config/m68k/m68k.md index b3f12d8..b6ce6a8 100644 --- a/gcc/config/m68k/m68k.md +++ b/gcc/config/m68k/m68k.md @@ -632,51 +632,35 @@ (define_expand "cmp<mode>" [(set (cc0) - (compare (match_operand:FP 0 "general_operand" "") - (match_operand:FP 1 "general_operand" "")))] + (compare (match_operand:FP 0 "register_operand" "") + (match_operand:FP 1 "fp_src_operand" "")))] "TARGET_HARD_FLOAT" -{ - m68k_last_compare_had_fp_operands = 1; - if (TARGET_COLDFIRE && !reload_completed) - operands[1] = force_reg (<MODE>mode, operands[1]); -}) + "m68k_last_compare_had_fp_operands = 1;") -(define_insn "cmp<mode>_68881" +(define_insn "*cmp<mode>_68881" [(set (cc0) - (compare (match_operand:FP 0 "general_operand" "f,m<FP:const>") - (match_operand:FP 1 "general_operand" "f<FP:dreg>m<FP:const>,f")))] - "TARGET_68881" -{ - cc_status.flags = CC_IN_68881; - if (FP_REG_P (operands[0])) - { - if (FP_REG_P (operands[1])) - return "fcmp%.x %1,%0"; - else - return "fcmp%.<FP:prec> %f1,%0"; - } - cc_status.flags |= CC_REVERSED; /*|*/ - return "fcmp%.<FP:prec> %f0,%1"; -} + (compare (match_operand:FP 0 "fp_src_operand" "f,f,<FP:dreg>mF") + (match_operand:FP 1 "fp_src_operand" "f,<FP:dreg>mF,f")))] + "TARGET_68881 + && (register_operand (operands[0], <MODE>mode) + || register_operand (operands[1], <MODE>mode))" + "@ + fcmp%.x %1,%0 + fcmp%.<FP:prec> %f1,%0 + fcmp%.<FP:prec> %0,%f1" [(set_attr "type" "fcmp")]) -(define_insn "cmp<mode>_cf" +(define_insn "*cmp<mode>_cf" [(set (cc0) - (compare (match_operand:FP 0 "general_operand" "f,<FP:dreg><Q>U") - (match_operand:FP 1 "general_operand" "f<FP:dreg><Q>U,f")))] - "TARGET_COLDFIRE_FPU" -{ - cc_status.flags = CC_IN_68881; - if (FP_REG_P (operands[0])) - { - if (FP_REG_P (operands[1])) - return "fcmp%.d %1,%0"; - else - return "fcmp%.<FP:prec> %f1,%0"; - } - cc_status.flags |= CC_REVERSED; /*|*/ - return "fcmp%.<FP:prec> %f0,%1"; -} + (compare (match_operand:FP 0 "fp_src_operand" "f,f,<FP:dreg><Q>U") + (match_operand:FP 1 "fp_src_operand" "f,<FP:dreg><Q>U,f")))] + "TARGET_COLDFIRE_FPU + && (register_operand (operands[0], <MODE>mode) + || register_operand (operands[1], <MODE>mode))" + "@ + fcmp%.d %1,%0 + fcmp%.<FP:prec> %f1,%0 + fcmp%.<FP:prec> %0,%f1" [(set_attr "type" "fcmp")]) ;; Recognizers for btst instructions. @@ -7683,7 +7667,20 @@ "trap #7" [(set_attr "type" "trap")]) -(define_insn "conditional_trap" +(define_expand "conditional_trap" + [(trap_if (match_operator 0 "valid_dbcc_comparison_p" + [(cc0) (const_int 0)]) + (match_operand:SI 1 "const_int_operand" "I"))] + "TARGET_68020" +{ + if (m68k_last_compare_had_fp_operands) + { + m68k_last_compare_had_fp_operands = 0; + FAIL; + } +}) + +(define_insn "*conditional_trap" [(trap_if (match_operator 0 "valid_dbcc_comparison_p" [(cc0) (const_int 0)]) (match_operand:SI 1 "const_int_operand" "I"))] |