Fixed move instruction encoding on arm64
This commit is contained in:
@ -16,11 +16,11 @@ func MoveRegisterRegister(destination cpu.Register, source cpu.Register) uint32
|
|||||||
|
|
||||||
// MoveRegisterNumber moves a number into the given register.
|
// MoveRegisterNumber moves a number into the given register.
|
||||||
func MoveRegisterNumber(destination cpu.Register, number int) (uint32, bool) {
|
func MoveRegisterNumber(destination cpu.Register, number int) (uint32, bool) {
|
||||||
if number < 0 {
|
|
||||||
return MoveInvertedWideImmediate(destination, ^number, 0), true
|
|
||||||
}
|
|
||||||
|
|
||||||
if sizeof.Signed(number) <= 2 {
|
if sizeof.Signed(number) <= 2 {
|
||||||
|
if number < 0 {
|
||||||
|
return MoveInvertedWideImmediate(destination, ^number, 0), true
|
||||||
|
}
|
||||||
|
|
||||||
return MoveZero(destination, 0, uint16(number)), true
|
return MoveZero(destination, 0, uint16(number)), true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ func TestMoveRegisterRegister(t *testing.T) {
|
|||||||
func TestMoveRegisterNumber(t *testing.T) {
|
func TestMoveRegisterNumber(t *testing.T) {
|
||||||
usagePatterns := []struct {
|
usagePatterns := []struct {
|
||||||
Register cpu.Register
|
Register cpu.Register
|
||||||
Number int
|
Number uint64
|
||||||
Code uint32
|
Code uint32
|
||||||
}{
|
}{
|
||||||
// MOVZ
|
// MOVZ
|
||||||
@ -41,9 +41,10 @@ func TestMoveRegisterNumber(t *testing.T) {
|
|||||||
{arm.X0, 0x1FFFF, 0xB24043E0},
|
{arm.X0, 0x1FFFF, 0xB24043E0},
|
||||||
{arm.X0, 0x7FFFFFFF, 0xB2407BE0},
|
{arm.X0, 0x7FFFFFFF, 0xB2407BE0},
|
||||||
{arm.X0, 0xFFFFFFFF, 0xB2407FE0},
|
{arm.X0, 0xFFFFFFFF, 0xB2407FE0},
|
||||||
|
{arm.X0, 0xC3FFFFFFC3FFFFFF, 0xB2026FE0},
|
||||||
|
|
||||||
// MOV (inverted wide immediate)
|
// MOV (inverted wide immediate)
|
||||||
{arm.X0, -1, 0x92800000},
|
{arm.X0, 0xFFFFFFFFFFFFFFFF, 0x92800000},
|
||||||
{arm.X0, 0x7FFFFFFFFFFFFFFF, 0x92F00000},
|
{arm.X0, 0x7FFFFFFFFFFFFFFF, 0x92F00000},
|
||||||
{arm.X0, 0x2FFFFFFFF, 0x92DFFFA0}, // not encodable in the GNU assembler
|
{arm.X0, 0x2FFFFFFFF, 0x92DFFFA0}, // not encodable in the GNU assembler
|
||||||
{arm.X0, 0x2FFFF, 0x92BFFFA0}, // 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 {
|
for _, pattern := range usagePatterns {
|
||||||
t.Logf("mov %s, %d", pattern.Register, pattern.Number)
|
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 {
|
if pattern.Code != 0 {
|
||||||
assert.True(t, encodable)
|
assert.True(t, encodable)
|
||||||
|
Reference in New Issue
Block a user