* reg-stack.c (subst_stack_regs_pat): Swap operands in commutative
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 25 Nov 1999 12:53:44 +0000 (12:53 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 25 Nov 1999 12:53:44 +0000 (12:53 +0000)
operations when needed.
* i386.md (fop_?f_comm): New.
(fop_?f_1): Do not accept commutative operands.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@30664 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/reg-stack.c

index 9cbb829..17119fb 100644 (file)
@@ -1,3 +1,10 @@
+Wed Nov 24 17:08:09 MET 1999  Jan Hubicka  <hubicka@freesoft.cz>
+
+       * reg-stack.c (subst_stack_regs_pat): Swap operands in commutative
+       operations when needed.
+       * i386.md (fop_?f_comm): New.
+       (fop_?f_1): Do not accept commutative operands.
+
 1999-11-25  Andreas Jaeger  <aj@suse.de>
 
        * config/mips/mips.md (casesi_internal): Add missing brace.
index 5f595e4..e7f9a14 100644 (file)
 ;; SImode if the target mode DFmode, but only SImode if the target mode
 ;; is SFmode.
 
+;; Gcc is slightly more smart about handling normal two address instructions
+;; so use special patterns for add and mull.
+(define_insn "*fop_sf_comm"
+  [(set (match_operand:SF 0 "register_operand" "=f")
+       (match_operator:SF 3 "binary_fp_operator"
+                       [(match_operand:SF 1 "register_operand" "%0")
+                        (match_operand:SF 2 "nonimmediate_operand" "fm")]))]
+  "TARGET_80387 && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'"
+  "* return output_387_binary_op (insn, operands);"
+  [(set (attr "type") 
+        (if_then_else (match_operand:SF 3 "mult_operator" "") 
+           (const_string "fmul")
+           (const_string "fop")))])
+
+(define_insn "*fop_df_comm"
+  [(set (match_operand:DF 0 "register_operand" "=f")
+       (match_operator:DF 3 "binary_fp_operator"
+                       [(match_operand:DF 1 "register_operand" "%0")
+                        (match_operand:DF 2 "nonimmediate_operand" "fm")]))]
+  "TARGET_80387 && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'"
+  "* return output_387_binary_op (insn, operands);"
+  [(set (attr "type") 
+        (if_then_else (match_operand:DF 3 "mult_operator" "") 
+           (const_string "fmul")
+           (const_string "fop")))])
+
+(define_insn "*fop_xf_comm"
+  [(set (match_operand:XF 0 "register_operand" "=f")
+       (match_operator:XF 3 "binary_fp_operator"
+                       [(match_operand:XF 1 "register_operand" "%0")
+                        (match_operand:XF 2 "register_operand" "f")]))]
+  "TARGET_80387 && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'"
+  "* return output_387_binary_op (insn, operands);"
+  [(set (attr "type") 
+        (if_then_else (match_operand:XF 3 "mult_operator" "") 
+           (const_string "fmul")
+           (const_string "fop")))])
+
 (define_insn "*fop_sf_1"
   [(set (match_operand:SF 0 "register_operand" "=f,f")
        (match_operator:SF 3 "binary_fp_operator"
                        [(match_operand:SF 1 "nonimmediate_operand" "0,fm")
                         (match_operand:SF 2 "nonimmediate_operand" "fm,0")]))]
   "TARGET_80387
+   && GET_RTX_CLASS (GET_CODE (operands[3])) != 'c'
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
                        [(match_operand:DF 1 "nonimmediate_operand" "0,fm")
                         (match_operand:DF 2 "nonimmediate_operand" "fm,0")]))]
   "TARGET_80387
+   && GET_RTX_CLASS (GET_CODE (operands[3])) != 'c'
    && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
        (match_operator:XF 3 "binary_fp_operator"
                        [(match_operand:XF 1 "register_operand" "0,f")
                         (match_operand:XF 2 "register_operand" "f,0")]))]
-  "TARGET_80387"
+  "TARGET_80387
+   && GET_RTX_CLASS (GET_CODE (operands[3])) != 'c'"
   "* return output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
index 98b8778..aa2b010 100644 (file)
@@ -1631,6 +1631,16 @@ subst_stack_regs_pat (insn, regstack, pat)
                SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
                replace_reg (dest, get_hard_regnum (regstack, *dest));
              }
+
+           /* Keep operand 1 maching with destination.  */
+           if (GET_RTX_CLASS (GET_CODE (pat_src)) == 'c'
+               && REG_P (*src1) && REG_P (*src2)
+               && REGNO (*src1) != REGNO (*dest))
+            {
+               rtx tmp = *src1;
+               *src1 = *src2;
+               *src2 = tmp;
+            }
            break;
 
          case UNSPEC: