2018-11-11 22:17:06 -06:00
|
|
|
package reg
|
|
|
|
|
|
2020-01-22 22:50:40 -08:00
|
|
|
import (
|
|
|
|
|
"testing"
|
|
|
|
|
"testing/quick"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestIDFields(t *testing.T) {
|
|
|
|
|
f := func(v uint8, kind Kind, idx Index) bool {
|
|
|
|
|
id := newid(v, kind, idx)
|
|
|
|
|
return id.Kind() == kind && id.Index() == idx
|
|
|
|
|
}
|
|
|
|
|
if err := quick.Check(f, nil); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestIDIsVirtual(t *testing.T) {
|
|
|
|
|
cases := []Virtual{
|
|
|
|
|
GeneralPurpose.Virtual(42, S64),
|
|
|
|
|
Vector.Virtual(42, S128),
|
|
|
|
|
}
|
|
|
|
|
for _, r := range cases {
|
|
|
|
|
if !r.ID().IsVirtual() {
|
|
|
|
|
t.FailNow()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestIDIsPhysical(t *testing.T) {
|
|
|
|
|
cases := []Physical{AL, AH, AX, EAX, RAX, X1, Y2, Z31}
|
|
|
|
|
for _, r := range cases {
|
|
|
|
|
if !r.ID().IsPhysical() {
|
|
|
|
|
t.FailNow()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-11-11 22:17:06 -06:00
|
|
|
|
2019-04-01 20:27:44 -07:00
|
|
|
func TestSpecSize(t *testing.T) {
|
2018-11-11 22:17:06 -06:00
|
|
|
cases := []struct {
|
2019-04-01 20:27:44 -07:00
|
|
|
Spec Spec
|
|
|
|
|
Size uint
|
2018-11-11 22:17:06 -06:00
|
|
|
}{
|
2018-12-06 17:26:33 -08:00
|
|
|
{S0, 0},
|
2018-11-11 22:17:06 -06:00
|
|
|
{S8L, 1},
|
|
|
|
|
{S8H, 1},
|
|
|
|
|
{S16, 2},
|
|
|
|
|
{S32, 4},
|
|
|
|
|
{S64, 8},
|
|
|
|
|
{S128, 16},
|
|
|
|
|
{S256, 32},
|
|
|
|
|
{S512, 64},
|
|
|
|
|
}
|
|
|
|
|
for _, c := range cases {
|
2019-04-01 20:27:44 -07:00
|
|
|
if c.Spec.Size() != c.Size {
|
|
|
|
|
t.Errorf("%v.Size() = %d; expect = %d", c.Spec, c.Spec.Size(), c.Size)
|
2018-11-11 22:17:06 -06:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-12-02 23:59:29 -08:00
|
|
|
|
2018-12-05 00:05:57 -08:00
|
|
|
func TestToVirtual(t *testing.T) {
|
2020-01-22 22:50:40 -08:00
|
|
|
v := GeneralPurpose.Virtual(42, S32)
|
2018-12-05 00:05:57 -08:00
|
|
|
if ToVirtual(v) != v {
|
|
|
|
|
t.Errorf("ToVirtual(v) != v for virtual register")
|
|
|
|
|
}
|
|
|
|
|
if ToVirtual(ECX) != nil {
|
|
|
|
|
t.Errorf("ToVirtual should be nil for physical registers")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestToPhysical(t *testing.T) {
|
2020-01-22 22:50:40 -08:00
|
|
|
v := GeneralPurpose.Virtual(42, S32)
|
2018-12-05 00:05:57 -08:00
|
|
|
if ToPhysical(v) != nil {
|
|
|
|
|
t.Errorf("ToPhysical should be nil for virtual registers")
|
|
|
|
|
}
|
|
|
|
|
if ToPhysical(ECX) != ECX {
|
|
|
|
|
t.Errorf("ToPhysical(p) != p for physical register")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-30 18:40:45 -08:00
|
|
|
func TestFamilyLookup(t *testing.T) {
|
|
|
|
|
cases := []struct {
|
|
|
|
|
Family *Family
|
2020-01-22 22:50:40 -08:00
|
|
|
ID Index
|
2018-12-30 18:40:45 -08:00
|
|
|
Spec Spec
|
|
|
|
|
Expect Physical
|
|
|
|
|
}{
|
|
|
|
|
{GeneralPurpose, 0, S8, AL},
|
|
|
|
|
{GeneralPurpose, 1, S8L, CL},
|
|
|
|
|
{GeneralPurpose, 2, S8H, DH},
|
|
|
|
|
{GeneralPurpose, 3, S16, BX},
|
|
|
|
|
{GeneralPurpose, 9, S32, R9L},
|
|
|
|
|
{GeneralPurpose, 13, S64, R13},
|
|
|
|
|
{GeneralPurpose, 13, S512, nil},
|
|
|
|
|
{GeneralPurpose, 133, S64, nil},
|
|
|
|
|
{Vector, 1, S128, X1},
|
|
|
|
|
{Vector, 13, S256, Y13},
|
|
|
|
|
{Vector, 27, S512, Z27},
|
|
|
|
|
{Vector, 1, S16, nil},
|
|
|
|
|
{Vector, 299, S256, nil},
|
|
|
|
|
}
|
|
|
|
|
for _, c := range cases {
|
|
|
|
|
got := c.Family.Lookup(c.ID, c.Spec)
|
|
|
|
|
if got != c.Expect {
|
2020-01-22 22:50:40 -08:00
|
|
|
t.Errorf("idx=%v spec=%v: lookup got %v expect %v", c.ID, c.Spec, got, c.Expect)
|
2018-12-30 18:40:45 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestPhysicalAs(t *testing.T) {
|
|
|
|
|
cases := []struct {
|
|
|
|
|
Register Physical
|
|
|
|
|
Spec Spec
|
|
|
|
|
Expect Physical
|
|
|
|
|
}{
|
|
|
|
|
{DX, S8L, DL},
|
|
|
|
|
{DX, S8H, DH},
|
|
|
|
|
{DX, S8, DL},
|
|
|
|
|
{DX, S16, DX},
|
|
|
|
|
{DX, S32, EDX},
|
|
|
|
|
{DX, S64, RDX},
|
|
|
|
|
{DX, S256, nil},
|
|
|
|
|
}
|
|
|
|
|
for _, c := range cases {
|
|
|
|
|
got := c.Register.as(c.Spec)
|
|
|
|
|
if got != c.Expect {
|
|
|
|
|
t.Errorf("%s.as(%v) = %v; expect %v", c.Register.Asm(), c.Spec, got, c.Expect)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestVirtualAs(t *testing.T) {
|
2020-01-22 22:50:40 -08:00
|
|
|
v := GeneralPurpose.Virtual(0, S64)
|
|
|
|
|
specs := []Spec{S8, S8L, S8H, S16, S32, S64}
|
|
|
|
|
for _, s := range specs {
|
|
|
|
|
if v.as(s).Mask() != s.Mask() {
|
|
|
|
|
t.FailNow()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestLookupPhysical(t *testing.T) {
|
2018-12-30 18:40:45 -08:00
|
|
|
cases := []struct {
|
2020-01-22 22:50:40 -08:00
|
|
|
Kind Kind
|
|
|
|
|
Index Index
|
|
|
|
|
Spec Spec
|
|
|
|
|
Expect Physical
|
2018-12-30 18:40:45 -08:00
|
|
|
}{
|
2020-01-22 22:50:40 -08:00
|
|
|
{KindGP, 0, S8L, AL},
|
|
|
|
|
{KindGP, 1, S8H, CH},
|
|
|
|
|
{KindGP, 7, S8, DIB},
|
|
|
|
|
{KindGP, 8, S16, R8W},
|
|
|
|
|
{KindGP, 9, S32, R9L},
|
|
|
|
|
{KindGP, 10, S64, R10},
|
|
|
|
|
|
|
|
|
|
{KindVector, 7, S128, X7},
|
|
|
|
|
{KindVector, 17, S256, Y17},
|
|
|
|
|
{KindVector, 27, S512, Z27},
|
2018-12-30 18:40:45 -08:00
|
|
|
}
|
|
|
|
|
for _, c := range cases {
|
2020-01-22 22:50:40 -08:00
|
|
|
if got := LookupPhysical(c.Kind, c.Index, c.Spec); !Equal(got, c.Expect) {
|
|
|
|
|
t.FailNow()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestLookupIDSelf(t *testing.T) {
|
|
|
|
|
cases := []Physical{AL, AH, AX, EAX, RAX, X1, Y2, Z31}
|
|
|
|
|
for _, r := range cases {
|
|
|
|
|
if got := LookupID(r.ID(), r.spec()); !Equal(got, r) {
|
|
|
|
|
t.FailNow()
|
2018-12-30 18:40:45 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|