1825d6ebaSTaylor Simpson /*
2a5258481STaylor Simpson * Copyright(c) 2019-2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
3825d6ebaSTaylor Simpson *
4825d6ebaSTaylor Simpson * This program is free software; you can redistribute it and/or modify
5825d6ebaSTaylor Simpson * it under the terms of the GNU General Public License as published by
6825d6ebaSTaylor Simpson * the Free Software Foundation; either version 2 of the License, or
7825d6ebaSTaylor Simpson * (at your option) any later version.
8825d6ebaSTaylor Simpson *
9825d6ebaSTaylor Simpson * This program is distributed in the hope that it will be useful,
10825d6ebaSTaylor Simpson * but WITHOUT ANY WARRANTY; without even the implied warranty of
11825d6ebaSTaylor Simpson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12825d6ebaSTaylor Simpson * GNU General Public License for more details.
13825d6ebaSTaylor Simpson *
14825d6ebaSTaylor Simpson * You should have received a copy of the GNU General Public License
15825d6ebaSTaylor Simpson * along with this program; if not, see <http://www.gnu.org/licenses/>.
16825d6ebaSTaylor Simpson */
17825d6ebaSTaylor Simpson
18825d6ebaSTaylor Simpson #include <stdio.h>
19*0d57cd61STaylor Simpson #include <stdint.h>
20*0d57cd61STaylor Simpson #include <stdbool.h>
21825d6ebaSTaylor Simpson #include <string.h>
22825d6ebaSTaylor Simpson
23*0d57cd61STaylor Simpson int err;
24*0d57cd61STaylor Simpson
25*0d57cd61STaylor Simpson #include "hex_test.h"
26*0d57cd61STaylor Simpson
27fc2622f6STaylor Simpson #define CORE_HAS_CABAC (__HEXAGON_ARCH__ <= 71)
28fc2622f6STaylor Simpson
S4_storerhnew_rr(void * p,int index,uint16_t v)29825d6ebaSTaylor Simpson static inline void S4_storerhnew_rr(void *p, int index, uint16_t v)
30825d6ebaSTaylor Simpson {
31825d6ebaSTaylor Simpson asm volatile("{\n\t"
32825d6ebaSTaylor Simpson " r0 = %0\n\n"
33825d6ebaSTaylor Simpson " memh(%1+%2<<#2) = r0.new\n\t"
34825d6ebaSTaylor Simpson "}\n"
35825d6ebaSTaylor Simpson :: "r"(v), "r"(p), "r"(index)
36825d6ebaSTaylor Simpson : "r0", "memory");
37825d6ebaSTaylor Simpson }
38825d6ebaSTaylor Simpson
39825d6ebaSTaylor Simpson static uint32_t data;
S4_storerbnew_ap(uint8_t v)40825d6ebaSTaylor Simpson static inline void *S4_storerbnew_ap(uint8_t v)
41825d6ebaSTaylor Simpson {
42825d6ebaSTaylor Simpson void *ret;
43825d6ebaSTaylor Simpson asm volatile("{\n\t"
44825d6ebaSTaylor Simpson " r0 = %1\n\n"
45825d6ebaSTaylor Simpson " memb(%0 = ##data) = r0.new\n\t"
46825d6ebaSTaylor Simpson "}\n"
47825d6ebaSTaylor Simpson : "=r"(ret)
48825d6ebaSTaylor Simpson : "r"(v)
49825d6ebaSTaylor Simpson : "r0", "memory");
50825d6ebaSTaylor Simpson return ret;
51825d6ebaSTaylor Simpson }
52825d6ebaSTaylor Simpson
S4_storerhnew_ap(uint16_t v)53825d6ebaSTaylor Simpson static inline void *S4_storerhnew_ap(uint16_t v)
54825d6ebaSTaylor Simpson {
55825d6ebaSTaylor Simpson void *ret;
56825d6ebaSTaylor Simpson asm volatile("{\n\t"
57825d6ebaSTaylor Simpson " r0 = %1\n\n"
58825d6ebaSTaylor Simpson " memh(%0 = ##data) = r0.new\n\t"
59825d6ebaSTaylor Simpson "}\n"
60825d6ebaSTaylor Simpson : "=r"(ret)
61825d6ebaSTaylor Simpson : "r"(v)
62825d6ebaSTaylor Simpson : "r0", "memory");
63825d6ebaSTaylor Simpson return ret;
64825d6ebaSTaylor Simpson }
65825d6ebaSTaylor Simpson
S4_storerinew_ap(uint32_t v)66825d6ebaSTaylor Simpson static inline void *S4_storerinew_ap(uint32_t v)
67825d6ebaSTaylor Simpson {
68825d6ebaSTaylor Simpson void *ret;
69825d6ebaSTaylor Simpson asm volatile("{\n\t"
70825d6ebaSTaylor Simpson " r0 = %1\n\n"
71825d6ebaSTaylor Simpson " memw(%0 = ##data) = r0.new\n\t"
72825d6ebaSTaylor Simpson "}\n"
73825d6ebaSTaylor Simpson : "=r"(ret)
74825d6ebaSTaylor Simpson : "r"(v)
75825d6ebaSTaylor Simpson : "r0", "memory");
76825d6ebaSTaylor Simpson return ret;
77825d6ebaSTaylor Simpson }
78825d6ebaSTaylor Simpson
S4_storeirbt_io(void * p,bool pred)79*0d57cd61STaylor Simpson static inline void S4_storeirbt_io(void *p, bool pred)
80825d6ebaSTaylor Simpson {
81825d6ebaSTaylor Simpson asm volatile("p0 = cmp.eq(%0, #1)\n\t"
82825d6ebaSTaylor Simpson "if (p0) memb(%1+#4)=#27\n\t"
83825d6ebaSTaylor Simpson :: "r"(pred), "r"(p)
84825d6ebaSTaylor Simpson : "p0", "memory");
85825d6ebaSTaylor Simpson }
86825d6ebaSTaylor Simpson
S4_storeirbf_io(void * p,bool pred)87*0d57cd61STaylor Simpson static inline void S4_storeirbf_io(void *p, bool pred)
88825d6ebaSTaylor Simpson {
89825d6ebaSTaylor Simpson asm volatile("p0 = cmp.eq(%0, #1)\n\t"
90825d6ebaSTaylor Simpson "if (!p0) memb(%1+#4)=#27\n\t"
91825d6ebaSTaylor Simpson :: "r"(pred), "r"(p)
92825d6ebaSTaylor Simpson : "p0", "memory");
93825d6ebaSTaylor Simpson }
94825d6ebaSTaylor Simpson
S4_storeirbtnew_io(void * p,bool pred)95*0d57cd61STaylor Simpson static inline void S4_storeirbtnew_io(void *p, bool pred)
96825d6ebaSTaylor Simpson {
97825d6ebaSTaylor Simpson asm volatile("{\n\t"
98825d6ebaSTaylor Simpson " p0 = cmp.eq(%0, #1)\n\t"
99825d6ebaSTaylor Simpson " if (p0.new) memb(%1+#4)=#27\n\t"
100825d6ebaSTaylor Simpson "}\n\t"
101825d6ebaSTaylor Simpson :: "r"(pred), "r"(p)
102825d6ebaSTaylor Simpson : "p0", "memory");
103825d6ebaSTaylor Simpson }
104825d6ebaSTaylor Simpson
S4_storeirbfnew_io(void * p,bool pred)105*0d57cd61STaylor Simpson static inline void S4_storeirbfnew_io(void *p, bool pred)
106825d6ebaSTaylor Simpson {
107825d6ebaSTaylor Simpson asm volatile("{\n\t"
108825d6ebaSTaylor Simpson " p0 = cmp.eq(%0, #1)\n\t"
109825d6ebaSTaylor Simpson " if (!p0.new) memb(%1+#4)=#27\n\t"
110825d6ebaSTaylor Simpson "}\n\t"
111825d6ebaSTaylor Simpson :: "r"(pred), "r"(p)
112825d6ebaSTaylor Simpson : "p0", "memory");
113825d6ebaSTaylor Simpson }
114825d6ebaSTaylor Simpson
S4_storeirht_io(void * p,bool pred)115*0d57cd61STaylor Simpson static inline void S4_storeirht_io(void *p, bool pred)
116825d6ebaSTaylor Simpson {
117825d6ebaSTaylor Simpson asm volatile("p0 = cmp.eq(%0, #1)\n\t"
118825d6ebaSTaylor Simpson "if (p0) memh(%1+#4)=#27\n\t"
119825d6ebaSTaylor Simpson :: "r"(pred), "r"(p)
120825d6ebaSTaylor Simpson : "p0", "memory");
121825d6ebaSTaylor Simpson }
122825d6ebaSTaylor Simpson
S4_storeirhf_io(void * p,bool pred)123*0d57cd61STaylor Simpson static inline void S4_storeirhf_io(void *p, bool pred)
124825d6ebaSTaylor Simpson {
125825d6ebaSTaylor Simpson asm volatile("p0 = cmp.eq(%0, #1)\n\t"
126825d6ebaSTaylor Simpson "if (!p0) memh(%1+#4)=#27\n\t"
127825d6ebaSTaylor Simpson :: "r"(pred), "r"(p)
128825d6ebaSTaylor Simpson : "p0", "memory");
129825d6ebaSTaylor Simpson }
130825d6ebaSTaylor Simpson
S4_storeirhtnew_io(void * p,bool pred)131*0d57cd61STaylor Simpson static inline void S4_storeirhtnew_io(void *p, bool pred)
132825d6ebaSTaylor Simpson {
133825d6ebaSTaylor Simpson asm volatile("{\n\t"
134825d6ebaSTaylor Simpson " p0 = cmp.eq(%0, #1)\n\t"
135825d6ebaSTaylor Simpson " if (p0.new) memh(%1+#4)=#27\n\t"
136825d6ebaSTaylor Simpson "}\n\t"
137825d6ebaSTaylor Simpson :: "r"(pred), "r"(p)
138825d6ebaSTaylor Simpson : "p0", "memory");
139825d6ebaSTaylor Simpson }
140825d6ebaSTaylor Simpson
S4_storeirhfnew_io(void * p,bool pred)141*0d57cd61STaylor Simpson static inline void S4_storeirhfnew_io(void *p, bool pred)
142825d6ebaSTaylor Simpson {
143825d6ebaSTaylor Simpson asm volatile("{\n\t"
144825d6ebaSTaylor Simpson " p0 = cmp.eq(%0, #1)\n\t"
145825d6ebaSTaylor Simpson " if (!p0.new) memh(%1+#4)=#27\n\t"
146825d6ebaSTaylor Simpson "}\n\t"
147825d6ebaSTaylor Simpson :: "r"(pred), "r"(p)
148825d6ebaSTaylor Simpson : "p0", "memory");
149825d6ebaSTaylor Simpson }
150825d6ebaSTaylor Simpson
S4_storeirit_io(void * p,bool pred)151*0d57cd61STaylor Simpson static inline void S4_storeirit_io(void *p, bool pred)
152825d6ebaSTaylor Simpson {
153825d6ebaSTaylor Simpson asm volatile("p0 = cmp.eq(%0, #1)\n\t"
154825d6ebaSTaylor Simpson "if (p0) memw(%1+#4)=#27\n\t"
155825d6ebaSTaylor Simpson :: "r"(pred), "r"(p)
156825d6ebaSTaylor Simpson : "p0", "memory");
157825d6ebaSTaylor Simpson }
158825d6ebaSTaylor Simpson
S4_storeirif_io(void * p,bool pred)159*0d57cd61STaylor Simpson static inline void S4_storeirif_io(void *p, bool pred)
160825d6ebaSTaylor Simpson {
161825d6ebaSTaylor Simpson asm volatile("p0 = cmp.eq(%0, #1)\n\t"
162825d6ebaSTaylor Simpson "if (!p0) memw(%1+#4)=#27\n\t"
163825d6ebaSTaylor Simpson :: "r"(pred), "r"(p)
164825d6ebaSTaylor Simpson : "p0", "memory");
165825d6ebaSTaylor Simpson }
166825d6ebaSTaylor Simpson
S4_storeiritnew_io(void * p,bool pred)167*0d57cd61STaylor Simpson static inline void S4_storeiritnew_io(void *p, bool pred)
168825d6ebaSTaylor Simpson {
169825d6ebaSTaylor Simpson asm volatile("{\n\t"
170825d6ebaSTaylor Simpson " p0 = cmp.eq(%0, #1)\n\t"
171825d6ebaSTaylor Simpson " if (p0.new) memw(%1+#4)=#27\n\t"
172825d6ebaSTaylor Simpson "}\n\t"
173825d6ebaSTaylor Simpson :: "r"(pred), "r"(p)
174825d6ebaSTaylor Simpson : "p0", "memory");
175825d6ebaSTaylor Simpson }
176825d6ebaSTaylor Simpson
S4_storeirifnew_io(void * p,bool pred)177*0d57cd61STaylor Simpson static inline void S4_storeirifnew_io(void *p, bool pred)
178825d6ebaSTaylor Simpson {
179825d6ebaSTaylor Simpson asm volatile("{\n\t"
180825d6ebaSTaylor Simpson " p0 = cmp.eq(%0, #1)\n\t"
181825d6ebaSTaylor Simpson " if (!p0.new) memw(%1+#4)=#27\n\t"
182825d6ebaSTaylor Simpson "}\n\t"
183825d6ebaSTaylor Simpson :: "r"(pred), "r"(p)
184825d6ebaSTaylor Simpson : "p0", "memory");
185825d6ebaSTaylor Simpson }
186825d6ebaSTaylor Simpson
L2_ploadrifnew_pi(void * p,bool pred)187*0d57cd61STaylor Simpson static int32_t L2_ploadrifnew_pi(void *p, bool pred)
18807c0f653STaylor Simpson {
189*0d57cd61STaylor Simpson int32_t result;
19007c0f653STaylor Simpson asm volatile("%0 = #31\n\t"
19107c0f653STaylor Simpson "{\n\t"
192eaee3b6fSMukilan Thiyagarajan " p0 = cmp.eq(%2, #1)\n\t"
193eaee3b6fSMukilan Thiyagarajan " if (!p0.new) %0 = memw(%1++#4)\n\t"
19407c0f653STaylor Simpson "}\n\t"
195eaee3b6fSMukilan Thiyagarajan : "=&r"(result), "+r"(p) : "r"(pred)
19607c0f653STaylor Simpson : "p0");
19707c0f653STaylor Simpson return result;
19807c0f653STaylor Simpson }
19907c0f653STaylor Simpson
200825d6ebaSTaylor Simpson /*
201825d6ebaSTaylor Simpson * Test that compound-compare-jump is executed in 2 parts
202825d6ebaSTaylor Simpson * First we have to do all the compares in the packet and
203825d6ebaSTaylor Simpson * account for auto-anding. Then, we can do the predicated
204825d6ebaSTaylor Simpson * jump.
205825d6ebaSTaylor Simpson */
cmpnd_cmp_jump(void)206*0d57cd61STaylor Simpson static inline int32_t cmpnd_cmp_jump(void)
207825d6ebaSTaylor Simpson {
208*0d57cd61STaylor Simpson int32_t retval;
209825d6ebaSTaylor Simpson asm ("r5 = #7\n\t"
210825d6ebaSTaylor Simpson "r6 = #9\n\t"
211825d6ebaSTaylor Simpson "{\n\t"
212825d6ebaSTaylor Simpson " p0 = cmp.eq(r5, #7)\n\t"
213825d6ebaSTaylor Simpson " if (p0.new) jump:nt 1f\n\t"
214825d6ebaSTaylor Simpson " p0 = cmp.eq(r6, #7)\n\t"
215825d6ebaSTaylor Simpson "}\n\t"
216825d6ebaSTaylor Simpson "%0 = #12\n\t"
217825d6ebaSTaylor Simpson "jump 2f\n\t"
218825d6ebaSTaylor Simpson "1:\n\t"
219825d6ebaSTaylor Simpson "%0 = #13\n\t"
220825d6ebaSTaylor Simpson "2:\n\t"
221825d6ebaSTaylor Simpson : "=r"(retval) :: "r5", "r6", "p0");
222825d6ebaSTaylor Simpson return retval;
223825d6ebaSTaylor Simpson }
224825d6ebaSTaylor Simpson
test_clrtnew(int32_t arg1,int32_t old_val)225*0d57cd61STaylor Simpson static inline int32_t test_clrtnew(int32_t arg1, int32_t old_val)
226825d6ebaSTaylor Simpson {
227*0d57cd61STaylor Simpson int32_t ret;
228825d6ebaSTaylor Simpson asm volatile("r5 = %2\n\t"
229825d6ebaSTaylor Simpson "{\n\t"
230825d6ebaSTaylor Simpson "p0 = cmp.eq(%1, #1)\n\t"
231825d6ebaSTaylor Simpson "if (p0.new) r5=#0\n\t"
232825d6ebaSTaylor Simpson "}\n\t"
233825d6ebaSTaylor Simpson "%0 = r5\n\t"
234825d6ebaSTaylor Simpson : "=r"(ret)
235825d6ebaSTaylor Simpson : "r"(arg1), "r"(old_val)
236825d6ebaSTaylor Simpson : "p0", "r5");
237825d6ebaSTaylor Simpson return ret;
238825d6ebaSTaylor Simpson }
239825d6ebaSTaylor Simpson
240825d6ebaSTaylor Simpson uint32_t init[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
241825d6ebaSTaylor Simpson uint32_t array[10];
242825d6ebaSTaylor Simpson
243*0d57cd61STaylor Simpson bool early_exit;
244825d6ebaSTaylor Simpson
245825d6ebaSTaylor Simpson /*
246825d6ebaSTaylor Simpson * Write this as a function because we can't guarantee the compiler will
247825d6ebaSTaylor Simpson * allocate a frame with just the SL2_return_tnew packet.
248825d6ebaSTaylor Simpson */
249*0d57cd61STaylor Simpson static void SL2_return_tnew(bool pred);
250825d6ebaSTaylor Simpson asm ("SL2_return_tnew:\n\t"
251825d6ebaSTaylor Simpson " allocframe(#0)\n\t"
252825d6ebaSTaylor Simpson " r1 = #1\n\t"
253825d6ebaSTaylor Simpson " memw(##early_exit) = r1\n\t"
254825d6ebaSTaylor Simpson " {\n\t"
255825d6ebaSTaylor Simpson " p0 = cmp.eq(r0, #1)\n\t"
256825d6ebaSTaylor Simpson " if (p0.new) dealloc_return:nt\n\t" /* SL2_return_tnew */
257825d6ebaSTaylor Simpson " }\n\t"
258825d6ebaSTaylor Simpson " r1 = #0\n\t"
259825d6ebaSTaylor Simpson " memw(##early_exit) = r1\n\t"
260825d6ebaSTaylor Simpson " dealloc_return\n\t"
261825d6ebaSTaylor Simpson );
262825d6ebaSTaylor Simpson
creg_pair(int32_t x,int32_t y)263*0d57cd61STaylor Simpson static int64_t creg_pair(int32_t x, int32_t y)
264825d6ebaSTaylor Simpson {
265*0d57cd61STaylor Simpson int64_t retval;
266825d6ebaSTaylor Simpson asm ("m0 = %1\n\t"
267825d6ebaSTaylor Simpson "m1 = %2\n\t"
268825d6ebaSTaylor Simpson "%0 = c7:6\n\t"
269825d6ebaSTaylor Simpson : "=r"(retval) : "r"(x), "r"(y) : "m0", "m1");
270825d6ebaSTaylor Simpson return retval;
271825d6ebaSTaylor Simpson }
272825d6ebaSTaylor Simpson
273fc2622f6STaylor Simpson #if CORE_HAS_CABAC
decbin(int64_t x,int64_t y,bool * pred)274*0d57cd61STaylor Simpson static int64_t decbin(int64_t x, int64_t y, bool *pred)
275e628c015STaylor Simpson {
276*0d57cd61STaylor Simpson int64_t retval;
277e628c015STaylor Simpson asm ("%0 = decbin(%2, %3)\n\t"
278e628c015STaylor Simpson "%1 = p0\n\t"
279e628c015STaylor Simpson : "=r"(retval), "=r"(*pred)
280e628c015STaylor Simpson : "r"(x), "r"(y));
281e628c015STaylor Simpson return retval;
282e628c015STaylor Simpson }
283fc2622f6STaylor Simpson #endif
284e628c015STaylor Simpson
2856c677c60STaylor Simpson /* Check that predicates are auto-and'ed in a packet */
auto_and(void)286*0d57cd61STaylor Simpson static bool auto_and(void)
2876c677c60STaylor Simpson {
288*0d57cd61STaylor Simpson bool retval;
2896c677c60STaylor Simpson asm ("r5 = #1\n\t"
2906c677c60STaylor Simpson "{\n\t"
2916c677c60STaylor Simpson " p0 = cmp.eq(r1, #1)\n\t"
2926c677c60STaylor Simpson " p0 = cmp.eq(r1, #2)\n\t"
2936c677c60STaylor Simpson "}\n\t"
2946c677c60STaylor Simpson "%0 = p0\n\t"
2956c677c60STaylor Simpson : "=r"(retval)
2966c677c60STaylor Simpson :
2976c677c60STaylor Simpson : "r5", "p0");
2986c677c60STaylor Simpson return retval;
2996c677c60STaylor Simpson }
3006c677c60STaylor Simpson
test_lsbnew(void)30107c0f653STaylor Simpson void test_lsbnew(void)
30207c0f653STaylor Simpson {
303*0d57cd61STaylor Simpson int32_t result;
30407c0f653STaylor Simpson
30507c0f653STaylor Simpson asm("r0 = #2\n\t"
30607c0f653STaylor Simpson "r1 = #5\n\t"
30707c0f653STaylor Simpson "{\n\t"
30807c0f653STaylor Simpson " p0 = r0\n\t"
30907c0f653STaylor Simpson " if (p0.new) r1 = #3\n\t"
31007c0f653STaylor Simpson "}\n\t"
31107c0f653STaylor Simpson "%0 = r1\n\t"
31207c0f653STaylor Simpson : "=r"(result) :: "r0", "r1", "p0");
313*0d57cd61STaylor Simpson check32(result, 5);
31407c0f653STaylor Simpson }
31507c0f653STaylor Simpson
test_l2fetch(void)316a5a8d98cSTaylor Simpson void test_l2fetch(void)
317a5a8d98cSTaylor Simpson {
318a5a8d98cSTaylor Simpson /* These don't do anything in qemu, just make sure they don't assert */
319a5a8d98cSTaylor Simpson asm volatile ("l2fetch(r0, r1)\n\t"
320a5a8d98cSTaylor Simpson "l2fetch(r0, r3:2)\n\t");
321a5a8d98cSTaylor Simpson }
322a5a8d98cSTaylor Simpson
ct0(uint32_t x)323*0d57cd61STaylor Simpson static inline int32_t ct0(uint32_t x)
324a5258481STaylor Simpson {
325*0d57cd61STaylor Simpson int32_t res;
326a5258481STaylor Simpson asm("%0 = ct0(%1)\n\t" : "=r"(res) : "r"(x));
327a5258481STaylor Simpson return res;
328a5258481STaylor Simpson }
329a5258481STaylor Simpson
ct1(uint32_t x)330*0d57cd61STaylor Simpson static inline int32_t ct1(uint32_t x)
331a5258481STaylor Simpson {
332*0d57cd61STaylor Simpson int32_t res;
333a5258481STaylor Simpson asm("%0 = ct1(%1)\n\t" : "=r"(res) : "r"(x));
334a5258481STaylor Simpson return res;
335a5258481STaylor Simpson }
336a5258481STaylor Simpson
ct0p(uint64_t x)337*0d57cd61STaylor Simpson static inline int32_t ct0p(uint64_t x)
338a5258481STaylor Simpson {
339*0d57cd61STaylor Simpson int32_t res;
340a5258481STaylor Simpson asm("%0 = ct0(%1)\n\t" : "=r"(res) : "r"(x));
341a5258481STaylor Simpson return res;
342a5258481STaylor Simpson }
343a5258481STaylor Simpson
ct1p(uint64_t x)344*0d57cd61STaylor Simpson static inline int32_t ct1p(uint64_t x)
345a5258481STaylor Simpson {
346*0d57cd61STaylor Simpson int32_t res;
347a5258481STaylor Simpson asm("%0 = ct1(%1)\n\t" : "=r"(res) : "r"(x));
348a5258481STaylor Simpson return res;
349a5258481STaylor Simpson }
350a5258481STaylor Simpson
test_count_trailing_zeros_ones(void)351a5258481STaylor Simpson void test_count_trailing_zeros_ones(void)
352a5258481STaylor Simpson {
353*0d57cd61STaylor Simpson check32(ct0(0x0000000f), 0);
354*0d57cd61STaylor Simpson check32(ct0(0x00000000), 32);
355*0d57cd61STaylor Simpson check32(ct0(0x000000f0), 4);
356a5258481STaylor Simpson
357*0d57cd61STaylor Simpson check32(ct1(0x000000f0), 0);
358*0d57cd61STaylor Simpson check32(ct1(0x0000000f), 4);
359*0d57cd61STaylor Simpson check32(ct1(0x00000000), 0);
360*0d57cd61STaylor Simpson check32(ct1(0xffffffff), 32);
361a5258481STaylor Simpson
362*0d57cd61STaylor Simpson check32(ct0p(0x000000000000000fULL), 0);
363*0d57cd61STaylor Simpson check32(ct0p(0x0000000000000000ULL), 64);
364*0d57cd61STaylor Simpson check32(ct0p(0x00000000000000f0ULL), 4);
365a5258481STaylor Simpson
366*0d57cd61STaylor Simpson check32(ct1p(0x00000000000000f0ULL), 0);
367*0d57cd61STaylor Simpson check32(ct1p(0x000000000000000fULL), 4);
368*0d57cd61STaylor Simpson check32(ct1p(0x0000000000000000ULL), 0);
369*0d57cd61STaylor Simpson check32(ct1p(0xffffffffffffffffULL), 64);
370*0d57cd61STaylor Simpson check32(ct1p(0xffffffffff0fffffULL), 20);
371*0d57cd61STaylor Simpson check32(ct1p(0xffffff0fffffffffULL), 36);
372a5258481STaylor Simpson }
373a5258481STaylor Simpson
dpmpyss_rnd_s0(int32_t x,int32_t y)374*0d57cd61STaylor Simpson static inline int32_t dpmpyss_rnd_s0(int32_t x, int32_t y)
375163e5fa3STaylor Simpson {
376*0d57cd61STaylor Simpson int32_t res;
377163e5fa3STaylor Simpson asm("%0 = mpy(%1, %2):rnd\n\t" : "=r"(res) : "r"(x), "r"(y));
378163e5fa3STaylor Simpson return res;
379163e5fa3STaylor Simpson }
380163e5fa3STaylor Simpson
test_dpmpyss_rnd_s0(void)381163e5fa3STaylor Simpson void test_dpmpyss_rnd_s0(void)
382163e5fa3STaylor Simpson {
383*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(-1, 0x80000000), 1);
384*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(0, 0x80000000), 0);
385*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(1, 0x80000000), 0);
386*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(0x7fffffff, 0x80000000), 0xc0000001);
387*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(0x80000000, -1), 1);
388*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(-1, -1), 0);
389*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(0, -1), 0);
390*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(1, -1), 0);
391*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(0x7fffffff, -1), 0);
392*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(0x80000000, 0), 0);
393*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(-1, 0), 0);
394*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(0, 0), 0);
395*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(1, 0), 0);
396*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(-1, -1), 0);
397*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(0, -1), 0);
398*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(1, -1), 0);
399*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(0x7fffffff, 1), 0);
400*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(0x80000000, 0x7fffffff), 0xc0000001);
401*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(-1, 0x7fffffff), 0);
402*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(0, 0x7fffffff), 0);
403*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(1, 0x7fffffff), 0);
404*0d57cd61STaylor Simpson check32(dpmpyss_rnd_s0(0x7fffffff, 0x7fffffff), 0x3fffffff);
405163e5fa3STaylor Simpson }
406163e5fa3STaylor Simpson
main()407825d6ebaSTaylor Simpson int main()
408825d6ebaSTaylor Simpson {
409*0d57cd61STaylor Simpson int32_t res;
410*0d57cd61STaylor Simpson int64_t res64;
411*0d57cd61STaylor Simpson bool pred;
412825d6ebaSTaylor Simpson
413825d6ebaSTaylor Simpson memcpy(array, init, sizeof(array));
414825d6ebaSTaylor Simpson S4_storerhnew_rr(array, 4, 0xffff);
415*0d57cd61STaylor Simpson check32(array[4], 0xffff);
416825d6ebaSTaylor Simpson
417825d6ebaSTaylor Simpson data = ~0;
418*0d57cd61STaylor Simpson checkp(S4_storerbnew_ap(0x12), &data);
419*0d57cd61STaylor Simpson check32(data, 0xffffff12);
420825d6ebaSTaylor Simpson
421825d6ebaSTaylor Simpson data = ~0;
422*0d57cd61STaylor Simpson checkp(S4_storerhnew_ap(0x1234), &data);
423*0d57cd61STaylor Simpson check32(data, 0xffff1234);
424825d6ebaSTaylor Simpson
425825d6ebaSTaylor Simpson data = ~0;
426*0d57cd61STaylor Simpson checkp(S4_storerinew_ap(0x12345678), &data);
427*0d57cd61STaylor Simpson check32(data, 0x12345678);
428825d6ebaSTaylor Simpson
429825d6ebaSTaylor Simpson /* Byte */
430825d6ebaSTaylor Simpson memcpy(array, init, sizeof(array));
431*0d57cd61STaylor Simpson S4_storeirbt_io(&array[1], true);
432*0d57cd61STaylor Simpson check32(array[2], 27);
433*0d57cd61STaylor Simpson S4_storeirbt_io(&array[2], false);
434*0d57cd61STaylor Simpson check32(array[3], 3);
435825d6ebaSTaylor Simpson
436825d6ebaSTaylor Simpson memcpy(array, init, sizeof(array));
437*0d57cd61STaylor Simpson S4_storeirbf_io(&array[3], false);
438*0d57cd61STaylor Simpson check32(array[4], 27);
439*0d57cd61STaylor Simpson S4_storeirbf_io(&array[4], true);
440*0d57cd61STaylor Simpson check32(array[5], 5);
441825d6ebaSTaylor Simpson
442825d6ebaSTaylor Simpson memcpy(array, init, sizeof(array));
443*0d57cd61STaylor Simpson S4_storeirbtnew_io(&array[5], true);
444*0d57cd61STaylor Simpson check32(array[6], 27);
445*0d57cd61STaylor Simpson S4_storeirbtnew_io(&array[6], false);
446*0d57cd61STaylor Simpson check32(array[7], 7);
447825d6ebaSTaylor Simpson
448825d6ebaSTaylor Simpson memcpy(array, init, sizeof(array));
449*0d57cd61STaylor Simpson S4_storeirbfnew_io(&array[7], false);
450*0d57cd61STaylor Simpson check32(array[8], 27);
451*0d57cd61STaylor Simpson S4_storeirbfnew_io(&array[8], true);
452*0d57cd61STaylor Simpson check32(array[9], 9);
453825d6ebaSTaylor Simpson
454825d6ebaSTaylor Simpson /* Half word */
455825d6ebaSTaylor Simpson memcpy(array, init, sizeof(array));
456*0d57cd61STaylor Simpson S4_storeirht_io(&array[1], true);
457*0d57cd61STaylor Simpson check32(array[2], 27);
458*0d57cd61STaylor Simpson S4_storeirht_io(&array[2], false);
459*0d57cd61STaylor Simpson check32(array[3], 3);
460825d6ebaSTaylor Simpson
461825d6ebaSTaylor Simpson memcpy(array, init, sizeof(array));
462*0d57cd61STaylor Simpson S4_storeirhf_io(&array[3], false);
463*0d57cd61STaylor Simpson check32(array[4], 27);
464*0d57cd61STaylor Simpson S4_storeirhf_io(&array[4], true);
465*0d57cd61STaylor Simpson check32(array[5], 5);
466825d6ebaSTaylor Simpson
467825d6ebaSTaylor Simpson memcpy(array, init, sizeof(array));
468*0d57cd61STaylor Simpson S4_storeirhtnew_io(&array[5], true);
469*0d57cd61STaylor Simpson check32(array[6], 27);
470*0d57cd61STaylor Simpson S4_storeirhtnew_io(&array[6], false);
471*0d57cd61STaylor Simpson check32(array[7], 7);
472825d6ebaSTaylor Simpson
473825d6ebaSTaylor Simpson memcpy(array, init, sizeof(array));
474*0d57cd61STaylor Simpson S4_storeirhfnew_io(&array[7], false);
475*0d57cd61STaylor Simpson check32(array[8], 27);
476*0d57cd61STaylor Simpson S4_storeirhfnew_io(&array[8], true);
477*0d57cd61STaylor Simpson check32(array[9], 9);
478825d6ebaSTaylor Simpson
479825d6ebaSTaylor Simpson /* Word */
480825d6ebaSTaylor Simpson memcpy(array, init, sizeof(array));
481*0d57cd61STaylor Simpson S4_storeirit_io(&array[1], true);
482*0d57cd61STaylor Simpson check32(array[2], 27);
483*0d57cd61STaylor Simpson S4_storeirit_io(&array[2], false);
484*0d57cd61STaylor Simpson check32(array[3], 3);
485825d6ebaSTaylor Simpson
486825d6ebaSTaylor Simpson memcpy(array, init, sizeof(array));
487*0d57cd61STaylor Simpson S4_storeirif_io(&array[3], false);
488*0d57cd61STaylor Simpson check32(array[4], 27);
489*0d57cd61STaylor Simpson S4_storeirif_io(&array[4], true);
490*0d57cd61STaylor Simpson check32(array[5], 5);
491825d6ebaSTaylor Simpson
492825d6ebaSTaylor Simpson memcpy(array, init, sizeof(array));
493*0d57cd61STaylor Simpson S4_storeiritnew_io(&array[5], true);
494*0d57cd61STaylor Simpson check32(array[6], 27);
495*0d57cd61STaylor Simpson S4_storeiritnew_io(&array[6], false);
496*0d57cd61STaylor Simpson check32(array[7], 7);
497825d6ebaSTaylor Simpson
498825d6ebaSTaylor Simpson memcpy(array, init, sizeof(array));
499*0d57cd61STaylor Simpson S4_storeirifnew_io(&array[7], false);
500*0d57cd61STaylor Simpson check32(array[8], 27);
501*0d57cd61STaylor Simpson S4_storeirifnew_io(&array[8], true);
502*0d57cd61STaylor Simpson check32(array[9], 9);
503825d6ebaSTaylor Simpson
50407c0f653STaylor Simpson memcpy(array, init, sizeof(array));
505*0d57cd61STaylor Simpson res = L2_ploadrifnew_pi(&array[6], false);
506*0d57cd61STaylor Simpson check32(res, 6);
507*0d57cd61STaylor Simpson res = L2_ploadrifnew_pi(&array[7], true);
508*0d57cd61STaylor Simpson check32(res, 31);
50907c0f653STaylor Simpson
510*0d57cd61STaylor Simpson res = cmpnd_cmp_jump();
511*0d57cd61STaylor Simpson check32(res, 12);
512825d6ebaSTaylor Simpson
513*0d57cd61STaylor Simpson SL2_return_tnew(false);
514*0d57cd61STaylor Simpson check32(early_exit, false);
515*0d57cd61STaylor Simpson SL2_return_tnew(true);
516*0d57cd61STaylor Simpson check32(early_exit, true);
517825d6ebaSTaylor Simpson
518*0d57cd61STaylor Simpson res64 = creg_pair(5, 7);
519*0d57cd61STaylor Simpson check32((int32_t)res64, 5);
520*0d57cd61STaylor Simpson check32((int32_t)(res64 >> 32), 7);
521825d6ebaSTaylor Simpson
52207c0f653STaylor Simpson res = test_clrtnew(1, 7);
523*0d57cd61STaylor Simpson check32(res, 0);
524825d6ebaSTaylor Simpson res = test_clrtnew(2, 7);
525*0d57cd61STaylor Simpson check32(res, 7);
526825d6ebaSTaylor Simpson
527fc2622f6STaylor Simpson #if CORE_HAS_CABAC
528e628c015STaylor Simpson res64 = decbin(0xf0f1f2f3f4f5f6f7LL, 0x7f6f5f4f3f2f1f0fLL, &pred);
529e628c015STaylor Simpson check64(res64, 0x357980003700010cLL);
530*0d57cd61STaylor Simpson check32(pred, false);
531e628c015STaylor Simpson
532e628c015STaylor Simpson res64 = decbin(0xfLL, 0x1bLL, &pred);
533e628c015STaylor Simpson check64(res64, 0x78000100LL);
534*0d57cd61STaylor Simpson check32(pred, true);
535fc2622f6STaylor Simpson #else
536fc2622f6STaylor Simpson puts("Skipping cabac tests");
537fc2622f6STaylor Simpson #endif
538e628c015STaylor Simpson
539*0d57cd61STaylor Simpson pred = auto_and();
540*0d57cd61STaylor Simpson check32(pred, false);
5416c677c60STaylor Simpson
54207c0f653STaylor Simpson test_lsbnew();
54307c0f653STaylor Simpson
544a5a8d98cSTaylor Simpson test_l2fetch();
545a5a8d98cSTaylor Simpson
546a5258481STaylor Simpson test_count_trailing_zeros_ones();
547a5258481STaylor Simpson
548163e5fa3STaylor Simpson test_dpmpyss_rnd_s0();
549163e5fa3STaylor Simpson
550825d6ebaSTaylor Simpson puts(err ? "FAIL" : "PASS");
551825d6ebaSTaylor Simpson return err;
552825d6ebaSTaylor Simpson }
553