struct nft_pktinfo;
 void nft_meta_get_eval(const struct nft_expr *expr,
                       struct nft_regs *regs, const struct nft_pktinfo *pkt);
+void nft_cmp_eval(const struct nft_expr *expr,
+                 struct nft_regs *regs, const struct nft_pktinfo *pkt);
 void nft_lookup_eval(const struct nft_expr *expr,
                     struct nft_regs *regs, const struct nft_pktinfo *pkt);
+void nft_payload_eval(const struct nft_expr *expr,
+                     struct nft_regs *regs, const struct nft_pktinfo *pkt);
+void nft_immediate_eval(const struct nft_expr *expr,
+                       struct nft_regs *regs, const struct nft_pktinfo *pkt);
+void nft_bitwise_eval(const struct nft_expr *expr,
+                     struct nft_regs *regs, const struct nft_pktinfo *pkt);
+void nft_range_eval(const struct nft_expr *expr,
+                   struct nft_regs *regs, const struct nft_pktinfo *pkt);
+void nft_byteorder_eval(const struct nft_expr *expr,
+                       struct nft_regs *regs, const struct nft_pktinfo *pkt);
+void nft_dynset_eval(const struct nft_expr *expr,
+                    struct nft_regs *regs, const struct nft_pktinfo *pkt);
+void nft_rt_get_eval(const struct nft_expr *expr,
+                    struct nft_regs *regs, const struct nft_pktinfo *pkt);
 #endif /* _NET_NF_TABLES_CORE_H */
 
                               struct nft_regs *regs,
                               struct nft_pktinfo *pkt)
 {
+#ifdef CONFIG_RETPOLINE
        unsigned long e = (unsigned long)expr->ops->eval;
-
-       if (e == (unsigned long)nft_meta_get_eval)
-               nft_meta_get_eval(expr, regs, pkt);
-       else if (e == (unsigned long)nft_lookup_eval)
-               nft_lookup_eval(expr, regs, pkt);
-       else
-               expr->ops->eval(expr, regs, pkt);
+#define X(e, fun) \
+       do { if ((e) == (unsigned long)(fun)) \
+               return fun(expr, regs, pkt); } while (0)
+
+       X(e, nft_payload_eval);
+       X(e, nft_cmp_eval);
+       X(e, nft_meta_get_eval);
+       X(e, nft_lookup_eval);
+       X(e, nft_range_eval);
+       X(e, nft_immediate_eval);
+       X(e, nft_byteorder_eval);
+       X(e, nft_dynset_eval);
+       X(e, nft_rt_get_eval);
+       X(e, nft_bitwise_eval);
+#undef  X
+#endif /* CONFIG_RETPOLINE */
+       expr->ops->eval(expr, regs, pkt);
 }
 
 unsigned int
 
        struct nft_data         xor;
 };
 
-static void nft_bitwise_eval(const struct nft_expr *expr,
-                            struct nft_regs *regs,
-                            const struct nft_pktinfo *pkt)
+void nft_bitwise_eval(const struct nft_expr *expr,
+                     struct nft_regs *regs, const struct nft_pktinfo *pkt)
 {
        const struct nft_bitwise *priv = nft_expr_priv(expr);
        const u32 *src = ®s->data[priv->sreg];
 
        u8                      size;
 };
 
-static void nft_byteorder_eval(const struct nft_expr *expr,
-                              struct nft_regs *regs,
-                              const struct nft_pktinfo *pkt)
+void nft_byteorder_eval(const struct nft_expr *expr,
+                       struct nft_regs *regs,
+                       const struct nft_pktinfo *pkt)
 {
        const struct nft_byteorder *priv = nft_expr_priv(expr);
        u32 *src = ®s->data[priv->sreg];
 
        enum nft_cmp_ops        op:8;
 };
 
-static void nft_cmp_eval(const struct nft_expr *expr,
-                        struct nft_regs *regs,
-                        const struct nft_pktinfo *pkt)
+void nft_cmp_eval(const struct nft_expr *expr,
+                 struct nft_regs *regs,
+                 const struct nft_pktinfo *pkt)
 {
        const struct nft_cmp_expr *priv = nft_expr_priv(expr);
        int d;
 
        return NULL;
 }
 
-static void nft_dynset_eval(const struct nft_expr *expr,
-                           struct nft_regs *regs,
-                           const struct nft_pktinfo *pkt)
+void nft_dynset_eval(const struct nft_expr *expr,
+                    struct nft_regs *regs, const struct nft_pktinfo *pkt)
 {
        const struct nft_dynset *priv = nft_expr_priv(expr);
        struct nft_set *set = priv->set;
 
 #include <net/netfilter/nf_tables_core.h>
 #include <net/netfilter/nf_tables.h>
 
-static void nft_immediate_eval(const struct nft_expr *expr,
-                              struct nft_regs *regs,
-                              const struct nft_pktinfo *pkt)
+void nft_immediate_eval(const struct nft_expr *expr,
+                       struct nft_regs *regs,
+                       const struct nft_pktinfo *pkt)
 {
        const struct nft_immediate_expr *priv = nft_expr_priv(expr);
 
 
        return skb_copy_bits(skb, offset + mac_off, dst_u8, len) == 0;
 }
 
-static void nft_payload_eval(const struct nft_expr *expr,
-                            struct nft_regs *regs,
-                            const struct nft_pktinfo *pkt)
+void nft_payload_eval(const struct nft_expr *expr,
+                     struct nft_regs *regs,
+                     const struct nft_pktinfo *pkt)
 {
        const struct nft_payload *priv = nft_expr_priv(expr);
        const struct sk_buff *skb = pkt->skb;
 
        enum nft_range_ops      op:8;
 };
 
-static void nft_range_eval(const struct nft_expr *expr,
-                        struct nft_regs *regs,
-                        const struct nft_pktinfo *pkt)
+void nft_range_eval(const struct nft_expr *expr,
+                   struct nft_regs *regs, const struct nft_pktinfo *pkt)
 {
        const struct nft_range_expr *priv = nft_expr_priv(expr);
        int d1, d2;
 
        return mtu - minlen;
 }
 
-static void nft_rt_get_eval(const struct nft_expr *expr,
-                           struct nft_regs *regs,
-                           const struct nft_pktinfo *pkt)
+void nft_rt_get_eval(const struct nft_expr *expr,
+                    struct nft_regs *regs,
+                    const struct nft_pktinfo *pkt)
 {
        const struct nft_rt *priv = nft_expr_priv(expr);
        const struct sk_buff *skb = pkt->skb;