@@ -2268,72 +2268,44 @@ MachineInstr *X86InstrInfo::commuteInstructionImpl(MachineInstr &MI, bool NewMI,
2268
2268
MachineInstr *WorkingMI = nullptr ;
2269
2269
unsigned Opc = MI.getOpcode ();
2270
2270
2271
+ #define CASE_ND (OP ) \
2272
+ case X86::OP: \
2273
+ case X86::OP##_ND:
2274
+
2271
2275
switch (Opc) {
2272
2276
// SHLD B, C, I <-> SHRD C, B, (BitWidth - I)
2273
- case X86::SHRD16rri8:
2274
- case X86::SHLD16rri8:
2275
- case X86::SHRD32rri8:
2276
- case X86::SHLD32rri8:
2277
- case X86::SHRD64rri8:
2278
- case X86::SHLD64rri8:
2279
- case X86::SHRD16rri8_ND:
2280
- case X86::SHLD16rri8_ND:
2281
- case X86::SHRD32rri8_ND:
2282
- case X86::SHLD32rri8_ND:
2283
- case X86::SHRD64rri8_ND:
2284
- case X86::SHLD64rri8_ND: {
2277
+ CASE_ND (SHRD16rri8)
2278
+ CASE_ND (SHLD16rri8)
2279
+ CASE_ND (SHRD32rri8)
2280
+ CASE_ND (SHLD32rri8)
2281
+ CASE_ND (SHRD64rri8)
2282
+ CASE_ND (SHLD64rri8) {
2285
2283
unsigned Size;
2286
2284
switch (Opc) {
2287
2285
default :
2288
2286
llvm_unreachable (" Unreachable!" );
2289
- case X86::SHRD16rri8:
2290
- Size = 16 ;
2291
- Opc = X86::SHLD16rri8;
2292
- break ;
2293
- case X86::SHLD16rri8:
2294
- Size = 16 ;
2295
- Opc = X86::SHRD16rri8;
2296
- break ;
2297
- case X86::SHRD32rri8:
2298
- Size = 32 ;
2299
- Opc = X86::SHLD32rri8;
2300
- break ;
2301
- case X86::SHLD32rri8:
2302
- Size = 32 ;
2303
- Opc = X86::SHRD32rri8;
2304
- break ;
2305
- case X86::SHRD64rri8:
2306
- Size = 64 ;
2307
- Opc = X86::SHLD64rri8;
2308
- break ;
2309
- case X86::SHLD64rri8:
2310
- Size = 64 ;
2311
- Opc = X86::SHRD64rri8;
2312
- break ;
2313
- case X86::SHRD16rri8_ND:
2314
- Size = 16 ;
2315
- Opc = X86::SHLD16rri8_ND;
2316
- break ;
2317
- case X86::SHLD16rri8_ND:
2318
- Size = 16 ;
2319
- Opc = X86::SHRD16rri8_ND;
2320
- break ;
2321
- case X86::SHRD32rri8_ND:
2322
- Size = 32 ;
2323
- Opc = X86::SHLD32rri8_ND;
2324
- break ;
2325
- case X86::SHLD32rri8_ND:
2326
- Size = 32 ;
2327
- Opc = X86::SHRD32rri8_ND;
2328
- break ;
2329
- case X86::SHRD64rri8_ND:
2330
- Size = 64 ;
2331
- Opc = X86::SHLD64rri8_ND;
2332
- break ;
2333
- case X86::SHLD64rri8_ND:
2334
- Size = 64 ;
2335
- Opc = X86::SHRD64rri8_ND;
2336
- break ;
2287
+ #define FROM_TO_SIZE (A, B, S ) \
2288
+ case X86::A: \
2289
+ Opc = X86::B; \
2290
+ Size = S; \
2291
+ break ; \
2292
+ case X86::A##_ND: \
2293
+ Opc = X86::B##_ND; \
2294
+ Size = S; \
2295
+ break ; \
2296
+ case X86::B: \
2297
+ Opc = X86::A; \
2298
+ Size = S; \
2299
+ break ; \
2300
+ case X86::B##_ND: \
2301
+ Opc = X86::A##_ND; \
2302
+ Size = S; \
2303
+ break ;
2304
+
2305
+ FROM_TO_SIZE (SHRD16rri8, SHLD16rri8, 16 )
2306
+ FROM_TO_SIZE (SHRD32rri8, SHLD32rri8, 32 )
2307
+ FROM_TO_SIZE (SHRD64rri8, SHLD64rri8, 64 )
2308
+ #undef FROM_TO_SIZE
2337
2309
}
2338
2310
WorkingMI = CloneIfNew (MI);
2339
2311
WorkingMI->setDesc (get (Opc));
@@ -4684,28 +4656,28 @@ bool X86InstrInfo::analyzeCompare(const MachineInstr &MI, Register &SrcReg,
4684
4656
}
4685
4657
return true ;
4686
4658
// A SUB can be used to perform comparison.
4687
- case X86:: SUB64rm:
4688
- case X86:: SUB32rm:
4689
- case X86:: SUB16rm:
4690
- case X86:: SUB8rm:
4659
+ CASE_ND ( SUB64rm)
4660
+ CASE_ND ( SUB32rm)
4661
+ CASE_ND ( SUB16rm)
4662
+ CASE_ND ( SUB8rm)
4691
4663
SrcReg = MI.getOperand (1 ).getReg ();
4692
4664
SrcReg2 = 0 ;
4693
4665
CmpMask = 0 ;
4694
4666
CmpValue = 0 ;
4695
4667
return true ;
4696
- case X86:: SUB64rr:
4697
- case X86:: SUB32rr:
4698
- case X86:: SUB16rr:
4699
- case X86:: SUB8rr:
4668
+ CASE_ND ( SUB64rr)
4669
+ CASE_ND ( SUB32rr)
4670
+ CASE_ND ( SUB16rr)
4671
+ CASE_ND ( SUB8rr)
4700
4672
SrcReg = MI.getOperand (1 ).getReg ();
4701
4673
SrcReg2 = MI.getOperand (2 ).getReg ();
4702
4674
CmpMask = 0 ;
4703
4675
CmpValue = 0 ;
4704
4676
return true ;
4705
- case X86:: SUB64ri32:
4706
- case X86:: SUB32ri:
4707
- case X86:: SUB16ri:
4708
- case X86:: SUB8ri:
4677
+ CASE_ND ( SUB64ri32)
4678
+ CASE_ND ( SUB32ri)
4679
+ CASE_ND ( SUB16ri)
4680
+ CASE_ND ( SUB8ri)
4709
4681
SrcReg = MI.getOperand (1 ).getReg ();
4710
4682
SrcReg2 = 0 ;
4711
4683
if (MI.getOperand (2 ).isImm ()) {
@@ -4750,10 +4722,10 @@ bool X86InstrInfo::isRedundantFlagInstr(const MachineInstr &FlagI,
4750
4722
case X86::CMP32rr:
4751
4723
case X86::CMP16rr:
4752
4724
case X86::CMP8rr:
4753
- case X86:: SUB64rr:
4754
- case X86:: SUB32rr:
4755
- case X86:: SUB16rr:
4756
- case X86:: SUB8rr: {
4725
+ CASE_ND ( SUB64rr)
4726
+ CASE_ND ( SUB32rr)
4727
+ CASE_ND ( SUB16rr)
4728
+ CASE_ND ( SUB8rr) {
4757
4729
Register OISrcReg;
4758
4730
Register OISrcReg2;
4759
4731
int64_t OIMask;
@@ -4775,10 +4747,10 @@ bool X86InstrInfo::isRedundantFlagInstr(const MachineInstr &FlagI,
4775
4747
case X86::CMP32ri:
4776
4748
case X86::CMP16ri:
4777
4749
case X86::CMP8ri:
4778
- case X86:: SUB64ri32:
4779
- case X86:: SUB32ri:
4780
- case X86:: SUB16ri:
4781
- case X86:: SUB8ri:
4750
+ CASE_ND ( SUB64ri32)
4751
+ CASE_ND ( SUB32ri)
4752
+ CASE_ND ( SUB16ri)
4753
+ CASE_ND ( SUB8ri)
4782
4754
case X86::TEST64rr:
4783
4755
case X86::TEST32rr:
4784
4756
case X86::TEST16rr:
@@ -5110,62 +5082,42 @@ bool X86InstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
5110
5082
switch (CmpInstr.getOpcode ()) {
5111
5083
default :
5112
5084
break ;
5113
- case X86:: SUB64ri32:
5114
- case X86:: SUB32ri:
5115
- case X86:: SUB16ri:
5116
- case X86:: SUB8ri:
5117
- case X86:: SUB64rm:
5118
- case X86:: SUB32rm:
5119
- case X86:: SUB16rm:
5120
- case X86:: SUB8rm:
5121
- case X86:: SUB64rr:
5122
- case X86:: SUB32rr:
5123
- case X86:: SUB16rr:
5124
- case X86:: SUB8rr: {
5085
+ CASE_ND ( SUB64ri32)
5086
+ CASE_ND ( SUB32ri)
5087
+ CASE_ND ( SUB16ri)
5088
+ CASE_ND ( SUB8ri)
5089
+ CASE_ND ( SUB64rm)
5090
+ CASE_ND ( SUB32rm)
5091
+ CASE_ND ( SUB16rm)
5092
+ CASE_ND ( SUB8rm)
5093
+ CASE_ND ( SUB64rr)
5094
+ CASE_ND ( SUB32rr)
5095
+ CASE_ND ( SUB16rr)
5096
+ CASE_ND ( SUB8rr) {
5125
5097
if (!MRI->use_nodbg_empty (CmpInstr.getOperand (0 ).getReg ()))
5126
5098
return false ;
5127
5099
// There is no use of the destination register, we can replace SUB with CMP.
5128
5100
unsigned NewOpcode = 0 ;
5101
+ #define FROM_TO (A, B ) \
5102
+ CASE_ND (A) NewOpcode = X86::B; \
5103
+ break ;
5129
5104
switch (CmpInstr.getOpcode ()) {
5130
5105
default :
5131
5106
llvm_unreachable (" Unreachable!" );
5132
- case X86::SUB64rm:
5133
- NewOpcode = X86::CMP64rm;
5134
- break ;
5135
- case X86::SUB32rm:
5136
- NewOpcode = X86::CMP32rm;
5137
- break ;
5138
- case X86::SUB16rm:
5139
- NewOpcode = X86::CMP16rm;
5140
- break ;
5141
- case X86::SUB8rm:
5142
- NewOpcode = X86::CMP8rm;
5143
- break ;
5144
- case X86::SUB64rr:
5145
- NewOpcode = X86::CMP64rr;
5146
- break ;
5147
- case X86::SUB32rr:
5148
- NewOpcode = X86::CMP32rr;
5149
- break ;
5150
- case X86::SUB16rr:
5151
- NewOpcode = X86::CMP16rr;
5152
- break ;
5153
- case X86::SUB8rr:
5154
- NewOpcode = X86::CMP8rr;
5155
- break ;
5156
- case X86::SUB64ri32:
5157
- NewOpcode = X86::CMP64ri32;
5158
- break ;
5159
- case X86::SUB32ri:
5160
- NewOpcode = X86::CMP32ri;
5161
- break ;
5162
- case X86::SUB16ri:
5163
- NewOpcode = X86::CMP16ri;
5164
- break ;
5165
- case X86::SUB8ri:
5166
- NewOpcode = X86::CMP8ri;
5167
- break ;
5107
+ FROM_TO (SUB64rm, CMP64rm)
5108
+ FROM_TO (SUB32rm, CMP32rm)
5109
+ FROM_TO (SUB16rm, CMP16rm)
5110
+ FROM_TO (SUB8rm, CMP8rm)
5111
+ FROM_TO (SUB64rr, CMP64rr)
5112
+ FROM_TO (SUB32rr, CMP32rr)
5113
+ FROM_TO (SUB16rr, CMP16rr)
5114
+ FROM_TO (SUB8rr, CMP8rr)
5115
+ FROM_TO (SUB64ri32, CMP64ri32)
5116
+ FROM_TO (SUB32ri, CMP32ri)
5117
+ FROM_TO (SUB16ri, CMP16ri)
5118
+ FROM_TO (SUB8ri, CMP8ri)
5168
5119
}
5120
+ #undef FROM_TO
5169
5121
CmpInstr.setDesc (get (NewOpcode));
5170
5122
CmpInstr.removeOperand (0 );
5171
5123
// Mutating this instruction invalidates any debug data associated with it.
0 commit comments