Added fallback for numbers that can't be encoded on arm64
This commit is contained in:
@ -3,7 +3,7 @@ package arm
|
||||
import "git.urbach.dev/cli/q/src/cpu"
|
||||
|
||||
// AddRegisterNumber adds a number to a register.
|
||||
func AddRegisterNumber(destination cpu.Register, source cpu.Register, number int) uint32 {
|
||||
func AddRegisterNumber(destination cpu.Register, source cpu.Register, number int) (code uint32, encodable bool) {
|
||||
return addRegisterNumber(destination, source, number, 0)
|
||||
}
|
||||
|
||||
@ -13,23 +13,23 @@ func AddRegisterRegister(destination cpu.Register, source cpu.Register, operand
|
||||
}
|
||||
|
||||
// addRegisterNumber adds the register and optionally updates the condition flags based on the result.
|
||||
func addRegisterNumber(destination cpu.Register, source cpu.Register, number int, flags uint32) uint32 {
|
||||
func addRegisterNumber(destination cpu.Register, source cpu.Register, number int, flags uint32) (code uint32, encodable bool) {
|
||||
shift := uint32(0)
|
||||
|
||||
if number > mask12 {
|
||||
if number&mask12 != 0 {
|
||||
panic("number can't be encoded")
|
||||
return 0, false
|
||||
}
|
||||
|
||||
shift = 1
|
||||
number >>= 12
|
||||
|
||||
if number > mask12 {
|
||||
panic("number can't be encoded")
|
||||
return 0, false
|
||||
}
|
||||
}
|
||||
|
||||
return flags<<29 | 0b100100010<<23 | shift<<22 | reg2Imm(destination, source, number)
|
||||
return flags<<29 | 0b100100010<<23 | shift<<22 | reg2Imm(destination, source, number), true
|
||||
}
|
||||
|
||||
// addRegisterRegister adds the registers and optionally updates the condition flags based on the result.
|
||||
|
@ -21,7 +21,8 @@ func TestAddRegisterNumber(t *testing.T) {
|
||||
|
||||
for _, pattern := range usagePatterns {
|
||||
t.Logf("add %s, %s, %d", pattern.Destination, pattern.Source, pattern.Number)
|
||||
code := arm.AddRegisterNumber(pattern.Destination, pattern.Source, pattern.Number)
|
||||
code, encodable := arm.AddRegisterNumber(pattern.Destination, pattern.Source, pattern.Number)
|
||||
assert.True(t, encodable)
|
||||
assert.DeepEqual(t, code, pattern.Code)
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ package arm
|
||||
import "git.urbach.dev/cli/q/src/cpu"
|
||||
|
||||
// CompareRegisterNumber is an alias for a subtraction that updates the conditional flags and discards the result.
|
||||
func CompareRegisterNumber(register cpu.Register, number int) uint32 {
|
||||
func CompareRegisterNumber(register cpu.Register, number int) (code uint32, encodable bool) {
|
||||
if number < 0 {
|
||||
return addRegisterNumber(ZR, register, -number, 1)
|
||||
}
|
||||
|
@ -22,7 +22,8 @@ func TestCompareRegisterNumber(t *testing.T) {
|
||||
|
||||
for _, pattern := range usagePatterns {
|
||||
t.Logf("cmp %s, %d", pattern.Source, pattern.Number)
|
||||
code := arm.CompareRegisterNumber(pattern.Source, pattern.Number)
|
||||
code, encodable := arm.CompareRegisterNumber(pattern.Source, pattern.Number)
|
||||
assert.True(t, encodable)
|
||||
assert.DeepEqual(t, code, pattern.Code)
|
||||
}
|
||||
}
|
||||
|
@ -72,7 +72,8 @@ func MoveRegisterNumberSI(destination cpu.Register, number int) (uint32, bool) {
|
||||
// MoveRegisterRegister copies a register to another register.
|
||||
func MoveRegisterRegister(destination cpu.Register, source cpu.Register) uint32 {
|
||||
if source == SP || destination == SP {
|
||||
return AddRegisterNumber(destination, source, 0)
|
||||
code, _ := AddRegisterNumber(destination, source, 0)
|
||||
return code
|
||||
}
|
||||
|
||||
return OrRegisterRegister(destination, ZR, source)
|
||||
|
@ -3,7 +3,7 @@ package arm
|
||||
import "git.urbach.dev/cli/q/src/cpu"
|
||||
|
||||
// SubRegisterNumber subtracts a number from the given register.
|
||||
func SubRegisterNumber(destination cpu.Register, source cpu.Register, number int) uint32 {
|
||||
func SubRegisterNumber(destination cpu.Register, source cpu.Register, number int) (code uint32, encodable bool) {
|
||||
return subRegisterNumber(destination, source, number, 0)
|
||||
}
|
||||
|
||||
@ -13,23 +13,23 @@ func SubRegisterRegister(destination cpu.Register, source cpu.Register, operand
|
||||
}
|
||||
|
||||
// subRegisterNumber subtracts the register and optionally updates the condition flags based on the result.
|
||||
func subRegisterNumber(destination cpu.Register, source cpu.Register, number int, flags uint32) uint32 {
|
||||
func subRegisterNumber(destination cpu.Register, source cpu.Register, number int, flags uint32) (code uint32, encodable bool) {
|
||||
shift := uint32(0)
|
||||
|
||||
if number > mask12 {
|
||||
if number&mask12 != 0 {
|
||||
panic("number can't be encoded")
|
||||
return 0, false
|
||||
}
|
||||
|
||||
shift = 1
|
||||
number >>= 12
|
||||
|
||||
if number > mask12 {
|
||||
panic("number can't be encoded")
|
||||
return 0, false
|
||||
}
|
||||
}
|
||||
|
||||
return flags<<29 | 0b110100010<<23 | shift<<22 | reg2Imm(destination, source, number)
|
||||
return flags<<29 | 0b110100010<<23 | shift<<22 | reg2Imm(destination, source, number), true
|
||||
}
|
||||
|
||||
// subRegisterRegister subtracts the registers and optionally updates the condition flags based on the result.
|
||||
|
@ -22,7 +22,8 @@ func TestSubRegisterNumber(t *testing.T) {
|
||||
|
||||
for _, pattern := range usagePatterns {
|
||||
t.Logf("sub %s, %s, %d", pattern.Destination, pattern.Source, pattern.Number)
|
||||
code := arm.SubRegisterNumber(pattern.Destination, pattern.Source, pattern.Number)
|
||||
code, encodable := arm.SubRegisterNumber(pattern.Destination, pattern.Source, pattern.Number)
|
||||
assert.True(t, encodable)
|
||||
assert.DeepEqual(t, code, pattern.Code)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user