On Mon, 5 Jul 2010, Shinya Kuribayashi wrote:
> Ah, that's the answer I'm looking for, thanks! So current irq_ffs()
> form (clz() is enabled only when CONFIG_CPU_MIPS32/64 is selected) is
> well-suited for Malta platform, and it seems better to leave them as
> they are. I'll drop the patch from my list.
You still can and probably want to optimise. You can have configuration
dependencies in override files.
> >> + if (__builtin_constant_p(cpu_has_clo_clz) && cpu_has_clo_clz) {
> >> + int x;
> >> + __asm__(
> >> + " .set push \n"
> >> + " .set mips32 \n"
> >> + " clz %0, %1 \n"
> >> + " .set pop \n"
> >> + : "=r" (x)
> >> + : "r" (pending));
> >> +
> >> + return -x + 31 - CAUSEB_IP;
> >> + }
> >
> > Hmm, ".set mips32" looks dodgy here. For pre-MIPS32/64 platforms this
> > code should never make it to the assembler and if it did, then a
> > build-time error is better than a run-time problem.
>
> I see, cpu_has_clo_clz doesn't work well for platforms such as Malta.
> Malta can support several ISAs at a time, which is very valuable, but
> hard to be optimized :-)
Well, <asm/mach-malta/cpu-feature-overrides.h> seems to be getting this
right. MIPS IV options are not included as quite rare compared to
MIPS32/64 ones and run-time determined defaults apply. For MIPS32/64
configurations compile-time optimisations work as usually.
> > It might be simpler just to use __builtin_ffs() for this variant though.
> > Inline assembly is better avoided unless absolutely required. Not even
> > mentioning readability.
>
> Hm. It might be simpler, but it's not the purpose of irq_ffs(), IMHO.
My point is whenever cpu_has_clo_clz is hardcoded to 1 GCC will expand
__builtin_ffs() to CLZ as expected and may potentially be able to optimise
it further. For the fallback path I agree you do not want to use
__builtin_ffs() as you want to save processing time of the unneeded bits
-- there's no 8-bit FFS intrinsic let alone a 4-bit one (I'm assuming
there is a reason this piece of code does not check lower 4 interrupt
inputs).
Maciej
|