aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/config/mips/mips-msa.md
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/config/mips/mips-msa.md')
-rw-r--r--gcc-4.9/gcc/config/mips/mips-msa.md1373
1 files changed, 866 insertions, 507 deletions
diff --git a/gcc-4.9/gcc/config/mips/mips-msa.md b/gcc-4.9/gcc/config/mips/mips-msa.md
index 37f5fcab5..b2da26ddb 100644
--- a/gcc-4.9/gcc/config/mips/mips-msa.md
+++ b/gcc-4.9/gcc/config/mips/mips-msa.md
@@ -22,8 +22,6 @@
;;
(define_c_enum "unspec" [
- UNSPEC_MSA_ADDVI
- UNSPEC_MSA_ANDI_B
UNSPEC_MSA_ASUB_S
UNSPEC_MSA_ASUB_U
UNSPEC_MSA_AVE_S
@@ -52,8 +50,6 @@
UNSPEC_MSA_BZ
UNSPEC_MSA_CFCMSA
UNSPEC_MSA_CMPI
- UNSPEC_MSA_COPY_S
- UNSPEC_MSA_COPY_U
UNSPEC_MSA_CTCMSA
UNSPEC_MSA_DOTP_S
UNSPEC_MSA_DOTP_U
@@ -72,11 +68,8 @@
UNSPEC_MSA_FFINT_U
UNSPEC_MSA_FFQL
UNSPEC_MSA_FFQR
- UNSPEC_MSA_FILL
UNSPEC_MSA_FLOG2
- UNSPEC_MSA_FMAX
UNSPEC_MSA_FMAX_A
- UNSPEC_MSA_FMIN
UNSPEC_MSA_FMIN_A
UNSPEC_MSA_FRCP
UNSPEC_MSA_FRINT
@@ -101,23 +94,12 @@
UNSPEC_MSA_HADD_U
UNSPEC_MSA_HSUB_S
UNSPEC_MSA_HSUB_U
- UNSPEC_MSA_ILVEV
- UNSPEC_MSA_ILVL
- UNSPEC_MSA_ILVOD
- UNSPEC_MSA_ILVR
- UNSPEC_MSA_INSERT
- UNSPEC_MSA_INSVE
- UNSPEC_MSA_LD0
UNSPEC_MSA_MADD_Q
UNSPEC_MSA_MADDR_Q
UNSPEC_MSA_MAX_A
- UNSPEC_MSA_MAX_S
- UNSPEC_MSA_MAX_U
UNSPEC_MSA_MAXI_S
UNSPEC_MSA_MAXI_U
UNSPEC_MSA_MIN_A
- UNSPEC_MSA_MIN_S
- UNSPEC_MSA_MIN_U
UNSPEC_MSA_MINI_S
UNSPEC_MSA_MINI_U
UNSPEC_MSA_MSUB_Q
@@ -161,11 +143,15 @@
])
;; Attributes to categorize MSA instructions based on execution units
-(define_attr "msa_execunit"
+(define_attr "msa_execunit"
"unknown, msa_eu_div, msa_eu_float2, msa_eu_float2_l,
- msa_eu_float4, msa_eu_float5, msa_eu_float8, msa_eu_logic,
- msa_eu_logic3, msa_eu_logic_l, msa_eu_mult, msa_eu_cmp,
- msa_eu_store4, msa_eu_int_add, msa_eu_fdiv"
+ msa_eu_float4, msa_eu_float5, msa_eu_float8, msa_eu_logic,
+ msa_eu_logic3, msa_eu_logic_l, msa_eu_mult, msa_eu_cmp,
+ msa_eu_store4, msa_eu_int_add, msa_eu_fdiv, msa_eu_logic_l2, msa_eu_logic2"
+ (const_string "unknown"))
+
+(define_attr "datafmt"
+ "unknown, d, w, h, b"
(const_string "unknown"))
;; All vector modes with 128 bits.
@@ -179,17 +165,16 @@
(define_mode_iterator IMSA [V2DI V4SI V8HI V16QI])
;; mode that can combine a copy+insert into insve.
-;; note V2DI is excluded because it split if !TARGET_64
-(define_mode_iterator INSVE [V4SI V8HI V16QI])
+(define_mode_iterator INSVE [V2DI V4SI])
-;; mode that can be combine copy+inset with subreg info insve.
+;; mode that can be combine copy+insert with subreg info insve.
(define_mode_iterator INSVE_2 [V8HI V16QI])
-;; As IMSA but excludeds V16QI.
+;; As IMSA but excludes V16QI.
(define_mode_iterator IMSA_X [V2DI V4SI V8HI])
-;; Only used with insert.
-(define_mode_iterator MSA_3 [V16QI V8HI V2DF V4SF])
+;; As IMSA but excludes V2DI
+(define_mode_iterator IMSA_X2 [V4SI V8HI V16QI])
;; Only integer modes for fixed-point madd_q/maddr_q.
(define_mode_iterator QMSA [V4SI V8HI])
@@ -203,18 +188,29 @@
;; Only used in spliters
(define_mode_iterator SPLIT [V2DI V2DF])
-;; Only used with SPILT iteraror
+(define_mode_attr DMSA
+ [(V2DI "V4DI")
+ (V4SI "V8SI")
+ (V8HI "V16HI")
+ (V16QI "V32QI")])
+
+;; Only used with SPLIT iterator
(define_mode_attr predicate
[(V2DI "reg_or_0")
(V2DF "register")])
-(define_mode_attr VHALFMODE
+(define_mode_attr VHALFMODE
[(V8HI "V16QI")
(V4SI "V8HI")
(V2DI "V4SI")
(V2DF "V4SF")])
-;; The attribute give the integer vector mode with same size.
+(define_mode_attr VDMODE
+ [(V4SI "V2DI")
+ (V8HI "V4SI")
+ (V16QI "V8HI")])
+
+;; The attribute gives the integer vector mode with same size.
(define_mode_attr VIMODE
[(V2DF "V2DI")
(V4SF "V4SI")
@@ -241,7 +237,7 @@
(V8HI "SI")
(V16QI "SI")])
-;; This attribute qives suffix for MSA instructions.
+;; This attribute gives suffix for MSA instructions.
(define_mode_attr msafmt
[(V2DF "d")
(V4SF "w")
@@ -255,8 +251,8 @@
[(V2DF "d")
(V4SF "s")])
-;; This attribute qives define_insn suffix for MSA instructions
-;; with need distinction between integer and floating point.
+;; This attribute gives define_insn suffix for MSA instructions with need
+;; distinction between integer and floating point.
(define_mode_attr msafmt_f
[(V2DF "d_f")
(V4SF "w_f")
@@ -272,8 +268,8 @@
(V8HI "15")
(V16QI "7")])
-;; This is used to form an immediate operand constraint
-;; using "const_<indeximm>_operand".
+;; This is used to form an immediate operand constraint using
+;; "const_<indeximm>_operand".
(define_mode_attr indeximm
[(V2DF "0_or_1")
(V4SF "0_to_3")
@@ -282,19 +278,27 @@
(V8HI "uimm3")
(V16QI "uimm4")])
-;; This attribute is used to form the MODE for reg_or_0_operand
-;; constraint.
-(define_mode_attr REGOR0
- [(V2DF "DF")
- (V4SF "SF")
- (V2DI "DI")
+;; To represent bitmask needed for vec_merge using "const_<bitmask>_operand".
+(define_mode_attr bitmask
+ [(V2DF "exp_2")
+ (V4SF "exp_4")
+ (V2DI "exp_2")
+ (V4SI "exp_4")
+ (V8HI "exp_8")
+ (V16QI "exp_16")])
+
+;; This attribute is used to form the MODE of an input operand
+;; when some builtins (insert snd fill) take an input operand other than
+;; UNITMODE mode. See the msa_insert and msa_fill for an examples.
+(define_mode_attr EXCEPT
+ [(V2DI "DI")
(V4SI "SI")
(V8HI "SI")
(V16QI "SI")])
-;; This attribute used to form an immediate operand constraint
-;; using "const_<bitimm>_operand"
-(define_mode_attr bitimm
+;; This attribute used to form an immediate operand constraint using
+;; "const_<bitimm>_operand".
+(define_mode_attr bitimm
[(V16QI "uimm3")
(V8HI "uimm4")
(V4SI "uimm5")
@@ -310,6 +314,117 @@
DONE;
})
+(define_mode_attr hmsafmt
+ [(V2DI "w")
+ (V4SI "h")
+ (V8HI "b")])
+
+(define_expand "fixuns_trunc<FMSA:mode><mode_i>2"
+ [(set (match_operand:<VIMODE> 0 "register_operand" "=f")
+ (unsigned_fix:<VIMODE> (match_operand:FMSA 1 "register_operand" "f")))]
+ "ISA_HAS_MSA"
+ {
+ emit_insn (gen_msa_ftrunc_u_<msafmt> (operands[0], operands[1]));
+ DONE;
+ })
+
+(define_expand "fix_trunc<FMSA:mode><mode_i>2"
+ [(set (match_operand:<VIMODE> 0 "register_operand" "=f")
+ (fix:<VIMODE> (match_operand:FMSA 1 "register_operand" "f")))]
+ "ISA_HAS_MSA"
+ {
+ emit_insn (gen_msa_ftrunc_s_<msafmt> (operands[0], operands[1]));
+ DONE;
+ })
+
+(define_expand "vec_pack_trunc_v2df"
+ [(set (match_operand:V4SF 0 "register_operand")
+ (vec_concat:V4SF
+ (float_truncate:V2SF (match_operand:V2DF 1 "register_operand"))
+ (float_truncate:V2SF (match_operand:V2DF 2 "register_operand"))))]
+ "ISA_HAS_MSA"
+ "")
+
+;; pckev pattern with implicit type conversion.
+(define_insn "vec_pack_trunc_<mode>"
+ [(set (match_operand:<VHALFMODE> 0 "register_operand" "=f")
+ (unspec:<VHALFMODE> [(match_operand:IMSA_X 1 "register_operand" "f")
+ (match_operand:IMSA_X 2 "register_operand" "f")]
+ UNSPEC_MSA_PCKEV))]
+ "ISA_HAS_MSA"
+ "pckev.<hmsafmt>\t%w0,%w2,%w1"
+ [(set_attr "alu_type" "add")
+ (set_attr "mode" "TI")
+ (set_attr "msa_execunit" "msa_eu_logic")])
+
+(define_expand "vec_unpacks_hi_v4sf"
+ [(set (match_operand:V2DF 0 "register_operand" "=f")
+ (float_extend:V2DF
+ (vec_select:V2SF
+ (match_operand:V4SF 1 "register_operand" "f")
+ (parallel [(const_int 0) (const_int 1)])
+ )))]
+ "ISA_HAS_MSA"
+ {
+ if (BYTES_BIG_ENDIAN)
+ emit_insn (gen_msa_fexupr_d (operands[0], operands[1]));
+ else
+ emit_insn (gen_msa_fexupl_d (operands[0], operands[1]));
+ DONE;
+ })
+
+(define_expand "vec_unpacks_lo_v4sf"
+ [(set (match_operand:V2DF 0 "register_operand" "=f")
+ (float_extend:V2DF
+ (vec_select:V2SF
+ (match_operand:V4SF 1 "register_operand" "f")
+ (parallel [(const_int 0) (const_int 1)])
+ )))]
+ "ISA_HAS_MSA"
+ {
+ if (BYTES_BIG_ENDIAN)
+ emit_insn (gen_msa_fexupl_d (operands[0], operands[1]));
+ else
+ emit_insn (gen_msa_fexupr_d (operands[0], operands[1]));
+ DONE;
+ })
+
+(define_expand "vec_unpacks_hi_<mode>"
+ [(set (match_operand:<VDMODE> 0 "register_operand")
+ (match_operand:IMSA_X2 1 "register_operand"))]
+ "ISA_HAS_MSA"
+ {
+ mips_expand_vec_unpack (operands, false/*unsigned_p*/, true/*high_p*/);
+ DONE;
+ })
+
+(define_expand "vec_unpacks_lo_<mode>"
+ [(set (match_operand:<VDMODE> 0 "register_operand")
+ (match_operand:IMSA_X2 1 "register_operand"))]
+ "ISA_HAS_MSA"
+ {
+ mips_expand_vec_unpack (operands, false/*unsigned_p*/, false/*high_p*/);
+ DONE;
+ })
+
+(define_expand "vec_unpacku_hi_<mode>"
+ [(set (match_operand:<VDMODE> 0 "register_operand")
+ (match_operand:IMSA_X2 1 "register_operand"))]
+ "ISA_HAS_MSA"
+ {
+ mips_expand_vec_unpack (operands, true/*unsigned_p*/, true/*high_p*/);
+ DONE;
+ })
+
+(define_expand "vec_unpacku_lo_<mode>"
+ [(set (match_operand:<VDMODE> 0 "register_operand")
+ (match_operand:IMSA_X2 1 "register_operand"))]
+ "ISA_HAS_MSA"
+ {
+ mips_expand_vec_unpack (operands, true/*unsigned_p*/, false/*high_p*/);
+ DONE;
+ })
+
(define_expand "vec_extract<mode>"
[(match_operand:<UNITMODE> 0 "register_operand")
(match_operand:IMSA 1 "register_operand")
@@ -358,12 +473,12 @@
(define_expand "vec_set<mode>"
[(match_operand:IMSA 0 "register_operand")
- (match_operand:<UNITMODE> 1 "register_operand")
+ (match_operand:<UNITMODE> 1 "reg_or_0_operand")
(match_operand 2 "const_<indeximm>_operand")]
"ISA_HAS_MSA"
{
- emit_insn (gen_msa_insert_<msafmt> (operands[0], operands[0], operands[2],
- operands[1]));
+ emit_insn (gen_msa_insert_<msafmt>_insn (operands[0], operands[1],
+ operands[0], GEN_INT(1 << INTVAL (operands[2]))));
DONE;
})
@@ -373,8 +488,8 @@
(match_operand 2 "const_<indeximm>_operand")]
"ISA_HAS_MSA"
{
- emit_insn (gen_msa_insve_<msafmt_f>_s (operands[0], operands[0], operands[2],
- operands[1]));
+ emit_insn (gen_msa_insve_<msafmt_f>_s (operands[0], operands[0],
+ GEN_INT(1 << INTVAL (operands[2])), operands[1]));
DONE;
})
@@ -391,7 +506,7 @@
== GET_MODE_NUNITS (<IMSA:MODE>mode))"
{
mips_expand_vec_cond_expr (<MSA_2:MODE>mode,
- <MSA_2:VIMODE>mode,
+ <MSA_2:VIMODE>mode,
operands,
gen_and<MSA_2:mode_i>3,
gen_msa_nor_v_<MSA_2:msafmt>,
@@ -420,58 +535,93 @@
DONE;
})
-(define_insn "msa_insert_<msafmt>"
+;; Note used directly by builtins but via the following define_expand.
+(define_insn "msa_insert_<msafmt>_insn"
[(set (match_operand:IMSA 0 "register_operand" "=f")
- (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "0")
- (match_operand 2 "const_<indeximm>_operand" "")
- (match_operand:<REGOR0> 3 "reg_or_0_operand" "dJ")]
- UNSPEC_MSA_INSERT))]
+ (vec_merge:IMSA (vec_duplicate:IMSA
+ (match_operand:<UNITMODE> 1 "reg_or_0_operand" "dJ"))
+ (match_operand:IMSA 2 "register_operand" "0")
+ (match_operand 3 "const_<bitmask>_operand" "")))]
"ISA_HAS_MSA"
- "insert.<msafmt>\t%w0[%2],%z3"
- [(set_attr "type" "mtc")
- (set_attr "mode" "TI")
+ "insert.<msafmt>\t%w0[%K3],%z1"
+ [(set_attr "type" "mtc")
+ (set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_logic_l")])
-; Similar to msa_insert_<msafmt> but with <UNITMODE>mode for operand 3.
-;; Note that insert.d and insert.d_f will be split later if !TARGET_64BIT.
+;; Expand builtin catoring for HImode and QImode which take SImode.
+(define_expand "msa_insert_<msafmt>"
+ [(match_operand:IMSA 0 "register_operand")
+ (match_operand:IMSA 1 "register_operand")
+ (match_operand 2 "const_<indeximm>_operand")
+ (match_operand:<EXCEPT> 3 "reg_or_0_operand")]
+ "ISA_HAS_MSA"
+{
+ if ((GET_MODE_SIZE (<UNITMODE>mode) < GET_MODE_SIZE (<EXCEPT>mode))
+ && (REG_P (operands[3]) || (GET_CODE (operands[3]) == SUBREG
+ && REG_P (SUBREG_REG (operands[3])))))
+ {
+ unsigned int offset = GET_MODE_SIZE (<EXCEPT>mode)
+ - GET_MODE_SIZE (<UNITMODE>mode);
+ operands[3] = simplify_gen_subreg (<UNITMODE>mode, operands[3],
+ GET_MODE (operands[3]),
+ BYTES_BIG_ENDIAN ? offset : 0);
+ }
+ emit_insn (gen_msa_insert_<msafmt>_insn (operands[0], operands[3],
+ operands[1], GEN_INT(1 << INTVAL (operands[2]))));
+ DONE;
+})
+
+(define_expand "msa_insert_<msafmt_f>"
+ [(match_operand:FMSA 0 "register_operand")
+ (match_operand:FMSA 1 "register_operand")
+ (match_operand 2 "const_<indeximm>_operand")
+ (match_operand:<UNITMODE> 3 "reg_or_0_operand")]
+ "ISA_HAS_MSA"
+{
+ emit_insn (gen_msa_insert_<msafmt_f>_insn (operands[0], operands[3],
+ operands[1], GEN_INT(1 << INTVAL (operands[2]))));
+ DONE;
+})
-(define_insn "*msa_insert_<msafmt_f>"
- [(set (match_operand:MSA_3 0 "register_operand" "=f")
- (unspec:MSA_3 [(match_operand:MSA_3 1 "register_operand" "0")
- (match_operand 2 "const_<indeximm>_operand" "")
- (match_operand:<UNITMODE> 3 "reg_or_0_operand" "dJ")]
- UNSPEC_MSA_INSERT))]
+(define_insn "msa_insert_<msafmt_f>_insn"
+ [(set (match_operand:FMSA 0 "register_operand" "=f")
+ (vec_merge:FMSA (vec_duplicate:FMSA
+ (match_operand:<UNITMODE> 1 "register_operand" "d"))
+ (match_operand:FMSA 2 "register_operand" "0")
+ (match_operand 3 "const_<bitmask>_operand" "")))]
"ISA_HAS_MSA"
- "insert.<msafmt>\t%w0[%2],%z3"
+ "insert.<msafmt>\t%w0[%K3],%z1"
[(set_attr "type" "mtc")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_logic_l")])
(define_split
[(set (match_operand:SPLIT 0 "register_operand")
- (unspec:SPLIT [(match_operand:SPLIT 1 "register_operand")
- (match_operand 2 "const_0_or_1_operand")
- (match_operand:<UNITMODE> 3 "<SPLIT:predicate>_operand")]
- UNSPEC_MSA_INSERT))]
+ (vec_merge:SPLIT
+ (vec_duplicate:SPLIT
+ (match_operand:<UNITMODE> 1 "<SPLIT:predicate>_operand"))
+ (match_operand:SPLIT 2 "register_operand")
+ (match_operand 3 "const_<bitmask>_operand")))]
"reload_completed && TARGET_MSA && !TARGET_64BIT"
[(const_int 0)]
{
- mips_split_msa_insert_d (operands[0], operands[1], operands[2], operands[3]);
+ mips_split_msa_insert_d (operands[0], operands[2], operands[3], operands[1]);
DONE;
})
;; Used by combine to convert a copy_s + insert into an insve
(define_insn "msa_insve_s_insn_<msafmt>"
[(set (match_operand:INSVE 0 "register_operand" "=f")
- (unspec:INSVE [(match_operand:INSVE 1 "register_operand" "0")
- (match_operand 2 "const_<indeximm>_operand" "")
- (unspec:<RES>
- [(match_operand:INSVE 3 "register_operand" "f")
- (match_operand 4 "const_0_operand" "")
- ] UNSPEC_MSA_COPY_S)
- ] UNSPEC_MSA_INSERT))]
+ (vec_merge:INSVE
+ (vec_duplicate:INSVE
+ (sign_extend:<UNITMODE>
+ (vec_select:<UNITMODE>
+ (match_operand:INSVE 3 "register_operand" "f")
+ (parallel [(match_operand 4 "const_0_operand" "")]))))
+ (match_operand:INSVE 1 "register_operand" "0")
+ (match_operand 2 "const_<bitmask>_operand" "")))]
"ISA_HAS_MSA"
- "insve.<msafmt>\t%w0[%2],%w3[0]"
+ "insve.<msafmt>\t%w0[%K2],%w3[0]"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_logic_l")])
@@ -479,15 +629,16 @@
;; Used by combine to convert a copy_u + insert into an insve
(define_insn "msa_insve_u_insn_<msafmt>"
[(set (match_operand:INSVE 0 "register_operand" "=f")
- (unspec:INSVE [(match_operand:INSVE 1 "register_operand" "0")
- (match_operand 2 "const_<indeximm>_operand" "")
- (unspec:<RES>
- [(match_operand:INSVE 3 "register_operand" "f")
- (match_operand 4 "const_0_operand" "")
- ] UNSPEC_MSA_COPY_U)
- ] UNSPEC_MSA_INSERT))]
+ (vec_merge:INSVE
+ (vec_duplicate:INSVE
+ (zero_extend:<UNITMODE>
+ (vec_select:<UNITMODE>
+ (match_operand:INSVE 3 "register_operand" "f")
+ (parallel [(match_operand 4 "const_0_operand" "")]))))
+ (match_operand:INSVE 1 "register_operand" "0")
+ (match_operand 2 "const_<bitmask>_operand" "")))]
"ISA_HAS_MSA"
- "insve.<msafmt>\t%w0[%2],%w3[0]"
+ "insve.<msafmt>\t%w0[%K2],%w3[0]"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_logic_l")])
@@ -495,16 +646,17 @@
;; Used by combine to convert a copy_s + insert with subreg into an insve
(define_insn "*msa_insve_sext_insn_<msafmt>"
[(set (match_operand:INSVE_2 0 "register_operand" "=f")
- (unspec:INSVE_2 [(match_operand:INSVE_2 1 "register_operand" "0")
- (match_operand 2 "const_<indeximm>_operand" "")
- (subreg:<UNITMODE>
- (unspec:<RES>
- [(match_operand:INSVE_2 3 "register_operand" "f")
- (match_operand 4 "const_0_operand" "")
- ] UNSPEC_MSA_COPY_S) 0)
- ] UNSPEC_MSA_INSERT))]
+ (vec_merge:INSVE_2
+ (vec_duplicate:INSVE_2
+ (subreg:<UNITMODE>
+ (sign_extend:<RES>
+ (vec_select:<UNITMODE>
+ (match_operand:INSVE_2 3 "register_operand" "f")
+ (parallel [(match_operand 4 "const_0_operand" "")]))) 0))
+ (match_operand:INSVE_2 1 "register_operand" "0")
+ (match_operand 2 "const_<bitmask>_operand" "")))]
"ISA_HAS_MSA"
- "insve.<msafmt>\t%w0[%2],%w3[0]"
+ "insve.<msafmt>\t%w0[%K2],%w3[0]"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_logic_l")])
@@ -512,28 +664,44 @@
;; Used by combine to convert a copy_u + insert with subreg into an insve
(define_insn "*msa_insve_zext_insn_<msafmt>"
[(set (match_operand:INSVE_2 0 "register_operand" "=f")
- (unspec:INSVE_2 [(match_operand:INSVE_2 1 "register_operand" "0")
- (match_operand 2 "const_<indeximm>_operand" "")
- (subreg:<UNITMODE>
- (unspec:<RES>
- [(match_operand:INSVE_2 3 "register_operand" "f")
- (match_operand 4 "const_0_operand" "")
- ] UNSPEC_MSA_COPY_U) 0)
- ] UNSPEC_MSA_INSERT))]
+ (vec_merge:INSVE_2
+ (vec_duplicate:INSVE_2
+ (subreg:<UNITMODE>
+ (zero_extend:<RES>
+ (vec_select:<RES>
+ (match_operand:INSVE_2 3 "register_operand" "f")
+ (parallel [(match_operand 4 "const_0_operand" "")]))) 0))
+ (match_operand:INSVE_2 1 "register_operand" "0")
+ (match_operand 2 "const_<bitmask>_operand" "")))]
"ISA_HAS_MSA"
- "insve.<msafmt>\t%w0[%2],%w3[%4]"
+ "insve.<msafmt>\t%w0[%K2],%w3[0]"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_logic_l")])
-(define_insn "msa_insve_<msafmt_f>"
- [(set (match_operand:MSA 0 "register_operand" "=f")
- (unspec:MSA [(match_operand:MSA 1 "register_operand" "0")
- (match_operand 2 "const_<indeximm>_operand" "")
- (match_operand:MSA 3 "register_operand" "f")]
- UNSPEC_MSA_INSVE))]
+(define_expand "msa_insve_<msafmt_f>"
+ [(set (match_operand:MSA 0 "register_operand")
+ (vec_merge:MSA (vec_duplicate:MSA
+ (vec_select:<UNITMODE>
+ (match_operand:MSA 3 "register_operand")
+ (parallel [(const_int 0)])))
+ (match_operand:MSA 1 "register_operand")
+ (match_operand 2 "const_<indeximm>_operand")))]
"ISA_HAS_MSA"
- "insve.<msafmt>\t%w0[%2],%w3[0]"
+ {
+ operands[2] = GEN_INT ((1 << INTVAL (operands[2])));
+ })
+
+(define_insn "msa_insve_<msafmt_f>_insn"
+ [(set (match_operand:MSA 0 "register_operand" "=f")
+ (vec_merge:MSA (vec_duplicate:MSA
+ (vec_select:<UNITMODE>
+ (match_operand:MSA 3 "register_operand" "f")
+ (parallel [(const_int 0)])))
+ (match_operand:MSA 1 "register_operand" "0")
+ (match_operand 2 "const_<bitmask>_operand" "")))]
+ "ISA_HAS_MSA"
+ "insve.<msafmt>\t%w0[%K2],%w3[0]"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_logic_l")])
@@ -541,12 +709,12 @@
;; operand 3 is a scalar
(define_insn "msa_insve_<msafmt>_f_s"
[(set (match_operand:FMSA 0 "register_operand" "=f")
- (unspec:FMSA [(match_operand:FMSA 1 "register_operand" "0")
- (match_operand 2 "const_<indeximm>_operand" "")
- (match_operand:<UNITMODE> 3 "register_operand" "f")]
- UNSPEC_MSA_INSVE))]
+ (vec_merge:FMSA (vec_duplicate:FMSA
+ (match_operand:<UNITMODE> 3 "register_operand" "f"))
+ (match_operand:FMSA 1 "register_operand" "0")
+ (match_operand 2 "const_<bitmask>_operand" "")))]
"ISA_HAS_MSA"
- "insve.<msafmt>\t%w0[%2],%w3[0]"
+ "insve.<msafmt>\t%w0[%K2],%w3[0]"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_logic_l")])
@@ -554,9 +722,10 @@
;; Note that copy_s.d and copy_s.d_f will be split later if !TARGET_64BIT.
(define_insn "msa_copy_s_<msafmt_f>"
[(set (match_operand:<RES> 0 "register_operand" "=d")
- (unspec:<RES> [(match_operand:MSA 1 "register_operand" "f")
- (match_operand 2 "const_<indeximm>_operand" "")]
- UNSPEC_MSA_COPY_S))]
+ (sign_extend:<RES>
+ (vec_select:<UNITMODE>
+ (match_operand:MSA 1 "register_operand" "f")
+ (parallel [(match_operand 2 "const_<indeximm>_operand" "")]))))]
"ISA_HAS_MSA"
"copy_s.<msafmt>\t%0,%w1[%2]"
[(set_attr "type" "mfc")
@@ -565,9 +734,10 @@
(define_split
[(set (match_operand:<UNITMODE> 0 "register_operand")
- (unspec:<UNITMODE> [(match_operand:SPLIT 1 "register_operand")
- (match_operand 2 "const_0_or_1_operand")]
- UNSPEC_MSA_COPY_S))]
+ (sign_extend:<UNITMODE>
+ (vec_select:<UNITMODE>
+ (match_operand:SPLIT 1 "register_operand")
+ (parallel [(match_operand 2 "const_0_or_1_operand")]))))]
"reload_completed && TARGET_MSA && !TARGET_64BIT"
[(const_int 0)]
{
@@ -578,9 +748,10 @@
;; Note that copy_u.d and copy_u.d_f will be split later if !TARGET_64BIT.
(define_insn "msa_copy_u_<msafmt_f>"
[(set (match_operand:<RES> 0 "register_operand" "=d")
- (unspec:<RES> [(match_operand:MSA 1 "register_operand" "f")
- (match_operand 2 "const_<indeximm>_operand" "")]
- UNSPEC_MSA_COPY_U))]
+ (zero_extend:<RES>
+ (vec_select:<UNITMODE>
+ (match_operand:MSA 1 "register_operand" "f")
+ (parallel [(match_operand 2 "const_<indeximm>_operand" "")]))))]
"ISA_HAS_MSA"
"copy_u.<msafmt>\t%0,%w1[%2]"
[(set_attr "type" "mfc")
@@ -589,9 +760,10 @@
(define_split
[(set (match_operand:<UNITMODE> 0 "register_operand")
- (unspec:<UNITMODE> [(match_operand:SPLIT 1 "register_operand")
- (match_operand 2 "const_0_or_1_operand")]
- UNSPEC_MSA_COPY_U))]
+ (zero_extend:<UNITMODE>
+ (vec_select:<UNITMODE>
+ (match_operand:SPLIT 1 "register_operand")
+ (parallel [(match_operand 2 "const_0_or_1_operand")]))))]
"reload_completed && TARGET_MSA && !TARGET_64BIT"
[(const_int 0)]
{
@@ -608,14 +780,38 @@
{
/* The optab semantics are that index 0 selects the first element
of operands[1] and the highest index selects the last element
- of operands[2]. This is the oppossite order from "vshf.df wd,rs,wt"
- where index 0 selects the first elemnt of wt and the highest index
- selects the last element of ws. We therefore swap the operands here. */
+ of operands[2]. This is the oppossite order from "vshf.df wd,rs,wt"
+ where index 0 selects the first element of wt and the highest index
+ selects the last element of ws. We therefore swap the operands here. */
emit_insn (gen_msa_vshf<mode> (operands[0], operands[3], operands[2],
operands[1]));
DONE;
})
+(define_expand "vec_perm_const<mode>"
+ [(match_operand:MSA 0 "register_operand")
+ (match_operand:MSA 1 "register_operand")
+ (match_operand:MSA 2 "register_operand")
+ (match_operand:<VIMODE> 3 "")]
+ "ISA_HAS_MSA"
+{
+ if (mips_expand_vec_perm_const (operands))
+ DONE;
+ else
+ FAIL;
+})
+
+(define_expand "abs<mode>2"
+ [(set (match_operand:IMSA 0 "register_operand" "=f")
+ (abs:IMSA (match_operand:IMSA 1 "register_operand" "f")))]
+ "ISA_HAS_MSA"
+{
+ rtx reg = gen_reg_rtx (<MODE>mode);
+ emit_insn (gen_msa_ldi<mode> (reg, const0_rtx));
+ emit_insn (gen_msa_add_a_<msafmt> (operands[0], operands[1], reg));
+ DONE;
+})
+
(define_expand "neg<mode>2"
[(match_operand:IMSA 0 "register_operand")
(match_operand:IMSA 1 "register_operand")]
@@ -633,23 +829,11 @@
"ISA_HAS_MSA"
{
rtx reg = gen_reg_rtx (<MODE>mode);
- emit_insn (gen_msa_ld0<mode> (reg, const0_rtx));
+ emit_move_insn (reg, CONST0_RTX (<MODE>mode));
emit_insn (gen_sub<mode>3 (operands[0], reg, operands[1]));
DONE;
})
-(define_insn "msa_ldi<mode>_insn"
- [(set (match_operand:IMSA 0 "register_operand" "=f")
- (match_operand:IMSA 1 "const_vector_same_simm10_operand" ""))]
- "ISA_HAS_MSA"
- {
- operands[1] = CONST_VECTOR_ELT (operands[1], 0);
- return "ldi.<msafmt>\t%w0,%d1";
- }
- [(set_attr "type" "arith")
- (set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
-
(define_expand "msa_ldi<mode>"
[(match_operand:IMSA 0 "register_operand")
(match_operand 1 "const_imm10_operand")]
@@ -669,32 +853,12 @@
val = trunc_int_for_mode (val, <UNITMODE>mode);
for (i = 0; i < n_elts; i++)
- RTVEC_ELT (v, i) = GEN_INT (val);
- emit_insn (gen_msa_ldi<mode>_insn (operands[0],
- gen_rtx_CONST_VECTOR (<MODE>mode, v)));
+ RTVEC_ELT (v, i) = GEN_INT (val);
+ emit_move_insn (operands[0],
+ gen_rtx_CONST_VECTOR (<MODE>mode, v));
DONE;
})
-(define_insn "msa_ld0<mode>"
- [(set (match_operand:FMSA 0 "register_operand" "=f")
- (unspec:FMSA [(match_operand 1 "const_0_operand" "")]
- UNSPEC_MSA_LD0))]
- "ISA_HAS_MSA"
- "ldi.<msafmt>\t%w0,%d1"
- [(set_attr "type" "arith")
- (set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
-
-(define_insn "msa_lsa"
- [(set (match_operand:SI 0 "register_operand" "=d")
- (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "d")
- (match_operand:SI 2 "const_immlsa_operand" ""))
- (match_operand:SI 3 "register_operand" "d")))]
- "ISA_HAS_LSA"
- "lsa\t%0,%1,%3,%y2"
- [(set_attr "type" "arith")
- (set_attr "mode" "SI")])
-
(define_insn "msa_vshf<mode>"
[(set (match_operand:MSA 0 "register_operand" "=f")
(unspec:MSA [(match_operand:<VIMODE> 1 "register_operand" "0")
@@ -705,83 +869,38 @@
"vshf.<msafmt>\t%w0,%w2,%w3"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic_l")])
-
-;; 128-bit integer/MSA vector registers moves
-;; Note that we prefer floating-point loads, stores, and moves by adding * to
-;; other register preferences.
-;; Note that we combine f and J, so that move_type for J is fmove and its
-;; instruction length can be 1.
-(define_insn "movti_msa"
- [(set (match_operand:TI 0 "nonimmediate_operand" "=*d,*d,*d,*R,*d,*f,f,R,f,*m,*d,*m,*f")
- (match_operand:TI 1 "move_operand" "*d,*i,*R,*d*J,*f,*d,R,f,fJ,*d*J,*m,*f,*m"))]
- "ISA_HAS_MSA
- && !TARGET_64BIT
- && (register_operand (operands[0], TImode)
- || reg_or_0_operand (operands[1], TImode))"
- { return mips_output_move (operands[0], operands[1]); }
- [(set_attr "move_type" "move,const,load,store,mfc,mtc,fpload,fpstore,fmove,store,load,fpstore,fpload")
- (set_attr "mode" "TI")])
-
-;; Note that we prefer floating-point loads, stores, and moves by adding * to
-;; other register preferences.
-;; Note that we combine f and J, so that move_type for J is fmove and its
-;; instruction length can be 1.
-(define_insn "movti_msa_64bit"
- [(set (match_operand:TI 0 "nonimmediate_operand" "=*d,*d,*d,*R,*a,*d,*d,*f,f,R,f,*m,*d,*m,*f")
- (match_operand:TI 1 "move_operand" "*d,*i,*R,*d*J,*d*J,*a,*f,*d,R,f,fJ,*d*J,*m,*f,*m"))]
- "ISA_HAS_MSA
- && TARGET_64BIT
- && (register_operand (operands[0], TImode)
- || reg_or_0_operand (operands[1], TImode))"
- { return mips_output_move (operands[0], operands[1]); }
- [(set_attr "move_type" "move,const,load,store,mtlo,mflo,mfc,mtc,fpload,fpstore,fmove,store,load,fpstore,fpload")
- (set_attr "mode" "TI")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic_l2")
+ (const_string "msa_eu_logic_l")))])
(define_expand "mov<mode>"
- [(set (match_operand:MODE128 0)
- (match_operand:MODE128 1))]
- "TARGET_64BIT || TARGET_MSA"
+ [(set (match_operand:MSA 0)
+ (match_operand:MSA 1))]
+ "TARGET_MSA"
{
if (mips_legitimize_move (<MODE>mode, operands[0], operands[1]))
DONE;
})
(define_expand "movmisalign<mode>"
- [(set (match_operand:MODE128 0)
- (match_operand:MODE128 1))]
- "TARGET_64BIT || TARGET_MSA"
+ [(set (match_operand:MSA 0)
+ (match_operand:MSA 1))]
+ "TARGET_MSA"
{
if (mips_legitimize_move (<MODE>mode, operands[0], operands[1]))
DONE;
})
-;; 128bit MSA modes only in msa registers or memmory
-;; an exception is allowing MSA modes for GP registers for arguments
-;; and return values.
+;; 128bit MSA modes only in msa registers or memory. An exception is allowing
+;; MSA modes for GP registers for arguments and return values.
(define_insn "mov<mode>_msa"
- [(set (match_operand:MODE128 0 "nonimmediate_operand" "=f,f,R,!d,f")
- (match_operand:MODE128 1 "move_operand" "fYG,R,f,f,!d"))]
- "ISA_HAS_MSA
- && (register_operand (operands[0], <MODE>mode)
- || reg_or_0_operand (operands[1], <MODE>mode))"
+ [(set (match_operand:MSA 0 "nonimmediate_operand" "=f,f,R,*d,*f")
+ (match_operand:MSA 1 "move_operand" "fYGYI,R,f,*f,*d"))]
+ "TARGET_MSA"
{ return mips_output_move (operands[0], operands[1]); }
- [(set_attr "move_type" "fmove,fpload,fpstore,fmove,fmove")
- (set_attr "mode" "TI")])
-
-(define_split
- [(set (match_operand:TI 0 "nonimmediate_operand")
- (match_operand:TI 1 "move_operand"))]
- "reload_completed && TARGET_MSA
- && mips_split_move_insn_p (operands[0], operands[1], insn)"
- [(const_int 0)]
-{
- /* Temporary sanity check */
- gcc_assert (mips_split_128bit_move_p (operands[0], operands[1]));
- gcc_assert (mips_split_move_insn_p (operands[0], operands[1], curr_insn));
- mips_split_move_insn (operands[0], operands[1], curr_insn);
- DONE;
-})
+ [(set_attr "move_type" "fmove,fpload,fpstore,mfc,mtc")
+ (set_attr "mode" "TI")])
(define_split
[(set (match_operand:MSA 0 "nonimmediate_operand")
@@ -790,8 +909,6 @@
&& mips_split_move_insn_p (operands[0], operands[1], insn)"
[(const_int 0)]
{
- /* Temporary sanity check */
- gcc_assert (mips_split_128bit_move_p (operands[0], operands[1]));
mips_split_move_insn (operands[0], operands[1], curr_insn);
DONE;
})
@@ -851,8 +968,9 @@
gcc_unreachable ();
}
}
- [(set_attr "alu_type" "add")
+ [(set_attr "alu_type" "add, unknown, unknown")
(set_attr "mode" "TI")
+ (set_attr "datafmt" "<msafmt>")
(set_attr "msa_execunit" "msa_eu_int_add")])
(define_insn "sub<mode>3"
@@ -883,8 +1001,9 @@
gcc_unreachable ();
}
}
- [(set_attr "alu_type" "sub")
+ [(set_attr "alu_type" "sub, unknown, unknown")
(set_attr "mode" "TI")
+ (set_attr "datafmt" "<msafmt>")
(set_attr "msa_execunit" "msa_eu_int_add")])
(define_insn "mul<mode>3"
@@ -927,6 +1046,7 @@
{ return mips_msa_output_division ("div_s.<msafmt>\t%w0,%w1,%w2", operands); }
[(set_attr "type" "idiv3")
(set_attr "mode" "TI")
+ (set_attr "datafmt" "<msafmt>")
(set_attr "msa_execunit" "msa_eu_div")])
(define_insn "udiv<mode>3"
@@ -937,6 +1057,7 @@
{ return mips_msa_output_division ("div_u.<msafmt>\t%w0,%w1,%w2", operands); }
[(set_attr "type" "idiv3")
(set_attr "mode" "TI")
+ (set_attr "datafmt" "<msafmt>")
(set_attr "msa_execunit" "msa_eu_div")])
(define_insn "mod<mode>3"
@@ -947,6 +1068,7 @@
{ return mips_msa_output_division ("mod_s.<msafmt>\t%w0,%w1,%w2", operands); }
[(set_attr "type" "idiv3")
(set_attr "mode" "TI")
+ (set_attr "datafmt" "<msafmt>")
(set_attr "msa_execunit" "msa_eu_div")])
(define_insn "umod<mode>3"
@@ -957,6 +1079,7 @@
{ return mips_msa_output_division ("mod_u.<msafmt>\t%w0,%w1,%w2", operands); }
[(set_attr "type" "idiv3")
(set_attr "mode" "TI")
+ (set_attr "datafmt" "<msafmt>")
(set_attr "msa_execunit" "msa_eu_div")])
(define_insn "xorv16qi3"
@@ -996,7 +1119,11 @@
}
[(set_attr "alu_type" "xor")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (and (eq_attr "cpu" "i6400")
+ (eq_attr "alternative" "1"))
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "iorv16qi3"
[(set (match_operand:V16QI 0 "register_operand" "=f,f")
@@ -1035,7 +1162,11 @@
}
[(set_attr "alu_type" "or")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (and (eq_attr "cpu" "i6400")
+ (eq_attr "alternative" "1"))
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "andv16qi3"
[(set (match_operand:V16QI 0 "register_operand" "=f,f")
@@ -1046,7 +1177,7 @@
if (which_alternative == 1)
{
operands[2] = CONST_VECTOR_ELT (operands[2], 0);
- return "andi.b\t%w0,%w0,%B2";
+ return "andi.b\t%w0,%w1,%B2";
}
else
return "and.v\t%w0,%w1,%w2";
@@ -1074,7 +1205,11 @@
}
[(set_attr "alu_type" "and")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (and (eq_attr "cpu" "i6400")
+ (eq_attr "alternative" "1"))
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "one_cmpl<mode>2"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -1087,8 +1222,8 @@
(define_insn "vlshr<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
- (lshiftrt:<MODE> (match_operand:<MODE> 1 "register_operand" "f,f")
- (match_operand:<MODE> 2 "reg_or_vector_same_uimm6_operand" "f,Uuv6")))]
+ (lshiftrt:IMSA (match_operand:IMSA 1 "register_operand" "f,f")
+ (match_operand:IMSA 2 "reg_or_vector_same_uimm6_operand" "f,Uuv6")))]
"ISA_HAS_MSA"
{
if (which_alternative == 0)
@@ -1100,7 +1235,10 @@
}
[(set_attr "type" "shift")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "vashr<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
@@ -1117,7 +1255,10 @@
}
[(set_attr "type" "shift")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "vashl<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f,f")
@@ -1134,7 +1275,10 @@
}
[(set_attr "type" "shift")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
;; Floating-point operations
(define_insn "add<mode>3"
@@ -1249,24 +1393,59 @@
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_int_add")])
-(define_insn "msa_addvi_<msafmt>"
+(define_expand "msa_addvi_<msafmt>"
+ [(set (match_operand:IMSA 0 "register_operand")
+ (plus:IMSA (match_operand:IMSA 1 "register_operand")
+ (match_operand 2 "const_uimm5_operand")))]
+ "ISA_HAS_MSA"
+ {
+ unsigned n_elts = GET_MODE_NUNITS (<MODE>mode);
+ rtvec v = rtvec_alloc (n_elts);
+ HOST_WIDE_INT val = INTVAL (operands[2]);
+ unsigned int i;
+
+ for (i = 0; i < n_elts; i++)
+ RTVEC_ELT (v, i) = GEN_INT (val);
+
+ emit_insn (gen_msa_addvi_<msafmt>_insn (operands[0], operands[1],
+ gen_rtx_CONST_VECTOR (<MODE>mode, v)));
+ DONE;
+ })
+
+(define_expand "msa_andi_b"
+ [(set (match_operand:V16QI 0 "register_operand")
+ (and:V16QI (match_operand:V16QI 1 "register_operand")
+ (match_operand:QI 2 "const_uimm8_operand")))]
+ "ISA_HAS_MSA"
+ {
+ rtvec v = rtvec_alloc (16);
+ HOST_WIDE_INT val = INTVAL (operands[2]);
+ unsigned int i;
+
+ for (i = 0; i < 16; i++)
+ RTVEC_ELT (v, i) = GEN_INT (val);
+
+ emit_insn (gen_msa_andi_b_insn (operands[0], operands[1],
+ gen_rtx_CONST_VECTOR (V16QImode, v)));
+ DONE;
+ })
+
+(define_insn "msa_addvi_<msafmt>_insn"
[(set (match_operand:IMSA 0 "register_operand" "=f")
- (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
- (match_operand 2 "const_uimm5_operand" "")]
- UNSPEC_MSA_ADDVI))]
+ (plus:IMSA (match_operand:IMSA 1 "register_operand" "f")
+ (match_operand:IMSA 2 "const_vector_same_uimm5_operand" "")))]
"ISA_HAS_MSA"
- "addvi.<msafmt>\t%w0,%w1,%2"
+ "addvi.<msafmt>\t%w0,%w1,%E2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_int_add")])
-(define_insn "msa_andi_b"
+(define_insn "msa_andi_b_insn"
[(set (match_operand:V16QI 0 "register_operand" "=f")
- (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "f")
- (match_operand 2 "const_uimm8_operand" "")]
- UNSPEC_MSA_ANDI_B))]
+ (and:V16QI (match_operand:V16QI 1 "register_operand" "f")
+ (match_operand:V16QI 2 "const_vector_same_uimm8_operand" "")))]
"ISA_HAS_MSA"
- "andi.b\t%w0,%w1,%2"
+ "andi.b\t%w0,%w1,%E2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_logic")])
@@ -1346,7 +1525,10 @@
"bclr.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_bclri_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -1357,7 +1539,10 @@
"bclri.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_binsl_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -1369,7 +1554,10 @@
"binsl.<msafmt>\t%w0,%w2,%w3"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic_l")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic_l2")
+ (const_string "msa_eu_logic_l")))])
(define_insn "msa_binsli_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -1381,7 +1569,10 @@
"binsli.<msafmt>\t%w0,%w2,%3"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic_l")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic_l2")
+ (const_string "msa_eu_logic_l")))])
(define_insn "msa_binsr_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -1393,7 +1584,10 @@
"binsr.<msafmt>\t%w0,%w2,%w3"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic_l")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic_l2")
+ (const_string "msa_eu_logic_l")))])
(define_insn "msa_binsri_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -1405,7 +1599,10 @@
"binsri.<msafmt>\t%w0,%w2,%3"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic_l")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic_l2")
+ (const_string "msa_eu_logic_l")))])
(define_insn "msa_bmnz_v_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -1464,18 +1661,24 @@
"bneg.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_bnegi_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
(unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
(match_operand 2 "const_msa_branch_operand" "")]
- UNSPEC_MSA_BNEGI))]
+ UNSPEC_MSA_BNEGI))]
"ISA_HAS_MSA"
"bnegi.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_bsel_v_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -1486,7 +1689,8 @@
"ISA_HAS_MSA"
"bsel.v\t%w0,%w2,%w3"
[(set_attr "type" "arith")
- (set_attr "mode" "TI")])
+ (set_attr "mode" "TI")
+ (set_attr "msa_execunit" "msa_eu_logic_l")])
(define_insn "msa_bseli_b"
[(set (match_operand:V16QI 0 "register_operand" "=f")
@@ -1509,7 +1713,10 @@
"bset.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_bseti_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -1520,7 +1727,10 @@
"bseti.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_code_iterator ICC [eq le leu lt ltu])
@@ -1560,10 +1770,7 @@
(ICC:IMSA (match_operand:IMSA 1 "register_operand" "f")
(match_operand:IMSA 2 "const_vector_same_cmp<ICC:cmpi>imm4_operand" "")))]
"ISA_HAS_MSA"
- {
- operands[2] = CONST_VECTOR_ELT (operands[2], 0);
- return "c<ICC:icci>.<IMSA:msafmt>\t%w0,%w1,%d2";
- }
+ "c<ICC:icci>.<IMSA:msafmt>\t%w0,%w1,%E2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_int_add")])
@@ -1581,9 +1788,9 @@
(define_insn "msa_dotp_s_<msafmt>"
[(set (match_operand:IDOTP128 0 "register_operand" "=f")
- (unspec:<MODE> [(match_operand:<VHALFMODE> 1 "register_operand" "f")
- (match_operand:<VHALFMODE> 2 "register_operand" "f")]
- UNSPEC_MSA_DOTP_S))]
+ (unspec:IDOTP128 [(match_operand:<VHALFMODE> 1 "register_operand" "f")
+ (match_operand:<VHALFMODE> 2 "register_operand" "f")]
+ UNSPEC_MSA_DOTP_S))]
"ISA_HAS_MSA"
"dotp_s.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "arith")
@@ -1592,9 +1799,9 @@
(define_insn "msa_dotp_u_<msafmt>"
[(set (match_operand:IDOTP128 0 "register_operand" "=f")
- (unspec:<MODE> [(match_operand:<VHALFMODE> 1 "register_operand" "f")
- (match_operand:<VHALFMODE> 2 "register_operand" "f")]
- UNSPEC_MSA_DOTP_U))]
+ (unspec:IDOTP128 [(match_operand:<VHALFMODE> 1 "register_operand" "f")
+ (match_operand:<VHALFMODE> 2 "register_operand" "f")]
+ UNSPEC_MSA_DOTP_U))]
"ISA_HAS_MSA"
"dotp_u.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "arith")
@@ -1603,10 +1810,10 @@
(define_insn "msa_dpadd_s_<msafmt>"
[(set (match_operand:IDOTP128 0 "register_operand" "=f")
- (unspec:<MODE> [(match_operand:<MODE> 1 "register_operand" "0")
- (match_operand:<VHALFMODE> 2 "register_operand" "f")
- (match_operand:<VHALFMODE> 3 "register_operand" "f")]
- UNSPEC_MSA_DPADD_S))]
+ (unspec:IDOTP128 [(match_operand:IDOTP128 1 "register_operand" "0")
+ (match_operand:<VHALFMODE> 2 "register_operand" "f")
+ (match_operand:<VHALFMODE> 3 "register_operand" "f")]
+ UNSPEC_MSA_DPADD_S))]
"ISA_HAS_MSA"
"dpadd_s.<msafmt>\t%w0,%w2,%w3"
[(set_attr "type" "arith")
@@ -1615,10 +1822,10 @@
(define_insn "msa_dpadd_u_<msafmt>"
[(set (match_operand:IDOTP128 0 "register_operand" "=f")
- (unspec:<MODE> [(match_operand:<MODE> 1 "register_operand" "0")
- (match_operand:<VHALFMODE> 2 "register_operand" "f")
- (match_operand:<VHALFMODE> 3 "register_operand" "f")]
- UNSPEC_MSA_DPADD_U))]
+ (unspec:IDOTP128 [(match_operand:IDOTP128 1 "register_operand" "0")
+ (match_operand:<VHALFMODE> 2 "register_operand" "f")
+ (match_operand:<VHALFMODE> 3 "register_operand" "f")]
+ UNSPEC_MSA_DPADD_U))]
"ISA_HAS_MSA"
"dpadd_u.<msafmt>\t%w0,%w2,%w3"
[(set_attr "type" "arith")
@@ -1627,10 +1834,10 @@
(define_insn "msa_dpsub_s_<msafmt>"
[(set (match_operand:IDOTP128 0 "register_operand" "=f")
- (unspec:<MODE> [(match_operand:<MODE> 1 "register_operand" "0")
- (match_operand:<VHALFMODE> 2 "register_operand" "f")
- (match_operand:<VHALFMODE> 3 "register_operand" "f")]
- UNSPEC_MSA_DPSUB_S))]
+ (unspec:IDOTP128 [(match_operand:IDOTP128 1 "register_operand" "0")
+ (match_operand:<VHALFMODE> 2 "register_operand" "f")
+ (match_operand:<VHALFMODE> 3 "register_operand" "f")]
+ UNSPEC_MSA_DPSUB_S))]
"ISA_HAS_MSA"
"dpsub_s.<msafmt>\t%w0,%w2,%w3"
[(set_attr "type" "arith")
@@ -1639,10 +1846,10 @@
(define_insn "msa_dpsub_u_<msafmt>"
[(set (match_operand:IDOTP128 0 "register_operand" "=f")
- (unspec:<MODE> [(match_operand:<MODE> 1 "register_operand" "0")
- (match_operand:<VHALFMODE> 2 "register_operand" "f")
- (match_operand:<VHALFMODE> 3 "register_operand" "f")]
- UNSPEC_MSA_DPSUB_U))]
+ (unspec:IDOTP128 [(match_operand:IDOTP128 1 "register_operand" "0")
+ (match_operand:<VHALFMODE> 2 "register_operand" "f")
+ (match_operand:<VHALFMODE> 3 "register_operand" "f")]
+ UNSPEC_MSA_DPSUB_U))]
"ISA_HAS_MSA"
"dpsub_u.<msafmt>\t%w0,%w2,%w3"
[(set_attr "type" "arith")
@@ -1694,6 +1901,24 @@
(le "fcle")
(lt "fclt")])
+(define_int_iterator FSC_UNS [UNSPEC_MSA_FSAF UNSPEC_MSA_FSUN UNSPEC_MSA_FSOR
+ UNSPEC_MSA_FSEQ UNSPEC_MSA_FSNE UNSPEC_MSA_FSUEQ
+ UNSPEC_MSA_FSUNE UNSPEC_MSA_FSULE UNSPEC_MSA_FSULT
+ UNSPEC_MSA_FSLE UNSPEC_MSA_FSLT])
+
+(define_int_attr fsc
+ [(UNSPEC_MSA_FSAF "fsaf")
+ (UNSPEC_MSA_FSUN "fsun")
+ (UNSPEC_MSA_FSOR "fsor")
+ (UNSPEC_MSA_FSEQ "fseq")
+ (UNSPEC_MSA_FSNE "fsne")
+ (UNSPEC_MSA_FSUEQ "fsueq")
+ (UNSPEC_MSA_FSUNE "fsune")
+ (UNSPEC_MSA_FSULE "fsule")
+ (UNSPEC_MSA_FSULT "fsult")
+ (UNSPEC_MSA_FSLE "fsle")
+ (UNSPEC_MSA_FSLT "fslt")])
+
(define_insn "msa_<FCC:fcc>_<FMSA:msafmt>"
[(set (match_operand:<VIMODE> 0 "register_operand" "=f")
(FCC:<VIMODE> (match_operand:FMSA 1 "register_operand" "f")
@@ -1704,123 +1929,13 @@
(set_attr "mode" "<UNITMODE>")
(set_attr "msa_execunit" "msa_eu_cmp")])
-(define_insn "msa_fsaf_<FMSA:msafmt>"
- [(set (match_operand:<VIMODE> 0 "register_operand" "=f")
- (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")
- (match_operand:FMSA 2 "register_operand" "f")]
- UNSPEC_MSA_FSAF))]
- "ISA_HAS_MSA"
- "fsaf.<FMSA:msafmt>\t%w0,%w1,%w2"
- [(set_attr "type" "fcmp")
- (set_attr "mode" "<UNITMODE>")
- (set_attr "msa_execunit" "msa_eu_cmp")])
-
-(define_insn "msa_fsor_<FMSA:msafmt>"
- [(set (match_operand:<VIMODE> 0 "register_operand" "=f")
- (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")
- (match_operand:FMSA 2 "register_operand" "f")]
- UNSPEC_MSA_FSOR))]
- "ISA_HAS_MSA"
- "fsor.<FMSA:msafmt>\t%w0,%w1,%w2"
- [(set_attr "type" "fcmp")
- (set_attr "mode" "<UNITMODE>")
- (set_attr "msa_execunit" "msa_eu_cmp")])
-
-(define_insn "msa_fsun_<FMSA:msafmt>"
- [(set (match_operand:<VIMODE> 0 "register_operand" "=f")
- (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")
- (match_operand:FMSA 2 "register_operand" "f")]
- UNSPEC_MSA_FSUN))]
- "ISA_HAS_MSA"
- "fsun.<FMSA:msafmt>\t%w0,%w1,%w2"
- [(set_attr "type" "fcmp")
- (set_attr "mode" "<UNITMODE>")
- (set_attr "msa_execunit" "msa_eu_cmp")])
-
-(define_insn "msa_fsune_<msafmt>"
- [(set (match_operand:<VIMODE> 0 "register_operand" "=f")
- (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")
- (match_operand:FMSA 2 "register_operand" "f")]
- UNSPEC_MSA_FSUNE))]
- "ISA_HAS_MSA"
- "fsune.<msafmt>\t%w0,%w1,%w2"
- [(set_attr "type" "fcmp")
- (set_attr "mode" "<UNITMODE>")
- (set_attr "msa_execunit" "msa_eu_cmp")])
-
-(define_insn "msa_fsueq_<msafmt>"
- [(set (match_operand:<VIMODE> 0 "register_operand" "=f")
- (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")
- (match_operand:FMSA 2 "register_operand" "f")]
- UNSPEC_MSA_FSUEQ))]
- "ISA_HAS_MSA"
- "fsueq.<msafmt>\t%w0,%w1,%w2"
- [(set_attr "type" "fcmp")
- (set_attr "mode" "<UNITMODE>")
- (set_attr "msa_execunit" "msa_eu_cmp")])
-
-(define_insn "msa_fseq_<msafmt>"
- [(set (match_operand:<VIMODE> 0 "register_operand" "=f")
- (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")
- (match_operand:FMSA 2 "register_operand" "f")]
- UNSPEC_MSA_FSEQ))]
- "ISA_HAS_MSA"
- "fseq.<msafmt>\t%w0,%w1,%w2"
- [(set_attr "type" "fcmp")
- (set_attr "mode" "<UNITMODE>")
- (set_attr "msa_execunit" "msa_eu_cmp")])
-
-(define_insn "msa_fsne_<msafmt>"
- [(set (match_operand:<VIMODE> 0 "register_operand" "=f")
- (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")
- (match_operand:FMSA 2 "register_operand" "f")]
- UNSPEC_MSA_FSNE))]
- "ISA_HAS_MSA"
- "fsne.<msafmt>\t%w0,%w1,%w2"
- [(set_attr "type" "fcmp")
- (set_attr "mode" "<UNITMODE>")
- (set_attr "msa_execunit" "msa_eu_cmp")])
-
-(define_insn "msa_fslt_<msafmt>"
- [(set (match_operand:<VIMODE> 0 "register_operand" "=f")
- (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")
- (match_operand:FMSA 2 "register_operand" "f")]
- UNSPEC_MSA_FSLT))]
- "ISA_HAS_MSA"
- "fslt.<msafmt>\t%w0,%w1,%w2"
- [(set_attr "type" "fcmp")
- (set_attr "mode" "<UNITMODE>")
- (set_attr "msa_execunit" "msa_eu_cmp")])
-
-(define_insn "msa_fsult_<msafmt>"
+(define_insn "msa_<fsc>_<FMSA:msafmt>"
[(set (match_operand:<VIMODE> 0 "register_operand" "=f")
(unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")
- (match_operand:FMSA 2 "register_operand" "f")]
- UNSPEC_MSA_FSULT))]
- "ISA_HAS_MSA"
- "fsult.<msafmt>\t%w0,%w1,%w2"
- [(set_attr "type" "fcmp")
- (set_attr "mode" "<UNITMODE>")
- (set_attr "msa_execunit" "msa_eu_cmp")])
-
-(define_insn "msa_fsle_<msafmt>"
- [(set (match_operand:<VIMODE> 0 "register_operand" "=f")
- (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")
- (match_operand:FMSA 2 "register_operand" "f")]
- UNSPEC_MSA_FSLE))]
+ (match_operand:FMSA 2 "register_operand" "f")]
+ FSC_UNS))]
"ISA_HAS_MSA"
- "fsle.<msafmt>\t%w0,%w1,%w2"
- [(set_attr "type" "fcmp")
- (set_attr "mode" "<UNITMODE>")
- (set_attr "msa_execunit" "msa_eu_cmp")])
-
-(define_insn "msa_fsule_<msafmt>"
- [(set (match_operand:<VIMODE> 0 "register_operand" "=f")
- (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")
- (match_operand:FMSA 2 "register_operand" "f")]
- UNSPEC_MSA_FSULE))]
- "ISA_HAS_MSA"
- "fsule.<msafmt>\t%w0,%w1,%w2"
+ "<fsc>.<FMSA:msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "fcmp")
(set_attr "mode" "<UNITMODE>")
(set_attr "msa_execunit" "msa_eu_cmp")])
@@ -1844,6 +1959,10 @@
[(V4SF "v4si")
(V2DF "v2di")])
+(define_mode_attr FQ
+ [(V4SF "V8HI")
+ (V2DF "V4SI")])
+
(define_mode_attr FINTCNV
[(V4SF "I2S")
(V2DF "I2D")])
@@ -1852,9 +1971,9 @@
[(V4SF "S2I")
(V2DF "D2I")])
-(define_insn "float<FMSA:mode><fint>2"
+(define_insn "float<fint><FMSA:mode>2"
[(set (match_operand:FMSA 0 "register_operand" "=f")
- (float:<MODE> (match_operand:<FINT> 1 "register_operand" "f")))]
+ (float:FMSA (match_operand:<FINT> 1 "register_operand" "f")))]
"ISA_HAS_MSA"
"ffint_s.<msafmt>\t%w0,%w1"
[(set_attr "type" "fcvt")
@@ -1862,9 +1981,9 @@
(set_attr "mode" "<UNITMODE>")
(set_attr "msa_execunit" "msa_eu_float4")])
-(define_insn "floatuns<FMSA:mode><fint>2"
+(define_insn "floatuns<fint><FMSA:mode>2"
[(set (match_operand:FMSA 0 "register_operand" "=f")
- (unsigned_float:<MODE> (match_operand:<FINT> 1 "register_operand" "f")))]
+ (unsigned_float:FMSA (match_operand:<FINT> 1 "register_operand" "f")))]
"ISA_HAS_MSA"
"ffint_u.<msafmt>\t%w0,%w1"
[(set_attr "type" "fcvt")
@@ -1878,8 +1997,8 @@
(define_insn "msa_ffql_<msafmt>"
[(set (match_operand:FMSA 0 "register_operand" "=f")
- (unspec:<MODE> [(match_operand:<FINT> 1 "register_operand" "f")]
- UNSPEC_MSA_FFQL))]
+ (unspec:FMSA [(match_operand:<FQ> 1 "register_operand" "f")]
+ UNSPEC_MSA_FFQL))]
"ISA_HAS_MSA"
"ffql.<msafmt>\t%w0,%w1"
[(set_attr "type" "fcvt")
@@ -1889,8 +2008,8 @@
(define_insn "msa_ffqr_<msafmt>"
[(set (match_operand:FMSA 0 "register_operand" "=f")
- (unspec:<MODE> [(match_operand:<FINT> 1 "register_operand" "f")]
- UNSPEC_MSA_FFQR))]
+ (unspec:FMSA [(match_operand:<FQ> 1 "register_operand" "f")]
+ UNSPEC_MSA_FFQR))]
"ISA_HAS_MSA"
"ffqr.<msafmt>\t%w0,%w1"
[(set_attr "type" "fcvt")
@@ -1898,22 +2017,53 @@
(set_attr "mode" "<UNITMODE>")
(set_attr "msa_execunit" "msa_eu_float4")])
-(define_insn "msa_fill_<msafmt_f>"
- [(set (match_operand:MSA 0 "register_operand" "=f")
- (unspec:<MODE> [(match_operand:<REGOR0> 1 "reg_or_0_operand" "dJ")]
- UNSPEC_MSA_FILL))]
+;; Note used directly by builtins but via the following define_expand.
+(define_insn "msa_fill_<msafmt>_insn"
+ [(set (match_operand:IMSA 0 "register_operand" "=f")
+ (vec_duplicate:IMSA
+ (match_operand:<UNITMODE> 1 "reg_or_0_operand" "dJ")))]
"ISA_HAS_MSA"
"fill.<msafmt>\t%w0,%z1"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_logic")])
-;; Note that fill.d and fill_d_f will be split later if !TARGET_64BIT.
+;; Expand builtin catoring for HImode and QImode which take SImode.
+(define_expand "msa_fill_<msafmt>"
+ [(set (match_operand:IMSA 0 "register_operand")
+ (vec_duplicate:IMSA
+ (match_operand:<EXCEPT> 1 "reg_or_0_operand")))]
+ "ISA_HAS_MSA"
+{
+ if ((GET_MODE_SIZE (<UNITMODE>mode) < GET_MODE_SIZE (<EXCEPT>mode))
+ && (REG_P (operands[1]) || (GET_CODE (operands[1]) == SUBREG
+ && REG_P (SUBREG_REG (operands[1])))))
+ {
+ unsigned int offset = GET_MODE_SIZE (<EXCEPT>mode)
+ - GET_MODE_SIZE (<UNITMODE>mode);
+ operands[1] = simplify_gen_subreg (<UNITMODE>mode, operands[1],
+ GET_MODE (operands[1]),
+ BYTES_BIG_ENDIAN ? offset : 0);
+ }
+ emit_insn (gen_msa_fill_<msafmt>_insn (operands[0], operands[1]));
+ DONE;
+ })
+
+(define_insn "msa_fill_<msafmt_f>"
+ [(set (match_operand:FMSA 0 "register_operand" "=f")
+ (vec_duplicate:FMSA
+ (match_operand:<UNITMODE> 1 "reg_or_0_operand" "dJ")))]
+ "ISA_HAS_MSA"
+ "fill.<msafmt>\t%w0,%z1"
+ [(set_attr "type" "arith")
+ (set_attr "mode" "TI")
+ (set_attr "msa_execunit" "msa_eu_logic")])
+;; Note that fill.d and fill.d_f will be split later if !TARGET_64BIT.
(define_split
[(set (match_operand:V2DI 0 "register_operand")
- (unspec:V2DI [(match_operand:DI 1 "reg_or_0_operand")]
- UNSPEC_MSA_FILL))]
+ (vec_duplicate:V2DI
+ (match_operand:DI 1 "reg_or_0_operand")))]
"reload_completed && TARGET_MSA && !TARGET_64BIT"
[(const_int 0)]
{
@@ -1923,8 +2073,8 @@
(define_split
[(set (match_operand:V2DF 0 "register_operand")
- (unspec:V2DF [(match_operand:DF 1 "register_operand")]
- UNSPEC_MSA_FILL))]
+ (vec_duplicate:V2DF
+ (match_operand:DF 1 "register_operand")))]
"reload_completed && TARGET_MSA && !TARGET_64BIT"
[(const_int 0)]
{
@@ -1945,8 +2095,8 @@
;;UNSPEC_MSA_FMAX
(define_insn "smax<mode>3"
[(set (match_operand:FMSA 0 "register_operand" "=f")
- (smax:<MODE> (match_operand:<MODE> 1 "register_operand" "f")
- (match_operand:<MODE> 2 "register_operand" "f")))]
+ (smax:FMSA (match_operand:FMSA 1 "register_operand" "f")
+ (match_operand:FMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"fmax.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "fadd")
@@ -1956,8 +2106,8 @@
;;UNSPEC_MSA_FMAX_A
(define_insn "umax<mode>3"
[(set (match_operand:FMSA 0 "register_operand" "=f")
- (umax:<MODE> (match_operand:<MODE> 1 "register_operand" "f")
- (match_operand:<MODE> 2 "register_operand" "f")))]
+ (umax:FMSA (match_operand:FMSA 1 "register_operand" "f")
+ (match_operand:FMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"fmax_a.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "fadd")
@@ -1967,8 +2117,8 @@
;;UNSPEC_MSA_FMIN
(define_insn "smin<mode>3"
[(set (match_operand:FMSA 0 "register_operand" "=f")
- (smin:<MODE> (match_operand:<MODE> 1 "register_operand" "f")
- (match_operand:<MODE> 2 "register_operand" "f")))]
+ (smin:FMSA (match_operand:FMSA 1 "register_operand" "f")
+ (match_operand:FMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"fmin.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "fadd")
@@ -1978,8 +2128,8 @@
;;UNSPEC_MSA_FMIN_A
(define_insn "umin<mode>3"
[(set (match_operand:FMSA 0 "register_operand" "=f")
- (umin:<MODE> (match_operand:<MODE> 1 "register_operand" "f")
- (match_operand:<MODE> 2 "register_operand" "f")))]
+ (umin:FMSA (match_operand:FMSA 1 "register_operand" "f")
+ (match_operand:FMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"fmin_a.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "fadd")
@@ -1993,7 +2143,8 @@
"ISA_HAS_MSA"
"frcp.<msafmt>\t%w0,%w1"
[(set_attr "type" "frdiv")
- (set_attr "mode" "<UNITMODE>")])
+ (set_attr "mode" "<UNITMODE>")
+ (set_attr "msa_execunit" "msa_eu_fdiv")])
(define_insn "msa_frint_<msafmt>"
[(set (match_operand:FMSA 0 "register_operand" "=f")
@@ -2012,14 +2163,15 @@
"ISA_HAS_MSA"
"frsqrt.<msafmt>\t%w0,%w1"
[(set_attr "type" "frsqrt")
- (set_attr "mode" "<UNITMODE>")])
+ (set_attr "mode" "<UNITMODE>")
+ (set_attr "msa_execunit" "msa_eu_fdiv")])
(define_insn "msa_ftint_s_<msafmt>"
[(set (match_operand:<FINT> 0 "register_operand" "=f")
(unspec:<FINT> [(match_operand:FMSA 1 "register_operand" "f")]
UNSPEC_MSA_FTINT_S))]
"ISA_HAS_MSA"
- "ftint_s.<>msafmt>\t%w0,%w1"
+ "ftint_s.<msafmt>\t%w0,%w1"
[(set_attr "type" "fcvt")
(set_attr "cnv_mode" "<FINTCNV_2>")
(set_attr "mode" "<UNITMODE>")
@@ -2083,14 +2235,14 @@
(set_attr "msa_execunit" "msa_eu_float4")])
(define_mode_iterator IZMODE [V8HI V4SI V2DI])
-(define_mode_attr IZDOUBLE
+(define_mode_attr IZDOUBLE
[(V8HI "V16QI")
(V4SI "V8HI")
(V2DI "V4SI")])
(define_insn "msa_hadd_s_<msafmt>"
[(set (match_operand:IZMODE 0 "register_operand" "=f")
- (unspec:<MODE> [(match_operand:<IZDOUBLE> 1 "register_operand" "f")
+ (unspec:IZMODE [(match_operand:<IZDOUBLE> 1 "register_operand" "f")
(match_operand:<IZDOUBLE> 2 "register_operand" "f")]
UNSPEC_MSA_HADD_S))]
"ISA_HAS_MSA"
@@ -2101,7 +2253,7 @@
(define_insn "msa_hadd_u_<msafmt>"
[(set (match_operand:IZMODE 0 "register_operand" "=f")
- (unspec:<MODE> [(match_operand:<IZDOUBLE> 1 "register_operand" "f")
+ (unspec:IZMODE [(match_operand:<IZDOUBLE> 1 "register_operand" "f")
(match_operand:<IZDOUBLE> 2 "register_operand" "f")]
UNSPEC_MSA_HADD_U))]
"ISA_HAS_MSA"
@@ -2112,7 +2264,7 @@
(define_insn "msa_hsub_s_<msafmt>"
[(set (match_operand:IZMODE 0 "register_operand" "=f")
- (unspec:<MODE> [(match_operand:<IZDOUBLE> 1 "register_operand" "f")
+ (unspec:IZMODE [(match_operand:<IZDOUBLE> 1 "register_operand" "f")
(match_operand:<IZDOUBLE> 2 "register_operand" "f")]
UNSPEC_MSA_HSUB_S))]
"ISA_HAS_MSA"
@@ -2123,7 +2275,7 @@
(define_insn "msa_hsub_u_<msafmt>"
[(set (match_operand:IZMODE 0 "register_operand" "=f")
- (unspec:<MODE> [(match_operand:<IZDOUBLE> 1 "register_operand" "f")
+ (unspec:IZMODE [(match_operand:<IZDOUBLE> 1 "register_operand" "f")
(match_operand:<IZDOUBLE> 2 "register_operand" "f")]
UNSPEC_MSA_HSUB_U))]
"ISA_HAS_MSA"
@@ -2132,46 +2284,214 @@
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_int_add")])
-(define_insn "msa_ilvev_<msafmt>"
- [(set (match_operand:IMSA 0 "register_operand" "=f")
- (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
- (match_operand:IMSA 2 "register_operand" "f")]
- UNSPEC_MSA_ILVEV))]
+(define_insn "msa_ilvev_b"
+ [(set (match_operand:V16QI 0 "register_operand" "=f")
+ (vec_select:V16QI (vec_concat:V32QI
+ (match_operand:V16QI 1 "register_operand" "f")
+ (match_operand:V16QI 2 "register_operand" "f"))
+ (parallel [(const_int 16) (const_int 0)
+ (const_int 18) (const_int 2)
+ (const_int 20) (const_int 4)
+ (const_int 22) (const_int 6)
+ (const_int 24) (const_int 8)
+ (const_int 26) (const_int 10)
+ (const_int 28) (const_int 12)
+ (const_int 30) (const_int 14)])))]
+ "ISA_HAS_MSA"
+ "ilvev.b\t%w0,%w1,%w2"
+ [(set_attr "alu_type" "add")
+ (set_attr "mode" "TI")
+ (set_attr "msa_execunit" "msa_eu_logic")])
+
+(define_insn "msa_ilvev_h"
+ [(set (match_operand:V8HI 0 "register_operand" "=f")
+ (vec_select:V8HI (vec_concat:V16HI
+ (match_operand:V8HI 1 "register_operand" "f")
+ (match_operand:V8HI 2 "register_operand" "f"))
+ (parallel [(const_int 8) (const_int 0)
+ (const_int 10) (const_int 2)
+ (const_int 12) (const_int 4)
+ (const_int 14) (const_int 6)])))]
+ "ISA_HAS_MSA"
+ "ilvev.h\t%w0,%w1,%w2"
+ [(set_attr "alu_type" "add")
+ (set_attr "mode" "TI")
+ (set_attr "msa_execunit" "msa_eu_logic")])
+
+(define_insn "msa_ilvev_w"
+ [(set (match_operand:V4SI 0 "register_operand" "=f")
+ (vec_select:V4SI (vec_concat:V8SI
+ (match_operand:V4SI 1 "register_operand" "f")
+ (match_operand:V4SI 2 "register_operand" "f"))
+ (parallel [(const_int 4) (const_int 0)
+ (const_int 6) (const_int 2)])))]
"ISA_HAS_MSA"
- "ilvev.<msafmt>\t%w0,%w1,%w2"
+ "ilvev.w\t%w0,%w1,%w2"
[(set_attr "alu_type" "add")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_logic")])
-(define_insn "msa_ilvl_<msafmt>"
- [(set (match_operand:IMSA 0 "register_operand" "=f")
- (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
- (match_operand:IMSA 2 "register_operand" "f")]
- UNSPEC_MSA_ILVL))]
+(define_insn "msa_ilvl_b"
+ [(set (match_operand:V16QI 0 "register_operand" "=f")
+ (vec_select:V16QI (vec_concat:V32QI
+ (match_operand:V16QI 1 "register_operand" "f")
+ (match_operand:V16QI 2 "register_operand" "f"))
+ (parallel [(const_int 24) (const_int 8)
+ (const_int 25) (const_int 9)
+ (const_int 26) (const_int 10)
+ (const_int 27) (const_int 11)
+ (const_int 28) (const_int 12)
+ (const_int 29) (const_int 13)
+ (const_int 30) (const_int 14)
+ (const_int 31) (const_int 15)])))]
+ "ISA_HAS_MSA"
+ "ilvl.b\t%w0,%w1,%w2"
+ [(set_attr "alu_type" "add")
+ (set_attr "mode" "TI")
+ (set_attr "msa_execunit" "msa_eu_logic")])
+
+(define_insn "msa_ilvl_h"
+ [(set (match_operand:V8HI 0 "register_operand" "=f")
+ (vec_select:V8HI (vec_concat:V16HI
+ (match_operand:V8HI 1 "register_operand" "f")
+ (match_operand:V8HI 2 "register_operand" "f"))
+ (parallel [(const_int 12) (const_int 4)
+ (const_int 13) (const_int 5)
+ (const_int 14) (const_int 6)
+ (const_int 15) (const_int 7)])))]
+ "ISA_HAS_MSA"
+ "ilvl.h\t%w0,%w1,%w2"
+ [(set_attr "alu_type" "add")
+ (set_attr "mode" "TI")
+ (set_attr "msa_execunit" "msa_eu_logic")])
+
+(define_insn "msa_ilvl_w"
+ [(set (match_operand:V4SI 0 "register_operand" "=f")
+ (vec_select:V4SI (vec_concat:V8SI
+ (match_operand:V4SI 1 "register_operand" "f")
+ (match_operand:V4SI 2 "register_operand" "f"))
+ (parallel [(const_int 6) (const_int 2)
+ (const_int 7) (const_int 3)])))]
"ISA_HAS_MSA"
- "ilvl.<msafmt>\t%w0,%w1,%w2"
+ "ilvl.w\t%w0,%w1,%w2"
[(set_attr "alu_type" "add")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_logic")])
-(define_insn "msa_ilvod_<msafmt>"
- [(set (match_operand:IMSA 0 "register_operand" "=f")
- (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
- (match_operand:IMSA 2 "register_operand" "f")]
- UNSPEC_MSA_ILVOD))]
+(define_insn "msa_ilvl_d"
+ [(set (match_operand:V2DI 0 "register_operand" "=f")
+ (vec_select:V2DI (vec_concat:V4DI
+ (match_operand:V2DI 1 "register_operand" "f")
+ (match_operand:V2DI 2 "register_operand" "f"))
+ (parallel [(const_int 3) (const_int 1)])))]
"ISA_HAS_MSA"
- "ilvod.<msafmt>\t%w0,%w1,%w2"
+ "ilvl.d\t%w0,%w1,%w2"
[(set_attr "alu_type" "add")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_logic")])
-(define_insn "msa_ilvr_<msafmt>"
- [(set (match_operand:IMSA 0 "register_operand" "=f")
- (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
- (match_operand:IMSA 2 "register_operand" "f")]
- UNSPEC_MSA_ILVR))]
+(define_insn "msa_ilvod_b"
+ [(set (match_operand:V16QI 0 "register_operand" "=f")
+ (vec_select:V16QI (vec_concat:V32QI
+ (match_operand:V16QI 1 "register_operand" "f")
+ (match_operand:V16QI 2 "register_operand" "f"))
+ (parallel [(const_int 17) (const_int 1)
+ (const_int 19) (const_int 3)
+ (const_int 21) (const_int 5)
+ (const_int 23) (const_int 7)
+ (const_int 25) (const_int 9)
+ (const_int 27) (const_int 11)
+ (const_int 29) (const_int 13)
+ (const_int 31) (const_int 15)])))]
+ "ISA_HAS_MSA"
+ "ilvod.b\t%w0,%w1,%w2"
+ [(set_attr "alu_type" "add")
+ (set_attr "mode" "TI")
+ (set_attr "msa_execunit" "msa_eu_logic")])
+
+(define_insn "msa_ilvod_h"
+ [(set (match_operand:V8HI 0 "register_operand" "=f")
+ (vec_select:V8HI (vec_concat:V16HI
+ (match_operand:V8HI 1 "register_operand" "f")
+ (match_operand:V8HI 2 "register_operand" "f"))
+ (parallel [(const_int 9) (const_int 1)
+ (const_int 11) (const_int 3)
+ (const_int 13) (const_int 5)
+ (const_int 15) (const_int 7)])))]
+ "ISA_HAS_MSA"
+ "ilvod.h\t%w0,%w1,%w2"
+ [(set_attr "alu_type" "add")
+ (set_attr "mode" "TI")
+ (set_attr "msa_execunit" "msa_eu_logic")])
+
+(define_insn "msa_ilvod_w"
+ [(set (match_operand:V4SI 0 "register_operand" "=f")
+ (vec_select:V4SI (vec_concat:V8SI
+ (match_operand:V4SI 1 "register_operand" "f")
+ (match_operand:V4SI 2 "register_operand" "f"))
+ (parallel [(const_int 5) (const_int 1)
+ (const_int 7) (const_int 3)])))]
+ "ISA_HAS_MSA"
+ "ilvod.w\t%w0,%w1,%w2"
+ [(set_attr "alu_type" "add")
+ (set_attr "mode" "TI")
+ (set_attr "msa_execunit" "msa_eu_logic")])
+
+(define_insn "msa_ilvr_b"
+ [(set (match_operand:V16QI 0 "register_operand" "=f")
+ (vec_select:V16QI (vec_concat:V32QI
+ (match_operand:V16QI 1 "register_operand" "f")
+ (match_operand:V16QI 2 "register_operand" "f"))
+ (parallel [(const_int 16) (const_int 0)
+ (const_int 17) (const_int 1)
+ (const_int 18) (const_int 2)
+ (const_int 19) (const_int 3)
+ (const_int 20) (const_int 4)
+ (const_int 21) (const_int 5)
+ (const_int 22) (const_int 6)
+ (const_int 23) (const_int 7)])))]
+ "ISA_HAS_MSA"
+ "ilvr.b\t%w0,%w1,%w2"
+ [(set_attr "alu_type" "add")
+ (set_attr "mode" "TI")
+ (set_attr "msa_execunit" "msa_eu_logic")])
+
+(define_insn "msa_ilvr_h"
+ [(set (match_operand:V8HI 0 "register_operand" "=f")
+ (vec_select:V8HI (vec_concat:V16HI
+ (match_operand:V8HI 1 "register_operand" "f")
+ (match_operand:V8HI 2 "register_operand" "f"))
+ (parallel [(const_int 8) (const_int 0)
+ (const_int 9) (const_int 1)
+ (const_int 10) (const_int 2)
+ (const_int 11) (const_int 3)])))]
+ "ISA_HAS_MSA"
+ "ilvr.h\t%w0,%w1,%w2"
+ [(set_attr "alu_type" "add")
+ (set_attr "mode" "TI")
+ (set_attr "msa_execunit" "msa_eu_logic")])
+
+(define_insn "msa_ilvr_w"
+ [(set (match_operand:V4SI 0 "register_operand" "=f")
+ (vec_select:V4SI (vec_concat:V8SI
+ (match_operand:V4SI 1 "register_operand" "f")
+ (match_operand:V4SI 2 "register_operand" "f"))
+ (parallel [(const_int 4) (const_int 0)
+ (const_int 5) (const_int 1)])))]
"ISA_HAS_MSA"
- "ilvr.<msafmt>\t%w0,%w1,%w2"
+ "ilvr.w\t%w0,%w1,%w2"
+ [(set_attr "alu_type" "add")
+ (set_attr "mode" "TI")
+ (set_attr "msa_execunit" "msa_eu_logic")])
+
+(define_insn "msa_ilvr_d"
+ [(set (match_operand:V2DI 0 "register_operand" "=f")
+ (vec_select:V2DI (vec_concat:V4DI
+ (match_operand:V2DI 1 "register_operand" "f")
+ (match_operand:V2DI 2 "register_operand" "f"))
+ (parallel [(const_int 2) (const_int 0)])))]
+ "ISA_HAS_MSA"
+ "ilvr.d\t%w0,%w1,%w2"
[(set_attr "alu_type" "add")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_logic")])
@@ -2211,22 +2531,20 @@
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_int_add")])
-(define_insn "msa_max_s_<msafmt>"
+(define_insn "smax<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f")
- (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
- (match_operand:IMSA 2 "register_operand" "f")]
- UNSPEC_MSA_MAX_S))]
+ (smax:IMSA (match_operand:IMSA 1 "register_operand" "f")
+ (match_operand:IMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"max_s.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_int_add")])
-(define_insn "msa_max_u_<msafmt>"
+(define_insn "umax<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f")
- (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
- (match_operand:IMSA 2 "register_operand" "f")]
- UNSPEC_MSA_MAX_U))]
+ (umax:IMSA (match_operand:IMSA 1 "register_operand" "f")
+ (match_operand:IMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"max_u.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "arith")
@@ -2266,22 +2584,20 @@
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_int_add")])
-(define_insn "msa_min_s_<msafmt>"
+(define_insn "smin<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f")
- (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
- (match_operand:IMSA 2 "register_operand" "f")]
- UNSPEC_MSA_MIN_S))]
+ (smin:IMSA (match_operand:IMSA 1 "register_operand" "f")
+ (match_operand:IMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"min_s.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_int_add")])
-(define_insn "msa_min_u_<msafmt>"
+(define_insn "umin<mode>3"
[(set (match_operand:IMSA 0 "register_operand" "=f")
- (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")
- (match_operand:IMSA 2 "register_operand" "f")]
- UNSPEC_MSA_MIN_U))]
+ (umin:IMSA (match_operand:IMSA 1 "register_operand" "f")
+ (match_operand:IMSA 2 "register_operand" "f")))]
"ISA_HAS_MSA"
"min_u.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "arith")
@@ -2364,7 +2680,10 @@
"nloc.<msafmt>\t%w0,%w1"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "clz<mode>2"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -2373,7 +2692,10 @@
"nlzc.<msafmt>\t%w0,%w1"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_nor_v_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -2435,7 +2757,10 @@
"pcnt.<msafmt>\t%w0,%w1"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic3")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_sat_s_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -2468,7 +2793,11 @@
"shf.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set_attr "datafmt" "<msafmt>")
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_shf_w_f"
[(set (match_operand:V4SF 0 "register_operand" "=f")
@@ -2479,7 +2808,10 @@
"shf.w\t%w0,%w1,%2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_slli_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -2490,7 +2822,10 @@
"slli.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_srai_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -2501,7 +2836,10 @@
"srai.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_srar_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -2512,7 +2850,10 @@
"srar.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_srari_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -2523,7 +2864,10 @@
"srari.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_srli_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -2534,7 +2878,10 @@
"srli.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_srlr_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -2545,7 +2892,10 @@
"srlr.<msafmt>\t%w0,%w1,%w2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_srlri_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -2556,7 +2906,10 @@
"srlri.<msafmt>\t%w0,%w1,%2"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic2")
+ (const_string "msa_eu_logic")))])
(define_insn "msa_subs_s_<msafmt>"
[(set (match_operand:IMSA 0 "register_operand" "=f")
@@ -2634,7 +2987,10 @@
"sld.<msafmt>\t%w0,%w2[%z3]"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic_l")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic_l2")
+ (const_string "msa_eu_logic_l")))])
(define_insn "msa_sldi_<msafmt_f>"
[(set (match_operand:MSA 0 "register_operand" "=f")
@@ -2646,7 +3002,10 @@
"sldi.<msafmt>\t%w0,%w2[%3]"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
- (set_attr "msa_execunit" "msa_eu_logic_l")])
+ (set (attr "msa_execunit")
+ (if_then_else (eq_attr "cpu" "i6400")
+ (const_string "msa_eu_logic_l2")
+ (const_string "msa_eu_logic_l")))])
(define_insn "msa_splat_<msafmt_f>"
[(set (match_operand:MSA 0 "register_operand" "=f")
@@ -2673,9 +3032,9 @@
;; operand 1 is a scalar
(define_insn "msa_splati_<msafmt_f>_s"
[(set (match_operand:FMSA 0 "register_operand" "=f")
- (unspec:<MODE> [(match_operand:<UNITMODE> 1 "register_operand" "f")
- (match_operand 2 "const_<indeximm>_operand" "")]
- UNSPEC_MSA_SPLATI))]
+ (unspec:FMSA [(match_operand:<UNITMODE> 1 "register_operand" "f")
+ (match_operand 2 "const_<indeximm>_operand" "")]
+ UNSPEC_MSA_SPLATI))]
"ISA_HAS_MSA"
"splati.<msafmt>\t%w0,%w1[%2]"
[(set_attr "type" "arith")
@@ -2715,11 +3074,11 @@
(define_insn "msa_fexdo_w"
[(set (match_operand:V4SF 0 "register_operand" "=f")
- (unspec:V4SF [(match_operand:V2DF 1 "register_operand" "f")
- (match_operand:V2DF 2 "register_operand" "f")]
- UNSPEC_MSA_FEXDO))]
+ (vec_concat:V4SF
+ (float_truncate:V2SF (match_operand:V2DF 1 "register_operand" "f"))
+ (float_truncate:V2SF (match_operand:V2DF 2 "register_operand" "f"))))]
"ISA_HAS_MSA"
- "fexdo.w\t%w0,%w1,%w2"
+ "fexdo.w\t%w0,%w2,%w1"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_float4")])
@@ -2746,8 +3105,8 @@
(define_insn "msa_fexupr_w"
[(set (match_operand:V4SF 0 "register_operand" "=f")
- (unspec:V4SF [(match_operand:V8HI 1 "register_operand" "f")]
- UNSPEC_MSA_FEXUPR))]
+ (unspec:V4SF [(match_operand:V8HI 1 "register_operand" "f")]
+ UNSPEC_MSA_FEXUPR))]
"ISA_HAS_MSA"
"fexupr.w\t%w0,%w1"
[(set_attr "type" "arith")
@@ -2756,15 +3115,15 @@
(define_insn "msa_fexupr_d"
[(set (match_operand:V2DF 0 "register_operand" "=f")
- (unspec:V2DF [(match_operand:V4SF 1 "register_operand" "f")]
- UNSPEC_MSA_FEXUPR))]
+ (unspec:V2DF [(match_operand:V4SF 1 "register_operand" "f")]
+ UNSPEC_MSA_FEXUPR))]
"ISA_HAS_MSA"
"fexupr.d\t%w0,%w1"
[(set_attr "type" "arith")
(set_attr "mode" "TI")
(set_attr "msa_execunit" "msa_eu_float4")])
-(define_insn "msa_branch_nz_v_<msafmt_f>"
+(define_insn "msa_branch_nz_v_<msafmt_f>"
[(set (pc) (if_then_else
(ne (unspec:SI [(match_operand:MSA 1 "register_operand" "f")]
UNSPEC_MSA_BNZ_V)
@@ -2830,7 +3189,7 @@
return mips_output_conditional_branch (insn, operands,
MIPS_BRANCH ("bnz.<msafmt>", "%w1,%0"),
MIPS_BRANCH ("bz.<msafmt>", "%w1,%0"));
-
+
}
[(set_attr "type" "branch")