// Copyright 2016 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.

package ssa

import (
	"cmd/compile/internal/rttype"
	"math"
	"math/rand"
	"reflect"
	"testing"
	"unsafe"
)

// We generate memmove for copy(x[1:], x[:]), however we may change it to OpMove,
// because size is known. Check that OpMove is alias-safe, or we did call memmove.
func TestMove(t *testing.T) {
	x := [...]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40}
	copy(x[1:], x[:])
	for i := 1; i < len(x); i++ {
		if int(x[i]) != i {
			t.Errorf("Memmove got converted to OpMove in alias-unsafe way. Got %d instead of %d in position %d", int(x[i]), i, i+1)
		}
	}
}

func TestMoveSmall(t *testing.T) {
	x := [...]byte{1, 2, 3, 4, 5, 6, 7}
	copy(x[1:], x[:])
	for i := 1; i < len(x); i++ {
		if int(x[i]) != i {
			t.Errorf("Memmove got converted to OpMove in alias-unsafe way. Got %d instead of %d in position %d", int(x[i]), i, i+1)
		}
	}
}

func TestSubFlags(t *testing.T) {
	if !subFlags32(0, 1).lt() {
		t.Errorf("subFlags32(0,1).lt() returned false")
	}
	if !subFlags32(0, 1).ult() {
		t.Errorf("subFlags32(0,1).ult() returned false")
	}
}

//go:noinline
func unopt(f func(float64) float64, x float32) float32 {
	return float32(f(float64(x)))
}

func differ(x, y float32) bool {
	if x != x && y != y {
		// if both are NaN, exact bit pattern of the NaN is uninteresting
		return false
	}
	return math.Float32bits(x) != math.Float32bits(y)
}

func test32bitUnary(t *testing.T, x float32) {
	if want, got := unopt(math.Round, x), float32(math.Round(float64(x))); differ(want, got) {
		t.Errorf("Optimized 32-bit Round did not match, x=%f, want=%f, got=%f", x, want, got)
	}
	if want, got := unopt(math.RoundToEven, x), float32(math.RoundToEven(float64(x))); differ(want, got) {
		t.Errorf("Optimized 32-bit RoundToEven did not match, x=%f, want=%f, got=%f", x, want, got)
	}
	if want, got := unopt(math.Trunc, x), float32(math.Trunc(float64(x))); differ(want, got) {
		t.Errorf("Optimized 32-bit Trunc did not match, x=%f, want=%f, got=%f", x, want, got)
	}
	if want, got := unopt(math.Ceil, x), float32(math.Ceil(float64(x))); differ(want, got) {
		t.Errorf("Optimized 32-bit Ceil did not match, x=%f, want=%f, got=%f", x, want, got)
	}
	if want, got := unopt(math.Floor, x), float32(math.Floor(float64(x))); differ(want, got) {
		t.Errorf("Optimized 32-bit Floor did not match, x=%f, want=%f, got=%f", x, want, got)
	}
	if x >= 0 {
		if want, got := unopt(math.Sqrt, x), float32(math.Sqrt(float64(x))); differ(want, got) {
			t.Errorf("Optimized 32-bit Sqrt did not match, x=%f, want=%f, got=%f", x, want, got)
		}
	}
	if want, got := unopt(math.Abs, x), float32(math.Abs(float64(x))); differ(want, got) {
		t.Errorf("Optimized 32-bit Abs did not match, x=%f, want=%f, got=%f", x, want, got)
	}

}

var zero float32

func Test32bitUnary(t *testing.T) {
	// this is mostly for testing rounding.
	test32bitUnary(t, -1.5)
	test32bitUnary(t, -0.5)
	test32bitUnary(t, 0.5)
	test32bitUnary(t, 1.5)

	test32bitUnary(t, -1.4)
	test32bitUnary(t, -0.4)
	test32bitUnary(t, 0.4)
	test32bitUnary(t, 1.4)

	test32bitUnary(t, -1.6)
	test32bitUnary(t, -0.6)
	test32bitUnary(t, 0.6)
	test32bitUnary(t, 1.6)

	// negative zero
	test32bitUnary(t, 1/(-1/zero))

	var rnd = rand.New(rand.NewSource(0))

	for i := uint32(0); i <= 1<<20; i++ {
		test32bitUnary(t, math.Float32frombits(math.Float32bits(math.MaxFloat32)-i))
		test32bitUnary(t, float32(i)+1.5)
		test32bitUnary(t, math.Float32frombits(rnd.Uint32()))
	}

}

func TestIsPPC64WordRotateMask(t *testing.T) {
	tests := []struct {
		input    int64
		expected bool
	}{
		{0x00000001, true},
		{0x80000001, true},
		{0x80010001, false},
		{0xFFFFFFFA, false},
		{0xF0F0F0F0, false},
		{0xFFFFFFFD, true},
		{0x80000000, true},
		{0x00000000, false},
		{0xFFFFFFFF, true},
		{0x0000FFFF, true},
		{0xFF0000FF, true},
		{0x00FFFF00, true},
	}

	for _, v := range tests {
		if v.expected != isPPC64WordRotateMask(v.input) {
			t.Errorf("isPPC64WordRotateMask(0x%x) failed", v.input)
		}
	}
}

func TestEncodeDecodePPC64WordRotateMask(t *testing.T) {
	tests := []struct {
		rotate int64
		mask   uint64
		nbits,
		mb,
		me,
		encoded int64
	}{
		{1, 0x00000001, 32, 31, 31, 0x20011f20},
		{2, 0x80000001, 32, 31, 0, 0x20021f01},
		{3, 0xFFFFFFFD, 32, 31, 29, 0x20031f1e},
		{4, 0x80000000, 32, 0, 0, 0x20040001},
		{5, 0xFFFFFFFF, 32, 0, 31, 0x20050020},
		{6, 0x0000FFFF, 32, 16, 31, 0x20061020},
		{7, 0xFF0000FF, 32, 24, 7, 0x20071808},
		{8, 0x00FFFF00, 32, 8, 23, 0x20080818},

		{9, 0x0000000000FFFF00, 64, 40, 55, 0x40092838},
		{10, 0xFFFF000000000000, 64, 0, 15, 0x400A0010},
		{10, 0xFFFF000000000001, 64, 63, 15, 0x400A3f10},
	}

	for i, v := range tests {
		result := encodePPC64RotateMask(v.rotate, int64(v.mask), v.nbits)
		if result != v.encoded {
			t.Errorf("encodePPC64RotateMask(%d,0x%x,%d) = 0x%x, expected 0x%x", v.rotate, v.mask, v.nbits, result, v.encoded)
		}
		rotate, mb, me, mask := DecodePPC64RotateMask(result)
		if rotate != v.rotate || mb != v.mb || me != v.me || mask != v.mask {
			t.Errorf("DecodePPC64Failure(Test %d) got (%d, %d, %d, %x) expected (%d, %d, %d, %x)", i, rotate, mb, me, mask, v.rotate, v.mb, v.me, v.mask)
		}
	}
}

