mirror of
https://github.com/RPCSX/llvm.git
synced 2025-05-13 10:56:01 +00:00
Add XCore support for ATOMIC_FENCE.
ATOMIC_FENCE is lowered to a compiler barrier which is codegen only. There is no need to emit an instructions since the XCore provides sequential consistency. Original patch by Richard Osborne git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194464 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c17ea93ed5
commit
32e8528c33
@ -59,6 +59,7 @@ getTargetNodeName(unsigned Opcode) const
|
|||||||
case XCoreISD::CRC8 : return "XCoreISD::CRC8";
|
case XCoreISD::CRC8 : return "XCoreISD::CRC8";
|
||||||
case XCoreISD::BR_JT : return "XCoreISD::BR_JT";
|
case XCoreISD::BR_JT : return "XCoreISD::BR_JT";
|
||||||
case XCoreISD::BR_JT32 : return "XCoreISD::BR_JT32";
|
case XCoreISD::BR_JT32 : return "XCoreISD::BR_JT32";
|
||||||
|
case XCoreISD::MEMBARRIER : return "XCoreISD::MEMBARRIER";
|
||||||
default : return NULL;
|
default : return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -148,6 +149,9 @@ XCoreTargetLowering::XCoreTargetLowering(XCoreTargetMachine &XTM)
|
|||||||
setOperationAction(ISD::STACKRESTORE, MVT::Other, Expand);
|
setOperationAction(ISD::STACKRESTORE, MVT::Other, Expand);
|
||||||
setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32, Expand);
|
setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32, Expand);
|
||||||
|
|
||||||
|
// Atomic operations
|
||||||
|
setOperationAction(ISD::ATOMIC_FENCE, MVT::Other, Custom);
|
||||||
|
|
||||||
// TRAMPOLINE is custom lowered.
|
// TRAMPOLINE is custom lowered.
|
||||||
setOperationAction(ISD::INIT_TRAMPOLINE, MVT::Other, Custom);
|
setOperationAction(ISD::INIT_TRAMPOLINE, MVT::Other, Custom);
|
||||||
setOperationAction(ISD::ADJUST_TRAMPOLINE, MVT::Other, Custom);
|
setOperationAction(ISD::ADJUST_TRAMPOLINE, MVT::Other, Custom);
|
||||||
@ -206,6 +210,7 @@ LowerOperation(SDValue Op, SelectionDAG &DAG) const {
|
|||||||
case ISD::INIT_TRAMPOLINE: return LowerINIT_TRAMPOLINE(Op, DAG);
|
case ISD::INIT_TRAMPOLINE: return LowerINIT_TRAMPOLINE(Op, DAG);
|
||||||
case ISD::ADJUST_TRAMPOLINE: return LowerADJUST_TRAMPOLINE(Op, DAG);
|
case ISD::ADJUST_TRAMPOLINE: return LowerADJUST_TRAMPOLINE(Op, DAG);
|
||||||
case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op, DAG);
|
case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op, DAG);
|
||||||
|
case ISD::ATOMIC_FENCE: return LowerATOMIC_FENCE(Op, DAG);
|
||||||
default:
|
default:
|
||||||
llvm_unreachable("unimplemented operand");
|
llvm_unreachable("unimplemented operand");
|
||||||
}
|
}
|
||||||
@ -847,6 +852,12 @@ LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const {
|
|||||||
return SDValue();
|
return SDValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDValue XCoreTargetLowering::
|
||||||
|
LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const {
|
||||||
|
SDLoc DL(Op);
|
||||||
|
return DAG.getNode(XCoreISD::MEMBARRIER, DL, MVT::Other, Op.getOperand(0));
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Calling Convention Implementation
|
// Calling Convention Implementation
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
@ -70,7 +70,10 @@ namespace llvm {
|
|||||||
BR_JT,
|
BR_JT,
|
||||||
|
|
||||||
// Jumptable branch using long branches for each entry.
|
// Jumptable branch using long branches for each entry.
|
||||||
BR_JT32
|
BR_JT32,
|
||||||
|
|
||||||
|
// Memory barrier.
|
||||||
|
MEMBARRIER
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,6 +161,7 @@ namespace llvm {
|
|||||||
SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
|
||||||
|
SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const;
|
||||||
|
|
||||||
// Inline asm support
|
// Inline asm support
|
||||||
std::pair<unsigned, const TargetRegisterClass*>
|
std::pair<unsigned, const TargetRegisterClass*>
|
||||||
|
@ -70,6 +70,11 @@ def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_XCoreCallSeqStart,
|
|||||||
def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_XCoreCallSeqEnd,
|
def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_XCoreCallSeqEnd,
|
||||||
[SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
|
[SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
|
||||||
|
|
||||||
|
def SDT_XCoreMEMBARRIER : SDTypeProfile<0, 0, []>;
|
||||||
|
|
||||||
|
def XCoreMemBarrier : SDNode<"XCoreISD::MEMBARRIER", SDT_XCoreMEMBARRIER,
|
||||||
|
[SDNPHasChain]>;
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Instruction Pattern Stuff
|
// Instruction Pattern Stuff
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
@ -343,6 +348,10 @@ let usesCustomInserter = 1 in {
|
|||||||
(select GRRegs:$cond, GRRegs:$T, GRRegs:$F))]>;
|
(select GRRegs:$cond, GRRegs:$T, GRRegs:$F))]>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let hasSideEffects = 1 in
|
||||||
|
def Int_MemBarrier : PseudoInstXCore<(outs), (ins), "#MEMBARRIER",
|
||||||
|
[(XCoreMemBarrier)]>;
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Instructions
|
// Instructions
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
16
test/CodeGen/XCore/atomic.ll
Normal file
16
test/CodeGen/XCore/atomic.ll
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
; RUN: llc < %s -march=xcore | FileCheck %s
|
||||||
|
|
||||||
|
; CHECK-LABEL: atomic_fence
|
||||||
|
; CHECK: #MEMBARRIER
|
||||||
|
; CHECK: #MEMBARRIER
|
||||||
|
; CHECK: #MEMBARRIER
|
||||||
|
; CHECK: #MEMBARRIER
|
||||||
|
; CHECK: retsp 0
|
||||||
|
define void @atomic_fence() nounwind {
|
||||||
|
entry:
|
||||||
|
fence acquire
|
||||||
|
fence release
|
||||||
|
fence acq_rel
|
||||||
|
fence seq_cst
|
||||||
|
ret void
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user