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