diff options
Diffstat (limited to 'llvm/lib/Target/ARM/ARMInstrInfo.td')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrInfo.td | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td index 46bdeba6bbd..13abdc9687e 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.td +++ b/llvm/lib/Target/ARM/ARMInstrInfo.td @@ -722,7 +722,20 @@ def arm_i32imm : PatLeaf<(imm), [{ if (Subtarget->useMovt(*MF)) return true; return ARM_AM::isSOImmTwoPartVal((unsigned)N->getZExtValue()); -}]>; +}]> { + // Ideally this would be an IntImmLeaf, but then we wouldn't have access to + // the MachineFunction. + let GISelPredicateCode = [{ + const auto &MF = *MI.getParent()->getParent(); + if (STI.useMovt(MF)) + return true; + + const auto &MO = MI.getOperand(1); + if (!MO.isCImm()) + return false; + return ARM_AM::isSOImmTwoPartVal(MO.getCImm()->getZExtValue()); + }]; +} /// imm0_1 predicate - Immediate in the range [0,1]. def Imm0_1AsmOperand: ImmAsmOperand<0,1> { let Name = "Imm0_1"; } |

