// 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) } } }