2025-08-13 15:30:27 -04:00
|
|
|
// 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
|
|
|
|
|
}
|
2025-11-17 15:31:36 -05:00
|
|
|
if op.SkipMaskedMethod() {
|
|
|
|
|
continue
|
|
|
|
|
}
|
2025-08-13 15:30:27 -04:00
|
|
|
_, _, _, 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
|
|
|
|
|
}
|