Implemented bit shifts
This commit is contained in:
17
src/build/arch/x64/Shift.go
Normal file
17
src/build/arch/x64/Shift.go
Normal file
@ -0,0 +1,17 @@
|
||||
package x64
|
||||
|
||||
import (
|
||||
"git.akyoto.dev/cli/q/src/build/cpu"
|
||||
)
|
||||
|
||||
// ShiftLeftNumber shifts the register value by `bitCount` bits to the left.
|
||||
func ShiftLeftNumber(code []byte, register cpu.Register, bitCount byte) []byte {
|
||||
code = encode(code, AddressDirect, 0b100, register, 8, 0xC1)
|
||||
return append(code, bitCount)
|
||||
}
|
||||
|
||||
// ShiftRightSignedNumber shifts the signed register value by `bitCount` bits to the right.
|
||||
func ShiftRightSignedNumber(code []byte, register cpu.Register, bitCount byte) []byte {
|
||||
code = encode(code, AddressDirect, 0b111, register, 8, 0xC1)
|
||||
return append(code, bitCount)
|
||||
}
|
@ -184,6 +184,18 @@ func (a Assembler) Finalize() ([]byte, []byte) {
|
||||
case RETURN:
|
||||
code = x64.Return(code)
|
||||
|
||||
case SHIFTL:
|
||||
switch operands := x.Data.(type) {
|
||||
case *RegisterNumber:
|
||||
code = x64.ShiftLeftNumber(code, operands.Register, byte(operands.Number)&0b111111)
|
||||
}
|
||||
|
||||
case SHIFTRS:
|
||||
switch operands := x.Data.(type) {
|
||||
case *RegisterNumber:
|
||||
code = x64.ShiftRightSignedNumber(code, operands.Register, byte(operands.Number)&0b111111)
|
||||
}
|
||||
|
||||
case STORE:
|
||||
switch operands := x.Data.(type) {
|
||||
case *MemoryNumber:
|
||||
|
@ -26,6 +26,8 @@ const (
|
||||
POP
|
||||
PUSH
|
||||
RETURN
|
||||
SHIFTL
|
||||
SHIFTRS
|
||||
STORE
|
||||
SUB
|
||||
SYSCALL
|
||||
@ -79,6 +81,10 @@ func (m Mnemonic) String() string {
|
||||
return "push"
|
||||
case RETURN:
|
||||
return "return"
|
||||
case SHIFTL:
|
||||
return "shift l"
|
||||
case SHIFTRS:
|
||||
return "shift rs"
|
||||
case SUB:
|
||||
return "sub"
|
||||
case STORE:
|
||||
|
@ -34,6 +34,12 @@ func (f *Function) ExecuteRegisterNumber(operation token.Token, register cpu.Reg
|
||||
case token.Xor, token.XorAssign:
|
||||
f.RegisterNumber(asm.XOR, register, number)
|
||||
|
||||
case token.Shl, token.ShlAssign:
|
||||
f.RegisterNumber(asm.SHIFTL, register, number)
|
||||
|
||||
case token.Shr, token.ShrAssign:
|
||||
f.RegisterNumber(asm.SHIFTRS, register, number)
|
||||
|
||||
case token.Equal, token.NotEqual, token.Less, token.LessEqual, token.Greater, token.GreaterEqual:
|
||||
f.RegisterNumber(asm.COMPARE, register, number)
|
||||
|
||||
|
Reference in New Issue
Block a user