Use __builtin_assume_aligned on untagged Lisp vals

* src/conf_post.h (__has_builtin, __builtin_assume_aligned):
New macros, for compilers not already defining them.
(__has_builtin___builtin_assume_aligned): New macro.
* src/lisp.h (lisp_h_XUNTAG): Use __builtin_assume_aligned.
This shrinks text space by 0.2% on x86-64 with GCC 6.1.
This commit is contained in:
Paul Eggert 2016-06-07 15:41:51 -07:00
parent 8ea5d990f6
commit 302185156b
2 changed files with 17 additions and 1 deletions

View file

@ -64,6 +64,15 @@ typedef bool bool_bf;
(4 < __GNUC__ + (8 <= __GNUC_MINOR__))
#endif
/* Simulate __has_builtin on compilers that lack it. It is used only
on arguments like __builtin_assume_aligned that are handled in this
simulation. */
#ifndef __has_builtin
# define __has_builtin(a) __has_builtin_##a
# define __has_builtin___builtin_assume_aligned \
(4 < __GNUC__ + (7 <= __GNUC_MINOR__))
#endif
/* Simulate __has_feature on compilers that lack it. It is used only
to define ADDRESS_SANITIZER below. */
#ifndef __has_feature
@ -77,6 +86,11 @@ typedef bool bool_bf;
# define ADDRESS_SANITIZER false
#endif
/* Yield PTR, which must be aligned to ALIGNMENT. */
#if ! __has_builtin (__builtin_assume_aligned)
# define __builtin_assume_aligned(ptr, alignment, ...) ((void *) (ptr))
#endif
#ifdef DARWIN_OS
#ifdef emacs
#define malloc unexec_malloc

View file

@ -341,7 +341,9 @@ error !;
(struct Lisp_Symbol *) ((intptr_t) XLI (a) - Lisp_Symbol \
+ (char *) lispsym))
# define lisp_h_XTYPE(a) ((enum Lisp_Type) (XLI (a) & ~VALMASK))
# define lisp_h_XUNTAG(a, type) ((void *) (intptr_t) (XLI (a) - (type)))
# define lisp_h_XUNTAG(a, type) \
__builtin_assume_aligned ((void *) (intptr_t) (XLI (a) - (type)), \
GCALIGNMENT)
#endif
/* When compiling via gcc -O0, define the key operations as macros, as