mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
[Hexagon] Adding auto-incrementing loads with and without byte reversal.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224871 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
de2cee5556
commit
17946361cc
@ -1742,6 +1742,43 @@ let AddedComplexity = 20 in
|
||||
def : Pat < (i32 (zextloadi1 (add IntRegs:$src1, s11_0ImmPred:$offset))),
|
||||
(i32 (L2_loadrub_io IntRegs:$src1, s11_0ImmPred:$offset))>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Template class for post increment loads with register offset.
|
||||
//===----------------------------------------------------------------------===//
|
||||
let hasSideEffects = 0, addrMode = PostInc in
|
||||
class T_load_pr <string mnemonic, RegisterClass RC, bits<4> MajOp,
|
||||
MemAccessSize AccessSz>
|
||||
: LDInstPI <(outs RC:$dst, IntRegs:$_dst_),
|
||||
(ins IntRegs:$src1, ModRegs:$src2),
|
||||
"$dst = "#mnemonic#"($src1++$src2)" ,
|
||||
[], "$src1 = $_dst_" > {
|
||||
bits<5> dst;
|
||||
bits<5> src1;
|
||||
bits<1> src2;
|
||||
|
||||
let accessSize = AccessSz;
|
||||
let IClass = 0b1001;
|
||||
|
||||
let Inst{27-25} = 0b110;
|
||||
let Inst{24-21} = MajOp;
|
||||
let Inst{20-16} = src1;
|
||||
let Inst{13} = src2;
|
||||
let Inst{12} = 0b0;
|
||||
let Inst{7} = 0b0;
|
||||
let Inst{4-0} = dst;
|
||||
}
|
||||
|
||||
let hasNewValue = 1, isCodeGenOnly = 0 in {
|
||||
def L2_loadrb_pr : T_load_pr <"memb", IntRegs, 0b1000, ByteAccess>;
|
||||
def L2_loadrub_pr : T_load_pr <"memub", IntRegs, 0b1001, ByteAccess>;
|
||||
def L2_loadrh_pr : T_load_pr <"memh", IntRegs, 0b1010, HalfWordAccess>;
|
||||
def L2_loadruh_pr : T_load_pr <"memuh", IntRegs, 0b1011, HalfWordAccess>;
|
||||
def L2_loadri_pr : T_load_pr <"memw", IntRegs, 0b1100, WordAccess>;
|
||||
}
|
||||
|
||||
let isCodeGenOnly = 0 in
|
||||
def L2_loadrd_pr : T_load_pr <"memd", DoubleRegs, 0b1110, DoubleWordAccess>;
|
||||
|
||||
// Load predicate.
|
||||
let isExtendable = 1, opExtendable = 2, isExtentSigned = 1, opExtentBits = 13,
|
||||
isPseudo = 1, Defs = [R10,R11,D5], hasSideEffects = 0 in
|
||||
@ -1870,6 +1907,45 @@ let hasNewValue = 1, accessSize = WordAccess, opNewValue = 0, isCodeGenOnly = 0
|
||||
def L2_loadw_locked : T_load_locked <"memw_locked", IntRegs>;
|
||||
let accessSize = DoubleWordAccess, isCodeGenOnly = 0 in
|
||||
def L4_loadd_locked : T_load_locked <"memd_locked", DoubleRegs>;
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Bit-reversed loads with auto-increment register
|
||||
//===----------------------------------------------------------------------===//
|
||||
let hasSideEffects = 0 in
|
||||
class T_load_pbr<string mnemonic, RegisterClass RC,
|
||||
MemAccessSize addrSize, bits<4> majOp>
|
||||
: LDInst
|
||||
<(outs RC:$dst, IntRegs:$_dst_),
|
||||
(ins IntRegs:$Rz, ModRegs:$Mu),
|
||||
"$dst = "#mnemonic#"($Rz ++ $Mu:brev)" ,
|
||||
[] , "$Rz = $_dst_" > {
|
||||
|
||||
let accessSize = addrSize;
|
||||
|
||||
bits<5> dst;
|
||||
bits<5> Rz;
|
||||
bits<1> Mu;
|
||||
|
||||
let IClass = 0b1001;
|
||||
|
||||
let Inst{27-25} = 0b111;
|
||||
let Inst{24-21} = majOp;
|
||||
let Inst{20-16} = Rz;
|
||||
let Inst{13} = Mu;
|
||||
let Inst{12} = 0b0;
|
||||
let Inst{7} = 0b0;
|
||||
let Inst{4-0} = dst;
|
||||
}
|
||||
|
||||
let hasNewValue =1, opNewValue = 0, isCodeGenOnly = 0 in {
|
||||
def L2_loadrb_pbr : T_load_pbr <"memb", IntRegs, ByteAccess, 0b1000>;
|
||||
def L2_loadrub_pbr : T_load_pbr <"memub", IntRegs, ByteAccess, 0b1001>;
|
||||
def L2_loadrh_pbr : T_load_pbr <"memh", IntRegs, HalfWordAccess, 0b1010>;
|
||||
def L2_loadruh_pbr : T_load_pbr <"memuh", IntRegs, HalfWordAccess, 0b1011>;
|
||||
def L2_loadri_pbr : T_load_pbr <"memw", IntRegs, WordAccess, 0b1100>;
|
||||
}
|
||||
|
||||
let isCodeGenOnly = 0 in
|
||||
def L2_loadrd_pbr : T_load_pbr <"memd", DoubleRegs, DoubleWordAccess, 0b1110>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// LD -
|
||||
|
@ -8,6 +8,10 @@
|
||||
# CHECK: r17:16 = memd(r21 ++ I:circ(m1))
|
||||
0xb0 0xc0 0xd5 0x9b
|
||||
# CHECK: r17:16 = memd(r21++#40)
|
||||
0x10 0xe0 0xd5 0x9d
|
||||
# CHECK: r17:16 = memd(r21++m1)
|
||||
0x10 0xe0 0xd5 0x9f
|
||||
# CHECK: r17:16 = memd(r21 ++ m1:brev)
|
||||
0x03 0x40 0x45 0x85 0x70 0xd8 0xd5 0x43
|
||||
# CHECK: p3 = r5
|
||||
# CHECK-NEXT: if (p3.new) r17:16 = memd(r21 + #24)
|
||||
@ -35,6 +39,10 @@
|
||||
# CHECK: r17 = memb(r21 ++ I:circ(m1))
|
||||
0xb1 0xc0 0x15 0x9b
|
||||
# CHECK: r17 = memb(r21++#5)
|
||||
0x11 0xe0 0x15 0x9d
|
||||
# CHECK: r17 = memb(r21++m1)
|
||||
0x11 0xe0 0x15 0x9f
|
||||
# CHECK: r17 = memb(r21 ++ m1:brev)
|
||||
0x91 0xdd 0x15 0x41
|
||||
# CHECK: if (p3) r17 = memb(r21 + #44)
|
||||
0x03 0x40 0x45 0x85 0x91 0xdd 0x15 0x43
|
||||
@ -64,6 +72,10 @@
|
||||
# CHECK: r17 = memh(r21 ++ I:circ(m1))
|
||||
0xb1 0xc0 0x55 0x9b
|
||||
# CHECK: r17 = memh(r21++#10)
|
||||
0x11 0xe0 0x55 0x9d
|
||||
# CHECK: r17 = memh(r21++m1)
|
||||
0x11 0xe0 0x55 0x9f
|
||||
# CHECK: r17 = memh(r21 ++ m1:brev)
|
||||
0xb1 0xe6 0x55 0x9b
|
||||
# CHECK: if (p3) r17 = memh(r21++#10)
|
||||
0xb1 0xee 0x55 0x9b
|
||||
@ -83,6 +95,10 @@
|
||||
# CHECK: r17 = memub(r21 ++ I:circ(m1))
|
||||
0xb1 0xc0 0x35 0x9b
|
||||
# CHECK: r17 = memub(r21++#5)
|
||||
0x11 0xe0 0x35 0x9d
|
||||
# CHECK: r17 = memub(r21++m1)
|
||||
0x11 0xe0 0x35 0x9f
|
||||
# CHECK: r17 = memub(r21 ++ m1:brev)
|
||||
0xf1 0xdb 0x35 0x41
|
||||
# CHECK: if (p3) r17 = memub(r21 + #31)
|
||||
0x03 0x40 0x45 0x85 0xf1 0xdb 0x35 0x43
|
||||
@ -112,6 +128,10 @@
|
||||
# CHECK: r17 = memuh(r21 ++ I:circ(m1))
|
||||
0xb1 0xc0 0x75 0x9b
|
||||
# CHECK: r17 = memuh(r21++#10)
|
||||
0x11 0xe0 0x75 0x9d
|
||||
# CHECK: r17 = memuh(r21++m1)
|
||||
0x11 0xe0 0x75 0x9f
|
||||
# CHECK: r17 = memuh(r21 ++ m1:brev)
|
||||
0xb1 0xda 0x75 0x41
|
||||
# CHECK: if (p3) r17 = memuh(r21 + #42)
|
||||
0xb1 0xda 0x75 0x45
|
||||
@ -141,6 +161,10 @@
|
||||
# CHECK: r17 = memw(r21 ++ I:circ(m1))
|
||||
0xb1 0xc0 0x95 0x9b
|
||||
# CHECK: r17 = memw(r21++#20)
|
||||
0x11 0xe0 0x95 0x9d
|
||||
# CHECK: r17 = memw(r21++m1)
|
||||
0x11 0xe0 0x95 0x9f
|
||||
# CHECK: r17 = memw(r21 ++ m1:brev)
|
||||
0xb1 0xda 0x95 0x41
|
||||
# CHECK: if (p3) r17 = memw(r21 + #84)
|
||||
0xb1 0xda 0x95 0x45
|
||||
|
Loading…
Reference in New Issue
Block a user