re PR target/17688 ([4.1] x87 fops can handle HImodes)
authorUros Bizjak <uros@kss-loka.si>
Mon, 14 Mar 2005 16:16:15 +0000 (17:16 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Mon, 14 Mar 2005 16:16:15 +0000 (17:16 +0100)
PR target/17688
* config/i386/i386.c (x86_use_himode_fiop): New.
(x86_use_simode_fiop): Rename from x86_use_fiop.
* config/i386/i386.h (x86_use_himode_fiop): Declare.
(TARGET_USE_HIMODE_FIOP): New.
(x86_use_simode_fiop): Rename from x86_use_fiop.
(TARGET_USE_SIMODE_FIOP): Rename from TARGET_USE_FIOP.

* config/i386/i386.md (X87MODEI12): New mode macro define.
(*cmpfp_<mode>): Rename from *cmpfp_si.  Use X87MODEI12 mode macro
to implement x87 FP compare with HImode input operands.
(*fp_jcc_8<mode>_387, splitter): Rename from *fp_jcc_8_387.
Use X87MODEI12 mode macro to handle HImode input operands.
(*fop_sf_2<mode>_i387, *fop_sf_3<mode>_i387, *fop_df_2<mode>_i387,
*fop_df_3<mode>_i387, *fop_xf_2<mode>_i387, *fop_xf_3<mode>_i387):
Renamed from *fop_sf_2_i387, *fop_sf_3_i387, *fop_df_2_i387,
*fop_df_3_i387, *fop_xf_2_i387, *fop_xf_3_i387. Use X87MODEI12 mode
macro to implement x87 operators with HImode input operands.
(fop splitters): Use X87MODEI12 mode macro to handle HImode
input operands.

From-SVN: r96437

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/config/i386/i386.md

index 84e25db0b2c15a85aae3c4d2d2905974be70a8a6..04024683b7a53638ae566947ce34f8f45bb4a59a 100644 (file)
@@ -1,3 +1,26 @@
+2005-03-14  Uros Bizjak  <uros@kss-loka.si>
+
+       PR target/17688
+       * config/i386/i386.c (x86_use_himode_fiop): New.
+       (x86_use_simode_fiop): Rename from x86_use_fiop.
+       * config/i386/i386.h (x86_use_himode_fiop): Declare.
+       (TARGET_USE_HIMODE_FIOP): New.
+       (x86_use_simode_fiop): Rename from x86_use_fiop.
+       (TARGET_USE_SIMODE_FIOP): Rename from TARGET_USE_FIOP.
+       
+       * config/i386/i386.md (X87MODEI12): New mode macro define.
+       (*cmpfp_<mode>): Rename from *cmpfp_si.  Use X87MODEI12 mode macro
+       to implement x87 FP compare with HImode input operands.
+       (*fp_jcc_8<mode>_387, splitter): Rename from *fp_jcc_8_387.
+       Use X87MODEI12 mode macro to handle HImode input operands.
+       (*fop_sf_2<mode>_i387, *fop_sf_3<mode>_i387, *fop_df_2<mode>_i387,
+       *fop_df_3<mode>_i387, *fop_xf_2<mode>_i387, *fop_xf_3<mode>_i387):
+       Renamed from *fop_sf_2_i387, *fop_sf_3_i387, *fop_df_2_i387,
+       *fop_df_3_i387, *fop_xf_2_i387, *fop_xf_3_i387. Use X87MODEI12 mode
+       macro to implement x87 operators with HImode input operands.
+       (fop splitters): Use X87MODEI12 mode macro to handle HImode
+       input operands.
+
 2005-03-14  Zdenek Dvorak  <dvorakz@suse.cz>
 
        * tree-cfg.c (find_taken_edge_cond_expr): Use zero_p instead of
index 7ca47ed2f4b4de162ddf02c0cf4560404d2578fa..bc311aaf23ab9a7ce71b53dace9a21d111a981f1 100644 (file)
@@ -535,7 +535,8 @@ const int x86_branch_hints = 0;
 const int x86_use_sahf = m_PPRO | m_K6 | m_PENT4 | m_NOCONA;
 const int x86_partial_reg_stall = m_PPRO;
 const int x86_use_loop = m_K6;
-const int x86_use_fiop = ~(m_PPRO | m_ATHLON_K8 | m_PENT);
+const int x86_use_himode_fiop = m_386 | m_486 | m_K6;
+const int x86_use_simode_fiop = ~(m_PPRO | m_ATHLON_K8 | m_PENT);
 const int x86_use_mov0 = m_K6;
 const int x86_use_cltd = ~(m_PENT | m_K6);
 const int x86_read_modify_write = ~m_PENT;
index 5c2046a49d711a5b90f554127b83ba6234613801..d5b8c82b9c9ac5383a210a568a95d3b852084f87 100644 (file)
@@ -232,8 +232,8 @@ extern const int x86_use_leave, x86_push_memory, x86_zero_extend_with_and;
 extern const int x86_use_bit_test, x86_cmove, x86_deep_branch;
 extern const int x86_branch_hints, x86_unroll_strlen;
 extern const int x86_double_with_add, x86_partial_reg_stall, x86_movx;
-extern const int x86_use_loop, x86_use_fiop, x86_use_mov0;
-extern const int x86_use_cltd, x86_read_modify_write;
+extern const int x86_use_loop, x86_use_himode_fiop, x86_use_simode_fiop;
+extern const int x86_use_mov0, x86_use_cltd, x86_read_modify_write;
 extern const int x86_read_modify, x86_split_long_moves;
 extern const int x86_promote_QImode, x86_single_stringop, x86_fast_prefix;
 extern const int x86_himode_math, x86_qimode_math, x86_promote_qi_regs;
@@ -265,7 +265,8 @@ extern int x86_prefetch_sse;
 #define TARGET_MOVX (x86_movx & TUNEMASK)
 #define TARGET_PARTIAL_REG_STALL (x86_partial_reg_stall & TUNEMASK)
 #define TARGET_USE_LOOP (x86_use_loop & TUNEMASK)
-#define TARGET_USE_FIOP (x86_use_fiop & TUNEMASK)
+#define TARGET_USE_HIMODE_FIOP (x86_use_himode_fiop & TUNEMASK)
+#define TARGET_USE_SIMODE_FIOP (x86_use_simode_fiop & TUNEMASK)
 #define TARGET_USE_MOV0 (x86_use_mov0 & TUNEMASK)
 #define TARGET_USE_CLTD (x86_use_cltd & TUNEMASK)
 #define TARGET_SPLIT_LONG_MOVES (x86_split_long_moves & TUNEMASK)
index d9a4ce599ed6ca8a83d685e7a39f7a2a3e223f70..61904db4b586db0c1326cc880647d67119ccef5b 100644 (file)
 (define_asm_attributes
   [(set_attr "length" "128")
    (set_attr "type" "multi")])
+
+;; All integer modes handled by integer x87 operators.
+(define_mode_macro X87MODEI12 [HI SI])
 \f
 ;; Scheduling descriptions
 
           ]
           (const_string "XF")))])
 
