// File: /workspace/github_c_makefile_star2_O1/tyabu12[P]pl0compiler/compile.c
// Function: statement
void statement() {              /* 文のコンパイル                       */
    int tIndex;
    KindT k;
    int backP, backP2;          /* バックパッチ用                       */

    while (1) {
        switch (token.kind) {
        case Id:                /* 代入文のコンパイル                   */
            tIndex = searchT(token.u.id, varId); /* 左辺の変数のインデックス */
            setIdKind(k = kindT(tIndex)); /* 印字のための情報のセット   */
            if (k != varId && k != parId) /* 変数名かパラメタ名のはず   */
                errorType("var/par");
            token = checkGet(nextToken(), Assign); /* ":="のはず        */
            expression();       /* 式のコンパイル                       */
            genCodeT(sto, tIndex); /* 左辺への代入命令                  */
            return;
        case If:                /* if文のコンパイル                     */
            token = nextToken();
            condition();        /* 条件式のコンパイル                   */
            token = checkGet(token, Then); /* "then"のはず              */
            backP = genCodeV(jpc, 0); /* jpc命令                        */
            statement();        /* 文のコンパイル                       */
            backPatch(backP);   /* 上のjpc命令にバックパッチ            */
            return;
        case Ret:               /* return文のコンパイル                 */
            token = nextToken();
            expression();       /* 式のコンパイル                       */
            genCodeR();         /* ret命令                              */
            return;
        case Begin:             /* begin . . end文のコンパイル          */
            token = nextToken();
            while (1) {
                statement();    /* 文のコンパイル                       */
                while (1) {
                    if (token.kind==Semicolon) { /* 次が";"なら文が続く */
                        token = nextToken();
                        break;
                    }
                    if (token.kind == End) { /* 次がendなら終り         */
                        token = nextToken();
                        return;
                    }
                    if (isStBeginKey(token)) { /* 次が文の先頭記号なら  */
                        errorInsert(Semicolon); /* ";"を忘れたことにする */
                        break;
                    }
                    errorDelete(); /* それ以外ならエラーとして読み捨てる */
                    token = nextToken();
                }
            }
        case While:             /* while文のコンパイル                  */
            token = nextToken();
            backP2 = nextCode(); /* while文の最後のjmp命令の飛び先      */
            condition();        /* 条件式のコンパイル                   */
            token = checkGet(token, Do); /* "do"のはず                  */
            backP = genCodeV(jpc, 0); /* 条件式が偽のとき飛び出すjpc命令 */
            statement();        /* 文のコンパイル                       */
            genCodeV(jmp, backP2); /* while文の先頭へのジャンプ命令     */
            backPatch(backP);   /* 偽のとき飛び出すjpc命令へのバックパッチ */
            return;
        case Write:             /* write文のコンパイル                  */
            token = nextToken();
            expression();       /* 式のコンパイル                       */
            genCodeO(wrt);      /* その値を出力するwrt命令              */
            return;
        case WriteLn:           /* writeln文のコンパイル                */
            token = nextToken();
            genCodeO(wrl);      /* 改行を出力するwrl命令                */
            return;
        case End:
        case Semicolon:         /* 空文を読んだことにして終り           */
            return;
        default:                /* 文の先頭のキーまで読み捨てる         */
            errorDelete();      /* 今読んだトークンを読み捨てる         */
            token = nextToken();
            continue;
        }
    }
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
subq $0x80, %rsp
leaq 0x34(%rsp), %rbx
leaq 0x171e(%rip), %r14      # 0x5368
movl 0x6118(%rip), %eax      # 0x9d68
cmpq $0xd, %rax
ja 0x3c5f
movslq (%r14,%rax,4), %rax
addq %r14, %rax
jmpq *%rax
cmpl $0x1d, %eax
je 0x4049
cmpl $0x20, %eax
je 0x3fa8
xorl %eax, %eax
callq 0x48c2
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4a16
movl 0x54(%rsp), %eax
movl %eax, 0x60fc(%rip)      # 0x9d88
movups 0x34(%rsp), %xmm0
movups 0x44(%rsp), %xmm1
movups %xmm1, 0x60db(%rip)     # 0x9d78
movups %xmm0, 0x60c4(%rip)     # 0x9d68
jmp 0x3c4a
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4a16
movl 0x20(%rbx), %eax
movl %eax, 0x60ca(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x60ac(%rip)     # 0x9d78
movups %xmm0, 0x6095(%rip)     # 0x9d68
movl $0xe, %edi
jmp 0x3ee4
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4a16
movl 0x20(%rbx), %eax
movl %eax, 0x6093(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x6075(%rip)     # 0x9d78
movups %xmm0, 0x605e(%rip)     # 0x9d68
callq 0x4055
xorl %eax, %eax
callq 0x23b2
jmp 0x4049
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4a16
movl 0x20(%rbx), %eax
movl %eax, 0x6055(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x6037(%rip)     # 0x9d78
movups %xmm0, 0x6020(%rip)     # 0x9d68
callq 0x4473
movl 0x6035(%rip), %eax      # 0x9d88
movl %eax, 0x20(%rsp)
movups 0x601a(%rip), %xmm0     # 0x9d78
movups %xmm0, 0x10(%rsp)
movups 0x5ffe(%rip), %xmm0     # 0x9d68
movups %xmm0, (%rsp)
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
movl $0x3, %esi
callq 0x4cda
movl 0x20(%rbx), %eax
movl %eax, 0x5fff(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x5fe1(%rip)     # 0x9d78
movups %xmm0, 0x5fca(%rip)     # 0x9d68
movl $0x8, %edi
xorl %esi, %esi
callq 0x22c5
movl %eax, %ebx
callq 0x3c33
movl %ebx, %edi
jmp 0x3f9e
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4a16
movl 0x20(%rbx), %eax
movl %eax, 0x5fb8(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x5f9a(%rip)     # 0x9d78
movups %xmm0, 0x5f83(%rip)     # 0x9d68
movl $0x3055, %ebp           # imm = 0x3055
callq 0x3c33
movl 0x5f73(%rip), %eax      # 0x9d68
cmpl $0x1d, %eax
ja 0x3e09
btl %eax, %ebp
jb 0x3e3e
cmpl $0x1, %eax
je 0x3e7b
cmpl $0x1d, %eax
je 0x3e4a
xorl %eax, %eax
callq 0x48c2
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4a16
movl 0x54(%rsp), %eax
movl %eax, 0x5f64(%rip)      # 0x9d88
movups 0x34(%rsp), %xmm0
movups 0x44(%rsp), %xmm1
movups %xmm1, 0x5f43(%rip)     # 0x9d78
movups %xmm0, 0x5f2c(%rip)     # 0x9d68
jmp 0x3def
movl $0x1d, %edi
callq 0x47c9
jmp 0x3dea
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4a16
movl 0x54(%rsp), %eax
movl %eax, 0x5f2a(%rip)      # 0x9d88
movups 0x34(%rsp), %xmm0
movups 0x44(%rsp), %xmm1
movups %xmm1, 0x5f09(%rip)     # 0x9d78
movups %xmm0, 0x5ef2(%rip)     # 0x9d68
jmp 0x3dea
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4a16
movl 0x20(%rbx), %eax
movl %eax, 0x5ef5(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x5ed7(%rip)     # 0x9d78
movups %xmm0, 0x5ec0(%rip)     # 0x9d68
jmp 0x4049
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4a16
movl 0x20(%rbx), %eax
movl %eax, 0x5ec3(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x5ea5(%rip)     # 0x9d78
movups %xmm0, 0x5e8e(%rip)     # 0x9d68
callq 0x4055
movl $0xd, %edi
callq 0x236e
jmp 0x4049
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4a16
movl 0x20(%rbx), %eax
movl %eax, 0x5e82(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x5e64(%rip)     # 0x9d78
movups %xmm0, 0x5e4d(%rip)     # 0x9d68
xorl %eax, %eax
callq 0x22bc
movl %eax, %ebx
callq 0x4473
movl 0x5e59(%rip), %eax      # 0x9d88
movl %eax, 0x20(%rsp)
movups 0x5e3e(%rip), %xmm0     # 0x9d78
movups %xmm0, 0x10(%rsp)
movups 0x5e22(%rip), %xmm0     # 0x9d68
movups %xmm0, (%rsp)
leaq 0x34(%rsp), %r14
movq %r14, %rdi
movl $0x5, %esi
callq 0x4cda
movl 0x20(%r14), %eax
movl %eax, 0x5e22(%rip)      # 0x9d88
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups %xmm1, 0x5e02(%rip)     # 0x9d78
movups %xmm0, 0x5deb(%rip)     # 0x9d68
movl $0x8, %edi
xorl %esi, %esi
callq 0x22c5
movl %eax, %ebp
callq 0x3c33
movl $0x7, %edi
movl %ebx, %esi
callq 0x22c5
movl %ebp, %edi
callq 0x2429
jmp 0x4049
leaq 0x5dbd(%rip), %rdi      # 0x9d6c
xorl %esi, %esi
callq 0x33f5
movl %eax, %ebx
movl %eax, %edi
callq 0x34bb
movl %eax, %ebp
movl %eax, %edi
callq 0x4db2
testl $0xfffffffd, %ebp       # imm = 0xFFFFFFFD
je 0x3fdc
leaq 0x13f8(%rip), %rdi      # 0x53cf
callq 0x4849
leaq 0x58(%rsp), %r14
movq %r14, %rdi
xorl %eax, %eax
callq 0x4a16
movl 0x20(%r14), %eax
movl %eax, 0x20(%rsp)
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x34(%rsp), %r14
movq %r14, %rdi
movl $0x1e, %esi
callq 0x4cda
movl 0x20(%r14), %eax
movl %eax, 0x5d67(%rip)      # 0x9d88
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups %xmm1, 0x5d47(%rip)     # 0x9d78
movups %xmm0, 0x5d30(%rip)     # 0x9d68
callq 0x4055
movl $0x3, %edi
movl %ebx, %esi
callq 0x230e
addq $0x80, %rsp
popq %rbx
popq %r14
popq %rbp
retq