diff options
Diffstat (limited to 'llvm/lib/Target/Mips/MipsLegalizerInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/Mips/MipsLegalizerInfo.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/llvm/lib/Target/Mips/MipsLegalizerInfo.cpp b/llvm/lib/Target/Mips/MipsLegalizerInfo.cpp index 6a16e7955a1..525f2143190 100644 --- a/llvm/lib/Target/Mips/MipsLegalizerInfo.cpp +++ b/llvm/lib/Target/Mips/MipsLegalizerInfo.cpp @@ -40,7 +40,9 @@ MipsLegalizerInfo::MipsLegalizerInfo(const MipsSubtarget &ST) { .minScalar(0, s32); getActionDefinitionsBuilder(G_CONSTANT) - .legalFor({s32}); + .legalFor({s32}) + .minScalar(0, s32) + .customFor({s64}); getActionDefinitionsBuilder(G_GEP) .legalFor({{p0, s32}}); @@ -91,6 +93,27 @@ bool MipsLegalizerInfo::legalizeCustom(MachineInstr &MI, MI.eraseFromParent(); break; } + case G_CONSTANT: { + + unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); + const LLT sHalf = LLT::scalar(Size / 2); + + const APInt &CImmValue = MI.getOperand(1).getCImm()->getValue(); + + unsigned ResLow = MRI.createGenericVirtualRegister(sHalf); + unsigned ResHigh = MRI.createGenericVirtualRegister(sHalf); + MIRBuilder.buildConstant( + ResLow, *ConstantInt::get(MI.getMF()->getFunction().getContext(), + CImmValue.trunc(Size / 2))); + MIRBuilder.buildConstant( + ResHigh, *ConstantInt::get(MI.getMF()->getFunction().getContext(), + CImmValue.lshr(Size / 2).trunc(Size / 2))); + + MIRBuilder.buildMerge(MI.getOperand(0).getReg(), {ResHigh, ResLow}); + + MI.eraseFromParent(); + break; + } default: return false; } |

