19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; inffasx64.asm is a hand tuned assembler version of inffast.c - fast decoding
29e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; version for AMD64 on Windows using Microsoft C compiler
39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; inffasx64.asm is automatically convert from AMD64 portion of inffas86.c
59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; inffasx64.asm is called by inffas8664.c, which contain more info.
69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; to compile this file, I use option
99e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;   ml64.exe /Flinffasx64 /c /Zi inffasx64.asm
109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;   with Microsoft Macro Assembler (x64) for AMD64
119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
12381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
13381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; This file compile with Microsoft Macro Assembler (x64) for AMD64
14381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;
15381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;   ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK
169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
17381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;   (you can get Windows WDK with ml64 for AMD64 from
18381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;      http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price)
199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
21381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project.code
239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectinffas8664fnc PROC
249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and
269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp
279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; All registers must be preserved across the call, except for
299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;   rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch.
309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov [rsp-8],rsi
339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov [rsp-16],rdi
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov [rsp-24],r12
359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov [rsp-32],r13
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov [rsp-40],r14
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov [rsp-48],r15
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov [rsp-56],rbx
399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov rax,rcx
419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[rax+8], rbp       ; /* save regs rbp and rsp */
439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[rax], rsp
449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rsp, rax          ; /* make rsp point to &ar */
469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rsi, [rsp+16]      ; /* rsi  = in */
489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rdi, [rsp+32]      ; /* rdi  = out */
499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	r9, [rsp+24]       ; /* r9   = last */
509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	r10, [rsp+48]      ; /* r10  = end */
519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rbp, [rsp+64]      ; /* rbp  = lcode */
529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	r11, [rsp+72]      ; /* r11  = dcode */
539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rdx, [rsp+80]      ; /* rdx  = hold */
549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ebx, [rsp+88]      ; /* ebx  = bits */
559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	r12d, [rsp+100]    ; /* r12d = lmask */
569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	r13d, [rsp+104]    ; /* r13d = dmask */
579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                          ; /* r14d = len */
589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                          ; /* r15d = dist */
599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cld
629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	r10, rdi
639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	je	L_one_time           ; /* if only one decode left */
649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	r9, rsi
659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    jne L_do_loop
679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_one_time:
709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	r8, r12           ; /* r8 = lmask */
719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	bl, 32
729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	ja	L_get_length_code_one_time
739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	lodsd                         ; /* eax = *(uint *)in++ */
759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, bl            ; /* cl = bits, needs it for shifting */
769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	bl, 32             ; /* bits += 32 */
779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	rax, cl
789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	or	rdx, rax          ; /* hold |= *((uint *)in)++ << bits */
799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_get_length_code_one_time
809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_while_test:
839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	r10, rdi
849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jbe	L_break_loop
859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	r9, rsi
869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jbe	L_break_loop
879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_do_loop:
899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	r8, r12           ; /* r8 = lmask */
909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	bl, 32
919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	ja	L_get_length_code    ; /* if (32 < bits) */
929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	lodsd                         ; /* eax = *(uint *)in++ */
949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, bl            ; /* cl = bits, needs it for shifting */
959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	bl, 32             ; /* bits += 32 */
969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	rax, cl
979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	or	rdx, rax          ; /* hold |= *((uint *)in)++ << bits */
989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_get_length_code:
1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	r8, rdx            ; /* r8 &= hold */
1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [rbp+r8*4]  ; /* eax = lcode[hold & lmask] */
1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, ah            ; /* cl = this.bits */
1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	bl, ah            ; /* bits -= this.bits */
1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	rdx, cl           ; /* hold >>= this.bits */
1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	test	al, al
1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jnz	L_test_for_length_base ; /* if (op != 0) 45.7% */
1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	r8, r12            ; /* r8 = lmask */
1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	eax, 16            ; /* output this.val char */
1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	stosb
1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_get_length_code_one_time:
1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	r8, rdx            ; /* r8 &= hold */
1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */
1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_dolen:
1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, ah            ; /* cl = this.bits */
1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	bl, ah            ; /* bits -= this.bits */
1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	rdx, cl           ; /* hold >>= this.bits */
1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	test	al, al
1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jnz	L_test_for_length_base ; /* if (op != 0) 45.7% */
1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	eax, 16            ; /* output this.val char */
1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	stosb
1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_while_test
1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_test_for_length_base:
1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	r14d, eax         ; /* len = this */
1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	r14d, 16           ; /* len = this.val */
1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, al
1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	test	al, 16
1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jz	L_test_for_second_level_length ; /* if ((op & 16) == 0) 8% */
1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	cl, 15             ; /* op &= 15 */
1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jz	L_decode_distance    ; /* if (!op) */
1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_add_bits_to_len:
1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	bl, cl
1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	xor	eax, eax
1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	inc	eax
1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	eax, cl
1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	dec	eax
1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	eax, edx          ; /* eax &= hold */
1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	rdx, cl
1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	r14d, eax         ; /* len += hold & mask[op] */
1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_decode_distance:
1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	r8, r13           ; /* r8 = dmask */
1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	bl, 32
1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	ja	L_get_distance_code  ; /* if (32 < bits) */
1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	lodsd                         ; /* eax = *(uint *)in++ */
1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, bl            ; /* cl = bits, needs it for shifting */
1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	bl, 32             ; /* bits += 32 */
1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	rax, cl
1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	or	rdx, rax          ; /* hold |= *((uint *)in)++ << bits */
1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_get_distance_code:
1639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	r8, rdx           ; /* r8 &= hold */
1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [r11+r8*4] ; /* eax = dcode[hold & dmask] */
1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_dodist:
1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	r15d, eax         ; /* dist = this */
1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	r15d, 16           ; /* dist = this.val */
1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, ah
1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	bl, ah            ; /* bits -= this.bits */
1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	rdx, cl           ; /* hold >>= this.bits */
1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	cl, al            ; /* cl = this.op */
1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	test	al, 16             ; /* if ((op & 16) == 0) */
1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jz	L_test_for_second_level_dist
1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	cl, 15             ; /* op &= 15 */
1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jz	L_check_dist_one
1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_add_bits_to_dist:
1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	bl, cl
1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	xor	eax, eax
1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	inc	eax
1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	eax, cl
1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	dec	eax                 ; /* (1 << op) - 1 */
1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	eax, edx          ; /* eax &= hold */
1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shr	rdx, cl
1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	r15d, eax         ; /* dist += hold & ((1 << op) - 1) */
1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_check_window:
1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	r8, rsi           ; /* save in so from can use it's reg */
1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rax, rdi
1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	rax, [rsp+40]      ; /* nbytes = out - beg */
1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	eax, r15d
1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jb	L_clip_window        ; /* if (dist > nbytes) 4.2% */
1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ecx, r14d         ; /* ecx = len */
1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rsi, rdi
1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	rsi, r15          ; /* from = out - dist */
2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sar	ecx, 1
2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jnc	L_copy_two           ; /* if len % 2 == 0 */
2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     movsw
2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	al, [rsi]
2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[rdi], al
2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	inc	rdi
2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rsi, r8           ; /* move in back to %rsi, toss from */
2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_while_test
2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_copy_two:
2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     movsw
2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rsi, r8           ; /* move in back to %rsi, toss from */
2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_while_test
2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_check_dist_one:
2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	r15d, 1            ; /* if dist 1, is a memset */
2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jne	L_check_window
2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	[rsp+40], rdi      ; /* if out == beg, outside window */
2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	je	L_check_window
2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ecx, r14d         ; /* ecx = len */
2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	al, [rdi-1]
2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ah, al
2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sar	ecx, 1
2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jnc	L_set_two
2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[rdi], al
2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	inc	rdi
2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_set_two:
2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     stosw
2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_while_test
2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_test_for_second_level_length:
2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	test	al, 64
2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jnz	L_test_for_end_of_block ; /* if ((op & 64) != 0) */
2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	xor	eax, eax
2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	inc	eax
2449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	eax, cl
2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	dec	eax
2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	eax, edx         ; /* eax &= hold */
2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	eax, r14d        ; /* eax += len */
2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [rbp+rax*4] ; /* eax = lcode[val+(hold&mask[op])]*/
2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_dolen
2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_test_for_second_level_dist:
2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	test	al, 64
2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jnz	L_invalid_distance_code ; /* if ((op & 64) != 0) */
2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	xor	eax, eax
2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	inc	eax
2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	shl	eax, cl
2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	dec	eax
2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	and	eax, edx         ; /* eax &= hold */
2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	eax, r15d        ; /* eax += dist */
2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [r11+rax*4] ; /* eax = dcode[val+(hold&mask[op])]*/
2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_dodist
2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_clip_window:
2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ecx, eax         ; /* ecx = nbytes */
2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [rsp+92]     ; /* eax = wsize, prepare for dist cmp */
2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	neg	ecx                ; /* nbytes = -nbytes */
2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	eax, r15d
2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jb	L_invalid_distance_too_far ; /* if (dist > wsize) */
2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	ecx, r15d         ; /* nbytes = dist - nbytes */
2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	dword ptr [rsp+96], 0
2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jne	L_wrap_around_window ; /* if (write != 0) */
2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rsi, [rsp+56]     ; /* from  = window */
2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	eax, ecx         ; /* eax  -= nbytes */
2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	rsi, rax         ; /* from += wsize - nbytes */
2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, r14d        ; /* eax = len */
2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	r14d, ecx
2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jbe	L_do_copy           ; /* if (nbytes >= len) */
2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	eax, ecx         ; /* eax -= nbytes */
2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     movsb
2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rsi, rdi
2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	rsi, r15         ; /* from = &out[ -dist ] */
2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_do_copy
2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_wrap_around_window:
2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, [rsp+96]     ; /* eax = write */
2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	ecx, eax
2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jbe	L_contiguous_in_window ; /* if (write >= nbytes) */
2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	esi, [rsp+92]     ; /* from  = wsize */
2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	rsi, [rsp+56]     ; /* from += window */
3009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	rsi, rax         ; /* from += write */
3019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	rsi, rcx         ; /* from -= nbytes */
3029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	ecx, eax         ; /* nbytes -= write */
3039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, r14d        ; /* eax = len */
3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	eax, ecx
3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jbe	L_do_copy           ; /* if (nbytes >= len) */
3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	eax, ecx         ; /* len -= nbytes */
3099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     movsb
3109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rsi, [rsp+56]     ; /* from = window */
3119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ecx, [rsp+96]     ; /* nbytes = write */
3129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	eax, ecx
3139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jbe	L_do_copy           ; /* if (nbytes >= len) */
3149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	eax, ecx         ; /* len -= nbytes */
3169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     movsb
3179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rsi, rdi
3189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	rsi, r15         ; /* from = out - dist */
3199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_do_copy
3209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
3229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_contiguous_in_window:
3239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rsi, [rsp+56]     ; /* rsi = window */
3249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	add	rsi, rax
3259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	rsi, rcx         ; /* from += write - nbytes */
3269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	eax, r14d        ; /* eax = len */
3289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	cmp	eax, ecx
3299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jbe	L_do_copy           ; /* if (nbytes >= len) */
3309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	eax, ecx         ; /* len -= nbytes */
3329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     movsb
3339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rsi, rdi
3349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	sub	rsi, r15         ; /* from = out - dist */
3359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_do_copy           ; /* if (nbytes >= len) */
3369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectALIGN 4
3389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_do_copy:
3399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	ecx, eax         ; /* ecx = len */
3409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	rep     movsb
3419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rsi, r8          ; /* move in back to %esi, toss from */
3439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_while_test
3449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_test_for_end_of_block:
3469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	test	al, 32
3479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jz	L_invalid_literal_length_code
3489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	dword ptr [rsp+116], 1
3499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_break_loop_with_status
3509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_invalid_literal_length_code:
3529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	dword ptr [rsp+116], 2
3539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_break_loop_with_status
3549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_invalid_distance_code:
3569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	dword ptr [rsp+116], 3
3579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_break_loop_with_status
3589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_invalid_distance_too_far:
3609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	dword ptr [rsp+116], 4
3619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	jmp	L_break_loop_with_status
3629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_break_loop:
3649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	dword ptr [rsp+116], 0
3659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectL_break_loop_with_status:
3679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; /* put in, out, bits, and hold back into ar and pop esp */
3689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[rsp+16], rsi     ; /* in */
3699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[rsp+32], rdi     ; /* out */
3709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[rsp+88], ebx     ; /* bits */
3719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	[rsp+80], rdx     ; /* hold */
3729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rax, [rsp]       ; /* restore rbp and rsp */
3749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rbp, [rsp+8]
3759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov	rsp, rax
3769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov rsi,[rsp-8]
3809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov rdi,[rsp-16]
3819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov r12,[rsp-24]
3829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov r13,[rsp-32]
3839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov r14,[rsp-40]
3849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov r15,[rsp-48]
3859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project	mov rbx,[rsp-56]
386381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
3879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ret 0
3889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;          :
3899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;          : "m" (ar)
3909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;          : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi",
3919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;            "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;    );
3939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectinffas8664fnc 	ENDP
3959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;_TEXT	ENDS
3969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectEND
397