mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-15 16:09:57 +00:00
Implement the PowerPC system call (sc) instruction.
Instruction added at request of Roman Divacky. Tested via asm-parser. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@181821 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
13a3cf1928
commit
5bbdb19041
@ -666,6 +666,7 @@ const char *PPCTargetLowering::getTargetNodeName(unsigned Opcode) const {
|
||||
case PPCISD::ADDIS_DTPREL_HA: return "PPCISD::ADDIS_DTPREL_HA";
|
||||
case PPCISD::ADDI_DTPREL_L: return "PPCISD::ADDI_DTPREL_L";
|
||||
case PPCISD::VADD_SPLAT: return "PPCISD::VADD_SPLAT";
|
||||
case PPCISD::SC: return "PPCISD::SC";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -238,6 +238,10 @@ namespace llvm {
|
||||
/// optimizations due to constant folding.
|
||||
VADD_SPLAT,
|
||||
|
||||
/// CHAIN = SC CHAIN, Imm128 - System call. The 7-bit unsigned
|
||||
/// operand identifies the operating system entry point.
|
||||
SC,
|
||||
|
||||
/// CHAIN = STBRX CHAIN, GPRC, Ptr, Type - This is a
|
||||
/// byte-swapping store instruction. It byte-swaps the low "Type" bits of
|
||||
/// the GPRC input, then stores it through Ptr. Type can be either i16 or
|
||||
|
@ -145,6 +145,19 @@ class BForm_2<bits<6> opcode, bits<5> bo, bits<5> bi, bit aa, bit lk,
|
||||
let Inst{31} = lk;
|
||||
}
|
||||
|
||||
// 1.7.3 SC-Form
|
||||
class SCForm<bits<6> opcode, bits<1> xo,
|
||||
dag OOL, dag IOL, string asmstr, InstrItinClass itin,
|
||||
list<dag> pattern>
|
||||
: I<opcode, OOL, IOL, asmstr, itin> {
|
||||
bits<7> LEV;
|
||||
|
||||
let Pattern = pattern;
|
||||
|
||||
let Inst{20-26} = LEV;
|
||||
let Inst{30} = xo;
|
||||
}
|
||||
|
||||
// 1.7.4 D-Form
|
||||
class DForm_base<bits<6> opcode, dag OOL, dag IOL, string asmstr,
|
||||
InstrItinClass itin, list<dag> pattern>
|
||||
|
@ -162,6 +162,10 @@ def PPCeh_sjlj_longjmp : SDNode<"PPCISD::EH_SJLJ_LONGJMP",
|
||||
SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>,
|
||||
[SDNPHasChain, SDNPSideEffect]>;
|
||||
|
||||
def SDT_PPCsc : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
|
||||
def PPCsc : SDNode<"PPCISD::SC", SDT_PPCsc,
|
||||
[SDNPHasChain, SDNPSideEffect]>;
|
||||
|
||||
def PPCvcmp : SDNode<"PPCISD::VCMP" , SDT_PPCvcmp, []>;
|
||||
def PPCvcmp_o : SDNode<"PPCISD::VCMPo", SDT_PPCvcmp, [SDNPOutGlue]>;
|
||||
|
||||
@ -987,6 +991,12 @@ let isBranch = 1, isTerminator = 1 in {
|
||||
"#EH_SjLj_Setup\t$dst", []>;
|
||||
}
|
||||
|
||||
// System call.
|
||||
let PPC970_Unit = 7 in {
|
||||
def SC : SCForm<17, 1, (outs), (ins i32imm:$lev),
|
||||
"sc $lev", BrB, [(PPCsc (i32 imm:$lev))]>;
|
||||
}
|
||||
|
||||
// DCB* instructions.
|
||||
def DCBA : DCB_Form<758, 0, (outs), (ins memrr:$dst),
|
||||
"dcba $dst", LdStDCBF, [(int_ppc_dcba xoaddr:$dst)]>,
|
||||
|
@ -41,7 +41,8 @@
|
||||
|
||||
# System call instruction
|
||||
|
||||
# FIXME: sc 1
|
||||
# CHECK: sc 1 # encoding: [0x44,0x00,0x00,0x22]
|
||||
sc 1
|
||||
|
||||
# Fixed-point facility
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user