diff options
author | Alexander Ivchenko <alexander.ivchenko@intel.com> | 2018-02-08 22:41:47 +0000 |
---|---|---|
committer | Alexander Ivchenko <alexander.ivchenko@intel.com> | 2018-02-08 22:41:47 +0000 |
commit | da9e81c462fdebd93c78ab2aa54782840587e9f4 (patch) | |
tree | 33a02a1dc383cff562e07962a158fec50fb6810e /llvm/lib/Target/X86/X86RegisterBankInfo.cpp | |
parent | a85c4fc0291613b4ca0f60850a73c46dcaea69ae (diff) | |
download | bcm5719-llvm-da9e81c462fdebd93c78ab2aa54782840587e9f4.tar.gz bcm5719-llvm-da9e81c462fdebd93c78ab2aa54782840587e9f4.zip |
[GlobalISel][X86] Fixing failures after https://reviews.llvm.org/D37775
The patch essentially makes sure that X86CallLowering adds proper
G_COPY/G_TRUNC and G_ANYEXT/G_COPY when we are doing lowering of
arguments/returns for floating point values passed on registers.
Tests are updated accordingly
Reviewed By: qcolombet
Differential Revision: https://reviews.llvm.org/D42287
llvm-svn: 324665
Diffstat (limited to 'llvm/lib/Target/X86/X86RegisterBankInfo.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86RegisterBankInfo.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86RegisterBankInfo.cpp b/llvm/lib/Target/X86/X86RegisterBankInfo.cpp index aa0e3743c94..5d4d70e47c7 100644 --- a/llvm/lib/Target/X86/X86RegisterBankInfo.cpp +++ b/llvm/lib/Target/X86/X86RegisterBankInfo.cpp @@ -73,6 +73,8 @@ X86GenRegisterBankInfo::getPartialMappingIdx(const LLT &Ty, bool isFP) { return PMI_GPR32; case 64: return PMI_GPR64; + case 128: + return PMI_VEC128; break; default: llvm_unreachable("Unsupported register size."); @@ -83,6 +85,8 @@ X86GenRegisterBankInfo::getPartialMappingIdx(const LLT &Ty, bool isFP) { return PMI_FP32; case 64: return PMI_FP64; + case 128: + return PMI_VEC128; default: llvm_unreachable("Unsupported register size."); } @@ -190,6 +194,23 @@ X86RegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { // Instruction having only floating-point operands (all scalars in VECRReg) getInstrPartialMappingIdxs(MI, MRI, /* isFP */ true, OpRegBankIdx); break; + case TargetOpcode::G_TRUNC: + case TargetOpcode::G_ANYEXT: { + auto &Op0 = MI.getOperand(0); + auto &Op1 = MI.getOperand(1); + const LLT Ty0 = MRI.getType(Op0.getReg()); + const LLT Ty1 = MRI.getType(Op1.getReg()); + + bool isFPTrunc = (Ty0.getSizeInBits() == 32 || Ty0.getSizeInBits() == 64) && + Ty1.getSizeInBits() == 128 && Opc == TargetOpcode::G_TRUNC; + bool isFPAnyExt = + Ty0.getSizeInBits() == 128 && + (Ty1.getSizeInBits() == 32 || Ty1.getSizeInBits() == 64) && + Opc == TargetOpcode::G_ANYEXT; + + getInstrPartialMappingIdxs(MI, MRI, /* isFP */ isFPTrunc || isFPAnyExt, + OpRegBankIdx); + } break; default: // Track the bank of each register, use NotFP mapping (all scalars in GPRs) getInstrPartialMappingIdxs(MI, MRI, /* isFP */ false, OpRegBankIdx); |