On 2017-10-17 00:27 +0200, David Brown wrote: > My testing suggests that gcc will re-order "asm volatile" statements > that have an output, such as the "save the PRIMASK into status" > statement, but it will /not/ re-order "asm volatile" statements that > have no outputs. > > Is that correct? > > Is that the intended behaviour of "asm volatile" ? Yes. It's said in the documentation <https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/Extended-Asm.html>: Note that the compiler can move even volatile asm instructions relative to other code, including across jump instructions. For example, on many targets there is a system register that controls the rounding mode of floating-point operations. Setting it with a volatile asm, as in the following PowerPC example, does not work reliably. asm volatile("mtfsf 255, %0" : : "f" (fpenv)); sum = x + y; The compiler may move the addition back before the volatile asm. To make it work as expected, add an artificial dependency to the asm by referencing a variable in the subsequent code, for example: asm volatile ("mtfsf 255,%1" : "=X" (sum) : "f" (fpenv)); sum = x + y; > If so, is that a good design choice or should it be changed? I don't know. I think it is just a choice, not so good and not so bad. > Could the documentation in the gcc web page be improved? The documentation is very clear. > Or is this a bug in gcc, and the statements should not have been re-ordered? > > > David -- Xi Ruoyao <ryxi@xxxxxxxxxxxxxxxxx> School of Aerospace Science and Technology, Xidian University