diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-04-19 01:30:48 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-04-19 01:30:48 +0000 |
commit | 4df1f9d5f8e145bdad7aee5680666413bf59ff4b (patch) | |
tree | 6a03a1f48ffcab30bfb01c0ca4be4104d2809996 /lib/Target/PowerPC/PPCInstrInfo.td | |
parent | 3e171569b715108b71f134d9032576e6488a8e71 (diff) | |
download | external_llvm-4df1f9d5f8e145bdad7aee5680666413bf59ff4b.zip external_llvm-4df1f9d5f8e145bdad7aee5680666413bf59ff4b.tar.gz external_llvm-4df1f9d5f8e145bdad7aee5680666413bf59ff4b.tar.bz2 |
PPC32 atomic operations.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49947 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/PowerPC/PPCInstrInfo.td')
-rw-r--r-- | lib/Target/PowerPC/PPCInstrInfo.td | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/Target/PowerPC/PPCInstrInfo.td b/lib/Target/PowerPC/PPCInstrInfo.td index f51158d..7cbdac3 100644 --- a/lib/Target/PowerPC/PPCInstrInfo.td +++ b/lib/Target/PowerPC/PPCInstrInfo.td @@ -42,6 +42,16 @@ def SDT_PPCstbrx : SDTypeProfile<0, 4, [ SDTCisVT<0, i32>, SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>, SDTCisVT<3, OtherVT> ]>; +def SDT_PPClwarx : SDTypeProfile<1, 2, [ + SDTCisVT<0, i32>, SDTCisPtrTy<1>, SDTCisVT<2, i32> +]>; +def SDT_PPCstwcx : SDTypeProfile<0, 3, [ + SDTCisVT<0, i32>, SDTCisPtrTy<1>, SDTCisVT<2, i32> +]>; +def SDT_PPCcmp_unres : SDTypeProfile<0, 3, [ + SDTCisVT<0, i32>, SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2> +]>; + //===----------------------------------------------------------------------===// // PowerPC specific DAG Nodes. // @@ -122,6 +132,13 @@ def PPClbrx : SDNode<"PPCISD::LBRX", SDT_PPClbrx, def PPCstbrx : SDNode<"PPCISD::STBRX", SDT_PPCstbrx, [SDNPHasChain, SDNPMayStore]>; +def PPClwarx : SDNode<"PPCISD::LWARX", SDT_PPClwarx, + [SDNPHasChain, SDNPMayLoad]>; +def PPCstwcx : SDNode<"PPCISD::STWCX", SDT_PPCstwcx, + [SDNPHasChain, SDNPMayStore]>; +def PPCcmp_unres : SDNode<"PPCISD::CMP_UNRESERVE", SDT_PPCcmp_unres, + [SDNPHasChain]>; + // Instructions to support dynamic alloca. def SDTDynOp : SDTypeProfile<1, 2, []>; def PPCdynalloc : SDNode<"PPCISD::DYNALLOC", SDTDynOp, [SDNPHasChain]>; @@ -462,6 +479,24 @@ def DCBZL : DCB_Form<1014, 1, (outs), (ins memrr:$dst), "dcbzl $dst", LdStDCBF, [(int_ppc_dcbzl xoaddr:$dst)]>, PPC970_DGroup_Single; +// Atomic operations. +def LWARX : Pseudo<(outs GPRC:$rD), (ins memrr:$ptr, i32imm:$label), + "\nLa${label}_entry:\n\tlwarx $rD, $ptr", + [(set GPRC:$rD, (PPClwarx xoaddr:$ptr, imm:$label))]>; + +let Defs = [CR0] in { +def STWCX : Pseudo<(outs), (ins GPRC:$rS, memrr:$dst, i32imm:$label), + "stwcx. $rS, $dst\n\tbne- La${label}_entry\nLa${label}_exit:", + [(PPCstwcx GPRC:$rS, xoaddr:$dst, imm:$label)]>; + +def CMP_UNRESw : Pseudo<(outs), (ins GPRC:$rA, GPRC:$rB, i32imm:$label), + "cmpw $rA, $rB\n\tbne- La${label}_exit", + [(PPCcmp_unres GPRC:$rA, GPRC:$rB, imm:$label)]>; +def CMP_UNRESwi : Pseudo<(outs), (ins GPRC:$rA, s16imm:$imm, i32imm:$label), + "cmpwi $rA, $imm\n\tbne- La${label}_exit", + [(PPCcmp_unres GPRC:$rA, imm:$imm, imm:$label)]>; +} + //===----------------------------------------------------------------------===// // PPC32 Load Instructions. // @@ -1229,5 +1264,9 @@ def : Pat<(extloadf32 iaddr:$src), def : Pat<(extloadf32 xaddr:$src), (FMRSD (LFSX xaddr:$src))>; +// Atomic operations +def : Pat<(PPCcmp_unres imm:$imm, GPRC:$rA, imm:$label), + (CMP_UNRESwi GPRC:$rA, imm:$imm, imm:$label)>; + include "PPCInstrAltivec.td" include "PPCInstr64Bit.td" |