// File: /workspace/github_c_makefile_star2_O2/BernardTatin[P]s7sh/s7.c
// Function: hash_map_let
static s7_int hash_map_let(s7_scheme *sc, s7_pointer table, s7_pointer key)
                {
                    /* lets are equal if same symbol/value pairs, independent of order, taking into account shadowing
                     *   (length (inlet 'a 1 'a 2)) = 2
                     * but this counts as just one entry from equal?'s point of view, so if more than one entry, we have a problem.
                     *   (equal? (inlet 'a 1) (inlet 'a 3 'a 2 'a 1)) = #t
                     * also currently equal? follows outlet, but that is ridiculous here, so in this case hash equal?
                     *   is not the same as equal?  Surely anyone using lets as keys wants eq?
                     */
                    s7_pointer slot;
                    s7_int slots;

                    if ((key == sc->rootlet) ||
                            (!tis_slot(let_slots(key))))
                        return(0);
                    slot = let_slots(key);
                    if (!tis_slot(next_slot(slot)))
                    {
                        if (is_sequence(slot_value(slot))) /* avoid loop if cycles */
                            return(symbol_hmap(slot_symbol(slot)));
                        return(symbol_hmap(slot_symbol(slot)) + hash_loc(sc, table, slot_value(slot)));
                    }
                    slots = 0;
                    for (; tis_slot(slot); slot = next_slot(slot))
                        if (!is_matched_symbol(slot_symbol(slot)))
                        {
                            set_match_symbol(slot_symbol(slot));
                            slots++;
                        }
                    for (slot = let_slots(key); tis_slot(slot); slot = next_slot(slot))
                        clear_match_symbol(slot_symbol(slot));

                    if (slots == 1)
                    {
                        slot = let_slots(key);
                        if (is_sequence(slot_value(slot))) /* avoid loop if cycles */
                            return(symbol_hmap(slot_symbol(slot)));
                        return(symbol_hmap(slot_symbol(slot)) + hash_loc(sc, table, slot_value(slot)));
                    }

                    return(slots);
                }

// Assembly:
cmpq %rdx, 0x150(%rdi)
je 0x30737
movq 0x8(%rdx), %rcx
testq %rcx, %rcx
je 0x30737
pushq %rbx
cmpq $0x0, 0x18(%rcx)
je 0x30790
addq $0x8, %rdx
xorl %eax, %eax
testq %rcx, %rcx
je 0x3073a
movq 0x8(%rcx), %r8
movzwl (%r8), %r9d
testw %r9w, %r9w
js 0x30731
orl $0x8000, %r9d           # imm = 0x8000
movw %r9w, (%r8)
incq %rax
movq 0x18(%rcx), %rcx
jmp 0x30710
xorl %eax, %eax
retq
movq %rdx, %rcx
movq (%rcx), %rcx
testq %rcx, %rcx
je 0x30755
movq 0x8(%rcx), %r8
andw $0x7fff, (%r8)          # imm = 0x7FFF
addq $0x18, %rcx
jmp 0x3073d
cmpq $0x1, %rax
jne 0x307d3
movq (%rdx), %rax
movq 0x10(%rax), %rdx
movzbl (%rdx), %ecx
leaq 0xf1414(%rip), %r8      # 0x121b80
cmpb $0x0, (%rcx,%r8)
jne 0x307cb
movq (%rdx), %rcx
btl $0x1e, %ecx
jb 0x307cb
movq 0x8(%rax), %rbx
sarq $0x8, %rbx
movq 0x20(%rsi), %rax
movzbl %cl, %ecx
callq *(%rax,%rcx,8)
jmp 0x307c0
movq 0x10(%rcx), %rdx
movzbl (%rdx), %eax
leaq 0xf13e2(%rip), %r8      # 0x121b80
cmpb $0x0, (%rax,%r8)
jne 0x307c5
movq (%rdx), %rax
btl $0x1e, %eax
jb 0x307c5
movq 0x8(%rcx), %rbx
sarq $0x8, %rbx
movq 0x20(%rsi), %rcx
movzbl %al, %eax
callq *(%rcx,%rax,8)
addq %rbx, %rax
jmp 0x307d3
movq 0x8(%rcx), %rax
jmp 0x307cf
movq 0x8(%rax), %rax
sarq $0x8, %rax
popq %rbx
retq