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