func TestMergePPC64ClrlsldiSrw(t *testing.T) {
	tests := []struct {
		clrlsldi int32
		srw      int64
		valid    bool
		rotate   int64
		mask     uint64
	}{
		// ((x>>4)&0xFF)<<4
		{newPPC64ShiftAuxInt(4, 56, 63, 64), 4, true, 0, 0xFF0},
		// ((x>>4)&0xFFFF)<<4
		{newPPC64ShiftAuxInt(4, 48, 63, 64), 4, true, 0, 0xFFFF0},
		// ((x>>4)&0xFFFF)<<17
		{newPPC64ShiftAuxInt(17, 48, 63, 64), 4, false, 0, 0},
		// ((x>>4)&0xFFFF)<<16
		{newPPC64ShiftAuxInt(16, 48, 63, 64), 4, true, 12, 0xFFFF0000},
		// ((x>>32)&0xFFFF)<<17
		{newPPC64ShiftAuxInt(17, 48, 63, 64), 32, false, 0, 0},
	}
	for i, v := range tests {
		result := mergePPC64ClrlsldiSrw(int64(v.clrlsldi), v.srw)
		if v.valid && result == 0 {
			t.Errorf("mergePPC64ClrlsldiSrw(Test %d) did not merge", i)
		} else if !v.valid && result != 0 {
			t.Errorf("mergePPC64ClrlsldiSrw(Test %d) should return 0", i)
		} else if r, _, _, m := DecodePPC64RotateMask(result); v.rotate != r || v.mask != m {
			t.Errorf("mergePPC64ClrlsldiSrw(Test %d) got (%d,0x%x) expected (%d,0x%x)", i, r, m, v.rotate, v.mask)
		}
	}
}

func TestMergePPC64ClrlsldiRlwinm(t *testing.T) {
	tests := []struct {
		clrlsldi int32
		rlwinm   int64
		valid    bool
		rotate   int64
		mask     uint64
	}{
		// ((x<<4)&0xFF00)<<4
		{newPPC64ShiftAuxInt(4, 56, 63, 64), encodePPC64RotateMask(4, 0xFF00, 32), false, 0, 0},
		// ((x>>4)&0xFF)<<4
		{newPPC64ShiftAuxInt(4, 56, 63, 64), encodePPC64RotateMask(28, 0x0FFFFFFF, 32), true, 0, 0xFF0},
		// ((x>>4)&0xFFFF)<<4
		{newPPC64ShiftAuxInt(4, 48, 63, 64), encodePPC64RotateMask(28, 0xFFFF, 32), true, 0, 0xFFFF0},
		// ((x>>4)&0xFFFF)<<17
		{newPPC64ShiftAuxInt(17, 48, 63, 64), encodePPC64RotateMask(28, 0xFFFF, 32), false, 0, 0},
		// ((x>>4)&0xFFFF)<<16
		{newPPC64ShiftAuxInt(16, 48, 63, 64), encodePPC64RotateMask(28, 0xFFFF, 32), true, 12, 0xFFFF0000},
		// ((x>>4)&0xF000FFFF)<<16
		{newPPC64ShiftAuxInt(16, 48, 63, 64), encodePPC64RotateMask(28, 0xF000FFFF, 32), true, 12, 0xFFFF0000},
	}
	for i, v := range tests {
		result := mergePPC64ClrlsldiRlwinm(v.clrlsldi, v.rlwinm)
		if v.valid && result == 0 {
			t.Errorf("mergePPC64ClrlsldiRlwinm(Test %d) did not merge", i)
		} else if !v.valid && result != 0 {
			t.Errorf("mergePPC64ClrlsldiRlwinm(Test %d) should return 0", i)
		} else if r, _, _, m := DecodePPC64RotateMask(result); v.rotate != r || v.mask != m {
			t.Errorf("mergePPC64ClrlsldiRlwinm(Test %d) got (%d,0x%x) expected (%d,0x%x)", i, r, m, v.rotate, v.mask)
		}
	}
}

func TestMergePPC64SldiSrw(t *testing.T) {
	tests := []struct {
		sld    int64
		srw    int64
		valid  bool
		rotate int64
		mask   uint64
	}{
		{4, 4, true, 0, 0xFFFFFFF0},
		{4, 8, true, 28, 0x0FFFFFF0},
		{0, 0, true, 0, 0xFFFFFFFF},
		{8, 4, false, 0, 0},
		{0, 32, false, 0, 0},
		{0, 31, true, 1, 0x1},
		{31, 31, true, 0, 0x80000000},
		{32, 32, false, 0, 0},
	}
	for i, v := range tests {
		result := mergePPC64SldiSrw(v.sld, v.srw)
		if v.valid && result == 0 {
			t.Errorf("mergePPC64SldiSrw(Test %d) did not merge", i)
		} else if !v.valid && result != 0 {
			t.Errorf("mergePPC64SldiSrw(Test %d) should return 0", i)
		} else if r, _, _, m := DecodePPC64RotateMask(result); v.rotate != r || v.mask != m {
			t.Errorf("mergePPC64SldiSrw(Test %d) got (%d,0x%x) expected (%d,0x%x)", i, r, m, v.rotate, v.mask)
		}
	}
}

