Subversion Repositories DashDisplay

Rev

Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2 Rev 5
Line 1... Line 1...
1
/**************************************************************************//**
1
/**************************************************************************//**
2
 * @file     core_cmSimd.h
2
 * @file     core_cmSimd.h
3
 * @brief    CMSIS Cortex-M SIMD Header File
3
 * @brief    CMSIS Cortex-M SIMD Header File
4
 * @version  V4.10
4
 * @version  V4.30
5
 * @date     18. March 2015
5
 * @date     20. October 2015
6
 *
-
 
7
 * @note
-
 
8
 *
-
 
9
 ******************************************************************************/
6
 ******************************************************************************/
10
/* Copyright (c) 2009 - 2014 ARM LIMITED
7
/* Copyright (c) 2009 - 2015 ARM LIMITED
11
 
8
 
12
   All rights reserved.
9
   All rights reserved.
13
   Redistribution and use in source and binary forms, with or without
10
   Redistribution and use in source and binary forms, with or without
14
   modification, are permitted provided that the following conditions are met:
11
   modification, are permitted provided that the following conditions are met:
15
   - Redistributions of source code must retain the above copyright
12
   - Redistributions of source code must retain the above copyright
Line 33... Line 30...
33
   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
   POSSIBILITY OF SUCH DAMAGE.
31
   POSSIBILITY OF SUCH DAMAGE.
35
   ---------------------------------------------------------------------------*/
32
   ---------------------------------------------------------------------------*/
36
 
33
 
37
 
34
 
38
#if defined ( __ICCARM__ )
35
#if   defined ( __ICCARM__ )
39
 #pragma system_include  /* treat file as system include file for MISRA check */
36
 #pragma system_include         /* treat file as system include file for MISRA check */
-
 
37
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
-
 
38
  #pragma clang system_header   /* treat file as system include file */
40
#endif
39
#endif
41
 
40
 
42
#ifndef __CORE_CMSIMD_H
41
#ifndef __CORE_CMSIMD_H
43
#define __CORE_CMSIMD_H
42
#define __CORE_CMSIMD_H
44
 
43
 
