root/tools/testing/selftests/powerpc/math/mma.c
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Test basic matrix multiply assist (MMA) functionality if available.
 *
 * Copyright 2020, Alistair Popple, IBM Corp.
 */
#include <stdio.h>
#include <stdint.h>

#include "utils.h"

extern void test_mma(uint16_t (*)[8], uint16_t (*)[8], uint32_t (*)[4*4]);

static int mma(void)
{
        int i;
        int rc = 0;
        uint16_t x[] = {1, 0, 2, 0, 3, 0, 4, 0};
        uint16_t y[] = {1, 0, 2, 0, 3, 0, 4, 0};
        uint32_t z[4*4];
        uint32_t exp[4*4] = {1, 2, 3, 4,
                             2, 4, 6, 8,
                             3, 6, 9, 12,
                             4, 8, 12, 16};

        SKIP_IF_MSG(!have_hwcap2(PPC_FEATURE2_ARCH_3_1), "Need ISAv3.1");
        SKIP_IF_MSG(!have_hwcap2(PPC_FEATURE2_MMA), "Need MMA");

        test_mma(&x, &y, &z);

        for (i = 0; i < 16; i++) {
                printf("MMA[%d] = %d ", i, z[i]);

                if (z[i] == exp[i]) {
                        printf(" (Correct)\n");
                } else {
                        printf(" (Incorrect)\n");
                        rc = 1;
                }
        }

        return rc;
}

int main(int argc, char *argv[])
{
        return test_harness(mma, "mma");
}