blob: 124f6b726de2afe85f87e73c3544576fca0a7735 [file] [log] [blame]
Christophe Lyon073831a2011-01-24 17:37:40 +01001/*
2
3Copyright (c) 2009, 2010, 2011 STMicroelectronics
4Written by Christophe Lyon
5
6Permission is hereby granted, free of charge, to any person obtaining a copy
7of this software and associated documentation files (the "Software"), to deal
8in the Software without restriction, including without limitation the rights
9to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10copies of the Software, and to permit persons to whom the Software is
11furnished to do so, subject to the following conditions:
12
13The above copyright notice and this permission notice shall be included in
14all copies or substantial portions of the Software.
15
16THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22THE SOFTWARE.
23
24*/
25
Christophe Lyon6f4d36f2011-07-19 16:18:19 +020026#if defined(__cplusplus)
27#include <cstdio>
28#include <cstdint>
29#else
Christophe Lyon073831a2011-01-24 17:37:40 +010030#include <stdio.h>
Christophe Lyonf3c80a52011-07-19 16:32:02 +020031#if defined(_MSC_VER)
32#include "msstdint.h"
33#else
Christophe Lyon073831a2011-01-24 17:37:40 +010034#include <stdint.h>
Christophe Lyon6f4d36f2011-07-19 16:18:19 +020035#endif
Christophe Lyonf3c80a52011-07-19 16:32:02 +020036#endif
Christophe Lyon073831a2011-01-24 17:37:40 +010037
Christophe Lyon1775be02014-07-10 13:46:54 +020038#if defined(__arm__) || defined(__aarch64__)
Christophe Lyon073831a2011-01-24 17:37:40 +010039#include <armdsp.h>
Christophe Lyon69a69f92011-07-21 15:00:52 +020040#include <dspfns.h> /* For Overflow */
Christophe Lyon073831a2011-01-24 17:37:40 +010041#else
42#include "stm-armdsp.h"
Christophe Lyon0dab5f72011-07-19 17:14:09 +020043#include "stm-dspfns.h" /* For Overflow */
Christophe Lyon69a69f92011-07-21 15:00:52 +020044#endif
Christophe Lyon073831a2011-01-24 17:37:40 +010045
46extern FILE* ref_file;
47
48void exec_dsp (void)
49{
50 int32_t svar1, svar2, sacc, sres;
51 int32_t lo, hi;
52
53
54 fprintf(ref_file, "\n\nDSP (non-NEON) intrinsics\n");
55
56 /* qadd */
57 /* int32_t qadd(int32_t val1, int32_t val2); */
58 svar1 = 1;
59 svar2 = 2;
60 Overflow = 0;
61 sres = qadd(svar1, svar2);
62 fprintf(ref_file, "qadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
63
64 svar1 = -1;
65 svar2 = -2;
66 Overflow = 0;
67 sres = qadd(svar1, svar2);
68 fprintf(ref_file, "qadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
69
70 svar1 = -1;
71 svar2 = 2;
72 Overflow = 0;
73 sres = qadd(svar1, svar2);
74 fprintf(ref_file, "qadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
75
76 svar1 = 0x7000;
77 svar2 = 0x7000;
78 Overflow = 0;
79 sres = qadd(svar1, svar2);
80 fprintf(ref_file, "qadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
81
82 svar1 = 0x8FFF;
83 svar2 = 0x8FFF;
84 Overflow = 0;
85 sres = qadd(svar1, svar2);
86 fprintf(ref_file, "qadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
87
88 svar1 = 0x70000000;
89 svar2 = 0x70000000;
90 Overflow = 0;
91 sres = qadd(svar1, svar2);
92 fprintf(ref_file, "qadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
93
94 svar1 = 0x8FFFFFFF;
95 svar2 = 0x8FFFFFFF;
96 Overflow = 0;
97 sres = qadd(svar1, svar2);
98 fprintf(ref_file, "qadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
99
100 /* qsub */
101 /* int32_t qsub(int32_t val1, int32_t val2); */
102 svar1 = 1;
103 svar2 = 2;
104 Overflow = 0;
105 sres = qsub(svar1, svar2);
106 fprintf(ref_file, "qsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
107
108 svar1 = -1;
109 svar2 = -2;
110 Overflow = 0;
111 sres = qsub(svar1, svar2);
112 fprintf(ref_file, "qsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
113
114 svar1 = -1;
115 svar2 = 2;
116 Overflow = 0;
117 sres = qsub(svar1, svar2);
118 fprintf(ref_file, "qsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
119
120 svar1 = 0x7000;
121 svar2 = 0xFFFF9000;
122 Overflow = 0;
123 sres = qsub(svar1, svar2);
124 fprintf(ref_file, "qsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
125
126 svar1 = 0x8FFF;
127 svar2 = 0xFFFF7001;
128 Overflow = 0;
129 sres = qsub(svar1, svar2);
130 fprintf(ref_file, "qsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
131
132 svar1 = 0x70000000;
133 svar2 = 0x90000000;
134 Overflow = 0;
135 sres = qsub(svar1, svar2);
136 fprintf(ref_file, "qsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
137
138 svar1 = 0x8FFFFFFF;
139 svar2 = 0x70000001;
140 Overflow = 0;
141 sres = qsub(svar1, svar2);
142 fprintf(ref_file, "qsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
143
144 svar1 = 0;
145 svar2 = 0x80000000;
146 Overflow = 0;
147 sres = qsub(svar1, svar2);
148 fprintf(ref_file, "qsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
149
150
151 /* qdadd */
152 /* int32_t qdadd(int32_t val1, int32_t val2); */
153 svar1 = 1;
154 svar2 = 2;
155 Overflow = 0;
156 sres = qdadd(svar1, svar2);
157 fprintf(ref_file, "qdadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
158
159 svar1 = -1;
160 svar2 = -2;
161 Overflow = 0;
162 sres = qdadd(svar1, svar2);
163 fprintf(ref_file, "qdadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
164
165 svar1 = -1;
166 svar2 = 2;
167 Overflow = 0;
168 sres = qdadd(svar1, svar2);
169 fprintf(ref_file, "qdadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
170
171 svar1 = 0x7000;
172 svar2 = 0x7000;
173 Overflow = 0;
174 sres = qdadd(svar1, svar2);
175 fprintf(ref_file, "qdadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
176
177 svar1 = 0x8FFF;
178 svar2 = 0x8FFF;
179 Overflow = 0;
180 sres = qdadd(svar1, svar2);
181 fprintf(ref_file, "qdadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
182
183 svar1 = 0x70000000;
184 svar2 = 0x70000000;
185 Overflow = 0;
186 sres = qdadd(svar1, svar2);
187 fprintf(ref_file, "qdadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
188
189 svar1 = 0;
190 svar2 = 0x70000000;
191 Overflow = 0;
192 sres = qdadd(svar1, svar2);
193 fprintf(ref_file, "qdadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
194
195 svar1 = 0x8FFFFFFF;
196 svar2 = 0x8FFFFFFF;
197 Overflow = 0;
198 sres = qdadd(svar1, svar2);
199 fprintf(ref_file, "qdadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
200
201 svar1 = 0;
202 svar2 = 0x8FFFFFFF;
203 Overflow = 0;
204 sres = qdadd(svar1, svar2);
205 fprintf(ref_file, "qdadd(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
206
207 /* qdsub */
208 /* int32_t qdsub(int32_t val1, int32_t val2); */
209 svar1 = 1;
210 svar2 = 2;
211 Overflow = 0;
212 sres = qdsub(svar1, svar2);
213 fprintf(ref_file, "qdsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
214
215 svar1 = -1;
216 svar2 = -2;
217 Overflow = 0;
218 sres = qdsub(svar1, svar2);
219 fprintf(ref_file, "qdsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
220
221 svar1 = -1;
222 svar2 = 2;
223 Overflow = 0;
224 sres = qdsub(svar1, svar2);
225 fprintf(ref_file, "qdsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
226
227 svar1 = 0x7000;
228 svar2 = 0xFFFF9000;
229 Overflow = 0;
230 sres = qdsub(svar1, svar2);
231 fprintf(ref_file, "qdsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
232
233 svar1 = 0x8FFF;
234 svar2 = 0xFFFF7001;
235 Overflow = 0;
236 sres = qdsub(svar1, svar2);
237 fprintf(ref_file, "qdsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
238
239 svar1 = 0x70000000;
240 svar2 = 0x90000000;
241 Overflow = 0;
242 sres = qdsub(svar1, svar2);
243 fprintf(ref_file, "qdsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
244
245 svar1 = 0;
246 svar2 = 0x90000000;
247 Overflow = 0;
248 sres = qdsub(svar1, svar2);
249 fprintf(ref_file, "qdsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
250
251 svar1 = 0x8FFFFFFF;
252 svar2 = 0x70000001;
253 Overflow = 0;
254 sres = qdsub(svar1, svar2);
255 fprintf(ref_file, "qdsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
256
257 svar1 = 0;
258 svar2 = 0x70000001;
259 Overflow = 0;
260 sres = qdsub(svar1, svar2);
261 fprintf(ref_file, "qdsub(%#x, %#x) = %#x sat %d\n", svar1, svar2, sres, Overflow);
262
263
264 /* smulbb, smulbt, smultb, smultt */
265 /* int32_t smulbb(int32_t val1, int32_t val2); */
266 svar1 = 0x12345678;
267 svar2 = 0x12345678;
268 sres = smulbb(svar1, svar2);
269 fprintf(ref_file, "smulbb(%#x, %#x) = %#x\n", svar1, svar2, sres);
270 sres = smulbt(svar1, svar2);
271 fprintf(ref_file, "smulbt(%#x, %#x) = %#x\n", svar1, svar2, sres);
272 sres = smultb(svar1, svar2);
273 fprintf(ref_file, "smultb(%#x, %#x) = %#x\n", svar1, svar2, sres);
274 sres = smultt(svar1, svar2);
275 fprintf(ref_file, "smultt(%#x, %#x) = %#x\n", svar1, svar2, sres);
276
277 svar1 = 0xF123F456;
278 svar2 = 0xF123F456;
279 sres = smulbb(svar1, svar2);
280 fprintf(ref_file, "smulbb(%#x, %#x) = %#x\n", svar1, svar2, sres);
281 sres = smulbt(svar1, svar2);
282 fprintf(ref_file, "smulbt(%#x, %#x) = %#x\n", svar1, svar2, sres);
283 sres = smultb(svar1, svar2);
284 fprintf(ref_file, "smultb(%#x, %#x) = %#x\n", svar1, svar2, sres);
285 sres = smultt(svar1, svar2);
286 fprintf(ref_file, "smultt(%#x, %#x) = %#x\n", svar1, svar2, sres);
287
288
289 /* smlabb, smlabt, smlatb, smlatt */
290 /* int32_t smlabb(int32_t val1, int32_t val2, int32_t acc); */
291 sacc = 0x01020304;
292 svar1 = 0x12345678;
293 svar2 = 0x12345678;
294 sres = smlabb(svar1, svar2, sacc);
295 fprintf(ref_file, "smlabb(%#x, %#x, %#x) = %#x\n", svar1, svar2, sacc, sres);
296 sres = smlabt(svar1, svar2, sacc);
297 fprintf(ref_file, "smlabt(%#x, %#x, %#x) = %#x\n", svar1, svar2, sacc, sres);
298 sres = smlatb(svar1, svar2, sacc);
299 fprintf(ref_file, "smlatb(%#x, %#x, %#x) = %#x\n", svar1, svar2, sacc, sres);
300 sres = smlatt(svar1, svar2, sacc);
301 fprintf(ref_file, "smlatt(%#x, %#x, %#x) = %#x\n", svar1, svar2, sacc, sres);
302
303 svar1 = 0xF123F456;
304 svar2 = 0xF123F456;
305 sres = smlabb(svar1, svar2, sacc);
306 fprintf(ref_file, "smlabb(%#x, %#x, %#x) = %#x\n", svar1, svar2, sacc, sres);
307 sres = smlabt(svar1, svar2, sacc);
308 fprintf(ref_file, "smlabt(%#x, %#x, %#x) = %#x\n", svar1, svar2, sacc, sres);
309 sres = smlatb(svar1, svar2, sacc);
310 fprintf(ref_file, "smlatb(%#x, %#x, %#x) = %#x\n", svar1, svar2, sacc, sres);
311 sres = smlatt(svar1, svar2, sacc);
312 fprintf(ref_file, "smlatt(%#x, %#x, %#x) = %#x\n", svar1, svar2, sacc, sres);
313
314
315 /* smlalbb, smlalbt, smlaltb, smlaltt */
316 /* int32_t smlalbb(int32_t *lo, int32_t *hi, int32_t val1, int32_t val2); */
317 svar1 = 0x12345678;
318 svar2 = 0x12345678;
319 hi = 0x12345678;
320 lo = 0x9ABCDEF0;
321 fprintf(ref_file, "smlalbb(&%#x, &%#x, %#x, %#x) = ", lo, hi, svar1, svar2);
322 smlalbb(&lo, &hi, svar1, svar2);
323 fprintf(ref_file, "%#x%#x\n", hi, lo);
324 hi = 0x12345678;
325 lo = 0x9ABCDEF0;
326 fprintf(ref_file, "smlalbt(&%#x, &%#x, %#x, %#x) = ", lo, hi, svar1, svar2);
327 smlalbt(&lo, &hi, svar1, svar2);
328 fprintf(ref_file, "%#x%#x\n", hi, lo);
329 hi = 0x12345678;
330 lo = 0x9ABCDEF0;
331 fprintf(ref_file, "smlaltb(&%#x, &%#x, %#x, %#x) = ", lo, hi, svar1, svar2);
332 smlaltb(&lo, &hi, svar1, svar2);
333 fprintf(ref_file, "%#x%#x\n", hi, lo);
334 hi = 0x12345678;
335 lo = 0x9ABCDEF0;
336 fprintf(ref_file, "smlaltt(&%#x, &%#x, %#x, %#x) = ", lo, hi, svar1, svar2);
337 smlaltt(&lo, &hi, svar1, svar2);
338 fprintf(ref_file, "%#x%#x\n", hi, lo);
339
340 svar1 = 0xF123F456;
341 svar2 = 0xF123F456;
342 hi = 0x12345678;
343 lo = 0x9ABCDEF0;
344 fprintf(ref_file, "smlalbb(&%#x, &%#x, %#x, %#x) = ", lo, hi, svar1, svar2);
345 smlalbb(&lo, &hi, svar1, svar2);
346 fprintf(ref_file, "%#x%#x\n", hi, lo);
347 hi = 0x12345678;
348 lo = 0x9ABCDEF0;
349 fprintf(ref_file, "smlalbt(&%#x, &%#x, %#x, %#x) = ", lo, hi, svar1, svar2);
350 smlalbt(&lo, &hi, svar1, svar2);
351 fprintf(ref_file, "%#x%#x\n", hi, lo);
352 hi = 0x12345678;
353 lo = 0x9ABCDEF0;
354 fprintf(ref_file, "smlaltb(&%#x, &%#x, %#x, %#x) = ", lo, hi, svar1, svar2);
355 smlaltb(&lo, &hi, svar1, svar2);
356 fprintf(ref_file, "%#x%#x\n", hi, lo);
357 hi = 0x12345678;
358 lo = 0x9ABCDEF0;
359 fprintf(ref_file, "smlaltt(&%#x, &%#x, %#x, %#x) = ", lo, hi, svar1, svar2);
360 smlaltt(&lo, &hi, svar1, svar2);
361 fprintf(ref_file, "%#x%#x\n", hi, lo);
362
363 svar1 = 0x7FFF7FFF;
364 svar2 = 0x7FFF7FFF;
365 hi = 0x12345678;
366 lo = 0xFFFFFFFF;
367 fprintf(ref_file, "smlalbb(&%#x, &%#x, %#x, %#x) = ", lo, hi, svar1, svar2);
368 smlalbb(&lo, &hi, svar1, svar2);
369 fprintf(ref_file, "%#x%#x\n", hi, lo);
370 hi = 0x12345678;
371 lo = 0xFFFFFFFF;
372 fprintf(ref_file, "smlalbt(&%#x, &%#x, %#x, %#x) = ", lo, hi, svar1, svar2);
373 smlalbt(&lo, &hi, svar1, svar2);
374 fprintf(ref_file, "%#x%#x\n", hi, lo);
375 hi = 0x12345678;
376 lo = 0xFFFFFFFF;
377 fprintf(ref_file, "smlaltb(&%#x, &%#x, %#x, %#x) = ", lo, hi, svar1, svar2);
378 smlaltb(&lo, &hi, svar1, svar2);
379 fprintf(ref_file, "%#x%#x\n", hi, lo);
380 hi = 0x12345678;
381 lo = 0xFFFFFFFF;
382 fprintf(ref_file, "smlaltt(&%#x, &%#x, %#x, %#x) = ", lo, hi, svar1, svar2);
383 smlaltt(&lo, &hi, svar1, svar2);
384 fprintf(ref_file, "%#x%#x\n", hi, lo);
385
386
387 /* smulwb, smulwt */
388 /* int32_t smulwb(int32_t val1, int32_t val2); */
389 svar1 = 0x12345678;
390 svar2 = 0x12345678;
391 sres = smulwb(svar1, svar2);
392 fprintf(ref_file, "smulwb(%#x, %#x) = %#x\n", svar1, svar2, sres);
393 sres = smulwt(svar1, svar2);
394 fprintf(ref_file, "smulwt(%#x, %#x) = %#x\n", svar1, svar2, sres);
395
396 svar1 = 0xF123F456;
397 svar2 = 0xF123F456;
398 sres = smulwb(svar1, svar2);
399 fprintf(ref_file, "smulwb(%#x, %#x) = %#x\n", svar1, svar2, sres);
400 sres = smulwt(svar1, svar2);
401 fprintf(ref_file, "smulwt(%#x, %#x) = %#x\n", svar1, svar2, sres);
402
403
404 /* smlawb, smlawt */
405 /* int32_t smlawb(int32_t val1, int32_t val2, int32_t acc); */
406 sacc = 0x01020304;
407 svar1 = 0x12345678;
408 svar2 = 0x12345678;
409 sres = smlawb(svar1, svar2, sacc);
410 fprintf(ref_file, "smlawb(%#x, %#x, %#x) = %#x\n", svar1, svar2, sacc, sres);
411 sres = smlawt(svar1, svar2, sacc);
412 fprintf(ref_file, "smlawt(%#x, %#x, %#x) = %#x\n", svar1, svar2, sacc, sres);
413
414 svar1 = 0xF123F456;
415 svar2 = 0xF123F456;
416 sres = smlawb(svar1, svar2, sacc);
417 fprintf(ref_file, "smlawb(%#x, %#x, %#x) = %#x\n", svar1, svar2, sacc, sres);
418 sres = smlawt(svar1, svar2, sacc);
419 fprintf(ref_file, "smlawt(%#x, %#x, %#X) = %#x\n", svar1, svar2, sacc, sres);
420
421}