[llvm] [AArch64][GlobalISel] Support more types for TRUNC (PR #66927)
Amara Emerson via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 20 23:01:25 PDT 2023
================
@@ -6019,6 +6015,57 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerEXT(MachineInstr &MI) {
return UnableToLegalize;
}
+LegalizerHelper::LegalizeResult LegalizerHelper::lowerTRUNC(MachineInstr &MI) {
+ // MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
+ MachineRegisterInfo &MRI = *MIRBuilder.getMRI();
+ // Similar to how operand splitting is done in SelectiondDAG, we can handle
+ // %res(v8s8) = G_TRUNC %in(v8s32) by generating:
+ // %inlo(<4x s32>), %inhi(<4 x s32>) = G_UNMERGE %in(<8 x s32>)
+ // %lo16(<4 x s16>) = G_TRUNC %inlo
+ // %hi16(<4 x s16>) = G_TRUNC %inhi
+ // %in16(<8 x s16>) = G_CONCAT_VECTORS %lo16, %hi16
+ // %res(<8 x s8>) = G_TRUNC %in16
+
+ Register DstReg = MI.getOperand(0).getReg();
+ Register SrcReg = MI.getOperand(1).getReg();
+ LLT DstTy = MRI.getType(DstReg);
+ LLT SrcTy = MRI.getType(SrcReg);
+
+ assert(DstTy.isVector() && "This should be a vector operation");
----------------
aemerson wrote:
lower() shouldn't die on the wrong types. It should return `UnableToLegalize`.
And do we also need to check for even num elts?
https://github.com/llvm/llvm-project/pull/66927
More information about the llvm-commits
mailing list