1258945Sroberto// compile 2280849Scy 3258945Sroberto// Copyright 2012 The Go Authors. All rights reserved. 4258945Sroberto// Use of this source code is governed by a BSD-style 5258945Sroberto// license that can be found in the LICENSE file. 6258945Sroberto 7258945Sroberto// Various tests for expressions with high complexity. 8258945Sroberto 9258945Srobertopackage main 10258945Sroberto 11258945Sroberto// Concatenate 16 4-bit integers into a 64-bit number. 12258945Srobertofunc concat(s *[16]byte) uint64 { 13258945Sroberto r := (((((((((((((((uint64(s[0])<<4| 14258945Sroberto uint64(s[1]))<<4| 15258945Sroberto uint64(s[2]))<<4| 16258945Sroberto uint64(s[3]))<<4| 17258945Sroberto uint64(s[4]))<<4| 18280849Scy uint64(s[5]))<<4| 19258945Sroberto uint64(s[6]))<<4| 20258945Sroberto uint64(s[7]))<<4| 21258945Sroberto uint64(s[8]))<<4| 22258945Sroberto uint64(s[9]))<<4| 23258945Sroberto uint64(s[10]))<<4| 24258945Sroberto uint64(s[11]))<<4| 25258945Sroberto uint64(s[12]))<<4| 26258945Sroberto uint64(s[13]))<<4| 27258945Sroberto uint64(s[14]))<<4 | 28258945Sroberto uint64(s[15])) 29258945Sroberto return r 30258945Sroberto} 31258945Sroberto 32258945Sroberto// Compute the determinant of a 4x4-matrix by the sum 33258945Sroberto// over all index permutations. 34258945Srobertofunc determinant(m [4][4]float64) float64 { 35258945Sroberto return m[0][0]*m[1][1]*m[2][2]*m[3][3] - 36258945Sroberto m[0][0]*m[1][1]*m[2][3]*m[3][2] - 37258945Sroberto m[0][0]*m[1][2]*m[2][1]*m[3][3] + 38258945Sroberto m[0][0]*m[1][2]*m[2][3]*m[3][1] + 39258945Sroberto m[0][0]*m[1][3]*m[2][1]*m[3][2] - 40258945Sroberto m[0][0]*m[1][3]*m[2][2]*m[3][1] - 41258945Sroberto m[0][1]*m[1][0]*m[2][2]*m[3][3] + 42258945Sroberto m[0][1]*m[1][0]*m[2][3]*m[3][2] + 43258945Sroberto m[0][1]*m[1][2]*m[2][0]*m[3][3] - 44258945Sroberto m[0][1]*m[1][2]*m[2][3]*m[3][0] - 45258945Sroberto m[0][1]*m[1][3]*m[2][0]*m[3][2] + 46258945Sroberto m[0][1]*m[1][3]*m[2][2]*m[3][0] + 47258945Sroberto m[0][2]*m[1][0]*m[2][1]*m[3][3] - 48258945Sroberto m[0][2]*m[1][0]*m[2][3]*m[3][1] - 49258945Sroberto m[0][2]*m[1][1]*m[2][0]*m[3][3] + 50258945Sroberto m[0][2]*m[1][1]*m[2][3]*m[3][0] + 51258945Sroberto m[0][2]*m[1][3]*m[2][0]*m[3][1] - 52258945Sroberto m[0][2]*m[1][3]*m[2][1]*m[3][0] - 53258945Sroberto m[0][3]*m[1][0]*m[2][1]*m[3][2] + 54258945Sroberto m[0][3]*m[1][0]*m[2][2]*m[3][1] + 55258945Sroberto m[0][3]*m[1][1]*m[2][0]*m[3][2] - 56258945Sroberto m[0][3]*m[1][1]*m[2][2]*m[3][0] - 57258945Sroberto m[0][3]*m[1][2]*m[2][0]*m[3][1] + 58258945Sroberto m[0][3]*m[1][2]*m[2][1]*m[3][0] 59258945Sroberto} 60258945Sroberto 61258945Sroberto// Compute the determinant of a 4x4-matrix by the sum 62258945Sroberto// over all index permutations. 63258945Srobertofunc determinantInt(m [4][4]int) int { 64258945Sroberto return m[0][0]*m[1][1]*m[2][2]*m[3][3] - 65258945Sroberto m[0][0]*m[1][1]*m[2][3]*m[3][2] - 66258945Sroberto m[0][0]*m[1][2]*m[2][1]*m[3][3] + 67258945Sroberto m[0][0]*m[1][2]*m[2][3]*m[3][1] + 68258945Sroberto m[0][0]*m[1][3]*m[2][1]*m[3][2] - 69258945Sroberto m[0][0]*m[1][3]*m[2][2]*m[3][1] - 70258945Sroberto m[0][1]*m[1][0]*m[2][2]*m[3][3] + 71258945Sroberto m[0][1]*m[1][0]*m[2][3]*m[3][2] + 72258945Sroberto m[0][1]*m[1][2]*m[2][0]*m[3][3] - 73258945Sroberto m[0][1]*m[1][2]*m[2][3]*m[3][0] - 74258945Sroberto m[0][1]*m[1][3]*m[2][0]*m[3][2] + 75258945Sroberto m[0][1]*m[1][3]*m[2][2]*m[3][0] + 76258945Sroberto m[0][2]*m[1][0]*m[2][1]*m[3][3] - 77258945Sroberto m[0][2]*m[1][0]*m[2][3]*m[3][1] - 78258945Sroberto m[0][2]*m[1][1]*m[2][0]*m[3][3] + 79258945Sroberto m[0][2]*m[1][1]*m[2][3]*m[3][0] + 80258945Sroberto m[0][2]*m[1][3]*m[2][0]*m[3][1] - 81258945Sroberto m[0][2]*m[1][3]*m[2][1]*m[3][0] - 82258945Sroberto m[0][3]*m[1][0]*m[2][1]*m[3][2] + 83258945Sroberto m[0][3]*m[1][0]*m[2][2]*m[3][1] + 84258945Sroberto m[0][3]*m[1][1]*m[2][0]*m[3][2] - 85258945Sroberto m[0][3]*m[1][1]*m[2][2]*m[3][0] - 86258945Sroberto m[0][3]*m[1][2]*m[2][0]*m[3][1] + 87258945Sroberto m[0][3]*m[1][2]*m[2][1]*m[3][0] 88258945Sroberto} 89258945Sroberto 90258945Sroberto// Compute the determinant of a 4x4-matrix by the sum 91258945Sroberto// over all index permutations. 92258945Srobertofunc determinantByte(m [4][4]byte) byte { 93258945Sroberto return m[0][0]*m[1][1]*m[2][2]*m[3][3] - 94258945Sroberto m[0][0]*m[1][1]*m[2][3]*m[3][2] - 95258945Sroberto m[0][0]*m[1][2]*m[2][1]*m[3][3] + 96258945Sroberto m[0][0]*m[1][2]*m[2][3]*m[3][1] + 97258945Sroberto m[0][0]*m[1][3]*m[2][1]*m[3][2] - 98258945Sroberto m[0][0]*m[1][3]*m[2][2]*m[3][1] - 99258945Sroberto m[0][1]*m[1][0]*m[2][2]*m[3][3] + 100258945Sroberto m[0][1]*m[1][0]*m[2][3]*m[3][2] + 101258945Sroberto m[0][1]*m[1][2]*m[2][0]*m[3][3] - 102258945Sroberto m[0][1]*m[1][2]*m[2][3]*m[3][0] - 103258945Sroberto m[0][1]*m[1][3]*m[2][0]*m[3][2] + 104258945Sroberto m[0][1]*m[1][3]*m[2][2]*m[3][0] + 105258945Sroberto m[0][2]*m[1][0]*m[2][1]*m[3][3] - 106258945Sroberto m[0][2]*m[1][0]*m[2][3]*m[3][1] - 107258945Sroberto m[0][2]*m[1][1]*m[2][0]*m[3][3] + 108258945Sroberto m[0][2]*m[1][1]*m[2][3]*m[3][0] + 109258945Sroberto m[0][2]*m[1][3]*m[2][0]*m[3][1] - 110258945Sroberto m[0][2]*m[1][3]*m[2][1]*m[3][0] - 111258945Sroberto m[0][3]*m[1][0]*m[2][1]*m[3][2] + 112258945Sroberto m[0][3]*m[1][0]*m[2][2]*m[3][1] + 113258945Sroberto m[0][3]*m[1][1]*m[2][0]*m[3][2] - 114258945Sroberto m[0][3]*m[1][1]*m[2][2]*m[3][0] - 115258945Sroberto m[0][3]*m[1][2]*m[2][0]*m[3][1] + 116258945Sroberto m[0][3]*m[1][2]*m[2][1]*m[3][0] 117258945Sroberto} 118258945Sroberto 119258945Srobertotype A []A 120258945Sroberto 121258945Sroberto// A sequence of constant indexings. 122258945Srobertofunc IndexChain1(s A) A { 123258945Sroberto return s[0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] 124280849Scy} 125258945Sroberto 126258945Sroberto// A sequence of non-constant indexings. 127258945Srobertofunc IndexChain2(s A, i int) A { 128258945Sroberto return s[i][i][i][i][i][i][i][i][i][i][i][i][i][i][i][i] 129258945Sroberto} 130258945Sroberto 131258945Sroberto// Another sequence of indexings. 132258945Srobertofunc IndexChain3(s []int) int { 133258945Sroberto return s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[0]]]]]]]]]]]]]]]]]]]]] 134258945Sroberto} 135258945Sroberto 136258945Sroberto// A right-leaning tree of byte multiplications. 137258945Srobertofunc righttree(a, b, c, d uint8) uint8 { 138258945Sroberto return a * (b * (c * (d * 139258945Sroberto (a * (b * (c * (d * 140258945Sroberto (a * (b * (c * (d * 141258945Sroberto (a * (b * (c * (d * 142258945Sroberto (a * (b * (c * (d * 143258945Sroberto a * (b * (c * d))))))))))))))))))))) 144258945Sroberto 145258945Sroberto} 146258945Sroberto 147258945Sroberto// A left-leaning tree of byte multiplications. 148258945Srobertofunc lefttree(a, b, c, d uint8) uint8 { 149258945Sroberto return ((((((((((((((((((a * b) * c) * d * 150258945Sroberto a) * b) * c) * d * 151258945Sroberto a) * b) * c) * d * 152258945Sroberto a) * b) * c) * d * 153258945Sroberto a) * b) * c) * d * 154258945Sroberto a) * b) * c) * d) 155280849Scy} 156280849Scy 157280849Scytype T struct { 158280849Scy Next I 159280849Scy} 160280849Scy 161280849Scytype I interface{} 162280849Scy 163280849Scy// A chains of type assertions. 164280849Scyfunc ChainT(t *T) *T { 165280849Scy return t. 166280849Scy Next.(*T). 167280849Scy Next.(*T). 168280849Scy Next.(*T). 169280849Scy Next.(*T). 170280849Scy Next.(*T). 171280849Scy Next.(*T). 172258945Sroberto Next.(*T). 173280849Scy Next.(*T). 174280849Scy Next.(*T). 175280849Scy Next.(*T). 176280849Scy Next.(*T). 177280849Scy Next.(*T). 178280849Scy Next.(*T). 179258945Sroberto Next.(*T). 180258945Sroberto Next.(*T). 181258945Sroberto Next.(*T). 182258945Sroberto Next.(*T). 183258945Sroberto Next.(*T). 184258945Sroberto Next.(*T). 185258945Sroberto Next.(*T) 186258945Sroberto} 187258945Sroberto 188258945Srobertotype U struct { 189258945Sroberto Children []J 190258945Sroberto} 191258945Sroberto 192258945Srobertofunc (u *U) Child(n int) J { return u.Children[n] } 193258945Sroberto 194258945Srobertotype J interface { 195258945Sroberto Child(n int) J 196258945Sroberto} 197258945Sroberto 198258945Srobertofunc ChainUAssert(u *U) *U { 199258945Sroberto return u.Child(0).(*U). 200258945Sroberto Child(0).(*U). 201258945Sroberto Child(0).(*U). 202258945Sroberto Child(0).(*U). 203258945Sroberto Child(0).(*U). 204258945Sroberto Child(0).(*U). 205258945Sroberto Child(0).(*U). 206258945Sroberto Child(0).(*U). 207258945Sroberto Child(0).(*U). 208280849Scy Child(0).(*U). 209280849Scy Child(0).(*U). 210280849Scy Child(0).(*U). 211280849Scy Child(0).(*U). 212280849Scy Child(0).(*U). 213280849Scy Child(0).(*U). 214280849Scy Child(0).(*U). 215280849Scy Child(0).(*U). 216280849Scy Child(0).(*U). 217280849Scy Child(0).(*U). 218280849Scy Child(0).(*U). 219280849Scy Child(0).(*U). 220280849Scy Child(0).(*U) 221280849Scy} 222280849Scy 223280849Scyfunc ChainUNoAssert(u *U) *U { 224280849Scy return u.Child(0). 225280849Scy Child(0). 226280849Scy Child(0). 227280849Scy Child(0). 228280849Scy Child(0). 229280849Scy Child(0). 230280849Scy Child(0). 231280849Scy Child(0). 232280849Scy Child(0). 233280849Scy Child(0). 234280849Scy Child(0). 235280849Scy Child(0). 236280849Scy Child(0). 237280849Scy Child(0). 238280849Scy Child(0). 239280849Scy Child(0). 240280849Scy Child(0). 241280849Scy Child(0). 242280849Scy Child(0). 243280849Scy Child(0). 244280849Scy Child(0). 245280849Scy Child(0).(*U) 246280849Scy} 247280849Scy 248280849Scy// Type assertions and slice indexing. See issue 4207. 249280849Scyfunc ChainAssertIndex(u *U) J { 250280849Scy return u. 251280849Scy Children[0].(*U). 252280849Scy Children[0].(*U). 253280849Scy Children[0].(*U). 254280849Scy Children[0].(*U). 255280849Scy Children[0].(*U). 256280849Scy Children[0].(*U). 257280849Scy Children[0].(*U). 258280849Scy Children[0].(*U). 259280849Scy Children[0].(*U). 260280849Scy Children[0].(*U). 261280849Scy Children[0].(*U). 262280849Scy Children[0].(*U). 263280849Scy Children[0].(*U). 264280849Scy Children[0] 265280849Scy} 266280849Scy 267280849Scytype UArr struct { 268280849Scy Children [2]J 269280849Scy} 270280849Scy 271280849Scyfunc (u *UArr) Child(n int) J { return u.Children[n] } 272280849Scy 273280849Scyfunc ChainAssertArrayIndex(u *UArr) J { 274280849Scy return u. 275280849Scy Children[0].(*UArr). 276280849Scy Children[0].(*UArr). 277258945Sroberto Children[0].(*UArr). 278258945Sroberto Children[0].(*UArr). 279258945Sroberto Children[0].(*UArr). 280280849Scy Children[0].(*UArr). 281258945Sroberto Children[0].(*UArr). 282258945Sroberto Children[0].(*UArr). 283258945Sroberto Children[0].(*UArr). 284258945Sroberto Children[0].(*UArr). 285280849Scy Children[0].(*UArr). 286258945Sroberto Children[0].(*UArr). 287258945Sroberto Children[0].(*UArr). 288258945Sroberto Children[0] 289258945Sroberto} 290280849Scy 291258945Srobertotype UArrPtr struct { 292258945Sroberto Children *[2]J 293258945Sroberto} 294258945Sroberto 295280849Scyfunc (u *UArrPtr) Child(n int) J { return u.Children[n] } 296258945Sroberto 297258945Srobertofunc ChainAssertArrayptrIndex(u *UArrPtr) J { 298258945Sroberto return u. 299280849Scy Children[0].(*UArrPtr). 300258945Sroberto Children[0].(*UArrPtr). 301280849Scy Children[0].(*UArrPtr). 302280849Scy Children[0].(*UArrPtr). 303280849Scy Children[0].(*UArrPtr). 304258945Sroberto Children[0].(*UArrPtr). 305258945Sroberto Children[0].(*UArrPtr). 306258945Sroberto Children[0].(*UArrPtr). 307258945Sroberto Children[0].(*UArrPtr). 308258945Sroberto Children[0].(*UArrPtr). 309258945Sroberto Children[0].(*UArrPtr). 310258945Sroberto Children[0].(*UArrPtr). 311258945Sroberto Children[0].(*UArrPtr). 312258945Sroberto Children[0] 313258945Sroberto} 314258945Sroberto 315258945Sroberto// Chains of divisions. See issue 4201. 316258945Sroberto 317258945Srobertofunc ChainDiv(a, b int) int { 318258945Sroberto return a / b / a / b / a / b / a / b / 319258945Sroberto a / b / a / b / a / b / a / b / 320258945Sroberto a / b / a / b / a / b / a / b 321258945Sroberto} 322258945Sroberto 323258945Srobertofunc ChainDivRight(a, b int) int { 324258945Sroberto return a / (b / (a / (b / 325258945Sroberto (a / (b / (a / (b / 326258945Sroberto (a / (b / (a / (b / 327258945Sroberto (a / (b / (a / (b / 328258945Sroberto (a / (b / (a / b)))))))))))))))))) 329258945Sroberto} 330258945Sroberto 331258945Srobertofunc ChainDivConst(a int) int { 332258945Sroberto return a / 17 / 17 / 17 / 333258945Sroberto 17 / 17 / 17 / 17 / 334258945Sroberto 17 / 17 / 17 / 17 335258945Sroberto} 336258945Sroberto 337280849Scyfunc ChainMulBytes(a, b, c byte) byte { 338258945Sroberto return a*(a*(a*(a*(a*(a*(a*(a*(a*b+c)+c)+c)+c)+c)+c)+c)+c) + c 339258945Sroberto} 340258945Sroberto