Update copyright notices with scripts/update-copyrights
[glibc.git] / ports / sysdeps / arm / armv6t2 / ffsll.S
blob204ff800927bf906bf3f4fd5b9acc77ff30a1713
1 /* ffsll -- find first set bit in a long long, from least significant end.
2    Copyright (C) 2013-2014 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library.  If not, see
17    <http://www.gnu.org/licenses/>.  */
19 #include <sysdep.h>
21         .syntax unified
22         .text
24 ENTRY (ffsll)
25         @ If low part is 0, operate on the high part.  Ensure that the
26         @ word on which we operate is in r0.  Set r2 to the bit offset
27         @ of the word being considered.  Set the flags for the word
28         @ being operated on.
29 #ifdef __ARMEL__
30         cmp     r0, #0
31         itee    ne
32         movne   r2, #0
33         moveq   r2, #32
34         movseq  r0, r1
35 #else
36         cmp     r1, #0
37         ittee   ne
38         movne   r2, #0
39         movne   r0, r1
40         moveq   r2, #32
41         cmpeq   r0, #0
42 #endif
43         @ Perform the ffs on r0.
44         rbit    r0, r0
45         ittt    ne
46         clzne   r0, r0
47         addne   r2, r2, #1
48         addne   r0, r0, r2
49         bx      lr
50 END (ffsll)