// SPDX-License-Identifier: GPL-2.0-or-later OR Apache-2.0
/*
 * Test cases for __ashldi3(), __ashrdi3(), and __lshrdi3().
 */

#include <linux/array_size.h>
#include <linux/module.h>
#include <linux/libgcc.h>
#include <kunit/test.h>

struct shdi3_test_entry {
	long long input;
	int shift;
	long long result;
};

static const struct shdi3_test_entry ashldi3_testdata[] = {
	/* https://github.com/llvm/llvm-project/compiler-rt/test/builtins/Unit/ashldi3_test.c */
	{ 0x0123456789ABCDEFLL, 0, 0x123456789ABCDEFLL },
	{ 0x0123456789ABCDEFLL, 1, 0x2468ACF13579BDELL },
	{ 0x0123456789ABCDEFLL, 2, 0x48D159E26AF37BCLL },
	{ 0x0123456789ABCDEFLL, 3, 0x91A2B3C4D5E6F78LL },
	{ 0x0123456789ABCDEFLL, 4, 0x123456789ABCDEF0LL },
	{ 0x0123456789ABCDEFLL, 28, 0x789ABCDEF0000000LL },
	{ 0x0123456789ABCDEFLL, 29, 0xF13579BDE0000000LL },
	{ 0x0123456789ABCDEFLL, 30, 0xE26AF37BC0000000LL },
	{ 0x0123456789ABCDEFLL, 31, 0xC4D5E6F780000000LL },
	{ 0x0123456789ABCDEFLL, 32, 0x89ABCDEF00000000LL },
	{ 0x0123456789ABCDEFLL, 33, 0x13579BDE00000000LL },
	{ 0x0123456789ABCDEFLL, 34, 0x26AF37BC00000000LL },
	{ 0x0123456789ABCDEFLL, 35, 0x4D5E6F7800000000LL },
	{ 0x0123456789ABCDEFLL, 36, 0x9ABCDEF000000000LL },
	{ 0x0123456789ABCDEFLL, 60, 0xF000000000000000LL },
	{ 0x0123456789ABCDEFLL, 61, 0xE000000000000000LL },
	{ 0x0123456789ABCDEFLL, 62, 0xC000000000000000LL },
	{ 0x0123456789ABCDEFLL, 63, 0x8000000000000000LL },
};

static void shdi3_test_ashldi3(struct kunit *test)
{
	const struct shdi3_test_entry *e;
	long long ret;

	for (e = ashldi3_testdata;
	     e < ashldi3_testdata + ARRAY_SIZE(ashldi3_testdata); e++) {
		ret = __ashldi3(e->input, e->shift);
		KUNIT_EXPECT_EQ_MSG(test, ret, e->result,
				    "    when evaluating __ashldi3(%lld, %d)",
				    e->input, e->shift);
	}
}

static const struct shdi3_test_entry ashrdi3_testdata[] = {
	/* https://github.com/llvm/llvm-project/compiler-rt/test/builtins/Unit/ashrdi3_test.c */
	{ 0x0123456789ABCDEFLL, 0, 0x123456789ABCDEFLL },
	{ 0x0123456789ABCDEFLL, 1, 0x91A2B3C4D5E6F7LL },
	{ 0x0123456789ABCDEFLL, 2, 0x48D159E26AF37BLL },
	{ 0x0123456789ABCDEFLL, 3, 0x2468ACF13579BDLL },
	{ 0x0123456789ABCDEFLL, 4, 0x123456789ABCDELL },
	{ 0x0123456789ABCDEFLL, 28, 0x12345678LL },
	{ 0x0123456789ABCDEFLL, 29, 0x91A2B3CLL },
	{ 0x0123456789ABCDEFLL, 30, 0x48D159ELL },
	{ 0x0123456789ABCDEFLL, 31, 0x2468ACFLL },
	{ 0x0123456789ABCDEFLL, 32, 0x1234567LL },
	{ 0x0123456789ABCDEFLL, 33, 0x91A2B3LL },
	{ 0x0123456789ABCDEFLL, 34, 0x48D159LL },
	{ 0x0123456789ABCDEFLL, 35, 0x2468ACLL },
	{ 0x0123456789ABCDEFLL, 36, 0x123456LL },
	{ 0x0123456789ABCDEFLL, 60, 0 },
	{ 0x0123456789ABCDEFLL, 61, 0 },
	{ 0x0123456789ABCDEFLL, 62, 0 },
	{ 0x0123456789ABCDEFLL, 63, 0 },
	{ 0xFEDCBA9876543210LL, 0, 0xFEDCBA9876543210LL },
	{ 0xFEDCBA9876543210LL, 1, 0xFF6E5D4C3B2A1908LL },
	{ 0xFEDCBA9876543210LL, 2, 0xFFB72EA61D950C84LL },
	{ 0xFEDCBA9876543210LL, 3, 0xFFDB97530ECA8642LL },
	{ 0xFEDCBA9876543210LL, 4, 0xFFEDCBA987654321LL },
	{ 0xFEDCBA9876543210LL, 28, 0xFFFFFFFFEDCBA987LL },
	{ 0xFEDCBA9876543210LL, 29, 0xFFFFFFFFF6E5D4C3LL },
	{ 0xFEDCBA9876543210LL, 30, 0xFFFFFFFFFB72EA61LL },
	{ 0xFEDCBA9876543210LL, 31, 0xFFFFFFFFFDB97530LL },
	{ 0xFEDCBA9876543210LL, 32, 0xFFFFFFFFFEDCBA98LL },
	{ 0xFEDCBA9876543210LL, 33, 0xFFFFFFFFFF6E5D4CLL },
	{ 0xFEDCBA9876543210LL, 34, 0xFFFFFFFFFFB72EA6LL },
	{ 0xFEDCBA9876543210LL, 35, 0xFFFFFFFFFFDB9753LL },
	{ 0xFEDCBA9876543210LL, 36, 0xFFFFFFFFFFEDCBA9LL },
	{ 0xAEDCBA9876543210LL, 60, 0xFFFFFFFFFFFFFFFALL },
	{ 0xAEDCBA9876543210LL, 61, 0xFFFFFFFFFFFFFFFDLL },
	{ 0xAEDCBA9876543210LL, 62, 0xFFFFFFFFFFFFFFFELL },
	{ 0xAEDCBA9876543210LL, 63, 0xFFFFFFFFFFFFFFFFLL },
};

