q/src/asmc/jumpARM.go
2025-03-13 16:02:09 +01:00

53 lines
1.0 KiB
Go

package asmc
import (
"fmt"
"git.urbach.dev/cli/q/src/arm"
"git.urbach.dev/cli/q/src/asm"
)
func (c *compiler) jumpARM(x asm.Instruction) {
label := c.assembler.Param.Label[x.Index]
mnemonic := x.Mnemonic
position := Address(len(c.code))
pointer := &pointer{
Position: position,
Size: 4,
}
c.append(arm.Nop())
pointer.Resolve = func() Address {
destination, exists := c.codeLabels[label.Name]
if !exists {
panic(fmt.Sprintf("unknown jump label %s", label.Name))
}
distance := (int(destination) - int(position)) / 4
switch mnemonic {
case asm.JE:
return arm.JumpIfEqual(distance)
case asm.JNE:
return arm.JumpIfNotEqual(distance)
case asm.JG:
return arm.JumpIfGreater(distance)
case asm.JGE:
return arm.JumpIfGreaterOrEqual(distance)
case asm.JL:
return arm.JumpIfLess(distance)
case asm.JLE:
return arm.JumpIfLessOrEqual(distance)
case asm.JUMP:
return arm.Jump(distance)
default:
panic("not implemented")
}
}
c.codePointers = append(c.codePointers, pointer)
}