x86: Optimize loadsegment()
authorBrian Gerst <brgerst@gmail.com>
Wed, 25 Nov 2009 19:18:26 +0000 (14:18 -0500)
committerIngo Molnar <mingo@elte.hu>
Thu, 26 Nov 2009 09:33:58 +0000 (10:33 +0100)
Zero the input register in the exception handler instead of
using an extra register to pass in a zero value.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
LKML-Reference: <1259176706-5908-1-git-send-email-brgerst@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/include/asm/system.h

index 1a953e26401c02138a972480184ce0208d42eb6f..537395a2877a12d7d82d4f70ab7d29f762544b34 100644 (file)
@@ -156,18 +156,19 @@ extern void native_load_gs_index(unsigned);
  * segment if something goes wrong..
  */
 #define loadsegment(seg, value)                        \
+do {                                           \
+       unsigned short __val = value;           \
        asm volatile("\n"                       \
                     "1:\t"                     \
                     "movl %k0,%%" #seg "\n"    \
-                    "2:\n"                     \
                     ".section .fixup,\"ax\"\n" \
-                    "3:\t"                     \
-                    "movl %k1, %%" #seg "\n\t" \
-                    "jmp 2b\n"                 \
+                    "2:\t"                     \
+                    "xorl %k0,%k0\n\t"         \
+                    "jmp 1b\n"                 \
                     ".previous\n"              \
-                    _ASM_EXTABLE(1b,3b)        \
-                    : :"r" (value), "r" (0) : "memory")
-
+                    _ASM_EXTABLE(1b, 2b)       \
+                    : "+r" (__val) : : "memory"); \
+} while (0)
 
 /*
  * Save a segment register away