// File: /workspace/github_c_makefile_star2_O2/RodionGork[P]tinyscheme/scheme.c
// Function: opexe_1
static pointer opexe_1(scheme * sc, enum scheme_opcodes op) {
  pointer x, y;

  switch (op) {
  case OP_LET0REC:             /* letrec */
    new_frame_in_env(sc, sc->envir);
    sc->args = sc->NIL;
    sc->value = sc->code;
    sc->code = car(sc->code);
    s_goto(sc, OP_LET1REC);

  case OP_LET1REC:             /* letrec (calculate parameters) */
    sc->args = cons(sc, sc->value, sc->args);
    if (is_pair(sc->code)) {    /* continue */
      if (!is_pair(car(sc->code)) || !is_pair(cdar(sc->code))) {
        Error_1(sc, "Bad syntax of binding spec in letrec :", car(sc->code));
      }
      s_save(sc, OP_LET1REC, sc->args, cdr(sc->code));
      sc->code = cadar(sc->code);
      sc->args = sc->NIL;
      s_goto(sc, OP_EVAL);
    } else {                    /* end */
      sc->args = reverse_in_place(sc, sc->NIL, sc->args);
      sc->code = car(sc->args);
      sc->args = cdr(sc->args);
      s_goto(sc, OP_LET2REC);
    }

  case OP_LET2REC:             /* letrec */
    for (x = car(sc->code), y = sc->args; y != sc->NIL;
        x = cdr(x), y = cdr(y)) {
      new_slot_in_env(sc, caar(x), car(y));
    }
    sc->code = cdr(sc->code);
    sc->args = sc->NIL;
    s_goto(sc, OP_BEGIN);

  case OP_COND0:               /* cond */
    if (!is_pair(sc->code)) {
      Error_0(sc, "syntax error in cond");
    }
    s_save(sc, OP_COND1, sc->NIL, sc->code);
    sc->code = caar(sc->code);
    s_goto(sc, OP_EVAL);

  case OP_COND1:               /* cond */
    if (is_true(sc->value)) {
      if ((sc->code = cdar(sc->code)) == sc->NIL) {
        s_return(sc, sc->value);
      }
      if (!sc->code || car(sc->code) == sc->FEED_TO) {
        if (!is_pair(cdr(sc->code))) {
          Error_0(sc, "syntax error in cond");
        }
        x = cons(sc, sc->QUOTE, cons(sc, sc->value, sc->NIL));
        sc->code = cons(sc, cadr(sc->code), cons(sc, x, sc->NIL));
        s_goto(sc, OP_EVAL);
      }
      s_goto(sc, OP_BEGIN);
    } else {
      if ((sc->code = cdr(sc->code)) == sc->NIL) {
        s_return(sc, sc->NIL);
      } else {
        s_save(sc, OP_COND1, sc->NIL, sc->code);
        sc->code = caar(sc->code);
        s_goto(sc, OP_EVAL);
      }
    }

  case OP_DELAY:               /* delay */
    x = mk_closure(sc, cons(sc, sc->NIL, sc->code), sc->envir);
    typeflag(x) = T_PROMISE;
    s_return(sc, x);

  case OP_AND0:                /* and */
    if (sc->code == sc->NIL) {
      s_return(sc, sc->T);
    }
    s_save(sc, OP_AND1, sc->NIL, cdr(sc->code));
    sc->code = car(sc->code);
    s_goto(sc, OP_EVAL);

  case OP_AND1:                /* and */
    if (is_false(sc->value)) {
      s_return(sc, sc->value);
    } else if (sc->code == sc->NIL) {
      s_return(sc, sc->value);
    } else {
      s_save(sc, OP_AND1, sc->NIL, cdr(sc->code));
      sc->code = car(sc->code);
      s_goto(sc, OP_EVAL);
    }

  case OP_OR0:                 /* or */
    if (sc->code == sc->NIL) {
      s_return(sc, sc->F);
    }
    s_save(sc, OP_OR1, sc->NIL, cdr(sc->code));
    sc->code = car(sc->code);
    s_goto(sc, OP_EVAL);

  case OP_OR1:                 /* or */
    if (is_true(sc->value)) {
      s_return(sc, sc->value);
    } else if (sc->code == sc->NIL) {
      s_return(sc, sc->value);
    } else {
      s_save(sc, OP_OR1, sc->NIL, cdr(sc->code));
      sc->code = car(sc->code);
      s_goto(sc, OP_EVAL);
    }

  case OP_C0STREAM:            /* cons-stream */
    s_save(sc, OP_C1STREAM, sc->NIL, cdr(sc->code));
    sc->code = car(sc->code);
    s_goto(sc, OP_EVAL);

  case OP_C1STREAM:            /* cons-stream */
    sc->args = sc->value;       /* save sc->value to register sc->args for gc */
    x = mk_closure(sc, cons(sc, sc->NIL, sc->code), sc->envir);
    typeflag(x) = T_PROMISE;
    s_return(sc, cons(sc, sc->args, x));

  case OP_MACRO0:              /* macro */
    if (is_pair(car(sc->code))) {
      x = caar(sc->code);
      sc->code =
          cons(sc, sc->LAMBDA, cons(sc, cdar(sc->code), cdr(sc->code)));
    } else {
      x = car(sc->code);
      sc->code = cadr(sc->code);
    }
    if (!is_symbol(x)) {
      Error_0(sc, "variable is not a symbol");
    }
    s_save(sc, OP_MACRO1, sc->NIL, x);
    s_goto(sc, OP_EVAL);

  case OP_MACRO1:              /* macro */
    typeflag(sc->value) = T_MACRO;
    x = find_slot_in_env(sc, sc->envir, sc->code, 0);
    if (x != sc->NIL) {
      set_slot_in_env(x, sc->value);
    } else {
      new_slot_in_env(sc, sc->code, sc->value);
    }
    s_return(sc, sc->code);

  case OP_CASE0:               /* case */
    s_save(sc, OP_CASE1, sc->NIL, cdr(sc->code));
    sc->code = car(sc->code);
    s_goto(sc, OP_EVAL);

  case OP_CASE1:               /* case */
    for (x = sc->code; x != sc->NIL; x = cdr(x)) {
      if (!is_pair(y = caar(x))) {
        break;
      }
      for (; y != sc->NIL; y = cdr(y)) {
        if (eqv(car(y), sc->value)) {
          break;
        }
      }
      if (y != sc->NIL) {
        break;
      }
    }
    if (x != sc->NIL) {
      if (is_pair(caar(x))) {
        sc->code = cdar(x);
        s_goto(sc, OP_BEGIN);
      } else {                  /* else */
        s_save(sc, OP_CASE2, sc->NIL, cdar(x));
        sc->code = caar(x);
        s_goto(sc, OP_EVAL);
      }
    } else {
      s_return(sc, sc->NIL);
    }

  case OP_CASE2:               /* case */
    if (is_true(sc->value)) {
      s_goto(sc, OP_BEGIN);
    } else {
      s_return(sc, sc->NIL);
    }

  case OP_PAPPLY:              /* apply */
    sc->code = car(sc->args);
    sc->args = list_star(sc, cdr(sc->args));
    /*sc->args = cadr(sc->args); */
    s_goto(sc, OP_APPLY);

  case OP_PEVAL:               /* eval */
    if (cdr(sc->args) != sc->NIL) {
      sc->envir = cadr(sc->args);
    }
    sc->code = car(sc->args);
    s_goto(sc, OP_EVAL);

  case OP_CONTINUATION:        /* call-with-current-continuation */
    sc->code = car(sc->args);
    sc->args = cons(sc, mk_continuation(sc, sc->dump), sc->NIL);
    s_goto(sc, OP_APPLY);

  default:
    sprintf(sc->strbuff, "%d: illegal operator", sc->op);
    Error_0(sc, sc->strbuff);
  }
  return sc->T;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdi, %rbx
addl $-0x20, %esi
cmpl $0x13, %esi
ja 0x7616
leaq 0x4e75(%rip), %rax      # 0xc0ec
movslq (%rax,%rsi,4), %rcx
addq %rax, %rcx
jmpq *%rcx
movq 0x38(%rbx), %rsi
movq %rbx, %rdi
callq 0x5313
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %rcx
movq %rcx, 0x30(%rbx)
movq %rax, 0xec0(%rbx)
movq 0x8(%rax), %rax
movq %rax, 0x40(%rbx)
movl $0x21, 0xec8(%rbx)
jmp 0x785b
movq 0xec0(%rbx), %rax
cmpq 0xd0(%rbx), %rax
jne 0x77a1
movq 0x90(%rbx), %rsi
jmp 0x78d7
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %rdx
movq 0x10(%rax), %rcx
pushq $0x2f
jmp 0x7711
movq 0xec0(%rbx), %rax
movq %rax, 0x30(%rbx)
movq 0x40(%rbx), %rdx
movq 0x90(%rbx), %rsi
movq %rbx, %rdi
xorl %ecx, %ecx
callq 0x45e8
movq 0x38(%rbx), %rdx
movq %rbx, %rdi
movq %rax, %rsi
callq 0xa9f5
movl $0xd, (%rax)
movq 0x30(%rbx), %rsi
movq %rbx, %rdi
movq %rax, %rdx
xorl %ecx, %ecx
callq 0x45e8
jmp 0x7667
movq 0xec0(%rbx), %rsi
movq 0x40(%rbx), %rax
cmpq 0xd0(%rbx), %rsi
je 0x7871
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, 0x40(%rbx)
movq 0x90(%rbx), %rdx
cmpq %rdx, %rax
je 0x78d7
testq %rax, %rax
je 0x7384
movq 0x8(%rax), %rcx
cmpq 0x138(%rbx), %rcx
jne 0x77a1
movq 0x10(%rax), %rax
movl (%rax), %eax
andl $0x1f, %eax
cmpl $0x5, %eax
jne 0x77b0
movq 0x118(%rbx), %r14
movq %rbx, %rdi
xorl %ecx, %ecx
callq 0x45e8
movq %rbx, %rdi
movq %r14, %rsi
movq %rax, %rdx
xorl %ecx, %ecx
callq 0x45e8
movq 0x40(%rbx), %rcx
movq 0x90(%rbx), %rdx
movq 0x10(%rcx), %rcx
movq 0x8(%rcx), %r14
movq %rbx, %rdi
movq %rax, %rsi
xorl %ecx, %ecx
callq 0x45e8
movq %rbx, %rdi
movq %r14, %rsi
movq %rax, %rdx
xorl %ecx, %ecx
callq 0x45e8
jmp 0x784d
movq 0x40(%rbx), %rax
movq 0x8(%rax), %rcx
movl (%rcx), %edx
movl %edx, %esi
andl $0x1f, %esi
cmpl $0x5, %esi
jne 0x77b9
movq 0x8(%rcx), %r15
movq 0x10(%rcx), %rsi
movq 0x110(%rbx), %r14
movq 0x10(%rax), %rdx
movq %rbx, %rdi
xorl %ecx, %ecx
callq 0x45e8
movq %rbx, %rdi
movq %r14, %rsi
movq %rax, %rdx
xorl %ecx, %ecx
callq 0x45e8
movl (%r15), %edx
movq %r15, %rcx
jmp 0x77c1
movq 0xec0(%rbx), %rsi
cmpq 0xd0(%rbx), %rsi
jne 0x78d7
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %rdx
cmpq %rdx, %rax
jne 0x770b
jmp 0x78d7
movq 0x40(%rbx), %r14
addq $0x8, %r14
leaq 0x30(%rbx), %r15
movq (%r15), %r15
movq 0x90(%rbx), %rcx
cmpq %rcx, %r15
je 0x74a5
movq (%r14), %r14
movq 0x8(%r14), %rax
movq 0x8(%rax), %rsi
movq 0x8(%r15), %rdx
movq %rbx, %rdi
callq 0x5359
addq $0x10, %r14
addq $0x10, %r15
jmp 0x7475
movq 0x40(%rbx), %rdx
movq 0xb0(%rbx), %rax
movq 0x10(%rdx), %rdx
movq %rdx, 0x40(%rbx)
movq %rcx, 0x30(%rbx)
movl $0x15, 0xec8(%rbx)
jmp 0x7862
leaq 0x40(%rbx), %r15
movq 0x90(%rbx), %r14
movq (%r15), %r15
cmpq %r14, %r15
je 0x78f5
movq 0x8(%r15), %r12
movq 0x8(%r12), %r13
movl (%r13), %ebp
andl $0x1f, %ebp
cmpl $0x5, %ebp
jne 0x7832
cmpq %r14, %r13
je 0x751e
movq 0x8(%r13), %rdi
movq 0xec0(%rbx), %rsi
callq 0x4be2
testl %eax, %eax
jne 0x778f
movq 0x10(%r13), %r13
jmp 0x74fb
addq $0x10, %r15
jmp 0x74d6
movq 0x40(%rbx), %rcx
movl (%rcx), %eax
andl $0x1f, %eax
cmpl $0x5, %eax
jne 0x77b0
movq 0x90(%rbx), %rdx
jmp 0x7885
movq 0xec0(%rbx), %rsi
cmpq 0xd0(%rbx), %rsi
je 0x78d7
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %rdx
cmpq %rdx, %rax
jne 0x76bf
jmp 0x78d7
movq 0xec0(%rbx), %rsi
movq 0x30(%rbx), %rdx
movq %rbx, %rdi
xorl %ecx, %ecx
callq 0x45e8
movq %rax, 0x30(%rbx)
movq 0x40(%rbx), %rcx
movl (%rcx), %edx
andl $0x1f, %edx
cmpl $0x5, %edx
jne 0x7800
movq 0x8(%rcx), %rdx
movl (%rdx), %esi
andl $0x1f, %esi
cmpl $0x5, %esi
jne 0x78a4
movq 0x10(%rdx), %rsi
movl (%rsi), %esi
andl $0x1f, %esi
cmpl $0x5, %esi
jne 0x78a4
movq 0x10(%rcx), %rcx
pushq $0x21
popq %rsi
movq %rbx, %rdi
movq %rax, %rdx
callq 0xa7e0
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %rcx
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, 0x40(%rbx)
movq %rcx, 0x30(%rbx)
jmp 0x7851
movq 0x30(%rbx), %rax
movq 0x10(%rax), %rcx
cmpq 0x90(%rbx), %rcx
je 0x7849
movq 0x8(%rcx), %rcx
movq %rcx, 0x38(%rbx)
jmp 0x7849
movq 0xea0(%rbx), %rdi
movl 0xec8(%rbx), %edx
leaq 0x5652(%rip), %rsi      # 0xcc7c
xorl %eax, %eax
callq 0x4290
movq 0xea0(%rbx), %rsi
jmp 0x77e8
movq 0x40(%rbx), %rdx
movq 0x90(%rbx), %rsi
movq %rbx, %rdi
xorl %ecx, %ecx
callq 0x45e8
movq 0x38(%rbx), %rdx
movq %rbx, %rdi
movq %rax, %rsi
callq 0xa9f5
movl $0xd, (%rax)
movq %rbx, %rdi
movq %rax, %rsi
jmp 0x78da
movq 0xec0(%rbx), %r14
movl $0xc, (%r14)
movq 0x38(%rbx), %rsi
movq 0x40(%rbx), %r15
movq %rbx, %rdi
movq %r15, %rdx
xorl %ecx, %ecx
callq 0x5be4
cmpq 0x90(%rbx), %rax
je 0x78b3
movq %r14, 0x10(%rax)
jmp 0x78c1
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %rdx
cmpq %rdx, %rax
je 0x78c7
movq 0x10(%rax), %rcx
pushq $0x27
jmp 0x7711
movq 0x30(%rbx), %rax
movq 0x8(%rax), %rcx
movq %rcx, 0x40(%rbx)
movq 0x10(%rax), %rsi
movq %rbx, %rdi
callq 0xab4d
jmp 0x777c
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %rdx
movq 0x10(%rax), %rcx
pushq $0x2b
jmp 0x7711
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %rdx
cmpq %rdx, %rax
je 0x78d0
movq 0x10(%rax), %rcx
pushq $0x29
popq %rsi
movq %rbx, %rdi
callq 0xa7e0
movq 0x40(%rbx), %rcx
movq 0xb0(%rbx), %rax
movq 0x8(%rcx), %rcx
movq %rcx, 0x40(%rbx)
movl $0x6, 0xec8(%rbx)
jmp 0x7862
movq 0x30(%rbx), %rax
movq 0x48(%rbx), %r14
movq 0x8(%rax), %rax
movq %rax, 0x40(%rbx)
movq 0x90(%rbx), %rsi
movq %rbx, %rdi
movq %r14, %rdx
callq 0x4617
movl $0x7, (%rax)
movq %r14, 0x10(%rax)
movq 0x90(%rbx), %rdx
movq %rbx, %rdi
movq %rax, %rsi
xorl %ecx, %ecx
callq 0x45e8
movq %rax, 0x30(%rbx)
movl $0xa, 0xec8(%rbx)
jmp 0x785b
cmpl $0x5, %ebp
jne 0x7832
movq 0x10(%r12), %rax
movq %rax, 0x40(%rbx)
movl $0x15, 0xec8(%rbx)
jmp 0x785b
leaq 0x5525(%rip), %rsi      # 0xccdc
jmp 0x77e8
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, 0x40(%rbx)
andl $0x1f, %edx
cmpl $0x3, %edx
jne 0x77e1
movq 0x90(%rbx), %rdx
pushq $0x2d
popq %rsi
movq %rbx, %rdi
callq 0xa7e0
jmp 0x7851
leaq 0x53d2(%rip), %rsi      # 0xcbba
movq %rbx, %rdi
xorl %edx, %edx
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0xa5c7
movq 0x90(%rbx), %rsi
movq %rbx, %rdi
movq %rax, %rdx
callq 0x60f7
movq %rax, 0x30(%rbx)
movq 0x8(%rax), %rcx
movq %rcx, 0x40(%rbx)
movq 0x10(%rax), %rax
movq %rax, 0x30(%rbx)
movl $0x22, 0xec8(%rbx)
jmp 0x785b
movq 0x10(%r12), %rcx
pushq $0x30
popq %rsi
movq %rbx, %rdi
movq %r14, %rdx
callq 0xa7e0
movq 0x8(%r15), %rax
movq 0x8(%rax), %rax
movq %rax, 0x40(%rbx)
movl $0x6, 0xec8(%rbx)
movq 0xb0(%rbx), %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq 0x10(%rax), %rcx
movq %rcx, 0x40(%rbx)
movq 0x90(%rbx), %rdx
cmpq %rdx, %rcx
je 0x78ed
pushq $0x24
popq %rsi
movq %rbx, %rdi
callq 0xa7e0
movq 0x40(%rbx), %rcx
movq 0xb0(%rbx), %rax
movq 0x8(%rcx), %rcx
jmp 0x7725
leaq 0x540a(%rip), %rsi      # 0xccb5
movq %rbx, %rdi
jmp 0x77ed
movq %rbx, %rdi
movq %r15, %rsi
movq %r14, %rdx
callq 0x5359
movq 0x40(%rbx), %rsi
jmp 0x78d7
movq 0xb0(%rbx), %rsi
jmp 0x78d7
movq 0xd0(%rbx), %rsi
movq %rbx, %rdi
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0xa761
movq %rbx, %rdi
movq %rdx, %rsi
jmp 0x78da
movq %rbx, %rdi
movq %r14, %rsi
jmp 0x78da