wrp_test_reg_one(nfp_prog, insn->dst_reg * 2, alu_op,
                         insn->src_reg * 2, br_mask, insn->off);
-       wrp_test_reg_one(nfp_prog, insn->dst_reg * 2 + 1, alu_op,
-                        insn->src_reg * 2 + 1, br_mask, insn->off);
+       if (is_mbpf_jmp64(meta))
+               wrp_test_reg_one(nfp_prog, insn->dst_reg * 2 + 1, alu_op,
+                                insn->src_reg * 2 + 1, br_mask, insn->off);
 
        return 0;
 }
        else
                emit_alu(nfp_prog, reg_none(), tmp_reg, alu_op, reg_a(reg));
 
-       tmp_reg = ur_load_imm_any(nfp_prog, imm >> 32, imm_b(nfp_prog));
-       if (!code->swap)
-               emit_alu(nfp_prog, reg_none(),
-                        reg_a(reg + 1), carry_op, tmp_reg);
-       else
-               emit_alu(nfp_prog, reg_none(),
-                        tmp_reg, carry_op, reg_a(reg + 1));
+       if (is_mbpf_jmp64(meta)) {
+               tmp_reg = ur_load_imm_any(nfp_prog, imm >> 32, imm_b(nfp_prog));
+               if (!code->swap)
+                       emit_alu(nfp_prog, reg_none(),
+                                reg_a(reg + 1), carry_op, tmp_reg);
+               else
+                       emit_alu(nfp_prog, reg_none(),
+                                tmp_reg, carry_op, reg_a(reg + 1));
+       }
 
        emit_br(nfp_prog, code->br_mask, insn->off, 0);
 
        }
 
        emit_alu(nfp_prog, reg_none(), reg_a(areg), ALU_OP_SUB, reg_b(breg));
-       emit_alu(nfp_prog, reg_none(),
-                reg_a(areg + 1), ALU_OP_SUB_C, reg_b(breg + 1));
+       if (is_mbpf_jmp64(meta))
+               emit_alu(nfp_prog, reg_none(),
+                        reg_a(areg + 1), ALU_OP_SUB_C, reg_b(breg + 1));
        emit_br(nfp_prog, code->br_mask, insn->off, 0);
 
        return 0;
        return 0;
 }
 
