start to implement operand types and checks
This commit is contained in:
69
operand/checks_test.go
Normal file
69
operand/checks_test.go
Normal file
@@ -0,0 +1,69 @@
|
||||
package operand
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"runtime"
|
||||
"testing"
|
||||
|
||||
"github.com/mmcloughlin/avo/reg"
|
||||
|
||||
"github.com/mmcloughlin/avo"
|
||||
)
|
||||
|
||||
func TestChecks(t *testing.T) {
|
||||
cases := []struct {
|
||||
Predicate func(avo.Operand) bool
|
||||
Operand avo.Operand
|
||||
Expect bool
|
||||
}{
|
||||
// Immediates
|
||||
{Is1, Imm(1), true},
|
||||
{Is1, Imm(23), false},
|
||||
{Is3, Imm(3), true},
|
||||
{Is3, Imm(23), false},
|
||||
{IsImm2u, Imm(3), true},
|
||||
{IsImm2u, Imm(4), false},
|
||||
{IsImm8, Imm(255), true},
|
||||
{IsImm8, Imm(256), false},
|
||||
{IsImm16, Imm((1 << 16) - 1), true},
|
||||
{IsImm16, Imm(1 << 16), false},
|
||||
{IsImm32, Imm((1 << 32) - 1), true},
|
||||
{IsImm32, Imm(1 << 32), false},
|
||||
{IsImm64, Imm((1 << 64) - 1), true},
|
||||
|
||||
// Specific registers
|
||||
{IsAl, reg.AL, true},
|
||||
{IsAl, reg.CL, false},
|
||||
{IsCl, reg.CL, true},
|
||||
{IsCl, reg.DH, false},
|
||||
{IsAx, reg.AX, true},
|
||||
{IsAx, reg.DX, false},
|
||||
{IsEax, reg.EAX, true},
|
||||
{IsEax, reg.ECX, false},
|
||||
{IsRax, reg.RAX, true},
|
||||
{IsRax, reg.R13, false},
|
||||
|
||||
// General-purpose registers
|
||||
{IsR8, reg.AL, true},
|
||||
{IsR8, reg.CH, true},
|
||||
{IsR8, reg.EAX, false},
|
||||
{IsR16, reg.DX, true},
|
||||
{IsR16, reg.R10W, true},
|
||||
{IsR16, reg.R10B, false},
|
||||
{IsR32, reg.EBP, true},
|
||||
{IsR32, reg.R14L, true},
|
||||
{IsR32, reg.R8, false},
|
||||
{IsR64, reg.RDX, true},
|
||||
{IsR64, reg.R10, true},
|
||||
{IsR64, reg.EBX, false},
|
||||
}
|
||||
for _, c := range cases {
|
||||
if c.Predicate(c.Operand) != c.Expect {
|
||||
t.Errorf("%s( %#v ) != %v", funcname(c.Predicate), c.Operand, c.Expect)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func funcname(f interface{}) string {
|
||||
return runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name()
|
||||
}
|
||||
Reference in New Issue
Block a user