================
Comment at: lib/Headers/arm_acle.h:121
@@ +120,3 @@
+__set_saturation_occurred(int occurred) {
+  __asm__ __volatile__ ("msr cpsr_q, %0" : : "r" (occurred));
+}
----------------
rengolin wrote:
> t.p.northover wrote:
> > This also doesn't seem to do what ACLE says: set the Q flag based on the 
> > LSB of the input.
> > 
> > Also, I don't think "cpsr_q" exists, does it? Both the v7A and v7M 
> > descriptions I've found lump it in with NZCV (i.e. "cpsr_nzcvq"). Which 
> > probably means the assembly should be marked as clobbering CPSR too.
> I may be wrong, but I think you need to mrs first to get the bit pattern, 
> change this value based on (occurred != 0) shifted to the right place and 
> writing it back with msr, or you'll end up writing zeroes to the other flags. 
> Or is that only the case with registers?
That would preserve NZCV and allow LLVM more optimisation freedom, but at the 
cost of a more expensive __set_saturation_occurred.

As long as LLVM's aware that we *have* clobbered NZCV (slightly confusingly 
tracked as CPSR in the 32-bit backend) it should work either way.

Of course, we don't actually model Q now, so we're not making the required 
guarantees anyway (I think LLVM would consider itself free to move a QADD past 
these no matter what we do, for example).

http://reviews.llvm.org/D6107



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to