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 @@ -2492,6 +2492,19 @@ (EXT_ZZI ZPR:$Z1, ZPR:$Z2, sve_ext_imm_0_3:$index)>; def : Pat<(nxv2i64 (vector_splice (nxv2i64 ZPR:$Z1), (nxv2i64 ZPR:$Z2), (i64 (sve_ext_imm_0_1 i32:$index)))), (EXT_ZZI ZPR:$Z1, ZPR:$Z2, sve_ext_imm_0_1:$index)>; + + def : Pat<(sext_inreg (vector_extract (nxv16i8 ZPR:$vec), VectorIndexH:$index), i8), + (i32 (SMOVvi8to32 (v16i8 (EXTRACT_SUBREG ZPR:$vec, zsub)), VectorIndexB:$index))>; + def : Pat<(sext_inreg (anyext (vector_extract (nxv16i8 ZPR:$vec), VectorIndexH:$index)), i8), + (i64 (SMOVvi8to64 (v16i8 (EXTRACT_SUBREG ZPR:$vec, zsub)), VectorIndexB:$index))>; + + def : Pat<(sext_inreg (vector_extract (nxv8i16 ZPR:$vec), VectorIndexH:$index), i16), + (i32 (SMOVvi16to32 (v8i16 (EXTRACT_SUBREG ZPR:$vec, zsub)), VectorIndexB:$index))>; + def : Pat<(sext_inreg (anyext (vector_extract (nxv8i16 ZPR:$vec), VectorIndexH:$index)), i16), + (i64 (SMOVvi16to64 (v8i16 (EXTRACT_SUBREG ZPR:$vec, zsub)), VectorIndexB:$index))>; + + def : Pat<(sext (vector_extract (nxv4i32 ZPR:$vec), VectorIndexH:$index)), + (i64 (SMOVvi32to64 (v4i32 (EXTRACT_SUBREG ZPR:$vec, zsub)), VectorIndexB:$index))>; } // End HasSVEorStreamingSVE let Predicates = [HasSVE, HasMatMulInt8] in { diff --git a/llvm/test/CodeGen/AArch64/aarch64-smov-gen.ll b/llvm/test/CodeGen/AArch64/aarch64-smov-gen.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/aarch64-smov-gen.ll @@ -0,0 +1,85 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc --mtriple=aarch64-arm-none-eabi --march=aarch64 --mattr=+sve < %s | FileCheck %s + + +define dso_local i32 @_Z7foo8_32u10__SVInt8_t( %a) local_unnamed_addr #0 { +; CHECK-LABEL: _Z7foo8_32u10__SVInt8_t: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.b +; CHECK-NEXT: sminv b0, p0, z0.b +; CHECK-NEXT: smov w0, v0.b[0] +; CHECK-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) + %1 = tail call i8 @llvm.aarch64.sve.sminv.nxv16i8( %0, %a) + %conv = sext i8 %1 to i32 + ret i32 %conv +} + +declare @llvm.aarch64.sve.ptrue.nxv16i1(i32 immarg) #1 + +declare i8 @llvm.aarch64.sve.sminv.nxv16i8(, ) #1 + +define dso_local i64 @_Z7foo8_64u10__SVInt8_t( %a) local_unnamed_addr #0 { +; CHECK-LABEL: _Z7foo8_64u10__SVInt8_t: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.b +; CHECK-NEXT: sminv b0, p0, z0.b +; CHECK-NEXT: smov x0, v0.b[0] +; CHECK-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) + %1 = tail call i8 @llvm.aarch64.sve.sminv.nxv16i8( %0, %a) + %conv = sext i8 %1 to i64 + ret i64 %conv +} + +define dso_local i32 @_Z8foo16_32u11__SVInt16_t( %a) local_unnamed_addr #0 { +; CHECK-LABEL: _Z8foo16_32u11__SVInt16_t: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: sminv h0, p0, z0.h +; CHECK-NEXT: smov w0, v0.h[0] +; CHECK-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %1 = tail call i16 @llvm.aarch64.sve.sminv.nxv8i16( %0, %a) + %conv = sext i16 %1 to i32 + ret i32 %conv +} + +declare @llvm.aarch64.sve.ptrue.nxv8i1(i32 immarg) #1 + +declare i16 @llvm.aarch64.sve.sminv.nxv8i16(, ) #1 + +define dso_local i64 @_Z8foo16_64u11__SVInt16_t( %a) local_unnamed_addr #0 { +; CHECK-LABEL: _Z8foo16_64u11__SVInt16_t: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: sminv h0, p0, z0.h +; CHECK-NEXT: smov x0, v0.h[0] +; CHECK-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %1 = tail call i16 @llvm.aarch64.sve.sminv.nxv8i16( %0, %a) + %conv = sext i16 %1 to i64 + ret i64 %conv +} + +define dso_local i64 @_Z8foo32_64u11__SVInt32_t( %a) local_unnamed_addr #0 { +; CHECK-LABEL: _Z8foo32_64u11__SVInt32_t: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: sminv s0, p0, z0.s +; CHECK-NEXT: smov x0, v0.s[0] +; CHECK-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %1 = tail call i32 @llvm.aarch64.sve.sminv.nxv4i32( %0, %a) + %conv = sext i32 %1 to i64 + ret i64 %conv +} + +declare @llvm.aarch64.sve.ptrue.nxv4i1(i32 immarg) #1 + +declare i32 @llvm.aarch64.sve.sminv.nxv4i32(, ) #1