| // 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" |
| "simd/archsimd/_gen/sgutil" |
| ) |
| |
| // writeSIMDGenericOps generates the generic ops for the current architecture, |
| // merges them with existing ops from other architectures, and returns the |
| // result as a buffer ready for writing. |
| func writeSIMDGenericOps(buffer *bytes.Buffer, ops []Operation, genericOpsFilePath string) { |
| // Generate fresh ops for the current target, keyed by GoTypeArch (see its doc |
| // in arch.go for why the shared-file merge must not key on Arch). |
| currentArch := CurrentArch().GoTypeArch |
| var newOps []sgutil.GenericOpsData |
| for _, op := range ops { |
| if op.NoGenericOps != nil && *op.NoGenericOps == "true" { |
| continue |
| } |
| if op.SkipMaskedMethod() { |
| continue |
| } |
| _, _, _, immType, gOp, _ := op.shape() |
| |
| newOps = append(newOps, sgutil.GenericOpsData{ |
| OpName: gOp.GenericName(), |
| // An implicit-all-true predicate is a machine-op input only; the |
| // generic op is unpredicated, so exclude it from the arg count. |
| OpInLen: len(gOp.In) - gOp.implicitPredCount(), |
| Comm: op.Commutative, |
| HasAux: immType == VarImm || immType == VarImmLim || immType == ConstVarImm, |
| Archs: []string{currentArch}, |
| }) |
| } |
| |
| buf := sgutil.MergeSIMDGenericOps(newOps, genericOpsFilePath, currentArch) |
| buffer.Write(buf.Bytes()) |
| } |