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 9package main 10 11// Concatenate 16 4-bit integers into a 64-bit number. 12func 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. 34func 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. 63func 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. 92func 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 119type A []A 120 121// A sequence of constant indexings. 122func 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. 127func 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. 132func 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. 137func 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. 148func 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 157type T struct { 158 Next I 159} 160 161type I interface{} 162 163// A chains of type assertions. 164func 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 188type U struct { 189 Children []J 190} 191 192func (u *U) Child(n int) J { return u.Children[n] } 193 194type J interface { 195 Child(n int) J 196} 197 198func 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 223func 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. 249func 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 267type UArr struct { 268 Children [2]J 269} 270 271func (u *UArr) Child(n int) J { return u.Children[n] } 272 273func 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 291type UArrPtr struct { 292 Children *[2]J 293} 294 295func (u *UArrPtr) Child(n int) J { return u.Children[n] } 296 297func ChainAssertArrayptrIndex(u *UArrPtr) J { 298 return u. 299 Children[0].(*UArrPtr). 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] 313} 314 315// Chains of divisions. See issue 4201. 316 317func ChainDiv(a, b int) int { 318 return a / b / a / b / a / b / a / b / 319 a / b / a / b / a / b / a / b / 320 a / b / a / b / a / b / a / b 321} 322 323func ChainDivRight(a, b int) int { 324 return a / (b / (a / (b / 325 (a / (b / (a / (b / 326 (a / (b / (a / (b / 327 (a / (b / (a / (b / 328 (a / (b / (a / b)))))))))))))))))) 329} 330 331func ChainDivConst(a int) int { 332 return a / 17 / 17 / 17 / 333 17 / 17 / 17 / 17 / 334 17 / 17 / 17 / 17 335} 336 337func ChainMulBytes(a, b, c byte) byte { 338 return a*(a*(a*(a*(a*(a*(a*(a*(a*b+c)+c)+c)+c)+c)+c)+c)+c) + c 339} 340