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