}
/// arm_i32imm - True for +V6T2, or when isSOImmTwoParVal()
-def arm_i32imm : PatLeaf<(imm), [{
+def arm_i32imm : IntImmLeaf<i32, [{
if (Subtarget->useMovt())
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 = [{
- if (STI.useMovt())
- return true;
-
- const auto &MO = MI.getOperand(1);
- if (!MO.isCImm())
- return false;
- return ARM_AM::isSOImmTwoPartVal(MO.getCImm()->getZExtValue());
- }];
-}
+ return ARM_AM::isSOImmTwoPartVal(Imm.getZExtValue());
+}]>;
/// imm0_1 predicate - Immediate in the range [0,1].
def Imm0_1AsmOperand: ImmAsmOperand<0,1> { let Name = "Imm0_1"; }
const ARMRegisterBankInfo &RBI;
const ARMSubtarget &STI;
+ // FIXME: This is necessary because DAGISel uses "Subtarget->" and GlobalISel
+ // uses "STI." in the code generated by TableGen. If we want to reuse some of
+ // the custom C++ predicates written for DAGISel, we need to have both around.
+ const ARMSubtarget *Subtarget = &STI;
+
// Store the opcodes that we might need, so we don't have to check what kind
// of subtarget (ARM vs Thumb) we have all the time.
struct OpcodeCache {