/* If not of not match is equal to not of not, then it is a match */
 #define DEFINE_COMPARISON_PRED(type)                                   \
-static int filter_pred_##type(struct filter_pred *pred, void *event)   \
+static int filter_pred_LT_##type(struct filter_pred *pred, void *event)        \
 {                                                                      \
        type *addr = (type *)(event + pred->offset);                    \
        type val = (type)pred->val;                                     \
-       int match = 0;                                                  \
-                                                                       \
-       switch (pred->op) {                                             \
-       case OP_LT:                                                     \
-               match = (*addr < val);                                  \
-               break;                                                  \
-       case OP_LE:                                                     \
-               match = (*addr <= val);                                 \
-               break;                                                  \
-       case OP_GT:                                                     \
-               match = (*addr > val);                                  \
-               break;                                                  \
-       case OP_GE:                                                     \
-               match = (*addr >= val);                                 \
-               break;                                                  \
-       case OP_BAND:                                                   \
-               match = (*addr & val);                                  \
-               break;                                                  \
-       default:                                                        \
-               break;                                                  \
-       }                                                               \
-                                                                       \
+       int match = (*addr < val);                                      \
        return !!match == !pred->not;                                   \
-}
+}                                                                      \
+static int filter_pred_LE_##type(struct filter_pred *pred, void *event)        \
+{                                                                      \
+       type *addr = (type *)(event + pred->offset);                    \
+       type val = (type)pred->val;                                     \
+       int match = (*addr <= val);                                     \
+       return !!match == !pred->not;                                   \
+}                                                                      \
+static int filter_pred_GT_##type(struct filter_pred *pred, void *event)        \
+{                                                                      \
+       type *addr = (type *)(event + pred->offset);                    \
+       type val = (type)pred->val;                                     \
+       int match = (*addr > val);                                      \
+       return !!match == !pred->not;                                   \
+}                                                                      \
+static int filter_pred_GE_##type(struct filter_pred *pred, void *event)        \
+{                                                                      \
+       type *addr = (type *)(event + pred->offset);                    \
+       type val = (type)pred->val;                                     \
+       int match = (*addr >= val);                                     \
+       return !!match == !pred->not;                                   \
+}                                                                      \
+static int filter_pred_BAND_##type(struct filter_pred *pred, void *event) \
+{                                                                      \
+       type *addr = (type *)(event + pred->offset);                    \
+       type val = (type)pred->val;                                     \
+       int match = !!(*addr & val);                                    \
+       return match == !pred->not;                                     \
+}                                                                      \
+static const filter_pred_fn_t pred_funcs_##type[] = {                  \
+       filter_pred_LT_##type,                                          \
+       filter_pred_LE_##type,                                          \
+       filter_pred_GT_##type,                                          \
+       filter_pred_GE_##type,                                          \
+       filter_pred_BAND_##type,                                        \
+};
+
+#define PRED_FUNC_START                        OP_LT
 
 #define DEFINE_EQUALITY_PRED(size)                                     \
 static int filter_pred_##size(struct filter_pred *pred, void *event)   \
                if (op == OP_EQ || op == OP_NE)
                        fn = filter_pred_64;
                else if (field_is_signed)
-                       fn = filter_pred_s64;
+                       fn = pred_funcs_s64[op - PRED_FUNC_START];
                else
-                       fn = filter_pred_u64;
+                       fn = pred_funcs_u64[op - PRED_FUNC_START];
                break;
        case 4:
                if (op == OP_EQ || op == OP_NE)
                        fn = filter_pred_32;
                else if (field_is_signed)
-                       fn = filter_pred_s32;
+                       fn = pred_funcs_s32[op - PRED_FUNC_START];
                else
-                       fn = filter_pred_u32;
+                       fn = pred_funcs_u32[op - PRED_FUNC_START];
                break;
        case 2:
                if (op == OP_EQ || op == OP_NE)
                        fn = filter_pred_16;
                else if (field_is_signed)
-                       fn = filter_pred_s16;
+                       fn = pred_funcs_s16[op - PRED_FUNC_START];
                else
-                       fn = filter_pred_u16;
+                       fn = pred_funcs_u16[op - PRED_FUNC_START];
                break;
        case 1:
                if (op == OP_EQ || op == OP_NE)
                        fn = filter_pred_8;
                else if (field_is_signed)
-                       fn = filter_pred_s8;
+                       fn = pred_funcs_s8[op - PRED_FUNC_START];
                else
-                       fn = filter_pred_u8;
+                       fn = pred_funcs_u8[op - PRED_FUNC_START];
                break;
        }