1
2
3
4
5
6
7 package spec
8
9 import "math/bits"
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 func ScaleSaturated[E Ints | Uints, W Width](x Vec[E, W], scale Vec[int8, W]) (z Vec[E, W]) {
30 k := elemBits[E]() / 8
31 z = makeVec[E, W]()
32 for i := range z {
33 z[i] = scaleSaturated(x[i], scale[i*k])
34 }
35 return z
36 }
37
38
39
40
41
42
43
44
45
46
47 func ShiftAllRight[E Ints | Uints, W Width](x Vec[E, W], shift uint64) (z Vec[E, W]) {
48 return map1[E, W, E, W](x, func(v E) E {
49 return v >> shift
50 })
51 }
52
53
54
55
56
57 func ShiftAllLeft[E Ints | Uints, W Width](x Vec[E, W], shift uint64) (z Vec[E, W]) {
58 return map1[E, W, E, W](x, func(v E) E {
59 return v << shift
60 })
61 }
62
63
64
65
66
67
68
69
70
71
72
73
74 func ShiftRight[E Ints | Uints, W Width, yE Uints](x Vec[E, W], shift Vec[yE, W]) (z Vec[E, W]) {
75 z = makeVec[E, W]()
76 for i := range z {
77 z[i] = x[i] >> shift[i]
78 }
79 return z
80 }
81
82
83
84
85
86
87
88 func ShiftLeft[E Ints | Uints, W Width, yE Uints](x Vec[E, W], shift Vec[yE, W]) (z Vec[E, W]) {
89 z = makeVec[E, W]()
90 for i := range z {
91 z[i] = x[i] << shift[i]
92 }
93 return z
94 }
95
96
97
98
99 func RotateAllLeft[E Uints, W Width](x Vec[E, W], shift uint64) (z Vec[E, W]) {
100
101 k := int(shift % uint64(elemBits[E]()))
102 return map1[E, W, E, W](x, func(x E) E {
103 switch any(x).(type) {
104 case int8, uint8:
105 return E(bits.RotateLeft8(uint8(x), k))
106 case int16, uint16:
107 return E(bits.RotateLeft16(uint16(x), k))
108 case int32, uint32:
109 return E(bits.RotateLeft32(uint32(x), k))
110 case int64, uint64:
111 return E(bits.RotateLeft64(uint64(x), k))
112 }
113 panic("unreachable")
114 })
115 }
116
117
118
119
120 func RotateLeft[E Uints, W Width](x, shift Vec[E, W]) (z Vec[E, W]) {
121 return map2[E, W, E, W](x, shift, func(x, shift E) E {
122
123 k := int(shift % E(elemBits[E]()))
124 switch any(x).(type) {
125 case int8, uint8:
126 return E(bits.RotateLeft8(uint8(x), k))
127 case int16, uint16:
128 return E(bits.RotateLeft16(uint16(x), k))
129 case int32, uint32:
130 return E(bits.RotateLeft32(uint32(x), k))
131 case int64, uint64:
132 return E(bits.RotateLeft64(uint64(x), k))
133 }
134 panic("unreachable")
135 })
136 }
137
138
139
140
141 func RotateAllRight[E Uints, W Width](x Vec[E, W], shift uint64) (z Vec[E, W]) {
142
143 k := int(shift % uint64(elemBits[E]()))
144 return map1[E, W, E, W](x, func(x E) E {
145 switch any(x).(type) {
146 case int8, uint8:
147 return E(bits.RotateLeft8(uint8(x), -k))
148 case int16, uint16:
149 return E(bits.RotateLeft16(uint16(x), -k))
150 case int32, uint32:
151 return E(bits.RotateLeft32(uint32(x), -k))
152 case int64, uint64:
153 return E(bits.RotateLeft64(uint64(x), -k))
154 }
155 panic("unreachable")
156 })
157 }
158
159
160
161
162 func RotateRight[E Uints, W Width](x, shift Vec[E, W]) (z Vec[E, W]) {
163 return map2[E, W, E, W](x, shift, func(x, shift E) E {
164
165 k := int(shift % E(elemBits[E]()))
166 switch any(x).(type) {
167 case int8, uint8:
168 return E(bits.RotateLeft8(uint8(x), -k))
169 case int16, uint16:
170 return E(bits.RotateLeft16(uint16(x), -k))
171 case int32, uint32:
172 return E(bits.RotateLeft32(uint32(x), -k))
173 case int64, uint64:
174 return E(bits.RotateLeft64(uint64(x), -k))
175 }
176 panic("unreachable")
177 })
178 }
179
View as plain text