static void shdi3_test_ashrdi3(struct kunit *test)
{
	const struct shdi3_test_entry *e;
	long long ret;

	for (e = ashrdi3_testdata;
	     e < ashrdi3_testdata + ARRAY_SIZE(ashrdi3_testdata); e++) {
		ret = __ashrdi3(e->input, e->shift);
		KUNIT_EXPECT_EQ_MSG(test, ret, e->result,
				    "    when evaluating __ashrdi3(%lld, %d)",
				    e->input, e->shift);
	}
}

static const struct shdi3_test_entry lshrdi3_testdata[] = {
	/* https://github.com/llvm/llvm-project/compiler-rt/test/builtins/Unit/lshrdi3_test.c */
	{ 0x0123456789ABCDEFLL, 0, 0x123456789ABCDEFLL },
	{ 0x0123456789ABCDEFLL, 1, 0x91A2B3C4D5E6F7LL },
	{ 0x0123456789ABCDEFLL, 2, 0x48D159E26AF37BLL },
	{ 0x0123456789ABCDEFLL, 3, 0x2468ACF13579BDLL },
	{ 0x0123456789ABCDEFLL, 4, 0x123456789ABCDELL },
	{ 0x0123456789ABCDEFLL, 28, 0x12345678LL },
	{ 0x0123456789ABCDEFLL, 29, 0x91A2B3CLL },
	{ 0x0123456789ABCDEFLL, 30, 0x48D159ELL },
	{ 0x0123456789ABCDEFLL, 31, 0x2468ACFLL },
	{ 0x0123456789ABCDEFLL, 32, 0x1234567LL },
	{ 0x0123456789ABCDEFLL, 33, 0x91A2B3LL },
	{ 0x0123456789ABCDEFLL, 34, 0x48D159LL },
	{ 0x0123456789ABCDEFLL, 35, 0x2468ACLL },
	{ 0x0123456789ABCDEFLL, 36, 0x123456LL },
	{ 0x0123456789ABCDEFLL, 60, 0 },
	{ 0x0123456789ABCDEFLL, 61, 0 },
	{ 0x0123456789ABCDEFLL, 62, 0 },
	{ 0x0123456789ABCDEFLL, 63, 0 },
	{ 0xFEDCBA9876543210LL, 0, 0xFEDCBA9876543210LL },
	{ 0xFEDCBA9876543210LL, 1, 0x7F6E5D4C3B2A1908LL },
	{ 0xFEDCBA9876543210LL, 2, 0x3FB72EA61D950C84LL },
	{ 0xFEDCBA9876543210LL, 3, 0x1FDB97530ECA8642LL },
	{ 0xFEDCBA9876543210LL, 4, 0xFEDCBA987654321LL },
	{ 0xFEDCBA9876543210LL, 28, 0xFEDCBA987LL },
	{ 0xFEDCBA9876543210LL, 29, 0x7F6E5D4C3LL },
	{ 0xFEDCBA9876543210LL, 30, 0x3FB72EA61LL },
	{ 0xFEDCBA9876543210LL, 31, 0x1FDB97530LL },
	{ 0xFEDCBA9876543210LL, 32, 0xFEDCBA98LL },
	{ 0xFEDCBA9876543210LL, 33, 0x7F6E5D4CLL },
	{ 0xFEDCBA9876543210LL, 34, 0x3FB72EA6LL },
	{ 0xFEDCBA9876543210LL, 35, 0x1FDB9753LL },
	{ 0xFEDCBA9876543210LL, 36, 0xFEDCBA9LL },
	{ 0xAEDCBA9876543210LL, 60, 0xALL },
	{ 0xAEDCBA9876543210LL, 61, 0x5LL },
	{ 0xAEDCBA9876543210LL, 62, 0x2LL },
	{ 0xAEDCBA9876543210LL, 63, 0x1LL },
};

static void shdi3_test_lshrdi3(struct kunit *test)
{
	const struct shdi3_test_entry *e;
	long long ret;

	for (e = lshrdi3_testdata;
	     e < lshrdi3_testdata + ARRAY_SIZE(lshrdi3_testdata); e++) {
		ret = __lshrdi3(e->input, e->shift);
		KUNIT_EXPECT_EQ_MSG(test, ret, e->result,
				    "    when evaluating __lshrdi3(%lld, %d)",
				    e->input, e->shift);
	}
}

static struct kunit_case shdi3_test_cases[] = {
	KUNIT_CASE(shdi3_test_ashldi3),
	KUNIT_CASE(shdi3_test_ashrdi3),
	KUNIT_CASE(shdi3_test_lshrdi3),
	{}
};

static struct kunit_suite shdi3_test_suite = {
	.name = "shdi3",
	.test_cases = shdi3_test_cases,
};
kunit_test_suite(shdi3_test_suite);

MODULE_DESCRIPTION("Test cases for __ashldi3(), __ashrdi3(), and __lshrdi3()");
MODULE_LICENSE("GPL");
