Subversion Repositories DashDisplay

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 1
/**************************************************************************//**
2
 * @file     core_cmSimd.h
3
 * @brief    CMSIS Cortex-M SIMD Header File
4
 * @version  V4.10
5
 * @date     18. March 2015
6
 *
7
 * @note
8
 *
9
 ******************************************************************************/
10
/* Copyright (c) 2009 - 2014 ARM LIMITED
11
 
12
   All rights reserved.
13
   Redistribution and use in source and binary forms, with or without
14
   modification, are permitted provided that the following conditions are met:
15
   - Redistributions of source code must retain the above copyright
16
     notice, this list of conditions and the following disclaimer.
17
   - Redistributions in binary form must reproduce the above copyright
18
     notice, this list of conditions and the following disclaimer in the
19
     documentation and/or other materials provided with the distribution.
20
   - Neither the name of ARM nor the names of its contributors may be used
21
     to endorse or promote products derived from this software without
22
     specific prior written permission.
23
   *
24
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25
   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27
   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
28
   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29
   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30
   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31
   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32
   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33
   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
   POSSIBILITY OF SUCH DAMAGE.
35
   ---------------------------------------------------------------------------*/
36
 
37
 
38
#if defined ( __ICCARM__ )
39
 #pragma system_include  /* treat file as system include file for MISRA check */
40
#endif
41
 
42
#ifndef __CORE_CMSIMD_H
43
#define __CORE_CMSIMD_H
44
 
45
#ifdef __cplusplus
46
 extern "C" {
47
#endif
48
 
49
 
50
/*******************************************************************************
51
 *                Hardware Abstraction Layer
52
 ******************************************************************************/
53
 
54
 
55
/* ###################  Compiler specific Intrinsics  ########################### */
56
/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
57
  Access to dedicated SIMD instructions
58
  @{
59
*/
60
 
61
#if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
62
/* ARM armcc specific functions */
63
#define __SADD8                           __sadd8
64
#define __QADD8                           __qadd8
65
#define __SHADD8                          __shadd8
66
#define __UADD8                           __uadd8
67
#define __UQADD8                          __uqadd8
68
#define __UHADD8                          __uhadd8
69
#define __SSUB8                           __ssub8
70
#define __QSUB8                           __qsub8
71
#define __SHSUB8                          __shsub8
72
#define __USUB8                           __usub8
73
#define __UQSUB8                          __uqsub8
74
#define __UHSUB8                          __uhsub8
75
#define __SADD16                          __sadd16
76
#define __QADD16                          __qadd16
77
#define __SHADD16                         __shadd16
78
#define __UADD16                          __uadd16
79
#define __UQADD16                         __uqadd16
80
#define __UHADD16                         __uhadd16
81
#define __SSUB16                          __ssub16
82
#define __QSUB16                          __qsub16
83
#define __SHSUB16                         __shsub16
84
#define __USUB16                          __usub16
85
#define __UQSUB16                         __uqsub16
86
#define __UHSUB16                         __uhsub16
87
#define __SASX                            __sasx
88
#define __QASX                            __qasx
89
#define __SHASX                           __shasx
90
#define __UASX                            __uasx
91
#define __UQASX                           __uqasx
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
 
688
#endif
689
 
690
/*@} end of group CMSIS_SIMD_intrinsics */
691
 
692
 
693
#ifdef __cplusplus
694
}
695
#endif
696
 
697
#endif /* __CORE_CMSIMD_H */