[SeaBIOS] [PATCH 1/2] Use inline functions instead of macros for GET/SET_SEG segment manipulation.

Kevin O'Connor kevin at koconnor.net
Fri May 25 05:25:15 CEST 2012


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 at koconnor.net>
---
 src/farptr.h |   30 ++++++++++++++++++++++--------
 1 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/src/farptr.h b/src/farptr.h
index 3dbf545..3a85c6b 100644
--- a/src/farptr.h
+++ b/src/farptr.h
@@ -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
-- 
1.7.6.5




More information about the SeaBIOS mailing list