@@ -1493,27 +1493,71 @@ def : Pat<(xor GR32:$src1, -2147483648),
1493
1493
1494
1494
// Odd encoding trick: -128 fits into an 8-bit immediate field while
1495
1495
// +128 doesn't, so in this special case use a sub instead of an add.
1496
- def : Pat<(add GR16:$src1, 128),
1497
- (SUB16ri GR16:$src1, -128)>;
1496
+ let Predicates = [NoNDD] in {
1497
+ def : Pat<(add GR16:$src1, 128),
1498
+ (SUB16ri GR16:$src1, -128)>;
1499
+ def : Pat<(add GR32:$src1, 128),
1500
+ (SUB32ri GR32:$src1, -128)>;
1501
+ def : Pat<(add GR64:$src1, 128),
1502
+ (SUB64ri32 GR64:$src1, -128)>;
1503
+
1504
+ def : Pat<(X86add_flag_nocf GR16:$src1, 128),
1505
+ (SUB16ri GR16:$src1, -128)>;
1506
+ def : Pat<(X86add_flag_nocf GR32:$src1, 128),
1507
+ (SUB32ri GR32:$src1, -128)>;
1508
+ def : Pat<(X86add_flag_nocf GR64:$src1, 128),
1509
+ (SUB64ri32 GR64:$src1, -128)>;
1510
+ }
1511
+ let Predicates = [HasNDD] in {
1512
+ def : Pat<(add GR16:$src1, 128),
1513
+ (SUB16ri_ND GR16:$src1, -128)>;
1514
+ def : Pat<(add GR32:$src1, 128),
1515
+ (SUB32ri_ND GR32:$src1, -128)>;
1516
+ def : Pat<(add GR64:$src1, 128),
1517
+ (SUB64ri32_ND GR64:$src1, -128)>;
1518
+
1519
+ def : Pat<(X86add_flag_nocf GR16:$src1, 128),
1520
+ (SUB16ri_ND GR16:$src1, -128)>;
1521
+ def : Pat<(X86add_flag_nocf GR32:$src1, 128),
1522
+ (SUB32ri_ND GR32:$src1, -128)>;
1523
+ def : Pat<(X86add_flag_nocf GR64:$src1, 128),
1524
+ (SUB64ri32_ND GR64:$src1, -128)>;
1525
+ }
1498
1526
def : Pat<(store (add (loadi16 addr:$dst), 128), addr:$dst),
1499
1527
(SUB16mi addr:$dst, -128)>;
1500
-
1501
- def : Pat<(add GR32:$src1, 128),
1502
- (SUB32ri GR32:$src1, -128)>;
1503
1528
def : Pat<(store (add (loadi32 addr:$dst), 128), addr:$dst),
1504
1529
(SUB32mi addr:$dst, -128)>;
1505
-
1506
- def : Pat<(add GR64:$src1, 128),
1507
- (SUB64ri32 GR64:$src1, -128)>;
1508
1530
def : Pat<(store (add (loadi64 addr:$dst), 128), addr:$dst),
1509
1531
(SUB64mi32 addr:$dst, -128)>;
1532
+ let Predicates = [HasNDD] in {
1533
+ def : Pat<(add (loadi16 addr:$src), 128),
1534
+ (SUB16mi_ND addr:$src, -128)>;
1535
+ def : Pat<(add (loadi32 addr:$src), 128),
1536
+ (SUB32mi_ND addr:$src, -128)>;
1537
+ def : Pat<(add (loadi64 addr:$src), 128),
1538
+ (SUB64mi32_ND addr:$src, -128)>;
1539
+ }
1510
1540
1511
- def : Pat<(X86add_flag_nocf GR16:$src1, 128),
1512
- (SUB16ri GR16:$src1, -128)>;
1513
- def : Pat<(X86add_flag_nocf GR32:$src1, 128),
1514
- (SUB32ri GR32:$src1, -128)>;
1515
- def : Pat<(X86add_flag_nocf GR64:$src1, 128),
1516
- (SUB64ri32 GR64:$src1, -128)>;
1541
+ // The same trick applies for 32-bit immediate fields in 64-bit
1542
+ // instructions.
1543
+ let Predicates = [NoNDD] in {
1544
+ def : Pat<(add GR64:$src1, 0x0000000080000000),
1545
+ (SUB64ri32 GR64:$src1, 0xffffffff80000000)>;
1546
+ def : Pat<(X86add_flag_nocf GR64:$src1, 0x0000000080000000),
1547
+ (SUB64ri32 GR64:$src1, 0xffffffff80000000)>;
1548
+ }
1549
+ let Predicates = [HasNDD] in {
1550
+ def : Pat<(add GR64:$src1, 0x0000000080000000),
1551
+ (SUB64ri32_ND GR64:$src1, 0xffffffff80000000)>;
1552
+ def : Pat<(X86add_flag_nocf GR64:$src1, 0x0000000080000000),
1553
+ (SUB64ri32_ND GR64:$src1, 0xffffffff80000000)>;
1554
+ }
1555
+ def : Pat<(store (add (loadi64 addr:$dst), 0x0000000080000000), addr:$dst),
1556
+ (SUB64mi32 addr:$dst, 0xffffffff80000000)>;
1557
+ let Predicates = [HasNDD] in {
1558
+ def : Pat<(add(loadi64 addr:$src), 0x0000000080000000),
1559
+ (SUB64mi32_ND addr:$src, 0xffffffff80000000)>;
1560
+ }
1517
1561
1518
1562
// Depositing value to 8/16 bit subreg:
1519
1563
def : Pat<(or (and GR64:$dst, -256),
@@ -1532,15 +1576,6 @@ def : Pat<(or (and GR32:$dst, -65536),
1532
1576
(i32 (zextloadi16 addr:$src))),
1533
1577
(INSERT_SUBREG (i32 (COPY $dst)), (MOV16rm i16mem:$src), sub_16bit)>;
1534
1578
1535
- // The same trick applies for 32-bit immediate fields in 64-bit
1536
- // instructions.
1537
- def : Pat<(add GR64:$src1, 0x0000000080000000),
1538
- (SUB64ri32 GR64:$src1, 0xffffffff80000000)>;
1539
- def : Pat<(store (add (loadi64 addr:$dst), 0x0000000080000000), addr:$dst),
1540
- (SUB64mi32 addr:$dst, 0xffffffff80000000)>;
1541
- def : Pat<(X86add_flag_nocf GR64:$src1, 0x0000000080000000),
1542
- (SUB64ri32 GR64:$src1, 0xffffffff80000000)>;
1543
-
1544
1579
// To avoid needing to materialize an immediate in a register, use a 32-bit and
1545
1580
// with implicit zero-extension instead of a 64-bit and if the immediate has at
1546
1581
// least 32 bits of leading zeros. If in addition the last 32 bits can be
0 commit comments