45
#ifdef __cplusplus
44
#ifdef __cplusplus
46
 extern "C" {
45
 extern "C" {
47
#endif
46
#endif
48
 
47
 
49
 
48
 
50
/*******************************************************************************
-
 
51
 *                Hardware Abstraction Layer
-
 
52
 ******************************************************************************/
-
 
53
 
-
 
54
 
-
 
55
/* ###################  Compiler specific Intrinsics  ########################### */
49
/* ###################  Compiler specific Intrinsics  ########################### */
56
/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
50
/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
57
  Access to dedicated SIMD instructions
51
  Access to dedicated SIMD instructions
58
  @{
52
  @{
59
*/
53
*/
60
 
54
 
61
#if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
55
/*------------------ RealView Compiler -----------------*/
62
/* ARM armcc specific functions */
56
#if   defined ( __CC_ARM )
63
#define __SADD8                           __sadd8
57
  #include "cmsis_armcc.h"
64
#define __QADD8                           __qadd8
58
 
65
#define __SHADD8                          __shadd8
59
/*------------------ ARM Compiler V6 -------------------*/
66
#define __UADD8                           __uadd8
60
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
67
#define __UQADD8                          __uqadd8
61
  #include "cmsis_armcc_V6.h"
68
#define __UHADD8                          __uhadd8
62
 
69
#define __SSUB8                           __ssub8
63
/*------------------ GNU Compiler ----------------------*/
70
#define __QSUB8                           __qsub8
64
#elif defined ( __GNUC__ )
71
#define __SHSUB8                          __shsub8
65
  #include "cmsis_gcc.h"
72
#define __USUB8                           __usub8
66
 
73
#define __UQSUB8                          __uqsub8
67
/*------------------ ICC Compiler ----------------------*/
74
#define __UHSUB8                          __uhsub8
68
#elif defined ( __ICCARM__ )
75
#define __SADD16                          __sadd16
69
  #include <cmsis_iar.h>
76
#define __QADD16                          __qadd16
70
 
77
#define __SHADD16                         __shadd16
71
/*------------------ TI CCS Compiler -------------------*/
78
#define __UADD16                          __uadd16
72
#elif defined ( __TMS470__ )
79
#define __UQADD16                         __uqadd16
73
  #include <cmsis_ccs.h>
80
#define __UHADD16                         __uhadd16
74
 
81
#define __SSUB16                          __ssub16
75
/*------------------ TASKING Compiler ------------------*/
82
#define __QSUB16                          __qsub16
76
#elif defined ( __TASKING__ )
83
#define __SHSUB16                         __shsub16
77
  /*
84
#define __USUB16                          __usub16
78
   * The CMSIS functions have been implemented as intrinsics in the compiler.
85
#define __UQSUB16                         __uqsub16
79
   * Please use "carm -?i" to get an up to date list of all intrinsics,
86
#define __UHSUB16                         __uhsub16
80
   * Including the CMSIS ones.
87
#define __SASX                            __sasx
81
   */
88
#define __QASX                            __qasx
82
 
89
#define __SHASX                           __shasx
83
/*------------------ COSMIC Compiler -------------------*/
90
#define __UASX                            __uasx
84
#elif defined ( __CSMC__ )
91
#define __UQASX                           __uqasx
85
  #include <cmsis_csm.h>
92
#define __UHASX                           __uhasx
-
 
93
#define __SSAX                            __ssax
-
 
94
#define __QSAX                            __qsax
-
 
95
#define __SHSAX                           __shsax
-
 
96
#define __USAX                            __usax
-
 
97
#define __UQSAX                           __uqsax
-
 
98
#define __UHSAX                           __uhsax
-
 
99
#define __USAD8                           __usad8
-
 
100
#define __USADA8                          __usada8
-
 
101
#define __SSAT16                          __ssat16
-
 
102
#define __USAT16                          __usat16
-
 
103
#define __UXTB16                          __uxtb16
-
 
104
#define __UXTAB16                         __uxtab16
-
 
105
#define __SXTB16                          __sxtb16
-
 
106
#define __SXTAB16                         __sxtab16
-
 
107
#define __SMUAD                           __smuad
-
 
108
#define __SMUADX                          __smuadx
-
 
109
#define __SMLAD                           __smlad
-
 
110
#define __SMLADX                          __smladx
-
 
111
#define __SMLALD                          __smlald
-
 
112
#define __SMLALDX                         __smlaldx
-
 
113
#define __SMUSD                           __smusd
-
 
114
#define __SMUSDX                          __smusdx
-
 
115
#define __SMLSD                           __smlsd
-
 
116
#define __SMLSDX                          __smlsdx
-
 
117
#define __SMLSLD                          __smlsld
-
 
118
#define __SMLSLDX                         __smlsldx
-
 
119
#define __SEL                             __sel
-
 
120
#define __QADD                            __qadd
-
 
121
#define __QSUB                            __qsub
-
 
122
 
-
 
123
#define __PKHBT(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0x0000FFFFUL) |  \
-
 
124
                                           ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL)  )
-
 
125
 
-
 
126
#define __PKHTB(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0xFFFF0000UL) |  \
-
 
127
                                           ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL)  )
-
 
128
 
-
 
129
#define __SMMLA(ARG1,ARG2,ARG3)          ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \
-
 
130
                                                      ((int64_t)(ARG3) << 32)      ) >> 32))
-
 
131
 
-
 
132
 
-
 
133
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
-
 
134
/* GNU gcc specific functions */
-
 
135
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)
-
 
136
{
-
 
137
  uint32_t result;
-
 
138
 
-
 
139
  __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
140
  return(result);
-
 
141
}
-
 
142
 
-
 
143
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)
-
 
144
{
-
 
145
  uint32_t result;
-
 
146
 
-
 
147
  __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
148
  return(result);
-
 
149
}
-
 
150
 
-
 
151
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)
-
 
152
{
-
 
153
  uint32_t result;
-
 
154
 
-
 
155
  __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
156
  return(result);
-
 
157
}
-
 
158
 
-
 
159
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)
-
 
160
{
-
 
161
  uint32_t result;
-
 
162
 
-
 
163
  __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
164
  return(result);
-
 
165
}
-
 
166
 
-
 
167
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)
-
 
168
{
-
 
169
  uint32_t result;
-
 
170
 
-
 
171
  __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
172
  return(result);
-
 
173
}
-
 
174
 
-
 
175
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)
-
 
176
{
-
 
177
  uint32_t result;
-
 
178
 
-
 
179
  __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
180
  return(result);
-
 
181
}
-
 
182
 
-
 
183
 
-
 
184
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)
-
 
185
{
-
 
186
  uint32_t result;
-
 
187
 
-
 
188
  __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
189
  return(result);
-
 
190
}
-
 
191
 
-
 
192
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)
-
 
