@@ -68,14 +68,20 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
68
68
{ X86::ADC64rr, X86::ADC64mr },
69
69
{ X86::ADD16ri, X86::ADD16mi },
70
70
{ X86::ADD16ri8, X86::ADD16mi8 },
71
+ { X86::ADD16ri_DB, X86::ADD16mi | TB_NOT_REVERSABLE },
72
+ { X86::ADD16ri8_DB, X86::ADD16mi8 | TB_NOT_REVERSABLE },
71
73
{ X86::ADD16rr, X86::ADD16mr },
72
74
{ X86::ADD16rr_DB, X86::ADD16mr | TB_NOT_REVERSABLE },
73
75
{ X86::ADD32ri, X86::ADD32mi },
74
76
{ X86::ADD32ri8, X86::ADD32mi8 },
77
+ { X86::ADD32ri_DB, X86::ADD32mi | TB_NOT_REVERSABLE },
78
+ { X86::ADD32ri8_DB, X86::ADD32mi8 | TB_NOT_REVERSABLE },
75
79
{ X86::ADD32rr, X86::ADD32mr },
76
80
{ X86::ADD32rr_DB, X86::ADD32mr | TB_NOT_REVERSABLE },
77
81
{ X86::ADD64ri32, X86::ADD64mi32 },
78
82
{ X86::ADD64ri8, X86::ADD64mi8 },
83
+ { X86::ADD64ri32_DB,X86::ADD64mi32 | TB_NOT_REVERSABLE },
84
+ { X86::ADD64ri8_DB, X86::ADD64mi8 | TB_NOT_REVERSABLE },
79
85
{ X86::ADD64rr, X86::ADD64mr },
80
86
{ X86::ADD64rr_DB, X86::ADD64mr | TB_NOT_REVERSABLE },
81
87
{ X86::ADD8ri, X86::ADD8mi },
@@ -263,8 +269,8 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
263
269
{ X86::DIV64r, X86::DIV64m, 1 , 0 },
264
270
{ X86::DIV8r, X86::DIV8m, 1 , 0 },
265
271
{ X86::EXTRACTPSrr, X86::EXTRACTPSmr, 0 , 16 },
266
- { X86::FsMOVAPDrr, X86::MOVSDmr, 0 , 0 },
267
- { X86::FsMOVAPSrr, X86::MOVSSmr, 0 , 0 },
272
+ { X86::FsMOVAPDrr, X86::MOVSDmr | TB_NOT_REVERSABLE , 0 , 0 },
273
+ { X86::FsMOVAPSrr, X86::MOVSSmr | TB_NOT_REVERSABLE , 0 , 0 },
268
274
{ X86::IDIV16r, X86::IDIV16m, 1 , 0 },
269
275
{ X86::IDIV32r, X86::IDIV32m, 1 , 0 },
270
276
{ X86::IDIV64r, X86::IDIV64m, 1 , 0 },
@@ -323,18 +329,22 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
323
329
};
324
330
325
331
for (unsigned i = 0 , e = array_lengthof (OpTbl0); i != e; ++i) {
326
- unsigned RegOp = OpTbl0[i][0 ];
327
- unsigned MemOp = OpTbl0[i][1 ];
328
- unsigned Align = OpTbl0[i][3 ];
329
- assert (!RegOp2MemOpTable0.count (RegOp) && " Duplicated entries?" );
330
- RegOp2MemOpTable0[RegOp] = std::make_pair (MemOp,Align);
332
+ unsigned RegOp = OpTbl0[i][0 ];
333
+ unsigned MemOp = OpTbl0[i][1 ] & ~TB_FLAGS;
331
334
unsigned FoldedLoad = OpTbl0[i][2 ];
335
+ unsigned Align = OpTbl0[i][3 ];
336
+ assert (!RegOp2MemOpTable0.count (RegOp) && " Duplicated entries?" );
337
+ RegOp2MemOpTable0[RegOp] = std::make_pair (MemOp, Align);
338
+
339
+ // If this is not a reversable operation (because there is a many->one)
340
+ // mapping, don't insert the reverse of the operation into MemOp2RegOpTable.
341
+ if (OpTbl0[i][1 ] & TB_NOT_REVERSABLE)
342
+ continue ;
343
+
332
344
// Index 0, folded load or store.
333
345
unsigned AuxInfo = 0 | (FoldedLoad << 4 ) | ((FoldedLoad^1 ) << 5 );
334
- if (RegOp != X86::FsMOVAPDrr && RegOp != X86::FsMOVAPSrr) {
335
- assert (!MemOp2RegOpTable.count (MemOp) && " Duplicated entries?" );
336
- MemOp2RegOpTable[MemOp] = std::make_pair (RegOp, AuxInfo);
337
- }
346
+ assert (!MemOp2RegOpTable.count (MemOp) && " Duplicated entries?" );
347
+ MemOp2RegOpTable[MemOp] = std::make_pair (RegOp, AuxInfo);
338
348
}
339
349
340
350
static const unsigned OpTbl1[][3 ] = {
@@ -352,8 +362,8 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
352
362
{ X86::CVTTSD2SIrr, X86::CVTTSD2SIrm, 0 },
353
363
{ X86::CVTTSS2SI64rr, X86::CVTTSS2SI64rm, 0 },
354
364
{ X86::CVTTSS2SIrr, X86::CVTTSS2SIrm, 0 },
355
- { X86::FsMOVAPDrr, X86::MOVSDrm, 0 },
356
- { X86::FsMOVAPSrr, X86::MOVSSrm, 0 },
365
+ { X86::FsMOVAPDrr, X86::MOVSDrm | TB_NOT_REVERSABLE , 0 },
366
+ { X86::FsMOVAPSrr, X86::MOVSSrm | TB_NOT_REVERSABLE , 0 },
357
367
{ X86::IMUL16rri, X86::IMUL16rmi, 0 },
358
368
{ X86::IMUL16rri8, X86::IMUL16rmi8, 0 },
359
369
{ X86::IMUL32rri, X86::IMUL32rmi, 0 },
@@ -449,17 +459,20 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
449
459
450
460
for (unsigned i = 0 , e = array_lengthof (OpTbl1); i != e; ++i) {
451
461
unsigned RegOp = OpTbl1[i][0 ];
452
- unsigned MemOp = OpTbl1[i][1 ];
462
+ unsigned MemOp = OpTbl1[i][1 ] & ~TB_FLAGS ;
453
463
unsigned Align = OpTbl1[i][2 ];
454
464
assert (!RegOp2MemOpTable1.count (RegOp) && " Duplicate entries" );
455
- RegOp2MemOpTable1[RegOp] = std::make_pair (MemOp,Align);
465
+ RegOp2MemOpTable1[RegOp] = std::make_pair (MemOp, Align);
466
+
467
+ // If this is not a reversable operation (because there is a many->one)
468
+ // mapping, don't insert the reverse of the operation into MemOp2RegOpTable.
469
+ if (OpTbl1[i][1 ] & TB_NOT_REVERSABLE)
470
+ continue ;
456
471
457
472
// Index 1, folded load
458
473
unsigned AuxInfo = 1 | (1 << 4 );
459
- if (RegOp != X86::FsMOVAPDrr && RegOp != X86::FsMOVAPSrr) {
460
- assert (!MemOp2RegOpTable.count (MemOp) && " Duplicate entries" );
461
- MemOp2RegOpTable[MemOp] = std::make_pair (RegOp, AuxInfo);
462
- }
474
+ assert (!MemOp2RegOpTable.count (MemOp) && " Duplicate entries" );
475
+ MemOp2RegOpTable[MemOp] = std::make_pair (RegOp, AuxInfo);
463
476
}
464
477
465
478
static const unsigned OpTbl2[][3 ] = {
@@ -671,7 +684,6 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
671
684
assert (!RegOp2MemOpTable2.count (RegOp) && " Duplicate entry!" );
672
685
RegOp2MemOpTable2[RegOp] = std::make_pair (MemOp, Align);
673
686
674
-
675
687
// If this is not a reversable operation (because there is a many->one)
676
688
// mapping, don't insert the reverse of the operation into MemOp2RegOpTable.
677
689
if (OpTbl2[i][1 ] & TB_NOT_REVERSABLE)
@@ -1154,6 +1166,8 @@ X86InstrInfo::convertToThreeAddressWithLEA(unsigned MIOpc,
1154
1166
break ;
1155
1167
case X86::ADD16ri:
1156
1168
case X86::ADD16ri8:
1169
+ case X86::ADD16ri_DB:
1170
+ case X86::ADD16ri8_DB:
1157
1171
addRegOffset (MIB, leaInReg, true , MI->getOperand (2 ).getImm ());
1158
1172
break ;
1159
1173
case X86::ADD16rr:
@@ -1418,14 +1432,18 @@ X86InstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
1418
1432
}
1419
1433
case X86::ADD64ri32:
1420
1434
case X86::ADD64ri8:
1435
+ case X86::ADD64ri32_DB:
1436
+ case X86::ADD64ri8_DB:
1421
1437
assert (MI->getNumOperands () >= 3 && " Unknown add instruction!" );
1422
1438
NewMI = addRegOffset (BuildMI (MF, MI->getDebugLoc (), get (X86::LEA64r))
1423
1439
.addReg (Dest, RegState::Define |
1424
1440
getDeadRegState (isDead)),
1425
1441
Src, isKill, MI->getOperand (2 ).getImm ());
1426
1442
break ;
1427
1443
case X86::ADD32ri:
1428
- case X86::ADD32ri8: {
1444
+ case X86::ADD32ri8:
1445
+ case X86::ADD32ri_DB:
1446
+ case X86::ADD32ri8_DB: {
1429
1447
assert (MI->getNumOperands () >= 3 && " Unknown add instruction!" );
1430
1448
unsigned Opc = is64Bit ? X86::LEA64_32r : X86::LEA32r;
1431
1449
NewMI = addRegOffset (BuildMI (MF, MI->getDebugLoc (), get (Opc))
@@ -1436,6 +1454,8 @@ X86InstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
1436
1454
}
1437
1455
case X86::ADD16ri:
1438
1456
case X86::ADD16ri8:
1457
+ case X86::ADD16ri_DB:
1458
+ case X86::ADD16ri8_DB:
1439
1459
if (DisableLEA16)
1440
1460
return is64Bit ? convertToThreeAddressWithLEA (MIOpc, MFI, MBBI, LV) : 0 ;
1441
1461
assert (MI->getNumOperands () >= 3 && " Unknown add instruction!" );
0 commit comments