/*
 * Copyright (C) 2008 Advanced Micro Devices, Inc.
 * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com>
 *
 * Modified from coreboot src/arch/x86/acpi/globutil.asl
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

Method(MIN, 2)
{
	If (LLess(Arg0, Arg1)) {
		Return (Arg0)
	} Else {
		Return (Arg1)
	}
}

Method(SLEN, 1)
{
	Store(Arg0, Local0)
	Return (Sizeof(Local0))
}

Method(S2BF, 1, Serialized)
{
	Add(SLEN(Arg0), One, Local0)
	Name(BUFF, Buffer(Local0) {})
	Store(Arg0, BUFF)
	Return (BUFF)
}

/*
 * SCMP - Strong string compare
 *
 * Checks both length and content
 */
Method(SCMP, 2)
{
	Store(S2BF(Arg0), Local0)
	Store(S2BF(Arg1), Local1)
	Store(Zero, Local4)
	Store(SLEN(Arg0), Local5)
	Store(SLEN(Arg1), Local6)
	Store(MIN(Local5, Local6), Local7)

	While (LLess(Local4, Local7)) {
		Store(Derefof(Index(Local0, Local4)), Local2)
		Store(Derefof(Index(Local1, Local4)), Local3)
		If (LGreater(Local2, Local3)) {
			Return (One)
		} Else {
			If (LLess(Local2, Local3)) {
				Return (Ones)
			}
		}
		Increment(Local4)
	}

	If (LLess(Local4, Local5)) {
		Return (One)
	} Else {
		If (LLess(Local4, Local6)) {
			Return (Ones)
		} Else {
			Return (Zero)
		}
	}
}

/*
 * WCMP - Weak string compare
 *
 * Checks to find Arg1 at beginning of Arg0.
 * Fails if length(Arg0) < length(Arg1).
 * Returns 0 on fail, 1 on pass.
 */
Method(WCMP, 2)
{
	Store(S2BF(Arg0), Local0)
	Store(S2BF(Arg1), Local1)
	If (LLess(SLEN(Arg0), SLEN(Arg1))) {
		Return (Zero)
	}
	Store(Zero, Local2)
	Store(SLEN(Arg1), Local3)

	While (LLess(Local2, Local3)) {
		If (LNotEqual(Derefof(Index(Local0, Local2)),
			Derefof(Index(Local1, Local2)))) {
			Return (Zero)
		}
		Increment(Local2)
	}

	Return (One)
}

/*
 * I2BM - Returns Bit Map
 *
 * Arg0 = IRQ Number (0-15)
 */
Method(I2BM, 1)
{
	Store(0, Local0)
	If (LNotEqual(Arg0, 0)) {
		Store(1, Local1)
		ShiftLeft(Local1, Arg0, Local0)
	}

	Return (Local0)
}