193
{
-
 
194
  uint32_t result;
-
 
195
 
-
 
196
  __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
197
  return(result);
-
 
198
}
-
 
199
 
-
 
200
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)
-
 
201
{
-
 
202
  uint32_t result;
-
 
203
 
-
 
204
  __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
205
  return(result);
-
 
206
}
-
 
207
 
-
 
208
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)
-
 
209
{
-
 
210
  uint32_t result;
-
 
211
 
-
 
212
  __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
213
  return(result);
-
 
214
}
-
 
215
 
-
 
216
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)
-
 
217
{
-
 
218
  uint32_t result;
-
 
219
 
-
 
220
  __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
221
  return(result);
-
 
222
}
-
 
223
 
-
 
224
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)
-
 
225
{
-
 
226
  uint32_t result;
-
 
227
 
-
 
228
  __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
229
  return(result);
-
 
230
}
-
 
231
 
-
 
232
 
-
 
233
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)
-
 
234
{
-
 
235
  uint32_t result;
-
 
236
 
-
 
237
  __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
238
  return(result);
-
 
239
}
-
 
240
 
-
 
241
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)
-
 
242
{
-
 
243
  uint32_t result;
-
 
244
 
-
 
245
  __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
246
  return(result);
-
 
247
}
-
 
248
 
-
 
249
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)
-
 
250
{
-
 
251
  uint32_t result;
-
 
252
 
-
 
253
  __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
254
  return(result);
-
 
255
}
-
 
256
 
-
 
257
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)
-
 
258
{
-
 
259
  uint32_t result;
-
 
260
 
-
 
261
  __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
262
  return(result);
-
 
263
}
-
 
264
 
-
 
265
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)
-
 
266
{
-
 
267
  uint32_t result;
-
 
268
 
-
 
269
  __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
270
  return(result);
-
 
271
}
-
 
272
 
-
 
273
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)
-
 
274
{
-
 
275
  uint32_t result;
-
 
276
 
-
 
277
  __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
278
  return(result);
-
 
279
}
-
 
280
 
-
 
281
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)
-
 
282
{
-
 
283
  uint32_t result;
-
 
284
 
-
 
285
  __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
286
  return(result);
-
 
287
}
-
 
288
 
-
 
289
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)
-
 
290
{
-
 
291
  uint32_t result;
-
 
292
 
-
 
293
  __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
294
  return(result);
-
 
295
}
-
 
296
 
-
 
297
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)
-
 
298
{
-
 
299
  uint32_t result;
-
 
300
 
-
 
301
  __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
302
  return(result);
-
 
303
}
-
 
304
 
-
 
305
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)
-
 
306
{
-
 
307
  uint32_t result;
-
 
308
 
-
 
309
  __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
310
  return(result);
-
 
311
}
-
 
312
 
-
 
313
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)
-
 
314
{
-
 
315
  uint32_t result;
-
 
316
 
-
 
317
  __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
318
  return(result);
-
 
319
}
-
 
320
 
-
 
321
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)
-
 
322
{
-
 
323
  uint32_t result;
-
 
324
 
-
 
325
  __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
326
  return(result);
-
 
327
}
-
 
328
 
-
 
329
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2)
-
 
330
{
-
 
331
  uint32_t result;
-
 
332
 
-
 
333
  __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
334
  return(result);
-
 
335
}
-
 
336
 
-
 
337
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2)
-
 
338
{
-
 
339
  uint32_t result;
-
 
340
 
-
 
341
  __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
342
  return(result);
-
 
343
}
-
 
344
 
-
 
345
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)
-
 
346
{
-
 
347
  uint32_t result;
-
 
348
 
-
 
349
  __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
350
  return(result);
-
 
351
}
-
 
352
 
-
 
353
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2)
-
 
354
{
-
 
355
  uint32_t result;
-
 
356
 
-
 
357
  __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
358
  return(result);
-
 
359
}
-
 
360
 
-
 
361
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)
-
 
362
{
-
 
363
  uint32_t result;
-
 
364
 
-
 
365
  __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
366
  return(result);
-
 
367
}
-
 
368
 
-
 
369
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)
-
 
370
{
-
 
371
  uint32_t result;
-
 
372
 
-
 
373
  __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
374
  return(result);
-
 
375
}
-
 
376
 
-
 
377
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)
-
 
378
{
-
 
379
  uint32_t result;
-
 
380
 
-
 
381
  __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
382
  return(result);
-
 
383
}
-
 
384
 
-
 
385
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)
-
 
