]> gcc.gnu.org Git - gcc.git/commitdiff
ia64-modes.def (V4SF): Add.
authorRichard Henderson <rth@redhat.com>
Sun, 19 Jun 2005 16:10:49 +0000 (09:10 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sun, 19 Jun 2005 16:10:49 +0000 (09:10 -0700)
        * config/ia64/ia64-modes.def (V4SF): Add.
        * config/ia64/ia64.c (ia64_legitimate_constant_p): Handle CONST_VECTOR.
        * config/ia64/ia64.h (CANNOT_CHANGE_MODE_CLASS): Allow vector to
        integer mode changes in fp regs.
        * config/ia64/ia64.md (UNSPEC_VECT_EXTR): New.
        * config/ia64/vect.md (smaxv2sf3, sminv2sf3): Fix typos in names.
        (reduc_plus_v2sf, reduc_smax_v2sf, reduc_smin_v2sf): New.
        (vcondv2sf): Use gen_fpack
        (fpack): Remove * from name.
        (fswap, fmix_l, fmix_r, fmix_lr): New.
        (vec_setv2sf, vec_extractv2sf_0_le, vec_extractv2sf_0_be): New.
        (vec_extractv2sf_1, vec_extractv2sf): New.

From-SVN: r101185

gcc/ChangeLog
gcc/config/ia64/ia64-modes.def
gcc/config/ia64/ia64.c
gcc/config/ia64/ia64.h
gcc/config/ia64/ia64.md
gcc/config/ia64/vect.md

index ef767e23634173995d3ade911cf78f0ee6fd1f9c..460489b8645dfaa3361558f0a54e73b18c8c3791 100644 (file)
@@ -1,3 +1,18 @@
+2005-06-19  Richard Henderson  <rth@redhat.com>
+
+       * config/ia64/ia64-modes.def (V4SF): Add.
+       * config/ia64/ia64.c (ia64_legitimate_constant_p): Handle CONST_VECTOR.
+       * config/ia64/ia64.h (CANNOT_CHANGE_MODE_CLASS): Allow vector to 
+       integer mode changes in fp regs.
+       * config/ia64/ia64.md (UNSPEC_VECT_EXTR): New.
+       * config/ia64/vect.md (smaxv2sf3, sminv2sf3): Fix typos in names.
+       (reduc_plus_v2sf, reduc_smax_v2sf, reduc_smin_v2sf): New.
+       (vcondv2sf): Use gen_fpack
+       (fpack): Remove * from name.
+       (fswap, fmix_l, fmix_r, fmix_lr): New.
+       (vec_setv2sf, vec_extractv2sf_0_le, vec_extractv2sf_0_be): New.
+       (vec_extractv2sf_1, vec_extractv2sf): New.
+
 2005-06-19  Andreas Krebbel  <krebbel1@de.ibm.com>
 
        * combine.c (make_compound_operation): Use simplify_subreg.  Delete
index d8f2ae681ceea11c1229469ba38c4f7affecb09b..1e7ad22d87a54829d53f10fb898884eb56c6a8d3 100644 (file)
@@ -74,3 +74,5 @@ VECTOR_MODE (INT, QI, 16);
 VECTOR_MODE (INT, HI, 8);
 VECTOR_MODE (INT, SI, 4);
 VECTOR_MODE (FLOAT, SF, 2);
+VECTOR_MODE (FLOAT, SF, 4);
+
index 0475c943bc71b3c31133f99f86f52bcdadc6499d..5c6d11fd371d9b88a848711c327c86b5b5e603c9 100644 (file)
@@ -738,6 +738,17 @@ ia64_legitimate_constant_p (rtx x)
     case SYMBOL_REF:
       return tls_symbolic_operand_type (x) == 0;
 
+    case CONST_VECTOR:
+      {
+       enum machine_mode mode = GET_MODE (x);
+
+       if (mode == V2SFmode)
+         return ia64_extra_constraint (x, 'Y');
+
+       return (GET_MODE_CLASS (mode) == MODE_VECTOR_INT
+               && GET_MODE_SIZE (mode) <= 8);
+      }
+
     default:
       return false;
     }
