mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-20 03:23:01 +02:00
[Hexagon] Fix isNVStorable flag in .td files
An upper half and a double word cannot be used as value sources in a new-value store. llvm-svn: 250867
This commit is contained in:
parent
cc2c07a96e
commit
52f05db67a
@ -3303,7 +3303,8 @@ class T_store_pi <string mnemonic, RegisterClass RC, Operand ImmOp,
|
||||
!if (!eq(ImmOpStr, "s4_2Imm"), offset{5-2},
|
||||
!if (!eq(ImmOpStr, "s4_1Imm"), offset{4-1},
|
||||
/* s4_0Imm */ offset{3-0})));
|
||||
let isNVStorable = !if (!eq(ImmOpStr, "s4_3Imm"), 0, 1);
|
||||
// Store upper-half and store doubleword cannot be NV.
|
||||
let isNVStorable = !if (!eq(ImmOpStr, "s4_3Imm"), 0, !if(isHalf,0,1));
|
||||
|
||||
let IClass = 0b1010;
|
||||
|
||||
@ -3322,7 +3323,7 @@ class T_store_pi <string mnemonic, RegisterClass RC, Operand ImmOp,
|
||||
//===----------------------------------------------------------------------===//
|
||||
let isPredicated = 1, hasSideEffects = 0, addrMode = PostInc in
|
||||
class T_pstore_pi <string mnemonic, RegisterClass RC, Operand ImmOp,
|
||||
bits<4> MajOp, bit isHalf, bit isPredNot, bit isPredNew >
|
||||
bits<4> MajOp, bit isHalf, bit isPredNot, bit isPredNew>
|
||||
: STInst <(outs IntRegs:$_dst_),
|
||||
(ins PredRegs:$src1, IntRegs:$src2, ImmOp:$offset, RC:$src3),
|
||||
!if(isPredNot, "if (!$src1", "if ($src1")#!if(isPredNew, ".new) ",
|
||||
@ -3341,7 +3342,8 @@ class T_pstore_pi <string mnemonic, RegisterClass RC, Operand ImmOp,
|
||||
!if (!eq(ImmOpStr, "s4_1Imm"), offset{4-1},
|
||||
/* s4_0Imm */ offset{3-0})));
|
||||
|
||||
let isNVStorable = !if (!eq(ImmOpStr, "s4_3Imm"), 0, 1);
|
||||
// Store upper-half and store doubleword cannot be NV.
|
||||
let isNVStorable = !if (!eq(ImmOpStr, "s4_3Imm"), 0, !if(isHalf,0,1));
|
||||
let isPredicatedNew = isPredNew;
|
||||
let isPredicatedFalse = isPredNot;
|
||||
|
||||
@ -3404,7 +3406,6 @@ def: Storepi_pat<post_store, I64, s4_3ImmPred, S2_storerd_pi>;
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Template class for post increment stores with register offset.
|
||||
//===----------------------------------------------------------------------===//
|
||||
let isNVStorable = 1 in
|
||||
class T_store_pr <string mnemonic, RegisterClass RC, bits<3> MajOp,
|
||||
MemAccessSize AccessSz, bit isHalf = 0>
|
||||
: STInst <(outs IntRegs:$_dst_),
|
||||
@ -3416,6 +3417,9 @@ class T_store_pr <string mnemonic, RegisterClass RC, bits<3> MajOp,
|
||||
bits<5> src3;
|
||||
let accessSize = AccessSz;
|
||||
|
||||
// Store upper-half and store doubleword cannot be NV.
|
||||
let isNVStorable = !if(!eq(mnemonic,"memd"), 0, !if(isHalf,0,1));
|
||||
|
||||
let IClass = 0b1010;
|
||||
|
||||
let Inst{27-24} = 0b1101;
|
||||
@ -3430,12 +3434,11 @@ def S2_storerb_pr : T_store_pr<"memb", IntRegs, 0b000, ByteAccess>;
|
||||
def S2_storerh_pr : T_store_pr<"memh", IntRegs, 0b010, HalfWordAccess>;
|
||||
def S2_storeri_pr : T_store_pr<"memw", IntRegs, 0b100, WordAccess>;
|
||||
def S2_storerd_pr : T_store_pr<"memd", DoubleRegs, 0b110, DoubleWordAccess>;
|
||||
|
||||
def S2_storerf_pr : T_store_pr<"memh", IntRegs, 0b011, HalfWordAccess, 1>;
|
||||
|
||||
let opExtendable = 1, isExtentSigned = 1, isPredicable = 1 in
|
||||
class T_store_io <string mnemonic, RegisterClass RC, Operand ImmOp,
|
||||
bits<3>MajOp, bit isH = 0>
|
||||
bits<3> MajOp, bit isH = 0>
|
||||
: STInst <(outs),
|
||||
(ins IntRegs:$src1, ImmOp:$src2, RC:$src3),
|
||||
mnemonic#"($src1+#$src2) = $src3"#!if(isH,".h","")>,
|
||||
@ -3455,6 +3458,8 @@ class T_store_io <string mnemonic, RegisterClass RC, Operand ImmOp,
|
||||
!if (!eq(ImmOpStr, "s11_2Ext"), src2{12-2},
|
||||
!if (!eq(ImmOpStr, "s11_1Ext"), src2{11-1},
|
||||
/* s11_0Ext */ src2{10-0})));
|
||||
// Store upper-half and store doubleword cannot be NV.
|
||||
let isNVStorable = !if (!eq(mnemonic, "memd"), 0, !if(isH,0,1));
|
||||
let IClass = 0b1010;
|
||||
|
||||
let Inst{27} = 0b0;
|
||||
@ -3494,7 +3499,10 @@ class T_pstore_io <string mnemonic, RegisterClass RC, Operand ImmOp,
|
||||
!if (!eq(ImmOpStr, "u6_2Ext"), src3{7-2},
|
||||
!if (!eq(ImmOpStr, "u6_1Ext"), src3{6-1},
|
||||
/* u6_0Ext */ src3{5-0})));
|
||||
let IClass = 0b0100;
|
||||
// Store upper-half and store doubleword cannot be NV.
|
||||
let isNVStorable = !if (!eq(mnemonic, "memd"), 0, !if(isH,0,1));
|
||||
|
||||
let IClass = 0b0100;
|
||||
|
||||
let Inst{27} = 0b0;
|
||||
let Inst{26} = PredNot;
|
||||
@ -3508,7 +3516,7 @@ class T_pstore_io <string mnemonic, RegisterClass RC, Operand ImmOp,
|
||||
let Inst{1-0} = src1;
|
||||
}
|
||||
|
||||
let isExtendable = 1, isNVStorable = 1, hasSideEffects = 0 in
|
||||
let isExtendable = 1, hasSideEffects = 0 in
|
||||
multiclass ST_Idxd<string mnemonic, string CextOp, RegisterClass RC,
|
||||
Operand ImmOp, Operand predImmOp, bits<3> MajOp, bit isH = 0> {
|
||||
let CextOpcode = CextOp, BaseOpcode = CextOp#_indexed in {
|
||||
@ -3665,7 +3673,7 @@ def S2_allocframe: ST0Inst <
|
||||
|
||||
// S2_storer[bhwdf]_pci: Store byte/half/word/double.
|
||||
// S2_storer[bhwdf]_pci -> S2_storerbnew_pci
|
||||
let Uses = [CS], isNVStorable = 1 in
|
||||
let Uses = [CS] in
|
||||
class T_store_pci <string mnemonic, RegisterClass RC,
|
||||
Operand Imm, bits<4>MajOp,
|
||||
MemAccessSize AlignSize, string RegSrc = "Rt">
|
||||
@ -3679,6 +3687,8 @@ class T_store_pci <string mnemonic, RegisterClass RC,
|
||||
bits<1> Mu;
|
||||
bits<5> Rt;
|
||||
let accessSize = AlignSize;
|
||||
let isNVStorable = !if(!eq(mnemonic,"memd"), 0,
|
||||
!if(!eq(RegSrc,"Rt.h"), 0, 1));
|
||||
|
||||
let IClass = 0b1010;
|
||||
let Inst{27-25} = 0b100;
|
||||
@ -3696,15 +3706,15 @@ class T_store_pci <string mnemonic, RegisterClass RC,
|
||||
}
|
||||
|
||||
def S2_storerb_pci : T_store_pci<"memb", IntRegs, s4_0Imm, 0b1000,
|
||||
ByteAccess>;
|
||||
ByteAccess>;
|
||||
def S2_storerh_pci : T_store_pci<"memh", IntRegs, s4_1Imm, 0b1010,
|
||||
HalfWordAccess>;
|
||||
HalfWordAccess>;
|
||||
def S2_storerf_pci : T_store_pci<"memh", IntRegs, s4_1Imm, 0b1011,
|
||||
HalfWordAccess, "Rt.h">;
|
||||
HalfWordAccess, "Rt.h">;
|
||||
def S2_storeri_pci : T_store_pci<"memw", IntRegs, s4_2Imm, 0b1100,
|
||||
WordAccess>;
|
||||
WordAccess>;
|
||||
def S2_storerd_pci : T_store_pci<"memd", DoubleRegs, s4_3Imm, 0b1110,
|
||||
DoubleWordAccess>;
|
||||
DoubleWordAccess>;
|
||||
|
||||
let Uses = [CS], isNewValue = 1, mayStore = 1, isNVStore = 1, opNewValue = 4 in
|
||||
class T_storenew_pci <string mnemonic, Operand Imm,
|
||||
@ -3762,7 +3772,7 @@ def S2_storerd_pci_pseudo : T_store_pci_pseudo <"memd", DoubleRegs>;
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Circular stores with auto-increment register
|
||||
//===----------------------------------------------------------------------===//
|
||||
let Uses = [CS], isNVStorable = 1 in
|
||||
let Uses = [CS] in
|
||||
class T_store_pcr <string mnemonic, RegisterClass RC, bits<4>MajOp,
|
||||
MemAccessSize AlignSize, string RegSrc = "Rt">
|
||||
: STInst <(outs IntRegs:$_dst_),
|
||||
@ -3775,6 +3785,8 @@ class T_store_pcr <string mnemonic, RegisterClass RC, bits<4>MajOp,
|
||||
bits<5> Rt;
|
||||
|
||||
let accessSize = AlignSize;
|
||||
let isNVStorable = !if(!eq(mnemonic,"memd"), 0,
|
||||
!if(!eq(RegSrc,"Rt.h"), 0, 1));
|
||||
|
||||
let IClass = 0b1010;
|
||||
let Inst{27-25} = 0b100;
|
||||
|
@ -684,7 +684,7 @@ def: Pat<(i64 (zext (i32 IntRegs:$src1))),
|
||||
// Template class for store instructions with Absolute set addressing mode.
|
||||
//===----------------------------------------------------------------------===//
|
||||
let isExtended = 1, opExtendable = 1, opExtentBits = 6,
|
||||
addrMode = AbsoluteSet, isNVStorable = 1 in
|
||||
addrMode = AbsoluteSet in
|
||||
class T_ST_absset <string mnemonic, string BaseOp, RegisterClass RC,
|
||||
bits<3> MajOp, MemAccessSize AccessSz, bit isHalf = 0>
|
||||
: STInst<(outs IntRegs:$dst),
|
||||
@ -696,6 +696,9 @@ class T_ST_absset <string mnemonic, string BaseOp, RegisterClass RC,
|
||||
let accessSize = AccessSz;
|
||||
let BaseOpcode = BaseOp#"_AbsSet";
|
||||
|
||||
// Store upper-half and store doubleword cannot be NV.
|
||||
let isNVStorable = !if (!eq(mnemonic, "memd"), 0, !if(isHalf,0,1));
|
||||
|
||||
let IClass = 0b1010;
|
||||
|
||||
let Inst{27-24} = 0b1011;
|
||||
@ -750,7 +753,7 @@ let mayStore = 1, addrMode = AbsoluteSet in {
|
||||
}
|
||||
|
||||
let isExtended = 1, opExtendable = 2, opExtentBits = 6, InputType = "imm",
|
||||
addrMode = BaseLongOffset, AddedComplexity = 40 in
|
||||
addrMode = BaseLongOffset, AddedComplexity = 40 in
|
||||
class T_StoreAbsReg <string mnemonic, string CextOp, RegisterClass RC,
|
||||
bits<3> MajOp, MemAccessSize AccessSz, bit isHalf = 0>
|
||||
: STInst<(outs),
|
||||
@ -766,6 +769,10 @@ class T_StoreAbsReg <string mnemonic, string CextOp, RegisterClass RC,
|
||||
let accessSize = AccessSz;
|
||||
let CextOpcode = CextOp;
|
||||
let BaseOpcode = CextOp#"_shl";
|
||||
|
||||
// Store upper-half and store doubleword cannot be NV.
|
||||
let isNVStorable = !if (!eq(mnemonic, "memd"), 0, !if(isHalf,0,1));
|
||||
|
||||
let IClass = 0b1010;
|
||||
|
||||
let Inst{27-24} =0b1101;
|
||||
@ -856,6 +863,9 @@ class T_store_rr <string mnemonic, RegisterClass RC, bits<3> MajOp, bit isH>
|
||||
bits<2> u2;
|
||||
bits<5> Rt;
|
||||
|
||||
// Store upper-half and store doubleword cannot be NV.
|
||||
let isNVStorable = !if (!eq(mnemonic, "memd"), 0, !if(isH,0,1));
|
||||
|
||||
let IClass = 0b0011;
|
||||
|
||||
let Inst{27-24} = 0b1011;
|
||||
@ -888,6 +898,8 @@ class T_pstore_rr <string mnemonic, RegisterClass RC, bits<3> MajOp,
|
||||
|
||||
let isPredicatedFalse = isNot;
|
||||
let isPredicatedNew = isPredNew;
|
||||
// Store upper-half and store doubleword cannot be NV.
|
||||
let isNVStorable = !if (!eq(mnemonic, "memd"), 0, !if(isH,0,1));
|
||||
|
||||
let IClass = 0b0011;
|
||||
|
||||
@ -3306,7 +3318,7 @@ let isCall = 1, Uses = [R29, R31], isAsmParserOnly = 1 in {
|
||||
// Template class for non predicated store instructions with
|
||||
// GP-Relative or absolute addressing.
|
||||
//===----------------------------------------------------------------------===//
|
||||
let hasSideEffects = 0, isPredicable = 1, isNVStorable = 1 in
|
||||
let hasSideEffects = 0, isPredicable = 1 in
|
||||
class T_StoreAbsGP <string mnemonic, RegisterClass RC, Operand ImmOp,
|
||||
bits<2>MajOp, Operand AddrOp, bit isAbs, bit isHalf>
|
||||
: STInst<(outs), (ins AddrOp:$addr, RC:$src),
|
||||
@ -3321,6 +3333,9 @@ class T_StoreAbsGP <string mnemonic, RegisterClass RC, Operand ImmOp,
|
||||
!if (!eq(ImmOpStr, "u16_2Imm"), addr{17-2},
|
||||
!if (!eq(ImmOpStr, "u16_1Imm"), addr{16-1},
|
||||
/* u16_0Imm */ addr{15-0})));
|
||||
// Store upper-half and store doubleword cannot be NV.
|
||||
let isNVStorable = !if (!eq(mnemonic, "memd"), 0, !if(isHalf,0,1));
|
||||
|
||||
let IClass = 0b0100;
|
||||
let Inst{27} = 1;
|
||||
let Inst{26-25} = offsetBits{15-14};
|
||||
@ -3337,8 +3352,7 @@ class T_StoreAbsGP <string mnemonic, RegisterClass RC, Operand ImmOp,
|
||||
// Template class for predicated store instructions with
|
||||
// GP-Relative or absolute addressing.
|
||||
//===----------------------------------------------------------------------===//
|
||||
let hasSideEffects = 0, isPredicated = 1, isNVStorable = 1, opExtentBits = 6,
|
||||
opExtendable = 1 in
|
||||
let hasSideEffects = 0, isPredicated = 1, opExtentBits = 6, opExtendable = 1 in
|
||||
class T_StoreAbs_Pred <string mnemonic, RegisterClass RC, bits<2> MajOp,
|
||||
bit isHalf, bit isNot, bit isNew>
|
||||
: STInst<(outs), (ins PredRegs:$src1, u6Ext:$absaddr, RC: $src2),
|
||||
@ -3351,6 +3365,8 @@ class T_StoreAbs_Pred <string mnemonic, RegisterClass RC, bits<2> MajOp,
|
||||
|
||||
let isPredicatedNew = isNew;
|
||||
let isPredicatedFalse = isNot;
|
||||
// Store upper-half and store doubleword cannot be NV.
|
||||
let isNVStorable = !if (!eq(mnemonic, "memd"), 0, !if(isHalf,0,1));
|
||||
|
||||
let IClass = 0b1010;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user