386
{
-
 
387
  uint32_t result;
-
 
388
 
-
 
389
  __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
390
  return(result);
-
 
391
}
-
 
392
 
-
 
393
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)
-
 
394
{
-
 
395
  uint32_t result;
-
 
396
 
-
 
397
  __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
398
  return(result);
-
 
399
}
-
 
400
 
-
 
401
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2)
-
 
402
{
-
 
403
  uint32_t result;
-
 
404
 
-
 
405
  __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
406
  return(result);
-
 
407
}
-
 
408
 
-
 
409
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)
-
 
410
{
-
 
411
  uint32_t result;
-
 
412
 
-
 
413
  __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
414
  return(result);
-
 
415
}
-
 
416
 
-
 
417
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)
-
 
418
{
-
 
419
  uint32_t result;
-
 
420
 
-
 
421
  __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
422
  return(result);
-
 
423
}
-
 
424
 
-
 
425
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)
-
 
426
{
-
 
427
  uint32_t result;
-
 
428
 
-
 
429
  __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
430
  return(result);
-
 
431
}
-
 
432
 
-
 
433
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)
-
 
434
{
-
 
435
  uint32_t result;
-
 
436
 
-
 
437
  __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
-
 
438
  return(result);
-
 
439
}
-
 
440
 
-
 
441
#define __SSAT16(ARG1,ARG2) \
-
 
442
({                          \
-
 
443
  uint32_t __RES, __ARG1 = (ARG1); \
-
 
444
  __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \
-
 
445
  __RES; \
-
 
446
 })
-
 
447
 
-
 
448
#define __USAT16(ARG1,ARG2) \
-
 
449
({                          \
-
 
450
  uint32_t __RES, __ARG1 = (ARG1); \
-
 
451
  __ASM ("usat16 %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \
-
 
452
  __RES; \
-
 
453
 })
-
 
454
 
-
 
455
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1)
-
 
456
{
-
 
457
  uint32_t result;
-
 
458
 
-
 
459
  __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1));
-
 
460
  return(result);
-
 
461
}
-
 
462
 
-
 
463
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)
-
 
464
{
-
 
465
  uint32_t result;
-
 
466
 
-
 
467
  __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
468
  return(result);
-
 
469
}
-
 
470
 
-
 
471
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1)
-
 
472
{
-
 
473
  uint32_t result;
-
 
474
 
-
 
475
  __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1));
-
 
476
  return(result);
-
 
477
}
-
 
478
 
-
 
479
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)
-
 
480
{
-
 
481
  uint32_t result;
-
 
482
 
-
 
483
  __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
484
  return(result);
-
 
485
}
-
 
486
 
-
 
487
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUAD  (uint32_t op1, uint32_t op2)
-
 
488
{
-
 
489
  uint32_t result;
-
 
490
 
-
 
491
  __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
492
  return(result);
-
 
493
}
-
 
494
 
-
 
495
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)
-
 
496
{
-
 
497
  uint32_t result;
-
 
498
 
-
 
499
  __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
500
  return(result);
-
 
501
}
-
 
502
 
-
 
503
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)
-
 
504
{
-
 
505
  uint32_t result;
-
 
506
 
-
 
507
  __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
-
 
508
  return(result);
-
 
509
}
-
 
510
 
-
 
511
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)
-
 
512
{
-
 
513
  uint32_t result;
-
 
514
 
-
 
515
  __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
-
 
516
  return(result);
-
 
517
}
-
 
518
 
-
 
519
__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc)
-
 
520
{
-
 
521
  union llreg_u{
-
 
522
    uint32_t w32[2];
-
 
523
    uint64_t w64;
-
 
524
  } llr;
-
 
525
  llr.w64 = acc;
-
 
526
 
-
 
527
#ifndef __ARMEB__   // Little endian
-
 
528
  __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
-
 
529
#else               // Big endian
-
 
530
  __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
-
 
531
#endif
-
 
532
 
-
 
533
  return(llr.w64);
-
 
534
}
-
 
535
 
-
 
536
__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc)
-
 
537
{
-
 
538
  union llreg_u{
-
 
539
    uint32_t w32[2];
-
 
540
    uint64_t w64;
-
 
541
  } llr;
-
 
542
  llr.w64 = acc;
-
 
543
 
-
 
544
#ifndef __ARMEB__   // Little endian
-
 
545
  __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
-
 
546
#else               // Big endian
-
 
547
  __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
-
 
548
#endif
-
 
549
 
-
 
550
  return(llr.w64);
-
 
551
}
-
 
