blob: bcbc18b3b2021eb655d0897f167cee3c2c846435 [file] [log] [blame]
// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"bytes"
"fmt"
"sort"
)
const simdGenericOpsTmpl = `
package main
func simdGenericOps() []opData {
return []opData{
{{- range .Ops }}
{name: "{{.OpName}}", argLength: {{.OpInLen}}, commutative: {{.Comm}}},
{{- end }}
{{- range .OpsImm }}
{name: "{{.OpName}}", argLength: {{.OpInLen}}, commutative: {{.Comm}}, aux: "UInt8"},
{{- end }}
}
}
`
// writeSIMDGenericOps generates the generic ops and writes it to simdAMD64ops.go
// within the specified directory.
func writeSIMDGenericOps(ops []Operation) *bytes.Buffer {
t := templateOf(simdGenericOpsTmpl, "simdgenericOps")
buffer := new(bytes.Buffer)
buffer.WriteString(generatedHeader)
type genericOpsData struct {
OpName string
OpInLen int
Comm bool
}
type opData struct {
Ops []genericOpsData
OpsImm []genericOpsData
}
var opsData opData
for _, op := range ops {
if op.NoGenericOps != nil && *op.NoGenericOps == "true" {
continue
}
if op.SkipMaskedMethod() {
continue
}
_, _, _, immType, gOp := op.shape()
gOpData := genericOpsData{gOp.GenericName(), len(gOp.In), op.Commutative}
if immType == VarImm || immType == ConstVarImm {
opsData.OpsImm = append(opsData.OpsImm, gOpData)
} else {
opsData.Ops = append(opsData.Ops, gOpData)
}
}
sort.Slice(opsData.Ops, func(i, j int) bool {
return compareNatural(opsData.Ops[i].OpName, opsData.Ops[j].OpName) < 0
})
sort.Slice(opsData.OpsImm, func(i, j int) bool {
return compareNatural(opsData.OpsImm[i].OpName, opsData.OpsImm[j].OpName) < 0
})
err := t.Execute(buffer, opsData)
if err != nil {
panic(fmt.Errorf("failed to execute template: %w", err))
}
return buffer
}