func IsREL32(op Op) bool {
	_, rel := op.(Rel)
	_, label := op.(LabelRef)
	return rel || label
}
IsREL32 returns true if op is an offset relative to instruction pointer, or a
label reference.
package operand
import "github.com/mmcloughlin/avo/reg"
func IsRegister(op Op) bool { _, ok := op.(reg.Register); return ok }
func IsMem(op Op) bool { _, ok := op.(Mem); return ok }
func IsRel(op Op) bool { _, ok := op.(Rel); return ok }
func Is1(op Op) bool {
	i, ok := op.(U8)
	return ok && i == 1
}
func Is3(op Op) bool {
	i, ok := op.(U8)
	return ok && i == 3
}
func IsIMM2U(op Op) bool {
	i, ok := op.(U8)
	return ok && i < 4
}
func IsIMM8(op Op) bool {
	_, ok := op.(U8)
	return ok
}
func IsIMM16(op Op) bool {
	_, ok := op.(U16)
	return ok
}
func IsIMM32(op Op) bool {
	_, ok := op.(U32)
	return ok
}
func IsIMM64(op Op) bool {
	_, ok := op.(U64)
	return ok
}
func IsAL(op Op) bool {
	return op == reg.AL
}
func IsCL(op Op) bool {
	return op == reg.CL
}
func IsAX(op Op) bool {
	return op == reg.AX
}
func IsEAX(op Op) bool {
	return op == reg.EAX
}
func IsRAX(op Op) bool {
	return op == reg.RAX
}
func IsR8(op Op) bool {
	return IsGP(op, 1)
}
func IsR16(op Op) bool {
	return IsGP(op, 2)
}
func IsR32(op Op) bool {
	return IsGP(op, 4)
}
func IsR64(op Op) bool {
	return IsGP(op, 8)
}
func IsPseudo(op Op) bool {
	return IsRegisterKind(op, reg.KindPseudo)
}
func IsGP(op Op, n uint) bool {
	return IsRegisterKindSize(op, reg.KindGP, n)
}
func IsXMM0(op Op) bool {
	return op == reg.X0
}
func IsXMM(op Op) bool {
	return IsRegisterKindSize(op, reg.KindVector, 16)
}
func IsYMM(op Op) bool {
	return IsRegisterKindSize(op, reg.KindVector, 32)
}
func IsRegisterKindSize(op Op, k reg.Kind, n uint) bool {
	r, ok := op.(reg.Register)
	return ok && r.Kind() == k && r.Size() == n
}
func IsRegisterKind(op Op, k reg.Kind) bool {
	r, ok := op.(reg.Register)
	return ok && r.Kind() == k
}
func IsM(op Op) bool {
	return IsM16(op) || IsM32(op) || IsM64(op)
}
func IsM8(op Op) bool {
	return IsMSize(op, 1)
}
func IsM16(op Op) bool {
	return IsMSize(op, 2)
}
func IsM32(op Op) bool {
	return IsMSize(op, 4)
}
func IsM64(op Op) bool {
	return IsMSize(op, 8)
}
func IsMSize(op Op, n uint) bool {
	m, ok := op.(Mem)
	return ok && IsMReg(m.Base) && (m.Index == nil || IsMReg(m.Index))
}
func IsMReg(op Op) bool {
	return IsPseudo(op) || IsRegisterKind(op, reg.KindGP)
}
func IsM128(op Op) bool {
	return IsM64(op)
}
func IsM256(op Op) bool {
	return IsM64(op)
}
func IsVM32X(op Op) bool {
	return IsVmx(op)
}
func IsVM64X(op Op) bool {
	return IsVmx(op)
}
func IsVmx(op Op) bool {
	return isvm(op, IsXMM)
}
func IsVM32Y(op Op) bool {
	return IsVmy(op)
}
func IsVM64Y(op Op) bool {
	return IsVmy(op)
}
func IsVmy(op Op) bool {
	return isvm(op, IsYMM)
}
func isvm(op Op, idx func(Op) bool) bool {
	m, ok := op.(Mem)
	return ok && IsR64(m.Base) && idx(m.Index)
}
func IsREL8(op Op) bool {
	r, ok := op.(Rel)
	return ok && r == Rel(int8(r))
}