Re: Inline assembly without inputs considered const/pure?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 02/23/2016 09:20 AM, Matthias Pfaller wrote:
> Hi,
> 
> I'm using __asm on a cortex-m4 to enable/disable/restore interrupts.
> 
> I have defined a couple of macros to manipulate registers only available
> by using the msr/mrs opcodes:
> 
>> #define mrs(x)  ({                                                          \
>>         volatile unsigned int __r = 0;                                      \
>>         __asm__ __volatile__("" : : : "memory");                            \
>>         __asm__("mrs %[R]," __STRING(x) : [R] "=r" (__r) : : "cc", "memory");\
>>         __r;                                                                \
>>     })

After some tries I found an actually quite simple solution for my
problem. The compiler deletes the mrs because it has no input. So we
have to provide input that is constant, but different on each invocation
of the macro. Using the "J" constraints I can supply an integer constant
between -4095 and 4095 without forcing the compiler to produce any load
requests. __LINE__ is a source for unique integers:

> #define mrs(x)  ({                                                          \
>         unsigned int __r;                                                   \
>         __asm__ __volatile__("" : : : "memory");                            \
>         __asm__("mrs %[R]," __STRING(x) "/* %[D] avoid constant folding */" \
>             : [R] "=r" (__r)                                                \
>             : [D] "J" ((__LINE__ & 0x1fff) - 0xfff)                         \
>             : "cc", "memory"                                                \
>         );                                                                  \   
>         __r;                                                                \   
>     })

Matthias
-- 
Matthias Pfaller                          Software Entwicklung
marco Systemanalyse und Entwicklung GmbH  Tel   +49 8131 5161 41
Hans-Böckler-Str. 2, D 85221 Dachau       Fax   +49 8131 5161 66
http://www.marco.de/                      Email leo@xxxxxxxx
Geschäftsführer Martin Reuter             HRB 171775 Amtsgericht München



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux