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 {
|
func (c *component) sub(suffix string, offset int, t types.Type) *component {
|
||||||
var s *component
|
s := *c
|
||||||
*s = *c
|
|
||||||
s.name += suffix
|
s.name += suffix
|
||||||
s.offset += offset
|
s.offset += offset
|
||||||
s.typ = t
|
s.typ = t
|
||||||
return s
|
return &s
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(mbm): gotypes.Component handling for structs
|
// TODO(mbm): gotypes.Component handling for structs
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ func (m Mem) Asm() string {
|
|||||||
type Imm uint64
|
type Imm uint64
|
||||||
|
|
||||||
func (i Imm) Asm() string {
|
func (i Imm) Asm() string {
|
||||||
return fmt.Sprintf("%#x", i)
|
return fmt.Sprintf("$%#x", i)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rel is an offset relative to the instruction pointer.
|
// Rel is an offset relative to the instruction pointer.
|
||||||
|
|||||||
Reference in New Issue
Block a user