Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-src by
core_cm4_simd.h
00001 /**************************************************************************//** 00002 * @file core_cm4_simd.h 00003 * @brief CMSIS Cortex-M4 SIMD Header File 00004 * @version V3.01 00005 * @date 06. March 2012 00006 * 00007 * @note 00008 * Copyright (C) 2010-2012 ARM Limited. All rights reserved. 00009 * 00010 * @par 00011 * ARM Limited (ARM) is supplying this software for use with Cortex-M 00012 * processor based microcontrollers. This file can be freely distributed 00013 * within development tools that are supporting such ARM based processors. 00014 * 00015 * @par 00016 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED 00017 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF 00018 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. 00019 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR 00020 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. 00021 * 00022 ******************************************************************************/ 00023 00024 #ifdef __cplusplus 00025 extern "C" { 00026 #endif 00027 00028 #ifndef __CORE_CM4_SIMD_H 00029 #define __CORE_CM4_SIMD_H 00030 00031 00032 /******************************************************************************* 00033 * Hardware Abstraction Layer 00034 ******************************************************************************/ 00035 00036 00037 /* ################### Compiler specific Intrinsics ########################### */ 00038 /** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics 00039 Access to dedicated SIMD instructions 00040 @{ 00041 */ 00042 00043 #if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ 00044 /* ARM armcc specific functions */ 00045 00046 /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ 00047 #define __SADD8 __sadd8 00048 #define __QADD8 __qadd8 00049 #define __SHADD8 __shadd8 00050 #define __UADD8 __uadd8 00051 #define __UQADD8 __uqadd8 00052 #define __UHADD8 __uhadd8 00053 #define __SSUB8 __ssub8 00054 #define __QSUB8 __qsub8 00055 #define __SHSUB8 __shsub8 00056 #define __USUB8 __usub8 00057 #define __UQSUB8 __uqsub8 00058 #define __UHSUB8 __uhsub8 00059 #define __SADD16 __sadd16 00060 #define __QADD16 __qadd16 00061 #define __SHADD16 __shadd16 00062 #define __UADD16 __uadd16 00063 #define __UQADD16 __uqadd16 00064 #define __UHADD16 __uhadd16 00065 #define __SSUB16 __ssub16 00066 #define __QSUB16 __qsub16 00067 #define __SHSUB16 __shsub16 00068 #define __USUB16 __usub16 00069 #define __UQSUB16 __uqsub16 00070 #define __UHSUB16 __uhsub16 00071 #define __SASX __sasx 00072 #define __QASX __qasx 00073 #define __SHASX __shasx 00074 #define __UASX __uasx 00075 #define __UQASX __uqasx 00076 #define __UHASX __uhasx 00077 #define __SSAX __ssax 00078 #define __QSAX __qsax 00079 #define __SHSAX __shsax 00080 #define __USAX __usax 00081 #define __UQSAX __uqsax 00082 #define __UHSAX __uhsax 00083 #define __USAD8 __usad8 00084 #define __USADA8 __usada8 00085 #define __SSAT16 __ssat16 00086 #define __USAT16 __usat16 00087 #define __UXTB16 __uxtb16 00088 #define __UXTAB16 __uxtab16 00089 #define __SXTB16 __sxtb16 00090 #define __SXTAB16 __sxtab16 00091 #define __SMUAD __smuad 00092 #define __SMUADX __smuadx 00093 #define __SMLAD __smlad 00094 #define __SMLADX __smladx 00095 #define __SMLALD __smlald 00096 #define __SMLALDX __smlaldx 00097 #define __SMUSD __smusd 00098 #define __SMUSDX __smusdx 00099 #define __SMLSD __smlsd 00100 #define __SMLSDX __smlsdx 00101 #define __SMLSLD __smlsld 00102 #define __SMLSLDX __smlsldx 00103 #define __SEL __sel 00104 #define __QADD __qadd 00105 #define __QSUB __qsub 00106 00107 #define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ 00108 ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) 00109 00110 #define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ 00111 ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) 00112 00113 00114 /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ 00115 00116 00117 00118 #elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ 00119 /* IAR iccarm specific functions */ 00120 00121 /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ 00122 #include <cmsis_iar.h> 00123 00124 /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ 00125 00126 00127 00128 #elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ 00129 /* TI CCS specific functions */ 00130 00131 /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ 00132 #include <cmsis_ccs.h> 00133 00134 /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ 00135 00136 00137 00138 #elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ 00139 /* GNU gcc specific functions */ 00140 00141 /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ 00142 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) 00143 { 00144 uint32_t result; 00145 00146 __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00147 return(result); 00148 } 00149 00150 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) 00151 { 00152 uint32_t result; 00153 00154 __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00155 return(result); 00156 } 00157 00158 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) 00159 { 00160 uint32_t result; 00161 00162 __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00163 return(result); 00164 } 00165 00166 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) 00167 { 00168 uint32_t result; 00169 00170 __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00171 return(result); 00172 } 00173 00174 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) 00175 { 00176 uint32_t result; 00177 00178 __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00179 return(result); 00180 } 00181 00182 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) 00183 { 00184 uint32_t result; 00185 00186 __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00187 return(result); 00188 } 00189 00190 00191 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) 00192 { 00193 uint32_t result; 00194 00195 __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00196 return(result); 00197 } 00198 00199 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) 00200 { 00201 uint32_t result; 00202 00203 __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00204 return(result); 00205 } 00206 00207 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) 00208 { 00209 uint32_t result; 00210 00211 __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00212 return(result); 00213 } 00214 00215 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) 00216 { 00217 uint32_t result; 00218 00219 __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00220 return(result); 00221 } 00222 00223 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) 00224 { 00225 uint32_t result; 00226 00227 __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00228 return(result); 00229 } 00230 00231 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) 00232 { 00233 uint32_t result; 00234 00235 __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00236 return(result); 00237 } 00238 00239 00240 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) 00241 { 00242 uint32_t result; 00243 00244 __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00245 return(result); 00246 } 00247 00248 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) 00249 { 00250 uint32_t result; 00251 00252 __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00253 return(result); 00254 } 00255 00256 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) 00257 { 00258 uint32_t result; 00259 00260 __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00261 return(result); 00262 } 00263 00264 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) 00265 { 00266 uint32_t result; 00267 00268 __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00269 return(result); 00270 } 00271 00272 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) 00273 { 00274 uint32_t result; 00275 00276 __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00277 return(result); 00278 } 00279 00280 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) 00281 { 00282 uint32_t result; 00283 00284 __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00285 return(result); 00286 } 00287 00288 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) 00289 { 00290 uint32_t result; 00291 00292 __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00293 return(result); 00294 } 00295 00296 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) 00297 { 00298 uint32_t result; 00299 00300 __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00301 return(result); 00302 } 00303 00304 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) 00305 { 00306 uint32_t result; 00307 00308 __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00309 return(result); 00310 } 00311 00312 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) 00313 { 00314 uint32_t result; 00315 00316 __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00317 return(result); 00318 } 00319 00320 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) 00321 { 00322 uint32_t result; 00323 00324 __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00325 return(result); 00326 } 00327 00328 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) 00329 { 00330 uint32_t result; 00331 00332 __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00333 return(result); 00334 } 00335 00336 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2) 00337 { 00338 uint32_t result; 00339 00340 __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00341 return(result); 00342 } 00343 00344 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2) 00345 { 00346 uint32_t result; 00347 00348 __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00349 return(result); 00350 } 00351 00352 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) 00353 { 00354 uint32_t result; 00355 00356 __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00357 return(result); 00358 } 00359 00360 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2) 00361 { 00362 uint32_t result; 00363 00364 __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00365 return(result); 00366 } 00367 00368 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) 00369 { 00370 uint32_t result; 00371 00372 __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00373 return(result); 00374 } 00375 00376 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) 00377 { 00378 uint32_t result; 00379 00380 __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00381 return(result); 00382 } 00383 00384 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) 00385 { 00386 uint32_t result; 00387 00388 __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00389 return(result); 00390 } 00391 00392 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) 00393 { 00394 uint32_t result; 00395 00396 __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00397 return(result); 00398 } 00399 00400 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) 00401 { 00402 uint32_t result; 00403 00404 __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00405 return(result); 00406 } 00407 00408 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2) 00409 { 00410 uint32_t result; 00411 00412 __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00413 return(result); 00414 } 00415 00416 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) 00417 { 00418 uint32_t result; 00419 00420 __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00421 return(result); 00422 } 00423 00424 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) 00425 { 00426 uint32_t result; 00427 00428 __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00429 return(result); 00430 } 00431 00432 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) 00433 { 00434 uint32_t result; 00435 00436 __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00437 return(result); 00438 } 00439 00440 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) 00441 { 00442 uint32_t result; 00443 00444 __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); 00445 return(result); 00446 } 00447 00448 #define __SSAT16(ARG1,ARG2) \ 00449 ({ \ 00450 uint32_t __RES, __ARG1 = (ARG1); \ 00451 __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ 00452 __RES; \ 00453 }) 00454 00455 #define __USAT16(ARG1,ARG2) \ 00456 ({ \ 00457 uint32_t __RES, __ARG1 = (ARG1); \ 00458 __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ 00459 __RES; \ 00460 }) 00461 00462 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1) 00463 { 00464 uint32_t result; 00465 00466 __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); 00467 return(result); 00468 } 00469 00470 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) 00471 { 00472 uint32_t result; 00473 00474 __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00475 return(result); 00476 } 00477 00478 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1) 00479 { 00480 uint32_t result; 00481 00482 __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); 00483 return(result); 00484 } 00485 00486 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) 00487 { 00488 uint32_t result; 00489 00490 __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00491 return(result); 00492 } 00493 00494 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) 00495 { 00496 uint32_t result; 00497 00498 __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00499 return(result); 00500 } 00501 00502 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) 00503 { 00504 uint32_t result; 00505 00506 __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00507 return(result); 00508 } 00509 00510 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) 00511 { 00512 uint32_t result; 00513 00514 __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); 00515 return(result); 00516 } 00517 00518 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) 00519 { 00520 uint32_t result; 00521 00522 __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); 00523 return(result); 00524 } 00525 00526 #define __SMLALD(ARG1,ARG2,ARG3) \ 00527 ({ \ 00528 uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \ 00529 __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ 00530 (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ 00531 }) 00532 00533 #define __SMLALDX(ARG1,ARG2,ARG3) \ 00534 ({ \ 00535 uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \ 00536 __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ 00537 (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ 00538 }) 00539 00540 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) 00541 { 00542 uint32_t result; 00543 00544 __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00545 return(result); 00546 } 00547 00548 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) 00549 { 00550 uint32_t result; 00551 00552 __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00553 return(result); 00554 } 00555 00556 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) 00557 { 00558 uint32_t result; 00559 00560 __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); 00561 return(result); 00562 } 00563 00564 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) 00565 { 00566 uint32_t result; 00567 00568 __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); 00569 return(result); 00570 } 00571 00572 #define __SMLSLD(ARG1,ARG2,ARG3) \ 00573 ({ \ 00574 uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \ 00575 __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ 00576 (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ 00577 }) 00578 00579 #define __SMLSLDX(ARG1,ARG2,ARG3) \ 00580 ({ \ 00581 uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \ 00582 __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ 00583 (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ 00584 }) 00585 00586 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2) 00587 { 00588 uint32_t result; 00589 00590 __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00591 return(result); 00592 } 00593 00594 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD(uint32_t op1, uint32_t op2) 00595 { 00596 uint32_t result; 00597 00598 __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00599 return(result); 00600 } 00601 00602 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2) 00603 { 00604 uint32_t result; 00605 00606 __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); 00607 return(result); 00608 } 00609 00610 #define __PKHBT(ARG1,ARG2,ARG3) \ 00611 ({ \ 00612 uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ 00613 __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ 00614 __RES; \ 00615 }) 00616 00617 #define __PKHTB(ARG1,ARG2,ARG3) \ 00618 ({ \ 00619 uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ 00620 if (ARG3 == 0) \ 00621 __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ 00622 else \ 00623 __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ 00624 __RES; \ 00625 }) 00626 00627 /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ 00628 00629 00630 00631 #elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ 00632 /* TASKING carm specific functions */ 00633 00634 00635 /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ 00636 /* not yet supported */ 00637 /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ 00638 00639 00640 #endif 00641 00642 /*@} end of group CMSIS_SIMD_intrinsics */ 00643 00644 00645 #endif /* __CORE_CM4_SIMD_H */ 00646 00647 #ifdef __cplusplus 00648 } 00649 #endif
Generated on Tue Jul 12 2022 13:47:00 by
1.7.2
