53 lines
1.0 KiB
Go
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)
|
|
}
|