1
2
3
4
5 package ssa
6
7 import (
8 "math"
9 "testing"
10 )
11
12 func testLimitUnaryOpSigned8(t *testing.T, opName string, op func(l limit, bitsize uint) limit, opImpl func(int8) int8) {
13 sizeLimit := noLimitForBitsize(8)
14 for min := math.MinInt8; min <= math.MaxInt8; min++ {
15 for max := min; max <= math.MaxInt8; max++ {
16 realSmallest, realBiggest := int8(math.MaxInt8), int8(math.MinInt8)
17 for i := min; i <= max; i++ {
18 result := opImpl(int8(i))
19 if result < realSmallest {
20 realSmallest = result
21 }
22 if result > realBiggest {
23 realBiggest = result
24 }
25 }
26
27 l := limit{int64(min), int64(max), 0, math.MaxUint64}
28 l = op(l, 8)
29 l = l.intersect(sizeLimit)
30
31 if l.min != int64(realSmallest) || l.max != int64(realBiggest) {
32 t.Errorf("%s(%d..%d) = %d..%d; want %d..%d", opName, min, max, l.min, l.max, realSmallest, realBiggest)
33 }
34 }
35 }
36 }
37
38 func testLimitUnaryOpUnsigned8(t *testing.T, opName string, op func(l limit, bitsize uint) limit, opImpl func(uint8) uint8) {
39 sizeLimit := noLimitForBitsize(8)
40 for min := 0; min <= math.MaxUint8; min++ {
41 for max := min; max <= math.MaxUint8; max++ {
42 realSmallest, realBiggest := uint8(math.MaxUint8), uint8(0)
43 for i := min; i <= max; i++ {
44 result := opImpl(uint8(i))
45 if result < realSmallest {
46 realSmallest = result
47 }
48 if result > realBiggest {
49 realBiggest = result
50 }
51 }
52
53 l := limit{math.MinInt64, math.MaxInt64, uint64(min), uint64(max)}
54 l = op(l, 8)
55 l = l.intersect(sizeLimit)
56
57 if l.umin != uint64(realSmallest) || l.umax != uint64(realBiggest) {
58 t.Errorf("%s(%d..%d) = %d..%d; want %d..%d", opName, min, max, l.umin, l.umax, realSmallest, realBiggest)
59 }
60 }
61 }
62 }
63
64 func TestLimitNegSigned(t *testing.T) {
65 testLimitUnaryOpSigned8(t, "neg", limit.neg, func(x int8) int8 { return -x })
66 }
67 func TestLimitNegUnsigned(t *testing.T) {
68 testLimitUnaryOpUnsigned8(t, "neg", limit.neg, func(x uint8) uint8 { return -x })
69 }
70
71 func TestLimitComSigned(t *testing.T) {
72 testLimitUnaryOpSigned8(t, "com", limit.com, func(x int8) int8 { return ^x })
73 }
74 func TestLimitComUnsigned(t *testing.T) {
75 testLimitUnaryOpUnsigned8(t, "com", limit.com, func(x uint8) uint8 { return ^x })
76 }
77
View as plain text