The Context.Label method and LABEL global function did not agree. Also breaks the convention I'd like to set that capitalized functions must agree with existing Go assembly syntax. To help avoid a conflict with `avo.Label`, attributes were moved to their own package. Fixes #35
89 lines
1.7 KiB
Go
89 lines
1.7 KiB
Go
// +build ignore
|
|
|
|
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"flag"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"math/rand"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
|
|
"github.com/mmcloughlin/avo/attr"
|
|
)
|
|
|
|
var (
|
|
output = flag.String("output", "", "path to output file (default stdout)")
|
|
seed = flag.Int64("seed", 0, "random seed")
|
|
num = flag.Int("num", 32, "number of attributes to generate")
|
|
)
|
|
|
|
func GenerateAttributes(n int) []attr.Attribute {
|
|
as := make([]attr.Attribute, 0, n)
|
|
|
|
// Include each bitlevel.
|
|
for i := 0; i < 16 && i < n; i++ {
|
|
a := attr.Attribute(1 << uint(i))
|
|
as = append(as, a)
|
|
}
|
|
|
|
// Add randomly generated attributes.
|
|
for len(as) < n {
|
|
a := attr.Attribute(rand.Uint32())
|
|
as = append(as, a)
|
|
}
|
|
|
|
return as
|
|
}
|
|
|
|
func PrintAttributesTest(w io.Writer, as []attr.Attribute) {
|
|
_, self, _, _ := runtime.Caller(0)
|
|
fmt.Fprintf(w, "// Code generated by %s. DO NOT EDIT.\n\n", filepath.Base(self))
|
|
fmt.Fprintf(w, "#include \"textflag.h\"\n\n")
|
|
fmt.Fprintf(w, "TEXT ·AttrTest(SB), $0-1\n")
|
|
fmt.Fprintf(w, "\tMOVB $0, ret+0(FP)\n")
|
|
|
|
for i, a := range as {
|
|
fmt.Fprintf(w, "\tMOVW $(%d), R8\n", a)
|
|
fmt.Fprintf(w, "\tMOVW $(%s), R9\n", a.Asm())
|
|
fmt.Fprintf(w, "\tCMPW R8, R9\n")
|
|
|
|
cont := fmt.Sprintf("cont%d", i)
|
|
fmt.Fprintf(w, "\tJE %s\n", cont)
|
|
fmt.Fprintf(w, "\tRET\n")
|
|
|
|
fmt.Fprintf(w, "%s:\n", cont)
|
|
}
|
|
|
|
fmt.Fprintf(w, "\tMOVB $1, ret+0(FP)\n")
|
|
fmt.Fprintf(w, "\tRET\n")
|
|
}
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
|
|
w := os.Stdout
|
|
if *output != "" {
|
|
f, err := os.Create(*output)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer f.Close()
|
|
w = f
|
|
}
|
|
|
|
rand.Seed(*seed)
|
|
as := GenerateAttributes(*num)
|
|
|
|
buf := bytes.NewBuffer(nil)
|
|
PrintAttributesTest(buf, as)
|
|
|
|
if _, err := w.Write(buf.Bytes()); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|