+static int jeq32_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
+{
+       const struct bpf_insn *insn = &meta->insn;
+       swreg tmp_reg;
+
+       tmp_reg = ur_load_imm_any(nfp_prog, insn->imm, imm_b(nfp_prog));
+       emit_alu(nfp_prog, reg_none(),
+                reg_a(insn->dst_reg * 2), ALU_OP_XOR, tmp_reg);
+       emit_br(nfp_prog, BR_BEQ, insn->off, 0);
+
+       return 0;
+}
+
 static int jset_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
 {
        const struct bpf_insn *insn = &meta->insn;
        /* Upper word of the mask can only be 0 or ~0 from sign extension,
         * so either ignore it or OR the whole thing in.
         */
-       if (imm >> 32)
+       if (is_mbpf_jmp64(meta) && imm >> 32) {
                emit_alu(nfp_prog, reg_none(),
                         reg_a(dst_gpr + 1), ALU_OP_OR, imm_b(nfp_prog));
+       }
        emit_br(nfp_prog, BR_BNE, insn->off, 0);
 
        return 0;
 {
        const struct bpf_insn *insn = &meta->insn;
        u64 imm = insn->imm; /* sign extend */
+       bool is_jmp32 = is_mbpf_jmp32(meta);
        swreg tmp_reg;
 
        if (!imm) {
-               emit_alu(nfp_prog, reg_none(), reg_a(insn->dst_reg * 2),
-                        ALU_OP_OR, reg_b(insn->dst_reg * 2 + 1));
+               if (is_jmp32)
+                       emit_alu(nfp_prog, reg_none(), reg_none(), ALU_OP_NONE,
+                                reg_b(insn->dst_reg * 2));
+               else
+                       emit_alu(nfp_prog, reg_none(), reg_a(insn->dst_reg * 2),
+                                ALU_OP_OR, reg_b(insn->dst_reg * 2 + 1));
                emit_br(nfp_prog, BR_BNE, insn->off, 0);
                return 0;
        }
                 reg_a(insn->dst_reg * 2), ALU_OP_XOR, tmp_reg);
        emit_br(nfp_prog, BR_BNE, insn->off, 0);
 
+       if (is_jmp32)
+               return 0;
+
        tmp_reg = ur_load_imm_any(nfp_prog, imm >> 32, imm_b(nfp_prog));
        emit_alu(nfp_prog, reg_none(),
                 reg_a(insn->dst_reg * 2 + 1), ALU_OP_XOR, tmp_reg);
 
        emit_alu(nfp_prog, imm_a(nfp_prog), reg_a(insn->dst_reg * 2),
                 ALU_OP_XOR, reg_b(insn->src_reg * 2));
-       emit_alu(nfp_prog, imm_b(nfp_prog), reg_a(insn->dst_reg * 2 + 1),
-                ALU_OP_XOR, reg_b(insn->src_reg * 2 + 1));
-       emit_alu(nfp_prog, reg_none(),
-                imm_a(nfp_prog), ALU_OP_OR, imm_b(nfp_prog));
+       if (is_mbpf_jmp64(meta)) {
+               emit_alu(nfp_prog, imm_b(nfp_prog),
+                        reg_a(insn->dst_reg * 2 + 1), ALU_OP_XOR,
+                        reg_b(insn->src_reg * 2 + 1));
+               emit_alu(nfp_prog, reg_none(), imm_a(nfp_prog), ALU_OP_OR,
+                        imm_b(nfp_prog));
+       }
        emit_br(nfp_prog, BR_BEQ, insn->off, 0);
 
        return 0;
        [BPF_JMP | BPF_JSLE | BPF_X] =  cmp_reg,
        [BPF_JMP | BPF_JSET | BPF_X] =  jset_reg,
        [BPF_JMP | BPF_JNE | BPF_X] =   jne_reg,
+       [BPF_JMP32 | BPF_JEQ | BPF_K] = jeq32_imm,
+       [BPF_JMP32 | BPF_JGT | BPF_K] = cmp_imm,
+       [BPF_JMP32 | BPF_JGE | BPF_K] = cmp_imm,
+       [BPF_JMP32 | BPF_JLT | BPF_K] = cmp_imm,
+       [BPF_JMP32 | BPF_JLE | BPF_K] = cmp_imm,
+       [BPF_JMP32 | BPF_JSGT | BPF_K] =cmp_imm,
+       [BPF_JMP32 | BPF_JSGE | BPF_K] =cmp_imm,
+       [BPF_JMP32 | BPF_JSLT | BPF_K] =cmp_imm,
+       [BPF_JMP32 | BPF_JSLE | BPF_K] =cmp_imm,
+       [BPF_JMP32 | BPF_JSET | BPF_K] =jset_imm,
+       [BPF_JMP32 | BPF_JNE | BPF_K] = jne_imm,
+       [BPF_JMP32 | BPF_JEQ | BPF_X] = jeq_reg,
+       [BPF_JMP32 | BPF_JGT | BPF_X] = cmp_reg,
+       [BPF_JMP32 | BPF_JGE | BPF_X] = cmp_reg,
+       [BPF_JMP32 | BPF_JLT | BPF_X] = cmp_reg,
+       [BPF_JMP32 | BPF_JLE | BPF_X] = cmp_reg,
+       [BPF_JMP32 | BPF_JSGT | BPF_X] =cmp_reg,
+       [BPF_JMP32 | BPF_JSGE | BPF_X] =cmp_reg,
+       [BPF_JMP32 | BPF_JSLT | BPF_X] =cmp_reg,
+       [BPF_JMP32 | BPF_JSLE | BPF_X] =cmp_reg,
+       [BPF_JMP32 | BPF_JSET | BPF_X] =jset_reg,
+       [BPF_JMP32 | BPF_JNE | BPF_X] = jne_reg,
        [BPF_JMP | BPF_CALL] =          call,
        [BPF_JMP | BPF_EXIT] =          jmp_exit,
 };
        list_for_each_entry(meta, &nfp_prog->insns, l) {
                if (meta->flags & FLAG_INSN_SKIP_MASK)
                        continue;
-               if (BPF_CLASS(meta->insn.code) != BPF_JMP)
+               if (!is_mbpf_jmp(meta))
                        continue;
                if (meta->insn.code == (BPF_JMP | BPF_EXIT) &&
                    !nfp_is_main_function(meta))
                if (meta->flags & FLAG_INSN_SKIP_MASK)
                        continue;
 
-               if (BPF_CLASS(insn.code) != BPF_ALU &&
-                   BPF_CLASS(insn.code) != BPF_ALU64 &&
-                   BPF_CLASS(insn.code) != BPF_JMP)
+               if (!is_mbpf_alu(meta) && !is_mbpf_jmp(meta))
                        continue;
                if (BPF_SRC(insn.code) != BPF_K)
                        continue;
                if (insn.imm >= 0)
                        continue;
 
-               if (BPF_CLASS(insn.code) == BPF_JMP) {
+               if (is_mbpf_jmp(meta)) {
                        switch (BPF_OP(insn.code)) {
                        case BPF_JGE:
                        case BPF_JSGE:
                unsigned int dst_idx;
                bool pseudo_call;
 
-               if (BPF_CLASS(code) != BPF_JMP)
+               if (!is_mbpf_jmp(meta))
                        continue;
                if (BPF_OP(code) == BPF_EXIT)
                        continue;