@@ -1586,6 +1586,7 @@ def LDRD : AI3ld<0b1101, 0, (outs GPR:$Rd, GPR:$dst2),
1586
1586
(ins addrmode3:$addr), LdMiscFrm,
1587
1587
IIC_iLoad_d_r, "ldrd", "\t$Rd, $addr",
1588
1588
[]>, Requires<[IsARM, HasV5TE]>;
1589
+ }
1589
1590
1590
1591
// Indexed loads
1591
1592
multiclass AI2_ldridx<bit isByte, string opc, InstrItinClass itin> {
@@ -1618,80 +1619,78 @@ multiclass AI2_ldridx<bit isByte, string opc, InstrItinClass itin> {
1618
1619
}
1619
1620
}
1620
1621
1622
+ let mayLoad = 1, neverHasSideEffects = 1 in {
1621
1623
defm LDR : AI2_ldridx<0, "ldr", IIC_iLoad_ru>;
1622
1624
defm LDRB : AI2_ldridx<1, "ldrb", IIC_iLoad_bh_ru>;
1625
+ }
1623
1626
1624
- def LDRH_PRE : AI3ldhpr<(outs GPR:$Rt, GPR:$Rn_wb),
1625
- (ins addrmode3:$addr), LdMiscFrm, IIC_iLoad_bh_ru,
1626
- "ldrh", "\t$Rt, $addr!", "$addr.base = $Rn_wb", []>;
1627
-
1628
- def LDRH_POST : AI3ldhpo<(outs GPR:$Rt, GPR:$Rn_wb),
1629
- (ins GPR:$Rn,am3offset:$offset), LdMiscFrm, IIC_iLoad_bh_ru,
1630
- "ldrh", "\t$Rt, [$Rn], $offset", "$Rn = $Rn_wb", []>;
1631
-
1632
- def LDRSH_PRE : AI3ldshpr<(outs GPR:$Rt, GPR:$Rn_wb),
1633
- (ins addrmode3:$addr), LdMiscFrm, IIC_iLoad_bh_ru,
1634
- "ldrsh", "\t$Rt, $addr!", "$addr.base = $Rn_wb", []>;
1635
-
1636
- def LDRSH_POST: AI3ldshpo<(outs GPR:$Rt, GPR:$Rn_wb),
1637
- (ins GPR:$Rn,am3offset:$offset), LdMiscFrm, IIC_iLoad_bh_ru,
1638
- "ldrsh", "\t$Rt, [$Rn], $offset", "$Rn = $Rn_wb", []>;
1639
-
1640
- def LDRSB_PRE : AI3ldsbpr<(outs GPR:$Rt, GPR:$Rn_wb),
1641
- (ins addrmode3:$addr), LdMiscFrm, IIC_iLoad_bh_ru,
1642
- "ldrsb", "\t$Rt, $addr!", "$addr.base = $Rn_wb", []>;
1643
-
1644
- def LDRSB_POST: AI3ldsbpo<(outs GPR:$Rt, GPR:$Rn_wb),
1645
- (ins GPR:$Rn,am3offset:$offset), LdMiscFrm, IIC_iLoad_ru,
1646
- "ldrsb", "\t$Rt, [$Rn], $offset", "$Rn = $Rn_wb", []>;
1647
-
1648
- // For disassembly only
1649
- def LDRD_PRE : AI3lddpr<(outs GPR:$dst1, GPR:$dst2, GPR:$base_wb),
1650
- (ins addrmode3:$addr), LdMiscFrm, IIC_iLoad_d_ru,
1651
- "ldrd", "\t$dst1, $dst2, $addr!", "$addr.base = $base_wb", []>,
1652
- Requires<[IsARM, HasV5TE]>;
1653
-
1654
- // For disassembly only
1655
- def LDRD_POST : AI3lddpo<(outs GPR:$dst1, GPR:$dst2, GPR:$base_wb),
1656
- (ins GPR:$base,am3offset:$offset), LdMiscFrm, IIC_iLoad_d_ru,
1657
- "ldrd", "\t$dst1, $dst2, [$base], $offset", "$base = $base_wb", []>,
1658
- Requires<[IsARM, HasV5TE]>;
1627
+ multiclass AI3_ldridx<bits<4> op, bit op20, string opc, InstrItinClass itin> {
1628
+ def _PRE : AI3ldstidx<op, op20, 1, 1, (outs GPR:$Rt, GPR:$Rn_wb),
1629
+ (ins addrmode3:$addr), IndexModePre,
1630
+ LdMiscFrm, itin,
1631
+ opc, "\t$Rt, $addr!", "$addr.base = $Rn_wb", []> {
1632
+ bits<14> addr;
1633
+ let Inst{23} = addr{8}; // U bit
1634
+ let Inst{22} = addr{13}; // 1 == imm8, 0 == Rm
1635
+ let Inst{19-16} = addr{12-9}; // Rn
1636
+ let Inst{11-8} = addr{7-4}; // imm7_4/zero
1637
+ let Inst{3-0} = addr{3-0}; // imm3_0/Rm
1638
+ }
1639
+ def _POST : AI3ldstidx<op, op20, 1, 0, (outs GPR:$Rt, GPR:$Rn_wb),
1640
+ (ins GPR:$Rn, am3offset:$offset), IndexModePost,
1641
+ LdMiscFrm, itin,
1642
+ opc, "\t$Rt, [$Rn], $offset", "$Rn = $Rn_wb", []> {
1643
+ bits<10> addr;
1644
+ bits<4> Rn;
1645
+ let Inst{23} = addr{8}; // U bit
1646
+ let Inst{22} = addr{9}; // 1 == imm8, 0 == Rm
1647
+ let Inst{19-16} = Rn;
1648
+ let Inst{11-8} = addr{7-4}; // imm7_4/zero
1649
+ let Inst{3-0} = addr{3-0}; // imm3_0/Rm
1650
+ }
1651
+ }
1659
1652
1660
- } // mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1
1653
+ let mayLoad = 1, neverHasSideEffects = 1 in {
1654
+ defm LDRH : AI3_ldridx<0b1011, 1, "ldrh", IIC_iLoad_bh_ru>;
1655
+ defm LDRSH : AI3_ldridx<0b1111, 1, "ldrsh", IIC_iLoad_bh_ru>;
1656
+ defm LDRSB : AI3_ldridx<0b1101, 1, "ldrsb", IIC_iLoad_bh_ru>;
1657
+ let hasExtraDefRegAllocReq = 1, isCodeGenOnly = 1 in
1658
+ defm LDRD : AI3_ldridx<0b1101, 0, "ldrd", IIC_iLoad_d_ru>;
1659
+ } // mayLoad = 1, neverHasSideEffects = 1
1661
1660
1662
1661
// LDRT, LDRBT, LDRSBT, LDRHT, LDRSHT are for disassembly only.
1663
-
1662
+ let mayLoad = 1, neverHasSideEffects = 1 in {
1664
1663
def LDRT : AI2ldstidx<1, 0, 0, (outs GPR:$dst, GPR:$base_wb),
1665
1664
(ins GPR:$base, am2offset:$offset), IndexModeNone,
1666
1665
LdFrm, IIC_iLoad_ru,
1667
1666
"ldrt", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1668
1667
let Inst{21} = 1; // overwrite
1669
1668
}
1670
-
1671
1669
def LDRBT : AI2ldstidx<1, 1, 0, (outs GPR:$dst, GPR:$base_wb),
1672
- (ins GPR:$base,am2offset:$offset), IndexModeNone,
1670
+ (ins GPR:$base, am2offset:$offset), IndexModeNone,
1673
1671
LdFrm, IIC_iLoad_bh_ru,
1674
1672
"ldrbt", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1675
1673
let Inst{21} = 1; // overwrite
1676
1674
}
1677
-
1678
- def LDRSBT : AI3ldsbpo<(outs GPR:$dst, GPR:$base_wb) ,
1679
- (ins GPR:$base,am3offset:$offset), LdMiscFrm, IIC_iLoad_bh_ru,
1675
+ def LDRSBT : AI3ldstidx<0b1101, 1, 1, 0, (outs GPR:$dst, GPR:$base_wb),
1676
+ (ins GPR:$base, am3offset:$offset), IndexModePost ,
1677
+ LdMiscFrm, IIC_iLoad_bh_ru,
1680
1678
"ldrsbt", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1681
1679
let Inst{21} = 1; // overwrite
1682
1680
}
1683
-
1684
- def LDRHT : AI3ldhpo<(outs GPR:$dst, GPR:$base_wb) ,
1685
- (ins GPR:$base, am3offset:$offset), LdMiscFrm, IIC_iLoad_bh_ru,
1686
- "ldrht", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1681
+ def LDRHT : AI3ldstidx<0b1011, 1, 1, 0, (outs GPR:$dst, GPR:$base_wb),
1682
+ (ins GPR:$base, am3offset:$offset), IndexModePost ,
1683
+ LdMiscFrm, IIC_iLoad_bh_ru,
1684
+ "ldrht", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1687
1685
let Inst{21} = 1; // overwrite
1688
1686
}
1689
-
1690
- def LDRSHT : AI3ldshpo<(outs GPR:$dst, GPR:$base_wb) ,
1691
- (ins GPR:$base,am3offset:$offset), LdMiscFrm, IIC_iLoad_bh_ru,
1687
+ def LDRSHT : AI3ldstidx<0b1111, 1, 1, 0, (outs GPR:$dst, GPR:$base_wb),
1688
+ (ins GPR:$base, am3offset:$offset), IndexModePost ,
1689
+ LdMiscFrm, IIC_iLoad_bh_ru,
1692
1690
"ldrsht", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1693
1691
let Inst{21} = 1; // overwrite
1694
1692
}
1693
+ }
1695
1694
1696
1695
// Store
1697
1696
0 commit comments