mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-08 20:30:50 +00:00
[Hexagon] Replacing the remaining postincrement stores with versions that have encoding bits.
llvm-svn: 224951
This commit is contained in:
parent
4e9711a8ac
commit
d92e961fd1
@ -709,9 +709,9 @@ SDNode *HexagonDAGToDAGISel::SelectIndexedStore(StoreSDNode *ST, SDLoc dl) {
|
||||
unsigned Opcode = 0;
|
||||
|
||||
// Figure out the post inc version of opcode.
|
||||
if (StoredVT == MVT::i64) Opcode = Hexagon::POST_STdri;
|
||||
else if (StoredVT == MVT::i32) Opcode = Hexagon::POST_STwri;
|
||||
else if (StoredVT == MVT::i16) Opcode = Hexagon::POST_SThri;
|
||||
if (StoredVT == MVT::i64) Opcode = Hexagon::S2_storerd_pi;
|
||||
else if (StoredVT == MVT::i32) Opcode = Hexagon::S2_storeri_pi;
|
||||
else if (StoredVT == MVT::i16) Opcode = Hexagon::S2_storerh_pi;
|
||||
else if (StoredVT == MVT::i8) Opcode = Hexagon::S2_storerb_pi;
|
||||
else llvm_unreachable("unknown memory type");
|
||||
|
||||
|
@ -1437,8 +1437,8 @@ isConditionalStore (const MachineInstr* MI) const {
|
||||
case Hexagon::STrid_indexed_cPt :
|
||||
case Hexagon::STrid_indexed_cNotPt :
|
||||
case Hexagon::STrid_indexed_shl_cPt_V4 :
|
||||
case Hexagon::POST_STdri_cPt :
|
||||
case Hexagon::POST_STdri_cNotPt :
|
||||
case Hexagon::S2_pstorerdt_pi:
|
||||
case Hexagon::S2_pstorerdf_pi:
|
||||
case Hexagon::STrih_cPt :
|
||||
case Hexagon::STrih_cNotPt :
|
||||
case Hexagon::STrih_indexed_cPt :
|
||||
@ -1447,8 +1447,8 @@ isConditionalStore (const MachineInstr* MI) const {
|
||||
case Hexagon::STrih_imm_cNotPt_V4 :
|
||||
case Hexagon::STrih_indexed_shl_cPt_V4 :
|
||||
case Hexagon::STrih_indexed_shl_cNotPt_V4 :
|
||||
case Hexagon::POST_SThri_cPt :
|
||||
case Hexagon::POST_SThri_cNotPt :
|
||||
case Hexagon::S2_pstorerht_pi:
|
||||
case Hexagon::S2_pstorerhf_pi:
|
||||
case Hexagon::STriw_cPt :
|
||||
case Hexagon::STriw_cNotPt :
|
||||
case Hexagon::STriw_indexed_cPt :
|
||||
@ -1457,8 +1457,8 @@ isConditionalStore (const MachineInstr* MI) const {
|
||||
case Hexagon::STriw_imm_cNotPt_V4 :
|
||||
case Hexagon::STriw_indexed_shl_cPt_V4 :
|
||||
case Hexagon::STriw_indexed_shl_cNotPt_V4 :
|
||||
case Hexagon::POST_STwri_cPt :
|
||||
case Hexagon::POST_STwri_cNotPt :
|
||||
case Hexagon::S2_pstorerit_pi:
|
||||
case Hexagon::S2_pstorerif_pi:
|
||||
return QRI.Subtarget.hasV4TOps();
|
||||
|
||||
// V4 global address store before promoting to dot new.
|
||||
|
@ -2753,55 +2753,17 @@ multiclass ST_PostInc<string mnemonic, string BaseOp, RegisterClass RC,
|
||||
let accessSize = ByteAccess, isCodeGenOnly = 0 in
|
||||
defm storerb: ST_PostInc <"memb", "STrib", IntRegs, s4_0Imm, 0b1000>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Post increment store
|
||||
//===----------------------------------------------------------------------===//
|
||||
let accessSize = HalfWordAccess, isCodeGenOnly = 0 in
|
||||
defm storerh: ST_PostInc <"memh", "STrih", IntRegs, s4_1Imm, 0b1010>;
|
||||
|
||||
multiclass ST_PostInc_Pbase<string mnemonic, RegisterClass RC, Operand ImmOp,
|
||||
bit isNot, bit isPredNew> {
|
||||
let isPredicatedNew = isPredNew in
|
||||
def NAME : STInst2PI<(outs IntRegs:$dst),
|
||||
(ins PredRegs:$src1, IntRegs:$src2, ImmOp:$offset, RC:$src3),
|
||||
!if(isNot, "if (!$src1", "if ($src1")#!if(isPredNew, ".new) ",
|
||||
") ")#mnemonic#"($src2++#$offset) = $src3",
|
||||
[],
|
||||
"$src2 = $dst">;
|
||||
}
|
||||
let accessSize = WordAccess, isCodeGenOnly = 0 in
|
||||
defm storeri: ST_PostInc <"memw", "STriw", IntRegs, s4_2Imm, 0b1100>;
|
||||
|
||||
multiclass ST_PostInc_Pred<string mnemonic, RegisterClass RC,
|
||||
Operand ImmOp, bit PredNot> {
|
||||
let isPredicatedFalse = PredNot in {
|
||||
defm _c#NAME : ST_PostInc_Pbase<mnemonic, RC, ImmOp, PredNot, 0>;
|
||||
// Predicate new
|
||||
let Predicates = [HasV4T], validSubTargets = HasV4SubT in
|
||||
defm _cdn#NAME#_V4 : ST_PostInc_Pbase<mnemonic, RC, ImmOp, PredNot, 1>;
|
||||
}
|
||||
}
|
||||
let accessSize = DoubleWordAccess, isCodeGenOnly = 0 in
|
||||
defm storerd: ST_PostInc <"memd", "STrid", DoubleRegs, s4_3Imm, 0b1110>;
|
||||
|
||||
let hasCtrlDep = 1, isNVStorable = 1, hasSideEffects = 0 in
|
||||
multiclass ST_PostInc2<string mnemonic, string BaseOp, RegisterClass RC,
|
||||
Operand ImmOp> {
|
||||
|
||||
let hasCtrlDep = 1, BaseOpcode = "POST_"#BaseOp in {
|
||||
let isPredicable = 1 in
|
||||
def NAME : STInst2PI<(outs IntRegs:$dst),
|
||||
(ins IntRegs:$src1, ImmOp:$offset, RC:$src2),
|
||||
mnemonic#"($src1++#$offset) = $src2",
|
||||
[],
|
||||
"$src1 = $dst">;
|
||||
|
||||
let isPredicated = 1 in {
|
||||
defm Pt : ST_PostInc_Pred<mnemonic, RC, ImmOp, 0 >;
|
||||
defm NotPt : ST_PostInc_Pred<mnemonic, RC, ImmOp, 1 >;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
defm POST_SThri: ST_PostInc2 <"memh", "STrih", IntRegs, s4_1Imm>, AddrModeRel;
|
||||
defm POST_STwri: ST_PostInc2 <"memw", "STriw", IntRegs, s4_2Imm>, AddrModeRel;
|
||||
|
||||
let isNVStorable = 0 in
|
||||
defm POST_STdri: ST_PostInc2 <"memd", "STrid", DoubleRegs, s4_3Imm>, AddrModeRel;
|
||||
let accessSize = HalfWordAccess, isNVStorable = 0, isCodeGenOnly = 0 in
|
||||
defm storerf: ST_PostInc <"memh", "STrih_H", IntRegs, s4_1Imm, 0b1011, 1>;
|
||||
|
||||
def : Pat<(post_truncsti8 (i32 IntRegs:$src1), IntRegs:$src2,
|
||||
s4_3ImmPred:$offset),
|
||||
@ -2809,14 +2771,14 @@ def : Pat<(post_truncsti8 (i32 IntRegs:$src1), IntRegs:$src2,
|
||||
|
||||
def : Pat<(post_truncsti16 (i32 IntRegs:$src1), IntRegs:$src2,
|
||||
s4_3ImmPred:$offset),
|
||||
(POST_SThri IntRegs:$src2, s4_1ImmPred:$offset, IntRegs:$src1)>;
|
||||
(S2_storerh_pi IntRegs:$src2, s4_1ImmPred:$offset, IntRegs:$src1)>;
|
||||
|
||||
def : Pat<(post_store (i32 IntRegs:$src1), IntRegs:$src2, s4_2ImmPred:$offset),
|
||||
(POST_STwri IntRegs:$src2, s4_1ImmPred:$offset, IntRegs:$src1)>;
|
||||
(S2_storeri_pi IntRegs:$src2, s4_1ImmPred:$offset, IntRegs:$src1)>;
|
||||
|
||||
def : Pat<(post_store (i64 DoubleRegs:$src1), IntRegs:$src2,
|
||||
s4_3ImmPred:$offset),
|
||||
(POST_STdri IntRegs:$src2, s4_3ImmPred:$offset, DoubleRegs:$src1)>;
|
||||
(S2_storerd_pi IntRegs:$src2, s4_3ImmPred:$offset, DoubleRegs:$src1)>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// multiclass for the store instructions with MEMri operand.
|
||||
|
@ -1,5 +1,18 @@
|
||||
# RUN: llvm-mc --triple hexagon -disassemble < %s | FileCheck %s
|
||||
|
||||
0x28 0xd4 0xd1 0xab
|
||||
# CHECK: memd(r17++#40) = r21:20
|
||||
0x2b 0xf4 0xd1 0xab
|
||||
# CHECK: if (p3) memd(r17++#40) = r21:20
|
||||
0x2f 0xf4 0xd1 0xab
|
||||
# CHECK: if (!p3) memd(r17++#40) = r21:20
|
||||
0x03 0x40 0x45 0x85 0xab 0xf4 0xd1 0xab
|
||||
# CHECK: p3 = r5
|
||||
# CHECK-NEXT: if (p3.new) memd(r17++#40) = r21:20
|
||||
0x03 0x40 0x45 0x85 0xaf 0xf4 0xd1 0xab
|
||||
# CHECK: p3 = r5
|
||||
# CHECK-NEXT: if (!p3.new) memd(r17++#40) = r21:20
|
||||
|
||||
0x28 0xd5 0x11 0xab
|
||||
# CHECK: memb(r17++#5) = r21
|
||||
0x2b 0xf5 0x11 0xab
|
||||
@ -11,4 +24,30 @@
|
||||
# CHECK-NEXT: if (p3.new) memb(r17++#5) = r21
|
||||
0x03 0x40 0x45 0x85 0xaf 0xf5 0x11 0xab
|
||||
# CHECK: p3 = r5
|
||||
# CHECK-NEXT: if (!p3.new) memb(r17++#5) = r21
|
||||
# CHECK-NEXT: if (!p3.new) memb(r17++#5) = r21
|
||||
|
||||
0x28 0xd5 0x51 0xab
|
||||
# CHECK: memh(r17++#10) = r21
|
||||
0x2b 0xf5 0x51 0xab
|
||||
# CHECK: if (p3) memh(r17++#10) = r21
|
||||
0x2f 0xf5 0x51 0xab
|
||||
# CHECK: if (!p3) memh(r17++#10) = r21
|
||||
0x03 0x40 0x45 0x85 0xab 0xf5 0x51 0xab
|
||||
# CHECK: p3 = r5
|
||||
# CHECK-NEXT: if (p3.new) memh(r17++#10) = r21
|
||||
0x03 0x40 0x45 0x85 0xaf 0xf5 0x51 0xab
|
||||
# CHECK: p3 = r5
|
||||
# CHECK-NEXT: if (!p3.new) memh(r17++#10) = r21
|
||||
|
||||
0x28 0xd5 0x91 0xab
|
||||
# CHECK: memw(r17++#20) = r21
|
||||
0x2b 0xf5 0x91 0xab
|
||||
# CHECK: if (p3) memw(r17++#20) = r21
|
||||
0x2f 0xf5 0x91 0xab
|
||||
# CHECK: if (!p3) memw(r17++#20) = r21
|
||||
0x03 0x40 0x45 0x85 0xaf 0xf5 0x91 0xab
|
||||
# CHECK: p3 = r5
|
||||
# CHECK-NEXT: if (!p3.new) memw(r17++#20) = r21
|
||||
0x03 0x40 0x45 0x85 0xab 0xf5 0x91 0xab
|
||||
# CHECK: p3 = r5
|
||||
# CHECK-NEXT: if (p3.new) memw(r17++#20) = r21
|
Loading…
Reference in New Issue
Block a user