Implemented loads with register offsets

This commit is contained in:
2025-02-19 15:36:42 +01:00
parent 4cff697bf5
commit 1bc845e6f0
13 changed files with 320 additions and 145 deletions

View File

@ -93,10 +93,7 @@ func (c *compiler) compile(x asm.Instruction) {
c.codeLabels[x.Data.(*asm.Label).Name] = Address(len(c.code))
case asm.LOAD:
switch operands := x.Data.(type) {
case *asm.MemoryRegister:
c.code = x86.LoadRegister(c.code, operands.Register, operands.Address.Offset, operands.Address.Length, operands.Address.Base)
}
c.load(x)
case asm.MOVE:
c.move(x)

19
src/asmc/load.go Normal file
View File

@ -0,0 +1,19 @@
package asmc
import (
"math"
"git.akyoto.dev/cli/q/src/asm"
"git.akyoto.dev/cli/q/src/x86"
)
func (c *compiler) load(x asm.Instruction) {
switch operands := x.Data.(type) {
case *asm.MemoryRegister:
if operands.Address.OffsetRegister == math.MaxUint8 {
c.code = x86.LoadRegister(c.code, operands.Register, operands.Address.Offset, operands.Address.Length, operands.Address.Base)
} else {
c.code = x86.LoadDynamicRegister(c.code, operands.Register, operands.Address.OffsetRegister, operands.Address.Length, operands.Address.Base)
}
}
}