-(define_insn "*cmpfp_si"
+(define_insn "*cmpfp_<mode>"
   [(set (match_operand:HI 0 "register_operand" "=a")
        (unspec:HI
          [(compare:CCFP
             (match_operand 1 "register_operand" "f")
             (match_operator 3 "float_operator"
-              [(match_operand:SI 2 "memory_operand" "m")]))]
+              [(match_operand:X87MODEI12 2 "memory_operand" "m")]))]
          UNSPEC_FNSTSW))]
-  "TARGET_80387 && TARGET_USE_FIOP
+  "TARGET_80387 && TARGET_USE_<MODE>MODE_FIOP
    && FLOAT_MODE_P (GET_MODE (operands[1]))
    && (GET_MODE (operands [3]) == GET_MODE (operands[1]))"
   "* return output_fp_compare (insn, operands, 0, 0);"
   [(set_attr "type" "multi")
    (set_attr "fp_int_src" "true")
-   (set_attr "mode" "SI")])
+   (set_attr "mode" "<MODE>")])
 
 ;; FP compares, step 2
 ;; Move the fpsw to ax.
    && ix86_fp_jump_nontrivial_p (GET_CODE (operands[0]))"
   "#")
 
-;; The order of operands in *fp_jcc_8 is forced by combine in
+;; The order of operands in *fp_jcc_8_387 is forced by combine in
 ;; simplify_comparison () function. Float operator is treated as RTX_OBJ
 ;; with a precedence over other operators and is always put in the first
 ;; place. Swap condition and operands to match ficom instruction.
 
