{
        int i;
 
-       /* First arg comes in as a 32 bits pointer. */
-       EMIT(PPC_RAW_MR(bpf_to_ppc(BPF_REG_1), _R3));
-       EMIT(PPC_RAW_LI(bpf_to_ppc(BPF_REG_1) - 1, 0));
+       /* Initialize tail_call_cnt, to be skipped if we do tail calls. */
+       EMIT(PPC_RAW_LI(_R4, 0));
+
+#define BPF_TAILCALL_PROLOGUE_SIZE     4
+
        EMIT(PPC_RAW_STWU(_R1, _R1, -BPF_PPC_STACKFRAME(ctx)));
 
-       /*
-        * Initialize tail_call_cnt in stack frame if we do tail calls.
-        * Otherwise, put in NOPs so that it can be skipped when we are
-        * invoked through a tail call.
-        */
        if (ctx->seen & SEEN_TAILCALL)
-               EMIT(PPC_RAW_STW(bpf_to_ppc(BPF_REG_1) - 1, _R1,
-                                bpf_jit_stack_offsetof(ctx, BPF_PPC_TC)));
-       else
-               EMIT(PPC_RAW_NOP());
+               EMIT(PPC_RAW_STW(_R4, _R1, bpf_jit_stack_offsetof(ctx, BPF_PPC_TC)));
 
-#define BPF_TAILCALL_PROLOGUE_SIZE     16
+       /* First arg comes in as a 32 bits pointer. */
+       EMIT(PPC_RAW_MR(bpf_to_ppc(BPF_REG_1), _R3));
+       EMIT(PPC_RAW_LI(bpf_to_ppc(BPF_REG_1) - 1, 0));
 
        /*
         * We need a stack frame, but we don't necessarily need to
        for (i = BPF_PPC_NVR_MIN; i <= 31; i++)
                if (bpf_is_seen_register(ctx, i))
                        EMIT(PPC_RAW_LWZ(i, _R1, bpf_jit_stack_offsetof(ctx, i)));
-}
-
-void bpf_jit_build_epilogue(u32 *image, struct codegen_context *ctx)
-{
-       EMIT(PPC_RAW_MR(_R3, bpf_to_ppc(BPF_REG_0)));
-
-       bpf_jit_emit_common_epilogue(image, ctx);
-
-       /* Tear down our stack frame */
 
        if (ctx->seen & SEEN_FUNC)
                EMIT(PPC_RAW_LWZ(_R0, _R1, BPF_PPC_STACKFRAME(ctx) + PPC_LR_STKOFF));
 
+       /* Tear down our stack frame */
        EMIT(PPC_RAW_ADDI(_R1, _R1, BPF_PPC_STACKFRAME(ctx)));
 
        if (ctx->seen & SEEN_FUNC)
                EMIT(PPC_RAW_MTLR(_R0));
 
+}
+
+void bpf_jit_build_epilogue(u32 *image, struct codegen_context *ctx)
+{
+       EMIT(PPC_RAW_MR(_R3, bpf_to_ppc(BPF_REG_0)));
+
+       bpf_jit_emit_common_epilogue(image, ctx);
+
        EMIT(PPC_RAW_BLR());
 }
 
        EMIT(PPC_RAW_RLWINM(_R3, b2p_index, 2, 0, 29));
        EMIT(PPC_RAW_ADD(_R3, _R3, b2p_bpf_array));
        EMIT(PPC_RAW_LWZ(_R3, _R3, offsetof(struct bpf_array, ptrs)));
-       EMIT(PPC_RAW_STW(_R0, _R1, bpf_jit_stack_offsetof(ctx, BPF_PPC_TC)));
 
        /*
         * if (prog == NULL)
 
        /* goto *(prog->bpf_func + prologue_size); */
        EMIT(PPC_RAW_LWZ(_R3, _R3, offsetof(struct bpf_prog, bpf_func)));
-
-       if (ctx->seen & SEEN_FUNC)
-               EMIT(PPC_RAW_LWZ(_R0, _R1, BPF_PPC_STACKFRAME(ctx) + PPC_LR_STKOFF));
-
        EMIT(PPC_RAW_ADDIC(_R3, _R3, BPF_TAILCALL_PROLOGUE_SIZE));
-
-       if (ctx->seen & SEEN_FUNC)
-               EMIT(PPC_RAW_MTLR(_R0));
-
        EMIT(PPC_RAW_MTCTR(_R3));
 
        EMIT(PPC_RAW_MR(_R3, bpf_to_ppc(BPF_REG_1)));
 
+       /* Put tail_call_cnt in r4 */
+       EMIT(PPC_RAW_MR(_R4, _R0));
+
        /* tear restore NVRs, ... */
        bpf_jit_emit_common_epilogue(image, ctx);