// File: attractivechaos[P]udb2/bkthomps-hashmap/unordered_map.c
// Function: unordered_map_put
int unordered_map_put(unordered_map me, void *const key, void *const value)
{

    const unsigned long hash = me->hash(key);
    const int index = (int) (hash % me->capacity);
    if (!me->buckets[index]) {
        me->buckets[index] = unordered_map_create_element(me, hash, key, value);
        if (!me->buckets[index]) {
            return -ENOMEM;
        }
    } else {
        struct node *traverse = me->buckets[index];
        if (unordered_map_is_equal(me, traverse, hash, key)) {
            memcpy(traverse->value, value, me->value_size);
            return 0;
        }
        while (traverse->next) {
            traverse = traverse->next;
            if (unordered_map_is_equal(me, traverse, hash, key)) {
                memcpy(traverse->value, value, me->value_size);
                return 0;
            }
        }
        traverse->next = unordered_map_create_element(me, hash, key, value);
        if (!traverse->next) {
            return -ENOMEM;
        }
    }
    me->size++;
    if (me->size >= RESIZE_AT * me->capacity) {
        return unordered_map_resize(me);
    }
    return 0;
}

// Assembly:
subq $0x38, %rsp
movq %rdi, 0x28(%rsp)
movq %rsi, 0x20(%rsp)
movq %rdx, 0x18(%rsp)
movq 0x28(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x20(%rsp), %rdi
callq *%rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rax
movq 0x28(%rsp), %rcx
movslq 0x24(%rcx), %rcx
xorl %edx, %edx
divq %rcx
movl %edx, %eax
movl %eax, 0xc(%rsp)
movq 0x28(%rsp), %rax
movq 0x28(%rax), %rax
movslq 0xc(%rsp), %rcx
cmpq $0x0, (%rax,%rcx,8)
jne 0x1aab
movq 0x28(%rsp), %rdi
movq 0x10(%rsp), %rsi
movq 0x20(%rsp), %rdx
movq 0x18(%rsp), %rcx
callq 0x1c00
movq %rax, %rdx
movq 0x28(%rsp), %rax
movq 0x28(%rax), %rax
movslq 0xc(%rsp), %rcx
movq %rdx, (%rax,%rcx,8)
movq 0x28(%rsp), %rax
movq 0x28(%rax), %rax
movslq 0xc(%rsp), %rcx
cmpq $0x0, (%rax,%rcx,8)
jne 0x1aa6
movl $0xfffffff4, 0x34(%rsp) # imm = 0xFFFFFFF4
jmp 0x1bef
jmp 0x1ba3
movq 0x28(%rsp), %rax
movq 0x28(%rax), %rax
movslq 0xc(%rsp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, (%rsp)
movq 0x28(%rsp), %rdi
movq (%rsp), %rsi
movq 0x10(%rsp), %rdx
movq 0x20(%rsp), %rcx
callq 0x1d30
testb $0x1, %al
jne 0x1adf
jmp 0x1b07
movq (%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x18(%rsp), %rsi
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdx
callq 0x1070
movl $0x0, 0x34(%rsp)
jmp 0x1bef
jmp 0x1b09
movq (%rsp), %rax
cmpq $0x0, 0x18(%rax)
je 0x1b68
movq (%rsp), %rax
movq 0x18(%rax), %rax
movq %rax, (%rsp)
movq 0x28(%rsp), %rdi
movq (%rsp), %rsi
movq 0x10(%rsp), %rdx
movq 0x20(%rsp), %rcx
callq 0x1d30
testb $0x1, %al
jne 0x1b3e
jmp 0x1b66
movq (%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x18(%rsp), %rsi
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdx
callq 0x1070
movl $0x0, 0x34(%rsp)
jmp 0x1bef
jmp 0x1b09
movq 0x28(%rsp), %rdi
movq 0x10(%rsp), %rsi
movq 0x20(%rsp), %rdx
movq 0x18(%rsp), %rcx
callq 0x1c00
movq %rax, %rcx
movq (%rsp), %rax
movq %rcx, 0x18(%rax)
movq (%rsp), %rax
cmpq $0x0, 0x18(%rax)
jne 0x1ba1
movl $0xfffffff4, 0x34(%rsp) # imm = 0xFFFFFFF4
jmp 0x1bef
jmp 0x1ba3
movq 0x28(%rsp), %rax
movl 0x20(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x20(%rax)
movq 0x28(%rsp), %rax
cvtsi2sdl 0x20(%rax), %xmm0
movq 0x28(%rsp), %rax
cvtsi2sdl 0x24(%rax), %xmm2
movsd 0x14cb(%rip), %xmm1     # 0x3098
mulsd %xmm2, %xmm1
ucomisd %xmm1, %xmm0
jb 0x1be7
movq 0x28(%rsp), %rdi
callq 0x1d90
movl %eax, 0x34(%rsp)
jmp 0x1bef
movl $0x0, 0x34(%rsp)
movl 0x34(%rsp), %eax
addq $0x38, %rsp
retq
nopl (%rax,%rax)