@@ -587,6 +587,38 @@ def so_imm : Operand<i32>, ImmLeaf<i32, [{
587
587
let DecoderMethod = "DecodeSOImmOperand";
588
588
}
589
589
590
+ // mod_imm: match a 32-bit immediate operand, which is encoded as a 12-bit
591
+ // immediate (See ARMARM - "Modified Immediate Constants"). Unlike so_imm,
592
+ // mod_imm keeps the immediate in its encoded form (within the MC layer).
593
+ def ModImmAsmOperand: AsmOperandClass {
594
+ let Name = "ModImm";
595
+ let ParserMethod = "parseModImm";
596
+ }
597
+ def mod_imm : Operand<i32>, ImmLeaf<i32, [{
598
+ return ARM_AM::getSOImmVal(Imm) != -1;
599
+ }]> {
600
+ let EncoderMethod = "getModImmOpValue";
601
+ let PrintMethod = "printModImmOperand";
602
+ let ParserMatchClass = ModImmAsmOperand;
603
+ }
604
+
605
+ // similar to so_imm_not, but keeps the immediate in its encoded form
606
+ def ModImmNotAsmOperand : AsmOperandClass { let Name = "ModImmNot"; }
607
+ def mod_imm_not : Operand<i32>, PatLeaf<(imm), [{
608
+ return ARM_AM::getSOImmVal(~(uint32_t)N->getZExtValue()) != -1;
609
+ }], imm_not_XFORM> {
610
+ let ParserMatchClass = ModImmNotAsmOperand;
611
+ }
612
+
613
+ // similar to so_imm_neg, but keeps the immediate in its encoded form
614
+ def ModImmNegAsmOperand : AsmOperandClass { let Name = "ModImmNeg"; }
615
+ def mod_imm_neg : Operand<i32>, PatLeaf<(imm), [{
616
+ unsigned Value = -(unsigned)N->getZExtValue();
617
+ return Value && ARM_AM::getSOImmVal(Value) != -1;
618
+ }], imm_neg_XFORM> {
619
+ let ParserMatchClass = ModImmNegAsmOperand;
620
+ }
621
+
590
622
// Break so_imm's up into two pieces. This handles immediates with up to 16
591
623
// bits set in them. This uses so_imm2part to match and so_imm2part_[12] to
592
624
// get the first/second pieces.
@@ -1213,9 +1245,9 @@ multiclass AsI1_bin_irs<bits<4> opcod, string opc,
1213
1245
// The register-immediate version is re-materializable. This is useful
1214
1246
// in particular for taking the address of a local.
1215
1247
let isReMaterializable = 1 in {
1216
- def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm :$imm), DPFrm,
1248
+ def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, mod_imm :$imm), DPFrm,
1217
1249
iii, opc, "\t$Rd, $Rn, $imm",
1218
- [(set GPR:$Rd, (opnode GPR:$Rn, so_imm :$imm))]>,
1250
+ [(set GPR:$Rd, (opnode GPR:$Rn, mod_imm :$imm))]>,
1219
1251
Sched<[WriteALU, ReadALU]> {
1220
1252
bits<4> Rd;
1221
1253
bits<4> Rn;
@@ -1286,9 +1318,9 @@ multiclass AsI1_rbin_irs<bits<4> opcod, string opc,
1286
1318
// The register-immediate version is re-materializable. This is useful
1287
1319
// in particular for taking the address of a local.
1288
1320
let isReMaterializable = 1 in {
1289
- def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm :$imm), DPFrm,
1321
+ def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, mod_imm :$imm), DPFrm,
1290
1322
iii, opc, "\t$Rd, $Rn, $imm",
1291
- [(set GPR:$Rd, (opnode so_imm :$imm, GPR:$Rn))]>,
1323
+ [(set GPR:$Rd, (opnode mod_imm :$imm, GPR:$Rn))]>,
1292
1324
Sched<[WriteALU, ReadALU]> {
1293
1325
bits<4> Rd;
1294
1326
bits<4> Rn;
@@ -1356,9 +1388,9 @@ let hasPostISelHook = 1, Defs = [CPSR] in {
1356
1388
multiclass AsI1_bin_s_irs<InstrItinClass iii, InstrItinClass iir,
1357
1389
InstrItinClass iis, PatFrag opnode,
1358
1390
bit Commutable = 0> {
1359
- def ri : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_imm :$imm, pred:$p),
1391
+ def ri : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, mod_imm :$imm, pred:$p),
1360
1392
4, iii,
1361
- [(set GPR:$Rd, CPSR, (opnode GPR:$Rn, so_imm :$imm))]>,
1393
+ [(set GPR:$Rd, CPSR, (opnode GPR:$Rn, mod_imm :$imm))]>,
1362
1394
Sched<[WriteALU, ReadALU]>;
1363
1395
1364
1396
def rr : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm, pred:$p),
@@ -1389,9 +1421,9 @@ let hasPostISelHook = 1, Defs = [CPSR] in {
1389
1421
multiclass AsI1_rbin_s_is<InstrItinClass iii, InstrItinClass iir,
1390
1422
InstrItinClass iis, PatFrag opnode,
1391
1423
bit Commutable = 0> {
1392
- def ri : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_imm :$imm, pred:$p),
1424
+ def ri : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, mod_imm :$imm, pred:$p),
1393
1425
4, iii,
1394
- [(set GPR:$Rd, CPSR, (opnode so_imm :$imm, GPR:$Rn))]>,
1426
+ [(set GPR:$Rd, CPSR, (opnode mod_imm :$imm, GPR:$Rn))]>,
1395
1427
Sched<[WriteALU, ReadALU]>;
1396
1428
1397
1429
def rsi : ARMPseudoInst<(outs GPR:$Rd),
@@ -1417,9 +1449,9 @@ let isCompare = 1, Defs = [CPSR] in {
1417
1449
multiclass AI1_cmp_irs<bits<4> opcod, string opc,
1418
1450
InstrItinClass iii, InstrItinClass iir, InstrItinClass iis,
1419
1451
PatFrag opnode, bit Commutable = 0> {
1420
- def ri : AI1<opcod, (outs), (ins GPR:$Rn, so_imm :$imm), DPFrm, iii,
1452
+ def ri : AI1<opcod, (outs), (ins GPR:$Rn, mod_imm :$imm), DPFrm, iii,
1421
1453
opc, "\t$Rn, $imm",
1422
- [(opnode GPR:$Rn, so_imm :$imm)]>,
1454
+ [(opnode GPR:$Rn, mod_imm :$imm)]>,
1423
1455
Sched<[WriteCMP, ReadALU]> {
1424
1456
bits<4> Rn;
1425
1457
bits<12> imm;
@@ -1547,9 +1579,9 @@ let TwoOperandAliasConstraint = "$Rn = $Rd" in
1547
1579
multiclass AI1_adde_sube_irs<bits<4> opcod, string opc, PatFrag opnode,
1548
1580
bit Commutable = 0> {
1549
1581
let hasPostISelHook = 1, Defs = [CPSR], Uses = [CPSR] in {
1550
- def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm :$imm),
1582
+ def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, mod_imm :$imm),
1551
1583
DPFrm, IIC_iALUi, opc, "\t$Rd, $Rn, $imm",
1552
- [(set GPR:$Rd, CPSR, (opnode GPR:$Rn, so_imm :$imm, CPSR))]>,
1584
+ [(set GPR:$Rd, CPSR, (opnode GPR:$Rn, mod_imm :$imm, CPSR))]>,
1553
1585
Requires<[IsARM]>,
1554
1586
Sched<[WriteALU, ReadALU]> {
1555
1587
bits<4> Rd;
@@ -1617,9 +1649,9 @@ multiclass AI1_adde_sube_irs<bits<4> opcod, string opc, PatFrag opnode,
1617
1649
let TwoOperandAliasConstraint = "$Rn = $Rd" in
1618
1650
multiclass AI1_rsc_irs<bits<4> opcod, string opc, PatFrag opnode> {
1619
1651
let hasPostISelHook = 1, Defs = [CPSR], Uses = [CPSR] in {
1620
- def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm :$imm),
1652
+ def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, mod_imm :$imm),
1621
1653
DPFrm, IIC_iALUi, opc, "\t$Rd, $Rn, $imm",
1622
- [(set GPR:$Rd, CPSR, (opnode so_imm :$imm, GPR:$Rn, CPSR))]>,
1654
+ [(set GPR:$Rd, CPSR, (opnode mod_imm :$imm, GPR:$Rn, CPSR))]>,
1623
1655
Requires<[IsARM]>,
1624
1656
Sched<[WriteALU, ReadALU]> {
1625
1657
bits<4> Rd;
@@ -3224,8 +3256,8 @@ def MOVsi : AsI1<0b1101, (outs GPR:$Rd), (ins shift_so_reg_imm:$src),
3224
3256
}
3225
3257
3226
3258
let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in
3227
- def MOVi : AsI1<0b1101, (outs GPR:$Rd), (ins so_imm :$imm), DPFrm, IIC_iMOVi,
3228
- "mov", "\t$Rd, $imm", [(set GPR:$Rd, so_imm :$imm)]>, UnaryDP,
3259
+ def MOVi : AsI1<0b1101, (outs GPR:$Rd), (ins mod_imm :$imm), DPFrm, IIC_iMOVi,
3260
+ "mov", "\t$Rd, $imm", [(set GPR:$Rd, mod_imm :$imm)]>, UnaryDP,
3229
3261
Sched<[WriteALU]> {
3230
3262
bits<4> Rd;
3231
3263
bits<12> imm;
@@ -3732,9 +3764,9 @@ def MVNsr : AsI1<0b1111, (outs GPR:$Rd), (ins so_reg_reg:$shift),
3732
3764
let Inst{3-0} = shift{3-0};
3733
3765
}
3734
3766
let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in
3735
- def MVNi : AsI1<0b1111, (outs GPR:$Rd), (ins so_imm :$imm), DPFrm,
3767
+ def MVNi : AsI1<0b1111, (outs GPR:$Rd), (ins mod_imm :$imm), DPFrm,
3736
3768
IIC_iMVNi, "mvn", "\t$Rd, $imm",
3737
- [(set GPR:$Rd, so_imm_not :$imm)]>,UnaryDP, Sched<[WriteALU]> {
3769
+ [(set GPR:$Rd, mod_imm_not :$imm)]>,UnaryDP, Sched<[WriteALU]> {
3738
3770
bits<4> Rd;
3739
3771
bits<12> imm;
3740
3772
let Inst{25} = 1;
@@ -4280,9 +4312,9 @@ def : ARMPat<(ARMcmpZ GPR:$src, so_reg_reg:$rhs),
4280
4312
4281
4313
// CMN register-integer
4282
4314
let isCompare = 1, Defs = [CPSR] in {
4283
- def CMNri : AI1<0b1011, (outs), (ins GPR:$Rn, so_imm :$imm), DPFrm, IIC_iCMPi,
4315
+ def CMNri : AI1<0b1011, (outs), (ins GPR:$Rn, mod_imm :$imm), DPFrm, IIC_iCMPi,
4284
4316
"cmn", "\t$Rn, $imm",
4285
- [(ARMcmn GPR:$Rn, so_imm :$imm)]>,
4317
+ [(ARMcmn GPR:$Rn, mod_imm :$imm)]>,
4286
4318
Sched<[WriteCMP, ReadALU]> {
4287
4319
bits<4> Rn;
4288
4320
bits<12> imm;
@@ -5130,17 +5162,17 @@ def MSR : ABI<0b0001, (outs), (ins msr_mask:$mask, GPR:$Rn), NoItinerary,
5130
5162
let Inst{3-0} = Rn;
5131
5163
}
5132
5164
5133
- def MSRi : ABI<0b0011, (outs), (ins msr_mask:$mask, so_imm:$a ), NoItinerary,
5134
- "msr", "\t$mask, $a ", []> {
5165
+ def MSRi : ABI<0b0011, (outs), (ins msr_mask:$mask, mod_imm:$imm ), NoItinerary,
5166
+ "msr", "\t$mask, $imm ", []> {
5135
5167
bits<5> mask;
5136
- bits<12> a ;
5168
+ bits<12> imm ;
5137
5169
5138
5170
let Inst{23} = 0;
5139
5171
let Inst{22} = mask{4}; // R bit
5140
5172
let Inst{21-20} = 0b10;
5141
5173
let Inst{19-16} = mask{3-0};
5142
5174
let Inst{15-12} = 0b1111;
5143
- let Inst{11-0} = a ;
5175
+ let Inst{11-0} = imm ;
5144
5176
}
5145
5177
5146
5178
// However, the MSR (banked register) system instruction (ARMv7VE) *does* have a
@@ -5549,33 +5581,33 @@ def : MnemonicAlias<"usubaddx", "usax">;
5549
5581
// "mov Rd, so_imm_not" can be handled via "mvn" in assembly, just like
5550
5582
// for isel.
5551
5583
def : ARMInstAlias<"mov${s}${p} $Rd, $imm",
5552
- (MVNi rGPR:$Rd, so_imm_not :$imm, pred:$p, cc_out:$s)>;
5584
+ (MVNi rGPR:$Rd, mod_imm_not :$imm, pred:$p, cc_out:$s)>;
5553
5585
def : ARMInstAlias<"mvn${s}${p} $Rd, $imm",
5554
- (MOVi rGPR:$Rd, so_imm_not :$imm, pred:$p, cc_out:$s)>;
5586
+ (MOVi rGPR:$Rd, mod_imm_not :$imm, pred:$p, cc_out:$s)>;
5555
5587
// Same for AND <--> BIC
5556
5588
def : ARMInstAlias<"bic${s}${p} $Rd, $Rn, $imm",
5557
- (ANDri rGPR:$Rd, rGPR:$Rn, so_imm_not :$imm,
5589
+ (ANDri rGPR:$Rd, rGPR:$Rn, mod_imm_not :$imm,
5558
5590
pred:$p, cc_out:$s)>;
5559
5591
def : ARMInstAlias<"bic${s}${p} $Rdn, $imm",
5560
- (ANDri rGPR:$Rdn, rGPR:$Rdn, so_imm_not :$imm,
5592
+ (ANDri rGPR:$Rdn, rGPR:$Rdn, mod_imm_not :$imm,
5561
5593
pred:$p, cc_out:$s)>;
5562
5594
def : ARMInstAlias<"and${s}${p} $Rd, $Rn, $imm",
5563
- (BICri rGPR:$Rd, rGPR:$Rn, so_imm_not :$imm,
5595
+ (BICri rGPR:$Rd, rGPR:$Rn, mod_imm_not :$imm,
5564
5596
pred:$p, cc_out:$s)>;
5565
5597
def : ARMInstAlias<"and${s}${p} $Rdn, $imm",
5566
- (BICri rGPR:$Rdn, rGPR:$Rdn, so_imm_not :$imm,
5598
+ (BICri rGPR:$Rdn, rGPR:$Rdn, mod_imm_not :$imm,
5567
5599
pred:$p, cc_out:$s)>;
5568
5600
5569
5601
// Likewise, "add Rd, so_imm_neg" -> sub
5570
5602
def : ARMInstAlias<"add${s}${p} $Rd, $Rn, $imm",
5571
- (SUBri GPR:$Rd, GPR:$Rn, so_imm_neg :$imm, pred:$p, cc_out:$s)>;
5603
+ (SUBri GPR:$Rd, GPR:$Rn, mod_imm_neg :$imm, pred:$p, cc_out:$s)>;
5572
5604
def : ARMInstAlias<"add${s}${p} $Rd, $imm",
5573
- (SUBri GPR:$Rd, GPR:$Rd, so_imm_neg :$imm, pred:$p, cc_out:$s)>;
5605
+ (SUBri GPR:$Rd, GPR:$Rd, mod_imm_neg :$imm, pred:$p, cc_out:$s)>;
5574
5606
// Same for CMP <--> CMN via so_imm_neg
5575
5607
def : ARMInstAlias<"cmp${p} $Rd, $imm",
5576
- (CMNri rGPR:$Rd, so_imm_neg :$imm, pred:$p)>;
5608
+ (CMNri rGPR:$Rd, mod_imm_neg :$imm, pred:$p)>;
5577
5609
def : ARMInstAlias<"cmn${p} $Rd, $imm",
5578
- (CMPri rGPR:$Rd, so_imm_neg :$imm, pred:$p)>;
5610
+ (CMPri rGPR:$Rd, mod_imm_neg :$imm, pred:$p)>;
5579
5611
5580
5612
// The shifter forms of the MOV instruction are aliased to the ASR, LSL,
5581
5613
// LSR, ROR, and RRX instructions.
0 commit comments