func TestMergePPC64AndSrwi(t *testing.T) {
	tests := []struct {
		and    int64
		srw    int64
		valid  bool
		rotate int64
		mask   uint64
	}{
		{0x000000FF, 8, true, 24, 0xFF},
		{0xF00000FF, 8, true, 24, 0xFF},
		{0x0F0000FF, 4, false, 0, 0},
		{0x00000000, 4, false, 0, 0},
		{0xF0000000, 4, false, 0, 0},
		{0xF0000000, 32, false, 0, 0},
		{0xFFFFFFFF, 0, true, 0, 0xFFFFFFFF},
	}
	for i, v := range tests {
		result := mergePPC64AndSrwi(v.and, v.srw)
		if v.valid && result == 0 {
			t.Errorf("mergePPC64AndSrwi(Test %d) did not merge", i)
		} else if !v.valid && result != 0 {
			t.Errorf("mergePPC64AndSrwi(Test %d) should return 0", i)
		} else if r, _, _, m := DecodePPC64RotateMask(result); v.rotate != r || v.mask != m {
			t.Errorf("mergePPC64AndSrwi(Test %d) got (%d,0x%x) expected (%d,0x%x)", i, r, m, v.rotate, v.mask)
		}
	}
}

func TestDisjointTypes(t *testing.T) {
	tests := []struct {
		v1, v2   any // two pointers to some types
		expected bool
	}{
		{new(int8), new(int8), false},
		{new(int8), new(float32), false},
		{new(int8), new(*int8), true},
		{new(*int8), new(*float32), false},
		{new(*int8), new(chan<- int8), false},
		{new(**int8), new(*int8), false},
		{new(***int8), new(**int8), false},
		{new(int8), new(chan<- int8), true},
		{new(int), unsafe.Pointer(nil), false},
		{new(byte), new(string), false},
		{new(int), new(string), false},
		{new(*int8), new(struct{ a, b int }), true},
		{new(*int8), new(struct {
			a *int
			b int
		}), false},
		{new(*int8), new(struct {
			a int
			b *int
		}), false}, // with more precise analysis it should be true
		{new(*byte), new(string), false},
		{new(int), new(struct {
			a int
			b *int
		}), false},
		{new(float64), new(complex128), false},
		{new(*byte), new([]byte), false},
		{new(int), new([]byte), false},
		{new(int), new([2]*byte), false}, // with more recise analysis it should be true
		{new([2]int), new(*byte), true},
	}
	for _, tst := range tests {
		t1 := rttype.FromReflect(reflect.TypeOf(tst.v1))
		t2 := rttype.FromReflect(reflect.TypeOf(tst.v2))
		result := disjointTypes(t1, t2)
		if result != tst.expected {
			t.Errorf("disjointTypes(%s, %s) got %t expected %t", t1.String(), t2.String(), result, tst.expected)
		}
	}
}

//go:noinline
func foo(p1 *int64, p2 *float64) int64 {
	*p1 = 10
	*p2 = 0 // disjointTypes shouldn't consider this and preceding stores as non-aliasing
	return *p1
}

func TestDisjointTypesRun(t *testing.T) {
	f := float64(0)
	i := (*int64)(unsafe.Pointer(&f))
	r := foo(i, &f)
	if r != 0 {
		t.Errorf("disjointTypes gives an incorrect answer that leads to an incorrect optimization.")
	}
}
