1.intel_syntax 2.global inthash_search 3.global inthash_search2 4 5//RDI, RSI, RDX, RCX, R8, R9 (R10) 6 7.set INDEX_SHIFT, 6 8.set INCR_SHIFT, 8 9 10.text 11inthash_search: 12 // %rdi -> inthash_t Map 13 // (%rdi) -> uint64_t *Keys 14 // 8(%rdi) -> void *Values 15 // 16(%rdi) -> int Size 16 // 20(%rdi) -> int Space 17 // %rsi -> uint64_t Key 18 mov %ecx, [%rdi + 16] 19 mov %r8, [%rdi + 8] 20 sub %rcx, 1 21 jc .L1 22 mov %rdi, [%rdi] 23 mov %rax, %rsi 24 shr %rax, INDEX_SHIFT 25 and %rax, %rcx 26 cmp %rsi, [%rdi + %rax * 8] 27 je .L2 28 ja .L1 29.L3: 30 mov %rdx, %rsi 31 shr %rdx, INCR_SHIFT 32 or %rdx, 1 33.L4: 34 add %rax, %rdx 35 and %rax, %rcx 36 cmp %rsi, [%rdi + %rax * 8] 37 jb .L4 38 ja .L1 39.L2: 40 mov %rax, [%r8 + %rax * 8] 41 ret 42.L1: 43 xor %eax, %eax 44 ret 45 46.text 47inthash_search2: 48 // %rdi -> inthash_t Map 49 // (%rdi) -> uint64_t *Keys 50 // 8(%rdi) -> void *Values 51 // 16(%rdi) -> int Size 52 // 20(%rdi) -> int Space 53 // %rsi -> uint64_t Key 54 mov %ecx, [%rdi + 16] 55 mov %r8, [%rdi + 8] 56 sub %rcx, 1 57 jc .L5 58 mov %rdi, [%rdi] 59 mov %rax, %rsi 60 shr %rax, INDEX_SHIFT 61 and %rax, %rcx 62 cmp %rsi, [%rdi + %rax * 8] 63 je .L6 64 ja .L5 65.L7: 66 mov %rdx, %rsi 67 shr %rdx, INCR_SHIFT 68 or %rdx, 1 69.L8: 70 add %rax, %rdx 71 and %rax, %rcx 72 cmp %rsi, [%rdi + %rax * 8] 73 jb .L8 74 ja .L5 75.L6: 76 mov %rax, [%r8 + %rax * 8] 77 xor %edx, %edx 78 dec %rdx 79 ret 80.L5: 81 xor %eax, %eax 82 xor %edx, %edx 83 ret 84