2019-06-04 10:11:33 +02:00
/* SPDX-License-Identifier: GPL-2.0-only */
2013-01-18 15:12:16 +05:30
/*
* Copyright ( C ) 2004 , 2007 - 2010 , 2011 - 2012 Synopsys , Inc . ( www . synopsys . com )
*/
# ifndef _ASM_BITOPS_H
# define _ASM_BITOPS_H
# ifndef _LINUX_BITOPS_H
# error only <linux / bitops.h> can be included directly
# endif
# ifndef __ASSEMBLY__
# include <linux/types.h>
# include <linux/compiler.h>
ARCv2: Support for ARCv2 ISA and HS38x cores
The notable features are:
- SMP configurations of upto 4 cores with coherency
- Optional L2 Cache and IO-Coherency
- Revised Interrupt Architecture (multiple priorites, reg banks,
auto stack switch, auto regfile save/restore)
- MMUv4 (PIPT dcache, Huge Pages)
- Instructions for
* 64bit load/store: LDD, STD
* Hardware assisted divide/remainder: DIV, REM
* Function prologue/epilogue: ENTER_S, LEAVE_S
* IRQ enable/disable: CLRI, SETI
* pop count: FFS, FLS
* SETcc, BMSKN, XBFU...
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
2013-05-13 18:30:41 +05:30
# ifdef CONFIG_ISA_ARCOMPACT
2013-01-18 15:12:16 +05:30
/*
* Count the number of zeros , starting from MSB
* Helper for fls ( ) friends
* This is a pure count , so ( 1 - 32 ) or ( 0 - 31 ) doesn ' t apply
* It could be 0 to 32 , based on num of 0 ' s in there
* clz ( 0x8000 _0000 ) = 0 , clz ( 0xFFFF _FFFF ) = 0 , clz ( 0 ) = 32 , clz ( 1 ) = 31
*/
static inline __attribute__ ( ( const ) ) int clz ( unsigned int x )
{
unsigned int res ;
__asm__ __volatile__ (
" norm.f %0, %1 \n "
" mov.n %0, 0 \n "
" add.p %0, %0, 1 \n "
: " =r " ( res )
: " r " ( x )
: " cc " ) ;
return res ;
}
2019-01-03 15:26:41 -08:00
static inline int constant_fls ( unsigned int x )
2013-01-18 15:12:16 +05:30
{
int r = 32 ;
if ( ! x )
return 0 ;
if ( ! ( x & 0xffff0000u ) ) {
x < < = 16 ;
r - = 16 ;
}
if ( ! ( x & 0xff000000u ) ) {
x < < = 8 ;
r - = 8 ;
}
if ( ! ( x & 0xf0000000u ) ) {
x < < = 4 ;
r - = 4 ;
}
if ( ! ( x & 0xc0000000u ) ) {
x < < = 2 ;
r - = 2 ;
}
2020-10-21 23:12:20 +02:00
if ( ! ( x & 0x80000000u ) )
2013-01-18 15:12:16 +05:30
r - = 1 ;
return r ;
}
/*
* fls = Find Last Set in word
* @ result : [ 1 - 32 ]
* fls ( 1 ) = 1 , fls ( 0x80000000 ) = 32 , fls ( 0 ) = 0
*/
2019-01-03 15:26:41 -08:00
static inline __attribute__ ( ( const ) ) int fls ( unsigned int x )
2013-01-18 15:12:16 +05:30
{
if ( __builtin_constant_p ( x ) )
return constant_fls ( x ) ;
return 32 - clz ( x ) ;
}
/*
* __fls : Similar to fls , but zero based ( 0 - 31 )
*/
2022-05-27 13:53:43 +02:00
static inline __attribute__ ( ( const ) ) unsigned long __fls ( unsigned long x )
2013-01-18 15:12:16 +05:30
{
if ( ! x )
return 0 ;
else
return fls ( x ) - 1 ;
}
/*
* ffs = Find First Set in word ( LSB to MSB )
* @ result : [ 1 - 32 ] , 0 if all 0 ' s
*/
# define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
/*
* __ffs : Similar to ffs , but zero based ( 0 - 31 )
*/
ARC: fix __ffs return value to avoid build warnings
| CC mm/nobootmem.o
|In file included from ./include/asm-generic/bug.h:18:0,
| from ./arch/arc/include/asm/bug.h:32,
| from ./include/linux/bug.h:5,
| from ./include/linux/mmdebug.h:5,
| from ./include/linux/gfp.h:5,
| from ./include/linux/slab.h:15,
| from mm/nobootmem.c:14:
|mm/nobootmem.c: In function '__free_pages_memory':
|./include/linux/kernel.h:845:29: warning: comparison of distinct pointer types lacks a cast
| (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
| ^
|./include/linux/kernel.h:859:4: note: in expansion of macro '__typecheck'
| (__typecheck(x, y) && __no_side_effects(x, y))
| ^~~~~~~~~~~
|./include/linux/kernel.h:869:24: note: in expansion of macro '__safe_cmp'
| __builtin_choose_expr(__safe_cmp(x, y), \
| ^~~~~~~~~~
|./include/linux/kernel.h:878:19: note: in expansion of macro '__careful_cmp'
| #define min(x, y) __careful_cmp(x, y, <)
| ^~~~~~~~~~~~~
|mm/nobootmem.c:104:11: note: in expansion of macro 'min'
| order = min(MAX_ORDER - 1UL, __ffs(start));
Change __ffs return value from 'int' to 'unsigned long' as it
is done in other implementations (like asm-generic, x86, etc...)
to avoid build-time warnings in places where type is strictly
checked.
As __ffs may return values in [0-31] interval changing return
type to unsigned is valid.
Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
2018-12-13 18:42:57 +03:00
static inline __attribute__ ( ( const ) ) unsigned long __ffs ( unsigned long word )
2013-01-18 15:12:16 +05:30
{
if ( ! word )
return word ;
return ffs ( word ) - 1 ;
}
ARCv2: Support for ARCv2 ISA and HS38x cores
The notable features are:
- SMP configurations of upto 4 cores with coherency
- Optional L2 Cache and IO-Coherency
- Revised Interrupt Architecture (multiple priorites, reg banks,
auto stack switch, auto regfile save/restore)
- MMUv4 (PIPT dcache, Huge Pages)
- Instructions for
* 64bit load/store: LDD, STD
* Hardware assisted divide/remainder: DIV, REM
* Function prologue/epilogue: ENTER_S, LEAVE_S
* IRQ enable/disable: CLRI, SETI
* pop count: FFS, FLS
* SETcc, BMSKN, XBFU...
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
2013-05-13 18:30:41 +05:30
# else /* CONFIG_ISA_ARCV2 */
/*
* fls = Find Last Set in word
* @ result : [ 1 - 32 ]
* fls ( 1 ) = 1 , fls ( 0x80000000 ) = 32 , fls ( 0 ) = 0
*/
2020-05-05 13:54:24 -07:00
static inline __attribute__ ( ( const ) ) int fls ( unsigned int x )
ARCv2: Support for ARCv2 ISA and HS38x cores
The notable features are:
- SMP configurations of upto 4 cores with coherency
- Optional L2 Cache and IO-Coherency
- Revised Interrupt Architecture (multiple priorites, reg banks,
auto stack switch, auto regfile save/restore)
- MMUv4 (PIPT dcache, Huge Pages)
- Instructions for
* 64bit load/store: LDD, STD
* Hardware assisted divide/remainder: DIV, REM
* Function prologue/epilogue: ENTER_S, LEAVE_S
* IRQ enable/disable: CLRI, SETI
* pop count: FFS, FLS
* SETcc, BMSKN, XBFU...
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
2013-05-13 18:30:41 +05:30
{
int n ;
asm volatile (
" fls.f %0, %1 \n " /* 0:31; 0(Z) if src 0 */
" add.nz %0, %0, 1 \n " /* 0:31 -> 1:32 */
: " =r " ( n ) /* Early clobber not needed */
: " r " ( x )
: " cc " ) ;
return n ;
}
/*
* __fls : Similar to fls , but zero based ( 0 - 31 ) . Also 0 if no bit set
*/
2022-05-27 13:53:43 +02:00
static inline __attribute__ ( ( const ) ) unsigned long __fls ( unsigned long x )
ARCv2: Support for ARCv2 ISA and HS38x cores
The notable features are:
- SMP configurations of upto 4 cores with coherency
- Optional L2 Cache and IO-Coherency
- Revised Interrupt Architecture (multiple priorites, reg banks,
auto stack switch, auto regfile save/restore)
- MMUv4 (PIPT dcache, Huge Pages)
- Instructions for
* 64bit load/store: LDD, STD
* Hardware assisted divide/remainder: DIV, REM
* Function prologue/epilogue: ENTER_S, LEAVE_S
* IRQ enable/disable: CLRI, SETI
* pop count: FFS, FLS
* SETcc, BMSKN, XBFU...
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
2013-05-13 18:30:41 +05:30
{
/* FLS insn has exactly same semantics as the API */
return __builtin_arc_fls ( x ) ;
}
/*
* ffs = Find First Set in word ( LSB to MSB )
* @ result : [ 1 - 32 ] , 0 if all 0 ' s
*/
2020-05-05 13:54:24 -07:00
static inline __attribute__ ( ( const ) ) int ffs ( unsigned int x )
ARCv2: Support for ARCv2 ISA and HS38x cores
The notable features are:
- SMP configurations of upto 4 cores with coherency
- Optional L2 Cache and IO-Coherency
- Revised Interrupt Architecture (multiple priorites, reg banks,
auto stack switch, auto regfile save/restore)
- MMUv4 (PIPT dcache, Huge Pages)
- Instructions for
* 64bit load/store: LDD, STD
* Hardware assisted divide/remainder: DIV, REM
* Function prologue/epilogue: ENTER_S, LEAVE_S
* IRQ enable/disable: CLRI, SETI
* pop count: FFS, FLS
* SETcc, BMSKN, XBFU...
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
2013-05-13 18:30:41 +05:30
{
int n ;
asm volatile (
" ffs.f %0, %1 \n " /* 0:31; 31(Z) if src 0 */
" add.nz %0, %0, 1 \n " /* 0:31 -> 1:32 */
" mov.z %0, 0 \n " /* 31(Z)-> 0 */
: " =r " ( n ) /* Early clobber not needed */
: " r " ( x )
: " cc " ) ;
return n ;
}
/*
* __ffs : Similar to ffs , but zero based ( 0 - 31 )
*/
ARC: fix __ffs return value to avoid build warnings
| CC mm/nobootmem.o
|In file included from ./include/asm-generic/bug.h:18:0,
| from ./arch/arc/include/asm/bug.h:32,
| from ./include/linux/bug.h:5,
| from ./include/linux/mmdebug.h:5,
| from ./include/linux/gfp.h:5,
| from ./include/linux/slab.h:15,
| from mm/nobootmem.c:14:
|mm/nobootmem.c: In function '__free_pages_memory':
|./include/linux/kernel.h:845:29: warning: comparison of distinct pointer types lacks a cast
| (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
| ^
|./include/linux/kernel.h:859:4: note: in expansion of macro '__typecheck'
| (__typecheck(x, y) && __no_side_effects(x, y))
| ^~~~~~~~~~~
|./include/linux/kernel.h:869:24: note: in expansion of macro '__safe_cmp'
| __builtin_choose_expr(__safe_cmp(x, y), \
| ^~~~~~~~~~
|./include/linux/kernel.h:878:19: note: in expansion of macro '__careful_cmp'
| #define min(x, y) __careful_cmp(x, y, <)
| ^~~~~~~~~~~~~
|mm/nobootmem.c:104:11: note: in expansion of macro 'min'
| order = min(MAX_ORDER - 1UL, __ffs(start));
Change __ffs return value from 'int' to 'unsigned long' as it
is done in other implementations (like asm-generic, x86, etc...)
to avoid build-time warnings in places where type is strictly
checked.
As __ffs may return values in [0-31] interval changing return
type to unsigned is valid.
Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
2018-12-13 18:42:57 +03:00
static inline __attribute__ ( ( const ) ) unsigned long __ffs ( unsigned long x )
ARCv2: Support for ARCv2 ISA and HS38x cores
The notable features are:
- SMP configurations of upto 4 cores with coherency
- Optional L2 Cache and IO-Coherency
- Revised Interrupt Architecture (multiple priorites, reg banks,
auto stack switch, auto regfile save/restore)
- MMUv4 (PIPT dcache, Huge Pages)
- Instructions for
* 64bit load/store: LDD, STD
* Hardware assisted divide/remainder: DIV, REM
* Function prologue/epilogue: ENTER_S, LEAVE_S
* IRQ enable/disable: CLRI, SETI
* pop count: FFS, FLS
* SETcc, BMSKN, XBFU...
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
2013-05-13 18:30:41 +05:30
{
ARC: fix __ffs return value to avoid build warnings
| CC mm/nobootmem.o
|In file included from ./include/asm-generic/bug.h:18:0,
| from ./arch/arc/include/asm/bug.h:32,
| from ./include/linux/bug.h:5,
| from ./include/linux/mmdebug.h:5,
| from ./include/linux/gfp.h:5,
| from ./include/linux/slab.h:15,
| from mm/nobootmem.c:14:
|mm/nobootmem.c: In function '__free_pages_memory':
|./include/linux/kernel.h:845:29: warning: comparison of distinct pointer types lacks a cast
| (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
| ^
|./include/linux/kernel.h:859:4: note: in expansion of macro '__typecheck'
| (__typecheck(x, y) && __no_side_effects(x, y))
| ^~~~~~~~~~~
|./include/linux/kernel.h:869:24: note: in expansion of macro '__safe_cmp'
| __builtin_choose_expr(__safe_cmp(x, y), \
| ^~~~~~~~~~
|./include/linux/kernel.h:878:19: note: in expansion of macro '__careful_cmp'
| #define min(x, y) __careful_cmp(x, y, <)
| ^~~~~~~~~~~~~
|mm/nobootmem.c:104:11: note: in expansion of macro 'min'
| order = min(MAX_ORDER - 1UL, __ffs(start));
Change __ffs return value from 'int' to 'unsigned long' as it
is done in other implementations (like asm-generic, x86, etc...)
to avoid build-time warnings in places where type is strictly
checked.
As __ffs may return values in [0-31] interval changing return
type to unsigned is valid.
Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
2018-12-13 18:42:57 +03:00
unsigned long n ;
ARCv2: Support for ARCv2 ISA and HS38x cores
The notable features are:
- SMP configurations of upto 4 cores with coherency
- Optional L2 Cache and IO-Coherency
- Revised Interrupt Architecture (multiple priorites, reg banks,
auto stack switch, auto regfile save/restore)
- MMUv4 (PIPT dcache, Huge Pages)
- Instructions for
* 64bit load/store: LDD, STD
* Hardware assisted divide/remainder: DIV, REM
* Function prologue/epilogue: ENTER_S, LEAVE_S
* IRQ enable/disable: CLRI, SETI
* pop count: FFS, FLS
* SETcc, BMSKN, XBFU...
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
2013-05-13 18:30:41 +05:30
asm volatile (
" ffs.f %0, %1 \n " /* 0:31; 31(Z) if src 0 */
" mov.z %0, 0 \n " /* 31(Z)-> 0 */
: " =r " ( n )
: " r " ( x )
: " cc " ) ;
return n ;
}
# endif /* CONFIG_ISA_ARCOMPACT */
2013-01-18 15:12:16 +05:30
/*
* ffz = Find First Zero in word .
* @ return : [ 0 - 31 ] , 32 if all 1 ' s
*/
# define ffz(x) __ffs(~(x))
# include <asm-generic/bitops/hweight.h>
# include <asm-generic/bitops/fls64.h>
# include <asm-generic/bitops/sched.h>
# include <asm-generic/bitops/lock.h>
2018-09-04 16:11:29 -07:00
# include <asm-generic/bitops/atomic.h>
# include <asm-generic/bitops/non-atomic.h>
2013-01-18 15:12:16 +05:30
# include <asm-generic/bitops/le.h>
# include <asm-generic/bitops/ext2-atomic-setbit.h>
# endif /* !__ASSEMBLY__ */
# endif