Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86-64, asm: If the assembler supports fxsave64, use it

Kbuild allows for us to probe for the existence of specific constructs
in the assembler, use them to find out if we can use fxsave64 and
permit the compiler to generate better code.

Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>

+7 -3
+6 -2
arch/x86/Makefile
··· 96 96 # is .cfi_signal_frame supported too? 97 97 cfi-sigframe := $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1) 98 98 cfi-sections := $(call as-instr,.cfi_sections .debug_frame,-DCONFIG_AS_CFI_SECTIONS=1) 99 - KBUILD_AFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) 100 - KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) 99 + 100 + # does binutils support specific instructions? 101 + asinstr := $(call as-instr,fxsaveq (%rax),-DCONFIG_AS_FXSAVEQ=1) 102 + 103 + KBUILD_AFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) 104 + KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) 101 105 102 106 LDFLAGS := -m elf_$(UTS_MACHINE) 103 107
+1 -1
arch/x86/include/asm/i387.h
··· 175 175 uses any extended registers for addressing, a second REX prefix 176 176 will be generated (to the assembler, rex64 followed by semicolon 177 177 is a separate instruction), and hence the 64-bitness is lost. */ 178 - #if 0 178 + #ifdef CONFIG_AS_FXSAVEQ 179 179 /* Using "fxsaveq %0" would be the ideal choice, but is only supported 180 180 starting with gas 2.16. */ 181 181 __asm__ __volatile__("fxsaveq %0"