1*99d46107SAleksandar Markovic /*
2*99d46107SAleksandar Markovic  *  Test program for MIPS64R6 instruction NOR
3*99d46107SAleksandar Markovic  *
4*99d46107SAleksandar Markovic  *  Copyright (C) 2019  Wave Computing, Inc.
5*99d46107SAleksandar Markovic  *  Copyright (C) 2019  Aleksandar Markovic <amarkovic@wavecomp.com>
6*99d46107SAleksandar Markovic  *
7*99d46107SAleksandar Markovic  *  This program is free software: you can redistribute it and/or modify
8*99d46107SAleksandar Markovic  *  it under the terms of the GNU General Public License as published by
9*99d46107SAleksandar Markovic  *  the Free Software Foundation, either version 2 of the License, or
10*99d46107SAleksandar Markovic  *  (at your option) any later version.
11*99d46107SAleksandar Markovic  *
12*99d46107SAleksandar Markovic  *  This program is distributed in the hope that it will be useful,
13*99d46107SAleksandar Markovic  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14*99d46107SAleksandar Markovic  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*99d46107SAleksandar Markovic  *  GNU General Public License for more details.
16*99d46107SAleksandar Markovic  *
17*99d46107SAleksandar Markovic  *  You should have received a copy of the GNU General Public License
18*99d46107SAleksandar Markovic  *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
19*99d46107SAleksandar Markovic  *
20*99d46107SAleksandar Markovic  */
21*99d46107SAleksandar Markovic 
22*99d46107SAleksandar Markovic #include <sys/time.h>
23*99d46107SAleksandar Markovic #include <stdint.h>
24*99d46107SAleksandar Markovic 
25*99d46107SAleksandar Markovic #include "../../../../include/wrappers_mips64r6.h"
26*99d46107SAleksandar Markovic #include "../../../../include/test_inputs_64.h"
27*99d46107SAleksandar Markovic #include "../../../../include/test_utils_64.h"
28*99d46107SAleksandar Markovic 
29*99d46107SAleksandar Markovic #define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
30*99d46107SAleksandar Markovic 
31*99d46107SAleksandar Markovic 
32*99d46107SAleksandar Markovic int32_t main(void)
33*99d46107SAleksandar Markovic {
34*99d46107SAleksandar Markovic     char *instruction_name = "NOR";
35*99d46107SAleksandar Markovic     int32_t ret;
36*99d46107SAleksandar Markovic     uint32_t i, j;
37*99d46107SAleksandar Markovic     struct timeval start, end;
38*99d46107SAleksandar Markovic     double elapsed_time;
39*99d46107SAleksandar Markovic 
40*99d46107SAleksandar Markovic     uint64_t b64_result[TEST_COUNT_TOTAL];
41*99d46107SAleksandar Markovic     uint64_t b64_expect[TEST_COUNT_TOTAL] = {
42*99d46107SAleksandar Markovic         0x8000000000000000ULL,                    /*   0  */
43*99d46107SAleksandar Markovic         0xffffffffffffffffULL,
44*99d46107SAleksandar Markovic         0xfffffc0000000000ULL,
45*99d46107SAleksandar Markovic         0xffffffffffe00000ULL,
46*99d46107SAleksandar Markovic         0xfffffffffffff000ULL,
47*99d46107SAleksandar Markovic         0xfff8000000000000ULL,
48*99d46107SAleksandar Markovic         0xffffffffffffc000ULL,
49*99d46107SAleksandar Markovic         0xfffe000000000000ULL,
50*99d46107SAleksandar Markovic         0x0000000000000000ULL,                    /*   8  */
51*99d46107SAleksandar Markovic         0x0000000000000000ULL,
52*99d46107SAleksandar Markovic         0x0000000000000000ULL,
53*99d46107SAleksandar Markovic         0x0000000000000000ULL,
54*99d46107SAleksandar Markovic         0x0000000000000000ULL,
55*99d46107SAleksandar Markovic         0x0000000000000000ULL,
56*99d46107SAleksandar Markovic         0x0000000000000000ULL,
57*99d46107SAleksandar Markovic         0x0000000000000000ULL,
58*99d46107SAleksandar Markovic         0x0000000000000000ULL,                    /*  16  */
59*99d46107SAleksandar Markovic         0xaaaaaaaaaaaaaaaaULL,
60*99d46107SAleksandar Markovic         0xaaaaa80000000000ULL,
61*99d46107SAleksandar Markovic         0x5555555555400000ULL,
62*99d46107SAleksandar Markovic         0xaaaaaaaaaaaaa000ULL,
63*99d46107SAleksandar Markovic         0x5550000000000000ULL,
64*99d46107SAleksandar Markovic         0xaaaaaaaaaaaa8000ULL,
65*99d46107SAleksandar Markovic         0x5554000000000000ULL,
66*99d46107SAleksandar Markovic         0x8000000000000000ULL,                    /*  24  */
67*99d46107SAleksandar Markovic         0x5555555555555555ULL,
68*99d46107SAleksandar Markovic         0x5555540000000000ULL,
69*99d46107SAleksandar Markovic         0xaaaaaaaaaaa00000ULL,
70*99d46107SAleksandar Markovic         0x5555555555555000ULL,
71*99d46107SAleksandar Markovic         0xaaa8000000000000ULL,
72*99d46107SAleksandar Markovic         0x5555555555554000ULL,
73*99d46107SAleksandar Markovic         0xaaaa000000000000ULL,
74*99d46107SAleksandar Markovic         0x0000000000000000ULL,                    /*  32  */
75*99d46107SAleksandar Markovic         0xccccccccccccccccULL,
76*99d46107SAleksandar Markovic         0x3333300000000000ULL,
77*99d46107SAleksandar Markovic         0x9999999999800000ULL,
78*99d46107SAleksandar Markovic         0xccccccccccccc000ULL,
79*99d46107SAleksandar Markovic         0x6660000000000000ULL,
80*99d46107SAleksandar Markovic         0x3333333333330000ULL,
81*99d46107SAleksandar Markovic         0x9998000000000000ULL,
82*99d46107SAleksandar Markovic         0x8000000000000000ULL,                    /*  40  */
83*99d46107SAleksandar Markovic         0x3333333333333333ULL,
84*99d46107SAleksandar Markovic         0xcccccc0000000000ULL,
85*99d46107SAleksandar Markovic         0x6666666666600000ULL,
86*99d46107SAleksandar Markovic         0x3333333333333000ULL,
87*99d46107SAleksandar Markovic         0x9998000000000000ULL,
88*99d46107SAleksandar Markovic         0xccccccccccccc000ULL,
89*99d46107SAleksandar Markovic         0x6666000000000000ULL,
90*99d46107SAleksandar Markovic         0x0000000000000000ULL,                    /*  48  */
91*99d46107SAleksandar Markovic         0xe38e38e38e38e38eULL,
92*99d46107SAleksandar Markovic         0xe38e380000000000ULL,
93*99d46107SAleksandar Markovic         0x1c71c71c71c00000ULL,
94*99d46107SAleksandar Markovic         0xe38e38e38e38e000ULL,
95*99d46107SAleksandar Markovic         0x1c70000000000000ULL,
96*99d46107SAleksandar Markovic         0x8e38e38e38e38000ULL,
97*99d46107SAleksandar Markovic         0xc71c000000000000ULL,
98*99d46107SAleksandar Markovic         0x8000000000000000ULL,                    /*  56  */
99*99d46107SAleksandar Markovic         0x1c71c71c71c71c71ULL,
100*99d46107SAleksandar Markovic         0x1c71c40000000000ULL,
101*99d46107SAleksandar Markovic         0xe38e38e38e200000ULL,
102*99d46107SAleksandar Markovic         0x1c71c71c71c71000ULL,
103*99d46107SAleksandar Markovic         0xe388000000000000ULL,
104*99d46107SAleksandar Markovic         0x71c71c71c71c4000ULL,
105*99d46107SAleksandar Markovic         0x38e2000000000000ULL,
106*99d46107SAleksandar Markovic         0x886ae6cc28625540ULL,                    /*  64  */
107*99d46107SAleksandar Markovic         0x6ae6cc2862554000ULL,
108*99d46107SAleksandar Markovic         0x886ae6cc28625540ULL,
109*99d46107SAleksandar Markovic         0xb9b30a1895500000ULL,
110*99d46107SAleksandar Markovic         0xfbbe00634d93c708ULL,
111*99d46107SAleksandar Markovic         0xbe00634d93c70800ULL,
112*99d46107SAleksandar Markovic         0xfbbe00634d93c708ULL,
113*99d46107SAleksandar Markovic         0x8018d364f1c20000ULL,
114*99d46107SAleksandar Markovic         0xac5aaeaab9cf8b80ULL,                    /*  72  */
115*99d46107SAleksandar Markovic         0x5aaeaab9cf8b8000ULL,
116*99d46107SAleksandar Markovic         0xac5aaeaab9cf8b80ULL,
117*99d46107SAleksandar Markovic         0xabaaae73e2e00000ULL,
118*99d46107SAleksandar Markovic         0x704f164d5e31e24eULL,
119*99d46107SAleksandar Markovic         0x4f164d5e31e24e00ULL,
120*99d46107SAleksandar Markovic         0x704f164d5e31e24eULL,
121*99d46107SAleksandar Markovic         0xc593578c78938000ULL,
122*99d46107SAleksandar Markovic     };
123*99d46107SAleksandar Markovic 
124*99d46107SAleksandar Markovic     gettimeofday(&start, NULL);
125*99d46107SAleksandar Markovic 
126*99d46107SAleksandar Markovic     for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
127*99d46107SAleksandar Markovic         for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
128*99d46107SAleksandar Markovic             do_mips64r6_NOR(b64_pattern + i, b64_pattern + j,
129*99d46107SAleksandar Markovic                 b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
130*99d46107SAleksandar Markovic         }
131*99d46107SAleksandar Markovic     }
132*99d46107SAleksandar Markovic 
133*99d46107SAleksandar Markovic     for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
134*99d46107SAleksandar Markovic         for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
135*99d46107SAleksandar Markovic             do_mips64r6_NOR(b64_random + i, b64_random + j,
136*99d46107SAleksandar Markovic                 b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
137*99d46107SAleksandar Markovic                                (PATTERN_INPUTS_64_SHORT_COUNT)) +
138*99d46107SAleksandar Markovic                               RANDOM_INPUTS_64_SHORT_COUNT * i + j));
139*99d46107SAleksandar Markovic         }
140*99d46107SAleksandar Markovic     }
141*99d46107SAleksandar Markovic 
142*99d46107SAleksandar Markovic     gettimeofday(&end, NULL);
143*99d46107SAleksandar Markovic 
144*99d46107SAleksandar Markovic     elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
145*99d46107SAleksandar Markovic     elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
146*99d46107SAleksandar Markovic 
147*99d46107SAleksandar Markovic     ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time,
148*99d46107SAleksandar Markovic                            b64_result, b64_expect);
149*99d46107SAleksandar Markovic 
150*99d46107SAleksandar Markovic     return ret;
151*99d46107SAleksandar Markovic }
152