index 9753a5dc6c24b59e5b3aea0d7bbea985d0c35470..5a3dee5d935b77914bef02e25c13892d7b7731b1 100644 (file)
@@ -892,11 +892,11 @@ enum reg_class
    : ((CLASS) == FR_REGS && (MODE) == XCmode) ? 2              \
    : (GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
 
-/* In FP regs, we can't change FP values to integer values and vice
-   versa, but we can change e.g. DImode to SImode.  */
+/* In FP regs, we can't change FP values to integer values and vice versa,
+   but we can change e.g. DImode to SImode, and V2SFmode into DImode.  */
 
-#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS)      \
-  (GET_MODE_CLASS (FROM) != GET_MODE_CLASS (TO)                \
+#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS)              \
+  (SCALAR_FLOAT_MODE_P (FROM) != SCALAR_FLOAT_MODE_P (TO)      \
    ? reg_classes_intersect_p (CLASS, FR_REGS) : 0)
 
 /* A C expression that defines the machine-dependent operand constraint
index 0accd9603999a09b156061e6d92331ae5d6e4d32..4840ab03b131690f0960d3266f0d2c6a7f1a414a 100644 (file)
@@ -80,6 +80,7 @@
    (UNSPEC_FR_SQRT_RECIP_APPROX 28)
    (UNSPEC_SHRP                        29)
    (UNSPEC_COPYSIGN            30)
+   (UNSPEC_VECT_EXTR           31)
   ])
 
 (define_constants
index 293707d891450f7fa14dc509ab873db129500036..c9dcf080e58af841c11144551189b59d3235ecf8 100644 (file)
   "fpnma %0 = %1, %2, %3"
   [(set_attr "itanium_class" "fmac")])
 
-(define_insn "smaxv2sf2"
+(define_insn "smaxv2sf3"
   [(set (match_operand:V2SF 0 "fr_register_operand" "=f")
        (smax:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")
                   (match_operand:V2SF 2 "fr_register_operand" "f")))]
   "fpmax %0 = %1, %2"
   [(set_attr "itanium_class" "fmisc")])
 
-(define_insn "sminv2sf2"
+(define_insn "sminv2sf3"
   [(set (match_operand:V2SF 0 "fr_register_operand" "=f")
        (smin:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")
                   (match_operand:V2SF 2 "fr_register_operand" "f")))]
   "fpmin %0 = %1, %2"
   [(set_attr "itanium_class" "fmisc")])
 
+(define_expand "reduc_plus_v2sf"
+  [(match_operand:V2SF 0 "fr_register_operand" "")
+   (match_operand:V2SF 1 "fr_register_operand" "")]
+  ""
+{
+  rtx tmp = gen_reg_rtx (V2SFmode);
+  emit_insn (gen_fswap (tmp, operands[1], CONST0_RTX (V2SFmode)));
+  emit_insn (gen_addv2sf3 (operands[0], operands[1], tmp));
+  DONE;
+})
+
+(define_expand "reduc_smax_v2sf"
+  [(match_operand:V2SF 0 "fr_register_operand" "")
+   (match_operand:V2SF 1 "fr_register_operand" "")]
+  ""
+{
+  rtx tmp = gen_reg_rtx (V2SFmode);
+  emit_insn (gen_fswap (tmp, operands[1], CONST0_RTX (V2SFmode)));
+  emit_insn (gen_smaxv2sf3 (operands[0], operands[1], tmp));
+  DONE;
+})
+
+(define_expand "reduc_smin_v2sf"
+  [(match_operand:V2SF 0 "fr_register_operand" "")
+   (match_operand:V2SF 1 "fr_register_operand" "")]
+  ""
+{
+  rtx tmp = gen_reg_rtx (V2SFmode);
+  emit_insn (gen_fswap (tmp, operands[1], CONST0_RTX (V2SFmode)));
+  emit_insn (gen_sminv2sf3 (operands[0], operands[1], tmp));
+  DONE;
+})
+
 (define_expand "vcondv2sf"
   [(set (match_operand:V2SF 0 "fr_register_operand" "")
        (if_then_else:V2SF
   if (!fr_reg_or_fp01_operand (op2, SFmode))
     op2 = force_reg (SFmode, op2);
 
-  x = gen_rtx_VEC_CONCAT (V2SFmode, op1, op2);
-  emit_insn (gen_rtx_SET (VOIDmode, operands[0], x));
+  emit_insn (gen_fpack (operands[0], op1, op2));
   DONE;
 })
 
-(define_insn "*fpack"
+(define_insn "fpack"
   [(set (match_operand:V2SF 0 "fr_register_operand" "=f")
        (vec_concat:V2SF
          (match_operand:SF 1 "fr_reg_or_fp01_operand" "fG")
   "fpack %0 = %F2, %F1"
   [(set_attr "itanium_class" "fmisc")])
 
+(define_insn "fswap"
+  [(set (match_operand:V2SF 0 "fr_register_operand" "=f")
+       (vec_select:V2SF
+         (vec_concat:V4SF
+           (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU")
+           (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU"))
+         (parallel [(const_int 1) (const_int 2)])))]
+  ""
+  "fswap %0 = %F1, %F2"
+  [(set_attr "itanium_class" "fmisc")])
+
+(define_insn "*fmix_l"
+  [(set (match_operand:V2SF 0 "fr_register_operand" "=f")
+       (vec_select:V2SF
+         (vec_concat:V4SF
+           (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU")
+           (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU"))
+         (parallel [(const_int 1) (const_int 3)])))]
+  ""
+  "fmix.l %0 = %F2, %F1"
+  [(set_attr "itanium_class" "fmisc")])
+
+(define_insn "fmix_r"
+  [(set (match_operand:V2SF 0 "fr_register_operand" "=f")
+       (vec_select:V2SF
+         (vec_concat:V4SF
+           (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU")
+           (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU"))
+         (parallel [(const_int 0) (const_int 2)])))]
+  ""
+  "fmix.r %0 = %F2, %F1"
+  [(set_attr "itanium_class" "fmisc")])
+
+(define_insn "fmix_lr"
+  [(set (match_operand:V2SF 0 "fr_register_operand" "=f")
+       (vec_select:V2SF
+         (vec_concat:V4SF
+           (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU")
+           (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU"))
+         (parallel [(const_int 0) (const_int 3)])))]
+  ""
+  "fmix.lr %0 = %F2, %F1"
+  [(set_attr "itanium_class" "fmisc")])
+
+(define_expand "vec_setv2sf"
+  [(match_operand:V2SF 0 "fr_register_operand" "")
+   (match_operand:SF 1 "fr_register_operand" "")
+   (match_operand 2 "const_int_operand" "")]
+  ""
+{
+  rtx tmp = gen_reg_rtx (V2SFmode);
+  emit_insn (gen_fpack (tmp, operands[1], CONST0_RTX (SFmode)));
+
+  switch (INTVAL (operands[2]))
+    {
+    case 0:
+      emit_insn (gen_fmix_lr (operands[0], tmp, operands[0]));
+      break;
+    case 1:
+      emit_insn (gen_fmix_r (operands[0], operands[0], tmp));
+      break;
+    default:
+      gcc_unreachable ();
+    }
+  DONE;
+})
+
+(define_insn_and_split "*vec_extractv2sf_0_le"
+  [(set (match_operand:SF 0 "nonimmediate_operand" "=r,f,m")
+       (unspec:SF [(match_operand:V2SF 1 "nonimmediate_operand" "rfm,rm,r")
+                   (const_int 0)]
+                  UNSPEC_VECT_EXTR))]
+  "!TARGET_BIG_ENDIAN"
+  "#"
+  "reload_completed"
+  [(set (match_dup 0) (match_dup 1))]
+{
+  if (REG_P (operands[1]) && FR_REGNO_P (REGNO (operands[1])))
+    operands[0] = gen_rtx_REG (V2SFmode, REGNO (operands[0]));
+  else if (MEM_P (operands[1]))
+    operands[1] = adjust_address (operands[1], SFmode, 0);
+  else
+    operands[1] = gen_rtx_REG (SFmode, REGNO (operands[1]));
+})
+
+(define_insn_and_split "*vec_extractv2sf_0_be"
+  [(set (match_operand:SF 0 "register_operand" "=r,f")
+       (unspec:SF [(match_operand:V2SF 1 "register_operand" "rf,r")
+                   (const_int 0)]
+                  UNSPEC_VECT_EXTR))]
+  "TARGET_BIG_ENDIAN"
+  "#"
+  "reload_completed"
+  [(set (match_dup 0) (match_dup 1))]
+{
+  if (REG_P (operands[1]) && FR_REGNO_P (REGNO (operands[1])))
+    operands[0] = gen_rtx_REG (V2SFmode, REGNO (operands[0]));
+  else
+    operands[1] = gen_rtx_REG (SFmode, REGNO (operands[1]));
+})
+
+(define_insn_and_split "*vec_extractv2sf_1"
+  [(set (match_operand:SF 0 "register_operand" "=rf")
+       (unspec:SF [(match_operand:V2SF 1 "register_operand" "r")
+                   (const_int 1)]
+                  UNSPEC_VECT_EXTR))]
+  ""
+  "#"
+  "reload_completed"
+  [(const_int 0)]
+{
+  if (FR_REGNO_P (REGNO (operands[0])))
+    {
+      operands[1] = gen_rtx_REG (SFmode, REGNO (operands[1]));
+      emit_move_insn (operands[0], operands[1]);
+    }
+  else
+    {
+      operands[0] = gen_rtx_REG (DImode, REGNO (operands[0]));
+      operands[1] = gen_rtx_REG (DImode, REGNO (operands[1]));
+      emit_insn (gen_lshrdi3 (operands[0], operands[1], GEN_INT (32)));
+    }
+  DONE;
+})
+
+(define_expand "vec_extractv2sf"
+  [(set (match_operand:SF 0 "register_operand" "")
+       (unspec:SF [(match_operand:V2SF 1 "register_operand" "")
+                   (match_operand:DI 2 "const_int_operand" "")]
+                  UNSPEC_VECT_EXTR))]
+  ""
+  "")
+
 ;; Missing operations
 ;; fprcpa
 ;; fpsqrta
-;; vec_setv2sf
-;; vec_extractv2sf
This page took 0.098337 seconds and 5 git commands to generate.