102 lines
2.4 KiB
Go
102 lines
2.4 KiB
Go
package arm_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"git.urbach.dev/cli/q/src/arm"
|
|
"git.urbach.dev/cli/q/src/cpu"
|
|
"git.urbach.dev/go/assert"
|
|
)
|
|
|
|
func TestMoveRegisterRegister(t *testing.T) {
|
|
usagePatterns := []struct {
|
|
Destination cpu.Register
|
|
Source cpu.Register
|
|
Code uint32
|
|
}{
|
|
{arm.X0, arm.X1, 0xAA0103E0},
|
|
{arm.X1, arm.X0, 0xAA0003E1},
|
|
{arm.FP, arm.SP, 0x910003FD},
|
|
{arm.SP, arm.FP, 0x910003BF},
|
|
}
|
|
|
|
for _, pattern := range usagePatterns {
|
|
t.Logf("mov %s, %s", pattern.Destination, pattern.Source)
|
|
code := arm.MoveRegisterRegister(pattern.Destination, pattern.Source)
|
|
assert.DeepEqual(t, code, pattern.Code)
|
|
}
|
|
}
|
|
|
|
func TestMoveRegisterNumber(t *testing.T) {
|
|
usagePatterns := []struct {
|
|
Register cpu.Register
|
|
Number int
|
|
Code uint32
|
|
}{
|
|
// MOVZ
|
|
{arm.X0, 0, 0xD2800000},
|
|
{arm.X0, 1, 0xD2800020},
|
|
|
|
// MOV (bitmask immediate)
|
|
{arm.X0, 0x1FFFF, 0xB24043E0},
|
|
{arm.X0, 0x7FFFFFFF, 0xB2407BE0},
|
|
{arm.X0, 0xFFFFFFFF, 0xB2407FE0},
|
|
|
|
// MOV (inverted wide immediate)
|
|
{arm.X0, -1, 0x92800000},
|
|
{arm.X0, 0x7FFFFFFFFFFFFFFF, 0x92F00000},
|
|
{arm.X0, 0x2FFFFFFFF, 0x92DFFFA0}, // not encodable in the GNU assembler
|
|
{arm.X0, 0x2FFFF, 0x92BFFFA0}, // not encodable in the GNU assembler
|
|
|
|
// Not encodable
|
|
{arm.X0, 0xCAFEBABE, 0},
|
|
{arm.X0, 0xDEADC0DE, 0},
|
|
}
|
|
|
|
for _, pattern := range usagePatterns {
|
|
t.Logf("mov %s, %d", pattern.Register, pattern.Number)
|
|
code, encodable := arm.MoveRegisterNumber(pattern.Register, pattern.Number)
|
|
|
|
if pattern.Code != 0 {
|
|
assert.True(t, encodable)
|
|
assert.DeepEqual(t, code, pattern.Code)
|
|
} else {
|
|
assert.False(t, encodable)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestMoveKeep(t *testing.T) {
|
|
usagePatterns := []struct {
|
|
Register cpu.Register
|
|
Number uint16
|
|
Code uint32
|
|
}{
|
|
{arm.X0, 0, 0xF2800000},
|
|
{arm.X0, 1, 0xF2800020},
|
|
}
|
|
|
|
for _, pattern := range usagePatterns {
|
|
t.Logf("movk %s, %d", pattern.Register, pattern.Number)
|
|
code := arm.MoveKeep(pattern.Register, 0, pattern.Number)
|
|
assert.DeepEqual(t, code, pattern.Code)
|
|
}
|
|
}
|
|
|
|
func TestMoveZero(t *testing.T) {
|
|
usagePatterns := []struct {
|
|
Register cpu.Register
|
|
Number uint16
|
|
Code uint32
|
|
}{
|
|
{arm.X0, 0, 0xD2800000},
|
|
{arm.X0, 1, 0xD2800020},
|
|
}
|
|
|
|
for _, pattern := range usagePatterns {
|
|
t.Logf("movz %s, %d", pattern.Register, pattern.Number)
|
|
code := arm.MoveZero(pattern.Register, 0, pattern.Number)
|
|
assert.DeepEqual(t, code, pattern.Code)
|
|
}
|
|
}
|