]> Cypherpunks.ru repositories - gostls13.git/blob - test/torture.go
cmd/5g, cmd/6g: fix out of registers with array indexing.
[gostls13.git] / test / torture.go
1 // compile
2
3 // Copyright 2012 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
6
7 // Various tests for expressions with high complexity.
8
9 package main
10
11 // Concatenate 16 4-bit integers into a 64-bit number.
12 func concat(s *[16]byte) uint64 {
13         r := (((((((((((((((uint64(s[0])<<4|
14                 uint64(s[1]))<<4|
15                 uint64(s[2]))<<4|
16                 uint64(s[3]))<<4|
17                 uint64(s[4]))<<4|
18                 uint64(s[5]))<<4|
19                 uint64(s[6]))<<4|
20                 uint64(s[7]))<<4|
21                 uint64(s[8]))<<4|
22                 uint64(s[9]))<<4|
23                 uint64(s[10]))<<4|
24                 uint64(s[11]))<<4|
25                 uint64(s[12]))<<4|
26                 uint64(s[13]))<<4|
27                 uint64(s[14]))<<4 |
28                 uint64(s[15]))
29         return r
30 }
31
32 // Compute the determinant of a 4x4-matrix by the sum
33 // over all index permutations.
34 func determinant(m [4][4]float64) float64 {
35         return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
36                 m[0][0]*m[1][1]*m[2][3]*m[3][2] -
37                 m[0][0]*m[1][2]*m[2][1]*m[3][3] +
38                 m[0][0]*m[1][2]*m[2][3]*m[3][1] +
39                 m[0][0]*m[1][3]*m[2][1]*m[3][2] -
40                 m[0][0]*m[1][3]*m[2][2]*m[3][1] -
41                 m[0][1]*m[1][0]*m[2][2]*m[3][3] +
42                 m[0][1]*m[1][0]*m[2][3]*m[3][2] +
43                 m[0][1]*m[1][2]*m[2][0]*m[3][3] -
44                 m[0][1]*m[1][2]*m[2][3]*m[3][0] -
45                 m[0][1]*m[1][3]*m[2][0]*m[3][2] +
46                 m[0][1]*m[1][3]*m[2][2]*m[3][0] +
47                 m[0][2]*m[1][0]*m[2][1]*m[3][3] -
48                 m[0][2]*m[1][0]*m[2][3]*m[3][1] -
49                 m[0][2]*m[1][1]*m[2][0]*m[3][3] +
50                 m[0][2]*m[1][1]*m[2][3]*m[3][0] +
51                 m[0][2]*m[1][3]*m[2][0]*m[3][1] -
52                 m[0][2]*m[1][3]*m[2][1]*m[3][0] -
53                 m[0][3]*m[1][0]*m[2][1]*m[3][2] +
54                 m[0][3]*m[1][0]*m[2][2]*m[3][1] +
55                 m[0][3]*m[1][1]*m[2][0]*m[3][2] -
56                 m[0][3]*m[1][1]*m[2][2]*m[3][0] -
57                 m[0][3]*m[1][2]*m[2][0]*m[3][1] +
58                 m[0][3]*m[1][2]*m[2][1]*m[3][0]
59 }
60
61 // Compute the determinant of a 4x4-matrix by the sum
62 // over all index permutations.
63 func determinantInt(m [4][4]int) int {
64         return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
65                 m[0][0]*m[1][1]*m[2][3]*m[3][2] -
66                 m[0][0]*m[1][2]*m[2][1]*m[3][3] +
67                 m[0][0]*m[1][2]*m[2][3]*m[3][1] +
68                 m[0][0]*m[1][3]*m[2][1]*m[3][2] -
69                 m[0][0]*m[1][3]*m[2][2]*m[3][1] -
70                 m[0][1]*m[1][0]*m[2][2]*m[3][3] +
71                 m[0][1]*m[1][0]*m[2][3]*m[3][2] +
72                 m[0][1]*m[1][2]*m[2][0]*m[3][3] -
73                 m[0][1]*m[1][2]*m[2][3]*m[3][0] -
74                 m[0][1]*m[1][3]*m[2][0]*m[3][2] +
75                 m[0][1]*m[1][3]*m[2][2]*m[3][0] +
76                 m[0][2]*m[1][0]*m[2][1]*m[3][3] -
77                 m[0][2]*m[1][0]*m[2][3]*m[3][1] -
78                 m[0][2]*m[1][1]*m[2][0]*m[3][3] +
79                 m[0][2]*m[1][1]*m[2][3]*m[3][0] +
80                 m[0][2]*m[1][3]*m[2][0]*m[3][1] -
81                 m[0][2]*m[1][3]*m[2][1]*m[3][0] -
82                 m[0][3]*m[1][0]*m[2][1]*m[3][2] +
83                 m[0][3]*m[1][0]*m[2][2]*m[3][1] +
84                 m[0][3]*m[1][1]*m[2][0]*m[3][2] -
85                 m[0][3]*m[1][1]*m[2][2]*m[3][0] -
86                 m[0][3]*m[1][2]*m[2][0]*m[3][1] +
87                 m[0][3]*m[1][2]*m[2][1]*m[3][0]
88 }
89
90 // Compute the determinant of a 4x4-matrix by the sum
91 // over all index permutations.
92 func determinantByte(m [4][4]byte) byte {
93         return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
94                 m[0][0]*m[1][1]*m[2][3]*m[3][2] -
95                 m[0][0]*m[1][2]*m[2][1]*m[3][3] +
96                 m[0][0]*m[1][2]*m[2][3]*m[3][1] +
97                 m[0][0]*m[1][3]*m[2][1]*m[3][2] -
98                 m[0][0]*m[1][3]*m[2][2]*m[3][1] -
99                 m[0][1]*m[1][0]*m[2][2]*m[3][3] +
100                 m[0][1]*m[1][0]*m[2][3]*m[3][2] +
101                 m[0][1]*m[1][2]*m[2][0]*m[3][3] -
102                 m[0][1]*m[1][2]*m[2][3]*m[3][0] -
103                 m[0][1]*m[1][3]*m[2][0]*m[3][2] +
104                 m[0][1]*m[1][3]*m[2][2]*m[3][0] +
105                 m[0][2]*m[1][0]*m[2][1]*m[3][3] -
106                 m[0][2]*m[1][0]*m[2][3]*m[3][1] -
107                 m[0][2]*m[1][1]*m[2][0]*m[3][3] +
108                 m[0][2]*m[1][1]*m[2][3]*m[3][0] +
109                 m[0][2]*m[1][3]*m[2][0]*m[3][1] -
110                 m[0][2]*m[1][3]*m[2][1]*m[3][0] -
111                 m[0][3]*m[1][0]*m[2][1]*m[3][2] +
112                 m[0][3]*m[1][0]*m[2][2]*m[3][1] +
113                 m[0][3]*m[1][1]*m[2][0]*m[3][2] -
114                 m[0][3]*m[1][1]*m[2][2]*m[3][0] -
115                 m[0][3]*m[1][2]*m[2][0]*m[3][1] +
116                 m[0][3]*m[1][2]*m[2][1]*m[3][0]
117 }
118
119 type A []A
120
121 // A sequence of constant indexings.
122 func IndexChain1(s A) A {
123         return s[0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]
124 }
125
126 // A sequence of non-constant indexings.
127 func IndexChain2(s A, i int) A {
128         return s[i][i][i][i][i][i][i][i][i][i][i][i][i][i][i][i]
129 }
130
131 // Another sequence of indexings.
132 func IndexChain3(s []int) int {
133         return s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[0]]]]]]]]]]]]]]]]]]]]]
134 }
135
136 // A right-leaning tree of byte multiplications.
137 func righttree(a, b, c, d uint8) uint8 {
138         return a * (b * (c * (d *
139                 (a * (b * (c * (d *
140                         (a * (b * (c * (d *
141                                 (a * (b * (c * (d *
142                                         (a * (b * (c * (d *
143                                                 a * (b * (c * d)))))))))))))))))))))
144
145 }
146
147 // A left-leaning tree of byte multiplications.
148 func lefttree(a, b, c, d uint8) uint8 {
149         return ((((((((((((((((((a * b) * c) * d *
150                 a) * b) * c) * d *
151                 a) * b) * c) * d *
152                 a) * b) * c) * d *
153                 a) * b) * c) * d *
154                 a) * b) * c) * d)
155 }
156
157 type T struct {
158         Next I
159 }
160
161 type I interface{}
162
163 // A chains of type assertions.
164 func ChainT(t *T) *T {
165         return t.
166                 Next.(*T).
167                 Next.(*T).
168                 Next.(*T).
169                 Next.(*T).
170                 Next.(*T).
171                 Next.(*T).
172                 Next.(*T).
173                 Next.(*T).
174                 Next.(*T).
175                 Next.(*T).
176                 Next.(*T).
177                 Next.(*T).
178                 Next.(*T).
179                 Next.(*T).
180                 Next.(*T).
181                 Next.(*T).
182                 Next.(*T).
183                 Next.(*T).
184                 Next.(*T).
185                 Next.(*T)
186 }
187
188 type U struct {
189         Children []J
190 }
191
192 func (u *U) Child(n int) J { return u.Children[n] }
193
194 type J interface {
195         Child(n int) J
196 }
197
198 func ChainUAssert(u *U) *U {
199         return u.Child(0).(*U).
200                 Child(0).(*U).
201                 Child(0).(*U).
202                 Child(0).(*U).
203                 Child(0).(*U).
204                 Child(0).(*U).
205                 Child(0).(*U).
206                 Child(0).(*U).
207                 Child(0).(*U).
208                 Child(0).(*U).
209                 Child(0).(*U).
210                 Child(0).(*U).
211                 Child(0).(*U).
212                 Child(0).(*U).
213                 Child(0).(*U).
214                 Child(0).(*U).
215                 Child(0).(*U).
216                 Child(0).(*U).
217                 Child(0).(*U).
218                 Child(0).(*U).
219                 Child(0).(*U).
220                 Child(0).(*U)
221 }
222
223 func ChainUNoAssert(u *U) *U {
224         return u.Child(0).
225                 Child(0).
226                 Child(0).
227                 Child(0).
228                 Child(0).
229                 Child(0).
230                 Child(0).
231                 Child(0).
232                 Child(0).
233                 Child(0).
234                 Child(0).
235                 Child(0).
236                 Child(0).
237                 Child(0).
238                 Child(0).
239                 Child(0).
240                 Child(0).
241                 Child(0).
242                 Child(0).
243                 Child(0).
244                 Child(0).
245                 Child(0).(*U)
246 }
247
248 // Type assertions and slice indexing. See issue 4207.
249 func ChainAssertIndex(u *U) J {
250         return u.
251                 Children[0].(*U).
252                 Children[0].(*U).
253                 Children[0].(*U).
254                 Children[0].(*U).
255                 Children[0].(*U).
256                 Children[0].(*U).
257                 Children[0].(*U).
258                 Children[0].(*U).
259                 Children[0].(*U).
260                 Children[0].(*U).
261                 Children[0].(*U).
262                 Children[0].(*U).
263                 Children[0].(*U).
264                 Children[0]
265 }
266
267 type UArr struct {
268         Children [2]J
269 }
270
271 func (u *UArr) Child(n int) J { return u.Children[n] }
272
273 func ChainAssertArrayIndex(u *UArr) J {
274         return u.
275                 Children[0].(*UArr).
276                 Children[0].(*UArr).
277                 Children[0].(*UArr).
278                 Children[0].(*UArr).
279                 Children[0].(*UArr).
280                 Children[0].(*UArr).
281                 Children[0].(*UArr).
282                 // Children[0].(*UArr).
283                 // Children[0].(*UArr).
284                 // Children[0].(*UArr).
285                 // Children[0].(*UArr).
286                 // Children[0].(*UArr).
287                 // Children[0].(*UArr).
288                 Children[0]
289 }
290
291 type UArrPtr struct {
292         Children *[2]J
293 }
294
295 func (u *UArrPtr) Child(n int) J { return u.Children[n] }
296
297 func ChainAssertArrayptrIndex(u *UArrPtr) J {
298         // TODO: don't crash on longer chains.
299         return u.
300                 Children[0].(*UArrPtr).
301                 Children[0].(*UArrPtr).
302                 Children[0].(*UArrPtr).
303                 Children[0].(*UArrPtr).
304                 // Children[0].(*UArrPtr).
305                 // Children[0].(*UArrPtr).
306                 // Children[0].(*UArrPtr).
307                 // Children[0].(*UArrPtr).
308                 // Children[0].(*UArrPtr).
309                 // Children[0].(*UArrPtr).
310                 // Children[0].(*UArrPtr).
311                 // Children[0].(*UArrPtr).
312                 // Children[0].(*UArrPtr).
313                 Children[0]
314 }
315
316 // Chains of divisions. See issue 4201.
317
318 func ChainDiv(a, b int) int {
319         return a / b / a / b / a / b / a / b /
320                 a / b / a / b / a / b / a / b /
321                 a / b / a / b / a / b / a / b
322 }
323
324 func ChainDivRight(a, b int) int {
325         return a / (b / (a / (b /
326                 (a / (b / (a / (b /
327                         (a / (b / (a / (b /
328                                 (a / (b / (a / (b /
329                                         (a / (b / (a / b))))))))))))))))))
330 }
331
332 func ChainDivConst(a int) int {
333         return a / 17 / 17 / 17 /
334                 17 / 17 / 17 / 17 /
335                 17 / 17 / 17 / 17
336 }