// File: /workspace/github_c_makefile_star2_O0/BernardTatin[P]s7sh/s7.c
// Function: protected_list_copy
static s7_pointer protected_list_copy(s7_scheme *sc, s7_pointer a)
    {
        s7_pointer slow, fast, p;
#if S7_DEBUGGING
#define wrap_return(W) do {fast = W; W = sc->nil; return(check_wrap_return(sc, fast));} while (0)
#else
#define wrap_return(W) do {fast = W; W = sc->nil; return(fast);} while (0)
#endif

        sc->w = cons(sc, car(a), sc->nil);
        p = sc->w;

        slow = fast = cdr(a);
        while (true)
        {
            if (!is_pair(fast))
            {
                if (is_null(fast))
                    wrap_return(sc->w);
                set_cdr(p, fast);
                wrap_return(sc->w);
            }

            set_cdr(p, cons(sc, car(fast), sc->nil));
            p = cdr(p);

            fast = cdr(fast);
            if (!is_pair(fast))
            {
                if (is_null(fast))
                    wrap_return(sc->w);
                set_cdr(p, fast);
                wrap_return(sc->w);
            }
            /* if unrolled further, it's a lot slower? */
            set_cdr(p, cons(sc, car(fast), sc->nil));
            p = cdr(p);

            fast = cdr(fast);
            slow = cdr(slow);
            if (fast == slow)
            {
                /* try to preserve the original cyclic structure */
                s7_pointer p1, f1, p2, f2;
                set_match_pair(a);
                for (p1 = sc->w, f1 = a; !(is_matched_pair(cdr(f1))); f1 = cdr(f1), p1 = cdr(p1))
                    set_match_pair(f1);
                for (p2 = sc->w, f2 = a; cdr(f1) != f2; f2 = cdr(f2), p2 = cdr(p2))
                    clear_match_pair(f2);
                for (f1 = f2; is_pair(f1); f1 = cdr(f1), f2 = cdr(f2))
                {
                    clear_match_pair(f1);
                    f1 = cdr(f1);
                    clear_match_pair(f1);
                    if (f1 == f2) break;
                }
                clear_match_pair(a);
                if (is_null(p1))
                    set_cdr(p2, p2);
                else set_cdr(p1, p2);
                wrap_return(sc->w);
            }
        }
        wrap_return(sc->w);
    }

