⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inffast.s

📁 gcc的组建
💻 S
📖 第 1 页 / 共 3 页
字号:
        cmpl    $32, bitslong_r        ja      .L_get_length_code_mmx  /* if (32 < bits) */        movd    bitslong_r, tmp_mm        movd    (in_r), %mm7        addl    $4, in_r        psllq   tmp_mm, %mm7        addl    $32, bitslong_r        por     %mm7, hold_mm           /* hold_mm |= *((uint *)in)++ << bits */.L_get_length_code_mmx:        pand    hold_mm, lmask_mm        movd    lmask_mm, %eax        movq    lmask2_mm, lmask_mm        movl    (%ebx,%eax,4), %eax     /* eax = lcode[hold & lmask] */.L_dolen_mmx:        movzbl  %ah, %ecx               /* ecx = this.bits */        movd    %ecx, used_mm        subl    %ecx, bitslong_r        /* bits -= this.bits */        testb   %al, %al        jnz     .L_test_for_length_base_mmx /* if (op != 0) 45.7% */        shrl    $16, %eax               /* output this.val char */        stosb        jmp     .L_while_test_mmx.L_test_for_length_base_mmx:#define len_r  %edx        movl    %eax, len_r             /* len = this */        shrl    $16, len_r              /* len = this.val */        testb   $16, %al        jz      .L_test_for_second_level_length_mmx /* if ((op & 16) == 0) 8% */        andl    $15, %eax               /* op &= 15 */        jz      .L_decode_distance_mmx  /* if (!op) */        psrlq   used_mm, hold_mm        /* hold_mm >>= last bit length */        movd    %eax, used_mm        movd    hold_mm, %ecx        subl    %eax, bitslong_r        andl    .L_mask(,%eax,4), %ecx        addl    %ecx, len_r             /* len += hold & mask[op] */.L_decode_distance_mmx:        psrlq   used_mm, hold_mm        /* hold_mm >>= last bit length */        cmpl    $32, bitslong_r        ja      .L_get_dist_code_mmx    /* if (32 < bits) */        movd    bitslong_r, tmp_mm        movd    (in_r), %mm7        addl    $4, in_r        psllq   tmp_mm, %mm7        addl    $32, bitslong_r        por     %mm7, hold_mm           /* hold_mm |= *((uint *)in)++ << bits */.L_get_dist_code_mmx:        movl    dcode(%esp), %ebx       /* ebx = dcode */        pand    hold_mm, dmask_mm        movd    dmask_mm, %eax        movq    dmask2_mm, dmask_mm        movl    (%ebx,%eax,4), %eax     /* eax = dcode[hold & lmask] */.L_dodist_mmx:#define dist_r %ebx        movzbl  %ah, %ecx               /* ecx = this.bits */        movl    %eax, dist_r        shrl    $16, dist_r             /* dist  = this.val */        subl    %ecx, bitslong_r        /* bits -= this.bits */        movd    %ecx, used_mm        testb   $16, %al                /* if ((op & 16) == 0) */        jz      .L_test_for_second_level_dist_mmx        andl    $15, %eax               /* op &= 15 */        jz      .L_check_dist_one_mmx.L_add_bits_to_dist_mmx:        psrlq   used_mm, hold_mm        /* hold_mm >>= last bit length */        movd    %eax, used_mm           /* save bit length of current op */        movd    hold_mm, %ecx           /* get the next bits on input stream */        subl    %eax, bitslong_r        /* bits -= op bits */        andl    .L_mask(,%eax,4), %ecx  /* ecx   = hold & mask[op] */        addl    %ecx, dist_r            /* dist += hold & mask[op] */.L_check_window_mmx:        movl    in_r, in(%esp)          /* save in so from can use it's reg */        movl    out_r, %eax        subl    beg(%esp), %eax         /* nbytes = out - beg */        cmpl    dist_r, %eax        jb      .L_clip_window_mmx      /* if (dist > nbytes) 4.2% */        movl    len_r, %ecx        movl    out_r, from_r        subl    dist_r, from_r          /* from = out - dist */        subl    $3, %ecx        movb    (from_r), %al        movb    %al, (out_r)        movb    1(from_r), %al        movb    2(from_r), %dl        addl    $3, from_r        movb    %al, 1(out_r)        movb    %dl, 2(out_r)        addl    $3, out_r        rep     movsb        movl    in(%esp), in_r          /* move in back to %esi, toss from */        movl    lcode(%esp), %ebx       /* move lcode back to %ebx, toss dist */        jmp     .L_while_test_mmx.align 16,0x90.L_check_dist_one_mmx:        cmpl    $1, dist_r        jne     .L_check_window_mmx        cmpl    out_r, beg(%esp)        je      .L_check_window_mmx        decl    out_r        movl    len_r, %ecx        movb    (out_r), %al        subl    $3, %ecx        movb    %al, 1(out_r)        movb    %al, 2(out_r)        movb    %al, 3(out_r)        addl    $4, out_r        rep     stosb        movl    lcode(%esp), %ebx       /* move lcode back to %ebx, toss dist */        jmp     .L_while_test_mmx.align 16,0x90.L_test_for_second_level_length_mmx:        testb   $64, %al        jnz     .L_test_for_end_of_block  /* if ((op & 64) != 0) */        andl    $15, %eax        psrlq   used_mm, hold_mm        /* hold_mm >>= last bit length */        movd    hold_mm, %ecx        andl    .L_mask(,%eax,4), %ecx        addl    len_r, %ecx        movl    (%ebx,%ecx,4), %eax     /* eax = lcode[hold & lmask] */        jmp     .L_dolen_mmx.align 16,0x90.L_test_for_second_level_dist_mmx:        testb   $64, %al        jnz     .L_invalid_distance_code  /* if ((op & 64) != 0) */        andl    $15, %eax        psrlq   used_mm, hold_mm        /* hold_mm >>= last bit length */        movd    hold_mm, %ecx        andl    .L_mask(,%eax,4), %ecx        movl    dcode(%esp), %eax       /* ecx = dcode */        addl    dist_r, %ecx        movl    (%eax,%ecx,4), %eax     /* eax = lcode[hold & lmask] */        jmp     .L_dodist_mmx.align 16,0x90.L_clip_window_mmx:#define nbytes_r %ecx        movl    %eax, nbytes_r        movl    wsize(%esp), %eax       /* prepare for dist compare */        negl    nbytes_r                /* nbytes = -nbytes */        movl    window(%esp), from_r    /* from = window */        cmpl    dist_r, %eax        jb      .L_invalid_distance_too_far /* if (dist > wsize) */        addl    dist_r, nbytes_r        /* nbytes = dist - nbytes */        cmpl    $0, write(%esp)        jne     .L_wrap_around_window_mmx /* if (write != 0) */        subl    nbytes_r, %eax        addl    %eax, from_r            /* from += wsize - nbytes */        cmpl    nbytes_r, len_r        jbe     .L_do_copy1_mmx         /* if (nbytes >= len) */        subl    nbytes_r, len_r         /* len -= nbytes */        rep     movsb        movl    out_r, from_r        subl    dist_r, from_r          /* from = out - dist */        jmp     .L_do_copy1_mmx        cmpl    nbytes_r, len_r        jbe     .L_do_copy1_mmx         /* if (nbytes >= len) */        subl    nbytes_r, len_r         /* len -= nbytes */        rep     movsb        movl    out_r, from_r        subl    dist_r, from_r          /* from = out - dist */        jmp     .L_do_copy1_mmx.L_wrap_around_window_mmx:#define write_r %eax        movl    write(%esp), write_r        cmpl    write_r, nbytes_r        jbe     .L_contiguous_in_window_mmx /* if (write >= nbytes) */        addl    wsize(%esp), from_r        addl    write_r, from_r        subl    nbytes_r, from_r        /* from += wsize + write - nbytes */        subl    write_r, nbytes_r       /* nbytes -= write */#undef write_r        cmpl    nbytes_r, len_r        jbe     .L_do_copy1_mmx         /* if (nbytes >= len) */        subl    nbytes_r, len_r         /* len -= nbytes */        rep     movsb        movl    window(%esp), from_r    /* from = window */        movl    write(%esp), nbytes_r   /* nbytes = write */        cmpl    nbytes_r, len_r        jbe     .L_do_copy1_mmx         /* if (nbytes >= len) */        subl    nbytes_r, len_r         /* len -= nbytes */        rep     movsb        movl    out_r, from_r        subl    dist_r, from_r          /* from = out - dist */        jmp     .L_do_copy1_mmx.L_contiguous_in_window_mmx:#define write_r %eax        addl    write_r, from_r        subl    nbytes_r, from_r        /* from += write - nbytes */#undef write_r        cmpl    nbytes_r, len_r        jbe     .L_do_copy1_mmx         /* if (nbytes >= len) */        subl    nbytes_r, len_r         /* len -= nbytes */        rep     movsb        movl    out_r, from_r        subl    dist_r, from_r          /* from = out - dist */.L_do_copy1_mmx:#undef nbytes_r#define in_r %esi        movl    len_r, %ecx        rep     movsb        movl    in(%esp), in_r          /* move in back to %esi, toss from */        movl    lcode(%esp), %ebx       /* move lcode back to %ebx, toss dist */        jmp     .L_while_test_mmx#undef hold_r#undef bitslong_r#endif /* USE_MMX || RUN_TIME_MMX *//*** USE_MMX, NO_MMX, and RUNTIME_MMX from here on ***/.L_invalid_distance_code:        /* else {         *   strm->msg = "invalid distance code";         *   state->mode = BAD;         * }         */        movl    $.L_invalid_distance_code_msg, %ecx        movl    $INFLATE_MODE_BAD, %edx        jmp     .L_update_stream_state.L_test_for_end_of_block:        /* else if (op & 32) {         *   state->mode = TYPE;         *   break;         * }         */        testb   $32, %al        jz      .L_invalid_literal_length_code  /* if ((op & 32) == 0) */        movl    $0, %ecx        movl    $INFLATE_MODE_TYPE, %edx        jmp     .L_update_stream_state.L_invalid_literal_length_code:        /* else {         *   strm->msg = "invalid literal/length code";         *   state->mode = BAD;         * }         */        movl    $.L_invalid_literal_length_code_msg, %ecx        movl    $INFLATE_MODE_BAD, %edx        jmp     .L_update_stream_state.L_invalid_distance_too_far:        /* strm->msg = "invalid distance too far back";         * state->mode = BAD;         */        movl    in(%esp), in_r          /* from_r has in's reg, put in back */        movl    $.L_invalid_distance_too_far_msg, %ecx        movl    $INFLATE_MODE_BAD, %edx        jmp     .L_update_stream_state.L_update_stream_state:        /* set strm->msg = %ecx, strm->state->mode = %edx */        movl    strm_sp(%esp), %eax        testl   %ecx, %ecx              /* if (msg != NULL) */        jz      .L_skip_msg        movl    %ecx, msg_strm(%eax)    /* strm->msg = msg */.L_skip_msg:        movl    state_strm(%eax), %eax  /* state = strm->state */        movl    %edx, mode_state(%eax)  /* state->mode = edx (BAD | TYPE) */        jmp     .L_break_loop.align 32,0x90.L_break_loop:/* * Regs: * * bits = %ebp when mmx, and in %ebx when non-mmx * hold = %hold_mm when mmx, and in %ebp when non-mmx * in   = %esi * out  = %edi */#if defined( USE_MMX ) || defined( RUN_TIME_MMX )#if defined( RUN_TIME_MMX )        cmpl    $DO_USE_MMX, inflate_fast_use_mmx        jne     .L_update_next_in#endif /* RUN_TIME_MMX */        movl    %ebp, %ebx.L_update_next_in:#endif#define strm_r  %eax#define state_r %edx        /* len = bits >> 3;         * in -= len;         * bits -= len << 3;         * hold &= (1U << bits) - 1;         * state->hold = hold;         * state->bits = bits;         * strm->next_in = in;         * strm->next_out = out;         */        movl    strm_sp(%esp), strm_r        movl    %ebx, %ecx        movl    state_strm(strm_r), state_r        shrl    $3, %ecx        subl    %ecx, in_r        shll    $3, %ecx        subl    %ecx, %ebx        movl    out_r, next_out_strm(strm_r)        movl    %ebx, bits_state(state_r)        movl    %ebx, %ecx        leal    buf(%esp), %ebx        cmpl    %ebx, last(%esp)        jne     .L_buf_not_used         /* if buf != last */        subl    %ebx, in_r              /* in -= buf */        movl    next_in_strm(strm_r), %ebx        movl    %ebx, last(%esp)        /* last = strm->next_in */        addl    %ebx, in_r              /* in += strm->next_in */        movl    avail_in_strm(strm_r), %ebx        subl    $11, %ebx        addl    %ebx, last(%esp)    /* last = &strm->next_in[ avail_in - 11 ] */.L_buf_not_used:        movl    in_r, next_in_strm(strm_r)        movl    $1, %ebx        shll    %cl, %ebx        decl    %ebx#if defined( USE_MMX ) || defined( RUN_TIME_MMX )#if defined( RUN_TIME_MMX )        cmpl    $DO_USE_MMX, inflate_fast_use_mmx        jne     .L_update_hold#endif /* RUN_TIME_MMX */        psrlq   used_mm, hold_mm        /* hold_mm >>= last bit length */        movd    hold_mm, %ebp        emms.L_update_hold:#endif /* USE_MMX || RUN_TIME_MMX */        andl    %ebx, %ebp        movl    %ebp, hold_state(state_r)#define last_r %ebx        /* strm->avail_in = in < last ? 11 + (last - in) : 11 - (in - last) */        movl    last(%esp), last_r        cmpl    in_r, last_r        jbe     .L_last_is_smaller     /* if (in >= last) */        subl    in_r, last_r           /* last -= in */        addl    $11, last_r            /* last += 11 */        movl    last_r, avail_in_strm(strm_r)        jmp     .L_fixup_out.L_last_is_smaller:        subl    last_r, in_r           /* in -= last */        negl    in_r                   /* in = -in */        addl    $11, in_r              /* in += 11 */        movl    in_r, avail_in_strm(strm_r)#undef last_r#define end_r %ebx.L_fixup_out:        /* strm->avail_out = out < end ? 257 + (end - out) : 257 - (out - end)*/        movl    end(%esp), end_r        cmpl    out_r, end_r        jbe     .L_end_is_smaller      /* if (out >= end) */        subl    out_r, end_r           /* end -= out */        addl    $257, end_r            /* end += 257 */        movl    end_r, avail_out_strm(strm_r)        jmp     .L_done.L_end_is_smaller:        subl    end_r, out_r           /* out -= end */        negl    out_r                  /* out = -out */        addl    $257, out_r            /* out += 257 */        movl    out_r, avail_out_strm(strm_r)#undef end_r#undef strm_r#undef state_r.L_done:        addl    $local_var_size, %esp        popf        popl    %ebx        popl    %ebp        popl    %esi        popl    %edi        ret#if defined( GAS_ELF )/* elf info */.type inflate_fast,@function.size inflate_fast,.-inflate_fast#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -