blob: 81d5e1268d9aa38834561d201ded977bb186fc4d [file] [log] [blame]
// Copyright 2021 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// +build ignore
package main
// gen.go generates data.go.
//
// Invoke it via "go generate".
import (
"bytes"
"fmt"
"go/format"
"io/ioutil"
"os"
"strings"
ani "github.com/google/wuffs/lib/armneonintrinsics"
)
func main() {
if err := main1(); err != nil {
os.Stderr.WriteString(err.Error() + "\n")
os.Exit(1)
}
}
func main1() error {
out.WriteString(header)
for i, aniType := range [...]ani.Type{
ani.TypeUint8x8,
ani.TypeUint16x4,
ani.TypeUint32x2,
ani.TypeUint64x1,
ani.TypeUint8x16,
ani.TypeUint16x8,
ani.TypeUint32x4,
ani.TypeUint64x2,
} {
if i != 0 {
out.WriteByte('\n')
}
if err := do(aniType); err != nil {
return err
}
}
out.WriteString(footer)
formatted, err := format.Source(out.Bytes())
if err != nil {
return err
}
return ioutil.WriteFile("data.go", formatted, 0644)
}
var (
out bytes.Buffer
)
func do(aniType ani.Type) error {
wtnRecv := wuffsTypeNames[aniType]
outer:
for f := ani.FirstFunction(); f.IsValid(); f = f.NextFunction() {
if f.FirstArgument().Type() != aniType {
continue
}
fName := f.Name()
if strings.HasPrefix(fName, "vreinterpret_") ||
strings.HasPrefix(fName, "vreinterpretq_") {
continue
}
for arg := f.FirstArgument(); arg.IsValid(); arg = arg.NextArgument() {
if wuffsTypeNames[arg.Type()] == "" {
fmt.Fprintf(&out, "// %s.%s(etc)\n", wtnRecv, fName)
continue outer
}
}
laney := strings.Contains(fName, "_lane")
fmt.Fprintf(&out, "\"%s.%s(", wtnRecv, fName)
prevArgType := ani.Type(0)
for i, arg := 0, f.FirstArgument(); arg.IsValid(); i, arg = i+1, arg.NextArgument() {
wtnArg := wuffsTypeNames[arg.Type()]
refinement := ""
if laney && (wtnArg[0] != 'a') {
refinement = refinements[prevArgType]
}
prevArgType = arg.Type()
if i == 0 {
continue
} else if i > 1 {
out.WriteString(", ")
}
fmt.Fprintf(&out, "%s: %v%s",
stripUnderscores(arg.Name()),
wuffsTypeNames[arg.Type()],
refinement)
}
out.WriteString(") ")
out.WriteString(wuffsTypeNames[f.ReturnType()])
out.WriteString("\",\n")
}
return nil
}
func stripUnderscores(s string) string {
for (s != "") && (s[0] == '_') {
s = s[1:]
}
return s
}
var refinements = [256]string{
ani.TypeUint8x8: "[..= 7]",
ani.TypeUint16x4: "[..= 3]",
ani.TypeUint32x2: "[..= 1]",
ani.TypeUint64x1: "[..= 0]",
ani.TypeUint8x16: "[..= 15]",
ani.TypeUint16x8: "[..= 7]",
ani.TypeUint32x4: "[..= 3]",
ani.TypeUint64x2: "[..= 1]",
}
var wuffsTypeNames = [256]string{
ani.TypeInt8: "u8",
ani.TypeInt16: "u16",
ani.TypeInt32: "u32",
ani.TypeInt64: "u64",
ani.TypeUint8: "u8",
ani.TypeUint16: "u16",
ani.TypeUint32: "u32",
ani.TypeUint64: "u64",
ani.TypeConstInt8: "u8",
ani.TypeConstInt16: "u16",
ani.TypeConstInt32: "u32",
ani.TypeConstInt64: "u64",
ani.TypeConstUint8: "u8",
ani.TypeConstUint16: "u16",
ani.TypeConstUint32: "u32",
ani.TypeConstUint64: "u64",
ani.TypeUint8x8: "arm_neon_u8x8",
ani.TypeUint16x4: "arm_neon_u16x4",
ani.TypeUint32x2: "arm_neon_u32x2",
ani.TypeUint64x1: "arm_neon_u64x1",
ani.TypeUint8x16: "arm_neon_u8x16",
ani.TypeUint16x8: "arm_neon_u16x8",
ani.TypeUint32x4: "arm_neon_u32x4",
ani.TypeUint64x2: "arm_neon_u64x2",
}
const header = `// Code generated by running "go generate". DO NOT EDIT.
// Copyright 2021 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package builtin
var funcsARMNeon = [...]string {
`
const footer = "}\n"