| /* ffs -- find first set bit in a word, counted from least significant end. | 
 |    S/390 version. | 
 |    Copyright (C) 2000-2016 Free Software Foundation, Inc. | 
 |    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). | 
 |    This file is part of the GNU C Library. | 
 |  | 
 |    The GNU C Library is free software; you can redistribute it and/or | 
 |    modify it under the terms of the GNU Lesser General Public | 
 |    License as published by the Free Software Foundation; either | 
 |    version 2.1 of the License, or (at your option) any later version. | 
 |  | 
 |    The GNU C Library is distributed in the hope that it will be useful, | 
 |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 |    Lesser General Public License for more details. | 
 |  | 
 |    You should have received a copy of the GNU Lesser General Public | 
 |    License along with the GNU C Library; if not, see | 
 |    <http://www.gnu.org/licenses/>.  */ | 
 |  | 
 | #include <limits.h> | 
 | #define ffsl __something_else | 
 | #include <string.h> | 
 |  | 
 | #undef	ffs | 
 |  | 
 | /* ffs: find first bit set. This is defined the same way as | 
 |    the libc and compiler builtin ffs routines, therefore | 
 |    differs in spirit from the above ffz (man ffs).  */ | 
 |  | 
 | int | 
 | __ffs (int x) | 
 | { | 
 | 	int r; | 
 |  | 
 | 	if (x == 0) | 
 | 	  return 0; | 
 | 	__asm__("    lr	  %%r1,%1\n" | 
 | 		"    sr	  %0,%0\n" | 
 | 		"    tml  %%r1,0xFFFF\n" | 
 | 		"    jnz  0f\n" | 
 | 		"    ahi  %0,16\n" | 
 | 		"    srl  %%r1,16\n" | 
 | 		"0:  tml  %%r1,0x00FF\n" | 
 | 		"    jnz  1f\n" | 
 | 		"    ahi  %0,8\n" | 
 | 		"    srl  %%r1,8\n" | 
 | 		"1:  tml  %%r1,0x000F\n" | 
 | 		"    jnz  2f\n" | 
 | 		"    ahi  %0,4\n" | 
 | 		"    srl  %%r1,4\n" | 
 | 		"2:  tml  %%r1,0x0003\n" | 
 | 		"    jnz  3f\n" | 
 | 		"    ahi  %0,2\n" | 
 | 		"    srl  %%r1,2\n" | 
 | 		"3:  tml  %%r1,0x0001\n" | 
 | 		"    jnz  4f\n" | 
 | 		"    ahi  %0,1\n" | 
 | 		"4:" | 
 | 		: "=&d" (r) : "d" (x) : "cc", "1" ); | 
 | 	return r+1; | 
 | } | 
 |  | 
 | weak_alias (__ffs, ffs) | 
 | libc_hidden_def (__ffs) | 
 | libc_hidden_builtin_def (ffs) | 
 | #if ULONG_MAX == UINT_MAX | 
 | #undef ffsl | 
 | weak_alias (__ffs, ffsl) | 
 | #endif |