1 /* 2 3 Copyright (c) 2009, 2010, 2011 STMicroelectronics 4 Written by Christophe Lyon 5 6 Permission is hereby granted, free of charge, to any person obtaining a copy 7 of this software and associated documentation files (the "Software"), to deal 8 in the Software without restriction, including without limitation the rights 9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 copies of the Software, and to permit persons to whom the Software is 11 furnished to do so, subject to the following conditions: 12 13 The above copyright notice and this permission notice shall be included in 14 all copies or substantial portions of the Software. 15 16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 THE SOFTWARE. 23 24 */ 25 26 #if defined(__cplusplus) 27 #include <cstdio> 28 #include <cstdint> 29 #else 30 #include <stdio.h> 31 #if defined(_MSC_VER) 32 #include "msstdint.h" 33 #else 34 #include <stdint.h> 35 #endif 36 #endif 37 38 #if defined(__arm__) || defined(__aarch64__) 39 #include <armdsp.h> 40 #include <dspfns.h> /* For Overflow */ 41 #else 42 #include "stm-armdsp.h" 43 #include "stm-dspfns.h" /* For Overflow */ 44 #endif 45 46 extern FILE* ref_file; 47 48 void 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 } 422