return false;
 }
 
+static void mark_fp(struct rv_jit_context *ctx)
+{
+       __set_bit(RV_CTX_F_SEEN_S5, &ctx->flags);
+}
+
 static void mark_call(struct rv_jit_context *ctx)
 {
        __set_bit(RV_CTX_F_SEEN_CALL, &ctx->flags);
 
        emit(rv_addi(RV_REG_SP, RV_REG_SP, stack_adjust), ctx);
        /* Set return value. */
-       emit(rv_addi(RV_REG_A0, RV_REG_A5, 0), ctx);
+       if (reg == RV_REG_RA)
+               emit(rv_addi(RV_REG_A0, RV_REG_A5, 0), ctx);
        emit(rv_jalr(RV_REG_ZERO, reg, 0), ctx);
 }
 
 {
        int stack_adjust = 0, store_offset, bpf_stack_adjust;
 
+       bpf_stack_adjust = round_up(ctx->prog->aux->stack_depth, 16);
+       if (bpf_stack_adjust)
+               mark_fp(ctx);
+
        if (seen_reg(RV_REG_RA, ctx))
                stack_adjust += 8;
        stack_adjust += 8; /* RV_REG_FP */
                stack_adjust += 8;
 
        stack_adjust = round_up(stack_adjust, 16);
-       bpf_stack_adjust = round_up(ctx->prog->aux->stack_depth, 16);
        stack_adjust += bpf_stack_adjust;
 
        store_offset = stack_adjust - 8;