Implemented division by immediates in the IR
This commit is contained in:
parent
89ed2026e0
commit
42e7c8a306
7 changed files with 61 additions and 20 deletions
|
@ -253,7 +253,9 @@ func (c *compiler) ARM(x asm.Instruction) {
|
|||
operand := c.assembler.Param.RegisterRegister[x.Index]
|
||||
c.append(arm.DivSigned(operand.Destination, operand.Destination, operand.Source))
|
||||
case asm.TypeRegisterNumber:
|
||||
panic("not implemented")
|
||||
operand := c.assembler.Param.RegisterNumber[x.Index]
|
||||
c.code = arm.MoveRegisterNumber(c.code, arm.TMP, operand.Number)
|
||||
c.append(arm.DivSigned(operand.Register, operand.Register, arm.TMP))
|
||||
}
|
||||
|
||||
case asm.MUL:
|
||||
|
@ -274,7 +276,10 @@ func (c *compiler) ARM(x asm.Instruction) {
|
|||
c.append(arm.DivSigned(arm.TMP, operand.Destination, operand.Source))
|
||||
c.append(arm.MultiplySubtract(operand.Destination, arm.TMP, operand.Source, operand.Destination))
|
||||
case asm.TypeRegisterNumber:
|
||||
panic("not implemented")
|
||||
operand := c.assembler.Param.RegisterNumber[x.Index]
|
||||
c.code = arm.MoveRegisterNumber(c.code, arm.TMP, operand.Number)
|
||||
c.append(arm.DivSigned(arm.TMP2, operand.Register, arm.TMP))
|
||||
c.append(arm.MultiplySubtract(operand.Register, arm.TMP2, arm.TMP, operand.Register))
|
||||
}
|
||||
|
||||
case asm.JE, asm.JNE, asm.JG, asm.JGE, asm.JL, asm.JLE, asm.JUMP:
|
||||
|
|
|
@ -71,6 +71,20 @@ func (c *compiler) X86(x asm.Instruction) {
|
|||
|
||||
case asm.DIV:
|
||||
switch x.Type {
|
||||
case asm.TypeRegisterNumber:
|
||||
operands := c.assembler.Param.RegisterNumber[x.Index]
|
||||
|
||||
if operands.Register != x86.RAX {
|
||||
c.code = x86.MoveRegisterRegister(c.code, x86.RAX, operands.Register)
|
||||
}
|
||||
|
||||
c.code = x86.MoveRegisterNumber(c.code, x86.TMP, operands.Number)
|
||||
c.code = x86.ExtendRAXToRDX(c.code)
|
||||
c.code = x86.DivRegister(c.code, x86.TMP)
|
||||
|
||||
if operands.Register != x86.RAX {
|
||||
c.code = x86.MoveRegisterRegister(c.code, operands.Register, x86.RAX)
|
||||
}
|
||||
case asm.TypeRegisterRegister:
|
||||
operands := c.assembler.Param.RegisterRegister[x.Index]
|
||||
|
||||
|
@ -88,6 +102,20 @@ func (c *compiler) X86(x asm.Instruction) {
|
|||
|
||||
case asm.MODULO:
|
||||
switch x.Type {
|
||||
case asm.TypeRegisterNumber:
|
||||
operands := c.assembler.Param.RegisterNumber[x.Index]
|
||||
|
||||
if operands.Register != x86.RAX {
|
||||
c.code = x86.MoveRegisterRegister(c.code, x86.RAX, operands.Register)
|
||||
}
|
||||
|
||||
c.code = x86.MoveRegisterNumber(c.code, x86.TMP, operands.Number)
|
||||
c.code = x86.ExtendRAXToRDX(c.code)
|
||||
c.code = x86.DivRegister(c.code, x86.TMP)
|
||||
|
||||
if operands.Register != x86.RDX {
|
||||
c.code = x86.MoveRegisterRegister(c.code, operands.Register, x86.RDX)
|
||||
}
|
||||
case asm.TypeRegisterRegister:
|
||||
operands := c.assembler.Param.RegisterRegister[x.Index]
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue