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

// Export guts for testing.

package runtime

import "unsafe"

var Fadd64 = fadd64
var Fsub64 = fsub64
var Fmul64 = fmul64
var Fdiv64 = fdiv64
var F64to32 = f64to32
var F32to64 = f32to64
var Fcmp64 = fcmp64
var Fintto64 = fintto64
var F64toint = f64toint

func entersyscall()
func golockedOSThread() bool
func stackguard() (sp, limit uintptr)

var Entersyscall = entersyscall
var Exitsyscall = exitsyscall
var LockedOSThread = golockedOSThread
var Stackguard = stackguard

type LFNode struct {
	Next    *LFNode
	Pushcnt uintptr
}

var (
	lfstackpush_m,
	lfstackpop_m mFunction
)

func LFStackPush(head *uint64, node *LFNode) {
	mp := acquirem()
	mp.ptrarg[0] = unsafe.Pointer(head)
	mp.ptrarg[1] = unsafe.Pointer(node)
	onM(&lfstackpush_m)
	releasem(mp)
}

func LFStackPop(head *uint64) *LFNode {
	mp := acquirem()
	mp.ptrarg[0] = unsafe.Pointer(head)
	onM(&lfstackpop_m)
	node := (*LFNode)(unsafe.Pointer(mp.ptrarg[0]))
	mp.ptrarg[0] = nil
	releasem(mp)
	return node
}

type ParFor struct {
	body    *byte
	done    uint32
	Nthr    uint32
	nthrmax uint32
	thrseq  uint32
	Cnt     uint32
	Ctx     *byte
	wait    bool
}

var (
	newparfor_m,
	parforsetup_m,
	parfordo_m,
	parforiters_m mFunction
)

func NewParFor(nthrmax uint32) *ParFor {
	mp := acquirem()
	mp.scalararg[0] = uint(nthrmax)
	onM(&newparfor_m)
	desc := (*ParFor)(mp.ptrarg[0])
	mp.ptrarg[0] = nil
	releasem(mp)
	return desc
}

func ParForSetup(desc *ParFor, nthr, n uint32, ctx *byte, wait bool, body func(*ParFor, uint32)) {
	mp := acquirem()
	mp.ptrarg[0] = unsafe.Pointer(desc)
	mp.ptrarg[1] = unsafe.Pointer(ctx)
	mp.ptrarg[2] = **(**unsafe.Pointer)(unsafe.Pointer(&body))
	mp.scalararg[0] = uint(nthr)
	mp.scalararg[1] = uint(n)
	mp.scalararg[2] = 0
	if wait {
		mp.scalararg[2] = 1
	}
	onM(&parforsetup_m)
	releasem(mp)
}

func ParForDo(desc *ParFor) {
	mp := acquirem()
	mp.ptrarg[0] = unsafe.Pointer(desc)
	onM(&parfordo_m)
	releasem(mp)
}

func ParForIters(desc *ParFor, tid uint32) (uint32, uint32) {
	mp := acquirem()
	mp.ptrarg[0] = unsafe.Pointer(desc)
	mp.scalararg[0] = uint(tid)
	onM(&parforiters_m)
	begin := uint32(mp.scalararg[0])
	end := uint32(mp.scalararg[1])
	releasem(mp)
	return begin, end
}

//go:noescape
func GCMask(x interface{}) []byte

func testSchedLocalQueue()
func testSchedLocalQueueSteal()

var TestSchedLocalQueue1 = testSchedLocalQueue
var TestSchedLocalQueueSteal1 = testSchedLocalQueueSteal

var HaveGoodHash = haveGoodHash
var StringHash = stringHash
var BytesHash = bytesHash
var Int32Hash = int32Hash
var Int64Hash = int64Hash
var EfaceHash = efaceHash
var IfaceHash = ifaceHash
var MemclrBytes = memclrBytes

var HashLoad = &hashLoad

func gogoBytes() int32

var GogoBytes = gogoBytes

func gostringW([]uint16) string

var GostringW = gostringW
