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