1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00

[Hexagon] Adding new-value store and bit reverse instructions.

llvm-svn: 226224
This commit is contained in:
Colin LeMahieu 2015-01-15 23:10:29 +00:00
parent f8083bfc50
commit ef6291ec41
3 changed files with 133 additions and 0 deletions

View File

@ -3009,6 +3009,40 @@ def S2_storerd_pci : T_store_pci<"memd", DoubleRegs, s4_3Imm, 0b1110,
DoubleWordAccess>;
}
let Uses = [CS], isNewValue = 1, mayStore = 1, isNVStore = 1, opNewValue = 4 in
class T_storenew_pci <string mnemonic, Operand Imm,
bits<2>MajOp, MemAccessSize AlignSize>
: NVInst < (outs IntRegs:$_dst_),
(ins IntRegs:$Rz, Imm:$offset, ModRegs:$Mu, IntRegs:$Nt),
#mnemonic#"($Rz ++ #$offset:circ($Mu)) = $Nt.new",
[],
"$Rz = $_dst_"> {
bits<5> Rz;
bits<6> offset;
bits<1> Mu;
bits<3> Nt;
let accessSize = AlignSize;
let IClass = 0b1010;
let Inst{27-21} = 0b1001101;
let Inst{20-16} = Rz;
let Inst{13} = Mu;
let Inst{12-11} = MajOp;
let Inst{10-8} = Nt;
let Inst{7} = 0b0;
let Inst{6-3} =
!if (!eq(!cast<string>(AlignSize), "WordAccess"), offset{5-2},
!if (!eq(!cast<string>(AlignSize), "HalfWordAccess"), offset{4-1},
/* ByteAccess */ offset{3-0}));
let Inst{1} = 0b0;
}
let isCodeGenOnly = 0 in {
def S2_storerbnew_pci : T_storenew_pci <"memb", s4_0Imm, 0b00, ByteAccess>;
def S2_storerhnew_pci : T_storenew_pci <"memh", s4_1Imm, 0b01, HalfWordAccess>;
def S2_storerinew_pci : T_storenew_pci <"memw", s4_2Imm, 0b10, WordAccess>;
}
//===----------------------------------------------------------------------===//
// Circular stores with auto-increment register
//===----------------------------------------------------------------------===//
@ -3045,6 +3079,39 @@ def S2_storerf_pcr : T_store_pcr<"memh", IntRegs, 0b1011,
HalfWordAccess, "Rt.h">;
}
//===----------------------------------------------------------------------===//
// Circular .new stores with auto-increment register
//===----------------------------------------------------------------------===//
let Uses = [CS], isNewValue = 1, mayStore = 1, isNVStore = 1, opNewValue = 3 in
class T_storenew_pcr <string mnemonic, bits<2>MajOp,
MemAccessSize AlignSize>
: NVInst <(outs IntRegs:$_dst_),
(ins IntRegs:$Rz, ModRegs:$Mu, IntRegs:$Nt),
#mnemonic#"($Rz ++ I:circ($Mu)) = $Nt.new" ,
[] ,
"$Rz = $_dst_"> {
bits<5> Rz;
bits<1> Mu;
bits<3> Nt;
let accessSize = AlignSize;
let IClass = 0b1010;
let Inst{27-21} = 0b1001101;
let Inst{20-16} = Rz;
let Inst{13} = Mu;
let Inst{12-11} = MajOp;
let Inst{10-8} = Nt;
let Inst{7} = 0b0;
let Inst{1} = 0b1;
}
let isCodeGenOnly = 0 in {
def S2_storerbnew_pcr : T_storenew_pcr <"memb", 0b00, ByteAccess>;
def S2_storerhnew_pcr : T_storenew_pcr <"memh", 0b01, HalfWordAccess>;
def S2_storerinew_pcr : T_storenew_pcr <"memw", 0b10, WordAccess>;
}
//===----------------------------------------------------------------------===//
// Bit-reversed stores with auto-increment register
//===----------------------------------------------------------------------===//
@ -3090,6 +3157,40 @@ def S2_storerf_pbr : T_store_pbr<"memh", IntRegs, HalfWordAccess, 0b011, 1>;
def S2_storerd_pbr : T_store_pbr<"memd", DoubleRegs, DoubleWordAccess, 0b110>;
}
//===----------------------------------------------------------------------===//
// Bit-reversed .new stores with auto-increment register
//===----------------------------------------------------------------------===//
let isNewValue = 1, mayStore = 1, isNVStore = 1, opNewValue = 3,
hasSideEffects = 0 in
class T_storenew_pbr<string mnemonic, MemAccessSize addrSize, bits<2> majOp>
: NVInst <(outs IntRegs:$_dst_),
(ins IntRegs:$Rz, ModRegs:$Mu, IntRegs:$Nt),
#mnemonic#"($Rz ++ $Mu:brev) = $Nt.new", [],
"$Rz = $_dst_">, NewValueRel {
let accessSize = addrSize;
bits<5> Rz;
bits<1> Mu;
bits<3> Nt;
let IClass = 0b1010;
let Inst{27-21} = 0b1111101;
let Inst{12-11} = majOp;
let Inst{7} = 0b0;
let Inst{20-16} = Rz;
let Inst{13} = Mu;
let Inst{10-8} = Nt;
}
let BaseOpcode = "S2_storerb_pbr", isCodeGenOnly = 0 in
def S2_storerbnew_pbr : T_storenew_pbr<"memb", ByteAccess, 0b00>;
let BaseOpcode = "S2_storerh_pbr", isCodeGenOnly = 0 in
def S2_storerhnew_pbr : T_storenew_pbr<"memh", HalfWordAccess, 0b01>;
let BaseOpcode = "S2_storeri_pbr", isCodeGenOnly = 0 in
def S2_storerinew_pbr : T_storenew_pbr<"memw", WordAccess, 0b10>;
//===----------------------------------------------------------------------===//
// ST -
//===----------------------------------------------------------------------===//
@ -3157,6 +3258,9 @@ let Defs = [USR_OVF], isCodeGenOnly = 0 in {
}
let Itinerary = S_2op_tc_2_SLOT23, isCodeGenOnly = 0 in {
// Bit reverse
def S2_brev : T_S2op_1_ii <"brev", 0b01, 0b110>;
// Absolute value word
def A2_abs : T_S2op_1_ii <"abs", 0b10, 0b100>;

View File

@ -6,12 +6,21 @@
0x1f 0x40 0x7f 0x70 0x15 0xc2 0xb1 0xa1
# CHECK: r31 = r31
# CHECK-NEXT: memb(r17+#21) = r2.new
0x1f 0x40 0x7f 0x70 0x02 0xe2 0xb1 0xa9
# CHECK: r31 = r31
# CHECK-NEXT: memb(r17 ++ I:circ(m1)) = r2.new
0x1f 0x40 0x7f 0x70 0x28 0xe2 0xb1 0xa9
# CHECK: r31 = r31
# CHECK-NEXT: memb(r17 ++ #5:circ(m1)) = r2.new
0x1f 0x40 0x7f 0x70 0x28 0xc2 0xb1 0xab
# CHECK: r31 = r31
# CHECK-NEXT: memb(r17++#5) = r2.new
0x1f 0x40 0x7f 0x70 0x00 0xe2 0xb1 0xad
# CHECK: r31 = r31
# CHECK-NEXT: memb(r17++m1) = r2.new
0x1f 0x40 0x7f 0x70 0x00 0xe2 0xb1 0xaf
# CHECK: r31 = r31
# CHECK-NEXT: memb(r17 ++ m1:brev) = r2.new
0x1f 0x40 0x7f 0x70 0xe2 0xf5 0xb1 0x34
# CHECK: r31 = r31
# CHECK-NEXT: if (p3) memb(r17+r21<<#3) = r2.new
@ -61,12 +70,21 @@
0x1f 0x40 0x7f 0x70 0x15 0xca 0xb1 0xa1
# CHECK: r31 = r31
# CHECK-NEXT: memh(r17+#42) = r2.new
0x1f 0x40 0x7f 0x70 0x02 0xea 0xb1 0xa9
# CHECK: r31 = r31
# CHECK-NEXT: memh(r17 ++ I:circ(m1)) = r2.new
0x1f 0x40 0x7f 0x70 0x28 0xea 0xb1 0xa9
# CHECK: r31 = r31
# CHECK-NEXT: memh(r17 ++ #10:circ(m1)) = r2.new
0x1f 0x40 0x7f 0x70 0x28 0xca 0xb1 0xab
# CHECK: r31 = r31
# CHECK-NEXT: memh(r17++#10) = r2.new
0x1f 0x40 0x7f 0x70 0x00 0xea 0xb1 0xad
# CHECK: r31 = r31
# CHECK-NEXT: memh(r17++m1) = r2.new
0x1f 0x40 0x7f 0x70 0x00 0xea 0xb1 0xaf
# CHECK: r31 = r31
# CHECK-NEXT: memh(r17 ++ m1:brev) = r2.new
0x1f 0x40 0x7f 0x70 0xea 0xf5 0xb1 0x34
# CHECK: r31 = r31
# CHECK-NEXT: if (p3) memh(r17+r21<<#3) = r2.new
@ -116,12 +134,21 @@
0x1f 0x40 0x7f 0x70 0x15 0xd2 0xb1 0xa1
# CHECK: r31 = r31
# CHECK-NEXT: memw(r17+#84) = r2.new
0x1f 0x40 0x7f 0x70 0x28 0xf2 0xb1 0xa9
# CHECK: r31 = r31
# CHECK-NEXT: memw(r17 ++ #20:circ(m1)) = r2.new
0x1f 0x40 0x7f 0x70 0x02 0xf2 0xb1 0xa9
# CHECK: r31 = r31
# CHECK-NEXT: memw(r17 ++ I:circ(m1)) = r2.new
0x1f 0x40 0x7f 0x70 0x28 0xd2 0xb1 0xab
# CHECK: r31 = r31
# CHECK-NEXT: memw(r17++#20) = r2.new
0x1f 0x40 0x7f 0x70 0x00 0xf2 0xb1 0xad
# CHECK: r31 = r31
# CHECK-NEXT: memw(r17++m1) = r2.new
0x1f 0x40 0x7f 0x70 0x00 0xf2 0xb1 0xaf
# CHECK: r31 = r31
# CHECK-NEXT: memw(r17 ++ m1:brev) = r2.new
0x1f 0x40 0x7f 0x70 0xf2 0xf5 0xb1 0x34
# CHECK: r31 = r31
# CHECK-NEXT: if (p3) memw(r17+r21<<#3) = r2.new

View File

@ -66,6 +66,8 @@
# CHECK: r17 = parity(r21, r31)
0xd0 0xc0 0xd4 0x80
# CHECK: r17:16 = brev(r21:20)
0xd1 0xc0 0x55 0x8c
# CHECK: r17 = brev(r21)
0x11 0xdf 0xd5 0x8c
# CHECK: r17 = setbit(r21, #31)
0x31 0xdf 0xd5 0x8c