// File: /workspace/github_c_makefile_star2_O3/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 0x7ae3
leaq 0x5a4c(%rip), %rax      # 0xd0d8
movslq (%rax,%rsi,4), %rcx
addq %rax, %rcx
jmpq *%rcx
movq 0x38(%rbx), %rsi
movq %rbx, %rdi
callq 0x54c1
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 0x7dff
movq 0xec0(%rbx), %rax
cmpq 0xd0(%rbx), %rax
jne 0x7cc8
movq 0x90(%rbx), %rsi
jmp 0x7dbe
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %rdx
movq 0x10(%rax), %rcx
movq %rbx, %rdi
movl $0x2f, %esi
jmp 0x7c13
movq 0xec0(%rbx), %rax
movq %rax, 0x30(%rbx)
movq 0x40(%rbx), %r14
movq 0x90(%rbx), %r15
movq %rbx, %rdi
movq %r15, %rsi
movq %r14, %rdx
callq 0x4689
movq %rax, %r12
movl $0x5, %ebp
movl %ebp, (%rax)
movq %r15, 0x8(%rax)
movq %r14, 0x10(%rax)
movq 0x38(%rbx), %r14
movq %rbx, %rdi
movq %rax, %rsi
movq %r14, %rdx
callq 0x4689
movq %rax, %r15
movq %r12, 0x8(%rax)
movq %r14, 0x10(%rax)
movl $0xd, (%rax)
movq 0x30(%rbx), %r14
movq %rbx, %rdi
movq %r14, %rsi
movq %rax, %rdx
callq 0x4689
movl %ebp, (%rax)
movq %r14, 0x8(%rax)
movq %r15, 0x10(%rax)
jmp 0x7b54
movq 0xec0(%rbx), %r14
movq 0x40(%rbx), %rax
cmpq 0xd0(%rbx), %r14
je 0x7d4f
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, 0x40(%rbx)
movq 0x90(%rbx), %r15
cmpq %r15, %rax
je 0x7c9f
testq %rax, %rax
je 0x77ce
movq 0x8(%rax), %rcx
cmpq 0x138(%rbx), %rcx
jne 0x7cc8
movq 0x10(%rax), %rax
movl (%rax), %eax
andl $0x1f, %eax
cmpl $0x5, %eax
jne 0x7caa
movq 0x118(%rbx), %r12
movq %rbx, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0x4689
movq %rax, %r13
movl $0x5, %ebp
movl %ebp, (%rax)
movq %r14, 0x8(%rax)
movq %r15, 0x10(%rax)
movq %rbx, %rdi
movq %r12, %rsi
movq %rax, %rdx
callq 0x4689
movq %rax, %r14
movl %ebp, (%rax)
movq %r12, 0x8(%rax)
movq %r13, 0x10(%rax)
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %r15
movq 0x10(%rax), %rax
movq 0x8(%rax), %r12
movq %rbx, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0x4689
movq %rax, %r13
movl %ebp, (%rax)
movq %r14, 0x8(%rax)
movq %r15, 0x10(%rax)
movq %rbx, %rdi
movq %r12, %rsi
movq %rax, %rdx
callq 0x4689
movl %ebp, (%rax)
movq %r12, 0x8(%rax)
movq %r13, 0x10(%rax)
jmp 0x7df1
movq 0x40(%rbx), %rax
movq 0x8(%rax), %rcx
movl (%rcx), %edx
movl %edx, %esi
andl $0x1f, %esi
cmpl $0x5, %esi
jne 0x7cd7
movq 0x8(%rcx), %rbp
movq 0x10(%rcx), %r14
movq 0x110(%rbx), %r15
movq 0x10(%rax), %r12
movq %rbx, %rdi
movq %r14, %rsi
movq %r12, %rdx
callq 0x4689
movq %rax, %r13
movl $0x5, %eax
movl %eax, (%r13)
movq %r14, 0x8(%r13)
movq %r12, 0x10(%r13)
movq %rbx, %rdi
movq %r15, %rsi
movq %r13, %rdx
callq 0x4689
movl $0x5, %ecx
movl %ecx, (%rax)
movq %r15, 0x8(%rax)
movq %r13, 0x10(%rax)
movl (%rbp), %edx
movq %rbp, %rcx
jmp 0x7cdf
movq 0xec0(%rbx), %rsi
cmpq 0xd0(%rbx), %rsi
jne 0x7dbe
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %rdx
cmpq %rdx, %rax
jne 0x7c07
jmp 0x7dbe
movq 0x30(%rbx), %r14
movq 0x90(%rbx), %rcx
cmpq %rcx, %r14
je 0x7956
movq 0x40(%rbx), %r15
addq $0x8, %r15
movq (%r15), %r15
movq 0x8(%r15), %rax
movq 0x8(%rax), %rdx
movq 0x8(%r14), %rcx
movq 0x38(%rbx), %rsi
movq %rbx, %rdi
callq 0x5e7f
addq $0x10, %r15
movq 0x10(%r14), %r14
movq 0x90(%rbx), %rcx
cmpq %rcx, %r14
jne 0x7927
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 0x7e06
movq 0x40(%rbx), %r12
movq 0x90(%rbx), %r14
cmpq %r14, %r12
je 0x7c9f
movq 0x8(%r12), %rax
movq 0x8(%rax), %r13
movl (%r13), %ebp
andl $0x1f, %ebp
cmpl $0x5, %ebp
jne 0x7dd4
movq %rax, (%rsp)
cmpq %r14, %r13
je 0x79d6
movq 0xec0(%rbx), %r15
movq 0x8(%r13), %rdi
movq %r15, %rsi
callq 0x4d0e
testl %eax, %eax
jne 0x7cb3
movq 0x10(%r13), %r13
cmpq %r14, %r13
jne 0x79b9
movq 0x10(%r12), %r12
jmp 0x7987
movq 0x40(%rbx), %rcx
movl (%rcx), %eax
andl $0x1f, %eax
cmpl $0x5, %eax
jne 0x7caa
movq 0x90(%rbx), %rdx
jmp 0x7d67
movq 0xec0(%rbx), %rsi
cmpq 0xd0(%rbx), %rsi
je 0x7dbe
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %rdx
cmpq %rdx, %rax
jne 0x7baf
jmp 0x7dbe
movq 0xec0(%rbx), %r14
movq 0x30(%rbx), %r15
movq %rbx, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0x4689
movl $0x5, (%rax)
movq %r14, 0x8(%rax)
movq %r15, 0x10(%rax)
movq %rax, 0x30(%rbx)
movq 0x40(%rbx), %rcx
movl (%rcx), %edx
andl $0x1f, %edx
cmpl $0x5, %edx
jne 0x7d23
movq 0x8(%rcx), %rdx
movl (%rdx), %esi
andl $0x1f, %esi
cmpl $0x5, %esi
jne 0x7d88
movq 0x10(%rdx), %rsi
movl (%rsi), %esi
andl $0x1f, %esi
cmpl $0x5, %esi
jne 0x7d88
movq 0x10(%rcx), %rcx
movq %rbx, %rdi
movl $0x21, %esi
movq %rax, %rdx
callq 0xb07e
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 0x7df5
movq 0x30(%rbx), %rax
movq 0x10(%rax), %rcx
cmpq 0x90(%rbx), %rcx
je 0x7ded
movq 0x8(%rcx), %rcx
movq %rcx, 0x38(%rbx)
jmp 0x7ded
movq 0xea0(%rbx), %rdi
movl 0xec8(%rbx), %edx
leaq 0x61b5(%rip), %rsi      # 0xdcac
xorl %eax, %eax
callq 0x4290
movq 0xea0(%rbx), %rsi
jmp 0x7d0b
movq 0x40(%rbx), %r14
movq 0x90(%rbx), %r15
movq %rbx, %rdi
movq %r15, %rsi
movq %r14, %rdx
callq 0x4689
movq %rax, %r12
movl $0x5, (%rax)
movq %r15, 0x8(%rax)
movq %r14, 0x10(%rax)
movq 0x38(%rbx), %r14
movq %rbx, %rdi
movq %rax, %rsi
movq %r14, %rdx
callq 0x4689
movq %r12, 0x8(%rax)
movq %r14, 0x10(%rax)
movl $0xd, (%rax)
movq %rbx, %rdi
movq %rax, %rsi
jmp 0x7dc1
movq 0xec0(%rbx), %r14
movl $0xc, (%r14)
movq 0x38(%rbx), %r15
movq 0x40(%rbx), %r12
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
xorl %ecx, %ecx
callq 0x5de8
cmpq 0x90(%rbx), %rax
je 0x7d97
movq %r14, 0x10(%rax)
jmp 0x7da8
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %rdx
cmpq %rdx, %rax
je 0x7dae
movq 0x10(%rax), %rcx
movq %rbx, %rdi
movl $0x27, %esi
jmp 0x7c13
movq 0x30(%rbx), %rax
movq 0x8(%rax), %rcx
movq %rcx, 0x40(%rbx)
movq 0x10(%rax), %rsi
movq %rbx, %rdi
callq 0xb526
jmp 0x7c8c
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %rdx
movq 0x10(%rax), %rcx
movq %rbx, %rdi
movl $0x2b, %esi
jmp 0x7c13
movq 0x40(%rbx), %rax
movq 0x90(%rbx), %rdx
cmpq %rdx, %rax
je 0x7db7
movq 0x10(%rax), %rcx
movq %rbx, %rdi
movl $0x29, %esi
callq 0xb07e
movq 0x40(%rbx), %rcx
movq 0xb0(%rbx), %rax
movq 0x8(%rcx), %rcx
movq %rcx, 0x40(%rbx)
movl $0x6, 0xec8(%rbx)
jmp 0x7e06
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 0x4689
movq %rax, %r15
movl $0x7, (%rax)
movq %r14, 0x10(%rax)
movq 0x90(%rbx), %r14
movq %rbx, %rdi
movq %rax, %rsi
movq %r14, %rdx
callq 0x4689
movl $0x5, (%rax)
movq %r15, 0x8(%rax)
movq %r14, 0x10(%rax)
movq %rax, 0x30(%rbx)
movl $0xa, 0xec8(%rbx)
jmp 0x7dff
movq %rbx, %rdi
movq %r14, %rsi
jmp 0x7dc1
leaq 0x605b(%rip), %rsi      # 0xdd0c
jmp 0x7d0b
cmpl $0x5, %ebp
movq (%rsp), %rax
jne 0x7dd4
movq 0x10(%rax), %rax
movq %rax, 0x40(%rbx)
movl $0x15, 0xec8(%rbx)
jmp 0x7dff
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, 0x40(%rbx)
andl $0x1f, %edx
cmpl $0x3, %edx
jne 0x7d04
movq 0x90(%rbx), %rdx
movq %rbx, %rdi
movl $0x2d, %esi
callq 0xb07e
jmp 0x7df5
leaq 0x5edf(%rip), %rsi      # 0xdbea
movq %rbx, %rdi
xorl %edx, %edx
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0xad6a
movq 0x90(%rbx), %rdx
cmpq %rax, %rdx
je 0x7e15
movq %rax, %rcx
movq 0x10(%rax), %rax
movq %rdx, 0x10(%rcx)
movq %rcx, %rdx
cmpq 0x90(%rbx), %rax
jne 0x7d33
jmp 0x7e18
movq 0x10(%rax), %rcx
movq %rcx, 0x40(%rbx)
movq 0x90(%rbx), %rdx
cmpq %rdx, %rcx
je 0x7e38
movq %rbx, %rdi
movl $0x24, %esi
callq 0xb07e
movq 0x40(%rbx), %rcx
movq 0xb0(%rbx), %rax
movq 0x8(%rcx), %rcx
jmp 0x7c23
leaq 0x5f56(%rip), %rsi      # 0xdce5
movq %rbx, %rdi
jmp 0x7d10
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
movq %r14, %rcx
callq 0x5e7f
movq 0x40(%rbx), %rsi
jmp 0x7dbe
movq 0xb0(%rbx), %rsi
jmp 0x7dbe
movq 0xd0(%rbx), %rsi
movq %rbx, %rdi
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0xafff
movq 0x10(%rax), %rcx
movq %rbx, %rdi
movl $0x30, %esi
movq %r14, %rdx
callq 0xb07e
movq 0x8(%r12), %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 %rdx, %rcx
movq %rcx, 0x30(%rbx)
movq 0x8(%rcx), %rax
movq %rax, 0x40(%rbx)
movq 0x10(%rcx), %rax
movq %rax, 0x30(%rbx)
movl $0x22, 0xec8(%rbx)
jmp 0x7dff
movq %rbx, %rdi
movq %rdx, %rsi
jmp 0x7dc1