mirror of
https://github.com/RPCS3/llvm.git
synced 2025-04-18 05:50:38 +00:00
[Sparc] Rearrange SparcInstrInfo, no change.
Move some instructions into order of sections in the spec, as the rest already were. Differential Revision: http://reviews.llvm.org/D9102 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241163 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2d2fd3219d
commit
bcc1a5c01a
@ -353,13 +353,6 @@ let hasSideEffects = 1, mayStore = 1 in {
|
|||||||
[(flushw)]>;
|
[(flushw)]>;
|
||||||
}
|
}
|
||||||
|
|
||||||
let isBarrier = 1, isTerminator = 1, rd = 0b01000, rs1 = 0, simm13 = 5 in
|
|
||||||
def TA5 : F3_2<0b10, 0b111010, (outs), (ins), "ta 5", [(trap)]>;
|
|
||||||
|
|
||||||
let rd = 0 in
|
|
||||||
def UNIMP : F2_1<0b000, (outs), (ins i32imm:$imm22),
|
|
||||||
"unimp $imm22", []>;
|
|
||||||
|
|
||||||
// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after
|
// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after
|
||||||
// instruction selection into a branch sequence. This has to handle all
|
// instruction selection into a branch sequence. This has to handle all
|
||||||
// permutations of selection between i32/f32/f64 on ICC and FCC.
|
// permutations of selection between i32/f32/f64 on ICC and FCC.
|
||||||
@ -406,36 +399,6 @@ let usesCustomInserter = 1, Uses = [FCC0] in {
|
|||||||
[(set f128:$dst, (SPselectfcc f128:$T, f128:$F, imm:$Cond))]>;
|
[(set f128:$dst, (SPselectfcc f128:$T, f128:$F, imm:$Cond))]>;
|
||||||
}
|
}
|
||||||
|
|
||||||
// JMPL Instruction.
|
|
||||||
let isTerminator = 1, hasDelaySlot = 1, isBarrier = 1,
|
|
||||||
DecoderMethod = "DecodeJMPL" in {
|
|
||||||
def JMPLrr: F3_1<2, 0b111000, (outs IntRegs:$dst), (ins MEMrr:$addr),
|
|
||||||
"jmpl $addr, $dst", []>;
|
|
||||||
def JMPLri: F3_2<2, 0b111000, (outs IntRegs:$dst), (ins MEMri:$addr),
|
|
||||||
"jmpl $addr, $dst", []>;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Section A.3 - Synthetic Instructions, p. 85
|
|
||||||
// special cases of JMPL:
|
|
||||||
let isReturn = 1, isTerminator = 1, hasDelaySlot = 1, isBarrier = 1,
|
|
||||||
isCodeGenOnly = 1 in {
|
|
||||||
let rd = 0, rs1 = 15 in
|
|
||||||
def RETL: F3_2<2, 0b111000, (outs), (ins i32imm:$val),
|
|
||||||
"jmp %o7+$val", [(retflag simm13:$val)]>;
|
|
||||||
|
|
||||||
let rd = 0, rs1 = 31 in
|
|
||||||
def RET: F3_2<2, 0b111000, (outs), (ins i32imm:$val),
|
|
||||||
"jmp %i7+$val", []>;
|
|
||||||
}
|
|
||||||
|
|
||||||
let isReturn = 1, isTerminator = 1, hasDelaySlot = 1,
|
|
||||||
isBarrier = 1, rd = 0, DecoderMethod = "DecodeReturn" in {
|
|
||||||
def RETTrr : F3_1<2, 0b111001, (outs), (ins MEMrr:$addr),
|
|
||||||
"rett $addr", []>;
|
|
||||||
def RETTri : F3_2<2, 0b111001, (outs), (ins MEMri:$addr),
|
|
||||||
"rett $addr", []>;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Section B.1 - Load Integer Instructions, p. 90
|
// Section B.1 - Load Integer Instructions, p. 90
|
||||||
let DecoderMethod = "DecodeLoadInt" in {
|
let DecoderMethod = "DecodeLoadInt" in {
|
||||||
defm LDSB : LoadA<"ldsb", 0b001001, 0b011001, sextloadi8, IntRegs, i32>;
|
defm LDSB : LoadA<"ldsb", 0b001001, 0b011001, sextloadi8, IntRegs, i32>;
|
||||||
@ -470,6 +433,24 @@ let DecoderMethod = "DecodeStoreQFP" in
|
|||||||
defm STQF : Store<"stq", 0b100110, store, QFPRegs, f128>,
|
defm STQF : Store<"stq", 0b100110, store, QFPRegs, f128>,
|
||||||
Requires<[HasV9, HasHardQuad]>;
|
Requires<[HasV9, HasHardQuad]>;
|
||||||
|
|
||||||
|
// Section B.8 - SWAP Register with Memory Instruction
|
||||||
|
// (Atomic swap)
|
||||||
|
let Constraints = "$val = $dst", DecoderMethod = "DecodeSWAP" in {
|
||||||
|
def SWAPrr : F3_1<3, 0b001111,
|
||||||
|
(outs IntRegs:$dst), (ins MEMrr:$addr, IntRegs:$val),
|
||||||
|
"swap [$addr], $dst",
|
||||||
|
[(set i32:$dst, (atomic_swap_32 ADDRrr:$addr, i32:$val))]>;
|
||||||
|
def SWAPri : F3_2<3, 0b001111,
|
||||||
|
(outs IntRegs:$dst), (ins MEMri:$addr, IntRegs:$val),
|
||||||
|
"swap [$addr], $dst",
|
||||||
|
[(set i32:$dst, (atomic_swap_32 ADDRri:$addr, i32:$val))]>;
|
||||||
|
def SWAPArr : F3_1_asi<3, 0b011111,
|
||||||
|
(outs IntRegs:$dst), (ins MEMrr:$addr, i8imm:$asi, IntRegs:$val),
|
||||||
|
"swapa [$addr] $asi, $dst",
|
||||||
|
[/*FIXME: pattern?*/]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Section B.9 - SETHI Instruction, p. 104
|
// Section B.9 - SETHI Instruction, p. 104
|
||||||
def SETHIi: F2_1<0b100,
|
def SETHIi: F2_1<0b100,
|
||||||
(outs IntRegs:$rd), (ins i32imm:$imm22),
|
(outs IntRegs:$rd), (ins i32imm:$imm22),
|
||||||
@ -725,6 +706,56 @@ let Uses = [O6],
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Section B.25 - Jump and Link Instruction
|
||||||
|
|
||||||
|
// JMPL Instruction.
|
||||||
|
let isTerminator = 1, hasDelaySlot = 1, isBarrier = 1,
|
||||||
|
DecoderMethod = "DecodeJMPL" in {
|
||||||
|
def JMPLrr: F3_1<2, 0b111000, (outs IntRegs:$dst), (ins MEMrr:$addr),
|
||||||
|
"jmpl $addr, $dst", []>;
|
||||||
|
def JMPLri: F3_2<2, 0b111000, (outs IntRegs:$dst), (ins MEMri:$addr),
|
||||||
|
"jmpl $addr, $dst", []>;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Section A.3 - Synthetic Instructions, p. 85
|
||||||
|
// special cases of JMPL:
|
||||||
|
let isReturn = 1, isTerminator = 1, hasDelaySlot = 1, isBarrier = 1,
|
||||||
|
isCodeGenOnly = 1 in {
|
||||||
|
let rd = 0, rs1 = 15 in
|
||||||
|
def RETL: F3_2<2, 0b111000, (outs), (ins i32imm:$val),
|
||||||
|
"jmp %o7+$val", [(retflag simm13:$val)]>;
|
||||||
|
|
||||||
|
let rd = 0, rs1 = 31 in
|
||||||
|
def RET: F3_2<2, 0b111000, (outs), (ins i32imm:$val),
|
||||||
|
"jmp %i7+$val", []>;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Section B.26 - Return from Trap Instruction
|
||||||
|
let isReturn = 1, isTerminator = 1, hasDelaySlot = 1,
|
||||||
|
isBarrier = 1, rd = 0, DecoderMethod = "DecodeReturn" in {
|
||||||
|
def RETTrr : F3_1<2, 0b111001, (outs), (ins MEMrr:$addr),
|
||||||
|
"rett $addr", []>;
|
||||||
|
def RETTri : F3_2<2, 0b111001, (outs), (ins MEMri:$addr),
|
||||||
|
"rett $addr", []>;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Section B.27 - Trap on Integer Condition Codes Instruction
|
||||||
|
multiclass TRAP<string regStr> {
|
||||||
|
def rr : TRAPSPrr<0b111010, (outs), (ins IntRegs:$rs1, IntRegs:$rs2,
|
||||||
|
CCOp:$cond),
|
||||||
|
!strconcat(!strconcat("t$cond ", regStr), ", $rs1 + $rs2"), []>;
|
||||||
|
def ri : TRAPSPri<0b111010, (outs), (ins IntRegs:$rs1, i32imm:$imm,
|
||||||
|
CCOp:$cond),
|
||||||
|
!strconcat(!strconcat("t$cond ", regStr), ", $rs1 + $imm"), []>;
|
||||||
|
}
|
||||||
|
|
||||||
|
let hasSideEffects = 1, Uses = [ICC], cc = 0b00 in
|
||||||
|
defm TICC : TRAP<"%icc">;
|
||||||
|
|
||||||
|
let isBarrier = 1, isTerminator = 1, rd = 0b01000, rs1 = 0, simm13 = 5 in
|
||||||
|
def TA5 : F3_2<0b10, 0b111010, (outs), (ins), "ta 5", [(trap)]>;
|
||||||
|
|
||||||
// Section B.28 - Read State Register Instructions
|
// Section B.28 - Read State Register Instructions
|
||||||
let rs2 = 0 in
|
let rs2 = 0 in
|
||||||
def RDASR : F3_1<2, 0b101000,
|
def RDASR : F3_1<2, 0b101000,
|
||||||
@ -787,6 +818,18 @@ let Predicates = [HasNoV9] in {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Section B.30 - STBAR Instruction
|
||||||
|
let hasSideEffects = 1, rd = 0, rs1 = 0b01111, rs2 = 0 in
|
||||||
|
def STBAR : F3_1<2, 0b101000, (outs), (ins), "stbar", []>;
|
||||||
|
|
||||||
|
|
||||||
|
// Section B.31 - Unimplmented Instruction
|
||||||
|
let rd = 0 in
|
||||||
|
def UNIMP : F2_1<0b000, (outs), (ins i32imm:$imm22),
|
||||||
|
"unimp $imm22", []>;
|
||||||
|
|
||||||
|
// Section B.33 - Floating-point Operate (FPop) Instructions
|
||||||
|
|
||||||
// Convert Integer to Floating-point Instructions, p. 141
|
// Convert Integer to Floating-point Instructions, p. 141
|
||||||
def FITOS : F3_3u<2, 0b110100, 0b011000100,
|
def FITOS : F3_3u<2, 0b110100, 0b011000100,
|
||||||
(outs FPRegs:$rd), (ins FPRegs:$rs2),
|
(outs FPRegs:$rd), (ins FPRegs:$rs2),
|
||||||
@ -1168,29 +1211,10 @@ let rs1 = 0 in
|
|||||||
def : Pat<(ctpop i32:$src),
|
def : Pat<(ctpop i32:$src),
|
||||||
(POPCrr (SRLri $src, 0))>;
|
(POPCrr (SRLri $src, 0))>;
|
||||||
|
|
||||||
// Atomic swap.
|
|
||||||
let hasSideEffects =1, rd = 0, rs1 = 0b01111, rs2 = 0 in
|
|
||||||
def STBAR : F3_1<2, 0b101000, (outs), (ins), "stbar", []>;
|
|
||||||
|
|
||||||
let Predicates = [HasV9], hasSideEffects = 1, rd = 0, rs1 = 0b01111 in
|
let Predicates = [HasV9], hasSideEffects = 1, rd = 0, rs1 = 0b01111 in
|
||||||
def MEMBARi : F3_2<2, 0b101000, (outs), (ins simm13Op:$simm13),
|
def MEMBARi : F3_2<2, 0b101000, (outs), (ins simm13Op:$simm13),
|
||||||
"membar $simm13", []>;
|
"membar $simm13", []>;
|
||||||
|
|
||||||
let Constraints = "$val = $dst", DecoderMethod = "DecodeSWAP" in {
|
|
||||||
def SWAPrr : F3_1<3, 0b001111,
|
|
||||||
(outs IntRegs:$dst), (ins MEMrr:$addr, IntRegs:$val),
|
|
||||||
"swap [$addr], $dst",
|
|
||||||
[(set i32:$dst, (atomic_swap_32 ADDRrr:$addr, i32:$val))]>;
|
|
||||||
def SWAPri : F3_2<3, 0b001111,
|
|
||||||
(outs IntRegs:$dst), (ins MEMri:$addr, IntRegs:$val),
|
|
||||||
"swap [$addr], $dst",
|
|
||||||
[(set i32:$dst, (atomic_swap_32 ADDRri:$addr, i32:$val))]>;
|
|
||||||
def SWAPArr : F3_1_asi<3, 0b011111,
|
|
||||||
(outs IntRegs:$dst), (ins MEMrr:$addr, i8imm:$asi, IntRegs:$val),
|
|
||||||
"swapa [$addr] $asi, $dst",
|
|
||||||
[/*FIXME: pattern?*/]>;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Should add a CASArr variant. In fact, the CAS instruction,
|
// TODO: Should add a CASArr variant. In fact, the CAS instruction,
|
||||||
// unlike other instructions, only comes in a form which requires an
|
// unlike other instructions, only comes in a form which requires an
|
||||||
// ASI be provided. The ASI value hardcoded here is ASI_PRIMARY, the
|
// ASI be provided. The ASI value hardcoded here is ASI_PRIMARY, the
|
||||||
@ -1215,18 +1239,6 @@ let hasSideEffects = 1 in {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
multiclass TRAP<string regStr> {
|
|
||||||
def rr : TRAPSPrr<0b111010, (outs), (ins IntRegs:$rs1, IntRegs:$rs2,
|
|
||||||
CCOp:$cond),
|
|
||||||
!strconcat(!strconcat("t$cond ", regStr), ", $rs1 + $rs2"), []>;
|
|
||||||
def ri : TRAPSPri<0b111010, (outs), (ins IntRegs:$rs1, i32imm:$imm,
|
|
||||||
CCOp:$cond),
|
|
||||||
!strconcat(!strconcat("t$cond ", regStr), ", $rs1 + $imm"), []>;
|
|
||||||
}
|
|
||||||
|
|
||||||
let hasSideEffects = 1, Uses = [ICC], cc = 0b00 in
|
|
||||||
defm TICC : TRAP<"%icc">;
|
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Non-Instruction Patterns
|
// Non-Instruction Patterns
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
Loading…
x
Reference in New Issue
Block a user