// 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 main

import (
	"fmt"
	T "runtime/internal/sys"
)

var A = []uint64{0x0102030405060708, 0x1122334455667788}
var B = []uint64{0x0807060504030201, 0x8877665544332211}

var errors int

func logf(f string, args ...interface{}) {
	errors++
	fmt.Printf(f, args...)
	if errors > 100 { // 100 is enough spewage
		panic("100 errors is plenty is enough")
	}
}

func test(i int, x uint64) {
	t := T.Ctz64(x) // ERROR "intrinsic substitution for Ctz64"
	if i != t {
		logf("Ctz64(0x%x) expected %d but got %d\n", x, i, t)
	}
	x = -x
	t = T.Ctz64(x) // ERROR "intrinsic substitution for Ctz64"
	if i != t {
		logf("Ctz64(0x%x) expected %d but got %d\n", x, i, t)
	}

	if i <= 32 {
		x32 := uint32(x)
		t32 := T.Ctz32(x32) // ERROR "intrinsic substitution for Ctz32"
		if i != t32 {
			logf("Ctz32(0x%x) expected %d but got %d\n", x32, i, t32)
		}
		x32 = -x32
		t32 = T.Ctz32(x32) // ERROR "intrinsic substitution for Ctz32"
		if i != t32 {
			logf("Ctz32(0x%x) expected %d but got %d\n", x32, i, t32)
		}
	}
}

func main() {
	// Test Bswap first because the other test relies on it
	// working correctly (to implement bit reversal).
	for i := range A {
		x := A[i]
		y := B[i]
		X := T.Bswap64(x) // ERROR "intrinsic substitution for Bswap64"
		Y := T.Bswap64(y) // ERROR "intrinsic substitution for Bswap64"
		if y != X {
			logf("Bswap64(0x%08x) expected 0x%08x but got 0x%08x\n", x, y, X)
		}
		if x != Y {
			logf("Bswap64(0x%08x) expected 0x%08x but got 0x%08x\n", y, x, Y)
		}

		x32 := uint32(X)
		y32 := uint32(Y >> 32)

		X32 := T.Bswap32(x32) // ERROR "intrinsic substitution for Bswap32"
		Y32 := T.Bswap32(y32) // ERROR "intrinsic substitution for Bswap32"
		if y32 != X32 {
			logf("Bswap32(0x%08x) expected 0x%08x but got 0x%08x\n", x32, y32, X32)
		}
		if x32 != Y32 {
			logf("Bswap32(0x%08x) expected 0x%08x but got 0x%08x\n", y32, x32, Y32)
		}
	}

	// Zero is a special case, be sure it is done right.
	if T.Ctz32(0) != 32 { // ERROR "intrinsic substitution for Ctz32"
		logf("ctz32(0) != 32")
	}
	if T.Ctz64(0) != 64 { // ERROR "intrinsic substitution for Ctz64"
		logf("ctz64(0) != 64")
	}

	for i := 0; i <= 64; i++ {
		for j := uint64(1); j <= 255; j += 2 {
			for k := uint64(1); k <= 65537; k += 128 {
				x := (j * k) << uint(i)
				test(i, x)
			}
		}
	}
}
