xref: /openbmc/qemu/tests/tcg/hexagon/v68_hvx.c (revision 449d6d9eb44772e69f11d002e3c1e2be8a91c350)
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