diff options
Diffstat (limited to 'include/llvm/Target/TargetSelectionDAG.td')
-rw-r--r-- | include/llvm/Target/TargetSelectionDAG.td | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/include/llvm/Target/TargetSelectionDAG.td b/include/llvm/Target/TargetSelectionDAG.td index f6162377b8b7..4ba4d821225d 100644 --- a/include/llvm/Target/TargetSelectionDAG.td +++ b/include/llvm/Target/TargetSelectionDAG.td @@ -485,6 +485,8 @@ def atomic_load_sub : SDNode<"ISD::ATOMIC_LOAD_SUB" , SDTAtomic2, [SDNPHasChain, SDNPMayStore, SDNPMayLoad, SDNPMemOperand]>; def atomic_load_and : SDNode<"ISD::ATOMIC_LOAD_AND" , SDTAtomic2, [SDNPHasChain, SDNPMayStore, SDNPMayLoad, SDNPMemOperand]>; +def atomic_load_clr : SDNode<"ISD::ATOMIC_LOAD_CLR" , SDTAtomic2, + [SDNPHasChain, SDNPMayStore, SDNPMayLoad, SDNPMemOperand]>; def atomic_load_or : SDNode<"ISD::ATOMIC_LOAD_OR" , SDTAtomic2, [SDNPHasChain, SDNPMayStore, SDNPMayLoad, SDNPMemOperand]>; def atomic_load_xor : SDNode<"ISD::ATOMIC_LOAD_XOR" , SDTAtomic2, @@ -613,14 +615,18 @@ class CodePatPred<code predicate> : PatPred { // compact and readable. // -/// PatFrag - Represents a pattern fragment. This can match something on the -/// DAG, from a single node to multiple nested other fragments. +/// PatFrags - Represents a set of pattern fragments. Each single fragment +/// can match something on the DAG, from a single node to multiple nested other +/// fragments. The whole set of fragments matches if any of the single +/// fragemnts match. This allows e.g. matching and "add with overflow" and +/// a regular "add" with the same fragment set. /// -class PatFrag<dag ops, dag frag, code pred = [{}], - SDNodeXForm xform = NOOP_SDNodeXForm> : SDPatternOperator { +class PatFrags<dag ops, list<dag> frags, code pred = [{}], + SDNodeXForm xform = NOOP_SDNodeXForm> : SDPatternOperator { dag Operands = ops; - dag Fragment = frag; + list<dag> Fragments = frags; code PredicateCode = pred; + code GISelPredicateCode = [{}]; code ImmediateCode = [{}]; SDNodeXForm OperandTransform = xform; @@ -679,6 +685,11 @@ class PatFrag<dag ops, dag frag, code pred = [{}], ValueType ScalarMemoryVT = ?; } +// PatFrag - A version of PatFrags matching only a single fragment. +class PatFrag<dag ops, dag frag, code pred = [{}], + SDNodeXForm xform = NOOP_SDNodeXForm> + : PatFrags<ops, [frag], pred, xform>; + // OutPatFrag is a pattern fragment that is used as part of an output pattern // (not an input pattern). These do not have predicates or transforms, but are // used to avoid repeated subexpressions in output patterns. @@ -1130,27 +1141,27 @@ def setne : PatFrag<(ops node:$lhs, node:$rhs), multiclass binary_atomic_op_ord<SDNode atomic_op> { def #NAME#_monotonic : PatFrag<(ops node:$ptr, node:$val), - (!cast<SDNode>(#NAME) node:$ptr, node:$val)> { + (!cast<SDPatternOperator>(#NAME) node:$ptr, node:$val)> { let IsAtomic = 1; let IsAtomicOrderingMonotonic = 1; } def #NAME#_acquire : PatFrag<(ops node:$ptr, node:$val), - (!cast<SDNode>(#NAME) node:$ptr, node:$val)> { + (!cast<SDPatternOperator>(#NAME) node:$ptr, node:$val)> { let IsAtomic = 1; let IsAtomicOrderingAcquire = 1; } def #NAME#_release : PatFrag<(ops node:$ptr, node:$val), - (!cast<SDNode>(#NAME) node:$ptr, node:$val)> { + (!cast<SDPatternOperator>(#NAME) node:$ptr, node:$val)> { let IsAtomic = 1; let IsAtomicOrderingRelease = 1; } def #NAME#_acq_rel : PatFrag<(ops node:$ptr, node:$val), - (!cast<SDNode>(#NAME) node:$ptr, node:$val)> { + (!cast<SDPatternOperator>(#NAME) node:$ptr, node:$val)> { let IsAtomic = 1; let IsAtomicOrderingAcquireRelease = 1; } def #NAME#_seq_cst : PatFrag<(ops node:$ptr, node:$val), - (!cast<SDNode>(#NAME) node:$ptr, node:$val)> { + (!cast<SDPatternOperator>(#NAME) node:$ptr, node:$val)> { let IsAtomic = 1; let IsAtomicOrderingSequentiallyConsistent = 1; } @@ -1158,27 +1169,27 @@ multiclass binary_atomic_op_ord<SDNode atomic_op> { multiclass ternary_atomic_op_ord<SDNode atomic_op> { def #NAME#_monotonic : PatFrag<(ops node:$ptr, node:$cmp, node:$val), - (!cast<SDNode>(#NAME) node:$ptr, node:$cmp, node:$val)> { + (!cast<SDPatternOperator>(#NAME) node:$ptr, node:$cmp, node:$val)> { let IsAtomic = 1; let IsAtomicOrderingMonotonic = 1; } def #NAME#_acquire : PatFrag<(ops node:$ptr, node:$cmp, node:$val), - (!cast<SDNode>(#NAME) node:$ptr, node:$cmp, node:$val)> { + (!cast<SDPatternOperator>(#NAME) node:$ptr, node:$cmp, node:$val)> { let IsAtomic = 1; let IsAtomicOrderingAcquire = 1; } def #NAME#_release : PatFrag<(ops node:$ptr, node:$cmp, node:$val), - (!cast<SDNode>(#NAME) node:$ptr, node:$cmp, node:$val)> { + (!cast<SDPatternOperator>(#NAME) node:$ptr, node:$cmp, node:$val)> { let IsAtomic = 1; let IsAtomicOrderingRelease = 1; } def #NAME#_acq_rel : PatFrag<(ops node:$ptr, node:$cmp, node:$val), - (!cast<SDNode>(#NAME) node:$ptr, node:$cmp, node:$val)> { + (!cast<SDPatternOperator>(#NAME) node:$ptr, node:$cmp, node:$val)> { let IsAtomic = 1; let IsAtomicOrderingAcquireRelease = 1; } def #NAME#_seq_cst : PatFrag<(ops node:$ptr, node:$cmp, node:$val), - (!cast<SDNode>(#NAME) node:$ptr, node:$cmp, node:$val)> { + (!cast<SDPatternOperator>(#NAME) node:$ptr, node:$cmp, node:$val)> { let IsAtomic = 1; let IsAtomicOrderingSequentiallyConsistent = 1; } @@ -1244,6 +1255,7 @@ defm atomic_load_add : binary_atomic_op<atomic_load_add>; defm atomic_swap : binary_atomic_op<atomic_swap>; defm atomic_load_sub : binary_atomic_op<atomic_load_sub>; defm atomic_load_and : binary_atomic_op<atomic_load_and>; +defm atomic_load_clr : binary_atomic_op<atomic_load_clr>; defm atomic_load_or : binary_atomic_op<atomic_load_or>; defm atomic_load_xor : binary_atomic_op<atomic_load_xor>; defm atomic_load_nand : binary_atomic_op<atomic_load_nand>; |