xref: /aosp_15_r20/external/arm-neon-tests/ref_integer.c (revision f37826520a923688f9e110915f3811e385d8b6d1)
1*f3782652STreehugger Robot /*
2*f3782652STreehugger Robot 
3*f3782652STreehugger Robot Copyright (c) 2009, 2010, 2011 STMicroelectronics
4*f3782652STreehugger Robot Written by Christophe Lyon
5*f3782652STreehugger Robot 
6*f3782652STreehugger Robot Permission is hereby granted, free of charge, to any person obtaining a copy
7*f3782652STreehugger Robot of this software and associated documentation files (the "Software"), to deal
8*f3782652STreehugger Robot in the Software without restriction, including without limitation the rights
9*f3782652STreehugger Robot to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10*f3782652STreehugger Robot copies of the Software, and to permit persons to whom the Software is
11*f3782652STreehugger Robot furnished to do so, subject to the following conditions:
12*f3782652STreehugger Robot 
13*f3782652STreehugger Robot The above copyright notice and this permission notice shall be included in
14*f3782652STreehugger Robot all copies or substantial portions of the Software.
15*f3782652STreehugger Robot 
16*f3782652STreehugger Robot THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*f3782652STreehugger Robot IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*f3782652STreehugger Robot FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*f3782652STreehugger Robot AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*f3782652STreehugger Robot LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*f3782652STreehugger Robot OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22*f3782652STreehugger Robot THE SOFTWARE.
23*f3782652STreehugger Robot 
24*f3782652STreehugger Robot */
25*f3782652STreehugger Robot 
26*f3782652STreehugger Robot #if defined(__cplusplus)
27*f3782652STreehugger Robot #include <cstdio>
28*f3782652STreehugger Robot #include <cstdint>
29*f3782652STreehugger Robot #else
30*f3782652STreehugger Robot #include <stdio.h>
31*f3782652STreehugger Robot #if defined(_MSC_VER)
32*f3782652STreehugger Robot #include "msstdint.h"
33*f3782652STreehugger Robot #else
34*f3782652STreehugger Robot #include <stdint.h>
35*f3782652STreehugger Robot #endif
36*f3782652STreehugger Robot #endif
37*f3782652STreehugger Robot 
38*f3782652STreehugger Robot #ifndef __arm__
39*f3782652STreehugger Robot #include "stm-arm.h"
40*f3782652STreehugger Robot #include "stm-dspfns.h" /* For Overflow */
41*f3782652STreehugger Robot #else
42*f3782652STreehugger Robot #include <dspfns.h> /* For Overflow */
43*f3782652STreehugger Robot #endif
44*f3782652STreehugger Robot 
45*f3782652STreehugger Robot extern FILE* ref_file;
46*f3782652STreehugger Robot 
exec_integer(void)47*f3782652STreehugger Robot void exec_integer (void)
48*f3782652STreehugger Robot {
49*f3782652STreehugger Robot   int i;
50*f3782652STreehugger Robot   uint32_t uvar, ures;
51*f3782652STreehugger Robot   int32_t svar1, svar2, sres;
52*f3782652STreehugger Robot 
53*f3782652STreehugger Robot   uint8_t clz;
54*f3782652STreehugger Robot 
55*f3782652STreehugger Robot   fprintf(ref_file, "\n\nInteger (non-NEON) intrinsics\n");
56*f3782652STreehugger Robot 
57*f3782652STreehugger Robot   /* __clz */
58*f3782652STreehugger Robot   /* uint8_t __clz(uint32_t val); */
59*f3782652STreehugger Robot   uvar = 0xFFFFFFFF;
60*f3782652STreehugger Robot   for(i=0; i<=32; i++) {
61*f3782652STreehugger Robot     clz = __clz(uvar);
62*f3782652STreehugger Robot     fprintf(ref_file, "__clz(%#x) = %d\n", (unsigned int)uvar, clz);
63*f3782652STreehugger Robot     uvar >>= 1;
64*f3782652STreehugger Robot   }
65*f3782652STreehugger Robot 
66*f3782652STreehugger Robot   /* __qadd */
67*f3782652STreehugger Robot   /* int32_t __qadd(int32_t val1, int32_t val2); */
68*f3782652STreehugger Robot   svar1 = 1;
69*f3782652STreehugger Robot   svar2 = 2;
70*f3782652STreehugger Robot   Overflow = 0;
71*f3782652STreehugger Robot   sres = __qadd(svar1, svar2);
72*f3782652STreehugger Robot   fprintf(ref_file, "__qadd(%#x, %#x) = %#x sat %d\n",
73*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
74*f3782652STreehugger Robot 
75*f3782652STreehugger Robot   svar1 = -1;
76*f3782652STreehugger Robot   svar2 = -2;
77*f3782652STreehugger Robot   Overflow = 0;
78*f3782652STreehugger Robot   sres = __qadd(svar1, svar2);
79*f3782652STreehugger Robot   fprintf(ref_file, "__qadd(%#x, %#x) = %#x sat %d\n",
80*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
81*f3782652STreehugger Robot 
82*f3782652STreehugger Robot   svar1 = -1;
83*f3782652STreehugger Robot   svar2 = 2;
84*f3782652STreehugger Robot   Overflow = 0;
85*f3782652STreehugger Robot   sres = __qadd(svar1, svar2);
86*f3782652STreehugger Robot   fprintf(ref_file, "__qadd(%#x, %#x) = %#x sat %d\n",
87*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
88*f3782652STreehugger Robot 
89*f3782652STreehugger Robot   svar1 = 0x7000;
90*f3782652STreehugger Robot   svar2 = 0x7000;
91*f3782652STreehugger Robot   Overflow = 0;
92*f3782652STreehugger Robot   sres = __qadd(svar1, svar2);
93*f3782652STreehugger Robot   fprintf(ref_file, "__qadd(%#x, %#x) = %#x sat %d\n",
94*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
95*f3782652STreehugger Robot 
96*f3782652STreehugger Robot   svar1 = 0x8FFF;
97*f3782652STreehugger Robot   svar2 = 0x8FFF;
98*f3782652STreehugger Robot   Overflow = 0;
99*f3782652STreehugger Robot   sres = __qadd(svar1, svar2);
100*f3782652STreehugger Robot   fprintf(ref_file, "__qadd(%#x, %#x) = %#x sat %d\n",
101*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
102*f3782652STreehugger Robot 
103*f3782652STreehugger Robot   svar1 = 0x70000000;
104*f3782652STreehugger Robot   svar2 = 0x70000000;
105*f3782652STreehugger Robot   Overflow = 0;
106*f3782652STreehugger Robot   sres = __qadd(svar1, svar2);
107*f3782652STreehugger Robot   fprintf(ref_file, "__qadd(%#x, %#x) = %#x sat %d\n",
108*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
109*f3782652STreehugger Robot 
110*f3782652STreehugger Robot   svar1 = 0x8FFFFFFF;
111*f3782652STreehugger Robot   svar2 = 0x8FFFFFFF;
112*f3782652STreehugger Robot   Overflow = 0;
113*f3782652STreehugger Robot   sres = __qadd(svar1, svar2);
114*f3782652STreehugger Robot   fprintf(ref_file, "__qadd(%#x, %#x) = %#x sat %d\n",
115*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
116*f3782652STreehugger Robot 
117*f3782652STreehugger Robot   /* __qdbl */
118*f3782652STreehugger Robot   /* int32_t __qdbl(int32_t val); */
119*f3782652STreehugger Robot   svar1 = 1;
120*f3782652STreehugger Robot   Overflow = 0;
121*f3782652STreehugger Robot   sres = __qdbl(svar1);
122*f3782652STreehugger Robot   fprintf(ref_file, "__qdbl(%#x) = %#x sat %d\n",
123*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
124*f3782652STreehugger Robot 
125*f3782652STreehugger Robot   svar1 = 0x70000000;
126*f3782652STreehugger Robot   Overflow = 0;
127*f3782652STreehugger Robot   sres = __qdbl(svar1);
128*f3782652STreehugger Robot   fprintf(ref_file, "__qdbl(%#x) = %#x sat %d\n",
129*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
130*f3782652STreehugger Robot 
131*f3782652STreehugger Robot   svar1 = 0x8FFFFFFF;
132*f3782652STreehugger Robot   Overflow = 0;
133*f3782652STreehugger Robot   sres = __qdbl(svar1);
134*f3782652STreehugger Robot   fprintf(ref_file, "__qdbl(%#x) = %#x sat %d\n",
135*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
136*f3782652STreehugger Robot 
137*f3782652STreehugger Robot   svar1 = 0xEFFFFFFF;
138*f3782652STreehugger Robot   Overflow = 0;
139*f3782652STreehugger Robot   sres = __qdbl(svar1);
140*f3782652STreehugger Robot   fprintf(ref_file, "__qdbl(%#x) = %#x sat %d\n",
141*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
142*f3782652STreehugger Robot 
143*f3782652STreehugger Robot   /* __qsub */
144*f3782652STreehugger Robot   /* int32_t __qsub(int32_t val1, int32_t val2); */
145*f3782652STreehugger Robot   svar1 = 1;
146*f3782652STreehugger Robot   svar2 = 2;
147*f3782652STreehugger Robot   Overflow = 0;
148*f3782652STreehugger Robot   sres = __qsub(svar1, svar2);
149*f3782652STreehugger Robot   fprintf(ref_file, "__qsub(%#x, %#x) = %#x sat %d\n",
150*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
151*f3782652STreehugger Robot 
152*f3782652STreehugger Robot   svar1 = -1;
153*f3782652STreehugger Robot   svar2 = -2;
154*f3782652STreehugger Robot   Overflow = 0;
155*f3782652STreehugger Robot   sres = __qsub(svar1, svar2);
156*f3782652STreehugger Robot   fprintf(ref_file, "__qsub(%#x, %#x) = %#x sat %d\n",
157*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
158*f3782652STreehugger Robot 
159*f3782652STreehugger Robot   svar1 = -1;
160*f3782652STreehugger Robot   svar2 = 2;
161*f3782652STreehugger Robot   Overflow = 0;
162*f3782652STreehugger Robot   sres = __qsub(svar1, svar2);
163*f3782652STreehugger Robot   fprintf(ref_file, "__qsub(%#x, %#x) = %#x sat %d\n",
164*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
165*f3782652STreehugger Robot 
166*f3782652STreehugger Robot   svar1 = 0x7000;
167*f3782652STreehugger Robot   svar2 = 0xFFFF9000;
168*f3782652STreehugger Robot   Overflow = 0;
169*f3782652STreehugger Robot   sres = __qsub(svar1, svar2);
170*f3782652STreehugger Robot   fprintf(ref_file, "__qsub(%#x, %#x) = %#x sat %d\n",
171*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
172*f3782652STreehugger Robot 
173*f3782652STreehugger Robot   svar1 = 0x8FFF;
174*f3782652STreehugger Robot   svar2 = 0xFFFF7001;
175*f3782652STreehugger Robot   Overflow = 0;
176*f3782652STreehugger Robot   sres = __qsub(svar1, svar2);
177*f3782652STreehugger Robot   fprintf(ref_file, "__qsub(%#x, %#x) = %#x sat %d\n",
178*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
179*f3782652STreehugger Robot 
180*f3782652STreehugger Robot   svar1 = 0x70000000;
181*f3782652STreehugger Robot   svar2 = 0x90000000;
182*f3782652STreehugger Robot   Overflow = 0;
183*f3782652STreehugger Robot   sres = __qsub(svar1, svar2);
184*f3782652STreehugger Robot   fprintf(ref_file, "__qsub(%#x, %#x) = %#x sat %d\n",
185*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
186*f3782652STreehugger Robot 
187*f3782652STreehugger Robot   svar1 = 0x8FFFFFFF;
188*f3782652STreehugger Robot   svar2 = 0x70000001;
189*f3782652STreehugger Robot   Overflow = 0;
190*f3782652STreehugger Robot   sres = __qsub(svar1, svar2);
191*f3782652STreehugger Robot   fprintf(ref_file, "__qsub(%#x, %#x) = %#x sat %d\n",
192*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
193*f3782652STreehugger Robot 
194*f3782652STreehugger Robot   svar1 = 0;
195*f3782652STreehugger Robot   svar2 = 0x80000000;
196*f3782652STreehugger Robot   Overflow = 0;
197*f3782652STreehugger Robot   sres = __qsub(svar1, svar2);
198*f3782652STreehugger Robot   fprintf(ref_file, "__qsub(%#x, %#x) = %#x sat %d\n",
199*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)svar2, (unsigned int)sres, Overflow);
200*f3782652STreehugger Robot 
201*f3782652STreehugger Robot   /* __rbit */
202*f3782652STreehugger Robot   /* uint32_t __rbit(uint32_t val); */
203*f3782652STreehugger Robot   uvar = 0x12345678;
204*f3782652STreehugger Robot   ures = __rbit(uvar);
205*f3782652STreehugger Robot   fprintf(ref_file, "__rbit(%#x) = %#x\n",
206*f3782652STreehugger Robot           (unsigned int)uvar, (unsigned int)ures);
207*f3782652STreehugger Robot 
208*f3782652STreehugger Robot   /* __rev */
209*f3782652STreehugger Robot   /* uint32_t __rev(uint32_t val); */
210*f3782652STreehugger Robot   uvar = 0x12345678;
211*f3782652STreehugger Robot   ures = __rev(uvar);
212*f3782652STreehugger Robot   fprintf(ref_file, "__rev(%#x) = %#x\n",
213*f3782652STreehugger Robot           (unsigned int)uvar, (unsigned int)ures);
214*f3782652STreehugger Robot 
215*f3782652STreehugger Robot   /* __ssat */
216*f3782652STreehugger Robot   /* int32_t __ssat(int32_t val, uint32_t sat); */
217*f3782652STreehugger Robot   svar1 = 0x12345678;
218*f3782652STreehugger Robot   Overflow = 0;
219*f3782652STreehugger Robot   sres = __ssat(svar1, 30);
220*f3782652STreehugger Robot   fprintf(ref_file, "__ssat(%#x, 30) = %#x sat %d\n",
221*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
222*f3782652STreehugger Robot 
223*f3782652STreehugger Robot   svar1 = 0x12345678;
224*f3782652STreehugger Robot   Overflow = 0;
225*f3782652STreehugger Robot   sres = __ssat(svar1, 19);
226*f3782652STreehugger Robot   fprintf(ref_file, "__ssat(%#x, 19) = %#x sat %d\n",
227*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
228*f3782652STreehugger Robot 
229*f3782652STreehugger Robot   svar1 = 0x87654321;
230*f3782652STreehugger Robot   Overflow = 0;
231*f3782652STreehugger Robot   sres = __ssat(svar1, 29);
232*f3782652STreehugger Robot   fprintf(ref_file, "__ssat(%#x, 29) = %#x sat %d\n",
233*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
234*f3782652STreehugger Robot 
235*f3782652STreehugger Robot   svar1 = 0x87654321;
236*f3782652STreehugger Robot   Overflow = 0;
237*f3782652STreehugger Robot   sres = __ssat(svar1, 12);
238*f3782652STreehugger Robot   fprintf(ref_file, "__ssat(%#x, 12) = %#x sat %d\n",
239*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
240*f3782652STreehugger Robot 
241*f3782652STreehugger Robot   svar1 = 0x87654321;
242*f3782652STreehugger Robot   Overflow = 0;
243*f3782652STreehugger Robot   sres = __ssat(svar1, 32);
244*f3782652STreehugger Robot   fprintf(ref_file, "__ssat(%#x, 32) = %#x sat %d\n",
245*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
246*f3782652STreehugger Robot 
247*f3782652STreehugger Robot   svar1 = 0x87654321;
248*f3782652STreehugger Robot   Overflow = 0;
249*f3782652STreehugger Robot   sres = __ssat(svar1, 1);
250*f3782652STreehugger Robot   fprintf(ref_file, "__ssat(%#x, 1) = %#x sat %d\n",
251*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
252*f3782652STreehugger Robot 
253*f3782652STreehugger Robot   /* __usat */
254*f3782652STreehugger Robot   /* int32_t __usat(uint32_t val, uint32_t sat); */
255*f3782652STreehugger Robot   svar1 = 0x12345678;
256*f3782652STreehugger Robot   Overflow = 0;
257*f3782652STreehugger Robot   sres = __usat(svar1, 30);
258*f3782652STreehugger Robot   fprintf(ref_file, "__usat(%#x, 30) = %#x sat %d\n",
259*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
260*f3782652STreehugger Robot 
261*f3782652STreehugger Robot   svar1 = 0x12345678;
262*f3782652STreehugger Robot   Overflow = 0;
263*f3782652STreehugger Robot   sres = __usat(svar1, 19);
264*f3782652STreehugger Robot   fprintf(ref_file, "__usat(%#x, 19) = %#x sat %d\n",
265*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
266*f3782652STreehugger Robot 
267*f3782652STreehugger Robot   svar1 = 0x87654321;
268*f3782652STreehugger Robot   Overflow = 0;
269*f3782652STreehugger Robot   sres = __usat(svar1, 29);
270*f3782652STreehugger Robot   fprintf(ref_file, "__usat(%#x, 29) = %#x sat %d\n",
271*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
272*f3782652STreehugger Robot 
273*f3782652STreehugger Robot   svar1 = 0x87654321;
274*f3782652STreehugger Robot   Overflow = 0;
275*f3782652STreehugger Robot   sres = __usat(svar1, 12);
276*f3782652STreehugger Robot   fprintf(ref_file, "__usat(%#x, 12) = %#x sat %d\n",
277*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
278*f3782652STreehugger Robot 
279*f3782652STreehugger Robot   svar1 = 0x87654321;
280*f3782652STreehugger Robot   Overflow = 0;
281*f3782652STreehugger Robot   sres = __usat(svar1, 31);
282*f3782652STreehugger Robot   fprintf(ref_file, "__usat(%#x, 31) = %#x sat %d\n",
283*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
284*f3782652STreehugger Robot 
285*f3782652STreehugger Robot   svar1 = 0x87654321;
286*f3782652STreehugger Robot   Overflow = 0;
287*f3782652STreehugger Robot   sres = __usat(svar1, 0);
288*f3782652STreehugger Robot   fprintf(ref_file, "__usat(%#x, 0) = %#x sat %d\n",
289*f3782652STreehugger Robot           (unsigned int)svar1, (unsigned int)sres, Overflow);
290*f3782652STreehugger Robot }
291