]> xenbits.xensource.com Git - seabios.git/commitdiff
Use inline functions instead of macros for GET/SET_SEG segment manipulation.
authorKevin O'Connor <kevin@koconnor.net>
Fri, 25 May 2012 02:06:39 +0000 (22:06 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Fri, 25 May 2012 02:06:39 +0000 (22:06 -0400)
It appears that gcc does a better job of optimization when the
SET_SEG() segment assignment assembler code is contained in an inline
function.  With the code in a function gcc appears to be able to
optimize out many redundant segment register loads.  Removing some of
these unnecessarily loads makes the code both smaller and faster.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
src/farptr.h

index 3dbf545c83d50f9d140e8a77b56a6b109bcb6a94..3a85c6b8305697793bffc2c73529d13c221789fb 100644 (file)
@@ -79,15 +79,29 @@ extern void __force_link_error__unknown_type(void);
             __force_link_error__unknown_type();         \
     } while (0)
 
+#define DECL_SEGFUNCS(SEG)                              \
+static inline void __set_seg_##SEG(u16 seg) {           \
+    __asm__("movw %w1, %%" #SEG : "=m"(__segment_##SEG) \
+            : "rm"(seg));                               \
+}                                                       \
+static inline u16 __get_seg_##SEG(void) {               \
+    u16 res;                                            \
+    __asm__("movw %%" #SEG ", %w0" : "=rm"(res)         \
+            : "m"(__segment_##SEG));                    \
+    return res;                                         \
+}
+DECL_SEGFUNCS(CS)
+DECL_SEGFUNCS(DS)
+DECL_SEGFUNCS(ES)
+DECL_SEGFUNCS(FS)
+DECL_SEGFUNCS(GS)
+DECL_SEGFUNCS(SS)
+
 // Low level macros for getting/setting a segment register.
-#define __SET_SEG(SEG, value)                                   \
-    __asm__("movw %w1, %%" #SEG : "=m"(__segment_ ## SEG)       \
-            : "rm"(value))
-#define __GET_SEG(SEG) ({                                       \
-    u16 __seg;                                                  \
-    __asm__("movw %%" #SEG ", %w0" : "=rm"(__seg)               \
-            : "m"(__segment_ ## SEG));                          \
-    __seg;})
+#define __SET_SEG(SEG, value)                   \
+    __set_seg_##SEG(value)
+#define __GET_SEG(SEG)                          \
+    __get_seg_##SEG()
 
 // Macros for accessing a variable in another segment.  (They
 // automatically update the %es segment and then make the appropriate