Implemented data labels
This commit is contained in:
parent
ff0b8ecb10
commit
1b75529bb3
18 changed files with 428 additions and 327 deletions
43
src/build/asm/divide.go
Normal file
43
src/build/asm/divide.go
Normal file
|
@ -0,0 +1,43 @@
|
|||
package asm
|
||||
|
||||
import "git.akyoto.dev/cli/q/src/build/arch/x64"
|
||||
|
||||
// divide implements the division on x64 machines.
|
||||
func divide(code []byte, data any) []byte {
|
||||
code = x64.PushRegister(code, x64.RDX)
|
||||
|
||||
switch operands := data.(type) {
|
||||
case *RegisterNumber:
|
||||
if operands.Register == x64.RAX {
|
||||
code = x64.PushRegister(code, x64.RCX)
|
||||
code = x64.MoveRegisterNumber32(code, x64.RCX, uint32(operands.Number))
|
||||
code = x64.ExtendRAXToRDX(code)
|
||||
code = x64.DivRegister(code, x64.RCX)
|
||||
code = x64.PopRegister(code, x64.RCX)
|
||||
} else {
|
||||
code = x64.PushRegister(code, x64.RAX)
|
||||
code = x64.MoveRegisterRegister64(code, x64.RAX, operands.Register)
|
||||
code = x64.MoveRegisterNumber32(code, operands.Register, uint32(operands.Number))
|
||||
code = x64.ExtendRAXToRDX(code)
|
||||
code = x64.DivRegister(code, operands.Register)
|
||||
code = x64.MoveRegisterRegister64(code, operands.Register, x64.RAX)
|
||||
code = x64.PopRegister(code, x64.RAX)
|
||||
}
|
||||
|
||||
case *RegisterRegister:
|
||||
if operands.Destination == x64.RAX {
|
||||
code = x64.ExtendRAXToRDX(code)
|
||||
code = x64.DivRegister(code, operands.Source)
|
||||
} else {
|
||||
code = x64.PushRegister(code, x64.RAX)
|
||||
code = x64.MoveRegisterRegister64(code, x64.RAX, operands.Destination)
|
||||
code = x64.ExtendRAXToRDX(code)
|
||||
code = x64.DivRegister(code, operands.Source)
|
||||
code = x64.MoveRegisterRegister64(code, operands.Destination, x64.RAX)
|
||||
code = x64.PopRegister(code, x64.RAX)
|
||||
}
|
||||
}
|
||||
|
||||
code = x64.PopRegister(code, x64.RDX)
|
||||
return code
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue