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) }