Add instruction encodings / disassembly support for u6 / lu6 instructions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173086 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Richard Osborne 2013-01-21 20:44:17 +00:00
parent 9b709f8b3f
commit 8da5434346
3 changed files with 93 additions and 60 deletions

View File

@ -107,12 +107,22 @@ class _FLRU6<bits<6> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
let Inst{9-0} = b{15-6};
}
class _FU6<dag outs, dag ins, string asmstr, list<dag> pattern>
class _FU6<bits<10> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
: InstXCore<2, outs, ins, asmstr, pattern> {
bits<6> a;
let Inst{15-6} = opc;
let Inst{5-0} = a;
}
class _FLU6<dag outs, dag ins, string asmstr, list<dag> pattern>
class _FLU6<bits<10> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
: InstXCore<4, outs, ins, asmstr, pattern> {
bits<16> a;
let Inst{31-22} = opc;
let Inst{21-16} = a{5-0};
let Inst{15-10} = 0b111100;
let Inst{9-0} = a{15-6};
}
class _FU10<dag outs, dag ins, string asmstr, list<dag> pattern>

View File

@ -288,36 +288,23 @@ multiclass FRU6_LRU6_cp<bits<6> opc, string OpcStr> {
}
// U6
multiclass FU6_LU6<string OpcStr, SDNode OpNode> {
def _u6: _FU6<
(outs), (ins i32imm:$b),
!strconcat(OpcStr, " $b"),
[(OpNode immU6:$b)]>;
def _lu6: _FLU6<
(outs), (ins i32imm:$b),
!strconcat(OpcStr, " $b"),
[(OpNode immU16:$b)]>;
}
multiclass FU6_LU6_int<string OpcStr, Intrinsic Int> {
def _u6: _FU6<
(outs), (ins i32imm:$b),
!strconcat(OpcStr, " $b"),
[(Int immU6:$b)]>;
def _lu6: _FLU6<
(outs), (ins i32imm:$b),
!strconcat(OpcStr, " $b"),
[(Int immU16:$b)]>;
multiclass FU6_LU6<bits<10> opc, string OpcStr, SDNode OpNode> {
def _u6: _FU6<opc, (outs), (ins i32imm:$a), !strconcat(OpcStr, " $a"),
[(OpNode immU6:$a)]>;
def _lu6: _FLU6<opc, (outs), (ins i32imm:$a), !strconcat(OpcStr, " $a"),
[(OpNode immU16:$a)]>;
}
multiclass FU6_LU6_np<string OpcStr> {
def _u6: _FU6<
(outs), (ins i32imm:$b),
!strconcat(OpcStr, " $b"),
[]>;
def _lu6: _FLU6<
(outs), (ins i32imm:$b),
!strconcat(OpcStr, " $b"),
[]>;
multiclass FU6_LU6_int<bits<10> opc, string OpcStr, Intrinsic Int> {
def _u6: _FU6<opc, (outs), (ins i32imm:$a), !strconcat(OpcStr, " $a"),
[(Int immU6:$a)]>;
def _lu6: _FLU6<opc, (outs), (ins i32imm:$a), !strconcat(OpcStr, " $a"),
[(Int immU16:$a)]>;
}
multiclass FU6_LU6_np<bits<10> opc, string OpcStr> {
def _u6: _FU6<opc, (outs), (ins i32imm:$a), !strconcat(OpcStr, " $a"), []>;
def _lu6: _FLU6<opc, (outs), (ins i32imm:$a), !strconcat(OpcStr, " $a"), []>;
}
// U10
@ -628,60 +615,46 @@ defm BRBF: FRU6_LRU6_backwards_branch<0b011111, "bf">;
// U6
let Defs = [SP], Uses = [SP] in {
let neverHasSideEffects = 1 in
defm EXTSP : FU6_LU6_np<"extsp">;
defm EXTSP : FU6_LU6_np<0b0111011110, "extsp">;
let mayStore = 1 in
defm ENTSP : FU6_LU6_np<"entsp">;
defm ENTSP : FU6_LU6_np<0b0111011101, "entsp">;
let isReturn = 1, isTerminator = 1, mayLoad = 1, isBarrier = 1 in {
defm RETSP : FU6_LU6<"retsp", XCoreRetsp>;
defm RETSP : FU6_LU6<0b0111011111, "retsp", XCoreRetsp>;
}
}
// TODO extdp, kentsp, krestsp, blat
// getsr, kalli
let isBranch = 1, isTerminator = 1, isBarrier = 1 in {
def BRBU_u6 : _FU6<
(outs),
(ins brtarget:$target),
"bu $target",
[]>;
def BRBU_u6 : _FU6<0b0111011100, (outs), (ins brtarget:$a), "bu -$a", []>;
def BRBU_lu6 : _FLU6<
(outs),
(ins brtarget:$target),
"bu $target",
[]>;
def BRBU_lu6 : _FLU6<0b0111011100, (outs), (ins brtarget:$a), "bu -$a", []>;
def BRFU_u6 : _FU6<
(outs),
(ins brtarget:$target),
"bu $target",
[]>;
def BRFU_u6 : _FU6<0b0111001100, (outs), (ins brtarget:$a), "bu $a", []>;
def BRFU_lu6 : _FLU6<
(outs),
(ins brtarget:$target),
"bu $target",
[]>;
def BRFU_lu6 : _FLU6<0b0111001100, (outs), (ins brtarget:$a), "bu $a", []>;
}
//let Uses = [CP] in ...
let Defs = [R11], neverHasSideEffects = 1, isReMaterializable = 1 in
def LDAWCP_u6: _FU6<(outs), (ins MEMii:$a), "ldaw r11, cp[$a]", []>;
def LDAWCP_u6: _FU6<0b0111111101, (outs), (ins MEMii:$a), "ldaw r11, cp[$a]",
[]>;
let Defs = [R11], isReMaterializable = 1 in
def LDAWCP_lu6: _FLU6<(outs), (ins MEMii:$a), "ldaw r11, cp[$a]",
def LDAWCP_lu6: _FLU6<0b0111111101, (outs), (ins MEMii:$a), "ldaw r11, cp[$a]",
[(set R11, ADDRcpii:$a)]>;
defm SETSR : FU6_LU6_int<"setsr", int_xcore_setsr>;
defm SETSR : FU6_LU6_int<0b0111101101, "setsr", int_xcore_setsr>;
defm CLRSR : FU6_LU6_int<"clrsr", int_xcore_clrsr>;
defm CLRSR : FU6_LU6_int<0b0111101100, "clrsr", int_xcore_clrsr>;
// setsr may cause a branch if it is used to enable events. clrsr may
// branch if it is executed while events are enabled.
let isBranch=1, isIndirectBranch=1, isTerminator=1, isBarrier = 1 in {
defm SETSR_branch : FU6_LU6_np<"setsr">;
defm CLRSR_branch : FU6_LU6_np<"clrsr">;
let isBranch=1, isIndirectBranch=1, isTerminator=1, isBarrier = 1,
isCodeGenOnly = 1 in {
defm SETSR_branch : FU6_LU6_np<0b0111101101, "setsr">;
defm CLRSR_branch : FU6_LU6_np<0b0111101100, "clrsr">;
}
// U10

View File

@ -392,3 +392,53 @@
# CHECK: stw r0, sp[8761]
0x88 0xf0 0x39 0x54
# u6 / lu6 instructions
# CHECK: bu -20
0x14 0x77
# CHECK: bu -1000
0x0f 0xf0 0x28 0x77
# CHECK: bu 24
0x18 0x73
# CHECK: bu 2231
0x22 0xf0 0x37 0x73
# CHECK: extsp 9
0x89 0x77
# CHECK: extsp 5721
0x59 0xf0 0x99 0x77
# CHECK: clrsr 60
0x3c 0x7b
# CHECK: clrsr 64391
0xee 0xf3 0x07 0x7b
# CHECK: entsp 1
0x41 0x77
# CHECK: entsp 70
0x01 0xf0 0x46 0x77
# CHECK: ldaw r11, cp[5]
0x45 0x7f
# CHECK: ldaw r11, cp[33000]
0x03 0xf2 0x68 0x7f
# CHECK: retsp 40
0xe8 0x77
# CHECK: retsp 52010
0x2c 0xf3 0xea 0x77
# CHECK: setsr 42
0x6a 0x7b
# CHECK: setsr 21863
0x55 0xf1 0x67 0x7b