-(define_insn "*fp_jcc_8_387"
+(define_insn "*fp_jcc_8<mode>_387"
   [(set (pc)
        (if_then_else (match_operator 0 "comparison_operator"
                        [(match_operator 1 "float_operator"
-                          [(match_operand:SI 2 "nonimmediate_operand" "m,?r")])
+                          [(match_operand:X87MODEI12 2 "nonimmediate_operand" "m,?r")])
                           (match_operand 3 "register_operand" "f,f")])
          (label_ref (match_operand 4 "" ""))
          (pc)))
    (clobber (reg:CCFP FPSR_REG))
    (clobber (reg:CCFP FLAGS_REG))
    (clobber (match_scratch:HI 5 "=a,a"))]
-  "TARGET_80387 && TARGET_USE_FIOP
+  "TARGET_80387 && TARGET_USE_<MODE>MODE_FIOP
    && FLOAT_MODE_P (GET_MODE (operands[3]))
    && GET_MODE (operands[1]) == GET_MODE (operands[3])
    && !ix86_use_fcomi_compare (swap_condition (GET_CODE (operands[0])))
   [(set (pc)
        (if_then_else (match_operator 0 "comparison_operator"
                        [(match_operator 1 "float_operator"
-                          [(match_operand:SI 2 "memory_operand" "")])
+                          [(match_operand:X87MODEI12 2 "memory_operand" "")])
                           (match_operand 3 "register_operand" "")])
          (match_operand 4 "" "")
          (match_operand 5 "" "")))
   [(set (pc)
        (if_then_else (match_operator 0 "comparison_operator"
                        [(match_operator 1 "float_operator"
-                          [(match_operand:SI 2 "register_operand" "")])
+                          [(match_operand:X87MODEI12 2 "register_operand" "")])
                           (match_operand 3 "register_operand" "")])
          (match_operand 4 "" "")
          (match_operand 5 "" "")))
               (const_string "fop")))
    (set_attr "mode" "SF")])
 
-
 ;; ??? Add SSE splitters for these!
-(define_insn "*fop_sf_2_i387"
+(define_insn "*fop_sf_2<mode>_i387"
   [(set (match_operand:SF 0 "register_operand" "=f,f")
        (match_operator:SF 3 "binary_fp_operator"
-         [(float:SF (match_operand:SI 1 "nonimmediate_operand" "m,?r"))
+         [(float:SF (match_operand:X87MODEI12 1 "nonimmediate_operand" "m,?r"))
           (match_operand:SF 2 "register_operand" "0,0")]))]
-  "TARGET_80387 && TARGET_USE_FIOP && !TARGET_SSE_MATH"
+  "TARGET_80387 && TARGET_USE_<MODE>MODE_FIOP && !TARGET_SSE_MATH"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:SF 3 "mult_operator" "") 
               ]
               (const_string "fop")))
    (set_attr "fp_int_src" "true")
-   (set_attr "mode" "SI")])
+   (set_attr "mode" "<MODE>")])
 
-(define_insn "*fop_sf_3_i387"
+(define_insn "*fop_sf_3<mode>_i387"
   [(set (match_operand:SF 0 "register_operand" "=f,f")
        (match_operator:SF 3 "binary_fp_operator"
          [(match_operand:SF 1 "register_operand" "0,0")
-          (float:SF (match_operand:SI 2 "nonimmediate_operand" "m,?r"))]))]
-  "TARGET_80387 && TARGET_USE_FIOP && !TARGET_SSE_MATH"
+          (float:SF (match_operand:X87MODEI12 2 "nonimmediate_operand" "m,?r"))]))]
+  "TARGET_80387 && TARGET_USE_<MODE>MODE_FIOP && !TARGET_SSE_MATH"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:SF 3 "mult_operator" "") 
               ]
               (const_string "fop")))
    (set_attr "fp_int_src" "true")
-   (set_attr "mode" "SI")])
+   (set_attr "mode" "<MODE>")])
 
 (define_insn "*fop_df_comm_mixed"
   [(set (match_operand:DF 0 "register_operand" "=f#Y,Y#f")
    (set_attr "mode" "DF")])
 
 ;; ??? Add SSE splitters for these!
-(define_insn "*fop_df_2_i387"
+(define_insn "*fop_df_2<mode>_i387"
   [(set (match_operand:DF 0 "register_operand" "=f,f")
        (match_operator:DF 3 "binary_fp_operator"
-          [(float:DF (match_operand:SI 1 "nonimmediate_operand" "m,?r"))
+          [(float:DF (match_operand:X87MODEI12 1 "nonimmediate_operand" "m,?r"))
            (match_operand:DF 2 "register_operand" "0,0")]))]
-  "TARGET_80387 && TARGET_USE_FIOP && !(TARGET_SSE2 && TARGET_SSE_MATH)"
+  "TARGET_80387 && TARGET_USE_<MODE>MODE_FIOP
+   && !(TARGET_SSE2 && TARGET_SSE_MATH)"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:DF 3 "mult_operator" "") 
               ]
               (const_string "fop")))
    (set_attr "fp_int_src" "true")
-   (set_attr "mode" "SI")])
+   (set_attr "mode" "<MODE>")])
 
