1*d636fb70STaylor Simpson /*
2*d636fb70STaylor Simpson * Copyright(c) 2022-2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
3*d636fb70STaylor Simpson *
4*d636fb70STaylor Simpson * This program is free software; you can redistribute it and/or modify
5*d636fb70STaylor Simpson * it under the terms of the GNU General Public License as published by
6*d636fb70STaylor Simpson * the Free Software Foundation; either version 2 of the License, or
7*d636fb70STaylor Simpson * (at your option) any later version.
8*d636fb70STaylor Simpson *
9*d636fb70STaylor Simpson * This program is distributed in the hope that it will be useful,
10*d636fb70STaylor Simpson * but WITHOUT ANY WARRANTY; without even the implied warranty of
11*d636fb70STaylor Simpson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12*d636fb70STaylor Simpson * GNU General Public License for more details.
13*d636fb70STaylor Simpson *
14*d636fb70STaylor Simpson * You should have received a copy of the GNU General Public License
15*d636fb70STaylor Simpson * along with this program; if not, see <http://www.gnu.org/licenses/>.
16*d636fb70STaylor Simpson */
17*d636fb70STaylor Simpson
18*d636fb70STaylor Simpson #include <stdio.h>
19*d636fb70STaylor Simpson #include <stdint.h>
20*d636fb70STaylor Simpson #include <stdbool.h>
21*d636fb70STaylor Simpson #include <string.h>
22*d636fb70STaylor Simpson #include <limits.h>
23*d636fb70STaylor Simpson
24*d636fb70STaylor Simpson int err;
25*d636fb70STaylor Simpson
26*d636fb70STaylor Simpson #include "hvx_misc.h"
27*d636fb70STaylor Simpson
28*d636fb70STaylor Simpson MMVector v6mpy_buffer0[BUFSIZE] __attribute__((aligned(MAX_VEC_SIZE_BYTES)));
29*d636fb70STaylor Simpson MMVector v6mpy_buffer1[BUFSIZE] __attribute__((aligned(MAX_VEC_SIZE_BYTES)));
30*d636fb70STaylor Simpson
init_v6mpy_buffers(void)31*d636fb70STaylor Simpson static void init_v6mpy_buffers(void)
32*d636fb70STaylor Simpson {
33*d636fb70STaylor Simpson int counter0 = 0;
34*d636fb70STaylor Simpson int counter1 = 17;
35*d636fb70STaylor Simpson for (int i = 0; i < BUFSIZE; i++) {
36*d636fb70STaylor Simpson for (int j = 0; j < MAX_VEC_SIZE_BYTES / 4; j++) {
37*d636fb70STaylor Simpson v6mpy_buffer0[i].w[j] = counter0++;
38*d636fb70STaylor Simpson v6mpy_buffer1[i].w[j] = counter1++;
39*d636fb70STaylor Simpson }
40*d636fb70STaylor Simpson }
41*d636fb70STaylor Simpson }
42*d636fb70STaylor Simpson
43*d636fb70STaylor Simpson int v6mpy_ref[BUFSIZE][MAX_VEC_SIZE_BYTES / 4] = {
44*d636fb70STaylor Simpson #include "v6mpy_ref.c.inc"
45*d636fb70STaylor Simpson };
46*d636fb70STaylor Simpson
test_v6mpy(void)47*d636fb70STaylor Simpson static void test_v6mpy(void)
48*d636fb70STaylor Simpson {
49*d636fb70STaylor Simpson void *p00 = buffer0;
50*d636fb70STaylor Simpson void *p01 = v6mpy_buffer0;
51*d636fb70STaylor Simpson void *p10 = buffer1;
52*d636fb70STaylor Simpson void *p11 = v6mpy_buffer1;
53*d636fb70STaylor Simpson void *pout = output;
54*d636fb70STaylor Simpson
55*d636fb70STaylor Simpson memset(expect, 0xff, sizeof(expect));
56*d636fb70STaylor Simpson memset(output, 0xff, sizeof(expect));
57*d636fb70STaylor Simpson
58*d636fb70STaylor Simpson for (int i = 0; i < BUFSIZE; i++) {
59*d636fb70STaylor Simpson asm("v2 = vmem(%0 + #0)\n\t"
60*d636fb70STaylor Simpson "v3 = vmem(%1 + #0)\n\t"
61*d636fb70STaylor Simpson "v4 = vmem(%2 + #0)\n\t"
62*d636fb70STaylor Simpson "v5 = vmem(%3 + #0)\n\t"
63*d636fb70STaylor Simpson "v5:4.w = v6mpy(v5:4.ub, v3:2.b, #1):v\n\t"
64*d636fb70STaylor Simpson "vmem(%4 + #0) = v4\n\t"
65*d636fb70STaylor Simpson : : "r"(p00), "r"(p01), "r"(p10), "r"(p11), "r"(pout)
66*d636fb70STaylor Simpson : "v2", "v3", "v4", "v5", "memory");
67*d636fb70STaylor Simpson p00 += sizeof(MMVector);
68*d636fb70STaylor Simpson p01 += sizeof(MMVector);
69*d636fb70STaylor Simpson p10 += sizeof(MMVector);
70*d636fb70STaylor Simpson p11 += sizeof(MMVector);
71*d636fb70STaylor Simpson pout += sizeof(MMVector);
72*d636fb70STaylor Simpson
73*d636fb70STaylor Simpson for (int j = 0; j < MAX_VEC_SIZE_BYTES / 4; j++) {
74*d636fb70STaylor Simpson expect[i].w[j] = v6mpy_ref[i][j];
75*d636fb70STaylor Simpson }
76*d636fb70STaylor Simpson }
77*d636fb70STaylor Simpson
78*d636fb70STaylor Simpson check_output_w(__LINE__, BUFSIZE);
79*d636fb70STaylor Simpson }
80*d636fb70STaylor Simpson
main()81*d636fb70STaylor Simpson int main()
82*d636fb70STaylor Simpson {
83*d636fb70STaylor Simpson init_buffers();
84*d636fb70STaylor Simpson init_v6mpy_buffers();
85*d636fb70STaylor Simpson
86*d636fb70STaylor Simpson test_v6mpy();
87*d636fb70STaylor Simpson
88*d636fb70STaylor Simpson puts(err ? "FAIL" : "PASS");
89*d636fb70STaylor Simpson return err ? 1 : 0;
90*d636fb70STaylor Simpson }
91