Implemented bitwise operations on arm64

This commit is contained in:
2025-03-14 18:37:39 +01:00
parent e123a26a1d
commit 5f339187e6
9 changed files with 190 additions and 9 deletions

View File

@ -99,6 +99,60 @@ func (c *compiler) compileARM(x asm.Instruction) {
c.append(arm.AddRegisterNumber(arm.SP, arm.SP, 16))
}
case asm.AND:
switch x.Type {
case asm.TypeRegisterNumber:
operand := c.assembler.Param.RegisterNumber[x.Index]
code, encodable := arm.AndRegisterNumber(operand.Register, operand.Register, operand.Number)
if encodable {
c.append(code)
} else {
tmp := arm.X28
c.append(arm.MoveRegisterNumber(tmp, operand.Number))
c.append(arm.AndRegisterRegister(operand.Register, operand.Register, tmp))
}
case asm.TypeRegisterRegister:
operand := c.assembler.Param.RegisterRegister[x.Index]
c.append(arm.AndRegisterRegister(operand.Destination, operand.Destination, operand.Source))
}
case asm.OR:
switch x.Type {
case asm.TypeRegisterNumber:
operand := c.assembler.Param.RegisterNumber[x.Index]
code, encodable := arm.OrRegisterNumber(operand.Register, operand.Register, operand.Number)
if encodable {
c.append(code)
} else {
tmp := arm.X28
c.append(arm.MoveRegisterNumber(tmp, operand.Number))
c.append(arm.OrRegisterRegister(operand.Register, operand.Register, tmp))
}
case asm.TypeRegisterRegister:
operand := c.assembler.Param.RegisterRegister[x.Index]
c.append(arm.OrRegisterRegister(operand.Destination, operand.Destination, operand.Source))
}
case asm.XOR:
switch x.Type {
case asm.TypeRegisterNumber:
operand := c.assembler.Param.RegisterNumber[x.Index]
code, encodable := arm.XorRegisterNumber(operand.Register, operand.Register, operand.Number)
if encodable {
c.append(code)
} else {
tmp := arm.X28
c.append(arm.MoveRegisterNumber(tmp, operand.Number))
c.append(arm.XorRegisterRegister(operand.Register, operand.Register, tmp))
}
case asm.TypeRegisterRegister:
operand := c.assembler.Param.RegisterRegister[x.Index]
c.append(arm.XorRegisterRegister(operand.Destination, operand.Destination, operand.Source))
}
case asm.ADD:
switch x.Type {
case asm.TypeRegisterNumber: