mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-01 07:30:31 +00:00
Implement __sync_synchronize on ppc32. Patch by Gary Benson.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55186 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
55beb6ded8
commit
f87d6c02f5
@ -26,6 +26,9 @@ let TargetPrefix = "ppc" in { // All intrinsics start with "llvm.ppc.".
|
||||
def int_ppc_dcbtst: Intrinsic<[llvm_void_ty, llvm_ptr_ty], [IntrWriteMem]>;
|
||||
def int_ppc_dcbz : Intrinsic<[llvm_void_ty, llvm_ptr_ty], [IntrWriteMem]>;
|
||||
def int_ppc_dcbzl : Intrinsic<[llvm_void_ty, llvm_ptr_ty], [IntrWriteMem]>;
|
||||
|
||||
// sync instruction
|
||||
def int_ppc_sync : Intrinsic<[llvm_void_ty], [IntrWriteMem]>;
|
||||
}
|
||||
|
||||
|
||||
|
@ -78,9 +78,6 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)
|
||||
// from FP_ROUND: that rounds to nearest, this rounds to zero.
|
||||
setOperationAction(ISD::FP_ROUND_INREG, MVT::ppcf128, Custom);
|
||||
|
||||
// PowerPC has no intrinsics for these particular operations
|
||||
setOperationAction(ISD::MEMBARRIER, MVT::Other, Expand);
|
||||
|
||||
// PowerPC has no SREM/UREM instructions
|
||||
setOperationAction(ISD::SREM, MVT::i32, Expand);
|
||||
setOperationAction(ISD::UREM, MVT::i32, Expand);
|
||||
|
@ -309,6 +309,17 @@ class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
|
||||
let Inst{31} = 0;
|
||||
}
|
||||
|
||||
class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
|
||||
string asmstr, InstrItinClass itin, list<dag> pattern>
|
||||
: I<opcode, OOL, IOL, asmstr, itin> {
|
||||
let Pattern = pattern;
|
||||
let Inst{6-10} = 0;
|
||||
let Inst{11-15} = 0;
|
||||
let Inst{16-20} = 0;
|
||||
let Inst{21-30} = xo;
|
||||
let Inst{31} = 0;
|
||||
}
|
||||
|
||||
class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
|
||||
InstrItinClass itin, list<dag> pattern>
|
||||
: XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
|
||||
|
@ -776,6 +776,10 @@ def STFDX : XForm_28<31, 727, (outs), (ins F8RC:$frS, memrr:$dst),
|
||||
[(store F8RC:$frS, xaddr:$dst)]>;
|
||||
}
|
||||
|
||||
let isBarrier = 1 in
|
||||
def SYNC : XForm_24_sync<31, 598, (outs), (ins),
|
||||
"sync", LdStSync,
|
||||
[(int_ppc_sync)]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// PPC32 Arithmetic Instructions.
|
||||
@ -1360,5 +1364,13 @@ def : Pat<(extloadf32 iaddr:$src),
|
||||
def : Pat<(extloadf32 xaddr:$src),
|
||||
(FMRSD (LFSX xaddr:$src))>;
|
||||
|
||||
// Memory barriers
|
||||
def : Pat<(membarrier (i32 imm:$ll),
|
||||
(i32 imm:$ls),
|
||||
(i32 imm:$sl),
|
||||
(i32 imm:$ss),
|
||||
(i32 imm:$device)),
|
||||
(SYNC)>;
|
||||
|
||||
include "PPCInstrAltivec.td"
|
||||
include "PPCInstr64Bit.td"
|
||||
|
Loading…
Reference in New Issue
Block a user