diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -1353,6 +1353,10 @@ defm LSL_ZPmI : sve_int_bin_pred_shift_imm_left_dup< 0b0011, "lsl", "LSL_ZPZI", int_aarch64_sve_lsl>; defm ASRD_ZPmI : sve_int_bin_pred_shift_imm_right< 0b0100, "asrd", "ASRD_ZPZI", int_aarch64_sve_asrd>; + defm ASR_ZPZI : sve_int_shift_pred_bhsd; + defm LSR_ZPZI : sve_int_shift_pred_bhsd; + defm LSL_ZPZI : sve_int_shift_pred_bhsd; + let Predicates = [HasSVE, UseExperimentalZeroingPseudos] in { defm ASR_ZPZZ : sve_int_bin_pred_zeroing_bhsd; defm LSR_ZPZZ : sve_int_bin_pred_zeroing_bhsd; diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -7893,3 +7893,19 @@ def : SVE_3_Op_Pat(NAME # _UNDEF_S)>; def : SVE_3_Op_Pat(NAME # _UNDEF_D)>; } + +// Predicated pseudo integer two operand instructions. Second operand is an +// immediate specified by imm_[bhsd]. +multiclass sve_int_shift_pred_bhsd { + def _UNDEF_B : PredTwoOpImmPseudo, FalseLanesUndef>; + def _UNDEF_H : PredTwoOpImmPseudo, FalseLanesUndef>; + def _UNDEF_S : PredTwoOpImmPseudo, FalseLanesUndef>; + def _UNDEF_D : PredTwoOpImmPseudo, FalseLanesUndef>; + + def : SVE_Shift_DupImm_Pred_Pat(NAME # _UNDEF_B)>; + def : SVE_Shift_DupImm_Pred_Pat(NAME # _UNDEF_H)>; + def : SVE_Shift_DupImm_Pred_Pat(NAME # _UNDEF_S)>; + def : SVE_Shift_DupImm_Pred_Pat(NAME # _UNDEF_D)>; +} diff --git a/llvm/test/CodeGen/AArch64/sve-fixed-length-int-immediates.ll b/llvm/test/CodeGen/AArch64/sve-fixed-length-int-immediates.ll --- a/llvm/test/CodeGen/AArch64/sve-fixed-length-int-immediates.ll +++ b/llvm/test/CodeGen/AArch64/sve-fixed-length-int-immediates.ll @@ -156,8 +156,7 @@ ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.b, vl64 ; CHECK-NEXT: ld1b { z0.b }, p0/z, [x0] -; CHECK-NEXT: mov z1.b, #7 // =0x7 -; CHECK-NEXT: asr z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: asr z0.b, p0/m, z0.b, #7 ; CHECK-NEXT: st1b { z0.b }, p0, [x0] ; CHECK-NEXT: ret %op1 = load <64 x i8>, <64 x i8>* %a @@ -173,8 +172,7 @@ ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h, vl32 ; CHECK-NEXT: ld1h { z0.h }, p0/z, [x0] -; CHECK-NEXT: mov z1.h, #15 // =0xf -; CHECK-NEXT: asr z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: asr z0.h, p0/m, z0.h, #15 ; CHECK-NEXT: st1h { z0.h }, p0, [x0] ; CHECK-NEXT: ret %op1 = load <32 x i16>, <32 x i16>* %a @@ -190,8 +188,7 @@ ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s, vl16 ; CHECK-NEXT: ld1w { z0.s }, p0/z, [x0] -; CHECK-NEXT: mov z1.s, #31 // =0x1f -; CHECK-NEXT: asr z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: asr z0.s, p0/m, z0.s, #31 ; CHECK-NEXT: st1w { z0.s }, p0, [x0] ; CHECK-NEXT: ret %op1 = load <16 x i32>, <16 x i32>* %a @@ -207,8 +204,7 @@ ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d, vl8 ; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0] -; CHECK-NEXT: mov z1.d, #63 // =0x3f -; CHECK-NEXT: asr z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: asr z0.d, p0/m, z0.d, #63 ; CHECK-NEXT: st1d { z0.d }, p0, [x0] ; CHECK-NEXT: ret %op1 = load <8 x i64>, <8 x i64>* %a @@ -304,8 +300,7 @@ ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.b, vl64 ; CHECK-NEXT: ld1b { z0.b }, p0/z, [x0] -; CHECK-NEXT: mov z1.b, #7 // =0x7 -; CHECK-NEXT: lsr z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: lsr z0.b, p0/m, z0.b, #7 ; CHECK-NEXT: st1b { z0.b }, p0, [x0] ; CHECK-NEXT: ret %op1 = load <64 x i8>, <64 x i8>* %a @@ -321,8 +316,7 @@ ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h, vl32 ; CHECK-NEXT: ld1h { z0.h }, p0/z, [x0] -; CHECK-NEXT: mov z1.h, #15 // =0xf -; CHECK-NEXT: lsr z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: lsr z0.h, p0/m, z0.h, #15 ; CHECK-NEXT: st1h { z0.h }, p0, [x0] ; CHECK-NEXT: ret %op1 = load <32 x i16>, <32 x i16>* %a @@ -338,8 +332,7 @@ ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s, vl16 ; CHECK-NEXT: ld1w { z0.s }, p0/z, [x0] -; CHECK-NEXT: mov z1.s, #31 // =0x1f -; CHECK-NEXT: lsr z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: lsr z0.s, p0/m, z0.s, #31 ; CHECK-NEXT: st1w { z0.s }, p0, [x0] ; CHECK-NEXT: ret %op1 = load <16 x i32>, <16 x i32>* %a @@ -355,8 +348,7 @@ ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d, vl8 ; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0] -; CHECK-NEXT: mov z1.d, #63 // =0x3f -; CHECK-NEXT: lsr z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: lsr z0.d, p0/m, z0.d, #63 ; CHECK-NEXT: st1d { z0.d }, p0, [x0] ; CHECK-NEXT: ret %op1 = load <8 x i64>, <8 x i64>* %a @@ -516,8 +508,7 @@ ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.b, vl64 ; CHECK-NEXT: ld1b { z0.b }, p0/z, [x0] -; CHECK-NEXT: mov z1.b, #7 // =0x7 -; CHECK-NEXT: lsl z0.b, p0/m, z0.b, z1.b +; CHECK-NEXT: lsl z0.b, p0/m, z0.b, #7 ; CHECK-NEXT: st1b { z0.b }, p0, [x0] ; CHECK-NEXT: ret %op1 = load <64 x i8>, <64 x i8>* %a @@ -533,8 +524,7 @@ ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h, vl32 ; CHECK-NEXT: ld1h { z0.h }, p0/z, [x0] -; CHECK-NEXT: mov z1.h, #15 // =0xf -; CHECK-NEXT: lsl z0.h, p0/m, z0.h, z1.h +; CHECK-NEXT: lsl z0.h, p0/m, z0.h, #15 ; CHECK-NEXT: st1h { z0.h }, p0, [x0] ; CHECK-NEXT: ret %op1 = load <32 x i16>, <32 x i16>* %a @@ -550,8 +540,7 @@ ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s, vl16 ; CHECK-NEXT: ld1w { z0.s }, p0/z, [x0] -; CHECK-NEXT: mov z1.s, #31 // =0x1f -; CHECK-NEXT: lsl z0.s, p0/m, z0.s, z1.s +; CHECK-NEXT: lsl z0.s, p0/m, z0.s, #31 ; CHECK-NEXT: st1w { z0.s }, p0, [x0] ; CHECK-NEXT: ret %op1 = load <16 x i32>, <16 x i32>* %a @@ -567,8 +556,7 @@ ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d, vl8 ; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0] -; CHECK-NEXT: mov z1.d, #63 // =0x3f -; CHECK-NEXT: lsl z0.d, p0/m, z0.d, z1.d +; CHECK-NEXT: lsl z0.d, p0/m, z0.d, #63 ; CHECK-NEXT: st1d { z0.d }, p0, [x0] ; CHECK-NEXT: ret %op1 = load <8 x i64>, <8 x i64>* %a