summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/Mips/MipsLegalizerInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/Mips/MipsLegalizerInfo.cpp')
-rw-r--r--llvm/lib/Target/Mips/MipsLegalizerInfo.cpp25
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;
}
OpenPOWER on IntegriCloud