mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-11 11:34:02 +00:00
Add support for Mips break and syscall insructions. The corresponding test cases are added.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186151 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
566fb9fe3e
commit
dd51a0c1e0
@ -490,6 +490,34 @@ class TEQ_FM<bits<6> funct> {
|
|||||||
let Inst{5-0} = funct;
|
let Inst{5-0} = funct;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// System calls format <op|code_|funct>
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
class SYS_FM<bits<6> funct>
|
||||||
|
{
|
||||||
|
bits<20> code_;
|
||||||
|
bits<32> Inst;
|
||||||
|
let Inst{31-26} = 0x0;
|
||||||
|
let Inst{25-6} = code_;
|
||||||
|
let Inst{5-0} = funct;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// Break instruction format <op|code_1|funct>
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
class BRK_FM<bits<6> funct>
|
||||||
|
{
|
||||||
|
bits<10> code_1;
|
||||||
|
bits<10> code_2;
|
||||||
|
bits<32> Inst;
|
||||||
|
let Inst{31-26} = 0x0;
|
||||||
|
let Inst{25-16} = code_1;
|
||||||
|
let Inst{15-6} = code_2;
|
||||||
|
let Inst{5-0} = funct;
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
//
|
//
|
||||||
// FLOATING POINT INSTRUCTION FORMATS
|
// FLOATING POINT INSTRUCTION FORMATS
|
||||||
|
@ -250,6 +250,12 @@ def simm16 : Operand<i32> {
|
|||||||
def simm20 : Operand<i32> {
|
def simm20 : Operand<i32> {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def uimm20 : Operand<i32> {
|
||||||
|
}
|
||||||
|
|
||||||
|
def uimm10 : Operand<i32> {
|
||||||
|
}
|
||||||
|
|
||||||
def simm16_64 : Operand<i64>;
|
def simm16_64 : Operand<i64>;
|
||||||
def shamt : Operand<i32>;
|
def shamt : Operand<i32>;
|
||||||
|
|
||||||
@ -637,6 +643,14 @@ class BAL_FT :
|
|||||||
let hasDelaySlot = 1;
|
let hasDelaySlot = 1;
|
||||||
let Defs = [RA];
|
let Defs = [RA];
|
||||||
}
|
}
|
||||||
|
// Syscall
|
||||||
|
class SYS_FT<string opstr> :
|
||||||
|
InstSE<(outs), (ins uimm20:$code_),
|
||||||
|
!strconcat(opstr, "\t$code_"), [], NoItinerary, FrmI>;
|
||||||
|
// Break
|
||||||
|
class BRK_FT<string opstr> :
|
||||||
|
InstSE<(outs), (ins uimm10:$code_1, uimm10:$code_2),
|
||||||
|
!strconcat(opstr, "\t$code_1, $code_2"), [], NoItinerary, FrmOther>;
|
||||||
|
|
||||||
// Sync
|
// Sync
|
||||||
let hasSideEffects = 1 in
|
let hasSideEffects = 1 in
|
||||||
@ -941,6 +955,9 @@ defm SWR : StoreLeftRightM<"swr", MipsSWR, CPURegs>, LW_FM<0x2e>;
|
|||||||
def SYNC : SYNC_FT, SYNC_FM;
|
def SYNC : SYNC_FT, SYNC_FM;
|
||||||
def TEQ : TEQ_FT<"teq", CPURegsOpnd>, TEQ_FM<0x34>;
|
def TEQ : TEQ_FT<"teq", CPURegsOpnd>, TEQ_FM<0x34>;
|
||||||
|
|
||||||
|
def BREAK : BRK_FT<"break">, BRK_FM<0xd>;
|
||||||
|
def SYSCALL : SYS_FT<"syscall">, SYS_FM<0xc>;
|
||||||
|
|
||||||
/// Load-linked, Store-conditional
|
/// Load-linked, Store-conditional
|
||||||
let Predicates = [NotN64, HasStdEnc] in {
|
let Predicates = [NotN64, HasStdEnc] in {
|
||||||
def LL : LLBase<"ll", CPURegsOpnd, mem>, LW_FM<0x30>;
|
def LL : LLBase<"ll", CPURegsOpnd, mem>, LW_FM<0x30>;
|
||||||
@ -1119,6 +1136,10 @@ def : InstAlias<"bnez $rs,$offset",
|
|||||||
def : InstAlias<"beqz $rs,$offset",
|
def : InstAlias<"beqz $rs,$offset",
|
||||||
(BEQ CPURegsOpnd:$rs, ZERO, brtarget:$offset), 1>,
|
(BEQ CPURegsOpnd:$rs, ZERO, brtarget:$offset), 1>,
|
||||||
Requires<[NotMips64]>;
|
Requires<[NotMips64]>;
|
||||||
|
def : InstAlias<"syscall", (SYSCALL 0), 1>;
|
||||||
|
|
||||||
|
def : InstAlias<"break $imm", (BREAK uimm10:$imm, 0), 1>;
|
||||||
|
def : InstAlias<"break", (BREAK 0, 0), 1>;
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Assembler Pseudo Instructions
|
// Assembler Pseudo Instructions
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
@ -41,5 +41,15 @@ $JTI0_0:
|
|||||||
.set f6,$f6
|
.set f6,$f6
|
||||||
# CHECK: abs.s $f6, $f7 # encoding: [0x46,0x00,0x39,0x85]
|
# CHECK: abs.s $f6, $f7 # encoding: [0x46,0x00,0x39,0x85]
|
||||||
# CHECK: and $3, $15, $15 # encoding: [0x01,0xef,0x18,0x24]
|
# CHECK: and $3, $15, $15 # encoding: [0x01,0xef,0x18,0x24]
|
||||||
|
# CHECK: break # encoding: [0x00,0x00,0x00,0x0d]
|
||||||
|
# CHECK: break 7, 0 # encoding: [0x00,0x07,0x00,0x0d]
|
||||||
|
# CHECK: break 7, 5 # encoding: [0x00,0x07,0x01,0x4d]
|
||||||
|
# CHECK: syscall # encoding: [0x00,0x00,0x00,0x0c]
|
||||||
|
# CHECK: syscall 13396 # encoding: [0x00,0x0d,0x15,0x0c]
|
||||||
abs.s f6,FPU_MASK
|
abs.s f6,FPU_MASK
|
||||||
and r3,$t7,STORE_MASK
|
and r3,$t7,STORE_MASK
|
||||||
|
break
|
||||||
|
break 7
|
||||||
|
break 7,5
|
||||||
|
syscall
|
||||||
|
syscall 0x3454
|
||||||
|
Loading…
x
Reference in New Issue
Block a user