dix: Use __builtin_popcountl if available to replace Ones()
If the compiler knows of a better algorithm for counting the number of bits set in a word for the target CPU, let it use that, instead of the classic algorithm optimized for PDP-6. Based on xorg/lib/libxext@490a25e6f8a4d2482af4364c700b68ad11a4d10b v2: make old version static inline, stop exporting after !1695 Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1674>
This commit is contained in:
parent
1642adec3b
commit
45c485bfdf
|
@ -2018,16 +2018,6 @@ NoteLedState(DeviceIntPtr keybd, int led, Bool on)
|
|||
ctrl->leds &= ~((Leds) 1 << (led - 1));
|
||||
}
|
||||
|
||||
int
|
||||
Ones(unsigned long mask)
|
||||
{ /* HACKMEM 169 */
|
||||
unsigned long y;
|
||||
|
||||
y = (mask >> 1) & 033333333333;
|
||||
y = mask - y - ((y >> 1) & 033333333333);
|
||||
return (((y + (y >> 3)) & 030707070707) % 077);
|
||||
}
|
||||
|
||||
static int
|
||||
DoChangeKeyboardControl(ClientPtr client, DeviceIntPtr keybd, XID *vlist,
|
||||
BITS32 vmask)
|
||||
|
|
23
os/osdep.h
23
os/osdep.h
|
@ -63,6 +63,10 @@ SOFTWARE.
|
|||
#include <X11/Xmd.h>
|
||||
#include <X11/Xdefs.h>
|
||||
|
||||
#ifndef __has_builtin
|
||||
# define __has_builtin(x) 0 /* Compatibility with older compilers */
|
||||
#endif
|
||||
|
||||
/* If EAGAIN and EWOULDBLOCK are distinct errno values, then we check errno
|
||||
* for both EAGAIN and EWOULDBLOCK, because some supposedly POSIX
|
||||
* systems are broken and return EWOULDBLOCK when they should return EAGAIN
|
||||
|
@ -215,6 +219,23 @@ extern Bool CoreDump;
|
|||
extern Bool NoListenAll;
|
||||
extern Bool AllowByteSwappedClients;
|
||||
|
||||
int Ones(unsigned long mask);
|
||||
#if __has_builtin(__builtin_popcountl)
|
||||
# define Ones __builtin_popcountl
|
||||
#else
|
||||
/*
|
||||
* Count the number of bits set to 1 in a 32-bit word.
|
||||
* Algorithm from MIT AI Lab Memo 239: "HAKMEM", ITEM 169.
|
||||
* https://dspace.mit.edu/handle/1721.1/6086
|
||||
*/
|
||||
static inline int
|
||||
Ones(unsigned long mask)
|
||||
{
|
||||
unsigned long y;
|
||||
|
||||
y = (mask >> 1) & 033333333333;
|
||||
y = mask - y - ((y >> 1) & 033333333333);
|
||||
return (((y + (y >> 3)) & 030707070707) % 077);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _OSDEP_H_ */
|
||||
|
|
Loading…
Reference in New Issue