linux/arch/sparc/lib/fls.S
<<
>>
Prefs
   1/* fls.S: SPARC default fls definition.
   2 *
   3 * SPARC default fls definition, which follows the same algorithm as
   4 * in generic fls(). This function will be boot time patched on T4
   5 * and onward.
   6 */
   7
   8#include <linux/linkage.h>
   9#include <asm/export.h>
  10
  11        .text
  12        .register       %g2, #scratch
  13        .register       %g3, #scratch
  14ENTRY(fls)
  15        brz,pn  %o0, 6f
  16         mov    0, %o1
  17        sethi   %hi(0xffff0000), %g3
  18        mov     %o0, %g2
  19        andcc   %o0, %g3, %g0
  20        be,pt   %icc, 8f
  21         mov    32, %o1
  22        sethi   %hi(0xff000000), %g3
  23        andcc   %g2, %g3, %g0
  24        bne,pt  %icc, 3f
  25         sethi  %hi(0xf0000000), %g3
  26        sll     %o0, 8, %o0
  271:
  28        add     %o1, -8, %o1
  29        sra     %o0, 0, %o0
  30        mov     %o0, %g2
  312:
  32        sethi   %hi(0xf0000000), %g3
  333:
  34        andcc   %g2, %g3, %g0
  35        bne,pt  %icc, 4f
  36         sethi  %hi(0xc0000000), %g3
  37        sll     %o0, 4, %o0
  38        add     %o1, -4, %o1
  39        sra     %o0, 0, %o0
  40        mov     %o0, %g2
  414:
  42        andcc   %g2, %g3, %g0
  43        be,a,pt %icc, 7f
  44         sll    %o0, 2, %o0
  455:
  46        xnor    %g0, %o0, %o0
  47        srl     %o0, 31, %o0
  48        sub     %o1, %o0, %o1
  496:
  50        jmp     %o7 + 8
  51         sra    %o1, 0, %o0
  527:
  53        add     %o1, -2, %o1
  54        ba,pt   %xcc, 5b
  55         sra    %o0, 0, %o0
  568:
  57        sll     %o0, 16, %o0
  58        sethi   %hi(0xff000000), %g3
  59        sra     %o0, 0, %o0
  60        mov     %o0, %g2
  61        andcc   %g2, %g3, %g0
  62        bne,pt  %icc, 2b
  63         mov    16, %o1
  64        ba,pt   %xcc, 1b
  65         sll    %o0, 8, %o0
  66ENDPROC(fls)
  67EXPORT_SYMBOL(fls)
  68