diff --git a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp --- a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp @@ -4445,7 +4445,10 @@ getInsertVecEltOpInfo(const RegisterBank &RB, unsigned EltSize) { unsigned Opc, SubregIdx; if (RB.getID() == AArch64::GPRRegBankID) { - if (EltSize == 16) { + if (EltSize == 8) { + Opc = AArch64::INSvi8gpr; + SubregIdx = AArch64::bsub; + } else if (EltSize == 16) { Opc = AArch64::INSvi16gpr; SubregIdx = AArch64::ssub; } else if (EltSize == 32) { @@ -5369,7 +5372,7 @@ Register EltReg = I.getOperand(2).getReg(); const LLT EltTy = MRI.getType(EltReg); unsigned EltSize = EltTy.getSizeInBits(); - if (EltSize < 16 || EltSize > 64) + if (EltSize < 8 || EltSize > 64) return false; // Don't support all element types yet. // Find the definition of the index. Bail out if it's not defined by a diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp --- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp @@ -661,7 +661,7 @@ .clampMaxNumElements(1, p0, 2); getActionDefinitionsBuilder(G_INSERT_VECTOR_ELT) - .legalIf(typeInSet(0, {v8s16, v2s32, v4s32, v2s64})); + .legalIf(typeInSet(0, {v16s8, v8s8, v8s16, v4s16, v4s32, v2s32, v2s64})); getActionDefinitionsBuilder(G_BUILD_VECTOR) .legalFor({{v8s8, s8}, diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-insert-vector-elt.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-insert-vector-elt.mir --- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-insert-vector-elt.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-insert-vector-elt.mir @@ -1,6 +1,63 @@ # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -mtriple=aarch64-linux-gnu -O0 -run-pass=legalizer %s -o - -global-isel-abort=1 | FileCheck %s +--- +name: v8s8 +body: | + bb.0: + liveins: $q0 + ; CHECK-LABEL: name: v8s8 + ; CHECK: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 + ; CHECK: %val:_(s8) = G_CONSTANT i8 42 + ; CHECK: [[IVEC:%[0-9]+]]:_(<8 x s8>) = G_INSERT_VECTOR_ELT [[COPY]], %val(s8), [[C]](s32) + ; CHECK: $d0 = COPY [[IVEC]](<8 x s8>) + ; CHECK: RET_ReallyLR + %0:_(<8 x s8>) = COPY $d0 + %1:_(s32) = G_CONSTANT i32 1 + %val:_(s8) = G_CONSTANT i8 42 + %2:_(<8 x s8>) = G_INSERT_VECTOR_ELT %0(<8 x s8>), %val(s8), %1(s32) + $d0 = COPY %2(<8 x s8>) + RET_ReallyLR +... +--- +name: v16s8 +body: | + bb.0: + liveins: $q0 + ; CHECK-LABEL: name: v16s8 + ; CHECK: [[COPY:%[0-9]+]]:_(<16 x s8>) = COPY $q0 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 + ; CHECK: %val:_(s8) = G_CONSTANT i8 42 + ; CHECK: [[IVEC:%[0-9]+]]:_(<16 x s8>) = G_INSERT_VECTOR_ELT [[COPY]], %val(s8), [[C]](s32) + ; CHECK: $q0 = COPY [[IVEC]](<16 x s8>) + ; CHECK: RET_ReallyLR + %0:_(<16 x s8>) = COPY $q0 + %1:_(s32) = G_CONSTANT i32 1 + %val:_(s8) = G_CONSTANT i8 42 + %2:_(<16 x s8>) = G_INSERT_VECTOR_ELT %0(<16 x s8>), %val(s8), %1(s32) + $q0 = COPY %2(<16 x s8>) + RET_ReallyLR +... +--- +name: v4s16 +body: | + bb.0: + liveins: $q0 + ; CHECK-LABEL: name: v4s16 + ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $d0 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 + ; CHECK: %val:_(s16) = G_CONSTANT i16 42 + ; CHECK: [[IVEC:%[0-9]+]]:_(<4 x s16>) = G_INSERT_VECTOR_ELT [[COPY]], %val(s16), [[C]](s32) + ; CHECK: $d0 = COPY [[IVEC]](<4 x s16>) + ; CHECK: RET_ReallyLR + %0:_(<4 x s16>) = COPY $d0 + %1:_(s32) = G_CONSTANT i32 1 + %val:_(s16) = G_CONSTANT i16 42 + %2:_(<4 x s16>) = G_INSERT_VECTOR_ELT %0(<4 x s16>), %val(s16), %1(s32) + $d0 = COPY %2(<4 x s16>) + RET_ReallyLR +... --- name: v8s16 body: | diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/select-insert-vector-elt.mir b/llvm/test/CodeGen/AArch64/GlobalISel/select-insert-vector-elt.mir --- a/llvm/test/CodeGen/AArch64/GlobalISel/select-insert-vector-elt.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/select-insert-vector-elt.mir @@ -1,6 +1,61 @@ # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -verify-machineinstrs -mtriple aarch64-unknown-unknown -run-pass=instruction-select %s -o - | FileCheck %s --- +name: v16s8_gpr +alignment: 4 +legalized: true +regBankSelected: true +tracksRegLiveness: true +body: | + bb.0: + liveins: $q1, $w0 + + ; CHECK-LABEL: name: v16s8_gpr + ; CHECK: liveins: $q1, $w0 + ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 + ; CHECK: [[COPY1:%[0-9]+]]:fpr128 = COPY $q1 + ; CHECK: [[INSvi8gpr:%[0-9]+]]:fpr128 = INSvi8gpr [[COPY1]], 1, [[COPY]] + ; CHECK: $q0 = COPY [[INSvi8gpr]] + ; CHECK: RET_ReallyLR implicit $q0 + %0:gpr(s32) = COPY $w0 + %trunc:gpr(s8) = G_TRUNC %0 + %1:fpr(<16 x s8>) = COPY $q1 + %3:gpr(s32) = G_CONSTANT i32 1 + %2:fpr(<16 x s8>) = G_INSERT_VECTOR_ELT %1, %trunc:gpr(s8), %3:gpr(s32) + $q0 = COPY %2(<16 x s8>) + RET_ReallyLR implicit $q0 + +... +--- +name: v8s8_gpr +alignment: 4 +legalized: true +regBankSelected: true +tracksRegLiveness: true +body: | + bb.0: + liveins: $d0, $w0 + + ; CHECK-LABEL: name: v8s8_gpr + ; CHECK: liveins: $d0, $w0 + ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 + ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d0 + ; CHECK: [[DEF:%[0-9]+]]:fpr128 = IMPLICIT_DEF + ; CHECK: [[INSERT_SUBREG:%[0-9]+]]:fpr128 = INSERT_SUBREG [[DEF]], [[COPY1]], %subreg.dsub + ; CHECK: [[INSvi8gpr:%[0-9]+]]:fpr128 = INSvi8gpr [[INSERT_SUBREG]], 1, [[COPY]] + ; CHECK: [[COPY2:%[0-9]+]]:fpr64 = COPY [[INSvi8gpr]].dsub + ; CHECK: $d0 = COPY [[COPY2]] + ; CHECK: RET_ReallyLR implicit $d0 + %0:gpr(s32) = COPY $w0 + %trunc:gpr(s8) = G_TRUNC %0 + %1:fpr(<8 x s8>) = COPY $d0 + %3:gpr(s32) = G_CONSTANT i32 1 + %2:fpr(<8 x s8>) = G_INSERT_VECTOR_ELT %1, %trunc(s8), %3(s32) + $d0 = COPY %2(<8 x s8>) + RET_ReallyLR implicit $d0 + +... +--- name: v8s16_gpr alignment: 4 legalized: true @@ -104,6 +159,35 @@ $q0 = COPY %2(<4 x s32>) RET_ReallyLR implicit $q0 +... +--- +name: v4s16_gpr +alignment: 4 +legalized: true +regBankSelected: true +tracksRegLiveness: true +body: | + bb.0: + liveins: $d0, $w0 + + ; CHECK-LABEL: name: v4s16_gpr + ; CHECK: liveins: $d0, $w0 + ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 + ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d0 + ; CHECK: [[DEF:%[0-9]+]]:fpr128 = IMPLICIT_DEF + ; CHECK: [[INSERT_SUBREG:%[0-9]+]]:fpr128 = INSERT_SUBREG [[DEF]], [[COPY1]], %subreg.dsub + ; CHECK: [[INSvi16gpr:%[0-9]+]]:fpr128 = INSvi16gpr [[INSERT_SUBREG]], 1, [[COPY]] + ; CHECK: [[COPY2:%[0-9]+]]:fpr64 = COPY [[INSvi16gpr]].dsub + ; CHECK: $d0 = COPY [[COPY2]] + ; CHECK: RET_ReallyLR implicit $d0 + %0:gpr(s32) = COPY $w0 + %trunc:gpr(s16) = G_TRUNC %0 + %1:fpr(<4 x s16>) = COPY $d0 + %3:gpr(s32) = G_CONSTANT i32 1 + %2:fpr(<4 x s16>) = G_INSERT_VECTOR_ELT %1, %trunc(s16), %3(s32) + $d0 = COPY %2(<4 x s16>) + RET_ReallyLR implicit $d0 + ... --- name: v2s64_fpr