You mentioned in synth_dc.h "// if only C language provided a way to test Q status bit...." Here it is :) . That return (out & 0x8000000)>>27; translates to only one more instruction : ubfx r0, r0, #27, #1 , i decided to use the c -variant because it is better to readable. I added a function to clear that bit ( clr_q_psr() ), too. Unfortunately, three instructions are needed (read-modify-write)dds
| return out; | return out; | ||||
| } | } | ||||
| //get Q from PSR | |||||
| static inline uint32_t get_q_psr(void) __attribute__((always_inline, unused)); | |||||
| static inline uint32_t get_q_psr(void) | |||||
| { | |||||
| uint32_t out; | |||||
| asm volatile("mrs %0, APSR" : "=r" (out)); | |||||
| return (out & 0x8000000)>>27; | |||||
| } | |||||
| //clear Q BIT in PSR | |||||
| static inline void clr_q_psr(void) __attribute__((always_inline, unused)); | |||||
| static inline void clr_q_psr(void) | |||||
| { | |||||
| uint32_t t; | |||||
| asm volatile("mrs %0,APSR " : "=r" (t)); | |||||
| asm volatile("bfc %0, #27, #1" : "=r" (t)); | |||||
| asm volatile("msr APSR_nzcvq,%0" : "=r" (t)); | |||||
| } | |||||
| #endif | #endif |