diff --git a/src/arm/Move.go b/src/arm/Move.go index c687c2a..bda2948 100644 --- a/src/arm/Move.go +++ b/src/arm/Move.go @@ -16,11 +16,11 @@ func MoveRegisterRegister(destination cpu.Register, source cpu.Register) uint32 // MoveRegisterNumber moves a number into the given register. func MoveRegisterNumber(destination cpu.Register, number int) (uint32, bool) { - if number < 0 { - return MoveInvertedWideImmediate(destination, ^number, 0), true - } - if sizeof.Signed(number) <= 2 { + if number < 0 { + return MoveInvertedWideImmediate(destination, ^number, 0), true + } + return MoveZero(destination, 0, uint16(number)), true } diff --git a/src/arm/Move_test.go b/src/arm/Move_test.go index 6e02a4e..eebdfc7 100644 --- a/src/arm/Move_test.go +++ b/src/arm/Move_test.go @@ -30,7 +30,7 @@ func TestMoveRegisterRegister(t *testing.T) { func TestMoveRegisterNumber(t *testing.T) { usagePatterns := []struct { Register cpu.Register - Number int + Number uint64 Code uint32 }{ // MOVZ @@ -41,9 +41,10 @@ func TestMoveRegisterNumber(t *testing.T) { {arm.X0, 0x1FFFF, 0xB24043E0}, {arm.X0, 0x7FFFFFFF, 0xB2407BE0}, {arm.X0, 0xFFFFFFFF, 0xB2407FE0}, + {arm.X0, 0xC3FFFFFFC3FFFFFF, 0xB2026FE0}, // MOV (inverted wide immediate) - {arm.X0, -1, 0x92800000}, + {arm.X0, 0xFFFFFFFFFFFFFFFF, 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 @@ -55,7 +56,7 @@ func TestMoveRegisterNumber(t *testing.T) { for _, pattern := range usagePatterns { t.Logf("mov %s, %d", pattern.Register, pattern.Number) - code, encodable := arm.MoveRegisterNumber(pattern.Register, pattern.Number) + code, encodable := arm.MoveRegisterNumber(pattern.Register, int(pattern.Number)) if pattern.Code != 0 { assert.True(t, encodable)