default: return output_move_double (operands, true, NULL);
}
}
- [(set_attr "type" "neon_int_1,f_stored,neon_vmov,f_loadd,neon_mrrc,\
- neon_mcr_2_mcrr,mov_reg,load2,store2")
+ [(set_attr "type" "neon_move<q>,neon_store1_1reg,neon_move<q>,\
+ neon_load1_1reg, neon_to_gp<q>,neon_from_gp<q>,mov_reg,\
+ neon_load1_2reg, neon_store1_2reg")
(set_attr "length" "4,4,4,4,4,4,8,8,8")
(set_attr "arm_pool_range" "*,*,*,1020,*,*,*,1020,*")
(set_attr "thumb2_pool_range" "*,*,*,1018,*,*,*,1018,*")
default: return output_move_quad (operands);
}
}
- [(set_attr "type" "neon_int_1,neon_stm_2,neon_vmov,neon_ldm_2,\
- neon_mrrc,neon_mcr_2_mcrr,mov_reg,load4,store4")
+ [(set_attr "type" "neon_move_q,neon_store2_2reg_q,neon_move_q,\
+ neon_load2_2reg_q,neon_to_gp_q,neon_from_gp_q,\
+ mov_reg,neon_load1_4reg,neon_store1_4reg")
(set_attr "length" "4,8,4,8,8,8,16,8,16")
(set_attr "arm_pool_range" "*,*,*,1020,*,*,*,1020,*")
(set_attr "thumb2_pool_range" "*,*,*,1018,*,*,*,1018,*")
default: gcc_unreachable ();
}
}
- [(set_attr "type" "neon_int_1,neon_stm_2,neon_ldm_2")
+ [(set_attr "type" "neon_move_q,neon_store2_2reg_q,neon_load2_2reg_q")
(set (attr "length") (symbol_ref "arm_attr_length_move_neon (insn)"))])
(define_split
UNSPEC_MISALIGNED_ACCESS))]
"TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access"
"vst1.<V_sz_elem>\t{%P1}, %A0"
- [(set_attr "type" "neon_vst1_1_2_regs_vst2_2_regs")])
+ [(set_attr "type" "neon_store1_1reg<q>")])
(define_insn "*movmisalign<mode>_neon_load"
[(set (match_operand:VDX 0 "s_register_operand" "=w")
UNSPEC_MISALIGNED_ACCESS))]
"TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access"
"vld1.<V_sz_elem>\t{%P0}, %A1"
- [(set_attr "type" "neon_vld1_1_2_regs")])
+ [(set_attr "type" "neon_load1_1reg<q>")])
(define_insn "*movmisalign<mode>_neon_store"
[(set (match_operand:VQX 0 "neon_permissive_struct_operand" "=Um")
UNSPEC_MISALIGNED_ACCESS))]
"TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access"
"vst1.<V_sz_elem>\t{%q1}, %A0"
- [(set_attr "type" "neon_vst1_1_2_regs_vst2_2_regs")])
+ [(set_attr "type" "neon_store1_1reg<q>")])
(define_insn "*movmisalign<mode>_neon_load"
[(set (match_operand:VQX 0 "s_register_operand" "=w")
UNSPEC_MISALIGNED_ACCESS))]
"TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access"
"vld1.<V_sz_elem>\t{%q0}, %A1"
- [(set_attr "type" "neon_vld1_1_2_regs")])
+ [(set_attr "type" "neon_store1_1reg<q>")])
(define_insn "vec_set<mode>_internal"
[(set (match_operand:VD 0 "s_register_operand" "=w,w")
else
return "vmov.<V_sz_elem>\t%P0[%c2], %1";
}
- [(set_attr "type" "neon_vld1_vld2_lane,neon_mcr")])
+ [(set_attr "type" "neon_load1_all_lanes<q>,neon_from_gp<q>")])
(define_insn "vec_set<mode>_internal"
[(set (match_operand:VQ 0 "s_register_operand" "=w,w")
else
return "vmov.<V_sz_elem>\t%P0[%c2], %1";
}
- [(set_attr "type" "neon_vld1_vld2_lane,neon_mcr")]
+ [(set_attr "type" "neon_load1_all_lanes<q>,neon_from_gp<q>")]
)
(define_insn "vec_setv2di_internal"
else
return "vmov\t%P0, %Q1, %R1";
}
- [(set_attr "type" "neon_vld1_1_2_regs,neon_mcr_2_mcrr")]
+ [(set_attr "type" "neon_load1_all_lanes_q,neon_from_gp_q")]
)
(define_expand "vec_set<mode>"
else
return "vmov.<V_uf_sclr>\t%0, %P1[%c2]";
}
- [(set_attr "type" "neon_vst1_vst2_lane,neon_bp_simple")]
+ [(set_attr "type" "neon_store1_one_lane<q>,neon_to_gp<q>")]
)
(define_insn "vec_extract<mode>"
else
return "vmov.<V_uf_sclr>\t%0, %P1[%c2]";
}
- [(set_attr "type" "neon_vst1_vst2_lane,neon_bp_simple")]
+ [(set_attr "type" "neon_store1_one_lane<q>,neon_to_gp<q>")]
)
(define_insn "vec_extractv2di"
else
return "vmov\t%Q0, %R0, %P1 @ v2di";
}
- [(set_attr "type" "neon_vst1_vst2_lane,neon_int_1")]
+ [(set_attr "type" "neon_store1_one_lane_q,neon_to_gp_q")]
)
(define_expand "vec_init<mode>"
"vadd.<V_if_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_1")))]
+ (const_string "neon_fp_addsub_s<q>")
+ (const_string "neon_add<q>")))]
)
(define_insn "adddi3_neon"
default: gcc_unreachable ();
}
}
- [(set_attr "type" "neon_int_1,*,*,neon_int_1,*,*,*")
+ [(set_attr "type" "neon_add,multiple,multiple,neon_add,\
+ multiple,multiple,multiple")
(set_attr "conds" "*,clob,clob,*,clob,clob,clob")
(set_attr "length" "*,8,8,*,8,8,8")
(set_attr "arch" "neon_for_64bits,*,*,avoid_neon_for_64bits,*,*,*")]
"vsub.<V_if_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_2")))]
+ (const_string "neon_fp_addsub_s<q>")
+ (const_string "neon_sub<q>")))]
)
(define_insn "subdi3_neon"
default: gcc_unreachable ();
}
}
- [(set_attr "type" "neon_int_2,*,*,*,neon_int_2")
+ [(set_attr "type" "neon_sub,multiple,multiple,multiple,neon_sub")
(set_attr "conds" "*,clob,clob,clob,*")
(set_attr "length" "*,8,8,8,*")
(set_attr "arch" "neon_for_64bits,*,*,*,avoid_neon_for_64bits")]
)
(define_insn "*mul<mode>3_neon"
- [(set (match_operand:VDQ 0 "s_register_operand" "=w")
- (mult:VDQ (match_operand:VDQ 1 "s_register_operand" "w")
- (match_operand:VDQ 2 "s_register_operand" "w")))]
+ [(set (match_operand:VDQW 0 "s_register_operand" "=w")
+ (mult:VDQW (match_operand:VDQW 1 "s_register_operand" "w")
+ (match_operand:VDQW 2 "s_register_operand" "w")))]
"TARGET_NEON && (!<Is_float_mode> || flag_unsafe_math_optimizations)"
"vmul.<V_if_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (if_then_else (match_test "<Is_d_reg>")
- (if_then_else
- (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mul_ddd_8_16_qdd_16_8_long_32_16_long")
- (const_string "neon_mul_qqq_8_16_32_ddd_32"))
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mul_qqq_8_16_32_ddd_32")
- (const_string "neon_mul_qqq_8_16_32_ddd_32")))))]
+ (const_string "neon_fp_mul_s<q>")
+ (const_string "neon_mul_<V_elem_ch><q>")))]
)
(define_insn "mul<mode>3add<mode>_neon"
- [(set (match_operand:VDQ 0 "s_register_operand" "=w")
- (plus:VDQ (mult:VDQ (match_operand:VDQ 2 "s_register_operand" "w")
- (match_operand:VDQ 3 "s_register_operand" "w"))
- (match_operand:VDQ 1 "s_register_operand" "0")))]
+ [(set (match_operand:VDQW 0 "s_register_operand" "=w")
+ (plus:VDQW (mult:VDQW (match_operand:VDQW 2 "s_register_operand" "w")
+ (match_operand:VDQW 3 "s_register_operand" "w"))
+ (match_operand:VDQW 1 "s_register_operand" "0")))]
"TARGET_NEON && (!<Is_float_mode> || flag_unsafe_math_optimizations)"
"vmla.<V_if_elem>\t%<V_reg>0, %<V_reg>2, %<V_reg>3"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vmla_ddd")
- (const_string "neon_fp_vmla_qqq"))
- (if_then_else (match_test "<Is_d_reg>")
- (if_then_else
- (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_8_16_qdd_16_8_long_32_16_long")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long"))
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_qqq_8_16")
- (const_string "neon_mla_qqq_32_qqd_32_scalar")))))]
+ (const_string "neon_fp_mla_s<q>")
+ (const_string "neon_mla_<V_elem_ch><q>")))]
)
(define_insn "mul<mode>3neg<mode>add<mode>_neon"
- [(set (match_operand:VDQ 0 "s_register_operand" "=w")
- (minus:VDQ (match_operand:VDQ 1 "s_register_operand" "0")
- (mult:VDQ (match_operand:VDQ 2 "s_register_operand" "w")
- (match_operand:VDQ 3 "s_register_operand" "w"))))]
+ [(set (match_operand:VDQW 0 "s_register_operand" "=w")
+ (minus:VDQW (match_operand:VDQW 1 "s_register_operand" "0")
+ (mult:VDQW (match_operand:VDQW 2 "s_register_operand" "w")
+ (match_operand:VDQW 3 "s_register_operand" "w"))))]
"TARGET_NEON && (!<Is_float_mode> || flag_unsafe_math_optimizations)"
"vmls.<V_if_elem>\t%<V_reg>0, %<V_reg>2, %<V_reg>3"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vmla_ddd")
- (const_string "neon_fp_vmla_qqq"))
- (if_then_else (match_test "<Is_d_reg>")
- (if_then_else
- (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_8_16_qdd_16_8_long_32_16_long")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long"))
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_qqq_8_16")
- (const_string "neon_mla_qqq_32_qqd_32_scalar")))))]
+ (const_string "neon_fp_mla_s<q>")
+ (const_string "neon_mla_<V_elem_ch><q>")))]
)
;; Fused multiply-accumulate
(match_operand:VCVTF 3 "register_operand" "0")))]
"TARGET_NEON && TARGET_FMA && flag_unsafe_math_optimizations"
"vfma%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vmla_ddd")
- (const_string "neon_fp_vmla_qqq")))]
+ [(set_attr "type" "neon_fp_mla_s<q>")]
)
(define_insn "fma<VCVTF:mode>4_intrinsic"
(match_operand:VCVTF 3 "register_operand" "0")))]
"TARGET_NEON && TARGET_FMA"
"vfma%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vmla_ddd")
- (const_string "neon_fp_vmla_qqq")))]
+ [(set_attr "type" "neon_fp_mla_s<q>")]
)
(define_insn "*fmsub<VCVTF:mode>4"
(match_operand:VCVTF 3 "register_operand" "0")))]
"TARGET_NEON && TARGET_FMA && flag_unsafe_math_optimizations"
"vfms%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vmla_ddd")
- (const_string "neon_fp_vmla_qqq")))]
+ [(set_attr "type" "neon_fp_mla_s<q>")]
)
(define_insn "fmsub<VCVTF:mode>4_intrinsic"
(match_operand:VCVTF 3 "register_operand" "0")))]
"TARGET_NEON && TARGET_FMA"
"vfms%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vmla_ddd")
- (const_string "neon_fp_vmla_qqq")))]
+ [(set_attr "type" "neon_fp_mla_s<q>")]
)
(define_insn "neon_vrint<NEON_VRINT:nvrint_variant><VCVTF:mode>"
NEON_VRINT))]
"TARGET_NEON && TARGET_FPU_ARMV8"
"vrint<nvrint_variant>%?.f32\\t%<V_reg>0, %<V_reg>1"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq")))]
+ [(set_attr "type" "neon_fp_round_<V_elem_ch><q>")]
)
(define_insn "ior<mode>3"
default: gcc_unreachable ();
}
}
- [(set_attr "type" "neon_int_1")]
+ [(set_attr "type" "neon_logic<q>")]
)
;; The concrete forms of the Neon immediate-logic instructions are vbic and
default: gcc_unreachable ();
}
}
- [(set_attr "type" "neon_int_1")]
+ [(set_attr "type" "neon_logic<q>")]
)
(define_insn "orn<mode>3_neon"
(match_operand:VDQ 1 "s_register_operand" "w")))]
"TARGET_NEON"
"vorn\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set_attr "type" "neon_int_1")]
+ [(set_attr "type" "neon_logic<q>")]
)
;; TODO: investigate whether we should disable
DONE;
}
}"
- [(set_attr "type" "neon_int_1,*,*,*")
+ [(set_attr "type" "neon_logic,multiple,multiple,multiple")
(set_attr "length" "*,16,8,8")
(set_attr "arch" "any,a,t2,t2")]
)
(match_operand:VDQ 1 "s_register_operand" "w")))]
"TARGET_NEON"
"vbic\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set_attr "type" "neon_int_1")]
+ [(set_attr "type" "neon_logic<q>")]
)
;; Compare to *anddi_notdi_di.
vbic\t%P0, %P1, %P2
#
#"
- [(set_attr "type" "neon_int_1,*,*")
+ [(set_attr "type" "neon_logic,multiple,multiple")
(set_attr "length" "*,8,8")]
)
(match_operand:VDQ 2 "s_register_operand" "w")))]
"TARGET_NEON"
"veor\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set_attr "type" "neon_int_1")]
+ [(set_attr "type" "neon_logic<q>")]
)
(define_insn "one_cmpl<mode>2"
(not:VDQ (match_operand:VDQ 1 "s_register_operand" "w")))]
"TARGET_NEON"
"vmvn\t%<V_reg>0, %<V_reg>1"
- [(set_attr "type" "neon_int_1")]
+ [(set_attr "type" "neon_move<q>")]
)
(define_insn "abs<mode>2"
"vabs.<V_s_elem>\t%<V_reg>0, %<V_reg>1"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_3")))]
+ (const_string "neon_fp_abs_s<q>")
+ (const_string "neon_abs<q>")))]
)
(define_insn "neg<mode>2"
"vneg.<V_s_elem>\t%<V_reg>0, %<V_reg>1"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_3")))]
+ (const_string "neon_fp_neg_s<q>")
+ (const_string "neon_neg<q>")))]
)
(define_insn "negdi2_neon"
(clobber (reg:CC CC_REGNUM))]
"TARGET_NEON"
"#"
- [(set_attr "length" "8")]
+ [(set_attr "length" "8")
+ (set_attr "type" "multiple")]
)
; Split negdi2_neon for vfp registers
(match_operand:VDQIW 2 "s_register_operand" "w")))]
"TARGET_NEON"
"vmin.<V_u_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set_attr "type" "neon_int_5")]
+ [(set_attr "type" "neon_minmax<q>")]
)
(define_insn "*umax<mode>3_neon"
(match_operand:VDQIW 2 "s_register_operand" "w")))]
"TARGET_NEON"
"vmax.<V_u_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set_attr "type" "neon_int_5")]
+ [(set_attr "type" "neon_minmax<q>")]
)
(define_insn "*smin<mode>3_neon"
"vmin.<V_s_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_minmax_s<q>")
+ (const_string "neon_minmax<q>")))]
)
(define_insn "*smax<mode>3_neon"
"vmax.<V_s_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_minmax_s<q>")
+ (const_string "neon_minmax<q>")))]
)
; TODO: V2DI shifts are current disabled because there are bugs in the
default: gcc_unreachable ();
}
}
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_vshl_ddd")
- (const_string "neon_shift_3")))]
+ [(set_attr "type" "neon_shift_reg<q>, neon_shift_imm<q>")]
)
(define_insn "vashr<mode>3_imm"
<MODE>mode, VALID_NEON_QREG_MODE (<MODE>mode),
false);
}
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_vshl_ddd")
- (const_string "neon_shift_3")))]
+ [(set_attr "type" "neon_shift_imm<q>")]
)
(define_insn "vlshr<mode>3_imm"
<MODE>mode, VALID_NEON_QREG_MODE (<MODE>mode),
false);
}
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_vshl_ddd")
- (const_string "neon_shift_3")))]
+ [(set_attr "type" "neon_shift_imm<q>")]
)
; Used for implementing logical shift-right, which is a left-shift by a negative
UNSPEC_ASHIFT_SIGNED))]
"TARGET_NEON"
"vshl.<V_s_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_vshl_ddd")
- (const_string "neon_shift_3")))]
+ [(set_attr "type" "neon_shift_reg<q>")]
)
; Used for implementing logical shift-right, which is a left-shift by a negative
UNSPEC_ASHIFT_UNSIGNED))]
"TARGET_NEON"
"vshl.<V_u_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_vshl_ddd")
- (const_string "neon_shift_3")))]
+ [(set_attr "type" "neon_shift_reg<q>")]
)
(define_expand "vashr<mode>3"
"@
vld1.32\t{%P0[0]}, %A1
vmov.32\t%P0[0], %1"
- [(set_attr "type" "neon_vld1_vld2_lane,neon_mcr")]
+ [(set_attr "type" "neon_load1_1reg,neon_from_gp")]
)
(define_insn "ashldi3_neon_noclobber"
"@
vshl.u64\t%P0, %P1, %2
vshl.u64\t%P0, %P1, %P2"
- [(set_attr "type" "neon_vshl_ddd,neon_vshl_ddd")]
+ [(set_attr "type" "neon_shift_imm, neon_shift_reg")]
)
(define_insn_and_split "ashldi3_neon"
DONE;
}"
[(set_attr "arch" "neon_for_64bits,neon_for_64bits,*,*,avoid_neon_for_64bits,avoid_neon_for_64bits")
- (set_attr "opt" "*,*,speed,speed,*,*")]
+ (set_attr "opt" "*,*,speed,speed,*,*")
+ (set_attr "type" "multiple")]
)
; The shift amount needs to be negated for right-shifts
UNSPEC_ASHIFT_SIGNED))]
"TARGET_NEON && reload_completed"
"vshl.s64\t%P0, %P1, %P2"
- [(set_attr "type" "neon_vshl_ddd")]
+ [(set_attr "type" "neon_shift_reg")]
)
; The shift amount needs to be negated for right-shifts
UNSPEC_ASHIFT_UNSIGNED))]
"TARGET_NEON && reload_completed"
"vshl.u64\t%P0, %P1, %P2"
- [(set_attr "type" "neon_vshl_ddd")]
+ [(set_attr "type" "neon_shift_reg")]
)
(define_insn "ashrdi3_neon_imm_noclobber"
"TARGET_NEON && reload_completed
&& INTVAL (operands[2]) > 0 && INTVAL (operands[2]) <= 64"
"vshr.s64\t%P0, %P1, %2"
- [(set_attr "type" "neon_vshl_ddd")]
+ [(set_attr "type" "neon_shift_imm")]
)
(define_insn "lshrdi3_neon_imm_noclobber"
"TARGET_NEON && reload_completed
&& INTVAL (operands[2]) > 0 && INTVAL (operands[2]) <= 64"
"vshr.u64\t%P0, %P1, %2"
- [(set_attr "type" "neon_vshl_ddd")]
+ [(set_attr "type" "neon_shift_imm")]
)
;; ashrdi3_neon
DONE;
}"
[(set_attr "arch" "neon_for_64bits,neon_for_64bits,*,*,avoid_neon_for_64bits,avoid_neon_for_64bits")
- (set_attr "opt" "*,*,speed,speed,*,*")]
+ (set_attr "opt" "*,*,speed,speed,*,*")
+ (set_attr "type" "multiple")]
)
;; Widening operations
(match_operand:<V_widen> 2 "s_register_operand" "w")))]
"TARGET_NEON"
"vaddw.<V_s_elem>\t%q0, %q2, %P1"
- [(set_attr "type" "neon_int_3")]
+ [(set_attr "type" "neon_add_widen")]
)
(define_insn "widen_usum<mode>3"
(match_operand:<V_widen> 2 "s_register_operand" "w")))]
"TARGET_NEON"
"vaddw.<V_u_elem>\t%q0, %q2, %P1"
- [(set_attr "type" "neon_int_3")]
+ [(set_attr "type" "neon_add_widen")]
)
;; VEXT can be used to synthesize coarse whole-vector shifts with 8-bit
"TARGET_NEON"
"<VQH_mnem>.<VQH_sign>32\t%P0, %e1, %f1"
[(set_attr "vqh_mnem" "<VQH_mnem>")
- (set (attr "type")
- (if_then_else (eq_attr "vqh_mnem" "vadd")
- (const_string "neon_int_1") (const_string "neon_int_5")))]
+ (set_attr "type" "neon_reduc_<VQH_type>_q")]
)
(define_insn "quad_halves_<code>v4sf"
"TARGET_NEON && flag_unsafe_math_optimizations"
"<VQH_mnem>.f32\t%P0, %e1, %f1"
[(set_attr "vqh_mnem" "<VQH_mnem>")
- (set (attr "type")
- (if_then_else (eq_attr "vqh_mnem" "vadd")
- (const_string "neon_int_1") (const_string "neon_int_5")))]
+ (set_attr "type" "neon_fp_reduc_<VQH_type>_s_q")]
)
(define_insn "quad_halves_<code>v8hi"
"TARGET_NEON"
"<VQH_mnem>.<VQH_sign>16\t%P0, %e1, %f1"
[(set_attr "vqh_mnem" "<VQH_mnem>")
- (set (attr "type")
- (if_then_else (eq_attr "vqh_mnem" "vadd")
- (const_string "neon_int_1") (const_string "neon_int_5")))]
+ (set_attr "type" "neon_reduc_<VQH_type>_q")]
)
(define_insn "quad_halves_<code>v16qi"
"TARGET_NEON"
"<VQH_mnem>.<VQH_sign>8\t%P0, %e1, %f1"
[(set_attr "vqh_mnem" "<VQH_mnem>")
- (set (attr "type")
- (if_then_else (eq_attr "vqh_mnem" "vadd")
- (const_string "neon_int_1") (const_string "neon_int_5")))]
+ (set_attr "type" "neon_reduc_<VQH_type>_q")]
)
(define_expand "move_hi_quad_<mode>"
UNSPEC_VPADD))]
"TARGET_NEON && !BYTES_BIG_ENDIAN"
"vadd.i64\t%e0, %e1, %f1"
- [(set_attr "type" "neon_int_1")]
+ [(set_attr "type" "neon_add_q")]
)
;; NEON does not distinguish between signed and unsigned addition except on
;; Assume this schedules like vadd.
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_1")))]
+ (const_string "neon_fp_reduc_add_s<q>")
+ (const_string "neon_reduc_add<q>")))]
)
(define_insn "neon_vpsmin<mode>"
UNSPEC_VPSMIN))]
"TARGET_NEON"
"vpmin.<V_s_elem>\t%P0, %P1, %P2"
- ;; Assume this schedules like vmin.
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_reduc_minmax_s<q>")
+ (const_string "neon_reduc_minmax<q>")))]
)
(define_insn "neon_vpsmax<mode>"
UNSPEC_VPSMAX))]
"TARGET_NEON"
"vpmax.<V_s_elem>\t%P0, %P1, %P2"
- ;; Assume this schedules like vmax.
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_reduc_minmax_s<q>")
+ (const_string "neon_reduc_minmax<q>")))]
)
(define_insn "neon_vpumin<mode>"
UNSPEC_VPUMIN))]
"TARGET_NEON"
"vpmin.<V_u_elem>\t%P0, %P1, %P2"
- ;; Assume this schedules like umin.
- [(set_attr "type" "neon_int_5")]
+ [(set_attr "type" "neon_reduc_minmax<q>")]
)
(define_insn "neon_vpumax<mode>"
UNSPEC_VPUMAX))]
"TARGET_NEON"
"vpmax.<V_u_elem>\t%P0, %P1, %P2"
- ;; Assume this schedules like umax.
- [(set_attr "type" "neon_int_5")]
+ [(set_attr "type" "neon_reduc_minmax<q>")]
)
;; Saturating arithmetic
(match_operand:VD 2 "s_register_operand" "w")))]
"TARGET_NEON"
"vqadd.<V_s_elem>\t%P0, %P1, %P2"
- [(set_attr "type" "neon_int_4")]
+ [(set_attr "type" "neon_qadd<q>")]
)
(define_insn "*us_add<mode>_neon"
(match_operand:VD 2 "s_register_operand" "w")))]
"TARGET_NEON"
"vqadd.<V_u_elem>\t%P0, %P1, %P2"
- [(set_attr "type" "neon_int_4")]
+ [(set_attr "type" "neon_qadd<q>")]
)
(define_insn "*ss_sub<mode>_neon"
(match_operand:VD 2 "s_register_operand" "w")))]
"TARGET_NEON"
"vqsub.<V_s_elem>\t%P0, %P1, %P2"
- [(set_attr "type" "neon_int_5")]
+ [(set_attr "type" "neon_qsub<q>")]
)
(define_insn "*us_sub<mode>_neon"
(match_operand:VD 2 "s_register_operand" "w")))]
"TARGET_NEON"
"vqsub.<V_u_elem>\t%P0, %P1, %P2"
- [(set_attr "type" "neon_int_5")]
+ [(set_attr "type" "neon_qsub<q>")]
)
;; Conditional instructions. These are comparisons with conditional moves for
"vadd.<V_if_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_1")))]
+ (const_string "neon_fp_addsub_s<q>")
+ (const_string "neon_add<q>")))]
)
; operand 3 represents in bits:
UNSPEC_VADDL))]
"TARGET_NEON"
"vaddl.%T3%#<V_sz_elem>\t%q0, %P1, %P2"
- [(set_attr "type" "neon_int_3")]
+ [(set_attr "type" "neon_add_long")]
)
(define_insn "neon_vaddw<mode>"
UNSPEC_VADDW))]
"TARGET_NEON"
"vaddw.%T3%#<V_sz_elem>\t%q0, %q1, %P2"
- [(set_attr "type" "neon_int_2")]
+ [(set_attr "type" "neon_add_widen")]
)
; vhadd and vrhadd.
UNSPEC_VHADD))]
"TARGET_NEON"
"v%O3hadd.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set_attr "type" "neon_int_4")]
+ [(set_attr "type" "neon_add_halve_q")]
)
(define_insn "neon_vqadd<mode>"
UNSPEC_VQADD))]
"TARGET_NEON"
"vqadd.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set_attr "type" "neon_int_4")]
+ [(set_attr "type" "neon_qadd<q>")]
)
(define_insn "neon_vaddhn<mode>"
UNSPEC_VADDHN))]
"TARGET_NEON"
"v%O3addhn.<V_if_elem>\t%P0, %q1, %q2"
- [(set_attr "type" "neon_int_4")]
+ [(set_attr "type" "neon_add_halve_narrow_q")]
)
;; We cannot replace this unspec with mul<mode>3 because of the odd
"vmul.%F3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (if_then_else (match_test "<Is_d_reg>")
- (if_then_else
- (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mul_ddd_8_16_qdd_16_8_long_32_16_long")
- (const_string "neon_mul_qqq_8_16_32_ddd_32"))
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mul_qqq_8_16_32_ddd_32")
- (const_string "neon_mul_qqq_8_16_32_ddd_32")))))]
+ (const_string "neon_fp_mul_s<q>")
+ (const_string "neon_mul_<V_elem_ch><q>")))]
)
(define_expand "neon_vmla<mode>"
; Used for intrinsics when flag_unsafe_math_optimizations is false.
(define_insn "neon_vmla<mode>_unspec"
- [(set (match_operand:VDQ 0 "s_register_operand" "=w")
- (unspec:VDQ [(match_operand:VDQ 1 "s_register_operand" "0")
- (match_operand:VDQ 2 "s_register_operand" "w")
- (match_operand:VDQ 3 "s_register_operand" "w")]
+ [(set (match_operand:VDQW 0 "s_register_operand" "=w")
+ (unspec:VDQW [(match_operand:VDQW 1 "s_register_operand" "0")
+ (match_operand:VDQW 2 "s_register_operand" "w")
+ (match_operand:VDQW 3 "s_register_operand" "w")]
UNSPEC_VMLA))]
"TARGET_NEON"
"vmla.<V_if_elem>\t%<V_reg>0, %<V_reg>2, %<V_reg>3"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vmla_ddd")
- (const_string "neon_fp_vmla_qqq"))
- (if_then_else (match_test "<Is_d_reg>")
- (if_then_else
- (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_8_16_qdd_16_8_long_32_16_long")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long"))
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_qqq_8_16")
- (const_string "neon_mla_qqq_32_qqd_32_scalar")))))]
+ (const_string "neon_fp_mla_s<q>")
+ (const_string "neon_mla_<V_elem_ch><q>")))]
)
(define_insn "neon_vmlal<mode>"
UNSPEC_VMLAL))]
"TARGET_NEON"
"vmlal.%T4%#<V_sz_elem>\t%q0, %P2, %P3"
- [(set (attr "type")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_8_16_qdd_16_8_long_32_16_long")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long")))]
+ [(set_attr "type" "neon_mla_<V_elem_ch>_long")]
)
(define_expand "neon_vmls<mode>"
; Used for intrinsics when flag_unsafe_math_optimizations is false.
(define_insn "neon_vmls<mode>_unspec"
- [(set (match_operand:VDQ 0 "s_register_operand" "=w")
- (unspec:VDQ [(match_operand:VDQ 1 "s_register_operand" "0")
- (match_operand:VDQ 2 "s_register_operand" "w")
- (match_operand:VDQ 3 "s_register_operand" "w")]
+ [(set (match_operand:VDQW 0 "s_register_operand" "=w")
+ (unspec:VDQW [(match_operand:VDQW 1 "s_register_operand" "0")
+ (match_operand:VDQW 2 "s_register_operand" "w")
+ (match_operand:VDQW 3 "s_register_operand" "w")]
UNSPEC_VMLS))]
"TARGET_NEON"
"vmls.<V_if_elem>\t%<V_reg>0, %<V_reg>2, %<V_reg>3"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vmla_ddd")
- (const_string "neon_fp_vmla_qqq"))
- (if_then_else (match_test "<Is_d_reg>")
- (if_then_else
- (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_8_16_qdd_16_8_long_32_16_long")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long"))
- (if_then_else
- (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_qqq_8_16")
- (const_string "neon_mla_qqq_32_qqd_32_scalar")))))]
+ (const_string "neon_fp_mla_s<q>")
+ (const_string "neon_mla_<V_elem_ch><q>")))]
)
(define_insn "neon_vmlsl<mode>"
UNSPEC_VMLSL))]
"TARGET_NEON"
"vmlsl.%T4%#<V_sz_elem>\t%q0, %P2, %P3"
- [(set (attr "type")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_8_16_qdd_16_8_long_32_16_long")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long")))]
+ [(set_attr "type" "neon_mla_<V_elem_ch>_long")]
)
(define_insn "neon_vqdmulh<mode>"
UNSPEC_VQDMULH))]
"TARGET_NEON"
"vq%O3dmulh.<V_s_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mul_ddd_8_16_qdd_16_8_long_32_16_long")
- (const_string "neon_mul_qqq_8_16_32_ddd_32"))
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mul_qqq_8_16_32_ddd_32")
- (const_string "neon_mul_qqq_8_16_32_ddd_32"))))]
+ [(set_attr "type" "neon_sat_mul_<V_elem_ch><q>")]
)
(define_insn "neon_vqdmlal<mode>"
UNSPEC_VQDMLAL))]
"TARGET_NEON"
"vqdmlal.<V_s_elem>\t%q0, %P2, %P3"
- [(set (attr "type")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_8_16_qdd_16_8_long_32_16_long")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long")))]
+ [(set_attr "type" "neon_sat_mla_<V_elem_ch>_long")]
)
(define_insn "neon_vqdmlsl<mode>"
UNSPEC_VQDMLSL))]
"TARGET_NEON"
"vqdmlsl.<V_s_elem>\t%q0, %P2, %P3"
- [(set (attr "type")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_8_16_qdd_16_8_long_32_16_long")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long")))]
+ [(set_attr "type" "neon_sat_mla_<V_elem_ch>_long")]
)
(define_insn "neon_vmull<mode>"
UNSPEC_VMULL))]
"TARGET_NEON"
"vmull.%T3%#<V_sz_elem>\t%q0, %P1, %P2"
- [(set (attr "type")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mul_ddd_8_16_qdd_16_8_long_32_16_long")
- (const_string "neon_mul_qdd_64_32_long_qqd_16_ddd_32_scalar_64_32_long_scalar")))]
+ [(set_attr "type" "neon_mul_<V_elem_ch>_long")]
)
(define_insn "neon_vqdmull<mode>"
UNSPEC_VQDMULL))]
"TARGET_NEON"
"vqdmull.<V_s_elem>\t%q0, %P1, %P2"
- [(set (attr "type")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mul_ddd_8_16_qdd_16_8_long_32_16_long")
- (const_string "neon_mul_qdd_64_32_long_qqd_16_ddd_32_scalar_64_32_long_scalar")))]
+ [(set_attr "type" "neon_sat_mul_<V_elem_ch>_long")]
)
(define_expand "neon_vsub<mode>"
"vsub.<V_if_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_2")))]
+ (const_string "neon_fp_addsub_s<q>")
+ (const_string "neon_sub<q>")))]
)
(define_insn "neon_vsubl<mode>"
UNSPEC_VSUBL))]
"TARGET_NEON"
"vsubl.%T3%#<V_sz_elem>\t%q0, %P1, %P2"
- [(set_attr "type" "neon_int_2")]
+ [(set_attr "type" "neon_sub_long")]
)
(define_insn "neon_vsubw<mode>"
UNSPEC_VSUBW))]
"TARGET_NEON"
"vsubw.%T3%#<V_sz_elem>\t%q0, %q1, %P2"
- [(set_attr "type" "neon_int_2")]
+ [(set_attr "type" "neon_sub_widen")]
)
(define_insn "neon_vqsub<mode>"
UNSPEC_VQSUB))]
"TARGET_NEON"
"vqsub.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set_attr "type" "neon_int_5")]
+ [(set_attr "type" "neon_qsub<q>")]
)
(define_insn "neon_vhsub<mode>"
UNSPEC_VHSUB))]
"TARGET_NEON"
"vhsub.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set_attr "type" "neon_int_5")]
+ [(set_attr "type" "neon_sub_halve<q>")]
)
(define_insn "neon_vsubhn<mode>"
UNSPEC_VSUBHN))]
"TARGET_NEON"
"v%O3subhn.<V_if_elem>\t%P0, %q1, %q2"
- [(set_attr "type" "neon_int_4")]
+ [(set_attr "type" "neon_sub_halve_narrow_q")]
)
(define_insn "neon_vceq<mode>"
vceq.<V_if_elem>\t%<V_reg>0, %<V_reg>1, #0"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_compare_s<q>")
+ (if_then_else (match_operand 2 "zero_operand")
+ (const_string "neon_compare_zero<q>")
+ (const_string "neon_compare<q>"))))]
)
(define_insn "neon_vcge<mode>"
vcge.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, #0"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_compare_s<q>")
+ (if_then_else (match_operand 2 "zero_operand")
+ (const_string "neon_compare_zero<q>")
+ (const_string "neon_compare<q>"))))]
)
(define_insn "neon_vcgeu<mode>"
UNSPEC_VCGEU))]
"TARGET_NEON"
"vcge.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set_attr "type" "neon_int_5")]
+ [(set_attr "type" "neon_compare<q>")]
)
(define_insn "neon_vcgt<mode>"
vcgt.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, #0"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_compare_s<q>")
+ (if_then_else (match_operand 2 "zero_operand")
+ (const_string "neon_compare_zero<q>")
+ (const_string "neon_compare<q>"))))]
)
(define_insn "neon_vcgtu<mode>"
UNSPEC_VCGTU))]
"TARGET_NEON"
"vcgt.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set_attr "type" "neon_int_5")]
+ [(set_attr "type" "neon_compare<q>")]
)
;; VCLE and VCLT only support comparisons with immediate zero (register
"vcle.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, #0"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_compare_s<q>")
+ (if_then_else (match_operand 2 "zero_operand")
+ (const_string "neon_compare_zero<q>")
+ (const_string "neon_compare<q>"))))]
)
(define_insn "neon_vclt<mode>"
"vclt.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, #0"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_compare_s<q>")
+ (if_then_else (match_operand 2 "zero_operand")
+ (const_string "neon_compare_zero<q>")
+ (const_string "neon_compare<q>"))))]
)
(define_insn "neon_vcage<mode>"
UNSPEC_VCAGE))]
"TARGET_NEON"
"vacge.<V_if_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq")))]
+ [(set_attr "type" "neon_fp_compare_s<q>")]
)
(define_insn "neon_vcagt<mode>"
UNSPEC_VCAGT))]
"TARGET_NEON"
"vacgt.<V_if_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq")))]
+ [(set_attr "type" "neon_fp_compare_s<q>")]
)
(define_insn "neon_vtst<mode>"
UNSPEC_VTST))]
"TARGET_NEON"
"vtst.<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set_attr "type" "neon_int_4")]
+ [(set_attr "type" "neon_tst<q>")]
)
(define_insn "neon_vabd<mode>"
"vabd.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_abd_s<q>")
+ (const_string "neon_abd<q>")))]
)
(define_insn "neon_vabdl<mode>"
UNSPEC_VABDL))]
"TARGET_NEON"
"vabdl.%T3%#<V_sz_elem>\t%q0, %P1, %P2"
- [(set_attr "type" "neon_int_5")]
+ [(set_attr "type" "neon_abd_long")]
)
(define_insn "neon_vaba<mode>"
(match_operand:VDQIW 1 "s_register_operand" "0")))]
"TARGET_NEON"
"vaba.%T4%#<V_sz_elem>\t%<V_reg>0, %<V_reg>2, %<V_reg>3"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_vaba") (const_string "neon_vaba_qqq")))]
+ [(set_attr "type" "neon_arith_acc<q>")]
)
(define_insn "neon_vabal<mode>"
(match_operand:<V_widen> 1 "s_register_operand" "0")))]
"TARGET_NEON"
"vabal.%T4%#<V_sz_elem>\t%q0, %P2, %P3"
- [(set_attr "type" "neon_vaba")]
+ [(set_attr "type" "neon_arith_acc<q>")]
)
(define_insn "neon_vmax<mode>"
"vmax.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_minmax_s<q>")
+ (const_string "neon_minmax<q>")))]
)
(define_insn "neon_vmin<mode>"
"vmin.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_minmax_s<q>")
+ (const_string "neon_minmax<q>")))]
)
(define_expand "neon_vpadd<mode>"
UNSPEC_VPADDL))]
"TARGET_NEON"
"vpaddl.%T2%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1"
- ;; Assume this schedules like vaddl.
- [(set_attr "type" "neon_int_3")]
+ [(set_attr "type" "neon_reduc_add_long")]
)
(define_insn "neon_vpadal<mode>"
UNSPEC_VPADAL))]
"TARGET_NEON"
"vpadal.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>2"
- ;; Assume this schedules like vpadd.
- [(set_attr "type" "neon_int_1")]
+ [(set_attr "type" "neon_reduc_add_acc")]
)
(define_insn "neon_vpmax<mode>"
UNSPEC_VPMAX))]
"TARGET_NEON"
"vpmax.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- ;; Assume this schedules like vmax.
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_reduc_minmax_s<q>")
+ (const_string "neon_reduc_minmax<q>")))]
)
(define_insn "neon_vpmin<mode>"
UNSPEC_VPMIN))]
"TARGET_NEON"
"vpmin.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- ;; Assume this schedules like vmin.
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_reduc_minmax_s<q>")
+ (const_string "neon_reduc_minmax<q>")))]
)
(define_insn "neon_vrecps<mode>"
UNSPEC_VRECPS))]
"TARGET_NEON"
"vrecps.<V_if_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vrecps_vrsqrts_ddd")
- (const_string "neon_fp_vrecps_vrsqrts_qqq")))]
+ [(set_attr "type" "neon_fp_recps_s<q>")]
)
(define_insn "neon_vrsqrts<mode>"
UNSPEC_VRSQRTS))]
"TARGET_NEON"
"vrsqrts.<V_if_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vrecps_vrsqrts_ddd")
- (const_string "neon_fp_vrecps_vrsqrts_qqq")))]
+ [(set_attr "type" "neon_fp_rsqrts_s<q>")]
)
(define_expand "neon_vabs<mode>"
UNSPEC_VQABS))]
"TARGET_NEON"
"vqabs.<V_s_elem>\t%<V_reg>0, %<V_reg>1"
- [(set_attr "type" "neon_vqneg_vqabs")]
+ [(set_attr "type" "neon_qabs<q>")]
)
(define_expand "neon_vneg<mode>"
UNSPEC_VQNEG))]
"TARGET_NEON"
"vqneg.<V_s_elem>\t%<V_reg>0, %<V_reg>1"
- [(set_attr "type" "neon_vqneg_vqabs")]
+ [(set_attr "type" "neon_qneg<q>")]
)
(define_insn "neon_vcls<mode>"
UNSPEC_VCLS))]
"TARGET_NEON"
"vcls.<V_s_elem>\t%<V_reg>0, %<V_reg>1"
- [(set_attr "type" "neon_int_1")]
+ [(set_attr "type" "neon_cls<q>")]
)
(define_insn "clz<mode>2"
(clz:VDQIW (match_operand:VDQIW 1 "s_register_operand" "w")))]
"TARGET_NEON"
"vclz.<V_if_elem>\t%<V_reg>0, %<V_reg>1"
- [(set_attr "type" "neon_int_1")]
+ [(set_attr "type" "neon_cnt<q>")]
)
(define_expand "neon_vclz<mode>"
(popcount:VE (match_operand:VE 1 "s_register_operand" "w")))]
"TARGET_NEON"
"vcnt.<V_sz_elem>\t%<V_reg>0, %<V_reg>1"
- [(set_attr "type" "neon_int_1")]
+ [(set_attr "type" "neon_cnt<q>")]
)
(define_expand "neon_vcnt<mode>"
UNSPEC_VRECPE))]
"TARGET_NEON"
"vrecpe.<V_u_elem>\t%<V_reg>0, %<V_reg>1"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq")))]
+ [(set_attr "type" "neon_fp_recpe_s<q>")]
)
(define_insn "neon_vrsqrte<mode>"
UNSPEC_VRSQRTE))]
"TARGET_NEON"
"vrsqrte.<V_u_elem>\t%<V_reg>0, %<V_reg>1"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq")))]
+ [(set_attr "type" "neon_fp_rsqrte_s<q>")]
)
(define_expand "neon_vmvn<mode>"
}
return "vmov.s<V_sz_elem>\t%0, %P1[%c2]";
}
- [(set_attr "type" "neon_bp_simple")]
+ [(set_attr "type" "neon_to_gp")]
)
(define_insn "neon_vget_lane<mode>_zext_internal"
}
return "vmov.u<V_sz_elem>\t%0, %P1[%c2]";
}
- [(set_attr "type" "neon_bp_simple")]
+ [(set_attr "type" "neon_to_gp")]
)
(define_insn "neon_vget_lane<mode>_sext_internal"
return "";
}
- [(set_attr "type" "neon_bp_simple")]
+ [(set_attr "type" "neon_to_gp_q")]
)
(define_insn "neon_vget_lane<mode>_zext_internal"
return "";
}
- [(set_attr "type" "neon_bp_simple")]
+ [(set_attr "type" "neon_to_gp_q")]
)
(define_expand "neon_vget_lane<mode>"
(vec_duplicate:VX (match_operand:<V_elem> 1 "s_register_operand" "r")))]
"TARGET_NEON"
"vdup.<V_sz_elem>\t%<V_reg>0, %1"
- ;; Assume this schedules like vmov.
- [(set_attr "type" "neon_bp_simple")]
+ [(set_attr "type" "neon_from_gp<q>")]
)
(define_insn "neon_vdup_n<mode>"
"@
vdup.<V_sz_elem>\t%<V_reg>0, %1
vdup.<V_sz_elem>\t%<V_reg>0, %y1"
- ;; Assume this schedules like vmov.
- [(set_attr "type" "neon_bp_simple")]
+ [(set_attr "type" "neon_from_gp<q>,neon_dup<q>")]
)
(define_expand "neon_vdup_ndi"
vmov\t%e0, %Q1, %R1\;vmov\t%f0, %Q1, %R1
vmov\t%e0, %P1\;vmov\t%f0, %P1"
[(set_attr "length" "8")
- (set_attr "type" "neon_bp_simple")]
+ (set_attr "type" "multiple")]
)
(define_insn "neon_vdup_lane<mode>_internal"
else
return "vdup.<V_sz_elem>\t%q0, %P1[%c2]";
}
- ;; Assume this schedules like vmov.
- [(set_attr "type" "neon_bp_simple")]
+ [(set_attr "type" "neon_dup<q>")]
)
(define_expand "neon_vdup_lane<mode>"
(set (match_dup 1) (match_dup 0))]
"TARGET_NEON && reload_completed"
"vswp\t%<V_reg>0, %<V_reg>1"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_bp_simple")
- (const_string "neon_bp_2cycle")))]
+ [(set_attr "type" "neon_permute<q>")]
)
;; In this insn, operand 1 should be low, and operand 2 the high part of the
{
neon_split_vcombine (operands);
DONE;
-})
+}
+[(set_attr "type" "multiple")]
+)
(define_expand "neon_vget_high<mode>"
[(match_operand:<V_HALF> 0 "s_register_operand")
(float:<V_CVTTO> (match_operand:VCVTI 1 "s_register_operand" "w")))]
"TARGET_NEON && !flag_rounding_math"
"vcvt.f32.s32\t%<V_reg>0, %<V_reg>1"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq")))]
+ [(set_attr "type" "neon_int_to_fp_<V_elem_ch><q>")]
)
(define_insn "floatuns<mode><V_cvtto>2"
(unsigned_float:<V_CVTTO> (match_operand:VCVTI 1 "s_register_operand" "w")))]
"TARGET_NEON && !flag_rounding_math"
"vcvt.f32.u32\t%<V_reg>0, %<V_reg>1"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq")))]
+ [(set_attr "type" "neon_int_to_fp_<V_elem_ch><q>")]
)
(define_insn "fix_trunc<mode><V_cvtto>2"
(fix:<V_CVTTO> (match_operand:VCVTF 1 "s_register_operand" "w")))]
"TARGET_NEON"
"vcvt.s32.f32\t%<V_reg>0, %<V_reg>1"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq")))]
+ [(set_attr "type" "neon_fp_to_int_<V_elem_ch><q>")]
)
(define_insn "fixuns_trunc<mode><V_cvtto>2"
(unsigned_fix:<V_CVTTO> (match_operand:VCVTF 1 "s_register_operand" "w")))]
"TARGET_NEON"
"vcvt.u32.f32\t%<V_reg>0, %<V_reg>1"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq")))]
+ [(set_attr "type" "neon_fp_to_int_<V_elem_ch><q>")]
)
(define_insn "neon_vcvt<mode>"
UNSPEC_VCVT))]
"TARGET_NEON"
"vcvt.%T2%#32.f32\t%<V_reg>0, %<V_reg>1"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq")))]
+ [(set_attr "type" "neon_fp_to_int_<V_elem_ch><q>")]
)
(define_insn "neon_vcvt<mode>"
UNSPEC_VCVT))]
"TARGET_NEON"
"vcvt.f32.%T2%#32\t%<V_reg>0, %<V_reg>1"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq")))]
+ [(set_attr "type" "neon_int_to_fp_<V_elem_ch><q>")]
)
(define_insn "neon_vcvtv4sfv4hf"
UNSPEC_VCVT))]
"TARGET_NEON && TARGET_FP16"
"vcvt.f32.f16\t%q0, %P1"
- [(set_attr "type" "neon_fp_vadd_ddd_vabs_dd")]
+ [(set_attr "type" "neon_fp_cvt_widen_h")]
)
(define_insn "neon_vcvtv4hfv4sf"
UNSPEC_VCVT))]
"TARGET_NEON && TARGET_FP16"
"vcvt.f16.f32\t%P0, %q1"
- [(set_attr "type" "neon_fp_vadd_ddd_vabs_dd")]
+ [(set_attr "type" "neon_fp_cvt_narrow_s_q")]
)
(define_insn "neon_vcvt_n<mode>"
neon_const_bounds (operands[2], 1, 33);
return "vcvt.%T3%#32.f32\t%<V_reg>0, %<V_reg>1, %2";
}
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq")))]
+ [(set_attr "type" "neon_fp_to_int_<V_elem_ch><q>")]
)
(define_insn "neon_vcvt_n<mode>"
neon_const_bounds (operands[2], 1, 33);
return "vcvt.f32.%T3%#32\t%<V_reg>0, %<V_reg>1, %2";
}
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq")))]
+ [(set_attr "type" "neon_int_to_fp_<V_elem_ch><q>")]
)
(define_insn "neon_vmovn<mode>"
UNSPEC_VMOVN))]
"TARGET_NEON"
"vmovn.<V_if_elem>\t%P0, %q1"
- [(set_attr "type" "neon_bp_simple")]
+ [(set_attr "type" "neon_shift_imm_narrow_q")]
)
(define_insn "neon_vqmovn<mode>"
UNSPEC_VQMOVN))]
"TARGET_NEON"
"vqmovn.%T2%#<V_sz_elem>\t%P0, %q1"
- [(set_attr "type" "neon_shift_2")]
+ [(set_attr "type" "neon_sat_shift_imm_narrow_q")]
)
(define_insn "neon_vqmovun<mode>"
UNSPEC_VQMOVUN))]
"TARGET_NEON"
"vqmovun.<V_s_elem>\t%P0, %q1"
- [(set_attr "type" "neon_shift_2")]
+ [(set_attr "type" "neon_sat_shift_imm_narrow_q")]
)
(define_insn "neon_vmovl<mode>"
UNSPEC_VMOVL))]
"TARGET_NEON"
"vmovl.%T2%#<V_sz_elem>\t%q0, %P1"
- [(set_attr "type" "neon_shift_1")]
+ [(set_attr "type" "neon_shift_imm_long")]
)
(define_insn "neon_vmul_lane<mode>"
}
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (const_string "neon_fp_vmul_ddd")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mul_ddd_16_scalar_32_16_long_scalar")
- (const_string "neon_mul_qdd_64_32_long_qqd_16_ddd_32_scalar_64_32_long_scalar"))))]
+ (const_string "neon_fp_mul_s_scalar<q>")
+ (const_string "neon_mul_<V_elem_ch>_scalar<q>")))]
)
(define_insn "neon_vmul_lane<mode>"
}
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (const_string "neon_fp_vmul_qqd")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mul_qdd_64_32_long_qqd_16_ddd_32_scalar_64_32_long_scalar")
- (const_string "neon_mul_qqd_32_scalar"))))]
+ (const_string "neon_fp_mul_s_scalar<q>")
+ (const_string "neon_mul_<V_elem_ch>_scalar<q>")))]
)
(define_insn "neon_vmull_lane<mode>"
neon_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<MODE>mode));
return "vmull.%T4%#<V_sz_elem>\t%q0, %P1, %P2[%c3]";
}
- [(set (attr "type")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mul_ddd_16_scalar_32_16_long_scalar")
- (const_string "neon_mul_qdd_64_32_long_qqd_16_ddd_32_scalar_64_32_long_scalar")))]
+ [(set_attr "type" "neon_mul_<V_elem_ch>_scalar_long")]
)
(define_insn "neon_vqdmull_lane<mode>"
neon_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<MODE>mode));
return "vqdmull.<V_s_elem>\t%q0, %P1, %P2[%c3]";
}
- [(set (attr "type")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mul_ddd_16_scalar_32_16_long_scalar")
- (const_string "neon_mul_qdd_64_32_long_qqd_16_ddd_32_scalar_64_32_long_scalar")))]
+ [(set_attr "type" "neon_sat_mul_<V_elem_ch>_scalar_long")]
)
(define_insn "neon_vqdmulh_lane<mode>"
neon_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<MODE>mode));
return "vq%O4dmulh.%T4%#<V_sz_elem>\t%q0, %q1, %P2[%c3]";
}
- [(set (attr "type")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mul_qdd_64_32_long_qqd_16_ddd_32_scalar_64_32_long_scalar")
- (const_string "neon_mul_qqd_32_scalar")))]
+ [(set_attr "type" "neon_sat_mul_<V_elem_ch>_scalar_q")]
)
(define_insn "neon_vqdmulh_lane<mode>"
neon_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<MODE>mode));
return "vq%O4dmulh.%T4%#<V_sz_elem>\t%P0, %P1, %P2[%c3]";
}
- [(set (attr "type")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mul_ddd_16_scalar_32_16_long_scalar")
- (const_string "neon_mul_qdd_64_32_long_qqd_16_ddd_32_scalar_64_32_long_scalar")))]
+ [(set_attr "type" "neon_sat_mul_<V_elem_ch>_scalar_q")]
)
(define_insn "neon_vmla_lane<mode>"
}
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (const_string "neon_fp_vmla_ddd_scalar")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_16_scalar_qdd_32_16_long_scalar")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long"))))]
+ (const_string "neon_fp_mla_s_scalar<q>")
+ (const_string "neon_mla_<V_elem_ch>_scalar<q>")))]
)
(define_insn "neon_vmla_lane<mode>"
}
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (const_string "neon_fp_vmla_qqq_scalar")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long")
- (const_string "neon_mla_qqq_32_qqd_32_scalar"))))]
+ (const_string "neon_fp_mla_s_scalar<q>")
+ (const_string "neon_mla_<V_elem_ch>_scalar<q>")))]
)
(define_insn "neon_vmlal_lane<mode>"
neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode));
return "vmlal.%T5%#<V_sz_elem>\t%q0, %P2, %P3[%c4]";
}
- [(set (attr "type")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_16_scalar_qdd_32_16_long_scalar")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long")))]
+ [(set_attr "type" "neon_mla_<V_elem_ch>_scalar_long")]
)
(define_insn "neon_vqdmlal_lane<mode>"
neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode));
return "vqdmlal.<V_s_elem>\t%q0, %P2, %P3[%c4]";
}
- [(set (attr "type")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_16_scalar_qdd_32_16_long_scalar")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long")))]
+ [(set_attr "type" "neon_sat_mla_<V_elem_ch>_scalar_long")]
)
(define_insn "neon_vmls_lane<mode>"
}
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (const_string "neon_fp_vmla_ddd_scalar")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_16_scalar_qdd_32_16_long_scalar")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long"))))]
+ (const_string "neon_fp_mla_s_scalar<q>")
+ (const_string "neon_mla_<V_elem_ch>_scalar<q>")))]
)
(define_insn "neon_vmls_lane<mode>"
}
[(set (attr "type")
(if_then_else (match_test "<Is_float_mode>")
- (const_string "neon_fp_vmla_qqq_scalar")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long")
- (const_string "neon_mla_qqq_32_qqd_32_scalar"))))]
+ (const_string "neon_fp_mla_s_scalar<q>")
+ (const_string "neon_mla_<V_elem_ch>_scalar<q>")))]
)
(define_insn "neon_vmlsl_lane<mode>"
neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode));
return "vmlsl.%T5%#<V_sz_elem>\t%q0, %P2, %P3[%c4]";
}
- [(set (attr "type")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_16_scalar_qdd_32_16_long_scalar")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long")))]
+ [(set_attr "type" "neon_mla_<V_elem_ch>_scalar_long")]
)
(define_insn "neon_vqdmlsl_lane<mode>"
neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode));
return "vqdmlsl.<V_s_elem>\t%q0, %P2, %P3[%c4]";
}
- [(set (attr "type")
- (if_then_else (match_test "<Scalar_mul_8_16>")
- (const_string "neon_mla_ddd_16_scalar_qdd_32_16_long_scalar")
- (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long")))]
+ [(set_attr "type" "neon_sat_mla_<V_elem_ch>_scalar_long")]
)
; FIXME: For the "_n" multiply/multiply-accumulate insns, we copy a value in a
neon_const_bounds (operands[3], 0, GET_MODE_NUNITS (<MODE>mode));
return "vext.<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2, %3";
}
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_bp_simple")
- (const_string "neon_bp_2cycle")))]
+ [(set_attr "type" "neon_ext<q>")]
)
(define_insn "neon_vrev64<mode>"
UNSPEC_VREV64))]
"TARGET_NEON"
"vrev64.<V_sz_elem>\t%<V_reg>0, %<V_reg>1"
- [(set_attr "type" "neon_bp_simple")]
+ [(set_attr "type" "neon_rev<q>")]
)
(define_insn "neon_vrev32<mode>"
UNSPEC_VREV32))]
"TARGET_NEON"
"vrev32.<V_sz_elem>\t%<V_reg>0, %<V_reg>1"
- [(set_attr "type" "neon_bp_simple")]
+ [(set_attr "type" "neon_rev<q>")]
)
(define_insn "neon_vrev16<mode>"
UNSPEC_VREV16))]
"TARGET_NEON"
"vrev16.<V_sz_elem>\t%<V_reg>0, %<V_reg>1"
- [(set_attr "type" "neon_bp_simple")]
+ [(set_attr "type" "neon_rev<q>")]
)
; vbsl_* intrinsics may compile to any of vbsl/vbif/vbit depending on register
vbsl\t%<V_reg>0, %<V_reg>2, %<V_reg>3
vbit\t%<V_reg>0, %<V_reg>2, %<V_reg>1
vbif\t%<V_reg>0, %<V_reg>3, %<V_reg>1"
- [(set_attr "type" "neon_int_1")]
+ [(set_attr "type" "neon_bsl<q>")]
)
(define_expand "neon_vbsl<mode>"
UNSPEC_VSHL))]
"TARGET_NEON"
"v%O3shl.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_vshl_ddd")
- (const_string "neon_shift_3")))]
+ [(set_attr "type" "neon_shift_imm<q>")]
)
(define_insn "neon_vqshl<mode>"
UNSPEC_VQSHL))]
"TARGET_NEON"
"vq%O3shl.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_shift_2")
- (const_string "neon_vqshl_vrshl_vqrshl_qqq")))]
+ [(set_attr "type" "neon_sat_shift_imm<q>")]
)
(define_insn "neon_vshr_n<mode>"
neon_const_bounds (operands[2], 1, neon_element_bits (<MODE>mode) + 1);
return "v%O3shr.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %2";
}
- [(set_attr "type" "neon_shift_1")]
+ [(set_attr "type" "neon_shift_imm<q>")]
)
(define_insn "neon_vshrn_n<mode>"
neon_const_bounds (operands[2], 1, neon_element_bits (<MODE>mode) / 2 + 1);
return "v%O3shrn.<V_if_elem>\t%P0, %q1, %2";
}
- [(set_attr "type" "neon_shift_1")]
+ [(set_attr "type" "neon_shift_imm_narrow_q")]
)
(define_insn "neon_vqshrn_n<mode>"
neon_const_bounds (operands[2], 1, neon_element_bits (<MODE>mode) / 2 + 1);
return "vq%O3shrn.%T3%#<V_sz_elem>\t%P0, %q1, %2";
}
- [(set_attr "type" "neon_shift_2")]
+ [(set_attr "type" "neon_sat_shift_imm_narrow_q")]
)
(define_insn "neon_vqshrun_n<mode>"
neon_const_bounds (operands[2], 1, neon_element_bits (<MODE>mode) / 2 + 1);
return "vq%O3shrun.%T3%#<V_sz_elem>\t%P0, %q1, %2";
}
- [(set_attr "type" "neon_shift_2")]
+ [(set_attr "type" "neon_sat_shift_imm_narrow_q")]
)
(define_insn "neon_vshl_n<mode>"
neon_const_bounds (operands[2], 0, neon_element_bits (<MODE>mode));
return "vshl.<V_if_elem>\t%<V_reg>0, %<V_reg>1, %2";
}
- [(set_attr "type" "neon_shift_1")]
+ [(set_attr "type" "neon_shift_imm<q>")]
)
(define_insn "neon_vqshl_n<mode>"
neon_const_bounds (operands[2], 0, neon_element_bits (<MODE>mode));
return "vqshl.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %2";
}
- [(set_attr "type" "neon_shift_2")]
+ [(set_attr "type" "neon_sat_shift_imm<q>")]
)
(define_insn "neon_vqshlu_n<mode>"
neon_const_bounds (operands[2], 0, neon_element_bits (<MODE>mode));
return "vqshlu.%T3%#<V_sz_elem>\t%<V_reg>0, %<V_reg>1, %2";
}
- [(set_attr "type" "neon_shift_2")]
+ [(set_attr "type" "neon_sat_shift_imm<q>")]
)
(define_insn "neon_vshll_n<mode>"
neon_const_bounds (operands[2], 0, neon_element_bits (<MODE>mode) + 1);
return "vshll.%T3%#<V_sz_elem>\t%q0, %P1, %2";
}
- [(set_attr "type" "neon_shift_1")]
+ [(set_attr "type" "neon_shift_imm_long")]
)
(define_insn "neon_vsra_n<mode>"
neon_const_bounds (operands[3], 1, neon_element_bits (<MODE>mode) + 1);
return "v%O4sra.%T4%#<V_sz_elem>\t%<V_reg>0, %<V_reg>2, %3";
}
- [(set_attr "type" "neon_vsra_vrsra")]
+ [(set_attr "type" "neon_shift_acc<q>")]
)
(define_insn "neon_vsri_n<mode>"
neon_const_bounds (operands[3], 1, neon_element_bits (<MODE>mode) + 1);
return "vsri.<V_sz_elem>\t%<V_reg>0, %<V_reg>2, %3";
}
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_shift_1")
- (const_string "neon_shift_3")))]
+ [(set_attr "type" "neon_shift_reg<q>")]
)
(define_insn "neon_vsli_n<mode>"
neon_const_bounds (operands[3], 0, neon_element_bits (<MODE>mode));
return "vsli.<V_sz_elem>\t%<V_reg>0, %<V_reg>2, %3";
}
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_shift_1")
- (const_string "neon_shift_3")))]
+ [(set_attr "type" "neon_shift_reg<q>")]
)
(define_insn "neon_vtbl1v8qi"
UNSPEC_VTBL))]
"TARGET_NEON"
"vtbl.8\t%P0, {%P1}, %P2"
- [(set_attr "type" "neon_bp_2cycle")]
+ [(set_attr "type" "neon_tbl1")]
)
(define_insn "neon_vtbl2v8qi"
return "";
}
- [(set_attr "type" "neon_bp_2cycle")]
+ [(set_attr "type" "neon_tbl2")]
)
(define_insn "neon_vtbl3v8qi"
return "";
}
- [(set_attr "type" "neon_bp_3cycle")]
+ [(set_attr "type" "neon_tbl3")]
)
(define_insn "neon_vtbl4v8qi"
return "";
}
- [(set_attr "type" "neon_bp_3cycle")]
+ [(set_attr "type" "neon_tbl4")]
)
;; These three are used by the vec_perm infrastructure for V16QImode.
part2 = simplify_subreg (V8QImode, op2, V16QImode, ofs);
emit_insn (gen_neon_vtbl2v8qi (part0, op1, part2));
DONE;
-})
+}
+ [(set_attr "type" "multiple")]
+)
(define_insn_and_split "neon_vtbl2v16qi"
[(set (match_operand:V16QI 0 "s_register_operand" "=&w")
part2 = simplify_subreg (V8QImode, op2, V16QImode, ofs);
emit_insn (gen_neon_vtbl2v8qi (part0, op1, part2));
DONE;
-})
+}
+ [(set_attr "type" "multiple")]
+)
;; ??? Logically we should extend the regular neon_vcombine pattern to
;; handle quad-word input modes, producing octa-word output modes. But
{
neon_split_vcombine (operands);
DONE;
-})
+}
+[(set_attr "type" "multiple")]
+)
(define_insn "neon_vtbx1v8qi"
[(set (match_operand:V8QI 0 "s_register_operand" "=w")
UNSPEC_VTBX))]
"TARGET_NEON"
"vtbx.8\t%P0, {%P2}, %P3"
- [(set_attr "type" "neon_bp_2cycle")]
+ [(set_attr "type" "neon_tbl1")]
)
(define_insn "neon_vtbx2v8qi"
return "";
}
- [(set_attr "type" "neon_bp_2cycle")]
+ [(set_attr "type" "neon_tbl2")]
)
(define_insn "neon_vtbx3v8qi"
return "";
}
- [(set_attr "type" "neon_bp_3cycle")]
+ [(set_attr "type" "neon_tbl3")]
)
(define_insn "neon_vtbx4v8qi"
return "";
}
- [(set_attr "type" "neon_bp_3cycle")]
+ [(set_attr "type" "neon_tbl4")]
)
(define_expand "neon_vtrn<mode>_internal"
UNSPEC_VTRN2))]
"TARGET_NEON"
"vtrn.<V_sz_elem>\t%<V_reg>0, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_bp_simple")
- (const_string "neon_bp_3cycle")))]
+ [(set_attr "type" "neon_permute<q>")]
)
(define_expand "neon_vtrn<mode>"
UNSPEC_VZIP2))]
"TARGET_NEON"
"vzip.<V_sz_elem>\t%<V_reg>0, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_bp_simple")
- (const_string "neon_bp_3cycle")))]
+ [(set_attr "type" "neon_zip<q>")]
)
(define_expand "neon_vzip<mode>"
UNSPEC_VUZP2))]
"TARGET_NEON"
"vuzp.<V_sz_elem>\t%<V_reg>0, %<V_reg>2"
- [(set (attr "type")
- (if_then_else (match_test "<Is_d_reg>")
- (const_string "neon_bp_simple")
- (const_string "neon_bp_3cycle")))]
+ [(set_attr "type" "neon_zip<q>")]
)
(define_expand "neon_vuzp<mode>"
UNSPEC_VLD1))]
"TARGET_NEON"
"vld1.<V_sz_elem>\t%h0, %A1"
- [(set_attr "type" "neon_vld1_1_2_regs")]
+ [(set_attr "type" "neon_load1_1reg<q>")]
)
(define_insn "neon_vld1_lane<mode>"
else
return "vld1.<V_sz_elem>\t{%P0[%c3]}, %A1";
}
- [(set (attr "type")
- (if_then_else (eq (const_string "<V_mode_nunits>") (const_int 2))
- (const_string "neon_vld1_1_2_regs")
- (const_string "neon_vld1_vld2_lane")))]
+ [(set_attr "type" "neon_load1_one_lane<q>")]
)
(define_insn "neon_vld1_lane<mode>"
else
return "vld1.<V_sz_elem>\t{%P0[%c3]}, %A1";
}
- [(set (attr "type")
- (if_then_else (eq (const_string "<V_mode_nunits>") (const_int 2))
- (const_string "neon_vld1_1_2_regs")
- (const_string "neon_vld1_vld2_lane")))]
+ [(set_attr "type" "neon_load1_one_lane<q>")]
)
(define_insn "neon_vld1_dup<mode>"
(vec_duplicate:VD (match_operand:<V_elem> 1 "neon_struct_operand" "Um")))]
"TARGET_NEON"
"vld1.<V_sz_elem>\t{%P0[]}, %A1"
- [(set_attr "type" "neon_vld2_2_regs_vld1_vld2_all_lanes")]
+ [(set_attr "type" "neon_load1_all_lanes<q>")]
)
;; Special case for DImode. Treat it exactly like a simple load.
{
return "vld1.<V_sz_elem>\t{%e0[], %f0[]}, %A1";
}
- [(set_attr "type" "neon_vld2_2_regs_vld1_vld2_all_lanes")]
+ [(set_attr "type" "neon_load1_all_lanes<q>")]
)
(define_insn_and_split "neon_vld1_dupv2di"
DONE;
}
[(set_attr "length" "8")
- (set_attr "type" "neon_vld2_2_regs_vld1_vld2_all_lanes")]
+ (set_attr "type" "neon_load1_all_lanes_q")]
)
(define_expand "vec_store_lanes<mode><mode>"
UNSPEC_VST1))]
"TARGET_NEON"
"vst1.<V_sz_elem>\t%h1, %A0"
- [(set_attr "type" "neon_vst1_1_2_regs_vst2_2_regs")])
+ [(set_attr "type" "neon_store1_1reg<q>")])
(define_insn "neon_vst1_lane<mode>"
[(set (match_operand:<V_elem> 0 "neon_struct_operand" "=Um")
else
return "vst1.<V_sz_elem>\t{%P1[%c2]}, %A0";
}
- [(set (attr "type")
- (if_then_else (eq (const_string "<V_mode_nunits>") (const_int 1))
- (const_string "neon_vst1_1_2_regs_vst2_2_regs")
- (const_string "neon_vst1_vst2_lane")))])
+ [(set_attr "type" "neon_store1_one_lane<q>")]
+)
(define_insn "neon_vst1_lane<mode>"
[(set (match_operand:<V_elem> 0 "neon_struct_operand" "=Um")
else
return "vst1.<V_sz_elem>\t{%P1[%c2]}, %A0";
}
- [(set_attr "type" "neon_vst1_vst2_lane")]
+ [(set_attr "type" "neon_store1_one_lane<q>")]
)
(define_expand "vec_load_lanesti<mode>"
}
[(set (attr "type")
(if_then_else (eq (const_string "<V_sz_elem>") (const_string "64"))
- (const_string "neon_vld1_1_2_regs")
- (const_string "neon_vld2_2_regs_vld1_vld2_all_lanes")))]
+ (const_string "neon_load1_2reg<q>")
+ (const_string "neon_load2_2reg<q>")))]
)
(define_expand "vec_load_lanesoi<mode>"
UNSPEC_VLD2))]
"TARGET_NEON"
"vld2.<V_sz_elem>\t%h0, %A1"
- [(set_attr "type" "neon_vld2_2_regs_vld1_vld2_all_lanes")])
+ [(set_attr "type" "neon_load2_2reg_q")])
(define_insn "neon_vld2_lane<mode>"
[(set (match_operand:TI 0 "s_register_operand" "=w")
output_asm_insn ("vld2.<V_sz_elem>\t{%P0[%c3], %P1[%c3]}, %A2", ops);
return "";
}
- [(set_attr "type" "neon_vld1_vld2_lane")]
+ [(set_attr "type" "neon_load2_one_lane<q>")]
)
(define_insn "neon_vld2_lane<mode>"
output_asm_insn ("vld2.<V_sz_elem>\t{%P0[%c3], %P1[%c3]}, %A2", ops);
return "";
}
- [(set_attr "type" "neon_vld1_vld2_lane")]
+ [(set_attr "type" "neon_load2_one_lane<q>")]
)
(define_insn "neon_vld2_dup<mode>"
}
[(set (attr "type")
(if_then_else (gt (const_string "<V_mode_nunits>") (const_string "1"))
- (const_string "neon_vld2_2_regs_vld1_vld2_all_lanes")
- (const_string "neon_vld1_1_2_regs")))]
+ (const_string "neon_load2_all_lanes<q>")
+ (const_string "neon_load1_1reg<q>")))]
)
(define_expand "vec_store_lanesti<mode>"
}
[(set (attr "type")
(if_then_else (eq (const_string "<V_sz_elem>") (const_string "64"))
- (const_string "neon_vst1_1_2_regs_vst2_2_regs")
- (const_string "neon_vst1_1_2_regs_vst2_2_regs")))]
+ (const_string "neon_store1_2reg<q>")
+ (const_string "neon_store2_one_lane<q>")))]
)
(define_expand "vec_store_lanesoi<mode>"
UNSPEC_VST2))]
"TARGET_NEON"
"vst2.<V_sz_elem>\t%h1, %A0"
- [(set_attr "type" "neon_vst1_1_2_regs_vst2_2_regs")]
+ [(set_attr "type" "neon_store2_4reg<q>")]
)
(define_insn "neon_vst2_lane<mode>"
output_asm_insn ("vst2.<V_sz_elem>\t{%P1[%c3], %P2[%c3]}, %A0", ops);
return "";
}
- [(set_attr "type" "neon_vst1_vst2_lane")]
+ [(set_attr "type" "neon_store2_one_lane<q>")]
)
(define_insn "neon_vst2_lane<mode>"
output_asm_insn ("vst2.<V_sz_elem>\t{%P1[%c3], %P2[%c3]}, %A0", ops);
return "";
}
- [(set_attr "type" "neon_vst1_vst2_lane")]
+ [(set_attr "type" "neon_store2_one_lane<q>")]
)
(define_expand "vec_load_lanesei<mode>"
}
[(set (attr "type")
(if_then_else (eq (const_string "<V_sz_elem>") (const_string "64"))
- (const_string "neon_vld1_1_2_regs")
- (const_string "neon_vld3_vld4")))]
+ (const_string "neon_load1_3reg<q>")
+ (const_string "neon_load3_3reg<q>")))]
)
(define_expand "vec_load_lanesci<mode>"
output_asm_insn ("vld3.<V_sz_elem>\t{%P0, %P1, %P2}, %A3", ops);
return "";
}
- [(set_attr "type" "neon_vld3_vld4")]
+ [(set_attr "type" "neon_load3_3reg<q>")]
)
(define_insn "neon_vld3qb<mode>"
output_asm_insn ("vld3.<V_sz_elem>\t{%P0, %P1, %P2}, %A3", ops);
return "";
}
- [(set_attr "type" "neon_vld3_vld4")]
+ [(set_attr "type" "neon_load3_3reg<q>")]
)
(define_insn "neon_vld3_lane<mode>"
ops);
return "";
}
- [(set_attr "type" "neon_vld3_vld4_lane")]
+ [(set_attr "type" "neon_load3_one_lane<q>")]
)
(define_insn "neon_vld3_lane<mode>"
ops);
return "";
}
- [(set_attr "type" "neon_vld3_vld4_lane")]
+ [(set_attr "type" "neon_load3_one_lane<q>")]
)
(define_insn "neon_vld3_dup<mode>"
}
[(set (attr "type")
(if_then_else (gt (const_string "<V_mode_nunits>") (const_string "1"))
- (const_string "neon_vld3_vld4_all_lanes")
- (const_string "neon_vld1_1_2_regs")))])
+ (const_string "neon_load3_all_lanes<q>")
+ (const_string "neon_load1_1reg<q>")))])
(define_expand "vec_store_lanesei<mode>"
[(set (match_operand:EI 0 "neon_struct_operand")
}
[(set (attr "type")
(if_then_else (eq (const_string "<V_sz_elem>") (const_string "64"))
- (const_string "neon_vst1_1_2_regs_vst2_2_regs")
- (const_string "neon_vst2_4_regs_vst3_vst4")))])
+ (const_string "neon_store1_3reg<q>")
+ (const_string "neon_store3_one_lane<q>")))])
(define_expand "vec_store_lanesci<mode>"
[(match_operand:CI 0 "neon_struct_operand")
output_asm_insn ("vst3.<V_sz_elem>\t{%P1, %P2, %P3}, %A0", ops);
return "";
}
- [(set_attr "type" "neon_vst2_4_regs_vst3_vst4")]
+ [(set_attr "type" "neon_store3_3reg<q>")]
)
(define_insn "neon_vst3qb<mode>"
output_asm_insn ("vst3.<V_sz_elem>\t{%P1, %P2, %P3}, %A0", ops);
return "";
}
- [(set_attr "type" "neon_vst2_4_regs_vst3_vst4")]
+ [(set_attr "type" "neon_store3_3reg<q>")]
)
(define_insn "neon_vst3_lane<mode>"
ops);
return "";
}
- [(set_attr "type" "neon_vst3_vst4_lane")]
+ [(set_attr "type" "neon_store3_one_lane<q>")]
)
(define_insn "neon_vst3_lane<mode>"
ops);
return "";
}
-[(set_attr "type" "neon_vst3_vst4_lane")])
+ [(set_attr "type" "neon_store3_one_lane<q>")]
+)
(define_expand "vec_load_lanesoi<mode>"
[(set (match_operand:OI 0 "s_register_operand")
}
[(set (attr "type")
(if_then_else (eq (const_string "<V_sz_elem>") (const_string "64"))
- (const_string "neon_vld1_1_2_regs")
- (const_string "neon_vld3_vld4")))]
+ (const_string "neon_load1_4reg<q>")
+ (const_string "neon_load4_4reg<q>")))]
)
(define_expand "vec_load_lanesxi<mode>"
output_asm_insn ("vld4.<V_sz_elem>\t{%P0, %P1, %P2, %P3}, %A4", ops);
return "";
}
- [(set_attr "type" "neon_vld3_vld4")]
+ [(set_attr "type" "neon_load4_4reg<q>")]
)
(define_insn "neon_vld4qb<mode>"
output_asm_insn ("vld4.<V_sz_elem>\t{%P0, %P1, %P2, %P3}, %A4", ops);
return "";
}
- [(set_attr "type" "neon_vld3_vld4")]
+ [(set_attr "type" "neon_load4_4reg<q>")]
)
(define_insn "neon_vld4_lane<mode>"
ops);
return "";
}
- [(set_attr "type" "neon_vld3_vld4_lane")]
+ [(set_attr "type" "neon_load4_one_lane<q>")]
)
(define_insn "neon_vld4_lane<mode>"
ops);
return "";
}
- [(set_attr "type" "neon_vld3_vld4_lane")]
+ [(set_attr "type" "neon_load4_one_lane<q>")]
)
(define_insn "neon_vld4_dup<mode>"
}
[(set (attr "type")
(if_then_else (gt (const_string "<V_mode_nunits>") (const_string "1"))
- (const_string "neon_vld3_vld4_all_lanes")
- (const_string "neon_vld1_1_2_regs")))]
+ (const_string "neon_load4_all_lanes<q>")
+ (const_string "neon_load1_1reg<q>")))]
)
(define_expand "vec_store_lanesoi<mode>"
}
[(set (attr "type")
(if_then_else (eq (const_string "<V_sz_elem>") (const_string "64"))
- (const_string "neon_vst1_1_2_regs_vst2_2_regs")
- (const_string "neon_vst2_4_regs_vst3_vst4")))]
+ (const_string "neon_store1_4reg<q>")
+ (const_string "neon_store4_4reg<q>")))]
)
(define_expand "vec_store_lanesxi<mode>"
output_asm_insn ("vst4.<V_sz_elem>\t{%P1, %P2, %P3, %P4}, %A0", ops);
return "";
}
- [(set_attr "type" "neon_vst2_4_regs_vst3_vst4")]
+ [(set_attr "type" "neon_store4_4reg<q>")]
)
(define_insn "neon_vst4qb<mode>"
output_asm_insn ("vst4.<V_sz_elem>\t{%P1, %P2, %P3, %P4}, %A0", ops);
return "";
}
- [(set_attr "type" "neon_vst2_4_regs_vst3_vst4")]
+ [(set_attr "type" "neon_store4_4reg<q>")]
)
(define_insn "neon_vst4_lane<mode>"
ops);
return "";
}
- [(set_attr "type" "neon_vst3_vst4_lane")]
+ [(set_attr "type" "neon_store4_one_lane<q>")]
)
(define_insn "neon_vst4_lane<mode>"
ops);
return "";
}
- [(set_attr "type" "neon_vst3_vst4_lane")]
+ [(set_attr "type" "neon_store4_4reg<q>")]
)
(define_expand "neon_vand<mode>"
(match_operand:VU 2 "vect_par_constant_low" ""))))]
"TARGET_NEON && !BYTES_BIG_ENDIAN"
"vmovl.<US><V_sz_elem> %q0, %e1"
- [(set_attr "type" "neon_shift_1")]
+ [(set_attr "type" "neon_shift_imm_long")]
)
(define_insn "neon_vec_unpack<US>_hi_<mode>"
(match_operand:VU 2 "vect_par_constant_high" ""))))]
"TARGET_NEON && !BYTES_BIG_ENDIAN"
"vmovl.<US><V_sz_elem> %q0, %f1"
- [(set_attr "type" "neon_shift_1")]
+ [(set_attr "type" "neon_shift_imm_long")]
)
(define_expand "vec_unpack<US>_hi_<mode>"
(match_dup 2)))))]
"TARGET_NEON && !BYTES_BIG_ENDIAN"
"vmull.<US><V_sz_elem> %q0, %e1, %e3"
- [(set_attr "type" "neon_shift_1")]
+ [(set_attr "type" "neon_mul_<V_elem_ch>_long")]
)
(define_expand "vec_widen_<US>mult_lo_<mode>"
(match_dup 2)))))]
"TARGET_NEON && !BYTES_BIG_ENDIAN"
"vmull.<US><V_sz_elem> %q0, %f1, %f3"
- [(set_attr "type" "neon_shift_1")]
+ [(set_attr "type" "neon_mul_<V_elem_ch>_long")]
)
(define_expand "vec_widen_<US>mult_hi_<mode>"
{
return "vshll.<US><V_sz_elem> %q0, %P1, %2";
}
- [(set_attr "type" "neon_shift_1")]
+ [(set_attr "type" "neon_shift_imm_long")]
)
(define_expand "vec_widen_<US>shiftl_lo_<mode>"
(SE:<V_widen> (match_operand:VDI 1 "register_operand" "w")))]
"TARGET_NEON"
"vmovl.<US><V_sz_elem> %q0, %P1"
- [(set_attr "type" "neon_shift_1")]
+ [(set_attr "type" "neon_move")]
)
(define_expand "vec_unpack<US>_lo_<mode>"
(match_operand:VDI 2 "register_operand" "w"))))]
"TARGET_NEON"
"vmull.<US><V_sz_elem> %q0, %P1, %P2"
- [(set_attr "type" "neon_shift_1")]
+ [(set_attr "type" "neon_mul_<V_elem_ch>_long")]
)
(define_expand "vec_widen_<US>mult_hi_<mode>"
(match_operand:VN 2 "register_operand" "w"))))]
"TARGET_NEON && !BYTES_BIG_ENDIAN"
"vmovn.i<V_sz_elem>\t%e0, %q1\;vmovn.i<V_sz_elem>\t%f0, %q2"
- [(set_attr "type" "neon_shift_1")
+ [(set_attr "type" "multiple")
(set_attr "length" "8")]
)
(truncate:<V_narrow> (match_operand:VN 1 "register_operand" "w")))]
"TARGET_NEON && !BYTES_BIG_ENDIAN"
"vmovn.i<V_sz_elem>\t%P0, %q1"
- [(set_attr "type" "neon_shift_1")]
+ [(set_attr "type" "neon_move_narrow_q")]
)
(define_expand "vec_pack_trunc_<mode>"
"vabd.<V_s_elem> %<V_reg>0, %<V_reg>1, %<V_reg>2"
[(set (attr "type")
(if_then_else (ne (symbol_ref "<Is_float_mode>") (const_int 0))
- (if_then_else (ne (symbol_ref "<Is_d_reg>") (const_int 0))
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_abd_s<q>")
+ (const_string "neon_abd<q>")))]
)
(define_insn "neon_vabd<mode>_3"
"vabd.<V_if_elem> %<V_reg>0, %<V_reg>1, %<V_reg>2"
[(set (attr "type")
(if_then_else (ne (symbol_ref "<Is_float_mode>") (const_int 0))
- (if_then_else (ne (symbol_ref "<Is_d_reg>") (const_int 0))
- (const_string "neon_fp_vadd_ddd_vabs_dd")
- (const_string "neon_fp_vadd_qqq_vabs_qq"))
- (const_string "neon_int_5")))]
+ (const_string "neon_fp_abd_s<q>")
+ (const_string "neon_abd<q>")))]
)
;; Copy from core-to-neon regs, then extend, not vice-versa