[PATCH 1/6] ARM: prefetch: remove redundant "cc" clobber

Nicolas Pitre nico at fluxnic.net
Wed Jul 24 13:22:46 EDT 2013


On Wed, 24 Jul 2013, Russell King - ARM Linux wrote:

> On Wed, Jul 24, 2013 at 05:35:31PM +0100, Will Deacon wrote:
> > On Wed, Jul 24, 2013 at 05:16:59PM +0100, Nicolas Pitre wrote:
> > > On Wed, 24 Jul 2013, Will Deacon wrote:
> > > > On Tue, Jul 23, 2013 at 08:48:11PM +0100, Nicolas Pitre wrote:
> > > > > You know the legacy reason why the cc clobber was there, right?
> > > > > It certainly doesn't apply anymore.
> > > > 
> > > > I was under the impression that it was due to ancient GCC behaviour and the "cc"
> > > > was there to prevent re-ordering. For interest, what are the specifics?
> > > 
> > > In the old days, you had to take care of the predicate for conditional 
> > > instructions in your inline asm code.  So for example, if you had:
> > > 
> > > 	if (foo)
> > > 		inline asm ("mov %0, #1" : "=r" (bar));
> > > 
> > > That wouldn't work most of the time because even if the if condition was 
> > > false, gcc would not branch over the inline asm code but expect you to 
> > > take care of the condition code.  That means the above needed to be 
> > > written as:
> > > 
> > > 	if (foo)
> > > 		inline asm ("mov%? %0, #1" : "=r" (bar));
> > > 
> > > Because having %? added all over the place was cumbersome, the 
> > > alternative was to add "cc" to the clobber list so gcc would then branch 
> > > across the inline asm when the condition is false.
> > > 
> > > But of course many people forgot about those subtle details quite often, 
> > > and then gcc was changed so inline asm was made non predicated.
> > 
> > Holy sh*t....
> > 
> > Next time I complain to the tools guys about inline asm, I'll count my
> > blessings so they don't try and resurrect anything as horrendous as what
> > you've just described.
> 
> And the result of its removal is all the horrid macro crap in asm/tlbflush.h
> to work around the lack of this feature - otherwise we end up with seven
> instances of:
> 
> 	tst
> 	bne	1f
> 	mcr
> 1:
> 
> for every call to a TLB function.  GCC _could_ have detected the lack of
> %? and the lack of "cc" clobber and either warned or implicitly branched
> around the block.  There was no need to completely remove the facility.

I agree.  gcc could have considered an inline asm block predicate safe 
whenever it contains a %?.  I even suggested this at the time.


Nicolas



More information about the linux-arm-kernel mailing list