examples: add sum example (its not pretty)
This commit is contained in:
27
examples/sum/asm.go
Normal file
27
examples/sum/asm.go
Normal file
@@ -0,0 +1,27 @@
|
||||
// +build ignore
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
. "github.com/mmcloughlin/avo/build"
|
||||
"github.com/mmcloughlin/avo/operand"
|
||||
)
|
||||
|
||||
func main() {
|
||||
TEXT("Sum", "func(xs []uint64) uint64")
|
||||
ptr := Load(Param("xs").Base(), GP64v())
|
||||
n := Load(Param("xs").Len(), GP64v())
|
||||
s := GP64v()
|
||||
XORQ(s, s)
|
||||
LABEL("loop")
|
||||
CMPQ(n, operand.Imm(0))
|
||||
JE(operand.LabelRef("done"))
|
||||
ADDQ(operand.Mem{Base: ptr}, s)
|
||||
ADDQ(operand.Imm(8), ptr)
|
||||
DECQ(n)
|
||||
JMP(operand.LabelRef("loop"))
|
||||
LABEL("done")
|
||||
Store(s, ReturnIndex(0))
|
||||
RET()
|
||||
Generate()
|
||||
}
|
||||
3
examples/sum/stub.go
Normal file
3
examples/sum/stub.go
Normal file
@@ -0,0 +1,3 @@
|
||||
package sum
|
||||
|
||||
func Sum(xs []uint64) uint64
|
||||
18
examples/sum/sum.s
Normal file
18
examples/sum/sum.s
Normal file
@@ -0,0 +1,18 @@
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
// func Sum(xs []uint64) uint64
|
||||
TEXT ·Sum(SB),0,$0-32
|
||||
MOVQ xs_base(FP), DX
|
||||
MOVQ xs_len+8(FP), CX
|
||||
XORQ AX, AX
|
||||
loop:
|
||||
CMPQ CX, $0x0
|
||||
JE done
|
||||
ADDQ (DX), AX
|
||||
ADDQ $0x8, DX
|
||||
DECQ CX
|
||||
JMP loop
|
||||
done:
|
||||
MOVQ AX, ret+24(FP)
|
||||
RET
|
||||
20
examples/sum/sum_test.go
Normal file
20
examples/sum/sum_test.go
Normal file
@@ -0,0 +1,20 @@
|
||||
package sum
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"testing/quick"
|
||||
)
|
||||
|
||||
//go:generate go run asm.go -out sum.s -stubs stub.go
|
||||
|
||||
func expect(xs []uint64) uint64 {
|
||||
var s uint64
|
||||
for _, x := range xs {
|
||||
s += x
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func TestSum(t *testing.T) {
|
||||
quick.CheckEqual(Sum, expect, nil)
|
||||
}
|
||||
@@ -126,12 +126,11 @@ func (c *component) Index(i int) Component {
|
||||
}
|
||||
|
||||
func (c *component) sub(suffix string, offset int, t types.Type) *component {
|
||||
var s *component
|
||||
*s = *c
|
||||
s := *c
|
||||
s.name += suffix
|
||||
s.offset += offset
|
||||
s.typ = t
|
||||
return s
|
||||
return &s
|
||||
}
|
||||
|
||||
// TODO(mbm): gotypes.Component handling for structs
|
||||
|
||||
@@ -65,7 +65,7 @@ func (m Mem) Asm() string {
|
||||
type Imm uint64
|
||||
|
||||
func (i Imm) Asm() string {
|
||||
return fmt.Sprintf("%#x", i)
|
||||
return fmt.Sprintf("$%#x", i)
|
||||
}
|
||||
|
||||
// Rel is an offset relative to the instruction pointer.
|
||||
|
||||
Reference in New Issue
Block a user