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

📄 inffast.s

📁 gcc的组建
💻 S
📖 第 1 页 / 共 3 页
字号:
        movl    (%ecx,%edx,4), %eax     /* eax = lcode[hold & lmask] */.L_dolen:        /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out         *         * dolen:         *    bits -= this.bits;         *    hold >>= this.bits         */        movb    %ah, %cl                /* cl = this.bits */        subb    %ah, bits_r             /* bits -= this.bits */        shrl    %cl, hold_r             /* hold >>= this.bits */        /* check if op is a literal         * if (op == 0) {         *    PUP(out) = this.val;         *  }         */        testb   %al, %al        jnz     .L_test_for_length_base /* if (op != 0) 45.7% */        shrl    $16, %eax               /* output this.val char */        stosb        jmp     .L_while_test.L_test_for_length_base:        /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = len         *         * else if (op & 16) {         *   len = this.val         *   op &= 15         *   if (op) {         *     if (op > bits) {         *       hold |= *((unsigned short *)in)++ << bits;         *       bits += 16         *     }         *     len += hold & mask[op];         *     bits -= op;         *     hold >>= op;         *   }         */#define len_r %edx        movl    %eax, len_r             /* len = this */        shrl    $16, len_r              /* len = this.val */        movb    %al, %cl        testb   $16, %al        jz      .L_test_for_second_level_length /* if ((op & 16) == 0) 8% */        andb    $15, %cl                /* op &= 15 */        jz      .L_save_len             /* if (!op) */        cmpb    %cl, bits_r        jae     .L_add_bits_to_len      /* if (op <= bits) */        movb    %cl, %ch                /* stash op in ch, freeing cl */        xorl    %eax, %eax        lodsw                           /* al = *(ushort *)in++ */        movb    bits_r, %cl             /* cl = bits, needs it for shifting */        addb    $16, bits_r             /* bits += 16 */        shll    %cl, %eax        orl     %eax, hold_r            /* hold |= *((ushort *)in)++ << bits */        movb    %ch, %cl                /* move op back to ecx */.L_add_bits_to_len:        movl    $1, %eax        shll    %cl, %eax        decl    %eax        subb    %cl, bits_r        andl    hold_r, %eax            /* eax &= hold */        shrl    %cl, hold_r        addl    %eax, len_r             /* len += hold & mask[op] */.L_save_len:        movl    len_r, len(%esp)        /* save len */#undef  len_r.L_decode_distance:        /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = dist         *         *   if (bits < 15) {         *     hold |= *((unsigned short *)in)++ << bits;         *     bits += 16         *   }         *   this = dcode[hold & dmask];         * dodist:         *   bits -= this.bits;         *   hold >>= this.bits;         *   op = this.op;         */        cmpb    $15, bits_r        ja      .L_get_distance_code    /* if (15 < bits) */        xorl    %eax, %eax        lodsw                           /* al = *(ushort *)in++ */        movb    bits_r, %cl             /* cl = bits, needs it for shifting */        addb    $16, bits_r             /* bits += 16 */        shll    %cl, %eax        orl     %eax, hold_r            /* hold |= *((ushort *)in)++ << bits */.L_get_distance_code:        movl    dmask(%esp), %edx       /* edx = dmask */        movl    dcode(%esp), %ecx       /* ecx = dcode */        andl    hold_r, %edx            /* edx &= hold */        movl    (%ecx,%edx,4), %eax     /* eax = dcode[hold & dmask] */#define dist_r %edx.L_dodist:        movl    %eax, dist_r            /* dist = this */        shrl    $16, dist_r             /* dist = this.val */        movb    %ah, %cl        subb    %ah, bits_r             /* bits -= this.bits */        shrl    %cl, hold_r             /* hold >>= this.bits */        /* if (op & 16) {         *   dist = this.val         *   op &= 15         *   if (op > bits) {         *     hold |= *((unsigned short *)in)++ << bits;         *     bits += 16         *   }         *   dist += hold & mask[op];         *   bits -= op;         *   hold >>= op;         */        movb    %al, %cl                /* cl = this.op */        testb   $16, %al                /* if ((op & 16) == 0) */        jz      .L_test_for_second_level_dist        andb    $15, %cl                /* op &= 15 */        jz      .L_check_dist_one        cmpb    %cl, bits_r        jae     .L_add_bits_to_dist     /* if (op <= bits) 97.6% */        movb    %cl, %ch                /* stash op in ch, freeing cl */        xorl    %eax, %eax        lodsw                           /* al = *(ushort *)in++ */        movb    bits_r, %cl             /* cl = bits, needs it for shifting */        addb    $16, bits_r             /* bits += 16 */        shll    %cl, %eax        orl     %eax, hold_r            /* hold |= *((ushort *)in)++ << bits */        movb    %ch, %cl                /* move op back to ecx */.L_add_bits_to_dist:        movl    $1, %eax        shll    %cl, %eax        decl    %eax                    /* (1 << op) - 1 */        subb    %cl, bits_r        andl    hold_r, %eax            /* eax &= hold */        shrl    %cl, hold_r        addl    %eax, dist_r            /* dist += hold & ((1 << op) - 1) */        jmp     .L_check_window.L_check_window:        /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist         *       %ecx = nbytes         *         * nbytes = out - beg;         * if (dist <= nbytes) {         *   from = out - dist;         *   do {         *     PUP(out) = PUP(from);         *   } while (--len > 0) {         * }         */        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          /* if (dist > nbytes) 4.2% */        movl    len(%esp), %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 */        jmp     .L_while_test.align 16,0x90.L_check_dist_one:        cmpl    $1, dist_r        jne     .L_check_window        cmpl    out_r, beg(%esp)        je      .L_check_window        decl    out_r        movl    len(%esp), %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        jmp     .L_while_test.align 16,0x90.L_test_for_second_level_length:        /* else if ((op & 64) == 0) {         *   this = lcode[this.val + (hold & mask[op])];         * }         */        testb   $64, %al        jnz     .L_test_for_end_of_block  /* if ((op & 64) != 0) */        movl    $1, %eax        shll    %cl, %eax        decl    %eax        andl    hold_r, %eax            /* eax &= hold */        addl    %edx, %eax              /* eax += this.val */        movl    lcode(%esp), %edx       /* edx = lcode */        movl    (%edx,%eax,4), %eax     /* eax = lcode[val + (hold&mask[op])] */        jmp     .L_dolen.align 16,0x90.L_test_for_second_level_dist:        /* else if ((op & 64) == 0) {         *   this = dcode[this.val + (hold & mask[op])];         * }         */        testb   $64, %al        jnz     .L_invalid_distance_code  /* if ((op & 64) != 0) */        movl    $1, %eax        shll    %cl, %eax        decl    %eax        andl    hold_r, %eax            /* eax &= hold */        addl    %edx, %eax              /* eax += this.val */        movl    dcode(%esp), %edx       /* edx = dcode */        movl    (%edx,%eax,4), %eax     /* eax = dcode[val + (hold&mask[op])] */        jmp     .L_dodist.align 16,0x90.L_clip_window:        /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist         *       %ecx = nbytes         *         * else {         *   if (dist > wsize) {         *     invalid distance         *   }         *   from = window;         *   nbytes = dist - nbytes;         *   if (write == 0) {         *     from += wsize - nbytes;         */#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   /* if (write != 0) */        subl    nbytes_r, %eax        addl    %eax, from_r            /* from += wsize - nbytes */        /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist         *       %ecx = nbytes, %eax = len         *         *     if (nbytes < len) {         *       len -= nbytes;         *       do {         *         PUP(out) = PUP(from);         *       } while (--nbytes);         *       from = out - dist;         *     }         *   }         */#define len_r %eax        movl    len(%esp), len_r        cmpl    nbytes_r, len_r        jbe     .L_do_copy1             /* 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        cmpl    nbytes_r, len_r        jbe     .L_do_copy1             /* 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.L_wrap_around_window:        /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist         *       %ecx = nbytes, %eax = write, %eax = len         *         *   else if (write < nbytes) {         *     from += wsize + write - nbytes;         *     nbytes -= write;         *     if (nbytes < len) {         *       len -= nbytes;         *       do {         *         PUP(out) = PUP(from);         *       } while (--nbytes);         *       from = window;         *       nbytes = write;         *       if (nbytes < len) {         *         len -= nbytes;         *         do {         *           PUP(out) = PUP(from);         *         } while(--nbytes);         *         from = out - dist;         *       }         *     }         *   }         */#define write_r %eax        movl    write(%esp), write_r        cmpl    write_r, nbytes_r        jbe     .L_contiguous_in_window /* 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        movl    len(%esp), len_r        cmpl    nbytes_r, len_r        jbe     .L_do_copy1             /* 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             /* 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.L_contiguous_in_window:        /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist         *       %ecx = nbytes, %eax = write, %eax = len         *         *   else {         *     from += write - nbytes;         *     if (nbytes < len) {         *       len -= nbytes;         *       do {         *         PUP(out) = PUP(from);         *       } while (--nbytes);         *       from = out - dist;         *     }         *   }         */#define write_r %eax        addl    write_r, from_r        subl    nbytes_r, from_r        /* from += write - nbytes */#undef write_r        movl    len(%esp), len_r        cmpl    nbytes_r, len_r        jbe     .L_do_copy1             /* 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:        /* regs: %esi = from, %esi = in, %ebp = hold, %bl = bits, %edi = out         *       %eax = len         *         *     while (len > 0) {         *       PUP(out) = PUP(from);         *       len--;         *     }         *   }         * } while (in < last && out < end);         */#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 */        jmp     .L_while_test#undef len_r#undef dist_r#endif /* NO_MMX || RUN_TIME_MMX *//*** MMX code ***/#if defined( USE_MMX ) || defined( RUN_TIME_MMX ).align 32,0x90.L_init_mmx:        emms#undef  bits_r#undef  bitslong_r#define bitslong_r %ebp#define hold_mm    %mm0        movd    %ebp, hold_mm        movl    %ebx, bitslong_r#define used_mm   %mm1#define dmask2_mm %mm2#define lmask2_mm %mm3#define lmask_mm  %mm4#define dmask_mm  %mm5#define tmp_mm    %mm6        movd    lmask(%esp), lmask_mm        movq    lmask_mm, lmask2_mm        movd    dmask(%esp), dmask_mm        movq    dmask_mm, dmask2_mm        pxor    used_mm, used_mm        movl    lcode(%esp), %ebx       /* ebx = lcode */        jmp     .L_do_loop_mmx.align 32,0x90.L_while_test_mmx:        /* while (in < last && out < end)         */        cmpl    out_r, end(%esp)        jbe     .L_break_loop           /* if (out >= end) */        cmpl    in_r, last(%esp)        jbe     .L_break_loop.L_do_loop_mmx:        psrlq   used_mm, hold_mm        /* hold_mm >>= last bit length */

⌨️ 快捷键说明

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