;; Arm M-profile Vector Extension Machine Description
;; Copyright (C) 2019-2024 Free Software Foundation, Inc.
;;
;; This file is part of GCC.
;;
;; GCC is free software; you can redistribute it and/or modify it
;; under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;;
;; GCC is distributed in the hope that it will be useful, but
;; WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with GCC; see the file COPYING3. If not see
;; .
(define_insn "mve_mov"
[(set (match_operand:MVE_types 0 "nonimmediate_operand" "=w,w,r,w , w, r,Ux,w")
(match_operand:MVE_types 1 "general_operand" " w,r,w,DnDm,UxUi,r,w, Ul"))]
"TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
{
switch (which_alternative)
{
case 0: /* [w,w]. */
return "vmov\t%q0, %q1";
case 1: /* [w,r]. */
return "vmov\t%e0, %Q1, %R1 %@ \;vmov\t%f0, %J1, %K1";
case 2: /* [r,w]. */
return "vmov\t%Q0, %R0, %e1 %@ \;vmov\t%J0, %K0, %f1";
case 3: /* [w,DnDm]. */
{
int width, is_valid;
is_valid = simd_immediate_valid_for_move (operands[1], mode,
&operands[1], &width);
gcc_assert (is_valid);
if (width == 0)
return "vmov.f32\t%q0, %1 %@ ";
else
{
const int templ_size = 40;
static char templ[templ_size];
if (snprintf (templ, templ_size,
"vmov.i%d\t%%q0, %%x1 %%@ ", width)
> templ_size)
abort ();
return templ;
}
}
case 4: /* [w,UxUi]. */
if (mode == V2DFmode || mode == V2DImode
|| mode == TImode)
return "vldrw.u32\t%q0, %E1";
else
return "vldr.\t%q0, %E1";
case 5: /* [r,r]. */
return output_move_quad (operands);
case 6: /* [Ux,w]. */
if (mode == V2DFmode || mode == V2DImode
|| mode == TImode)
return "vstrw.32\t%q1, %E0";
else
return "vstr.\t%q1, %E0";
case 7: /* [w,Ul]. */
return output_move_neon (operands);
default:
gcc_unreachable ();
return "";
}
}
[(set_attr_alternative "mve_unpredicated_insn" [(symbol_ref "CODE_FOR_mve_mov")
(symbol_ref "CODE_FOR_nothing")
(symbol_ref "CODE_FOR_nothing")
(symbol_ref "CODE_FOR_mve_mov")
(symbol_ref "CODE_FOR_mve_mov")
(symbol_ref "CODE_FOR_nothing")
(symbol_ref "CODE_FOR_mve_mov")
(symbol_ref "CODE_FOR_nothing")])
(set_attr "type" "mve_move,mve_move,mve_move,mve_move,mve_load,multiple,mve_store,mve_load")
(set_attr "length" "4,8,8,4,4,8,4,8")
(set_attr "thumb2_pool_range" "*,*,*,*,1018,*,*,*")
(set_attr "neg_pool_range" "*,*,*,*,996,*,*,*")])
(define_insn "mve_vdup"
[(set (match_operand:MVE_vecs 0 "s_register_operand" "=w")
(vec_duplicate:MVE_vecs
(match_operand: 1 "s_register_operand" "r")))]
"TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
"vdup.\t%q0, %1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vdup"))
(set_attr "length" "4")
(set_attr "type" "mve_move")])
;;
;; [vst4q])
;;
(define_insn "mve_vst4q"
[(set (match_operand:XI 0 "mve_struct_operand" "=Ug")
(unspec:XI [(match_operand:XI 1 "s_register_operand" "w")
(unspec:MVE_VLD_ST [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
VST4Q))
]
"TARGET_HAVE_MVE"
{
rtx ops[6];
int regno = REGNO (operands[1]);
ops[0] = gen_rtx_REG (TImode, regno);
ops[1] = gen_rtx_REG (TImode, regno+4);
ops[2] = gen_rtx_REG (TImode, regno+8);
ops[3] = gen_rtx_REG (TImode, regno+12);
rtx reg = operands[0];
while (reg && !REG_P (reg))
reg = XEXP (reg, 0);
gcc_assert (REG_P (reg));
ops[4] = reg;
ops[5] = operands[0];
/* Here in first three instructions data is stored to ops[4]'s location but
in the fourth instruction data is stored to operands[0], this is to
support the writeback. */
output_asm_insn ("vst40.\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
"vst41.\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
"vst42.\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
"vst43.\t{%q0, %q1, %q2, %q3}, %5", ops);
return "";
}
[(set_attr "length" "16")])
;;
;; [vrndaq_f]
;; [vrndmq_f]
;; [vrndnq_f]
;; [vrndpq_f]
;; [vrndq_f]
;; [vrndxq_f]
;;
(define_insn "@mve_q_f"
[
(set (match_operand:MVE_0 0 "s_register_operand" "=w")
(unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")]
MVE_FP_UNARY))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
".f%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_f"))
(set_attr "type" "mve_move")
])
;;
;; [vrev64q_f])
;;
(define_insn "@mve_q_f"
[
(set (match_operand:MVE_0 0 "s_register_operand" "=&w")
(unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")]
MVE_FP_VREV64Q_ONLY))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
".%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_f"))
(set_attr "type" "mve_move")
])
;;
;; [vabsq_f]
;; [vnegq_f]
;;
(define_insn "mve_vq_f"
[
(set (match_operand:MVE_0 0 "s_register_operand" "=w")
(ABSNEG:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"v.f%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vq_f"))
(set_attr "type" "mve_move")
])
;;
;; [vdupq_n_f])
;;
(define_insn "@mve_q_n_f"
[
(set (match_operand:MVE_0 0 "s_register_operand" "=w")
(unspec:MVE_0 [(match_operand: 1 "s_register_operand" "r")]
MVE_FP_N_VDUPQ_ONLY))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
".%#\t%q0, %1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_n_f"))
(set_attr "type" "mve_move")
])
;;
;; [vrev32q_f])
;;
(define_insn "@mve_q_f"
[
(set (match_operand:MVE_V8HF 0 "s_register_operand" "=w")
(unspec:MVE_V8HF [(match_operand:MVE_V8HF 1 "s_register_operand" "w")]
MVE_FP_VREV32Q_ONLY))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
".\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_f"))
(set_attr "type" "mve_move")
])
;;
;; [vcvttq_f32_f16])
;;
(define_insn "mve_vcvttq_f32_f16v4sf"
[
(set (match_operand:V4SF 0 "s_register_operand" "=w")
(unspec:V4SF [(match_operand:V8HF 1 "s_register_operand" "w")]
VCVTTQ_F32_F16))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvtt.f32.f16\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvttq_f32_f16v4sf"))
(set_attr "type" "mve_move")
])
;;
;; [vcvtbq_f32_f16])
;;
(define_insn "mve_vcvtbq_f32_f16v4sf"
[
(set (match_operand:V4SF 0 "s_register_operand" "=w")
(unspec:V4SF [(match_operand:V8HF 1 "s_register_operand" "w")]
VCVTBQ_F32_F16))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvtb.f32.f16\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtbq_f32_f16v4sf"))
(set_attr "type" "mve_move")
])
;;
;; [vcvtq_to_f_s, vcvtq_to_f_u])
;;
(define_insn "mve_vcvtq_to_f_"
[
(set (match_operand:MVE_0 0 "s_register_operand" "=w")
(unspec:MVE_0 [(match_operand: 1 "s_register_operand" "w")]
VCVTQ_TO_F))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvt.f%#.%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtq_to_f_"))
(set_attr "type" "mve_move")
])
;;
;; [vrev64q_u, vrev64q_s])
;;
(define_insn "@mve_q_"
[
(set (match_operand:MVE_2 0 "s_register_operand" "=&w")
(unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")]
VREV64Q))
]
"TARGET_HAVE_MVE"
".%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_"))
(set_attr "type" "mve_move")
])
;;
;; [vcvtq_from_f_s, vcvtq_from_f_u])
;;
(define_insn "mve_vcvtq_from_f_"
[
(set (match_operand:MVE_5 0 "s_register_operand" "=w")
(unspec:MVE_5 [(match_operand: 1 "s_register_operand" "w")]
VCVTQ_FROM_F))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvt.%#.f%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtq_from_f_"))
(set_attr "type" "mve_move")
])
;;
;; [vabsq_s]
;; [vnegq_s]
;;
(define_insn "mve_vq_s"
[
(set (match_operand:MVE_2 0 "s_register_operand" "=w")
(ABSNEG:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")))
]
"TARGET_HAVE_MVE"
"v.s%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vq_s"))
(set_attr "type" "mve_move")
])
;;
;; [vmvnq_u, vmvnq_s])
;;
(define_insn "mve_vmvnq_u"
[
(set (match_operand:MVE_2 0 "s_register_operand" "=w")
(not:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")))
]
"TARGET_HAVE_MVE"
"vmvn\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmvnq_u"))
(set_attr "type" "mve_move")
])
(define_expand "mve_vmvnq_s"
[
(set (match_operand:MVE_2 0 "s_register_operand")
(not:MVE_2 (match_operand:MVE_2 1 "s_register_operand")))
]
"TARGET_HAVE_MVE"
)
;;
;; [vdupq_n_u, vdupq_n_s])
;;
(define_insn "@mve_q_n_"
[
(set (match_operand:MVE_2 0 "s_register_operand" "=w")
(unspec:MVE_2 [(match_operand: 1 "s_register_operand" "r")]
VDUPQ_N))
]
"TARGET_HAVE_MVE"
".%#\t%q0, %1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_n_"))
(set_attr "type" "mve_move")
])
;;
;; [vclzq_u, vclzq_s])
;;
(define_insn "@mve_vclzq_s"
[
(set (match_operand:MVE_2 0 "s_register_operand" "=w")
(clz:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")))
]
"TARGET_HAVE_MVE"
"vclz.i%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vclzq_s"))
(set_attr "type" "mve_move")
])
(define_expand "mve_vclzq_u"
[
(set (match_operand:MVE_2 0 "s_register_operand")
(clz:MVE_2 (match_operand:MVE_2 1 "s_register_operand")))
]
"TARGET_HAVE_MVE"
)
;;
;; [vclsq_s]
;; [vqabsq_s]
;; [vqnegq_s]
;;
(define_insn "@mve_q_"
[
(set (match_operand:MVE_2 0 "s_register_operand" "=w")
(unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")]
MVE_INT_UNARY))
]
"TARGET_HAVE_MVE"
".%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_"))
(set_attr "type" "mve_move")
])
;;
;; [vaddvq_s, vaddvq_u])
;;
(define_insn "@mve_q_"
[
(set (match_operand:SI 0 "s_register_operand" "=Te")
(unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")]
VADDVQ))
]
"TARGET_HAVE_MVE"
".%#\t%0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_"))
(set_attr "mve_safe_imp_xlane_pred" "yes")
(set_attr "type" "mve_move")
])
;;
;; [vrev32q_u, vrev32q_s])
;;
(define_insn "@mve_q_"
[
(set (match_operand:MVE_3 0 "s_register_operand" "=w")
(unspec:MVE_3 [(match_operand:MVE_3 1 "s_register_operand" "w")]
VREV32Q))
]
"TARGET_HAVE_MVE"
".%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_"))
(set_attr "type" "mve_move")
])
;;
;; [vmovlbq_s, vmovlbq_u]
;; [vmovltq_u, vmovltq_s]
;;
(define_insn "@mve_q_"
[
(set (match_operand: 0 "s_register_operand" "=w")
(unspec: [(match_operand:MVE_3 1 "s_register_operand" "w")]
VMOVLxQ))
]
"TARGET_HAVE_MVE"
".%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_"))
(set_attr "type" "mve_move")
])
;;
;; [vcvtpq_s, vcvtpq_u])
;;
(define_insn "mve_vcvtpq_"
[
(set (match_operand:MVE_5 0 "s_register_operand" "=w")
(unspec:MVE_5 [(match_operand: 1 "s_register_operand" "w")]
VCVTPQ))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvtp.%#.f%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtpq_"))
(set_attr "type" "mve_move")
])
;;
;; [vcvtnq_s, vcvtnq_u])
;;
(define_insn "mve_vcvtnq_"
[
(set (match_operand:MVE_5 0 "s_register_operand" "=w")
(unspec:MVE_5 [(match_operand: 1 "s_register_operand" "w")]
VCVTNQ))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvtn.%#.f%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtnq_"))
(set_attr "type" "mve_move")
])
;;
;; [vcvtmq_s, vcvtmq_u])
;;
(define_insn "mve_vcvtmq_"
[
(set (match_operand:MVE_5 0 "s_register_operand" "=w")
(unspec:MVE_5 [(match_operand: 1 "s_register_operand" "w")]
VCVTMQ))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvtm.%#.f%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtmq_"))
(set_attr "type" "mve_move")
])
;;
;; [vcvtaq_u, vcvtaq_s])
;;
(define_insn "mve_vcvtaq_"
[
(set (match_operand:MVE_5 0 "s_register_operand" "=w")
(unspec:MVE_5 [(match_operand: 1 "s_register_operand" "w")]
VCVTAQ))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvta.%#.f%#\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtaq_"))
(set_attr "type" "mve_move")
])
;;
;; [vmvnq_n_u, vmvnq_n_s])
;;
(define_insn "@mve_q_n_"
[
(set (match_operand:MVE_5 0 "s_register_operand" "=w")
(unspec:MVE_5 [(match_operand: 1 "immediate_operand" "i")]
VMVNQ_N))
]
"TARGET_HAVE_MVE"
".i%#\t%q0, %1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_n_"))
(set_attr "type" "mve_move")
])
;;
;; [vrev16q_u, vrev16q_s])
;;
(define_insn "@mve_q_"
[
(set (match_operand:MVE_V16QI 0 "s_register_operand" "=w")
(unspec:MVE_V16QI [(match_operand:MVE_V16QI 1 "s_register_operand" "w")]
VREV16Q))
]
"TARGET_HAVE_MVE"
".\t%q0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_"))
(set_attr "type" "mve_move")
])
;;
;; [vaddlvq_s vaddlvq_u])
;;
(define_insn "@mve_q_v4si"
[
(set (match_operand:DI 0 "s_register_operand" "=r")
(unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")]
VADDLVQ))
]
"TARGET_HAVE_MVE"
".32\t%Q0, %R0, %q1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_v4si"))
(set_attr "mve_safe_imp_xlane_pred" "yes")
(set_attr "type" "mve_move")
])
;;
;; [vctp8q vctp16q vctp32q vctp64q])
;;
(define_insn "mve_vctpq"
[
(set (match_operand:MVE_7 0 "vpr_register_operand" "=Up")
(unspec:MVE_7 [(match_operand:SI 1 "s_register_operand" "r")]
VCTP))
]
"TARGET_HAVE_MVE"
"vctp.\t%1"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vctpq"))
(set_attr "type" "mve_move")
])
;;
;; [vpnot])
;;
(define_insn "mve_vpnotv16bi"
[
(set (match_operand:V16BI 0 "vpr_register_operand" "=Up")
(unspec:V16BI [(match_operand:V16BI 1 "vpr_register_operand" "0")]
VPNOT))
]
"TARGET_HAVE_MVE"
"vpnot"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vpnotv16bi"))
(set_attr "type" "mve_move")
])
;;
;; [vbrsrq_n_f])
;;
(define_insn "@mve_q_n_f"
[
(set (match_operand:MVE_0 0 "s_register_operand" "=w")
(unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
(match_operand:SI 2 "s_register_operand" "r")]
MVE_VBRSR_N_FP))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
".\t%q0, %q1, %2"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_n_f"))
(set_attr "type" "mve_move")
])
;;
;; [vcvtq_n_to_f_s, vcvtq_n_to_f_u])
;;
(define_insn "mve_vcvtq_n_to_f_"
[
(set (match_operand:MVE_0 0 "s_register_operand" "=w")
(unspec:MVE_0 [(match_operand: 1 "s_register_operand" "w")
(match_operand:SI 2 "" "")]
VCVTQ_N_TO_F))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvt.f.\t%q0, %q1, %2"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtq_n_to_f_"))
(set_attr "type" "mve_move")
])
;; [vcreateq_f])
;;
(define_insn "@mve_q_f"
[
(set (match_operand:MVE_0 0 "s_register_operand" "=w")
(unspec:MVE_0 [(match_operand:DI 1 "s_register_operand" "r")
(match_operand:DI 2 "s_register_operand" "r")]
MVE_FP_CREATE_ONLY))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vmov %q0[2], %q0[0], %Q1, %Q2\;vmov %q0[3], %q0[1], %R1, %R2"
[(set_attr "type" "mve_move")
(set_attr "length""8")])
;;
;; [vcreateq_u, vcreateq_s])
;;
(define_insn "@mve_q_"
[
(set (match_operand:MVE_1 0 "s_register_operand" "=w")
(unspec:MVE_1 [(match_operand:DI 1 "s_register_operand" "r")
(match_operand:DI 2 "s_register_operand" "r")]
VCREATEQ))
]
"TARGET_HAVE_MVE"
"vmov %q0[2], %q0[0], %Q1, %Q2\;vmov %q0[3], %q0[1], %R1, %R2"
[(set_attr "type" "mve_move")
(set_attr "length""8")])
;;
;; [vrshrq_n_s, vrshrq_n_u]
;; [vshrq_n_s, vshrq_n_u]
;;
;; Version that takes an immediate as operand 2.
(define_insn "@mve_q_n_"
[
(set (match_operand:MVE_2 0 "s_register_operand" "=w")
(unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
(match_operand:SI 2 "" "")]
MVE_VSHRQ_N))
]
"TARGET_HAVE_MVE"
".\t%q0, %q1, %2"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_n_"))
(set_attr "type" "mve_move")
])
;; Versions that take constant vectors as operand 2 (with all elements
;; equal).
(define_insn "mve_vshrq_n_s_imm"
[
(set (match_operand:MVE_2 0 "s_register_operand" "=w")
(ashiftrt:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
(match_operand:MVE_2 2 "imm_for_neon_rshift_operand" "i")))
]
"TARGET_HAVE_MVE"
{
return neon_output_shift_immediate ("vshr", 's', &operands[2],
mode,
VALID_NEON_QREG_MODE (mode),
true);
}
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vshrq_n_s_imm"))
(set_attr "type" "mve_move")
])
(define_insn "mve_vshrq_n_u_imm"
[
(set (match_operand:MVE_2 0 "s_register_operand" "=w")
(lshiftrt:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
(match_operand:MVE_2 2 "imm_for_neon_rshift_operand" "i")))
]
"TARGET_HAVE_MVE"
{
return neon_output_shift_immediate ("vshr", 'u', &operands[2],
mode,
VALID_NEON_QREG_MODE (mode),
true);
}
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vshrq_n_u_imm"))
(set_attr "type" "mve_move")
])
;;
;; [vcvtq_n_from_f_s, vcvtq_n_from_f_u])
;;
(define_insn "mve_vcvtq_n_from_f_"
[
(set (match_operand:MVE_5 0 "s_register_operand" "=w")
(unspec:MVE_5 [(match_operand: 1 "s_register_operand" "w")
(match_operand:SI 2 "" "")]
VCVTQ_N_FROM_F))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvt..f\t%q0, %q1, %2"
[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtq_n_from_f_"))
(set_attr "type" "mve_move")
])
;;
;; [vaddlvq_p_s])
;;
(define_insn "@mve_q_p_