Source file src/simd/archsimd/_gen/simdgen/sve_imm_test.go

     1  // Copyright 2026 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"strings"
     9  	"testing"
    10  
    11  	"simd/archsimd/_gen/simdgen/types"
    12  )
    13  
    14  func TestResolveSVEImmRanges(t *testing.T) {
    15  	saved := *FlagArch
    16  	*FlagArch = "sve"
    17  	defer func() { *FlagArch = saved }()
    18  	const desc = "test: in the range 0 to number of bits per element minus 1"
    19  	sveImmRanges[desc] = func(esize int) (int, int) { return 0, esize - 1 }
    20  	defer delete(sveImmRanges, desc)
    21  	const descFrom1 = "test: in the range 1 to number of bits per element"
    22  	sveImmRanges[descFrom1] = func(esize int) (int, int) { return 1, esize }
    23  	defer delete(sveImmRanges, descFrom1)
    24  
    25  	op := func(desc string, noTypes bool) Operation {
    26  		var o Operation
    27  		o.Go, o.Asm = "shift", "ZTEST"
    28  		if noTypes {
    29  			o.NoTypes = new("true")
    30  		}
    31  		o.In = []types.Operand{
    32  			{Class: "immediate", ImmDesc: new(desc)},
    33  			{Class: "vreg", ElemBits: new(16)},
    34  		}
    35  		o.Out = []types.Operand{{Class: "vreg", ElemBits: new(16)}}
    36  		return o
    37  	}
    38  
    39  	ops := []Operation{op(desc, false), op(descFrom1, true)}
    40  	if err := resolveSVEImmRanges(ops); err != nil {
    41  		t.Fatal(err)
    42  	}
    43  	for i, want := range [][2]int{{0, 15}, {1, 16}} {
    44  		in := ops[i].In[0]
    45  		if in.ImmMin == nil || in.ImmMax == nil || *in.ImmMin != want[0] || *in.ImmMax != want[1] {
    46  			t.Errorf("op %d: range %v to %v, want %d to %d", i, in.ImmMin, in.ImmMax, want[0], want[1])
    47  		}
    48  	}
    49  
    50  	for _, c := range []struct {
    51  		op   Operation
    52  		want string
    53  	}{
    54  		{op("test: no entry", true), "no entry in sveImmRanges"},
    55  		{op(descFrom1, false), "does not start at 0"},
    56  	} {
    57  		err := resolveSVEImmRanges([]Operation{c.op})
    58  		if err == nil || !strings.Contains(err.Error(), c.want) {
    59  			t.Errorf("resolveSVEImmRanges(%q) = %v, want an error containing %q", *c.op.In[0].ImmDesc, err, c.want)
    60  		}
    61  	}
    62  }
    63  

View as plain text