-(define_insn "*fop_df_3_i387"
+(define_insn "*fop_df_3<mode>_i387"
   [(set (match_operand:DF 0 "register_operand" "=f,f")
        (match_operator:DF 3 "binary_fp_operator"
           [(match_operand:DF 1 "register_operand" "0,0")
-           (float:DF (match_operand:SI 2 "nonimmediate_operand" "m,?r"))]))]
-  "TARGET_80387 && TARGET_USE_FIOP && !(TARGET_SSE2 && TARGET_SSE_MATH)"
+           (float:DF (match_operand:X87MODEI12 2 "nonimmediate_operand" "m,?r"))]))]
+  "TARGET_80387 && TARGET_USE_<MODE>MODE_FIOP
+   && !(TARGET_SSE2 && TARGET_SSE_MATH)"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:DF 3 "mult_operator" "") 
               ]
               (const_string "fop")))
    (set_attr "fp_int_src" "true")
-   (set_attr "mode" "SI")])
+   (set_attr "mode" "<MODE>")])
 
 (define_insn "*fop_df_4_i387"
   [(set (match_operand:DF 0 "register_operand" "=f,f")
               (const_string "fop")))
    (set_attr "mode" "XF")])
 
-(define_insn "*fop_xf_2_i387"
+(define_insn "*fop_xf_2<mode>_i387"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
        (match_operator:XF 3 "binary_fp_operator"
-          [(float:XF (match_operand:SI 1 "nonimmediate_operand" "m,?r"))
+          [(float:XF (match_operand:X87MODEI12 1 "nonimmediate_operand" "m,?r"))
            (match_operand:XF 2 "register_operand" "0,0")]))]
-  "TARGET_80387 && TARGET_USE_FIOP"
+  "TARGET_80387 && TARGET_USE_<MODE>MODE_FIOP"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
               ]
               (const_string "fop")))
    (set_attr "fp_int_src" "true")
-   (set_attr "mode" "SI")])
+   (set_attr "mode" "<MODE>")])
 
-(define_insn "*fop_xf_3_i387"
+(define_insn "*fop_xf_3<mode>_i387"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
        (match_operator:XF 3 "binary_fp_operator"
          [(match_operand:XF 1 "register_operand" "0,0")
-          (float:XF (match_operand:SI 2 "nonimmediate_operand" "m,?r"))]))]
-  "TARGET_80387 && TARGET_USE_FIOP"
+          (float:XF (match_operand:X87MODEI12 2 "nonimmediate_operand" "m,?r"))]))]
+  "TARGET_80387 && TARGET_USE_<MODE>MODE_FIOP"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type") 
         (cond [(match_operand:XF 3 "mult_operator" "") 
               ]
               (const_string "fop")))
    (set_attr "fp_int_src" "true")
-   (set_attr "mode" "SI")])
+   (set_attr "mode" "<MODE>")])
 
 (define_insn "*fop_xf_4_i387"
   [(set (match_operand:XF 0 "register_operand" "=f,f")
 (define_split
   [(set (match_operand 0 "register_operand" "")
        (match_operator 3 "binary_fp_operator"
-          [(float (match_operand:SI 1 "register_operand" ""))
+          [(float (match_operand:X87MODEI12 1 "register_operand" ""))
            (match_operand 2 "register_operand" "")]))]
   "TARGET_80387 && reload_completed
    && FLOAT_MODE_P (GET_MODE (operands[0]))"
   [(set (match_operand 0 "register_operand" "")
        (match_operator 3 "binary_fp_operator"
           [(match_operand 1 "register_operand" "")
-           (float (match_operand:SI 2 "register_operand" ""))]))]
+           (float (match_operand:X87MODEI12 2 "register_operand" ""))]))]
   "TARGET_80387 && reload_completed
    && FLOAT_MODE_P (GET_MODE (operands[0]))"
   [(const_int 0)]