emit(rv_jalr(RV_REG_ZERO, RV_REG_T1, lower), ctx);
 }
 
-static void emit_zext_32(u8 reg, struct rv_jit_context *ctx)
-{
-       emit_slli(reg, reg, 32, ctx);
-       emit_srli(reg, reg, 32, ctx);
-}
-
 static int emit_bpf_tail_call(int insn, struct rv_jit_context *ctx)
 {
        int tc_ninsn, off, start_insn = ctx->ninsns;
         */
        tc_ninsn = insn ? ctx->offset[insn] - ctx->offset[insn - 1] :
                   ctx->offset[0];
-       emit_zext_32(RV_REG_A2, ctx);
+       emit_zextw(RV_REG_A2, RV_REG_A2, ctx);
 
        off = offsetof(struct bpf_array, map.max_entries);
        if (is_12b_check(off, insn))
 static void emit_zext_32_rd_rs(u8 *rd, u8 *rs, struct rv_jit_context *ctx)
 {
        emit_mv(RV_REG_T2, *rd, ctx);
-       emit_zext_32(RV_REG_T2, ctx);
+       emit_zextw(RV_REG_T2, RV_REG_T2, ctx);
        emit_mv(RV_REG_T1, *rs, ctx);
-       emit_zext_32(RV_REG_T1, ctx);
+       emit_zextw(RV_REG_T1, RV_REG_T1, ctx);
        *rd = RV_REG_T2;
        *rs = RV_REG_T1;
 }
 static void emit_zext_32_rd_t1(u8 *rd, struct rv_jit_context *ctx)
 {
        emit_mv(RV_REG_T2, *rd, ctx);
-       emit_zext_32(RV_REG_T2, ctx);
-       emit_zext_32(RV_REG_T1, ctx);
+       emit_zextw(RV_REG_T2, RV_REG_T2, ctx);
+       emit_zextw(RV_REG_T1, RV_REG_T2, ctx);
        *rd = RV_REG_T2;
 }
 
                emit(is64 ? rv_amoadd_d(rs, rs, rd, 0, 0) :
                     rv_amoadd_w(rs, rs, rd, 0, 0), ctx);
                if (!is64)
-                       emit_zext_32(rs, ctx);
+                       emit_zextw(rs, rs, ctx);
                break;
        case BPF_AND | BPF_FETCH:
                emit(is64 ? rv_amoand_d(rs, rs, rd, 0, 0) :
                     rv_amoand_w(rs, rs, rd, 0, 0), ctx);
                if (!is64)
-                       emit_zext_32(rs, ctx);
+                       emit_zextw(rs, rs, ctx);
                break;
        case BPF_OR | BPF_FETCH:
                emit(is64 ? rv_amoor_d(rs, rs, rd, 0, 0) :
                     rv_amoor_w(rs, rs, rd, 0, 0), ctx);
                if (!is64)
-                       emit_zext_32(rs, ctx);
+                       emit_zextw(rs, rs, ctx);
                break;
        case BPF_XOR | BPF_FETCH:
                emit(is64 ? rv_amoxor_d(rs, rs, rd, 0, 0) :
                     rv_amoxor_w(rs, rs, rd, 0, 0), ctx);
                if (!is64)
-                       emit_zext_32(rs, ctx);
+                       emit_zextw(rs, rs, ctx);
                break;
        /* src_reg = atomic_xchg(dst_reg + off16, src_reg); */
        case BPF_XCHG:
                emit(is64 ? rv_amoswap_d(rs, rs, rd, 0, 0) :
                     rv_amoswap_w(rs, rs, rd, 0, 0), ctx);
                if (!is64)
-                       emit_zext_32(rs, ctx);
+                       emit_zextw(rs, rs, ctx);
                break;
        /* r0 = atomic_cmpxchg(dst_reg + off16, r0, src_reg); */
        case BPF_CMPXCHG:
        case BPF_ALU64 | BPF_MOV | BPF_X:
                if (imm == 1) {
                        /* Special mov32 for zext */
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                        break;
                }
                switch (insn->off) {
                        break;
                }
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
 
        /* dst = dst OP src */
        case BPF_ALU64 | BPF_ADD | BPF_X:
                emit_add(rd, rd, rs, ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_SUB | BPF_X:
        case BPF_ALU64 | BPF_SUB | BPF_X:
                        emit_subw(rd, rd, rs, ctx);
 
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_AND | BPF_X:
        case BPF_ALU64 | BPF_AND | BPF_X:
                emit_and(rd, rd, rs, ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_OR | BPF_X:
        case BPF_ALU64 | BPF_OR | BPF_X:
                emit_or(rd, rd, rs, ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_XOR | BPF_X:
        case BPF_ALU64 | BPF_XOR | BPF_X:
                emit_xor(rd, rd, rs, ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_MUL | BPF_X:
        case BPF_ALU64 | BPF_MUL | BPF_X:
                emit(is64 ? rv_mul(rd, rd, rs) : rv_mulw(rd, rd, rs), ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_DIV | BPF_X:
        case BPF_ALU64 | BPF_DIV | BPF_X:
                else
                        emit(is64 ? rv_divu(rd, rd, rs) : rv_divuw(rd, rd, rs), ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_MOD | BPF_X:
        case BPF_ALU64 | BPF_MOD | BPF_X:
                else
                        emit(is64 ? rv_remu(rd, rd, rs) : rv_remuw(rd, rd, rs), ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_LSH | BPF_X:
        case BPF_ALU64 | BPF_LSH | BPF_X:
                emit(is64 ? rv_sll(rd, rd, rs) : rv_sllw(rd, rd, rs), ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_RSH | BPF_X:
        case BPF_ALU64 | BPF_RSH | BPF_X:
                emit(is64 ? rv_srl(rd, rd, rs) : rv_srlw(rd, rd, rs), ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_ARSH | BPF_X:
        case BPF_ALU64 | BPF_ARSH | BPF_X:
                emit(is64 ? rv_sra(rd, rd, rs) : rv_sraw(rd, rd, rs), ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
 
        /* dst = -dst */
        case BPF_ALU64 | BPF_NEG:
                emit_sub(rd, RV_REG_ZERO, rd, ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
 
        /* dst = BSWAP##imm(dst) */
                        break;
                case 32:
                        if (!aux->verifier_zext)
-                               emit_zext_32(rd, ctx);
+                               emit_zextw(rd, rd, ctx);
                        break;
                case 64:
                        /* Do nothing */
        case BPF_ALU64 | BPF_MOV | BPF_K:
                emit_imm(rd, imm, ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
 
        /* dst = dst OP imm */
                        emit_add(rd, rd, RV_REG_T1, ctx);
                }
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_SUB | BPF_K:
        case BPF_ALU64 | BPF_SUB | BPF_K:
                        emit_sub(rd, rd, RV_REG_T1, ctx);
                }
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_AND | BPF_K:
        case BPF_ALU64 | BPF_AND | BPF_K:
                        emit_and(rd, rd, RV_REG_T1, ctx);
                }
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_OR | BPF_K:
        case BPF_ALU64 | BPF_OR | BPF_K:
                        emit_or(rd, rd, RV_REG_T1, ctx);
                }
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_XOR | BPF_K:
        case BPF_ALU64 | BPF_XOR | BPF_K:
                        emit_xor(rd, rd, RV_REG_T1, ctx);
                }
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_MUL | BPF_K:
        case BPF_ALU64 | BPF_MUL | BPF_K:
                emit(is64 ? rv_mul(rd, rd, RV_REG_T1) :
                     rv_mulw(rd, rd, RV_REG_T1), ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_DIV | BPF_K:
        case BPF_ALU64 | BPF_DIV | BPF_K:
                        emit(is64 ? rv_divu(rd, rd, RV_REG_T1) :
                             rv_divuw(rd, rd, RV_REG_T1), ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_MOD | BPF_K:
        case BPF_ALU64 | BPF_MOD | BPF_K:
                        emit(is64 ? rv_remu(rd, rd, RV_REG_T1) :
                             rv_remuw(rd, rd, RV_REG_T1), ctx);
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_LSH | BPF_K:
        case BPF_ALU64 | BPF_LSH | BPF_K:
                emit_slli(rd, rd, imm, ctx);
 
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_RSH | BPF_K:
        case BPF_ALU64 | BPF_RSH | BPF_K:
                        emit(rv_srliw(rd, rd, imm), ctx);
 
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
        case BPF_ALU | BPF_ARSH | BPF_K:
        case BPF_ALU64 | BPF_ARSH | BPF_K:
                        emit(rv_sraiw(rd, rd, imm), ctx);
 
                if (!is64 && !aux->verifier_zext)
-                       emit_zext_32(rd, ctx);
+                       emit_zextw(rd, rd, ctx);
                break;
 
        /* JUMP off */