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) } }