On Tue, 9 Jul 2013, Richard Earnshaw wrote: > On ARM, CLZ has a defined result at zero (32). Furthermore, the ACLE > specification defines (in the header arm_acle.h) __clz(n) as an intrinsic > aimed at the CLZ instruction; __clz() has a defined result at 0. We want to > use __builtin_clz as the implementation for __clz rather than inventing > another one; but that would require the compiler to handle zero correctly.
Assuming the header will come with GCC, it can assume semantics we don't document for user code - such as that __builtin_clz is defined at 0, if that is the case with a given GCC version and target architecture. If the semantics change, the header can then be changed at the same time. (I'd still encourage user code wanting a defined value at 0 to do e.g. static inline int clz (int n) { return n == 0 ? 32 : __builtin_clz (n); } and hope GCC will optimize away the test for 0 when the instruction semantics make it unnecessary - if it doesn't, it should be fixed to do so. And it's certainly fine to put such code in an intrinsic header if useful.) -- Joseph S. Myers jos...@codesourcery.com