Index: llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td =================================================================== --- llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -1786,7 +1786,7 @@ defm UQSHL_ZPmI : sve_int_bin_pred_shift_imm_left< 0b0111, "uqshl", "UQSHL_ZPZI">; defm SRSHR_ZPmI : sve_int_bin_pred_shift_imm_right<0b1100, "srshr", "SRSHR_ZPZI", int_aarch64_sve_srshr>; defm URSHR_ZPmI : sve_int_bin_pred_shift_imm_right<0b1101, "urshr", "URSHR_ZPZI", int_aarch64_sve_urshr>; - defm SQSHLU_ZPmI : sve2_int_bin_pred_shift_imm_left< 0b1111, "sqshlu", int_aarch64_sve_sqshlu>; + defm SQSHLU_ZPmI : sve2_int_bin_pred_shift_imm_left< 0b1111, "sqshlu", "SQSHLU_ZPZI", int_aarch64_sve_sqshlu>; // SVE2 integer add/subtract long defm SADDLB_ZZZ : sve2_wide_int_arith_long<0b00000, "saddlb", int_aarch64_sve_saddlb>; Index: llvm/lib/Target/AArch64/SVEInstrFormats.td =================================================================== --- llvm/lib/Target/AArch64/SVEInstrFormats.td +++ llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -4728,19 +4728,39 @@ } multiclass sve2_int_bin_pred_shift_imm_left opc, string asm, + string psName, SDPatternOperator op> { - def _B : sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>; - def _H : sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> { + + def _B : SVEPseudo2Instr, sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>; + def _H : SVEPseudo2Instr, + sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> { let Inst{8} = imm{3}; } - def _S : sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32> { + def _S : SVEPseudo2Instr, + sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32> { let Inst{9-8} = imm{4-3}; } - def _D : sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64> { + def _D : SVEPseudo2Instr, + sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64> { let Inst{22} = imm{5}; let Inst{9-8} = imm{4-3}; } + def _B_Z_UNDEF : PredTwoOpImmPseudo; + def _H_Z_UNDEF : PredTwoOpImmPseudo; + def _S_Z_UNDEF : PredTwoOpImmPseudo; + def _D_Z_UNDEF : PredTwoOpImmPseudo; + + def _B_Z_ZERO : PredTwoOpImmPseudo; + def _H_Z_ZERO : PredTwoOpImmPseudo; + def _S_Z_ZERO : PredTwoOpImmPseudo; + def _D_Z_ZERO : PredTwoOpImmPseudo; + + def : SVE_3_Op_Pat_Shift_Imm_SelZero(NAME # _B_Z_ZERO)>; + def : SVE_3_Op_Pat_Shift_Imm_SelZero(NAME # _H_Z_ZERO)>; + def : SVE_3_Op_Pat_Shift_Imm_SelZero(NAME # _S_Z_ZERO)>; + def : SVE_3_Op_Pat_Shift_Imm_SelZero(NAME # _D_Z_ZERO)>; + def : SVE_3_Op_Imm_Pat(NAME # _B)>; def : SVE_3_Op_Imm_Pat(NAME # _H)>; def : SVE_3_Op_Imm_Pat(NAME # _S)>; Index: llvm/test/CodeGen/AArch64/sve2-intrinsics-uniform-dsp-zeroing.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/AArch64/sve2-intrinsics-uniform-dsp-zeroing.ll @@ -0,0 +1,58 @@ +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2 -asm-verbose=0 < %s | FileCheck %s + +; +; SQSHLU +; + +define @sqshlu_i8( %pg, %a) { +; CHECK-LABEL: sqshlu_i8: +; CHECK: movprfx z0.b, p0/z, z0.b +; CHECK-NEXT: sqshlu z0.b, p0/m, z0.b, #2 +; CHECK-NEXT: ret + %a_z = select %pg, %a, zeroinitializer + %out = call @llvm.aarch64.sve.sqshlu.nxv16i8( %pg, + %a_z, + i32 2) + ret %out +} + +define @sqshlu_i16( %pg, %a) { +; CHECK-LABEL: sqshlu_i16: +; CHECK: movprfx z0.h, p0/z, z0.h +; CHECK-NEXT: sqshlu z0.h, p0/m, z0.h, #3 +; CHECK-NEXT: ret + %a_z = select %pg, %a, zeroinitializer + %out = call @llvm.aarch64.sve.sqshlu.nxv8i16( %pg, + %a_z, + i32 3) + ret %out +} + +define @sqshlu_i32( %pg, %a) { +; CHECK-LABEL: sqshlu_i32: +; CHECK: movprfx z0.s, p0/z, z0.s +; CHECK-NEXT: sqshlu z0.s, p0/m, z0.s, #29 +; CHECK-NEXT: ret + %a_z = select %pg, %a, zeroinitializer + %out = call @llvm.aarch64.sve.sqshlu.nxv4i32( %pg, + %a_z, + i32 29) + ret %out +} + +define @sqshlu_i64( %pg, %a) { +; CHECK-LABEL: sqshlu_i64: +; CHECK: movprfx z0.d, p0/z, z0.d +; CHECK-NEXT: sqshlu z0.d, p0/m, z0.d, #62 +; CHECK-NEXT: ret + %a_z = select %pg, %a, zeroinitializer + %out = call @llvm.aarch64.sve.sqshlu.nxv2i64( %pg, + %a_z, + i32 62) + ret %out +} + +declare @llvm.aarch64.sve.sqshlu.nxv16i8(, , i32) +declare @llvm.aarch64.sve.sqshlu.nxv8i16(, , i32) +declare @llvm.aarch64.sve.sqshlu.nxv4i32(, , i32) +declare @llvm.aarch64.sve.sqshlu.nxv2i64(, , i32)