Files
avo/operand/checks.go

167 lines
3.1 KiB
Go
Raw Normal View History

2018-11-26 10:13:04 -08:00
package operand
import (
"math"
"github.com/mmcloughlin/avo/reg"
2018-11-26 10:13:04 -08:00
"github.com/mmcloughlin/avo"
)
// Is1 returns true if op is the immediate constant 1.
2018-11-26 10:13:04 -08:00
func Is1(op avo.Operand) bool {
i, ok := op.(Imm)
return ok && i == 1
2018-11-26 10:13:04 -08:00
}
// Is3 returns true if op is the immediate constant 3.
2018-11-26 10:13:04 -08:00
func Is3(op avo.Operand) bool {
i, ok := op.(Imm)
return ok && i == 3
2018-11-26 10:13:04 -08:00
}
// IsImm2u returns true if op is a 2-bit unsigned immediate (less than 4).
2018-11-26 10:13:04 -08:00
func IsImm2u(op avo.Operand) bool {
i, ok := op.(Imm)
return ok && i < 4
2018-11-26 10:13:04 -08:00
}
// IsImm8 returns true is op is an 8-bit immediate.
2018-11-26 10:13:04 -08:00
func IsImm8(op avo.Operand) bool {
i, ok := op.(Imm)
return ok && i <= math.MaxUint8
2018-11-26 10:13:04 -08:00
}
// IsImm16 returns true is op is a 16-bit immediate.
2018-11-26 10:13:04 -08:00
func IsImm16(op avo.Operand) bool {
i, ok := op.(Imm)
return ok && i <= math.MaxUint16
2018-11-26 10:13:04 -08:00
}
// IsImm32 returns true is op is a 32-bit immediate.
2018-11-26 10:13:04 -08:00
func IsImm32(op avo.Operand) bool {
i, ok := op.(Imm)
return ok && i <= math.MaxUint32
2018-11-26 10:13:04 -08:00
}
// IsImm64 returns true is op is a 64-bit immediate.
2018-11-26 10:13:04 -08:00
func IsImm64(op avo.Operand) bool {
_, ok := op.(Imm)
return ok
2018-11-26 10:13:04 -08:00
}
// IsAl returns true if op is the AL register.
2018-11-26 10:13:04 -08:00
func IsAl(op avo.Operand) bool {
return op == reg.AL
2018-11-26 10:13:04 -08:00
}
// IsCl returns true if op is the CL register.
2018-11-26 10:13:04 -08:00
func IsCl(op avo.Operand) bool {
return op == reg.CL
2018-11-26 10:13:04 -08:00
}
// IsAx returns true if op is the 16-bit AX register.
2018-11-26 10:13:04 -08:00
func IsAx(op avo.Operand) bool {
return op == reg.AX
2018-11-26 10:13:04 -08:00
}
// IsEax returns true if op is the 32-bit EAX register.
2018-11-26 10:13:04 -08:00
func IsEax(op avo.Operand) bool {
return op == reg.EAX
2018-11-26 10:13:04 -08:00
}
// IsRax returns true if op is the 64-bit RAX register.
2018-11-26 10:13:04 -08:00
func IsRax(op avo.Operand) bool {
return op == reg.RAX
2018-11-26 10:13:04 -08:00
}
// IsR8 returns true if op is an 8-bit general-purpose register.
2018-11-26 10:13:04 -08:00
func IsR8(op avo.Operand) bool {
return IsGP(op, 1)
2018-11-26 10:13:04 -08:00
}
// IsR16 returns true if op is a 16-bit general-purpose register.
2018-11-26 10:13:04 -08:00
func IsR16(op avo.Operand) bool {
return IsGP(op, 2)
2018-11-26 10:13:04 -08:00
}
// IsR32 returns true if op is a 32-bit general-purpose register.
2018-11-26 10:13:04 -08:00
func IsR32(op avo.Operand) bool {
return IsGP(op, 4)
2018-11-26 10:13:04 -08:00
}
// IsR64 returns true if op is a 64-bit general-purpose register.
2018-11-26 10:13:04 -08:00
func IsR64(op avo.Operand) bool {
return IsGP(op, 8)
}
// IsGP returns true if op is a general-purpose register of size n bytes.
func IsGP(op avo.Operand, n uint) bool {
r, ok := op.(reg.Register)
return ok && r.Kind() == reg.GeneralPurpose.Kind && r.Bytes() == n
2018-11-26 10:13:04 -08:00
}
func IsXmm0(op avo.Operand) bool {
return false
}
func IsXmm(op avo.Operand) bool {
return false
}
func IsYmm(op avo.Operand) bool {
return false
}
func IsM(op avo.Operand) bool {
return false
}
func IsM8(op avo.Operand) bool {
return false
}
func IsM16(op avo.Operand) bool {
return false
}
func IsM32(op avo.Operand) bool {
return false
}
func IsM64(op avo.Operand) bool {
return false
}
func IsM128(op avo.Operand) bool {
return false
}
func IsM256(op avo.Operand) bool {
return false
}
func IsVm32x(op avo.Operand) bool {
return false
}
func IsVm64x(op avo.Operand) bool {
return false
}
func IsVm32y(op avo.Operand) bool {
return false
}
func IsVm64y(op avo.Operand) bool {
return false
}
func IsRel8(op avo.Operand) bool {
return false
}
func IsRel32(op avo.Operand) bool {
return false
}