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