From mboxrd@z Thu Jan 1 00:00:00 1970 From: Greg McGary To: law@cygnus.com Cc: gcc@gcc.gnu.org Subject: Re: MIPS div_trap vs. general conditional traps Date: Thu, 07 Sep 2000 16:53:00 -0000 Message-id: References: <8419.968364901@upchuck> X-SW-Source: 2000-09/msg00170.html Jeffrey A Law writes: > In message < 200009062017.NAA06786@kayak.mcgary.org >you write: > > I implemented conditional traps for MIPS using the MIPS > > conditional-trap machine instructions for ISA>=2 and using the MIPS > > `break' instruction for ISA==1. I posted the patch last night. > Sounds like a good thing. Care to go all the way and review it? 8^) Here's a newer mips.md that places the general conditional traps before the div_traps for reasons explained in the comments: Greg Index: gcc/config/mips/mips.md =================================================================== RCS file: /cvs/gcc/egcs/gcc/config/mips/mips.md,v retrieving revision 1.84 retrieving revision 1.81.4.5 diff -u -p -r1.84 -r1.81.4.5 --- mips.md 2000/08/08 22:40:49 1.84 +++ mips.md 2000/09/07 17:12:08 1.81.4.5 @@ -495,7 +495,48 @@ ;; ;; (define_function_unit "sqrt" 1 1 (and (eq_attr "type" "fsqrt") (eq_attr "mode" "SF")) 54 0) ;; (define_function_unit "sqrt" 1 1 (and (eq_attr "type" "fsqrt") (eq_attr "mode" "DF")) 112 0) + +;; +;; .................... +;; +;; CONDITIONAL TRAPS +;; +;; .................... +;; +(define_insn "trap" + [(trap_if (const_int 1) (const_int 0))] + "" + "* +{ + if (ISA_HAS_COND_TRAP) + return \"teq\\t$0,$0\"; + else + return \"break\"; +}") + +(define_expand "conditional_trap" + [(trap_if (match_operator 0 "cmp_op" + [(match_dup 2) (match_dup 3)]) + (match_operand 1 "const_int_operand" ""))] + "ISA_HAS_COND_TRAP" + " +{ + mips_gen_conditional_trap (operands); + DONE; +}") + +;; Match a TRAP_IF with 2nd arg of 0. The div_trap_* insns match a +;; 2nd arg of any CONST_INT, so this insn must appear first. +;; gen_div_trap always generates TRAP_IF with 2nd arg of 6 or 7. + +(define_insn "" + [(trap_if (match_operator 0 "trap_cmp_op" + [(match_operand:SI 1 "reg_or_0_operand" "d") + (match_operand:SI 2 "nonmemory_operand" "dI")]) + (const_int 0))] + "ISA_HAS_COND_TRAP" + "t%C0\\t%z1,%z2") ;; ;; ....................