// Assembly:
subq $0xb8, %rsp
movq %rdi, 0xa8(%rsp)
movq %rsi, 0xa0(%rsp)
movq 0xa0(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x78(%rsp)
movq 0xa8(%rsp), %rax
movq 0x110(%rax), %rax
movq %rax, 0x70(%rsp)
movq 0xa8(%rsp), %rax
movq 0x90(%rax), %rax
movq 0xa8(%rsp), %rcx
cmpq 0x98(%rcx), %rax
ja 0xc5f39
movq 0xa8(%rsp), %rdi
callq 0xc670
movq 0xa8(%rsp), %rcx
movq 0x90(%rcx), %rax
movq %rax, %rdx
addq $-0x8, %rdx
movq %rdx, 0x90(%rcx)
movq -0x8(%rax), %rax
movq %rax, 0x80(%rsp)
movq 0x80(%rsp), %rax
movq $0x200001, (%rax)       # imm = 0x200001
movq 0x78(%rsp), %rcx
movq 0x80(%rsp), %rax
movq %rcx, 0x8(%rax)
movq 0x70(%rsp), %rcx
movq 0x80(%rsp), %rax
movq %rcx, 0x10(%rax)
movq 0x80(%rsp), %rax
movq %rax, 0x68(%rsp)
movq 0x68(%rsp), %rcx
movq 0xa8(%rsp), %rax
movq %rcx, 0x4d8(%rax)
movq 0xa8(%rsp), %rax
movq 0x4d8(%rax), %rax
movq %rax, 0x88(%rsp)
movq 0xa0(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x90(%rsp)
movq %rax, 0x98(%rsp)
movq 0x90(%rsp), %rax
movzbl (%rax), %eax
cmpl $0x1, %eax
je 0xc60be
movq 0x90(%rsp), %rax
movq 0xa8(%rsp), %rcx
cmpq 0x110(%rcx), %rax
jne 0xc6060
jmp 0xc6016
movq 0xa8(%rsp), %rax
movq 0x4d8(%rax), %rax
movq %rax, 0x90(%rsp)
movq 0xa8(%rsp), %rax
movq 0x110(%rax), %rcx
movq 0xa8(%rsp), %rax
movq %rcx, 0x4d8(%rax)
movq 0x90(%rsp), %rax
movq %rax, 0xb0(%rsp)
jmp 0xc6573
movq 0x90(%rsp), %rcx
movq 0x88(%rsp), %rax
movq %rcx, 0x10(%rax)
movq 0xa8(%rsp), %rax
movq 0x4d8(%rax), %rax
movq %rax, 0x90(%rsp)
movq 0xa8(%rsp), %rax
movq 0x110(%rax), %rcx
movq 0xa8(%rsp), %rax
movq %rcx, 0x4d8(%rax)
movq 0x90(%rsp), %rax
movq %rax, 0xb0(%rsp)
jmp 0xc6573
movq 0x90(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x58(%rsp)
movq 0xa8(%rsp), %rax
movq 0x110(%rax), %rax
movq %rax, 0x50(%rsp)
movq 0xa8(%rsp), %rax
movq 0x90(%rax), %rax
movq 0xa8(%rsp), %rcx
cmpq 0x98(%rcx), %rax
ja 0xc6110
movq 0xa8(%rsp), %rdi
callq 0xc670
movq 0xa8(%rsp), %rcx
movq 0x90(%rcx), %rax
movq %rax, %rdx
addq $-0x8, %rdx
movq %rdx, 0x90(%rcx)
movq -0x8(%rax), %rax
movq %rax, 0x60(%rsp)
movq 0x60(%rsp), %rax
movq $0x200001, (%rax)       # imm = 0x200001
movq 0x58(%rsp), %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x8(%rax)
movq 0x50(%rsp), %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x10(%rax)
movq 0x60(%rsp), %rax
movq %rax, 0x48(%rsp)
movq 0x48(%rsp), %rcx
movq 0x88(%rsp), %rax
movq %rcx, 0x10(%rax)
movq 0x88(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x88(%rsp)
movq 0x90(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x90(%rsp)
movq 0x90(%rsp), %rax
movzbl (%rax), %eax
cmpl $0x1, %eax
je 0xc6278
movq 0x90(%rsp), %rax
movq 0xa8(%rsp), %rcx
cmpq 0x110(%rcx), %rax
jne 0xc621a
jmp 0xc61d0
movq 0xa8(%rsp), %rax
movq 0x4d8(%rax), %rax
movq %rax, 0x90(%rsp)
movq 0xa8(%rsp), %rax
movq 0x110(%rax), %rcx
movq 0xa8(%rsp), %rax
movq %rcx, 0x4d8(%rax)
movq 0x90(%rsp), %rax
movq %rax, 0xb0(%rsp)
jmp 0xc6573
movq 0x90(%rsp), %rcx
movq 0x88(%rsp), %rax
movq %rcx, 0x10(%rax)
movq 0xa8(%rsp), %rax
movq 0x4d8(%rax), %rax
movq %rax, 0x90(%rsp)
movq 0xa8(%rsp), %rax
movq 0x110(%rax), %rcx
movq 0xa8(%rsp), %rax
movq %rcx, 0x4d8(%rax)
movq 0x90(%rsp), %rax
movq %rax, 0xb0(%rsp)
jmp 0xc6573
movq 0x90(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x38(%rsp)
movq 0xa8(%rsp), %rax
movq 0x110(%rax), %rax
movq %rax, 0x30(%rsp)
movq 0xa8(%rsp), %rax
movq 0x90(%rax), %rax
movq 0xa8(%rsp), %rcx
cmpq 0x98(%rcx), %rax
ja 0xc62ca
movq 0xa8(%rsp), %rdi
callq 0xc670
movq 0xa8(%rsp), %rcx
movq 0x90(%rcx), %rax
movq %rax, %rdx
addq $-0x8, %rdx
movq %rdx, 0x90(%rcx)
movq -0x8(%rax), %rax
movq %rax, 0x40(%rsp)
movq 0x40(%rsp), %rax
movq $0x200001, (%rax)       # imm = 0x200001
movq 0x38(%rsp), %rcx
movq 0x40(%rsp), %rax
movq %rcx, 0x8(%rax)
movq 0x30(%rsp), %rcx
movq 0x40(%rsp), %rax
movq %rcx, 0x10(%rax)
movq 0x40(%rsp), %rax
movq %rax, 0x28(%rsp)
movq 0x28(%rsp), %rcx
movq 0x88(%rsp), %rax
movq %rcx, 0x10(%rax)
movq 0x88(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x88(%rsp)
movq 0x90(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x90(%rsp)
movq 0x98(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x98(%rsp)
movq 0x90(%rsp), %rax
cmpq 0x98(%rsp), %rax
jne 0xc656e
movq 0xa0(%rsp), %rax
movzwl (%rax), %ecx
orl $0x8000, %ecx           # imm = 0x8000
movw %cx, (%rax)
movq 0xa8(%rsp), %rax
movq 0x4d8(%rax), %rax
movq %rax, 0x20(%rsp)
movq 0xa0(%rsp), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
movq 0x10(%rax), %rax
movzwl (%rax), %eax
andl $0x8000, %eax           # imm = 0x8000
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
testb $0x1, %al
jne 0xc63d9
jmp 0xc6408
movq 0x18(%rsp), %rax
movzwl (%rax), %ecx
orl $0x8000, %ecx           # imm = 0x8000
movw %cx, (%rax)
movq 0x18(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x20(%rsp)
jmp 0xc63ba
movq 0xa8(%rsp), %rax
movq 0x4d8(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0xa0(%rsp), %rax
movq %rax, 0x8(%rsp)
movq 0x18(%rsp), %rax
movq 0x10(%rax), %rax
cmpq 0x8(%rsp), %rax
je 0xc6468
movq 0x8(%rsp), %rax
movzwl (%rax), %ecx
andl $0xffff7fff, %ecx       # imm = 0xFFFF7FFF
movw %cx, (%rax)
movq 0x8(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x8(%rsp)
movq 0x10(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x10(%rsp)
jmp 0xc6429
movq 0x8(%rsp), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
movzbl (%rax), %eax
cmpl $0x1, %eax
jne 0xc64dd
movq 0x18(%rsp), %rax
movzwl (%rax), %ecx
andl $0xffff7fff, %ecx       # imm = 0xFFFF7FFF
movw %cx, (%rax)
movq 0x18(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
movzwl (%rax), %ecx
andl $0xffff7fff, %ecx       # imm = 0xFFFF7FFF
movw %cx, (%rax)
movq 0x18(%rsp), %rax
cmpq 0x8(%rsp), %rax
jne 0xc64bd
jmp 0xc64dd
jmp 0xc64bf
movq 0x18(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x8(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x8(%rsp)
jmp 0xc6472
movq 0xa0(%rsp), %rax
movzwl (%rax), %ecx
andl $0xffff7fff, %ecx       # imm = 0xFFFF7FFF
movw %cx, (%rax)
movq 0x20(%rsp), %rax
movq 0xa8(%rsp), %rcx
cmpq 0x110(%rcx), %rax
jne 0xc6517
movq 0x10(%rsp), %rcx
movq 0x10(%rsp), %rax
movq %rcx, 0x10(%rax)
jmp 0xc6525
movq 0x10(%rsp), %rcx
movq 0x20(%rsp), %rax
movq %rcx, 0x10(%rax)
jmp 0xc6527
movq 0xa8(%rsp), %rax
movq 0x4d8(%rax), %rax
movq %rax, 0x90(%rsp)
movq 0xa8(%rsp), %rax
movq 0x110(%rax), %rcx
movq 0xa8(%rsp), %rax
movq %rcx, 0x4d8(%rax)
movq 0x90(%rsp), %rax
movq %rax, 0xb0(%rsp)
jmp 0xc6573
jmp 0xc5fe7
movq 0xb0(%rsp), %rax
addq $0xb8, %rsp
retq
nopw %cs:(%rax,%rax)