@strlen.done: # ret c3 @strlen: # xor eax, eax 31 c0 @strlen.loop: # cmp byte [rdi + rax], 0 80 3c 07 00 # je .done: 0f 84 'strlen.done # inc rax 48 ff c0 # jmp .loop e9 'strlen.loop @strstr.found: # sub rdi, r13 4c 29 ef # mov rax, rdi 48 89 f8 @strstr.done: # pop r13 41 5d # pop r12 41 5c # pop rbx 5b # ret c3 @strstr.notfound # xor eax, eax 31 c0 # dec rax 48 ff c8 # jmp .done e9 'strstr.done @strstr.next_hackstack: # inc rdi 48 ff c7 # dec rax 48 ff c8 @strstr.loop_haystack: # cmp rax, rcx 48 39 c8 # jb 'strstr.notfound 0f 82 'strstr.notfound # xor ebx, ebx 31 db @strstr.loop_needle: # cmp rbx, rcx 48 39 cb # je .found 0f 84 'strstr.found # mov r12b, byte [rdx + rbx] 44 8a 24 1a # cmp r12b, byte [rdi + rbx] 44 3a 24 1f # jne .next_haystack 0f 85 'strstr.next_haystack # inc rbx 48 ff c3 # jmp .loop_needle e9 'strstr.loop_needle @strstr: # push rbx 53 # push r12 41 54 # push r13 41 55 # mov r13, rdi 49 89 fd # mov rax, rsi 48 89 f0 # jmp .loop_haystack e9 'strstr.loop_haystack @strcmp.eq: 31 c0 c3 @strcmp: # cmp rcx, rsi 48 39 f1 # cmovb rsi, rcx 48 0f 42 f1 # xor eax, eax 31 c0 @strcmp.loop: # cmp rsi, rax 48 39 c6 # je .eq 0f 84 'strcmp.eq # movzx ecx, byte [rdx + rax] 0f b6 0c 02 # cmp byte [rdi + rax, cl 38 0c 07 # inc rax 48 ff c0 # je .loop 0f 84 'strcmp.loop # seta al 0f 97 c0 # sbb al, 0 1c 00 # ret c3 @strfind.nf: # xor eax, eax 31 c0 # dec rax 48 ff c8 @strfind.f: c3 @strfind: # xor eax, eax 31 c0 # cmp rax, rsi 48 39 f0 # jge .nf 0f 8d 'strfind.nf # mov cl, byte [rdi + rax] 8a 0c 07 # cmp cl, dl 38 d1 # je .f 0f 84 'strfind.f # inc rax 48 ff c0 # jmp strfind e9 'strfind @memcpy.done: c3 @memcpy: # test rdx, rdx 48 85 d2 # jz .done 0f 84 'memcpy.done # mov al, byte [rdi] 8a 07 # mov byte [rsi], al 88 06 # inc rsi 48 ff c6 # inc rdi 48 ff c7 # dec rdx 48 ff ca # jmp .loop e9 'memcpy @is_alpha: 40 0f b6 c7 25 df ff 1f 00 83 c0 bf 83 f8 1a 0f 92 c0 c3 @is_digit: 40 0f b6 ff 8d 47 d0 83 f8 0a 0f 92 c0 c3 @is_alphanumeric: 8d 47 d0 83 f8 0a 0f 92 c1 40 80 e7 df 40 80 c7 bf 40 80 ff 1a 0f 92 c0 08 c8 c3 @is_id_start: # call is_alpha e8 'is_alpha 40 80 ff 5f 0f 94 c1 08 c8 c3 @is_id_cont: # call is_alphanumeric e8 'is_alphanumeric 40 80 ff 2d 0f 94 c1 08 c8 40 80 ff 5f 0f 94 c1 08 c8 c3 @to_digit.inv: # xor eax, eax 31 c0 # ret c3 @to_digit: 8d 46 fe 83 f8 23 # jae .inv 0f 83 'to_digit.inv 48 0f b6 ff 8d 57 bf 83 e2 df 83 c2 0a 8d 47 d0 83 fe 0b 0f 42 d0 83 ff 3a 0f 42 d0 31 c0 39 f2 0f 92 c0 c3 @parse_i64.done: # mov rdx, rax 48 89 c2 # neg r13 49 f7 dd # cmp dword [rsp], 0 83 3c 24 00 # cmovl rdx, r13 49 0f 4c d5 # add rsp, 8 48 83 c4 08 # pop rdi 5f # sub rbx, rdi 48 29 fb # mov rax, rbx 48 89 d8 @parse_i64.epilogue: # pop r14 41 5e # pop r13 41 5d # pop r12 41 5c # pop rbx 5b # pop rbp 5d # ret c3 @parse_i64.not_num: # xor eax, eax 31 c0 # xor edx, edx 31 d2 # add rsp, 8 48 83 c4 08 # pop rdi 5f # jmp .epilogue e9 'parse_i64.epilogue @parse_i64_cstr: e8 'strlen # mov rsi, rax 48 89 c6 @parse_i64: # push rbp 55 # mov rbp, rsp 48 89 e5 # push rbx 53 # push r12 41 54 # push r13 41 55 # push r14 41 56 # push rdi 57 # sub rsp, 8 48 83 ec 08 # mov dword [rsp], 1 c7 04 24 01 00 00 00 # mov rbx, rdi 48 89 fb # mov r12, 10 41 bc 0a 00 00 00 # xor r13, r13 4d 31 ed # xor eax, eax 31 c0 # mov r14, rsi 49 89 f6 # add r14, rdi 49 01 fe # cmp rbx, r14 4c 39 f3 # jge .done 0f 8d 'parse_i64.done # cmp byte [rbx], '-' 80 3b 2d # sete al 0f 94 c0 # lea rbx, [rbx + rax] 48 8d 1c 03 # shl eax, 1 d1 e0 # sub dword [rsp], eax 29 04 24 # cmp rbx, r14 4c 39 f3 # jge .done 0f 8d 'parse_i64.done # cmp byte [rbx], '+' 80 3b 2b # sete al 0f 94 c0 # lea rbx, [rbx + rax] 48 8d 1c 03 # cmp rbx, r14 4c 39 f3 # jge .done 0f 8d 'parse_i64.done # mov dil, byte [rbx] 40 8a 3b # mov esi, 10 be 0a 00 00 00 # call to_digit e8 'to_digit # jae .not_num 0f 83 'parse_i64.not_num # cmp dil, '0' 40 80 ff 30 # jne .loop 0f 85 'parse_i64.loop # inc rbx 48 ff c3 # cmp rbx, r14 4c 39 f3 # jge .done 0f 8d 'parse_i64.done # mov dil, byte [rbx] 40 8a 3b # and dil, 0xdf 40 80 e7 df # cmp dil, 'X' 40 80 ff 58 # sete al 0f 94 c0 # lea ecx, [eax + eax * 2] 67 8d 0c 40 # shl ecx, 1 d1 e1 # add r12d, ecx 41 01 cc # cmp dil, 'O' 40 80 ff 4f # sete al 0f 94 c0 # shl al, 1 d0 e0 # sub r12d, eax 41 29 c4 # cmp dil, 'B' 40 80 ff 42 # sete al 0f 94 c0 # shl al, 3 c0 e0 03 # sub r12d, eax 41 29 c4 # cmp r12d, 10 41 83 fc 0a # setne al 0f 95 c0 # lea rbx, [rbx + rax] 48 8d 1c 03 @parse_i64.loop: # cmp rbx, r14 4c 39 f3 # jge .done 0f 8d 'parse_i64.done # mov dil, byte [rbx] 40 8a 3b # inc rbx 48 ff c3 # cmp dil, '_' 40 80 ff 5f # je .loop 0f 84 'parse_i64.loop # mov esi, r12d 44 89 e6 # call to_digit e8 'to_digit # mov ecx, edx 89 d1 # test al, al 84 c0 # je .done 0f 84 'parse_i64.done # mov rax, r13 4c 89 e8 # imul r12 49 f7 ec # add rax, rcx 48 01 c8 mov r13, rax 49 89 c5 # jmp .loop e9 'parse_i64.loop @exit: # xor edi, edi 31 ff # mov eax, 60 b8 3c 00 00 00 # syscall 0f 05 @fasthash.done: c3 @fasthash: # mov eax, 0x811c9dc5 b8 c5 9d 1c 81 @fasthash.loop: # test rsi, rsi 48 85 f6 # jz .done 0f 84 'fasthash.done # movzx ecx, byte [rdi] 0f b6 0f # xor eax, ecx 31 c8 # imul eax, 0x01000193 69 c0 93 01 00 01 # inc rdi 48 ff c7 # dec rsi 48 ff ce # jmp .loop e9 'fasthash.loop