1
2
3
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