go-compute/assembler/builder_test.go

83 lines
2 KiB
Go

package assembler
import (
"bytes"
"git.gammaspectra.live/WeebDataHoarder/compute-go/amd64"
"testing"
"git.gammaspectra.live/WeebDataHoarder/compute-go/assembler/obj"
"git.gammaspectra.live/WeebDataHoarder/compute-go/assembler/obj/x86"
)
func noop(builder *Builder) *obj.Prog {
prog := builder.NewProg()
prog.As = x86.ANOPL
prog.From.Type = obj.TYPE_REG
prog.From.Reg = x86.REG_AX
return prog
}
func addImmediateByte(builder *Builder, in int32) *obj.Prog {
prog := builder.NewProg()
prog.As = x86.AADDB
prog.To.Type = obj.TYPE_REG
prog.To.Reg = x86.REG_AL
prog.From.Type = obj.TYPE_CONST
prog.From.Offset = int64(in)
return prog
}
func movImmediateByte(builder *Builder, reg int16, in int32) *obj.Prog {
prog := builder.NewProg()
prog.As = x86.AMOVB
prog.To.Type = obj.TYPE_REG
prog.To.Reg = reg
prog.From.Type = obj.TYPE_CONST
prog.From.Offset = int64(in)
return prog
}
func movMemByte(builder *Builder, intoReg, memReg int16) *obj.Prog {
prog := builder.NewProg()
prog.As = x86.AMOVB
prog.To.Type = obj.TYPE_REG
prog.To.Reg = intoReg
prog.From.Type = obj.TYPE_MEM
prog.From.Reg = memReg
return prog
}
func TestBasic(t *testing.T) {
b, _ := NewBuilder(amd64.ABIDefinition)
b.AddInstruction(noop(b))
b.AddInstruction(movImmediateByte(b, x86.REG_AL, 16))
b.AddInstruction(addImmediateByte(b, 16))
got, errs := b.Function("", nil, 0, obj.NOFRAME|obj.NOSPLIT, nil)
if errs != nil {
for _, err := range errs {
t.Error(err)
}
}
want := []byte{0x0f, 0x1f, 0xc0, 0xb0, 0x10, 0x04, 0x10}
if !bytes.Equal(got, want) {
t.Errorf("assembly = %v, want %v", got, want)
}
}
func TestMove(t *testing.T) {
b, _ := NewBuilder(amd64.ABIDefinition)
b.AddInstruction(noop(b))
b.AddInstruction(movMemByte(b, x86.REG_AL, x86.REG_BX))
got, errs := b.Function("", nil, 0, obj.NOFRAME|obj.NOSPLIT, nil)
if errs != nil {
for _, err := range errs {
t.Error(err)
}
}
want := []byte{0x0F, 0x1F, 0xC0, 0x8A, 0x03}
if !bytes.Equal(got, want) {
t.Errorf("assembly = %v (%X), want %v", got, got, want)
}
}