54 lines
1.8 KiB
Go
54 lines
1.8 KiB
Go
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 {
|
|
switch operands := data.(type) {
|
|
case *RegisterNumber:
|
|
if operands.Register == x64.RAX {
|
|
code = x64.MoveRegisterNumber32(code, x64.RCX, uint32(operands.Number))
|
|
code = x64.ExtendRAXToRDX(code)
|
|
code = x64.DivRegister(code, x64.RCX)
|
|
} else {
|
|
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)
|
|
}
|
|
|
|
case *RegisterRegister:
|
|
if operands.Destination == x64.RAX {
|
|
code = x64.ExtendRAXToRDX(code)
|
|
code = x64.DivRegister(code, operands.Source)
|
|
} else {
|
|
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)
|
|
}
|
|
}
|
|
return code
|
|
}
|
|
|
|
// modulo calculates the division remainder on x64 machines.
|
|
func modulo(code []byte, data any) []byte {
|
|
switch operands := data.(type) {
|
|
case *RegisterNumber:
|
|
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.RDX)
|
|
|
|
case *RegisterRegister:
|
|
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.RDX)
|
|
}
|
|
|
|
return code
|
|
}
|