xref: /openbmc/qemu/tests/tcg/hexagon/hex_test.h (revision 9c9fff18c45b54fd9adf2282323aab1b6f0ec866)
1*0d57cd61STaylor Simpson /*
2*0d57cd61STaylor Simpson  *  Copyright(c) 2022-2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
3*0d57cd61STaylor Simpson  *
4*0d57cd61STaylor Simpson  *  This program is free software; you can redistribute it and/or modify
5*0d57cd61STaylor Simpson  *  it under the terms of the GNU General Public License as published by
6*0d57cd61STaylor Simpson  *  the Free Software Foundation; either version 2 of the License, or
7*0d57cd61STaylor Simpson  *  (at your option) any later version.
8*0d57cd61STaylor Simpson  *
9*0d57cd61STaylor Simpson  *  This program is distributed in the hope that it will be useful,
10*0d57cd61STaylor Simpson  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11*0d57cd61STaylor Simpson  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12*0d57cd61STaylor Simpson  *  GNU General Public License for more details.
13*0d57cd61STaylor Simpson  *
14*0d57cd61STaylor Simpson  *  You should have received a copy of the GNU General Public License
15*0d57cd61STaylor Simpson  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
16*0d57cd61STaylor Simpson  */
17*0d57cd61STaylor Simpson 
18*0d57cd61STaylor Simpson 
19*0d57cd61STaylor Simpson #ifndef HEX_TEST_H
20*0d57cd61STaylor Simpson #define HEX_TEST_H
21*0d57cd61STaylor Simpson 
__check32(int line,uint32_t val,uint32_t expect)22*0d57cd61STaylor Simpson static inline void __check32(int line, uint32_t val, uint32_t expect)
23*0d57cd61STaylor Simpson {
24*0d57cd61STaylor Simpson     if (val != expect) {
25*0d57cd61STaylor Simpson         printf("ERROR at line %d: 0x%08x != 0x%08x\n", line, val, expect);
26*0d57cd61STaylor Simpson         err++;
27*0d57cd61STaylor Simpson     }
28*0d57cd61STaylor Simpson }
29*0d57cd61STaylor Simpson 
30*0d57cd61STaylor Simpson #define check32(RES, EXP) __check32(__LINE__, RES, EXP)
31*0d57cd61STaylor Simpson 
__check64(int line,uint64_t val,uint64_t expect)32*0d57cd61STaylor Simpson static inline void __check64(int line, uint64_t val, uint64_t expect)
33*0d57cd61STaylor Simpson {
34*0d57cd61STaylor Simpson     if (val != expect) {
35*0d57cd61STaylor Simpson         printf("ERROR at line %d: 0x%016llx != 0x%016llx\n", line, val, expect);
36*0d57cd61STaylor Simpson         err++;
37*0d57cd61STaylor Simpson     }
38*0d57cd61STaylor Simpson }
39*0d57cd61STaylor Simpson 
40*0d57cd61STaylor Simpson #define check64(RES, EXP) __check64(__LINE__, RES, EXP)
41*0d57cd61STaylor Simpson 
__chk_error(const char * filename,int line,int ret)42*0d57cd61STaylor Simpson static inline void __chk_error(const char *filename, int line, int ret)
43*0d57cd61STaylor Simpson {
44*0d57cd61STaylor Simpson     if (ret < 0) {
45*0d57cd61STaylor Simpson         printf("ERROR %s:%d - %d\n", filename, line, ret);
46*0d57cd61STaylor Simpson         err++;
47*0d57cd61STaylor Simpson     }
48*0d57cd61STaylor Simpson }
49*0d57cd61STaylor Simpson 
50*0d57cd61STaylor Simpson #define chk_error(ret) __chk_error(__FILE__, __LINE__, (ret))
51*0d57cd61STaylor Simpson 
__checkp(int line,void * p,void * expect)52*0d57cd61STaylor Simpson static inline void __checkp(int line, void *p, void *expect)
53*0d57cd61STaylor Simpson {
54*0d57cd61STaylor Simpson     if (p != expect) {
55*0d57cd61STaylor Simpson         printf("ERROR at line %d: 0x%p != 0x%p\n", line, p, expect);
56*0d57cd61STaylor Simpson         err++;
57*0d57cd61STaylor Simpson     }
58*0d57cd61STaylor Simpson }
59*0d57cd61STaylor Simpson 
60*0d57cd61STaylor Simpson #define checkp(RES, EXP) __checkp(__LINE__, RES, EXP)
61*0d57cd61STaylor Simpson 
__check32_ne(int line,uint32_t val,uint32_t expect)62*0d57cd61STaylor Simpson static inline void __check32_ne(int line, uint32_t val, uint32_t expect)
63*0d57cd61STaylor Simpson {
64*0d57cd61STaylor Simpson     if (val == expect) {
65*0d57cd61STaylor Simpson         printf("ERROR at line %d: 0x%08x == 0x%08x\n", line, val, expect);
66*0d57cd61STaylor Simpson         err++;
67*0d57cd61STaylor Simpson     }
68*0d57cd61STaylor Simpson }
69*0d57cd61STaylor Simpson 
70*0d57cd61STaylor Simpson #define check32_ne(RES, EXP) __check32_ne(__LINE__, RES, EXP)
71*0d57cd61STaylor Simpson 
__check64_ne(int line,uint64_t val,uint64_t expect)72*0d57cd61STaylor Simpson static inline void __check64_ne(int line, uint64_t val, uint64_t expect)
73*0d57cd61STaylor Simpson {
74*0d57cd61STaylor Simpson     if (val == expect) {
75*0d57cd61STaylor Simpson         printf("ERROR at line %d: 0x%016llx == 0x%016llx\n", line, val, expect);
76*0d57cd61STaylor Simpson         err++;
77*0d57cd61STaylor Simpson     }
78*0d57cd61STaylor Simpson }
79*0d57cd61STaylor Simpson 
80*0d57cd61STaylor Simpson #define check64_ne(RES, EXP) __check64_ne(__LINE__, RES, EXP)
81*0d57cd61STaylor Simpson 
82*0d57cd61STaylor Simpson /* Define the bits in Hexagon USR register */
83*0d57cd61STaylor Simpson #define USR_OVF_BIT          0        /* Sticky saturation overflow */
84*0d57cd61STaylor Simpson #define USR_FPINVF_BIT       1        /* IEEE FP invalid sticky flag */
85*0d57cd61STaylor Simpson #define USR_FPDBZF_BIT       2        /* IEEE FP divide-by-zero sticky flag */
86*0d57cd61STaylor Simpson #define USR_FPOVFF_BIT       3        /* IEEE FP overflow sticky flag */
87*0d57cd61STaylor Simpson #define USR_FPUNFF_BIT       4        /* IEEE FP underflow sticky flag */
88*0d57cd61STaylor Simpson #define USR_FPINPF_BIT       5        /* IEEE FP inexact sticky flag */
89*0d57cd61STaylor Simpson 
90*0d57cd61STaylor Simpson /* Corresponding values in USR */
91*0d57cd61STaylor Simpson #define USR_CLEAR            0
92*0d57cd61STaylor Simpson #define USR_OVF              (1 << USR_OVF_BIT)
93*0d57cd61STaylor Simpson #define USR_FPINVF           (1 << USR_FPINVF_BIT)
94*0d57cd61STaylor Simpson #define USR_FPDBZF           (1 << USR_FPDBZF_BIT)
95*0d57cd61STaylor Simpson #define USR_FPOVFF           (1 << USR_FPOVFF_BIT)
96*0d57cd61STaylor Simpson #define USR_FPUNFF           (1 << USR_FPUNFF_BIT)
97*0d57cd61STaylor Simpson #define USR_FPINPF           (1 << USR_FPINPF_BIT)
98*0d57cd61STaylor Simpson 
99*0d57cd61STaylor Simpson /* Clear bits 0-5 in USR */
100*0d57cd61STaylor Simpson #define CLEAR_USRBITS \
101*0d57cd61STaylor Simpson     "r2 = usr\n\t" \
102*0d57cd61STaylor Simpson     "r2 = and(r2, #0xffffffc0)\n\t" \
103*0d57cd61STaylor Simpson     "usr = r2\n\t"
104*0d57cd61STaylor Simpson 
105*0d57cd61STaylor Simpson /* Clear bits 1-5 in USR */
106*0d57cd61STaylor Simpson #define CLEAR_FPSTATUS \
107*0d57cd61STaylor Simpson     "r2 = usr\n\t" \
108*0d57cd61STaylor Simpson     "r2 = and(r2, #0xffffffc1)\n\t" \
109*0d57cd61STaylor Simpson     "usr = r2\n\t"
110*0d57cd61STaylor Simpson 
111*0d57cd61STaylor Simpson /* Some useful floating point values */
112*0d57cd61STaylor Simpson const uint32_t SF_INF =              0x7f800000;
113*0d57cd61STaylor Simpson const uint32_t SF_QNaN =             0x7fc00000;
114*0d57cd61STaylor Simpson const uint32_t SF_QNaN_special =     0x7f800001;
115*0d57cd61STaylor Simpson const uint32_t SF_SNaN =             0x7fb00000;
116*0d57cd61STaylor Simpson const uint32_t SF_QNaN_neg =         0xffc00000;
117*0d57cd61STaylor Simpson const uint32_t SF_SNaN_neg =         0xffb00000;
118*0d57cd61STaylor Simpson const uint32_t SF_HEX_NaN =          0xffffffff;
119*0d57cd61STaylor Simpson const uint32_t SF_zero =             0x00000000;
120*0d57cd61STaylor Simpson const uint32_t SF_zero_neg =         0x80000000;
121*0d57cd61STaylor Simpson const uint32_t SF_one =              0x3f800000;
122*0d57cd61STaylor Simpson const uint32_t SF_one_recip =        0x3f7f0001;         /* 0.9960...  */
123*0d57cd61STaylor Simpson const uint32_t SF_one_invsqrta =     0x3f7f0000;         /* 0.99609375 */
124*0d57cd61STaylor Simpson const uint32_t SF_two =              0x40000000;
125*0d57cd61STaylor Simpson const uint32_t SF_four =             0x40800000;
126*0d57cd61STaylor Simpson const uint32_t SF_small_neg =        0xab98fba8;
127*0d57cd61STaylor Simpson const uint32_t SF_large_pos =        0x5afa572e;
128*0d57cd61STaylor Simpson const uint32_t SF_any =              0x3f800000;
129*0d57cd61STaylor Simpson const uint32_t SF_denorm =           0x00000001;
130*0d57cd61STaylor Simpson const uint32_t SF_random =           0x346001d6;
131*0d57cd61STaylor Simpson 
132*0d57cd61STaylor Simpson const uint64_t DF_QNaN =             0x7ff8000000000000ULL;
133*0d57cd61STaylor Simpson const uint64_t DF_SNaN =             0x7ff7000000000000ULL;
134*0d57cd61STaylor Simpson const uint64_t DF_QNaN_neg =         0xfff8000000000000ULL;
135*0d57cd61STaylor Simpson const uint64_t DF_SNaN_neg =         0xfff7000000000000ULL;
136*0d57cd61STaylor Simpson const uint64_t DF_HEX_NaN =          0xffffffffffffffffULL;
137*0d57cd61STaylor Simpson const uint64_t DF_zero =             0x0000000000000000ULL;
138*0d57cd61STaylor Simpson const uint64_t DF_zero_neg =         0x8000000000000000ULL;
139*0d57cd61STaylor Simpson const uint64_t DF_any =              0x3f80000000000000ULL;
140*0d57cd61STaylor Simpson const uint64_t DF_one =              0x3ff0000000000000ULL;
141*0d57cd61STaylor Simpson const uint64_t DF_one_hh =           0x3ff001ff80000000ULL;     /* 1.00048... */
142*0d57cd61STaylor Simpson const uint64_t DF_small_neg =        0xbd731f7500000000ULL;
143*0d57cd61STaylor Simpson const uint64_t DF_large_pos =        0x7f80000000000001ULL;
144*0d57cd61STaylor Simpson 
145*0d57cd61STaylor Simpson #endif
146