162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Test basic matrix multiply assist (MMA) functionality if available.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2020, Alistair Popple, IBM Corp.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci#include <stdio.h>
862306a36Sopenharmony_ci#include <stdint.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include "utils.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciextern void test_mma(uint16_t (*)[8], uint16_t (*)[8], uint32_t (*)[4*4]);
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistatic int mma(void)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	int i;
1762306a36Sopenharmony_ci	int rc = 0;
1862306a36Sopenharmony_ci	uint16_t x[] = {1, 0, 2, 0, 3, 0, 4, 0};
1962306a36Sopenharmony_ci	uint16_t y[] = {1, 0, 2, 0, 3, 0, 4, 0};
2062306a36Sopenharmony_ci	uint32_t z[4*4];
2162306a36Sopenharmony_ci	uint32_t exp[4*4] = {1, 2, 3, 4,
2262306a36Sopenharmony_ci			     2, 4, 6, 8,
2362306a36Sopenharmony_ci			     3, 6, 9, 12,
2462306a36Sopenharmony_ci			     4, 8, 12, 16};
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	SKIP_IF_MSG(!have_hwcap2(PPC_FEATURE2_ARCH_3_1), "Need ISAv3.1");
2762306a36Sopenharmony_ci	SKIP_IF_MSG(!have_hwcap2(PPC_FEATURE2_MMA), "Need MMA");
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	test_mma(&x, &y, &z);
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	for (i = 0; i < 16; i++) {
3262306a36Sopenharmony_ci		printf("MMA[%d] = %d ", i, z[i]);
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci		if (z[i] == exp[i]) {
3562306a36Sopenharmony_ci			printf(" (Correct)\n");
3662306a36Sopenharmony_ci		} else {
3762306a36Sopenharmony_ci			printf(" (Incorrect)\n");
3862306a36Sopenharmony_ci			rc = 1;
3962306a36Sopenharmony_ci		}
4062306a36Sopenharmony_ci	}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	return rc;
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ciint main(int argc, char *argv[])
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	return test_harness(mma, "mma");
4862306a36Sopenharmony_ci}
49