19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* inffas86.c is a hand tuned assembler version of
29e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * inffast.c -- fast decoding
49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Copyright (C) 1995-2003 Mark Adler
59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * For conditions of distribution and use, see copyright notice in zlib.h
69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Copyright (C) 2003 Chris Anderson <christop@charm.net>
89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Please use the copyright conditions above.
99e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Dec-29-2003 -- I added AMD64 inflate asm support.  This version is also
119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * slightly quicker on x86 systems because, instead of using rep movsb to copy
129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * data, it uses rep movsw, which moves data in 2-byte chunks instead of single
139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * bytes.  I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates
149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * from http://fedora.linux.duke.edu/fc1_x86_64
159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with
169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * 1GB ram.  The 64-bit version is about 4% faster than the 32-bit version,
179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * when decompressing mozilla-source-1.3.tar.gz.
189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from
209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * the gcc -S output of zlib-1.2.0/inffast.c.  Zlib-1.2.0 is in beta release at
219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * the moment.  I have successfully compiled and tested this code with gcc2.96,
229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * gcc3.2, icc5.0, msvc6.0.  It is very close to the speed of inffast.S
239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX
249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * enabled.  I will attempt to merge the MMX code into this version.  Newer
259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * versions of this and inffast.S can be found at
269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/
279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "zutil.h"
309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "inftrees.h"
319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "inflate.h"
329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "inffast.h"
339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* Mark Adler's comments from inffast.c: */
359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   Decode literal, length, and distance codes and write out the resulting
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   literal and match bytes until either not enough input or output is
399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   available, an end-of-block is encountered, or a data error is encountered.
409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   When large enough input and output buffers are supplied to inflate(), for
419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   example, a 16K input buffer and a 64K output buffer, more than 95% of the
429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   inflate execution time is spent in this routine.
439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   Entry assumptions:
459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        state->mode == LEN
479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        strm->avail_in >= 6
489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        strm->avail_out >= 258
499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        start >= strm->avail_out
509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        state->bits < 8
519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   On return, state->mode is one of:
539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        LEN -- ran out of enough output space or enough available input
559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        TYPE -- reached end of block code, inflate() to interpret next block
569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        BAD -- error in block data
579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   Notes:
599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    - The maximum input bits used by a length/distance pair is 15 bits for the
619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      length code, 5 bits for the length extra, 15 bits for the distance code,
629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.
639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      Therefore if strm->avail_in >= 6, then there is enough input to avoid
649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      checking for available input while decoding.
659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    - The maximum bytes that a single length/distance pair can output is 258
679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      bytes, which is the maximum length that can be coded.  inflate_fast()
689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      requires strm->avail_out >= 258 for each loop to avoid checking for
699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      output space.
709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid inflate_fast(strm, start)
729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectz_streamp strm;
739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectunsigned start;         /* inflate()'s starting value for strm->avail_out */
749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    struct inflate_state FAR *state;
769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    struct inffast_ar {
779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 64   32                               x86  x86_64 */
789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ar offset                              register */
799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*  0    0 */ void *esp;                /* esp save */
809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*  8    4 */ void *ebp;                /* ebp save */
819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 16    8 */ unsigned char FAR *in;    /* esi rsi  local strm->next_in */
829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 24   12 */ unsigned char FAR *last;  /*     r9   while in < last */
839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 32   16 */ unsigned char FAR *out;   /* edi rdi  local strm->next_out */
849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 40   20 */ unsigned char FAR *beg;   /*          inflate()'s init next_out */
859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 48   24 */ unsigned char FAR *end;   /*     r10  while out < end */
869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 56   28 */ unsigned char FAR *window;/*          size of window, wsize!=0 */
879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 64   32 */ code const FAR *lcode;    /* ebp rbp  local strm->lencode */
889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 72   36 */ code const FAR *dcode;    /*     r11  local strm->distcode */
899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 80   40 */ unsigned long hold;       /* edx rdx  local strm->hold */
909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 88   44 */ unsigned bits;            /* ebx rbx  local strm->bits */
919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 92   48 */ unsigned wsize;           /*          window size */
929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 96   52 */ unsigned write;           /*          window write index */
939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*100   56 */ unsigned lmask;           /*     r12  mask for lcode */
949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*104   60 */ unsigned dmask;           /*     r13  mask for dcode */
959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*108   64 */ unsigned len;             /*     r14  match length */
969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*112   68 */ unsigned dist;            /*     r15  match distance */
979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*116   72 */ unsigned status;          /*          set when state chng*/
989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    } ar;
999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )
1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define PAD_AVAIL_IN 6
1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define PAD_AVAIL_OUT 258
1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else
1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define PAD_AVAIL_IN 5
1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define PAD_AVAIL_OUT 257
1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* copy state to local variables */
1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    state = (struct inflate_state FAR *)strm->state;
1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.in = strm->next_in;
1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN);
1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.out = strm->next_out;
1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.beg = ar.out - (start - strm->avail_out);
1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT);
1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.wsize = state->wsize;
116381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ar.write = state->wnext;
1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.window = state->window;
1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.hold = state->hold;
1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.bits = state->bits;
1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.lcode = state->lencode;
1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.dcode = state->distcode;
1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.lmask = (1U << state->lenbits) - 1;
1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.dmask = (1U << state->distbits) - 1;
1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* decode literals and length/distances until end-of-block or not enough
1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project       input data or output space */
1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* align in on 1/2 hold size boundary */
1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    while (((unsigned long)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) {
1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ar.hold += (unsigned long)*ar.in++ << ar.bits;
1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ar.bits += 8;
1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )
1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    __asm__ __volatile__ (
1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        leaq    %0, %%rax\n"
1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%rbp, 8(%%rax)\n"       /* save regs rbp and rsp */
1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%rsp, (%%rax)\n"
1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%rax, %%rsp\n"          /* make rsp point to &ar */
1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    16(%%rsp), %%rsi\n"      /* rsi  = in */
1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    32(%%rsp), %%rdi\n"      /* rdi  = out */
1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    24(%%rsp), %%r9\n"       /* r9   = last */
1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    48(%%rsp), %%r10\n"      /* r10  = end */
1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    64(%%rsp), %%rbp\n"      /* rbp  = lcode */
1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    72(%%rsp), %%r11\n"      /* r11  = dcode */
1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    80(%%rsp), %%rdx\n"      /* rdx  = hold */
1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    88(%%rsp), %%ebx\n"      /* ebx  = bits */
1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    100(%%rsp), %%r12d\n"    /* r12d = lmask */
1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    104(%%rsp), %%r13d\n"    /* r13d = dmask */
1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                          /* r14d = len */
1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                          /* r15d = dist */
1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cld\n"
1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpq    %%rdi, %%r10\n"
1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        je      .L_one_time\n"           /* if only one decode left */
1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpq    %%rsi, %%r9\n"
1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        je      .L_one_time\n"
1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_do_loop\n"
1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_one_time:\n"
1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%r12, %%r8\n"           /* r8 = lmask */
1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpb    $32, %%bl\n"
1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        ja      .L_get_length_code_one_time\n"
1639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        lodsl\n"                         /* eax = *(uint *)in++ */
1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%bl, %%cl\n"            /* cl = bits, needs it for shifting */
1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addb    $32, %%bl\n"             /* bits += 32 */
1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shlq    %%cl, %%rax\n"
1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        orq     %%rax, %%rdx\n"          /* hold |= *((uint *)in)++ << bits */
1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_get_length_code_one_time\n"
1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_while_test:\n"
1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpq    %%rdi, %%r10\n"
1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jbe     .L_break_loop\n"
1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpq    %%rsi, %%r9\n"
1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jbe     .L_break_loop\n"
1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_do_loop:\n"
1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%r12, %%r8\n"           /* r8 = lmask */
1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpb    $32, %%bl\n"
1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        ja      .L_get_length_code\n"    /* if (32 < bits) */
1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        lodsl\n"                         /* eax = *(uint *)in++ */
1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%bl, %%cl\n"            /* cl = bits, needs it for shifting */
1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addb    $32, %%bl\n"             /* bits += 32 */
1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shlq    %%cl, %%rax\n"
1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        orq     %%rax, %%rdx\n"          /* hold |= *((uint *)in)++ << bits */
1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_get_length_code:\n"
1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andq    %%rdx, %%r8\n"            /* r8 &= hold */
1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    (%%rbp,%%r8,4), %%eax\n"  /* eax = lcode[hold & lmask] */
1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%ah, %%cl\n"            /* cl = this.bits */
1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subb    %%ah, %%bl\n"            /* bits -= this.bits */
1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrq    %%cl, %%rdx\n"           /* hold >>= this.bits */
1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        testb   %%al, %%al\n"
1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jnz     .L_test_for_length_base\n" /* if (op != 0) 45.7% */
1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%r12, %%r8\n"            /* r8 = lmask */
2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrl    $16, %%eax\n"            /* output this.val char */
2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        stosb\n"
2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_get_length_code_one_time:\n"
2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andq    %%rdx, %%r8\n"            /* r8 &= hold */
2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */
2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_dolen:\n"
2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%ah, %%cl\n"            /* cl = this.bits */
2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subb    %%ah, %%bl\n"            /* bits -= this.bits */
2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrq    %%cl, %%rdx\n"           /* hold >>= this.bits */
2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        testb   %%al, %%al\n"
2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jnz     .L_test_for_length_base\n" /* if (op != 0) 45.7% */
2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrl    $16, %%eax\n"            /* output this.val char */
2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        stosb\n"
2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_while_test\n"
2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_test_for_length_base:\n"
2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%eax, %%r14d\n"         /* len = this */
2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrl    $16, %%r14d\n"           /* len = this.val */
2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%al, %%cl\n"
2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        testb   $16, %%al\n"
2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jz      .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */
2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andb    $15, %%cl\n"             /* op &= 15 */
2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jz      .L_decode_distance\n"    /* if (!op) */
2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_add_bits_to_len:\n"
2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subb    %%cl, %%bl\n"
2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        xorl    %%eax, %%eax\n"
2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        incl    %%eax\n"
2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shll    %%cl, %%eax\n"
2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        decl    %%eax\n"
2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andl    %%edx, %%eax\n"          /* eax &= hold */
2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrq    %%cl, %%rdx\n"
2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addl    %%eax, %%r14d\n"         /* len += hold & mask[op] */
2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_decode_distance:\n"
2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%r13, %%r8\n"           /* r8 = dmask */
2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpb    $32, %%bl\n"
2449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        ja      .L_get_distance_code\n"  /* if (32 < bits) */
2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        lodsl\n"                         /* eax = *(uint *)in++ */
2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%bl, %%cl\n"            /* cl = bits, needs it for shifting */
2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addb    $32, %%bl\n"             /* bits += 32 */
2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shlq    %%cl, %%rax\n"
2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        orq     %%rax, %%rdx\n"          /* hold |= *((uint *)in)++ << bits */
2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_get_distance_code:\n"
2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andq    %%rdx, %%r8\n"           /* r8 &= hold */
2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    (%%r11,%%r8,4), %%eax\n" /* eax = dcode[hold & dmask] */
2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_dodist:\n"
2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%eax, %%r15d\n"         /* dist = this */
2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrl    $16, %%r15d\n"           /* dist = this.val */
2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%ah, %%cl\n"
2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subb    %%ah, %%bl\n"            /* bits -= this.bits */
2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrq    %%cl, %%rdx\n"           /* hold >>= this.bits */
2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%al, %%cl\n"            /* cl = this.op */
2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        testb   $16, %%al\n"             /* if ((op & 16) == 0) */
2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jz      .L_test_for_second_level_dist\n"
2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andb    $15, %%cl\n"             /* op &= 15 */
2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jz      .L_check_dist_one\n"
2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_add_bits_to_dist:\n"
2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subb    %%cl, %%bl\n"
2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        xorl    %%eax, %%eax\n"
2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        incl    %%eax\n"
2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shll    %%cl, %%eax\n"
2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        decl    %%eax\n"                 /* (1 << op) - 1 */
2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andl    %%edx, %%eax\n"          /* eax &= hold */
2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrq    %%cl, %%rdx\n"
2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addl    %%eax, %%r15d\n"         /* dist += hold & ((1 << op) - 1) */
2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_check_window:\n"
2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%rsi, %%r8\n"           /* save in so from can use it's reg */
2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%rdi, %%rax\n"
2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subq    40(%%rsp), %%rax\n"      /* nbytes = out - beg */
2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%r15d, %%eax\n"
2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jb      .L_clip_window\n"        /* if (dist > nbytes) 4.2% */
2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%r14d, %%ecx\n"         /* ecx = len */
2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%rdi, %%rsi\n"
2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subq    %%r15, %%rsi\n"          /* from = out - dist */
2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        sarl    %%ecx\n"
2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jnc     .L_copy_two\n"           /* if len % 2 == 0 */
2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     movsw\n"
2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    (%%rsi), %%al\n"
2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%al, (%%rdi)\n"
2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        incq    %%rdi\n"
2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%r8, %%rsi\n"           /* move in back to %rsi, toss from */
3009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_while_test\n"
3019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_copy_two:\n"
3039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     movsw\n"
3049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%r8, %%rsi\n"           /* move in back to %rsi, toss from */
3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_while_test\n"
3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
3089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_check_dist_one:\n"
3099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    $1, %%r15d\n"            /* if dist 1, is a memset */
3109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jne     .L_check_window\n"
3119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpq    %%rdi, 40(%%rsp)\n"      /* if out == beg, outside window */
3129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        je      .L_check_window\n"
3139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%r14d, %%ecx\n"         /* ecx = len */
3159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    -1(%%rdi), %%al\n"
3169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%al, %%ah\n"
3179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        sarl    %%ecx\n"
3199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jnc     .L_set_two\n"
3209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%al, (%%rdi)\n"
3219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        incq    %%rdi\n"
3229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_set_two:\n"
3249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     stosw\n"
3259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_while_test\n"
3269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
3289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_test_for_second_level_length:\n"
3299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        testb   $64, %%al\n"
3309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jnz     .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */
3319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        xorl    %%eax, %%eax\n"
3339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        incl    %%eax\n"
3349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shll    %%cl, %%eax\n"
3359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        decl    %%eax\n"
3369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andl    %%edx, %%eax\n"         /* eax &= hold */
3379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addl    %%r14d, %%eax\n"        /* eax += len */
3389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    (%%rbp,%%rax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/
3399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_dolen\n"
3409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
3429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_test_for_second_level_dist:\n"
3439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        testb   $64, %%al\n"
3449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jnz     .L_invalid_distance_code\n" /* if ((op & 64) != 0) */
3459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        xorl    %%eax, %%eax\n"
3479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        incl    %%eax\n"
3489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shll    %%cl, %%eax\n"
3499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        decl    %%eax\n"
3509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andl    %%edx, %%eax\n"         /* eax &= hold */
3519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addl    %%r15d, %%eax\n"        /* eax += dist */
3529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    (%%r11,%%rax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/
3539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_dodist\n"
3549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
3569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_clip_window:\n"
3579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%eax, %%ecx\n"         /* ecx = nbytes */
3589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    92(%%rsp), %%eax\n"     /* eax = wsize, prepare for dist cmp */
3599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        negl    %%ecx\n"                /* nbytes = -nbytes */
3609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%r15d, %%eax\n"
3629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jb      .L_invalid_distance_too_far\n" /* if (dist > wsize) */
3639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addl    %%r15d, %%ecx\n"         /* nbytes = dist - nbytes */
3659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    $0, 96(%%rsp)\n"
3669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jne     .L_wrap_around_window\n" /* if (write != 0) */
3679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    56(%%rsp), %%rsi\n"     /* from  = window */
3699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ecx, %%eax\n"         /* eax  -= nbytes */
3709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addq    %%rax, %%rsi\n"         /* from += wsize - nbytes */
3719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%r14d, %%eax\n"        /* eax = len */
3739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%ecx, %%r14d\n"
3749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jbe     .L_do_copy\n"           /* if (nbytes >= len) */
3759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ecx, %%eax\n"         /* eax -= nbytes */
3779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     movsb\n"
3789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%rdi, %%rsi\n"
3799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subq    %%r15, %%rsi\n"         /* from = &out[ -dist ] */
3809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_do_copy\n"
3819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
3839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_wrap_around_window:\n"
3849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    96(%%rsp), %%eax\n"     /* eax = write */
3859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%eax, %%ecx\n"
3869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jbe     .L_contiguous_in_window\n" /* if (write >= nbytes) */
3879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    92(%%rsp), %%esi\n"     /* from  = wsize */
3899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addq    56(%%rsp), %%rsi\n"     /* from += window */
3909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addq    %%rax, %%rsi\n"         /* from += write */
3919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subq    %%rcx, %%rsi\n"         /* from -= nbytes */
3929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%eax, %%ecx\n"         /* nbytes -= write */
3939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%r14d, %%eax\n"        /* eax = len */
3959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%ecx, %%eax\n"
3969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jbe     .L_do_copy\n"           /* if (nbytes >= len) */
3979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ecx, %%eax\n"         /* len -= nbytes */
3999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     movsb\n"
4009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    56(%%rsp), %%rsi\n"     /* from = window */
4019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    96(%%rsp), %%ecx\n"     /* nbytes = write */
4029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%ecx, %%eax\n"
4039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jbe     .L_do_copy\n"           /* if (nbytes >= len) */
4049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ecx, %%eax\n"         /* len -= nbytes */
4069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     movsb\n"
4079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%rdi, %%rsi\n"
4089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subq    %%r15, %%rsi\n"         /* from = out - dist */
4099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_do_copy\n"
4109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
4129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_contiguous_in_window:\n"
4139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    56(%%rsp), %%rsi\n"     /* rsi = window */
4149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addq    %%rax, %%rsi\n"
4159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subq    %%rcx, %%rsi\n"         /* from += write - nbytes */
4169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%r14d, %%eax\n"        /* eax = len */
4189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%ecx, %%eax\n"
4199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jbe     .L_do_copy\n"           /* if (nbytes >= len) */
4209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ecx, %%eax\n"         /* len -= nbytes */
4229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     movsb\n"
4239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%rdi, %%rsi\n"
4249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subq    %%r15, %%rsi\n"         /* from = out - dist */
4259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_do_copy\n"           /* if (nbytes >= len) */
4269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
4289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_do_copy:\n"
4299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%eax, %%ecx\n"         /* ecx = len */
4309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     movsb\n"
4319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%r8, %%rsi\n"          /* move in back to %esi, toss from */
4339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_while_test\n"
4349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_test_for_end_of_block:\n"
4369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        testb   $32, %%al\n"
4379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jz      .L_invalid_literal_length_code\n"
4389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    $1, 116(%%rsp)\n"
4399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_break_loop_with_status\n"
4409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_invalid_literal_length_code:\n"
4429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    $2, 116(%%rsp)\n"
4439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_break_loop_with_status\n"
4449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_invalid_distance_code:\n"
4469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    $3, 116(%%rsp)\n"
4479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_break_loop_with_status\n"
4489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_invalid_distance_too_far:\n"
4509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    $4, 116(%%rsp)\n"
4519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_break_loop_with_status\n"
4529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_break_loop:\n"
4549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    $0, 116(%%rsp)\n"
4559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_break_loop_with_status:\n"
4579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* put in, out, bits, and hold back into ar and pop esp */
4589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%rsi, 16(%%rsp)\n"     /* in */
4599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%rdi, 32(%%rsp)\n"     /* out */
4609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%ebx, 88(%%rsp)\n"     /* bits */
4619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%rdx, 80(%%rsp)\n"     /* hold */
4629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    (%%rsp), %%rax\n"       /* restore rbp and rsp */
4639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    8(%%rsp), %%rbp\n"
4649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movq    %%rax, %%rsp\n"
4659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project          :
4669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project          : "m" (ar)
4679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project          : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi",
4689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
4699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    );
4709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#elif ( defined( __GNUC__ ) || defined( __ICC ) ) && defined( __i386 )
4719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    __asm__ __volatile__ (
4729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        leal    %0, %%eax\n"
4739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%esp, (%%eax)\n"        /* save esp, ebp */
4749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%ebp, 4(%%eax)\n"
4759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%eax, %%esp\n"
4769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    8(%%esp), %%esi\n"       /* esi = in */
4779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    16(%%esp), %%edi\n"      /* edi = out */
4789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    40(%%esp), %%edx\n"      /* edx = hold */
4799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    44(%%esp), %%ebx\n"      /* ebx = bits */
4809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    32(%%esp), %%ebp\n"      /* ebp = lcode */
4819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cld\n"
4839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_do_loop\n"
4849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
4869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_while_test:\n"
4879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%edi, 24(%%esp)\n"      /* out < end */
4889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jbe     .L_break_loop\n"
4899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%esi, 12(%%esp)\n"      /* in < last */
4909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jbe     .L_break_loop\n"
4919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_do_loop:\n"
4939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpb    $15, %%bl\n"
4949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        ja      .L_get_length_code\n"    /* if (15 < bits) */
4959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        xorl    %%eax, %%eax\n"
4979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        lodsw\n"                         /* al = *(ushort *)in++ */
4989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%bl, %%cl\n"            /* cl = bits, needs it for shifting */
4999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addb    $16, %%bl\n"             /* bits += 16 */
5009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shll    %%cl, %%eax\n"
5019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        orl     %%eax, %%edx\n"        /* hold |= *((ushort *)in)++ << bits */
5029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_get_length_code:\n"
5049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    56(%%esp), %%eax\n"      /* eax = lmask */
5059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andl    %%edx, %%eax\n"          /* eax &= hold */
5069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[hold & lmask] */
5079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_dolen:\n"
5099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%ah, %%cl\n"            /* cl = this.bits */
5109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subb    %%ah, %%bl\n"            /* bits -= this.bits */
5119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrl    %%cl, %%edx\n"           /* hold >>= this.bits */
5129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        testb   %%al, %%al\n"
5149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jnz     .L_test_for_length_base\n" /* if (op != 0) 45.7% */
5159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrl    $16, %%eax\n"            /* output this.val char */
5179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        stosb\n"
5189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_while_test\n"
5199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
5219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_test_for_length_base:\n"
5229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%eax, %%ecx\n"          /* len = this */
5239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrl    $16, %%ecx\n"            /* len = this.val */
5249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%ecx, 64(%%esp)\n"      /* save len */
5259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%al, %%cl\n"
5269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        testb   $16, %%al\n"
5289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jz      .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */
5299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andb    $15, %%cl\n"             /* op &= 15 */
5309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jz      .L_decode_distance\n"    /* if (!op) */
5319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpb    %%cl, %%bl\n"
5329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jae     .L_add_bits_to_len\n"    /* if (op <= bits) */
5339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%cl, %%ch\n"            /* stash op in ch, freeing cl */
5359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        xorl    %%eax, %%eax\n"
5369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        lodsw\n"                         /* al = *(ushort *)in++ */
5379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%bl, %%cl\n"            /* cl = bits, needs it for shifting */
5389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addb    $16, %%bl\n"             /* bits += 16 */
5399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shll    %%cl, %%eax\n"
5409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        orl     %%eax, %%edx\n"         /* hold |= *((ushort *)in)++ << bits */
5419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%ch, %%cl\n"            /* move op back to ecx */
5429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_add_bits_to_len:\n"
5449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subb    %%cl, %%bl\n"
5459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        xorl    %%eax, %%eax\n"
5469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        incl    %%eax\n"
5479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shll    %%cl, %%eax\n"
5489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        decl    %%eax\n"
5499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andl    %%edx, %%eax\n"          /* eax &= hold */
5509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrl    %%cl, %%edx\n"
5519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addl    %%eax, 64(%%esp)\n"      /* len += hold & mask[op] */
5529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_decode_distance:\n"
5549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpb    $15, %%bl\n"
5559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        ja      .L_get_distance_code\n"  /* if (15 < bits) */
5569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        xorl    %%eax, %%eax\n"
5589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        lodsw\n"                         /* al = *(ushort *)in++ */
5599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%bl, %%cl\n"            /* cl = bits, needs it for shifting */
5609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addb    $16, %%bl\n"             /* bits += 16 */
5619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shll    %%cl, %%eax\n"
5629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        orl     %%eax, %%edx\n"         /* hold |= *((ushort *)in)++ << bits */
5639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_get_distance_code:\n"
5659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    60(%%esp), %%eax\n"      /* eax = dmask */
5669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    36(%%esp), %%ecx\n"      /* ecx = dcode */
5679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andl    %%edx, %%eax\n"          /* eax &= hold */
5689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    (%%ecx,%%eax,4), %%eax\n"/* eax = dcode[hold & dmask] */
5699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_dodist:\n"
5719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%eax, %%ebp\n"          /* dist = this */
5729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrl    $16, %%ebp\n"            /* dist = this.val */
5739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%ah, %%cl\n"
5749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subb    %%ah, %%bl\n"            /* bits -= this.bits */
5759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrl    %%cl, %%edx\n"           /* hold >>= this.bits */
5769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%al, %%cl\n"            /* cl = this.op */
5779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        testb   $16, %%al\n"             /* if ((op & 16) == 0) */
5799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jz      .L_test_for_second_level_dist\n"
5809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andb    $15, %%cl\n"             /* op &= 15 */
5819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jz      .L_check_dist_one\n"
5829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpb    %%cl, %%bl\n"
5839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jae     .L_add_bits_to_dist\n"   /* if (op <= bits) 97.6% */
5849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%cl, %%ch\n"            /* stash op in ch, freeing cl */
5869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        xorl    %%eax, %%eax\n"
5879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        lodsw\n"                         /* al = *(ushort *)in++ */
5889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%bl, %%cl\n"            /* cl = bits, needs it for shifting */
5899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addb    $16, %%bl\n"             /* bits += 16 */
5909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shll    %%cl, %%eax\n"
5919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        orl     %%eax, %%edx\n"        /* hold |= *((ushort *)in)++ << bits */
5929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%ch, %%cl\n"            /* move op back to ecx */
5939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_add_bits_to_dist:\n"
5959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subb    %%cl, %%bl\n"
5969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        xorl    %%eax, %%eax\n"
5979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        incl    %%eax\n"
5989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shll    %%cl, %%eax\n"
5999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        decl    %%eax\n"                 /* (1 << op) - 1 */
6009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andl    %%edx, %%eax\n"          /* eax &= hold */
6019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shrl    %%cl, %%edx\n"
6029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addl    %%eax, %%ebp\n"          /* dist += hold & ((1 << op) - 1) */
6039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_check_window:\n"
6059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%esi, 8(%%esp)\n"       /* save in so from can use it's reg */
6069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%edi, %%eax\n"
6079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    20(%%esp), %%eax\n"      /* nbytes = out - beg */
6089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%ebp, %%eax\n"
6109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jb      .L_clip_window\n"        /* if (dist > nbytes) 4.2% */
6119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    64(%%esp), %%ecx\n"      /* ecx = len */
6139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%edi, %%esi\n"
6149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ebp, %%esi\n"          /* from = out - dist */
6159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        sarl    %%ecx\n"
6179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jnc     .L_copy_two\n"           /* if len % 2 == 0 */
6189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     movsw\n"
6209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    (%%esi), %%al\n"
6219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%al, (%%edi)\n"
6229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        incl    %%edi\n"
6239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    8(%%esp), %%esi\n"       /* move in back to %esi, toss from */
6259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    32(%%esp), %%ebp\n"      /* ebp = lcode */
6269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_while_test\n"
6279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_copy_two:\n"
6299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     movsw\n"
6309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    8(%%esp), %%esi\n"       /* move in back to %esi, toss from */
6319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    32(%%esp), %%ebp\n"      /* ebp = lcode */
6329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_while_test\n"
6339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
6359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_check_dist_one:\n"
6369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    $1, %%ebp\n"            /* if dist 1, is a memset */
6379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jne     .L_check_window\n"
6389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%edi, 20(%%esp)\n"
6399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        je      .L_check_window\n"      /* out == beg, if outside window */
6409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    64(%%esp), %%ecx\n"      /* ecx = len */
6429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    -1(%%edi), %%al\n"
6439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%al, %%ah\n"
6449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        sarl    %%ecx\n"
6469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jnc     .L_set_two\n"
6479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movb    %%al, (%%edi)\n"
6489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        incl    %%edi\n"
6499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_set_two:\n"
6519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     stosw\n"
6529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    32(%%esp), %%ebp\n"      /* ebp = lcode */
6539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_while_test\n"
6549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
6569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_test_for_second_level_length:\n"
6579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        testb   $64, %%al\n"
6589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jnz     .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */
6599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        xorl    %%eax, %%eax\n"
6619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        incl    %%eax\n"
6629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shll    %%cl, %%eax\n"
6639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        decl    %%eax\n"
6649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andl    %%edx, %%eax\n"         /* eax &= hold */
6659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addl    64(%%esp), %%eax\n"     /* eax += len */
6669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/
6679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_dolen\n"
6689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
6709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_test_for_second_level_dist:\n"
6719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        testb   $64, %%al\n"
6729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jnz     .L_invalid_distance_code\n" /* if ((op & 64) != 0) */
6739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        xorl    %%eax, %%eax\n"
6759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        incl    %%eax\n"
6769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        shll    %%cl, %%eax\n"
6779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        decl    %%eax\n"
6789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        andl    %%edx, %%eax\n"         /* eax &= hold */
6799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addl    %%ebp, %%eax\n"         /* eax += dist */
6809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    36(%%esp), %%ecx\n"     /* ecx = dcode */
6819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    (%%ecx,%%eax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/
6829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_dodist\n"
6839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
6859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_clip_window:\n"
6869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%eax, %%ecx\n"
6879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    48(%%esp), %%eax\n"     /* eax = wsize */
6889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        negl    %%ecx\n"                /* nbytes = -nbytes */
6899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    28(%%esp), %%esi\n"     /* from = window */
6909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%ebp, %%eax\n"
6929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jb      .L_invalid_distance_too_far\n" /* if (dist > wsize) */
6939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addl    %%ebp, %%ecx\n"         /* nbytes = dist - nbytes */
6959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    $0, 52(%%esp)\n"
6969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jne     .L_wrap_around_window\n" /* if (write != 0) */
6979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ecx, %%eax\n"
6999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addl    %%eax, %%esi\n"         /* from += wsize - nbytes */
7009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    64(%%esp), %%eax\n"     /* eax = len */
7029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%ecx, %%eax\n"
7039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jbe     .L_do_copy\n"           /* if (nbytes >= len) */
7049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ecx, %%eax\n"         /* len -= nbytes */
7069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     movsb\n"
7079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%edi, %%esi\n"
7089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ebp, %%esi\n"         /* from = out - dist */
7099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_do_copy\n"
7109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
7129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_wrap_around_window:\n"
7139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    52(%%esp), %%eax\n"     /* eax = write */
7149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%eax, %%ecx\n"
7159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jbe     .L_contiguous_in_window\n" /* if (write >= nbytes) */
7169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addl    48(%%esp), %%esi\n"     /* from += wsize */
7189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addl    %%eax, %%esi\n"         /* from += write */
7199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ecx, %%esi\n"         /* from -= nbytes */
7209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%eax, %%ecx\n"         /* nbytes -= write */
7219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    64(%%esp), %%eax\n"     /* eax = len */
7239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%ecx, %%eax\n"
7249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jbe     .L_do_copy\n"           /* if (nbytes >= len) */
7259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ecx, %%eax\n"         /* len -= nbytes */
7279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     movsb\n"
7289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    28(%%esp), %%esi\n"     /* from = window */
7299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    52(%%esp), %%ecx\n"     /* nbytes = write */
7309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%ecx, %%eax\n"
7319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jbe     .L_do_copy\n"           /* if (nbytes >= len) */
7329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ecx, %%eax\n"         /* len -= nbytes */
7349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     movsb\n"
7359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%edi, %%esi\n"
7369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ebp, %%esi\n"         /* from = out - dist */
7379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_do_copy\n"
7389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
7409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_contiguous_in_window:\n"
7419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        addl    %%eax, %%esi\n"
7429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ecx, %%esi\n"         /* from += write - nbytes */
7439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    64(%%esp), %%eax\n"     /* eax = len */
7459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        cmpl    %%ecx, %%eax\n"
7469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jbe     .L_do_copy\n"           /* if (nbytes >= len) */
7479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ecx, %%eax\n"         /* len -= nbytes */
7499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     movsb\n"
7509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%edi, %%esi\n"
7519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        subl    %%ebp, %%esi\n"         /* from = out - dist */
7529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_do_copy\n"           /* if (nbytes >= len) */
7539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".align 32,0x90\n"
7559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_do_copy:\n"
7569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%eax, %%ecx\n"
7579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        rep     movsb\n"
7589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    8(%%esp), %%esi\n"      /* move in back to %esi, toss from */
7609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    32(%%esp), %%ebp\n"     /* ebp = lcode */
7619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_while_test\n"
7629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_test_for_end_of_block:\n"
7649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        testb   $32, %%al\n"
7659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jz      .L_invalid_literal_length_code\n"
7669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    $1, 72(%%esp)\n"
7679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_break_loop_with_status\n"
7689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_invalid_literal_length_code:\n"
7709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    $2, 72(%%esp)\n"
7719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_break_loop_with_status\n"
7729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_invalid_distance_code:\n"
7749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    $3, 72(%%esp)\n"
7759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_break_loop_with_status\n"
7769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_invalid_distance_too_far:\n"
7789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    8(%%esp), %%esi\n"
7799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    $4, 72(%%esp)\n"
7809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        jmp     .L_break_loop_with_status\n"
7819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_break_loop:\n"
7839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    $0, 72(%%esp)\n"
7849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
7859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project".L_break_loop_with_status:\n"
7869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* put in, out, bits, and hold back into ar and pop esp */
7879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%esi, 8(%%esp)\n"      /* save in */
7889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%edi, 16(%%esp)\n"     /* save out */
7899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%ebx, 44(%%esp)\n"     /* save bits */
7909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    %%edx, 40(%%esp)\n"     /* save hold */
7919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    4(%%esp), %%ebp\n"      /* restore esp, ebp */
7929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"        movl    (%%esp), %%esp\n"
7939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project          :
7949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project          : "m" (ar)
7959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project          : "memory", "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi"
7969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    );
7979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#elif defined( _MSC_VER ) && ! defined( _M_AMD64 )
7989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    __asm {
7999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	lea	eax, ar
8009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[eax], esp         /* save esp, ebp */
8019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[eax+4], ebp
8029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	esp, eax
8039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	esi, [esp+8]       /* esi = in */
8049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	edi, [esp+16]      /* edi = out */
8059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	edx, [esp+40]      /* edx = hold */
8069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ebx, [esp+44]      /* ebx = bits */
8079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ebp, [esp+32]      /* ebp = lcode */
8089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cld
8109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_do_loop
8119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
8139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_while_test:
8149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	[esp+24], edi
8159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jbe	L_break_loop
8169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	[esp+12], esi
8179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jbe	L_break_loop
8189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_do_loop:
8209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	bl, 15
8219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	ja	L_get_length_code    /* if (15 < bits) */
8229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	xor	eax, eax
8249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	lodsw                         /* al = *(ushort *)in++ */
8259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, bl            /* cl = bits, needs it for shifting */
8269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	bl, 16             /* bits += 16 */
8279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	eax, cl
8289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	or	edx, eax        /* hold |= *((ushort *)in)++ << bits */
8299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_get_length_code:
8319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [esp+56]      /* eax = lmask */
8329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	eax, edx          /* eax &= hold */
8339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [ebp+eax*4] /* eax = lcode[hold & lmask] */
8349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_dolen:
8369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, ah            /* cl = this.bits */
8379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	bl, ah            /* bits -= this.bits */
8389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	edx, cl           /* hold >>= this.bits */
8399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	test	al, al
8419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jnz	L_test_for_length_base /* if (op != 0) 45.7% */
8429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	eax, 16            /* output this.val char */
8449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	stosb
8459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_while_test
8469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
8489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_test_for_length_base:
8499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ecx, eax          /* len = this */
8509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	ecx, 16            /* len = this.val */
8519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[esp+64], ecx      /* save len */
8529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, al
8539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	test	al, 16
8559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jz	L_test_for_second_level_length /* if ((op & 16) == 0) 8% */
8569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	cl, 15             /* op &= 15 */
8579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jz	L_decode_distance    /* if (!op) */
8589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	bl, cl
8599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jae	L_add_bits_to_len    /* if (op <= bits) */
8609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ch, cl            /* stash op in ch, freeing cl */
8629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	xor	eax, eax
8639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	lodsw                         /* al = *(ushort *)in++ */
8649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, bl            /* cl = bits, needs it for shifting */
8659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	bl, 16             /* bits += 16 */
8669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	eax, cl
8679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	or	edx, eax         /* hold |= *((ushort *)in)++ << bits */
8689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, ch            /* move op back to ecx */
8699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_add_bits_to_len:
8719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	bl, cl
8729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	xor	eax, eax
8739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	inc	eax
8749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	eax, cl
8759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	dec	eax
8769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	eax, edx          /* eax &= hold */
8779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	edx, cl
8789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	[esp+64], eax      /* len += hold & mask[op] */
8799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_decode_distance:
8819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	bl, 15
8829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	ja	L_get_distance_code  /* if (15 < bits) */
8839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	xor	eax, eax
8859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	lodsw                         /* al = *(ushort *)in++ */
8869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, bl            /* cl = bits, needs it for shifting */
8879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	bl, 16             /* bits += 16 */
8889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	eax, cl
8899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	or	edx, eax         /* hold |= *((ushort *)in)++ << bits */
8909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_get_distance_code:
8929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [esp+60]      /* eax = dmask */
8939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ecx, [esp+36]      /* ecx = dcode */
8949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	eax, edx          /* eax &= hold */
8959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [ecx+eax*4]/* eax = dcode[hold & dmask] */
8969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
8979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_dodist:
8989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ebp, eax          /* dist = this */
8999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	ebp, 16            /* dist = this.val */
9009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, ah
9019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	bl, ah            /* bits -= this.bits */
9029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	edx, cl           /* hold >>= this.bits */
9039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, al            /* cl = this.op */
9049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	test	al, 16             /* if ((op & 16) == 0) */
9069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jz	L_test_for_second_level_dist
9079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	cl, 15             /* op &= 15 */
9089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jz	L_check_dist_one
9099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	bl, cl
9109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jae	L_add_bits_to_dist   /* if (op <= bits) 97.6% */
9119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ch, cl            /* stash op in ch, freeing cl */
9139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	xor	eax, eax
9149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	lodsw                         /* al = *(ushort *)in++ */
9159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, bl            /* cl = bits, needs it for shifting */
9169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	bl, 16             /* bits += 16 */
9179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	eax, cl
9189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	or	edx, eax        /* hold |= *((ushort *)in)++ << bits */
9199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, ch            /* move op back to ecx */
9209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_add_bits_to_dist:
9229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	bl, cl
9239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	xor	eax, eax
9249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	inc	eax
9259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	eax, cl
9269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	dec	eax                 /* (1 << op) - 1 */
9279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	eax, edx          /* eax &= hold */
9289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	edx, cl
9299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	ebp, eax          /* dist += hold & ((1 << op) - 1) */
9309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_check_window:
9329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[esp+8], esi       /* save in so from can use it's reg */
9339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, edi
9349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	eax, [esp+20]      /* nbytes = out - beg */
9359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	eax, ebp
9379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jb	L_clip_window        /* if (dist > nbytes) 4.2% */
9389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ecx, [esp+64]      /* ecx = len */
9409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	esi, edi
9419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	esi, ebp          /* from = out - dist */
9429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sar	ecx, 1
9449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jnc	L_copy_two
9459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     movsw
9479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	al, [esi]
9489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[edi], al
9499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	inc	edi
9509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	esi, [esp+8]      /* move in back to %esi, toss from */
9529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ebp, [esp+32]     /* ebp = lcode */
9539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_while_test
9549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_copy_two:
9569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     movsw
9579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	esi, [esp+8]      /* move in back to %esi, toss from */
9589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ebp, [esp+32]     /* ebp = lcode */
9599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_while_test
9609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
9629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_check_dist_one:
9639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	ebp, 1            /* if dist 1, is a memset */
9649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jne	L_check_window
9659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	[esp+20], edi
9669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	je	L_check_window    /* out == beg, if outside window */
9679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ecx, [esp+64]     /* ecx = len */
9699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	al, [edi-1]
9709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ah, al
9719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sar	ecx, 1
9739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jnc	L_set_two
9749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[edi], al         /* memset out with from[-1] */
9759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	inc	edi
9769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_set_two:
9789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     stosw
9799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ebp, [esp+32]     /* ebp = lcode */
9809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_while_test
9819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
9839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_test_for_second_level_length:
9849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	test	al, 64
9859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jnz	L_test_for_end_of_block /* if ((op & 64) != 0) */
9869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	xor	eax, eax
9889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	inc	eax
9899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	eax, cl
9909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	dec	eax
9919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	eax, edx         /* eax &= hold */
9929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	eax, [esp+64]     /* eax += len */
9939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [ebp+eax*4] /* eax = lcode[val+(hold&mask[op])]*/
9949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_dolen
9959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
9969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
9979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_test_for_second_level_dist:
9989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	test	al, 64
9999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jnz	L_invalid_distance_code /* if ((op & 64) != 0) */
10009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	xor	eax, eax
10029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	inc	eax
10039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	eax, cl
10049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	dec	eax
10059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	eax, edx         /* eax &= hold */
10069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	eax, ebp         /* eax += dist */
10079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ecx, [esp+36]     /* ecx = dcode */
10089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [ecx+eax*4] /* eax = dcode[val+(hold&mask[op])]*/
10099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_dodist
10109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
10129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_clip_window:
10139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ecx, eax
10149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [esp+48]     /* eax = wsize */
10159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	neg	ecx                /* nbytes = -nbytes */
10169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	esi, [esp+28]     /* from = window */
10179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	eax, ebp
10199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jb	L_invalid_distance_too_far /* if (dist > wsize) */
10209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	ecx, ebp         /* nbytes = dist - nbytes */
10229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	dword ptr [esp+52], 0
10239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jne	L_wrap_around_window /* if (write != 0) */
10249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	eax, ecx
10269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	esi, eax         /* from += wsize - nbytes */
10279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [esp+64]    /* eax = len */
10299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	eax, ecx
10309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jbe	L_do_copy          /* if (nbytes >= len) */
10319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	eax, ecx         /* len -= nbytes */
10339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     movsb
10349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	esi, edi
10359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	esi, ebp         /* from = out - dist */
10369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_do_copy
10379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
10399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_wrap_around_window:
10409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [esp+52]    /* eax = write */
10419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	ecx, eax
10429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jbe	L_contiguous_in_window /* if (write >= nbytes) */
10439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	esi, [esp+48]    /* from += wsize */
10459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	esi, eax         /* from += write */
10469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	esi, ecx         /* from -= nbytes */
10479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	ecx, eax         /* nbytes -= write */
10489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [esp+64]    /* eax = len */
10509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	eax, ecx
10519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jbe	L_do_copy          /* if (nbytes >= len) */
10529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	eax, ecx         /* len -= nbytes */
10549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     movsb
10559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	esi, [esp+28]     /* from = window */
10569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ecx, [esp+52]     /* nbytes = write */
10579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	eax, ecx
10589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jbe	L_do_copy          /* if (nbytes >= len) */
10599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	eax, ecx         /* len -= nbytes */
10619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     movsb
10629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	esi, edi
10639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	esi, ebp         /* from = out - dist */
10649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_do_copy
10659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
10679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_contiguous_in_window:
10689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	esi, eax
10699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	esi, ecx         /* from += write - nbytes */
10709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [esp+64]    /* eax = len */
10729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	eax, ecx
10739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jbe	L_do_copy          /* if (nbytes >= len) */
10749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	eax, ecx         /* len -= nbytes */
10769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     movsb
10779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	esi, edi
10789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	esi, ebp         /* from = out - dist */
10799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_do_copy
10809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
10829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_do_copy:
10839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ecx, eax
10849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     movsb
10859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	esi, [esp+8]      /* move in back to %esi, toss from */
10879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ebp, [esp+32]     /* ebp = lcode */
10889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_while_test
10899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_test_for_end_of_block:
10919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	test	al, 32
10929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jz	L_invalid_literal_length_code
10939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	dword ptr [esp+72], 1
10949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_break_loop_with_status
10959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
10969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_invalid_literal_length_code:
10979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	dword ptr [esp+72], 2
10989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_break_loop_with_status
10999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
11009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_invalid_distance_code:
11019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	dword ptr [esp+72], 3
11029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_break_loop_with_status
11039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
11049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_invalid_distance_too_far:
11059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	esi, [esp+4]
11069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	dword ptr [esp+72], 4
11079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_break_loop_with_status
11089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
11099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_break_loop:
11109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	dword ptr [esp+72], 0
11119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
11129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_break_loop_with_status:
11139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* put in, out, bits, and hold back into ar and pop esp */
11149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[esp+8], esi     /* save in */
11159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[esp+16], edi    /* save out */
11169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[esp+44], ebx    /* save bits */
11179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[esp+40], edx    /* save hold */
11189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ebp, [esp+4]     /* restore esp, ebp */
11199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	esp, [esp]
11209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
11219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else
11229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#error "x86 architecture not defined"
11239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
11249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
11259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (ar.status > 1) {
11269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (ar.status == 2)
11279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            strm->msg = "invalid literal/length code";
11289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        else if (ar.status == 3)
11299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            strm->msg = "invalid distance code";
11309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        else
11319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            strm->msg = "invalid distance too far back";
11329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        state->mode = BAD;
11339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
11349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    else if ( ar.status == 1 ) {
11359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        state->mode = TYPE;
11369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
11379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
11389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
11399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.len = ar.bits >> 3;
11409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.in -= ar.len;
11419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.bits -= ar.len << 3;
11429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ar.hold &= (1U << ar.bits) - 1;
11439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
11449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* update state and return */
11459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strm->next_in = ar.in;
11469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strm->next_out = ar.out;
11479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strm->avail_in = (unsigned)(ar.in < ar.last ?
11489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                PAD_AVAIL_IN + (ar.last - ar.in) :
11499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                PAD_AVAIL_IN - (ar.in - ar.last));
11509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strm->avail_out = (unsigned)(ar.out < ar.end ?
11519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                 PAD_AVAIL_OUT + (ar.end - ar.out) :
11529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                 PAD_AVAIL_OUT - (ar.out - ar.end));
11539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    state->hold = ar.hold;
11549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    state->bits = ar.bits;
11559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return;
11569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
11579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1158