Brendan Eich (2014-01-28T23:07:16.000Z)
Luke Wagner wrote:
> It seems to me that we*must*  have Math.clz perform ToUint32() on its input.  Otherwise (if ToInt32() is used), even if the expression is written "Math.clz(x>>>  0)", asm.js/type-inference won't be able to optimize away the<0 branch since the ToInt32() in the semantics of Math.clz will convert a large unsigned integer argument into a negative integer.
>
> Secondly, I think clz(0) should be 32, not 0:
>   - for x86's bsr, since the result is undefined if the input is zero, we need a branch or cmov*anyway*  to deal with zero.
>   - to make up for bsr's shortcomings, newer x86 chips have lzcnt (which JITs can emit after testing the right cpuid bit), which defines clz(0) == 32.
>   - ARM's clz also defines clz(0) == 32.
>
> The only reason not to do this I could imagine is if there was a de facto standard among all x86 chips (such that the JIT could rely on it) to have bsr(0) == 0, but I couldn't find any evidence of this.

Thanks, I just presented this pretty much verbatim, and Math.clz32 it 
is, by TC39 consensus. ToUint32 on parameter, 0 => 32 and all.

/be
forbes at lindesay.co.uk (2014-01-28T23:08:17.031Z)
Thanks, I just presented this pretty much verbatim, and Math.clz32 it is, by TC39 consensus. ToUint32