+ iterator_range<mop_iterator> operands() {
+ return make_range(operands_begin(), operands_end());
+ }
+ iterator_range<const_mop_iterator> operands() const {
+ return make_range(operands_begin(), operands_end());
+ }
+ iterator_range<mop_iterator> explicit_operands() {
+ return make_range(operands_begin(),
+ operands_begin() + getNumExplicitOperands());
+ }
+ iterator_range<const_mop_iterator> explicit_operands() const {
+ return make_range(operands_begin(),
+ operands_begin() + getNumExplicitOperands());
+ }
+ iterator_range<mop_iterator> implicit_operands() {
+ return make_range(explicit_operands().end(), operands_end());
+ }
+ iterator_range<const_mop_iterator> implicit_operands() const {
+ return make_range(explicit_operands().end(), operands_end());
+ }
+ /// Returns a range over all explicit operands that are register definitions.
+ /// Implicit definition are not included!
+ iterator_range<mop_iterator> defs() {
+ return make_range(operands_begin(),
+ operands_begin() + getDesc().getNumDefs());
+ }
+ /// \copydoc defs()
+ iterator_range<const_mop_iterator> defs() const {
+ return make_range(operands_begin(),
+ operands_begin() + getDesc().getNumDefs());
+ }
+ /// Returns a range that includes all operands that are register uses.
+ /// This may include unrelated operands which are not register uses.
+ iterator_range<mop_iterator> uses() {
+ return make_range(operands_begin() + getDesc().getNumDefs(),
+ operands_end());
+ }
+ /// \copydoc uses()
+ iterator_range<const_mop_iterator> uses() const {
+ return make_range(operands_begin() + getDesc().getNumDefs(),
+ operands_end());
+ }
+
+ /// Returns the number of the operand iterator \p I points to.
+ unsigned getOperandNo(const_mop_iterator I) const {
+ return I - operands_begin();
+ }
+