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