1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 19:23:23 +01:00

Add support for Mips break and syscall insructions. The corresponding test cases are added.

llvm-svn: 186151
This commit is contained in:
Vladimir Medic 2013-07-12 09:25:35 +00:00
parent bab8ad599d
commit 8e12e22a4d
3 changed files with 59 additions and 0 deletions

View File

@ -490,6 +490,34 @@ class TEQ_FM<bits<6> 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

View File

@ -250,6 +250,12 @@ def simm16 : Operand<i32> {
def simm20 : Operand<i32> {
}
def uimm20 : Operand<i32> {
}
def uimm10 : Operand<i32> {
}
def simm16_64 : Operand<i64>;
def shamt : Operand<i32>;
@ -637,6 +643,14 @@ class BAL_FT :
let hasDelaySlot = 1;
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
let hasSideEffects = 1 in
@ -941,6 +955,9 @@ defm SWR : StoreLeftRightM<"swr", MipsSWR, CPURegs>, LW_FM<0x2e>;
def SYNC : SYNC_FT, SYNC_FM;
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
let Predicates = [NotN64, HasStdEnc] in {
def LL : LLBase<"ll", CPURegsOpnd, mem>, LW_FM<0x30>;
@ -1119,6 +1136,10 @@ def : InstAlias<"bnez $rs,$offset",
def : InstAlias<"beqz $rs,$offset",
(BEQ CPURegsOpnd:$rs, ZERO, brtarget:$offset), 1>,
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
//===----------------------------------------------------------------------===//

View File

@ -41,5 +41,15 @@ $JTI0_0:
.set f6,$f6
# CHECK: abs.s $f6, $f7 # encoding: [0x46,0x00,0x39,0x85]
# 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
and r3,$t7,STORE_MASK
break
break 7
break 7,5
syscall
syscall 0x3454