mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[AArch64][SVE] Add remaining SVE2 intrinsics for uniform DSP operations
Summary: Implements the following intrinsics: - @llvm.aarch64.sve.[s|u]qadd - @llvm.aarch64.sve.[s|u]qsub - @llvm.aarch64.sve.suqadd - @llvm.aarch64.sve.usqadd - @llvm.aarch64.sve.[s|u]qsubr - @llvm.aarch64.sve.[s|u]rshl - @llvm.aarch64.sve.[s|u]qshl - @llvm.aarch64.sve.[s|u]qrshl - @llvm.aarch64.sve.[s|u]rshr - @llvm.aarch64.sve.sqshlu - @llvm.aarch64.sve.sri - @llvm.aarch64.sve.sli - @llvm.aarch64.sve.[s|u]sra - @llvm.aarch64.sve.[s|u]rsra - @llvm.aarch64.sve.[s|u]aba Reviewers: efriedma, sdesmalen, dancgr, cameron.mcinally, c-rhodes, rengolin Reviewed By: sdesmalen Subscribers: tschuett, kristof.beyls, hiraditya, rkruppe, psnobl, cfe-commits, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D73551
This commit is contained in:
parent
566d6be8a6
commit
923e1a79ad
@ -1675,10 +1675,13 @@ def int_aarch64_sve_st1_scatter_scalar_offset : AdvSIMD_ScatterStore_VectorBase_
|
|||||||
// SVE2 - Uniform DSP operations
|
// SVE2 - Uniform DSP operations
|
||||||
//
|
//
|
||||||
|
|
||||||
|
def int_aarch64_sve_saba : AdvSIMD_3VectorArg_Intrinsic;
|
||||||
def int_aarch64_sve_shadd : AdvSIMD_Pred2VectorArg_Intrinsic;
|
def int_aarch64_sve_shadd : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
def int_aarch64_sve_shsub : AdvSIMD_Pred2VectorArg_Intrinsic;
|
def int_aarch64_sve_shsub : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
def int_aarch64_sve_shsubr : AdvSIMD_Pred2VectorArg_Intrinsic;
|
def int_aarch64_sve_shsubr : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_sli : AdvSIMD_2VectorArgIndexed_Intrinsic;
|
||||||
def int_aarch64_sve_sqabs : AdvSIMD_Merged1VectorArg_Intrinsic;
|
def int_aarch64_sve_sqabs : AdvSIMD_Merged1VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_sqadd : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
def int_aarch64_sve_sqdmulh : AdvSIMD_2VectorArg_Intrinsic;
|
def int_aarch64_sve_sqdmulh : AdvSIMD_2VectorArg_Intrinsic;
|
||||||
def int_aarch64_sve_sqdmulh_lane : AdvSIMD_2VectorArgIndexed_Intrinsic;
|
def int_aarch64_sve_sqdmulh_lane : AdvSIMD_2VectorArgIndexed_Intrinsic;
|
||||||
def int_aarch64_sve_sqneg : AdvSIMD_Merged1VectorArg_Intrinsic;
|
def int_aarch64_sve_sqneg : AdvSIMD_Merged1VectorArg_Intrinsic;
|
||||||
@ -1688,13 +1691,35 @@ def int_aarch64_sve_sqrdmlsh : AdvSIMD_3VectorArg_Intrinsic;
|
|||||||
def int_aarch64_sve_sqrdmlsh_lane : AdvSIMD_3VectorArgIndexed_Intrinsic;
|
def int_aarch64_sve_sqrdmlsh_lane : AdvSIMD_3VectorArgIndexed_Intrinsic;
|
||||||
def int_aarch64_sve_sqrdmulh : AdvSIMD_2VectorArg_Intrinsic;
|
def int_aarch64_sve_sqrdmulh : AdvSIMD_2VectorArg_Intrinsic;
|
||||||
def int_aarch64_sve_sqrdmulh_lane : AdvSIMD_2VectorArgIndexed_Intrinsic;
|
def int_aarch64_sve_sqrdmulh_lane : AdvSIMD_2VectorArgIndexed_Intrinsic;
|
||||||
|
def int_aarch64_sve_sqrshl : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_sqshl : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_sqshlu : AdvSIMD_SVE_ShiftByImm_Intrinsic;
|
||||||
|
def int_aarch64_sve_sqsub : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_sqsubr : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
def int_aarch64_sve_srhadd : AdvSIMD_Pred2VectorArg_Intrinsic;
|
def int_aarch64_sve_srhadd : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_sri : AdvSIMD_2VectorArgIndexed_Intrinsic;
|
||||||
|
def int_aarch64_sve_srshl : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_srshr : AdvSIMD_SVE_ShiftByImm_Intrinsic;
|
||||||
|
def int_aarch64_sve_srsra : AdvSIMD_2VectorArgIndexed_Intrinsic;
|
||||||
|
def int_aarch64_sve_ssra : AdvSIMD_2VectorArgIndexed_Intrinsic;
|
||||||
|
def int_aarch64_sve_suqadd : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_uaba : AdvSIMD_3VectorArg_Intrinsic;
|
||||||
def int_aarch64_sve_uhadd : AdvSIMD_Pred2VectorArg_Intrinsic;
|
def int_aarch64_sve_uhadd : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
def int_aarch64_sve_uhsub : AdvSIMD_Pred2VectorArg_Intrinsic;
|
def int_aarch64_sve_uhsub : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
def int_aarch64_sve_uhsubr : AdvSIMD_Pred2VectorArg_Intrinsic;
|
def int_aarch64_sve_uhsubr : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_uqadd : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_uqrshl : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_uqshl : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_uqsub : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_uqsubr : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
def int_aarch64_sve_urecpe : AdvSIMD_Merged1VectorArg_Intrinsic;
|
def int_aarch64_sve_urecpe : AdvSIMD_Merged1VectorArg_Intrinsic;
|
||||||
def int_aarch64_sve_urhadd : AdvSIMD_Pred2VectorArg_Intrinsic;
|
def int_aarch64_sve_urhadd : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_urshl : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_urshr : AdvSIMD_SVE_ShiftByImm_Intrinsic;
|
||||||
def int_aarch64_sve_ursqrte : AdvSIMD_Merged1VectorArg_Intrinsic;
|
def int_aarch64_sve_ursqrte : AdvSIMD_Merged1VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_ursra : AdvSIMD_2VectorArgIndexed_Intrinsic;
|
||||||
|
def int_aarch64_sve_usqadd : AdvSIMD_Pred2VectorArg_Intrinsic;
|
||||||
|
def int_aarch64_sve_usra : AdvSIMD_2VectorArgIndexed_Intrinsic;
|
||||||
|
|
||||||
//
|
//
|
||||||
// SVE2 - Non-widening pairwise arithmetic
|
// SVE2 - Non-widening pairwise arithmetic
|
||||||
|
@ -698,6 +698,37 @@ def vecshiftL64 : Operand<i32>, ImmLeaf<i32, [{
|
|||||||
let ParserMatchClass = Imm0_63Operand;
|
let ParserMatchClass = Imm0_63Operand;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Same as vecshiftL#N, but use TargetConstant (TimmLeaf) instead of Constant
|
||||||
|
// (ImmLeaf)
|
||||||
|
def tvecshiftL8 : Operand<i32>, TImmLeaf<i32, [{
|
||||||
|
return (((uint32_t)Imm) < 8);
|
||||||
|
}]> {
|
||||||
|
let EncoderMethod = "getVecShiftL8OpValue";
|
||||||
|
let DecoderMethod = "DecodeVecShiftL8Imm";
|
||||||
|
let ParserMatchClass = Imm0_7Operand;
|
||||||
|
}
|
||||||
|
def tvecshiftL16 : Operand<i32>, TImmLeaf<i32, [{
|
||||||
|
return (((uint32_t)Imm) < 16);
|
||||||
|
}]> {
|
||||||
|
let EncoderMethod = "getVecShiftL16OpValue";
|
||||||
|
let DecoderMethod = "DecodeVecShiftL16Imm";
|
||||||
|
let ParserMatchClass = Imm0_15Operand;
|
||||||
|
}
|
||||||
|
def tvecshiftL32 : Operand<i32>, TImmLeaf<i32, [{
|
||||||
|
return (((uint32_t)Imm) < 32);
|
||||||
|
}]> {
|
||||||
|
let EncoderMethod = "getVecShiftL32OpValue";
|
||||||
|
let DecoderMethod = "DecodeVecShiftL32Imm";
|
||||||
|
let ParserMatchClass = Imm0_31Operand;
|
||||||
|
}
|
||||||
|
def tvecshiftL64 : Operand<i32>, TImmLeaf<i32, [{
|
||||||
|
return (((uint32_t)Imm) < 64);
|
||||||
|
}]> {
|
||||||
|
let EncoderMethod = "getVecShiftL64OpValue";
|
||||||
|
let DecoderMethod = "DecodeVecShiftL64Imm";
|
||||||
|
let ParserMatchClass = Imm0_63Operand;
|
||||||
|
}
|
||||||
|
|
||||||
// Crazy immediate formats used by 32-bit and 64-bit logical immediate
|
// Crazy immediate formats used by 32-bit and 64-bit logical immediate
|
||||||
// instructions for splatting repeating bit patterns across the immediate.
|
// instructions for splatting repeating bit patterns across the immediate.
|
||||||
def logical_imm32_XFORM : SDNodeXForm<imm, [{
|
def logical_imm32_XFORM : SDNodeXForm<imm, [{
|
||||||
|
@ -1530,35 +1530,35 @@ let Predicates = [HasSVE2] in {
|
|||||||
defm SQNEG_ZPmZ : sve2_int_un_pred_arit<0b101, "sqneg", int_aarch64_sve_sqneg>;
|
defm SQNEG_ZPmZ : sve2_int_un_pred_arit<0b101, "sqneg", int_aarch64_sve_sqneg>;
|
||||||
|
|
||||||
// SVE2 saturating add/subtract
|
// SVE2 saturating add/subtract
|
||||||
defm SQADD_ZPmZ : sve2_int_arith_pred<0b110000, "sqadd", null_frag>;
|
defm SQADD_ZPmZ : sve2_int_arith_pred<0b110000, "sqadd", int_aarch64_sve_sqadd>;
|
||||||
defm UQADD_ZPmZ : sve2_int_arith_pred<0b110010, "uqadd", null_frag>;
|
defm UQADD_ZPmZ : sve2_int_arith_pred<0b110010, "uqadd", int_aarch64_sve_uqadd>;
|
||||||
defm SQSUB_ZPmZ : sve2_int_arith_pred<0b110100, "sqsub", null_frag>;
|
defm SQSUB_ZPmZ : sve2_int_arith_pred<0b110100, "sqsub", int_aarch64_sve_sqsub>;
|
||||||
defm UQSUB_ZPmZ : sve2_int_arith_pred<0b110110, "uqsub", null_frag>;
|
defm UQSUB_ZPmZ : sve2_int_arith_pred<0b110110, "uqsub", int_aarch64_sve_uqsub>;
|
||||||
defm SUQADD_ZPmZ : sve2_int_arith_pred<0b111000, "suqadd", null_frag>;
|
defm SUQADD_ZPmZ : sve2_int_arith_pred<0b111000, "suqadd", int_aarch64_sve_suqadd>;
|
||||||
defm USQADD_ZPmZ : sve2_int_arith_pred<0b111010, "usqadd", null_frag>;
|
defm USQADD_ZPmZ : sve2_int_arith_pred<0b111010, "usqadd", int_aarch64_sve_usqadd>;
|
||||||
defm SQSUBR_ZPmZ : sve2_int_arith_pred<0b111100, "sqsubr", null_frag>;
|
defm SQSUBR_ZPmZ : sve2_int_arith_pred<0b111100, "sqsubr", int_aarch64_sve_sqsubr>;
|
||||||
defm UQSUBR_ZPmZ : sve2_int_arith_pred<0b111110, "uqsubr", null_frag>;
|
defm UQSUBR_ZPmZ : sve2_int_arith_pred<0b111110, "uqsubr", int_aarch64_sve_uqsubr>;
|
||||||
|
|
||||||
// SVE2 saturating/rounding bitwise shift left (predicated)
|
// SVE2 saturating/rounding bitwise shift left (predicated)
|
||||||
defm SRSHL_ZPmZ : sve2_int_arith_pred<0b000100, "srshl", null_frag>;
|
defm SRSHL_ZPmZ : sve2_int_arith_pred<0b000100, "srshl", int_aarch64_sve_srshl>;
|
||||||
defm URSHL_ZPmZ : sve2_int_arith_pred<0b000110, "urshl", null_frag>;
|
defm URSHL_ZPmZ : sve2_int_arith_pred<0b000110, "urshl", int_aarch64_sve_urshl>;
|
||||||
defm SRSHLR_ZPmZ : sve2_int_arith_pred<0b001100, "srshlr", null_frag>;
|
defm SRSHLR_ZPmZ : sve2_int_arith_pred<0b001100, "srshlr", null_frag>;
|
||||||
defm URSHLR_ZPmZ : sve2_int_arith_pred<0b001110, "urshlr", null_frag>;
|
defm URSHLR_ZPmZ : sve2_int_arith_pred<0b001110, "urshlr", null_frag>;
|
||||||
defm SQSHL_ZPmZ : sve2_int_arith_pred<0b010000, "sqshl", null_frag>;
|
defm SQSHL_ZPmZ : sve2_int_arith_pred<0b010000, "sqshl", int_aarch64_sve_sqshl>;
|
||||||
defm UQSHL_ZPmZ : sve2_int_arith_pred<0b010010, "uqshl", null_frag>;
|
defm UQSHL_ZPmZ : sve2_int_arith_pred<0b010010, "uqshl", int_aarch64_sve_uqshl>;
|
||||||
defm SQRSHL_ZPmZ : sve2_int_arith_pred<0b010100, "sqrshl", null_frag>;
|
defm SQRSHL_ZPmZ : sve2_int_arith_pred<0b010100, "sqrshl", int_aarch64_sve_sqrshl>;
|
||||||
defm UQRSHL_ZPmZ : sve2_int_arith_pred<0b010110, "uqrshl", null_frag>;
|
defm UQRSHL_ZPmZ : sve2_int_arith_pred<0b010110, "uqrshl", int_aarch64_sve_uqrshl>;
|
||||||
defm SQSHLR_ZPmZ : sve2_int_arith_pred<0b011000, "sqshlr", null_frag>;
|
defm SQSHLR_ZPmZ : sve2_int_arith_pred<0b011000, "sqshlr", null_frag>;
|
||||||
defm UQSHLR_ZPmZ : sve2_int_arith_pred<0b011010, "uqshlr", null_frag>;
|
defm UQSHLR_ZPmZ : sve2_int_arith_pred<0b011010, "uqshlr", null_frag>;
|
||||||
defm SQRSHLR_ZPmZ : sve2_int_arith_pred<0b011100, "sqrshlr", null_frag>;
|
defm SQRSHLR_ZPmZ : sve2_int_arith_pred<0b011100, "sqrshlr", null_frag>;
|
||||||
defm UQRSHLR_ZPmZ : sve2_int_arith_pred<0b011110, "uqrshlr", null_frag>;
|
defm UQRSHLR_ZPmZ : sve2_int_arith_pred<0b011110, "uqrshlr", null_frag>;
|
||||||
|
|
||||||
// SVE2 predicated shifts
|
// SVE2 predicated shifts
|
||||||
defm SQSHL_ZPmI : sve_int_bin_pred_shift_imm_left< 0b0110, "sqshl">;
|
defm SQSHL_ZPmI : sve_int_bin_pred_shift_imm_left< 0b0110, "sqshl">;
|
||||||
defm UQSHL_ZPmI : sve_int_bin_pred_shift_imm_left< 0b0111, "uqshl">;
|
defm UQSHL_ZPmI : sve_int_bin_pred_shift_imm_left< 0b0111, "uqshl">;
|
||||||
defm SRSHR_ZPmI : sve_int_bin_pred_shift_imm_right<0b1100, "srshr">;
|
defm SRSHR_ZPmI : sve_int_bin_pred_shift_imm_right<0b1100, "srshr", int_aarch64_sve_srshr>;
|
||||||
defm URSHR_ZPmI : sve_int_bin_pred_shift_imm_right<0b1101, "urshr">;
|
defm URSHR_ZPmI : sve_int_bin_pred_shift_imm_right<0b1101, "urshr", int_aarch64_sve_urshr>;
|
||||||
defm SQSHLU_ZPmI : sve_int_bin_pred_shift_imm_left< 0b1111, "sqshlu">;
|
defm SQSHLU_ZPmI : sve2_int_bin_pred_shift_imm_left< 0b1111, "sqshlu", int_aarch64_sve_sqshlu>;
|
||||||
|
|
||||||
// SVE2 integer add/subtract long
|
// SVE2 integer add/subtract long
|
||||||
defm SADDLB_ZZZ : sve2_wide_int_arith_long<0b00000, "saddlb">;
|
defm SADDLB_ZZZ : sve2_wide_int_arith_long<0b00000, "saddlb">;
|
||||||
@ -1595,22 +1595,22 @@ let Predicates = [HasSVE2] in {
|
|||||||
defm PMULLT_ZZZ : sve2_pmul_long<0b1, "pmullt">;
|
defm PMULLT_ZZZ : sve2_pmul_long<0b1, "pmullt">;
|
||||||
|
|
||||||
// SVE2 bitwise shift and insert
|
// SVE2 bitwise shift and insert
|
||||||
defm SRI_ZZI : sve2_int_bin_shift_imm_right<0b0, "sri">;
|
defm SRI_ZZI : sve2_int_bin_shift_imm_right<0b0, "sri", int_aarch64_sve_sri>;
|
||||||
defm SLI_ZZI : sve2_int_bin_shift_imm_left< 0b1, "sli">;
|
defm SLI_ZZI : sve2_int_bin_shift_imm_left< 0b1, "sli", int_aarch64_sve_sli>;
|
||||||
|
|
||||||
// SVE2 bitwise shift right and accumulate
|
// SVE2 bitwise shift right and accumulate
|
||||||
defm SSRA_ZZI : sve2_int_bin_accum_shift_imm_right<0b00, "ssra">;
|
defm SSRA_ZZI : sve2_int_bin_accum_shift_imm_right<0b00, "ssra", int_aarch64_sve_ssra>;
|
||||||
defm USRA_ZZI : sve2_int_bin_accum_shift_imm_right<0b01, "usra">;
|
defm USRA_ZZI : sve2_int_bin_accum_shift_imm_right<0b01, "usra", int_aarch64_sve_usra>;
|
||||||
defm SRSRA_ZZI : sve2_int_bin_accum_shift_imm_right<0b10, "srsra">;
|
defm SRSRA_ZZI : sve2_int_bin_accum_shift_imm_right<0b10, "srsra", int_aarch64_sve_srsra>;
|
||||||
defm URSRA_ZZI : sve2_int_bin_accum_shift_imm_right<0b11, "ursra">;
|
defm URSRA_ZZI : sve2_int_bin_accum_shift_imm_right<0b11, "ursra", int_aarch64_sve_ursra>;
|
||||||
|
|
||||||
// SVE2 complex integer add
|
// SVE2 complex integer add
|
||||||
defm CADD_ZZI : sve2_int_cadd<0b0, "cadd">;
|
defm CADD_ZZI : sve2_int_cadd<0b0, "cadd">;
|
||||||
defm SQCADD_ZZI : sve2_int_cadd<0b1, "sqcadd">;
|
defm SQCADD_ZZI : sve2_int_cadd<0b1, "sqcadd">;
|
||||||
|
|
||||||
// SVE2 integer absolute difference and accumulate
|
// SVE2 integer absolute difference and accumulate
|
||||||
defm SABA_ZZZ : sve2_int_absdiff_accum<0b0, "saba">;
|
defm SABA_ZZZ : sve2_int_absdiff_accum<0b0, "saba", int_aarch64_sve_saba>;
|
||||||
defm UABA_ZZZ : sve2_int_absdiff_accum<0b1, "uaba">;
|
defm UABA_ZZZ : sve2_int_absdiff_accum<0b1, "uaba", int_aarch64_sve_uaba>;
|
||||||
|
|
||||||
// SVE2 integer absolute difference and accumulate long
|
// SVE2 integer absolute difference and accumulate long
|
||||||
defm SABALB_ZZZ : sve2_int_absdiff_accum_long<0b00, "sabalb">;
|
defm SABALB_ZZZ : sve2_int_absdiff_accum_long<0b00, "sabalb">;
|
||||||
|
@ -2988,7 +2988,8 @@ class sve2_int_bin_shift_imm<bits<4> tsz8_64, bit opc, string asm,
|
|||||||
let Constraints = "$Zd = $_Zd";
|
let Constraints = "$Zd = $_Zd";
|
||||||
}
|
}
|
||||||
|
|
||||||
multiclass sve2_int_bin_shift_imm_left<bit opc, string asm> {
|
multiclass sve2_int_bin_shift_imm_left<bit opc, string asm,
|
||||||
|
SDPatternOperator op> {
|
||||||
def _B : sve2_int_bin_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>;
|
def _B : sve2_int_bin_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>;
|
||||||
def _H : sve2_int_bin_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> {
|
def _H : sve2_int_bin_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> {
|
||||||
let Inst{19} = imm{3};
|
let Inst{19} = imm{3};
|
||||||
@ -3000,9 +3001,15 @@ multiclass sve2_int_bin_shift_imm_left<bit opc, string asm> {
|
|||||||
let Inst{22} = imm{5};
|
let Inst{22} = imm{5};
|
||||||
let Inst{20-19} = imm{4-3};
|
let Inst{20-19} = imm{4-3};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, tvecshiftL8, !cast<Instruction>(NAME # _B)>;
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, tvecshiftL16, !cast<Instruction>(NAME # _H)>;
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, tvecshiftL32, !cast<Instruction>(NAME # _S)>;
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, tvecshiftL64, !cast<Instruction>(NAME # _D)>;
|
||||||
}
|
}
|
||||||
|
|
||||||
multiclass sve2_int_bin_shift_imm_right<bit opc, string asm> {
|
multiclass sve2_int_bin_shift_imm_right<bit opc, string asm,
|
||||||
|
SDPatternOperator op> {
|
||||||
def _B : sve2_int_bin_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
|
def _B : sve2_int_bin_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
|
||||||
def _H : sve2_int_bin_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
|
def _H : sve2_int_bin_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
|
||||||
let Inst{19} = imm{3};
|
let Inst{19} = imm{3};
|
||||||
@ -3014,6 +3021,11 @@ multiclass sve2_int_bin_shift_imm_right<bit opc, string asm> {
|
|||||||
let Inst{22} = imm{5};
|
let Inst{22} = imm{5};
|
||||||
let Inst{20-19} = imm{4-3};
|
let Inst{20-19} = imm{4-3};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, tvecshiftR8, !cast<Instruction>(NAME # _B)>;
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, tvecshiftR64, !cast<Instruction>(NAME # _D)>;
|
||||||
}
|
}
|
||||||
|
|
||||||
class sve2_int_bin_accum_shift_imm<bits<4> tsz8_64, bits<2> opc, string asm,
|
class sve2_int_bin_accum_shift_imm<bits<4> tsz8_64, bits<2> opc, string asm,
|
||||||
@ -3039,7 +3051,8 @@ class sve2_int_bin_accum_shift_imm<bits<4> tsz8_64, bits<2> opc, string asm,
|
|||||||
let ElementSize = ElementSizeNone;
|
let ElementSize = ElementSizeNone;
|
||||||
}
|
}
|
||||||
|
|
||||||
multiclass sve2_int_bin_accum_shift_imm_right<bits<2> opc, string asm> {
|
multiclass sve2_int_bin_accum_shift_imm_right<bits<2> opc, string asm,
|
||||||
|
SDPatternOperator op> {
|
||||||
def _B : sve2_int_bin_accum_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
|
def _B : sve2_int_bin_accum_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
|
||||||
def _H : sve2_int_bin_accum_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
|
def _H : sve2_int_bin_accum_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
|
||||||
let Inst{19} = imm{3};
|
let Inst{19} = imm{3};
|
||||||
@ -3051,6 +3064,11 @@ multiclass sve2_int_bin_accum_shift_imm_right<bits<2> opc, string asm> {
|
|||||||
let Inst{22} = imm{5};
|
let Inst{22} = imm{5};
|
||||||
let Inst{20-19} = imm{4-3};
|
let Inst{20-19} = imm{4-3};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, tvecshiftR8, !cast<Instruction>(NAME # _B)>;
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, tvecshiftR64, !cast<Instruction>(NAME # _D)>;
|
||||||
}
|
}
|
||||||
|
|
||||||
class sve2_int_cadd<bits<2> sz, bit opc, string asm, ZPRRegOp zprty>
|
class sve2_int_cadd<bits<2> sz, bit opc, string asm, ZPRRegOp zprty>
|
||||||
@ -3101,11 +3119,16 @@ class sve2_int_absdiff_accum<bits<2> sz, bits<4> opc, string asm,
|
|||||||
let ElementSize = ElementSizeNone;
|
let ElementSize = ElementSizeNone;
|
||||||
}
|
}
|
||||||
|
|
||||||
multiclass sve2_int_absdiff_accum<bit opc, string asm> {
|
multiclass sve2_int_absdiff_accum<bit opc, string asm, SDPatternOperator op> {
|
||||||
def _B : sve2_int_absdiff_accum<0b00, { 0b111, opc }, asm, ZPR8, ZPR8>;
|
def _B : sve2_int_absdiff_accum<0b00, { 0b111, opc }, asm, ZPR8, ZPR8>;
|
||||||
def _H : sve2_int_absdiff_accum<0b01, { 0b111, opc }, asm, ZPR16, ZPR16>;
|
def _H : sve2_int_absdiff_accum<0b01, { 0b111, opc }, asm, ZPR16, ZPR16>;
|
||||||
def _S : sve2_int_absdiff_accum<0b10, { 0b111, opc }, asm, ZPR32, ZPR32>;
|
def _S : sve2_int_absdiff_accum<0b10, { 0b111, opc }, asm, ZPR32, ZPR32>;
|
||||||
def _D : sve2_int_absdiff_accum<0b11, { 0b111, opc }, asm, ZPR64, ZPR64>;
|
def _D : sve2_int_absdiff_accum<0b11, { 0b111, opc }, asm, ZPR64, ZPR64>;
|
||||||
|
|
||||||
|
def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
|
||||||
|
def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
|
||||||
|
def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
|
||||||
|
def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
|
||||||
}
|
}
|
||||||
|
|
||||||
multiclass sve2_int_absdiff_accum_long<bits<2> opc, string asm> {
|
multiclass sve2_int_absdiff_accum_long<bits<2> opc, string asm> {
|
||||||
@ -4391,8 +4414,7 @@ multiclass sve_int_index_rr<string asm> {
|
|||||||
// SVE Bitwise Shift - Predicated Group
|
// SVE Bitwise Shift - Predicated Group
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
class sve_int_bin_pred_shift_imm<bits<4> tsz8_64, bits<4> opc, string asm,
|
class sve_int_bin_pred_shift_imm<bits<4> tsz8_64, bits<4> opc, string asm,
|
||||||
ZPRRegOp zprty, Operand immtype,
|
ZPRRegOp zprty, Operand immtype>
|
||||||
ElementSizeEnum size>
|
|
||||||
: I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, immtype:$imm),
|
: I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, immtype:$imm),
|
||||||
asm, "\t$Zdn, $Pg/m, $_Zdn, $imm",
|
asm, "\t$Zdn, $Pg/m, $_Zdn, $imm",
|
||||||
"",
|
"",
|
||||||
@ -4412,41 +4434,53 @@ class sve_int_bin_pred_shift_imm<bits<4> tsz8_64, bits<4> opc, string asm,
|
|||||||
|
|
||||||
let Constraints = "$Zdn = $_Zdn";
|
let Constraints = "$Zdn = $_Zdn";
|
||||||
let DestructiveInstType = DestructiveOther;
|
let DestructiveInstType = DestructiveOther;
|
||||||
let ElementSize = size;
|
let ElementSize = zprty.ElementSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
multiclass sve_int_bin_pred_shift_imm_left<bits<4> opc, string asm> {
|
multiclass sve_int_bin_pred_shift_imm_left<bits<4> opc, string asm> {
|
||||||
def _B : sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8,
|
def _B : sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>;
|
||||||
ElementSizeB>;
|
def _H : sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> {
|
||||||
def _H : sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16,
|
|
||||||
ElementSizeH> {
|
|
||||||
let Inst{8} = imm{3};
|
let Inst{8} = imm{3};
|
||||||
}
|
}
|
||||||
def _S : sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32,
|
def _S : sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32> {
|
||||||
ElementSizeS> {
|
|
||||||
let Inst{9-8} = imm{4-3};
|
let Inst{9-8} = imm{4-3};
|
||||||
}
|
}
|
||||||
def _D : sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64,
|
def _D : sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64> {
|
||||||
ElementSizeD> {
|
|
||||||
let Inst{22} = imm{5};
|
let Inst{22} = imm{5};
|
||||||
let Inst{9-8} = imm{4-3};
|
let Inst{9-8} = imm{4-3};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
multiclass sve_int_bin_pred_shift_imm_right<bits<4> opc, string asm,
|
multiclass sve2_int_bin_pred_shift_imm_left<bits<4> opc, string asm,
|
||||||
SDPatternOperator op = null_frag> {
|
SDPatternOperator op> {
|
||||||
def _B : sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8,
|
def _B : sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>;
|
||||||
ElementSizeB>;
|
def _H : sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> {
|
||||||
def _H : sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16,
|
|
||||||
ElementSizeH> {
|
|
||||||
let Inst{8} = imm{3};
|
let Inst{8} = imm{3};
|
||||||
}
|
}
|
||||||
def _S : sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32,
|
def _S : sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32> {
|
||||||
ElementSizeS> {
|
|
||||||
let Inst{9-8} = imm{4-3};
|
let Inst{9-8} = imm{4-3};
|
||||||
}
|
}
|
||||||
def _D : sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64,
|
def _D : sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64> {
|
||||||
ElementSizeD> {
|
let Inst{22} = imm{5};
|
||||||
|
let Inst{9-8} = imm{4-3};
|
||||||
|
}
|
||||||
|
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i1, nxv16i8, i32, tvecshiftL8, !cast<Instruction>(NAME # _B)>;
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i1, nxv8i16, i32, tvecshiftL16, !cast<Instruction>(NAME # _H)>;
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i1, nxv4i32, i32, tvecshiftL32, !cast<Instruction>(NAME # _S)>;
|
||||||
|
def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i1, nxv2i64, i32, tvecshiftL64, !cast<Instruction>(NAME # _D)>;
|
||||||
|
}
|
||||||
|
|
||||||
|
multiclass sve_int_bin_pred_shift_imm_right<bits<4> opc, string asm,
|
||||||
|
SDPatternOperator op = null_frag> {
|
||||||
|
def _B : sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
|
||||||
|
def _H : sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
|
||||||
|
let Inst{8} = imm{3};
|
||||||
|
}
|
||||||
|
def _S : sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32> {
|
||||||
|
let Inst{9-8} = imm{4-3};
|
||||||
|
}
|
||||||
|
def _D : sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64> {
|
||||||
let Inst{22} = imm{5};
|
let Inst{22} = imm{5};
|
||||||
let Inst{9-8} = imm{4-3};
|
let Inst{9-8} = imm{4-3};
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user