552
 
-
 
553
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSD  (uint32_t op1, uint32_t op2)
-
 
554
{
-
 
555
  uint32_t result;
-
 
556
 
-
 
557
  __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
558
  return(result);
-
 
559
}
-
 
560
 
-
 
561
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)
-
 
562
{
-
 
563
  uint32_t result;
-
 
564
 
-
 
565
  __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
566
  return(result);
-
 
567
}
-
 
568
 
-
 
569
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)
-
 
570
{
-
 
571
  uint32_t result;
-
 
572
 
-
 
573
  __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
-
 
574
  return(result);
-
 
575
}
-
 
576
 
-
 
577
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)
-
 
578
{
-
 
579
  uint32_t result;
-
 
580
 
-
 
581
  __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
-
 
582
  return(result);
-
 
583
}
-
 
584
 
-
 
585
__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc)
-
 
586
{
-
 
587
  union llreg_u{
-
 
588
    uint32_t w32[2];
-
 
589
    uint64_t w64;
-
 
590
  } llr;
-
 
591
  llr.w64 = acc;
-
 
592
 
-
 
593
#ifndef __ARMEB__   // Little endian
-
 
594
  __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
-
 
595
#else               // Big endian
-
 
596
  __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
-
 
597
#endif
-
 
598
 
-
 
599
  return(llr.w64);
-
 
600
}
-
 
601
 
-
 
602
__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc)
-
 
603
{
-
 
604
  union llreg_u{
-
 
605
    uint32_t w32[2];
-
 
606
    uint64_t w64;
-
 
607
  } llr;
-
 
608
  llr.w64 = acc;
-
 
609
 
-
 
610
#ifndef __ARMEB__   // Little endian
-
 
611
  __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
-
 
612
#else               // Big endian
-
 
613
  __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
-
 
614
#endif
-
 
615
 
-
 
616
  return(llr.w64);
-
 
617
}
-
 
618
 
-
 
619
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SEL  (uint32_t op1, uint32_t op2)
-
 
620
{
-
 
621
  uint32_t result;
-
 
622
 
-
 
623
  __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
624
  return(result);
-
 
625
}
-
 
626
 
-
 
627
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD(uint32_t op1, uint32_t op2)
-
 
628
{
-
 
629
  uint32_t result;
-
 
630
 
-
 
631
  __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
632
  return(result);
-
 
633
}
-
 
634
 
-
 
635
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2)
-
 
636
{
-
 
637
  uint32_t result;
-
 
638
 
-
 
639
  __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-
 
640
  return(result);
-
 
641
}
-
 
642
 
-
 
643
#define __PKHBT(ARG1,ARG2,ARG3) \
-
 
644
({                          \
-
 
645
  uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
-
 
646
  __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2), "I" (ARG3)  ); \
-
 
647
  __RES; \
-
 
648
 })
-
 
649
 
-
 
650
#define __PKHTB(ARG1,ARG2,ARG3) \
-
 
651
({                          \
-
 
652
  uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
-
 
653
  if (ARG3 == 0) \
-
 
654
    __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2)  ); \
-
 
655
  else \
-
 
656
    __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2), "I" (ARG3)  ); \
-
 
657
  __RES; \
-
 
658
 })
-
 
659
 
-
 
660
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3)
-
 
661
{
-
 
662
 int32_t result;
-
 
663
 
-
 
664
 __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r"  (op1), "r" (op2), "r" (op3) );
-
 
665
 return(result);
-
 
666
}
-
 
667
 
-
 
668
 
-
 
669
#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
-
 
670
/* IAR iccarm specific functions */
-
 
671
#include <cmsis_iar.h>
-
 
672
 
-
 
673
 
-
 
674
#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
-
 
675
/* TI CCS specific functions */
-
 
676
#include <cmsis_ccs.h>
-
 
677
 
-
 
678
 
-
 
679
#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
-
 
680
/* TASKING carm specific functions */
-
 
681
/* not yet supported */
-
 
682
 
-
 
683
 
-
 
684
#elif defined ( __CSMC__ ) /*------------------ COSMIC Compiler -------------------*/
-
 
685
/* Cosmic specific functions */
-
 
686
#include <cmsis_csm.h>
-
 
687
 
86
 
688
#endif
87
#endif
689
 
88
 
690
/*@} end of group CMSIS_SIMD_intrinsics */
89
/*@} end of group CMSIS_SIMD_intrinsics */
691
 
90