Introduce likely/unlikely macros, use them in saa.c
authorH. Peter Anvin <hpa@zytor.com>
Tue, 10 Jun 2008 16:35:26 +0000 (09:35 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Tue, 10 Jun 2008 16:35:26 +0000 (09:35 -0700)
Introduce the likely() and unlikely() macros, as used in Linux.
They are compiler-dependent hints that a particular boolean expression
is likely to be true or false, respectively.

Currently only implemented for gcc.

compiler.h
saa.c

index 01e1127..51f4983 100644 (file)
@@ -110,4 +110,16 @@ char *strsep(char **, const char *);
 # define X86_MEMORY 0
 #endif
 
+/*
+ * Hints to the compiler that a particular branch of code is more or
+ * less likely to be taken.
+ */
+#if defined(__GNUC__) && __GNUC__ >= 3
+# define likely(x)     __builtin_expect(!!(x), 1)
+# define unlikely(x)   __builtin_expect(!!(x), 0)
+#else
+# define likely(x)     (!!(x))
+# define unlikely(x)   (!!(x))
+#endif
+
 #endif /* NASM_COMPILER_H */
diff --git a/saa.c b/saa.c
index 51123da..1704b7d 100644 (file)
--- a/saa.c
+++ b/saa.c
@@ -211,7 +211,7 @@ void saa_fread(struct SAA *s, size_t posn, void *data, size_t len)
        return;
     }
 
-    if (s->blk_len == SAA_BLKLEN) {
+    if (likely(s->blk_len == SAA_BLKLEN)) {
        ix = posn >> SAA_BLKSHIFT;
        s->rpos = posn & (SAA_BLKLEN-1);
     } else {
@@ -235,7 +235,7 @@ void saa_fwrite(struct SAA *s, size_t posn, const void *data, size_t len)
        return;
     }
     
-    if (s->blk_len == SAA_BLKLEN) {
+    if (likely(s->blk_len == SAA_BLKLEN)) {
        ix = posn >> SAA_BLKSHIFT;
        s->wpos = posn & (SAA_BLKLEN-1);
     } else {