mirror of
https://github.com/golang/go
synced 2024-09-06 00:19:45 +00:00
![Rémy Oudompheng](/assets/img/avatar_default.png)
There is no reason to generate different code for cap and len. Fixes #8025. Fixes #8026. LGTM=rsc R=rsc, iant, khr CC=golang-codereviews https://golang.org/cl/93570044
347 lines
7.7 KiB
Go
347 lines
7.7 KiB
Go
// compile
|
|
|
|
// Copyright 2012 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Various tests for expressions with high complexity.
|
|
|
|
package main
|
|
|
|
// Concatenate 16 4-bit integers into a 64-bit number.
|
|
func concat(s *[16]byte) uint64 {
|
|
r := (((((((((((((((uint64(s[0])<<4|
|
|
uint64(s[1]))<<4|
|
|
uint64(s[2]))<<4|
|
|
uint64(s[3]))<<4|
|
|
uint64(s[4]))<<4|
|
|
uint64(s[5]))<<4|
|
|
uint64(s[6]))<<4|
|
|
uint64(s[7]))<<4|
|
|
uint64(s[8]))<<4|
|
|
uint64(s[9]))<<4|
|
|
uint64(s[10]))<<4|
|
|
uint64(s[11]))<<4|
|
|
uint64(s[12]))<<4|
|
|
uint64(s[13]))<<4|
|
|
uint64(s[14]))<<4 |
|
|
uint64(s[15]))
|
|
return r
|
|
}
|
|
|
|
// Compute the determinant of a 4x4-matrix by the sum
|
|
// over all index permutations.
|
|
func determinant(m [4][4]float64) float64 {
|
|
return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
|
|
m[0][0]*m[1][1]*m[2][3]*m[3][2] -
|
|
m[0][0]*m[1][2]*m[2][1]*m[3][3] +
|
|
m[0][0]*m[1][2]*m[2][3]*m[3][1] +
|
|
m[0][0]*m[1][3]*m[2][1]*m[3][2] -
|
|
m[0][0]*m[1][3]*m[2][2]*m[3][1] -
|
|
m[0][1]*m[1][0]*m[2][2]*m[3][3] +
|
|
m[0][1]*m[1][0]*m[2][3]*m[3][2] +
|
|
m[0][1]*m[1][2]*m[2][0]*m[3][3] -
|
|
m[0][1]*m[1][2]*m[2][3]*m[3][0] -
|
|
m[0][1]*m[1][3]*m[2][0]*m[3][2] +
|
|
m[0][1]*m[1][3]*m[2][2]*m[3][0] +
|
|
m[0][2]*m[1][0]*m[2][1]*m[3][3] -
|
|
m[0][2]*m[1][0]*m[2][3]*m[3][1] -
|
|
m[0][2]*m[1][1]*m[2][0]*m[3][3] +
|
|
m[0][2]*m[1][1]*m[2][3]*m[3][0] +
|
|
m[0][2]*m[1][3]*m[2][0]*m[3][1] -
|
|
m[0][2]*m[1][3]*m[2][1]*m[3][0] -
|
|
m[0][3]*m[1][0]*m[2][1]*m[3][2] +
|
|
m[0][3]*m[1][0]*m[2][2]*m[3][1] +
|
|
m[0][3]*m[1][1]*m[2][0]*m[3][2] -
|
|
m[0][3]*m[1][1]*m[2][2]*m[3][0] -
|
|
m[0][3]*m[1][2]*m[2][0]*m[3][1] +
|
|
m[0][3]*m[1][2]*m[2][1]*m[3][0]
|
|
}
|
|
|
|
// Compute the determinant of a 4x4-matrix by the sum
|
|
// over all index permutations.
|
|
func determinantInt(m [4][4]int) int {
|
|
return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
|
|
m[0][0]*m[1][1]*m[2][3]*m[3][2] -
|
|
m[0][0]*m[1][2]*m[2][1]*m[3][3] +
|
|
m[0][0]*m[1][2]*m[2][3]*m[3][1] +
|
|
m[0][0]*m[1][3]*m[2][1]*m[3][2] -
|
|
m[0][0]*m[1][3]*m[2][2]*m[3][1] -
|
|
m[0][1]*m[1][0]*m[2][2]*m[3][3] +
|
|
m[0][1]*m[1][0]*m[2][3]*m[3][2] +
|
|
m[0][1]*m[1][2]*m[2][0]*m[3][3] -
|
|
m[0][1]*m[1][2]*m[2][3]*m[3][0] -
|
|
m[0][1]*m[1][3]*m[2][0]*m[3][2] +
|
|
m[0][1]*m[1][3]*m[2][2]*m[3][0] +
|
|
m[0][2]*m[1][0]*m[2][1]*m[3][3] -
|
|
m[0][2]*m[1][0]*m[2][3]*m[3][1] -
|
|
m[0][2]*m[1][1]*m[2][0]*m[3][3] +
|
|
m[0][2]*m[1][1]*m[2][3]*m[3][0] +
|
|
m[0][2]*m[1][3]*m[2][0]*m[3][1] -
|
|
m[0][2]*m[1][3]*m[2][1]*m[3][0] -
|
|
m[0][3]*m[1][0]*m[2][1]*m[3][2] +
|
|
m[0][3]*m[1][0]*m[2][2]*m[3][1] +
|
|
m[0][3]*m[1][1]*m[2][0]*m[3][2] -
|
|
m[0][3]*m[1][1]*m[2][2]*m[3][0] -
|
|
m[0][3]*m[1][2]*m[2][0]*m[3][1] +
|
|
m[0][3]*m[1][2]*m[2][1]*m[3][0]
|
|
}
|
|
|
|
// Compute the determinant of a 4x4-matrix by the sum
|
|
// over all index permutations.
|
|
func determinantByte(m [4][4]byte) byte {
|
|
return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
|
|
m[0][0]*m[1][1]*m[2][3]*m[3][2] -
|
|
m[0][0]*m[1][2]*m[2][1]*m[3][3] +
|
|
m[0][0]*m[1][2]*m[2][3]*m[3][1] +
|
|
m[0][0]*m[1][3]*m[2][1]*m[3][2] -
|
|
m[0][0]*m[1][3]*m[2][2]*m[3][1] -
|
|
m[0][1]*m[1][0]*m[2][2]*m[3][3] +
|
|
m[0][1]*m[1][0]*m[2][3]*m[3][2] +
|
|
m[0][1]*m[1][2]*m[2][0]*m[3][3] -
|
|
m[0][1]*m[1][2]*m[2][3]*m[3][0] -
|
|
m[0][1]*m[1][3]*m[2][0]*m[3][2] +
|
|
m[0][1]*m[1][3]*m[2][2]*m[3][0] +
|
|
m[0][2]*m[1][0]*m[2][1]*m[3][3] -
|
|
m[0][2]*m[1][0]*m[2][3]*m[3][1] -
|
|
m[0][2]*m[1][1]*m[2][0]*m[3][3] +
|
|
m[0][2]*m[1][1]*m[2][3]*m[3][0] +
|
|
m[0][2]*m[1][3]*m[2][0]*m[3][1] -
|
|
m[0][2]*m[1][3]*m[2][1]*m[3][0] -
|
|
m[0][3]*m[1][0]*m[2][1]*m[3][2] +
|
|
m[0][3]*m[1][0]*m[2][2]*m[3][1] +
|
|
m[0][3]*m[1][1]*m[2][0]*m[3][2] -
|
|
m[0][3]*m[1][1]*m[2][2]*m[3][0] -
|
|
m[0][3]*m[1][2]*m[2][0]*m[3][1] +
|
|
m[0][3]*m[1][2]*m[2][1]*m[3][0]
|
|
}
|
|
|
|
type A []A
|
|
|
|
// A sequence of constant indexings.
|
|
func IndexChain1(s A) A {
|
|
return s[0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]
|
|
}
|
|
|
|
// A sequence of non-constant indexings.
|
|
func IndexChain2(s A, i int) A {
|
|
return s[i][i][i][i][i][i][i][i][i][i][i][i][i][i][i][i]
|
|
}
|
|
|
|
// Another sequence of indexings.
|
|
func IndexChain3(s []int) int {
|
|
return s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[0]]]]]]]]]]]]]]]]]]]]]
|
|
}
|
|
|
|
// A right-leaning tree of byte multiplications.
|
|
func righttree(a, b, c, d uint8) uint8 {
|
|
return a * (b * (c * (d *
|
|
(a * (b * (c * (d *
|
|
(a * (b * (c * (d *
|
|
(a * (b * (c * (d *
|
|
(a * (b * (c * (d *
|
|
a * (b * (c * d)))))))))))))))))))))
|
|
|
|
}
|
|
|
|
// A left-leaning tree of byte multiplications.
|
|
func lefttree(a, b, c, d uint8) uint8 {
|
|
return ((((((((((((((((((a * b) * c) * d *
|
|
a) * b) * c) * d *
|
|
a) * b) * c) * d *
|
|
a) * b) * c) * d *
|
|
a) * b) * c) * d *
|
|
a) * b) * c) * d)
|
|
}
|
|
|
|
type T struct {
|
|
Next I
|
|
}
|
|
|
|
type I interface{}
|
|
|
|
// A chains of type assertions.
|
|
func ChainT(t *T) *T {
|
|
return t.
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T).
|
|
Next.(*T)
|
|
}
|
|
|
|
type U struct {
|
|
Children []J
|
|
}
|
|
|
|
func (u *U) Child(n int) J { return u.Children[n] }
|
|
|
|
type J interface {
|
|
Child(n int) J
|
|
}
|
|
|
|
func ChainUAssert(u *U) *U {
|
|
return u.Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U).
|
|
Child(0).(*U)
|
|
}
|
|
|
|
func ChainUNoAssert(u *U) *U {
|
|
return u.Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).
|
|
Child(0).(*U)
|
|
}
|
|
|
|
// Type assertions and slice indexing. See issue 4207.
|
|
func ChainAssertIndex(u *U) J {
|
|
return u.
|
|
Children[0].(*U).
|
|
Children[0].(*U).
|
|
Children[0].(*U).
|
|
Children[0].(*U).
|
|
Children[0].(*U).
|
|
Children[0].(*U).
|
|
Children[0].(*U).
|
|
Children[0].(*U).
|
|
Children[0].(*U).
|
|
Children[0].(*U).
|
|
Children[0].(*U).
|
|
Children[0].(*U).
|
|
Children[0].(*U).
|
|
Children[0]
|
|
}
|
|
|
|
type UArr struct {
|
|
Children [2]J
|
|
}
|
|
|
|
func (u *UArr) Child(n int) J { return u.Children[n] }
|
|
|
|
func ChainAssertArrayIndex(u *UArr) J {
|
|
return u.
|
|
Children[0].(*UArr).
|
|
Children[0].(*UArr).
|
|
Children[0].(*UArr).
|
|
Children[0].(*UArr).
|
|
Children[0].(*UArr).
|
|
Children[0].(*UArr).
|
|
Children[0].(*UArr).
|
|
Children[0].(*UArr).
|
|
Children[0].(*UArr).
|
|
Children[0].(*UArr).
|
|
Children[0].(*UArr).
|
|
Children[0].(*UArr).
|
|
Children[0].(*UArr).
|
|
Children[0]
|
|
}
|
|
|
|
type UArrPtr struct {
|
|
Children *[2]J
|
|
}
|
|
|
|
func (u *UArrPtr) Child(n int) J { return u.Children[n] }
|
|
|
|
func ChainAssertArrayptrIndex(u *UArrPtr) J {
|
|
return u.
|
|
Children[0].(*UArrPtr).
|
|
Children[0].(*UArrPtr).
|
|
Children[0].(*UArrPtr).
|
|
Children[0].(*UArrPtr).
|
|
Children[0].(*UArrPtr).
|
|
Children[0].(*UArrPtr).
|
|
Children[0].(*UArrPtr).
|
|
Children[0].(*UArrPtr).
|
|
Children[0].(*UArrPtr).
|
|
Children[0].(*UArrPtr).
|
|
Children[0].(*UArrPtr).
|
|
Children[0].(*UArrPtr).
|
|
Children[0].(*UArrPtr).
|
|
Children[0]
|
|
}
|
|
|
|
// Chains of divisions. See issue 4201.
|
|
|
|
func ChainDiv(a, b int) int {
|
|
return a / b / a / b / a / b / a / b /
|
|
a / b / a / b / a / b / a / b /
|
|
a / b / a / b / a / b / a / b
|
|
}
|
|
|
|
func ChainDivRight(a, b int) int {
|
|
return a / (b / (a / (b /
|
|
(a / (b / (a / (b /
|
|
(a / (b / (a / (b /
|
|
(a / (b / (a / (b /
|
|
(a / (b / (a / b))))))))))))))))))
|
|
}
|
|
|
|
func ChainDivConst(a int) int {
|
|
return a / 17 / 17 / 17 /
|
|
17 / 17 / 17 / 17 /
|
|
17 / 17 / 17 / 17
|
|
}
|
|
|
|
func ChainMulBytes(a, b, c byte) byte {
|
|
return a*(a*(a*(a*(a*(a*(a*(a*(a*b+c)+c)+c)+c)+c)+c)+c)+c) + c
|
|
}
|
|
|
|
func ChainCap() {
|
|
select {
|
|
case <-make(chan int, cap(make(chan int, cap(make(chan int, cap(make(chan int, cap(make(chan int))))))))):
|
|
default:
|
|
}
|
|
}
|