blob: d6d44dbf57e5cb943c8857b3bb611151f4974d89 [file]
// Copyright 2026 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 (
"strings"
"testing"
"simd/archsimd/_gen/simdgen/types"
)
func TestResolveSVEImmRanges(t *testing.T) {
saved := *FlagArch
*FlagArch = "sve"
defer func() { *FlagArch = saved }()
const desc = "test: in the range 0 to number of bits per element minus 1"
sveImmRanges[desc] = func(esize int) (int, int) { return 0, esize - 1 }
defer delete(sveImmRanges, desc)
const descFrom1 = "test: in the range 1 to number of bits per element"
sveImmRanges[descFrom1] = func(esize int) (int, int) { return 1, esize }
defer delete(sveImmRanges, descFrom1)
op := func(desc string, noTypes bool) Operation {
var o Operation
o.Go, o.Asm = "shift", "ZTEST"
if noTypes {
o.NoTypes = new("true")
}
o.In = []types.Operand{
{Class: "immediate", ImmDesc: new(desc)},
{Class: "vreg", ElemBits: new(16)},
}
o.Out = []types.Operand{{Class: "vreg", ElemBits: new(16)}}
return o
}
ops := []Operation{op(desc, false), op(descFrom1, true)}
if err := resolveSVEImmRanges(ops); err != nil {
t.Fatal(err)
}
for i, want := range [][2]int{{0, 15}, {1, 16}} {
in := ops[i].In[0]
if in.ImmMin == nil || in.ImmMax == nil || *in.ImmMin != want[0] || *in.ImmMax != want[1] {
t.Errorf("op %d: range %v to %v, want %d to %d", i, in.ImmMin, in.ImmMax, want[0], want[1])
}
}
for _, c := range []struct {
op Operation
want string
}{
{op("test: no entry", true), "no entry in sveImmRanges"},
{op(descFrom1, false), "does not start at 0"},
} {
err := resolveSVEImmRanges([]Operation{c.op})
if err == nil || !strings.Contains(err.Error(), c.want) {
t.Errorf("resolveSVEImmRanges(%q) = %v, want an error containing %q", *c.op.In[0].ImmDesc, err, c.want)
}
}
}