2018-12-31 20:25:29 -08:00
|
|
|
# add
|
|
|
|
|
|
|
|
|
|
Add two numbers with `avo`.
|
|
|
|
|
|
|
|
|
|
The [code generator](asm.go) is as follows:
|
|
|
|
|
|
|
|
|
|
[embedmd]:# (asm.go)
|
|
|
|
|
```go
|
|
|
|
|
// +build ignore
|
|
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
2019-04-13 22:53:13 -05:00
|
|
|
import . "github.com/mmcloughlin/avo/build"
|
2018-12-31 20:25:29 -08:00
|
|
|
|
|
|
|
|
func main() {
|
2019-01-06 20:16:26 -08:00
|
|
|
TEXT("Add", NOSPLIT, "func(x, y uint64) uint64")
|
2018-12-31 20:25:29 -08:00
|
|
|
Doc("Add adds x and y.")
|
2019-01-04 18:23:44 -08:00
|
|
|
x := Load(Param("x"), GP64())
|
|
|
|
|
y := Load(Param("y"), GP64())
|
2018-12-31 20:25:29 -08:00
|
|
|
ADDQ(x, y)
|
|
|
|
|
Store(y, ReturnIndex(0))
|
|
|
|
|
RET()
|
|
|
|
|
Generate()
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
We use a [`go:generate`](https://blog.golang.org/generate) line to produce the assembly and Go stub files together.
|
|
|
|
|
|
|
|
|
|
[embedmd]:# (add_test.go go /.*go:generate.*/)
|
|
|
|
|
```go
|
|
|
|
|
//go:generate go run asm.go -out add.s -stubs stub.go
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
This produces [`add.s`](add.s) as follows:
|
|
|
|
|
|
|
|
|
|
[embedmd]:# (add.s)
|
|
|
|
|
```s
|
|
|
|
|
// Code generated by command: go run asm.go -out add.s -stubs stub.go. DO NOT EDIT.
|
|
|
|
|
|
2019-01-06 20:16:26 -08:00
|
|
|
#include "textflag.h"
|
|
|
|
|
|
2018-12-31 20:25:29 -08:00
|
|
|
// func Add(x uint64, y uint64) uint64
|
2019-01-06 20:16:26 -08:00
|
|
|
TEXT ·Add(SB), NOSPLIT, $0-24
|
2019-01-13 11:59:14 -08:00
|
|
|
MOVQ x+0(FP), AX
|
2019-01-10 21:21:41 -08:00
|
|
|
MOVQ y+8(FP), CX
|
|
|
|
|
ADDQ AX, CX
|
|
|
|
|
MOVQ CX, ret+16(FP)
|
2018-12-31 20:25:29 -08:00
|
|
|
RET
|
|
|
|
|
```
|