source: rtems/c/src/lib/libbsp/arm/stm32f7x/hal/CMSIS/Include/core_cmInstr.h @ c20847a5

5
Last change on this file since c20847a5 was c20847a5, checked in by Isaac Gutekunst <isaac.gutekunst@…>, on 09/16/15 at 13:16:02

Add STM32F7 HAL Files

These files originated as:

+ STC32CubeF7 V1.1.0 from http://www.st.com/web/en/catalog/tools/PF261909

  • Property mode set to 100644
File size: 26.4 KB
Line 
1/**************************************************************************//**
2 * @file     core_cmInstr.h
3 * @brief    CMSIS Cortex-M Core Instruction Access 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#ifndef __CORE_CMINSTR_H
39#define __CORE_CMINSTR_H
40
41
42/* ##########################  Core Instruction Access  ######################### */
43/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
44  Access to dedicated instructions
45  @{
46*/
47
48#if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
49/* ARM armcc specific functions */
50
51#if (__ARMCC_VERSION < 400677)
52  #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
53#endif
54
55
56/** \brief  No Operation
57
58    No Operation does nothing. This instruction can be used for code alignment purposes.
59 */
60#define __NOP                             __nop
61
62
63/** \brief  Wait For Interrupt
64
65    Wait For Interrupt is a hint instruction that suspends execution
66    until one of a number of events occurs.
67 */
68#define __WFI                             __wfi
69
70
71/** \brief  Wait For Event
72
73    Wait For Event is a hint instruction that permits the processor to enter
74    a low-power state until one of a number of events occurs.
75 */
76#define __WFE                             __wfe
77
78
79/** \brief  Send Event
80
81    Send Event is a hint instruction. It causes an event to be signaled to the CPU.
82 */
83#define __SEV                             __sev
84
85
86/** \brief  Instruction Synchronization Barrier
87
88    Instruction Synchronization Barrier flushes the pipeline in the processor,
89    so that all instructions following the ISB are fetched from cache or
90    memory, after the instruction has been completed.
91 */
92#define __ISB() do {\
93                   __schedule_barrier();\
94                   __isb(0xF);\
95                   __schedule_barrier();\
96                } while (0)
97
98/** \brief  Data Synchronization Barrier
99
100    This function acts as a special kind of Data Memory Barrier.
101    It completes when all explicit memory accesses before this instruction complete.
102 */
103#define __DSB() do {\
104                   __schedule_barrier();\
105                   __dsb(0xF);\
106                   __schedule_barrier();\
107                } while (0)
108
109/** \brief  Data Memory Barrier
110
111    This function ensures the apparent order of the explicit memory operations before
112    and after the instruction, without ensuring their completion.
113 */
114#define __DMB() do {\
115                   __schedule_barrier();\
116                   __dmb(0xF);\
117                   __schedule_barrier();\
118                } while (0)
119
120/** \brief  Reverse byte order (32 bit)
121
122    This function reverses the byte order in integer value.
123
124    \param [in]    value  Value to reverse
125    \return               Reversed value
126 */
127#define __REV                             __rev
128
129
130/** \brief  Reverse byte order (16 bit)
131
132    This function reverses the byte order in two unsigned short values.
133
134    \param [in]    value  Value to reverse
135    \return               Reversed value
136 */
137#ifndef __NO_EMBEDDED_ASM
138__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
139{
140  rev16 r0, r0
141  bx lr
142}
143#endif
144
145/** \brief  Reverse byte order in signed short value
146
147    This function reverses the byte order in a signed short value with sign extension to integer.
148
149    \param [in]    value  Value to reverse
150    \return               Reversed value
151 */
152#ifndef __NO_EMBEDDED_ASM
153__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value)
154{
155  revsh r0, r0
156  bx lr
157}
158#endif
159
160
161/** \brief  Rotate Right in unsigned value (32 bit)
162
163    This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
164
165    \param [in]    value  Value to rotate
166    \param [in]    value  Number of Bits to rotate
167    \return               Rotated value
168 */
169#define __ROR                             __ror
170
171
172/** \brief  Breakpoint
173
174    This function causes the processor to enter Debug state.
175    Debug tools can use this to investigate system state when the instruction at a particular address is reached.
176
177    \param [in]    value  is ignored by the processor.
178                   If required, a debugger can use it to store additional information about the breakpoint.
179 */
180#define __BKPT(value)                       __breakpoint(value)
181
182
183/** \brief  Reverse bit order of value
184
185    This function reverses the bit order of the given value.
186
187    \param [in]    value  Value to reverse
188    \return               Reversed value
189 */
190#if       (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
191  #define __RBIT                          __rbit
192#else
193__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
194{
195  uint32_t result;
196  int32_t s = 4 /*sizeof(v)*/ * 8 - 1; // extra shift needed at end
197
198  result = value;                      // r will be reversed bits of v; first get LSB of v
199  for (value >>= 1; value; value >>= 1)
200  {
201    result <<= 1;
202    result |= value & 1;
203    s--;
204  }
205  result <<= s;                       // shift when v's highest bits are zero
206  return(result);
207}
208#endif
209
210
211/** \brief  Count leading zeros
212
213    This function counts the number of leading zeros of a data value.
214
215    \param [in]  value  Value to count the leading zeros
216    \return             number of leading zeros in value
217 */
218#define __CLZ                             __clz
219
220
221#if       (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
222
223/** \brief  LDR Exclusive (8 bit)
224
225    This function executes a exclusive LDR instruction for 8 bit value.
226
227    \param [in]    ptr  Pointer to data
228    \return             value of type uint8_t at (*ptr)
229 */
230#define __LDREXB(ptr)                     ((uint8_t ) __ldrex(ptr))
231
232
233/** \brief  LDR Exclusive (16 bit)
234
235    This function executes a exclusive LDR instruction for 16 bit values.
236
237    \param [in]    ptr  Pointer to data
238    \return        value of type uint16_t at (*ptr)
239 */
240#define __LDREXH(ptr)                     ((uint16_t) __ldrex(ptr))
241
242
243/** \brief  LDR Exclusive (32 bit)
244
245    This function executes a exclusive LDR instruction for 32 bit values.
246
247    \param [in]    ptr  Pointer to data
248    \return        value of type uint32_t at (*ptr)
249 */
250#define __LDREXW(ptr)                     ((uint32_t ) __ldrex(ptr))
251
252
253/** \brief  STR Exclusive (8 bit)
254
255    This function executes a exclusive STR instruction for 8 bit values.
256
257    \param [in]  value  Value to store
258    \param [in]    ptr  Pointer to location
259    \return          0  Function succeeded
260    \return          1  Function failed
261 */
262#define __STREXB(value, ptr)              __strex(value, ptr)
263
264
265/** \brief  STR Exclusive (16 bit)
266
267    This function executes a exclusive STR instruction for 16 bit values.
268
269    \param [in]  value  Value to store
270    \param [in]    ptr  Pointer to location
271    \return          0  Function succeeded
272    \return          1  Function failed
273 */
274#define __STREXH(value, ptr)              __strex(value, ptr)
275
276
277/** \brief  STR Exclusive (32 bit)
278
279    This function executes a exclusive STR instruction for 32 bit values.
280
281    \param [in]  value  Value to store
282    \param [in]    ptr  Pointer to location
283    \return          0  Function succeeded
284    \return          1  Function failed
285 */
286#define __STREXW(value, ptr)              __strex(value, ptr)
287
288
289/** \brief  Remove the exclusive lock
290
291    This function removes the exclusive lock which is created by LDREX.
292
293 */
294#define __CLREX                           __clrex
295
296
297/** \brief  Signed Saturate
298
299    This function saturates a signed value.
300
301    \param [in]  value  Value to be saturated
302    \param [in]    sat  Bit position to saturate to (1..32)
303    \return             Saturated value
304 */
305#define __SSAT                            __ssat
306
307
308/** \brief  Unsigned Saturate
309
310    This function saturates an unsigned value.
311
312    \param [in]  value  Value to be saturated
313    \param [in]    sat  Bit position to saturate to (0..31)
314    \return             Saturated value
315 */
316#define __USAT                            __usat
317
318
319/** \brief  Rotate Right with Extend (32 bit)
320
321    This function moves each bit of a bitstring right by one bit.
322    The carry input is shifted in at the left end of the bitstring.
323
324    \param [in]    value  Value to rotate
325    \return               Rotated value
326 */
327#ifndef __NO_EMBEDDED_ASM
328__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value)
329{
330  rrx r0, r0
331  bx lr
332}
333#endif
334
335
336/** \brief  LDRT Unprivileged (8 bit)
337
338    This function executes a Unprivileged LDRT instruction for 8 bit value.
339
340    \param [in]    ptr  Pointer to data
341    \return             value of type uint8_t at (*ptr)
342 */
343#define __LDRBT(ptr)                      ((uint8_t )  __ldrt(ptr))
344
345
346/** \brief  LDRT Unprivileged (16 bit)
347
348    This function executes a Unprivileged LDRT instruction for 16 bit values.
349
350    \param [in]    ptr  Pointer to data
351    \return        value of type uint16_t at (*ptr)
352 */
353#define __LDRHT(ptr)                      ((uint16_t)  __ldrt(ptr))
354
355
356/** \brief  LDRT Unprivileged (32 bit)
357
358    This function executes a Unprivileged LDRT instruction for 32 bit values.
359
360    \param [in]    ptr  Pointer to data
361    \return        value of type uint32_t at (*ptr)
362 */
363#define __LDRT(ptr)                       ((uint32_t ) __ldrt(ptr))
364
365
366/** \brief  STRT Unprivileged (8 bit)
367
368    This function executes a Unprivileged STRT instruction for 8 bit values.
369
370    \param [in]  value  Value to store
371    \param [in]    ptr  Pointer to location
372 */
373#define __STRBT(value, ptr)               __strt(value, ptr)
374
375
376/** \brief  STRT Unprivileged (16 bit)
377
378    This function executes a Unprivileged STRT instruction for 16 bit values.
379
380    \param [in]  value  Value to store
381    \param [in]    ptr  Pointer to location
382 */
383#define __STRHT(value, ptr)               __strt(value, ptr)
384
385
386/** \brief  STRT Unprivileged (32 bit)
387
388    This function executes a Unprivileged STRT instruction for 32 bit values.
389
390    \param [in]  value  Value to store
391    \param [in]    ptr  Pointer to location
392 */
393#define __STRT(value, ptr)                __strt(value, ptr)
394
395#endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */
396
397
398#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
399/* GNU gcc specific functions */
400
401/* Define macros for porting to both thumb1 and thumb2.
402 * For thumb1, use low register (r0-r7), specified by constrant "l"
403 * Otherwise, use general registers, specified by constrant "r" */
404#if defined (__thumb__) && !defined (__thumb2__)
405#define __CMSIS_GCC_OUT_REG(r) "=l" (r)
406#define __CMSIS_GCC_USE_REG(r) "l" (r)
407#else
408#define __CMSIS_GCC_OUT_REG(r) "=r" (r)
409#define __CMSIS_GCC_USE_REG(r) "r" (r)
410#endif
411
412/** \brief  No Operation
413
414    No Operation does nothing. This instruction can be used for code alignment purposes.
415 */
416__attribute__((always_inline)) __STATIC_INLINE void __NOP(void)
417{
418  __ASM volatile ("nop");
419}
420
421
422/** \brief  Wait For Interrupt
423
424    Wait For Interrupt is a hint instruction that suspends execution
425    until one of a number of events occurs.
426 */
427__attribute__((always_inline)) __STATIC_INLINE void __WFI(void)
428{
429  __ASM volatile ("wfi");
430}
431
432
433/** \brief  Wait For Event
434
435    Wait For Event is a hint instruction that permits the processor to enter
436    a low-power state until one of a number of events occurs.
437 */
438__attribute__((always_inline)) __STATIC_INLINE void __WFE(void)
439{
440  __ASM volatile ("wfe");
441}
442
443
444/** \brief  Send Event
445
446    Send Event is a hint instruction. It causes an event to be signaled to the CPU.
447 */
448__attribute__((always_inline)) __STATIC_INLINE void __SEV(void)
449{
450  __ASM volatile ("sev");
451}
452
453
454/** \brief  Instruction Synchronization Barrier
455
456    Instruction Synchronization Barrier flushes the pipeline in the processor,
457    so that all instructions following the ISB are fetched from cache or
458    memory, after the instruction has been completed.
459 */
460__attribute__((always_inline)) __STATIC_INLINE void __ISB(void)
461{
462  __ASM volatile ("isb 0xF":::"memory");
463}
464
465
466/** \brief  Data Synchronization Barrier
467
468    This function acts as a special kind of Data Memory Barrier.
469    It completes when all explicit memory accesses before this instruction complete.
470 */
471__attribute__((always_inline)) __STATIC_INLINE void __DSB(void)
472{
473  __ASM volatile ("dsb 0xF":::"memory");
474}
475
476
477/** \brief  Data Memory Barrier
478
479    This function ensures the apparent order of the explicit memory operations before
480    and after the instruction, without ensuring their completion.
481 */
482__attribute__((always_inline)) __STATIC_INLINE void __DMB(void)
483{
484  __ASM volatile ("dmb 0xF":::"memory");
485}
486
487
488/** \brief  Reverse byte order (32 bit)
489
490    This function reverses the byte order in integer value.
491
492    \param [in]    value  Value to reverse
493    \return               Reversed value
494 */
495__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV(uint32_t value)
496{
497#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
498  return __builtin_bswap32(value);
499#else
500  uint32_t result;
501
502  __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
503  return(result);
504#endif
505}
506
507
508/** \brief  Reverse byte order (16 bit)
509
510    This function reverses the byte order in two unsigned short values.
511
512    \param [in]    value  Value to reverse
513    \return               Reversed value
514 */
515__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value)
516{
517  uint32_t result;
518
519  __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
520  return(result);
521}
522
523
524/** \brief  Reverse byte order in signed short value
525
526    This function reverses the byte order in a signed short value with sign extension to integer.
527
528    \param [in]    value  Value to reverse
529    \return               Reversed value
530 */
531__attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value)
532{
533#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
534  return (short)__builtin_bswap16(value);
535#else
536  uint32_t result;
537
538  __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
539  return(result);
540#endif
541}
542
543
544/** \brief  Rotate Right in unsigned value (32 bit)
545
546    This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
547
548    \param [in]    value  Value to rotate
549    \param [in]    value  Number of Bits to rotate
550    \return               Rotated value
551 */
552__attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
553{
554  return (op1 >> op2) | (op1 << (32 - op2));
555}
556
557
558/** \brief  Breakpoint
559
560    This function causes the processor to enter Debug state.
561    Debug tools can use this to investigate system state when the instruction at a particular address is reached.
562
563    \param [in]    value  is ignored by the processor.
564                   If required, a debugger can use it to store additional information about the breakpoint.
565 */
566#define __BKPT(value)                       __ASM volatile ("bkpt "#value)
567
568
569/** \brief  Reverse bit order of value
570
571    This function reverses the bit order of the given value.
572
573    \param [in]    value  Value to reverse
574    \return               Reversed value
575 */
576__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
577{
578  uint32_t result;
579
580#if       (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
581   __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
582#else
583  int32_t s = 4 /*sizeof(v)*/ * 8 - 1; // extra shift needed at end
584
585  result = value;                      // r will be reversed bits of v; first get LSB of v
586  for (value >>= 1; value; value >>= 1)
587  {
588    result <<= 1;
589    result |= value & 1;
590    s--;
591  }
592  result <<= s;                       // shift when v's highest bits are zero
593#endif
594  return(result);
595}
596
597
598/** \brief  Count leading zeros
599
600    This function counts the number of leading zeros of a data value.
601
602    \param [in]  value  Value to count the leading zeros
603    \return             number of leading zeros in value
604 */
605#define __CLZ             __builtin_clz
606
607
608#if       (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
609
610/** \brief  LDR Exclusive (8 bit)
611
612    This function executes a exclusive LDR instruction for 8 bit value.
613
614    \param [in]    ptr  Pointer to data
615    \return             value of type uint8_t at (*ptr)
616 */
617__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr)
618{
619    uint32_t result;
620
621#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
622   __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) );
623#else
624    /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
625       accepted by assembler. So has to use following less efficient pattern.
626    */
627   __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
628#endif
629   return ((uint8_t) result);    /* Add explicit type cast here */
630}
631
632
633/** \brief  LDR Exclusive (16 bit)
634
635    This function executes a exclusive LDR instruction for 16 bit values.
636
637    \param [in]    ptr  Pointer to data
638    \return        value of type uint16_t at (*ptr)
639 */
640__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr)
641{
642    uint32_t result;
643
644#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
645   __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) );
646#else
647    /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
648       accepted by assembler. So has to use following less efficient pattern.
649    */
650   __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
651#endif
652   return ((uint16_t) result);    /* Add explicit type cast here */
653}
654
655
656/** \brief  LDR Exclusive (32 bit)
657
658    This function executes a exclusive LDR instruction for 32 bit values.
659
660    \param [in]    ptr  Pointer to data
661    \return        value of type uint32_t at (*ptr)
662 */
663__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr)
664{
665    uint32_t result;
666
667   __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
668   return(result);
669}
670
671
672/** \brief  STR Exclusive (8 bit)
673
674    This function executes a exclusive STR instruction for 8 bit values.
675
676    \param [in]  value  Value to store
677    \param [in]    ptr  Pointer to location
678    \return          0  Function succeeded
679    \return          1  Function failed
680 */
681__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
682{
683   uint32_t result;
684
685   __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) );
686   return(result);
687}
688
689
690/** \brief  STR Exclusive (16 bit)
691
692    This function executes a exclusive STR instruction for 16 bit values.
693
694    \param [in]  value  Value to store
695    \param [in]    ptr  Pointer to location
696    \return          0  Function succeeded
697    \return          1  Function failed
698 */
699__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
700{
701   uint32_t result;
702
703   __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) );
704   return(result);
705}
706
707
708/** \brief  STR Exclusive (32 bit)
709
710    This function executes a exclusive STR instruction for 32 bit values.
711
712    \param [in]  value  Value to store
713    \param [in]    ptr  Pointer to location
714    \return          0  Function succeeded
715    \return          1  Function failed
716 */
717__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
718{
719   uint32_t result;
720
721   __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
722   return(result);
723}
724
725
726/** \brief  Remove the exclusive lock
727
728    This function removes the exclusive lock which is created by LDREX.
729
730 */
731__attribute__((always_inline)) __STATIC_INLINE void __CLREX(void)
732{
733  __ASM volatile ("clrex" ::: "memory");
734}
735
736
737/** \brief  Signed Saturate
738
739    This function saturates a signed value.
740
741    \param [in]  value  Value to be saturated
742    \param [in]    sat  Bit position to saturate to (1..32)
743    \return             Saturated value
744 */
745#define __SSAT(ARG1,ARG2) \
746({                          \
747  uint32_t __RES, __ARG1 = (ARG1); \
748  __ASM ("ssat %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \
749  __RES; \
750 })
751
752
753/** \brief  Unsigned Saturate
754
755    This function saturates an unsigned value.
756
757    \param [in]  value  Value to be saturated
758    \param [in]    sat  Bit position to saturate to (0..31)
759    \return             Saturated value
760 */
761#define __USAT(ARG1,ARG2) \
762({                          \
763  uint32_t __RES, __ARG1 = (ARG1); \
764  __ASM ("usat %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \
765  __RES; \
766 })
767
768
769/** \brief  Rotate Right with Extend (32 bit)
770
771    This function moves each bit of a bitstring right by one bit.
772    The carry input is shifted in at the left end of the bitstring.
773
774    \param [in]    value  Value to rotate
775    \return               Rotated value
776 */
777__attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value)
778{
779  uint32_t result;
780
781  __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
782  return(result);
783}
784
785
786/** \brief  LDRT Unprivileged (8 bit)
787
788    This function executes a Unprivileged LDRT instruction for 8 bit value.
789
790    \param [in]    ptr  Pointer to data
791    \return             value of type uint8_t at (*ptr)
792 */
793__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *addr)
794{
795    uint32_t result;
796
797#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
798   __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*addr) );
799#else
800    /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
801       accepted by assembler. So has to use following less efficient pattern.
802    */
803   __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
804#endif
805   return ((uint8_t) result);    /* Add explicit type cast here */
806}
807
808
809/** \brief  LDRT Unprivileged (16 bit)
810
811    This function executes a Unprivileged LDRT instruction for 16 bit values.
812
813    \param [in]    ptr  Pointer to data
814    \return        value of type uint16_t at (*ptr)
815 */
816__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *addr)
817{
818    uint32_t result;
819
820#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
821   __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*addr) );
822#else
823    /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
824       accepted by assembler. So has to use following less efficient pattern.
825    */
826   __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
827#endif
828   return ((uint16_t) result);    /* Add explicit type cast here */
829}
830
831
832/** \brief  LDRT Unprivileged (32 bit)
833
834    This function executes a Unprivileged LDRT instruction for 32 bit values.
835
836    \param [in]    ptr  Pointer to data
837    \return        value of type uint32_t at (*ptr)
838 */
839__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *addr)
840{
841    uint32_t result;
842
843   __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*addr) );
844   return(result);
845}
846
847
848/** \brief  STRT Unprivileged (8 bit)
849
850    This function executes a Unprivileged STRT instruction for 8 bit values.
851
852    \param [in]  value  Value to store
853    \param [in]    ptr  Pointer to location
854 */
855__attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *addr)
856{
857   __ASM volatile ("strbt %1, %0" : "=Q" (*addr) : "r" ((uint32_t)value) );
858}
859
860
861/** \brief  STRT Unprivileged (16 bit)
862
863    This function executes a Unprivileged STRT instruction for 16 bit values.
864
865    \param [in]  value  Value to store
866    \param [in]    ptr  Pointer to location
867 */
868__attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *addr)
869{
870   __ASM volatile ("strht %1, %0" : "=Q" (*addr) : "r" ((uint32_t)value) );
871}
872
873
874/** \brief  STRT Unprivileged (32 bit)
875
876    This function executes a Unprivileged STRT instruction for 32 bit values.
877
878    \param [in]  value  Value to store
879    \param [in]    ptr  Pointer to location
880 */
881__attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *addr)
882{
883   __ASM volatile ("strt %1, %0" : "=Q" (*addr) : "r" (value) );
884}
885
886#endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */
887
888
889#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
890/* IAR iccarm specific functions */
891#include <cmsis_iar.h>
892
893
894#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
895/* TI CCS specific functions */
896#include <cmsis_ccs.h>
897
898
899#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
900/* TASKING carm specific functions */
901/*
902 * The CMSIS functions have been implemented as intrinsics in the compiler.
903 * Please use "carm -?i" to get an up to date list of all intrinsics,
904 * Including the CMSIS ones.
905 */
906
907
908#elif defined ( __CSMC__ ) /*------------------ COSMIC Compiler -------------------*/
909/* Cosmic specific functions */
910#include <cmsis_csm.h>
911
912#endif
913
914/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
915
916#endif /* __CORE_CMINSTR_H */
Note: See TracBrowser for help on using the repository browser.