Skip to content

Commit 42bf3fa

Browse files
Lukacmadvbuka
authored andcommitted
[AArch64][GlobalISel] SIMD fpcvt codegen for fptoi(_sat) (llvm#160831)
This is followup patch to llvm#157680, which allows simd fpcvt instructions to be generated from fptoi(_sat) nodes.
1 parent 02bfec1 commit 42bf3fa

File tree

9 files changed

+2240
-159
lines changed

9 files changed

+2240
-159
lines changed

llvm/lib/Target/AArch64/AArch64InstrFormats.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5298,7 +5298,7 @@ multiclass FPToIntegerUnscaled<bits<2> rmode, bits<3> opcode, string asm,
52985298
}
52995299

53005300
multiclass FPToIntegerSIMDScalar<bits<2> rmode, bits<3> opcode, string asm,
5301-
SDPatternOperator OpN = null_frag> {
5301+
SDPatternOperator OpN> {
53025302
// double-precision to 32-bit SIMD/FPR
53035303
def SDr : BaseFPToIntegerUnscaled<0b01, rmode, opcode, FPR64, FPR32, asm,
53045304
[(set FPR32:$Rd, (i32 (OpN (f64 FPR64:$Rn))))]> {

llvm/lib/Target/AArch64/AArch64InstrInfo.td

Lines changed: 198 additions & 107 deletions
Large diffs are not rendered by default.

llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -856,19 +856,29 @@ AArch64RegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
856856
break;
857857
}
858858
case TargetOpcode::G_FPTOSI_SAT:
859-
case TargetOpcode::G_FPTOUI_SAT: {
859+
case TargetOpcode::G_FPTOUI_SAT:
860+
case TargetOpcode::G_FPTOSI:
861+
case TargetOpcode::G_FPTOUI: {
860862
LLT DstType = MRI.getType(MI.getOperand(0).getReg());
861863
if (DstType.isVector())
862864
break;
863865
if (DstType == LLT::scalar(16)) {
864866
OpRegBankIdx = {PMI_FirstFPR, PMI_FirstFPR};
865867
break;
866868
}
867-
OpRegBankIdx = {PMI_FirstGPR, PMI_FirstFPR};
869+
TypeSize DstSize = getSizeInBits(MI.getOperand(0).getReg(), MRI, TRI);
870+
TypeSize SrcSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, TRI);
871+
if (((DstSize == SrcSize) || STI.hasFeature(AArch64::FeatureFPRCVT)) &&
872+
all_of(MRI.use_nodbg_instructions(MI.getOperand(0).getReg()),
873+
[&](const MachineInstr &UseMI) {
874+
return onlyUsesFP(UseMI, MRI, TRI) ||
875+
prefersFPUse(UseMI, MRI, TRI);
876+
}))
877+
OpRegBankIdx = {PMI_FirstFPR, PMI_FirstFPR};
878+
else
879+
OpRegBankIdx = {PMI_FirstGPR, PMI_FirstFPR};
868880
break;
869881
}
870-
case TargetOpcode::G_FPTOSI:
871-
case TargetOpcode::G_FPTOUI:
872882
case TargetOpcode::G_INTRINSIC_LRINT:
873883
case TargetOpcode::G_INTRINSIC_LLRINT:
874884
if (MRI.getType(MI.getOperand(0).getReg()).isVector())

llvm/test/CodeGen/AArch64/GlobalISel/regbank-fp-use-def.mir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ body: |
9696
; CHECK-NEXT: [[SITOFP:%[0-9]+]]:fpr(s32) = G_SITOFP [[COPY1]](s32)
9797
; CHECK-NEXT: [[COPY3:%[0-9]+]]:fpr(s32) = COPY [[COPY2]](s32)
9898
; CHECK-NEXT: [[SELECT:%[0-9]+]]:fpr(s32) = G_SELECT [[COPY2]](s32), [[COPY3]], [[SITOFP]]
99-
; CHECK-NEXT: [[FPTOSI:%[0-9]+]]:gpr(s32) = G_FPTOSI [[SELECT]](s32)
99+
; CHECK-NEXT: [[FPTOSI:%[0-9]+]]:fpr(s32) = G_FPTOSI [[SELECT]](s32)
100100
%0:_(s32) = COPY $w0
101101
%2:_(s32) = COPY $w1
102102
%3:_(s32) = COPY $w2

0 commit comments

Comments
 (0)