// File: /workspace/github_c_makefile_star2_O2/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 0x18bc(%rip), %r14      # 0x5344
movl 0x62da(%rip), %eax      # 0x9d68
cmpq $0xd, %rax
ja 0x3a9d
movslq (%r14,%rax,4), %rax
addq %r14, %rax
jmpq *%rax
cmpl $0x1d, %eax
je 0x3e76
cmpl $0x20, %eax
je 0x3dd9
xorl %eax, %eax
callq 0x462e
movq %rbx, %rdi
xorl %eax, %eax
callq 0x475d
movl 0x54(%rsp), %eax
movl %eax, 0x62be(%rip)      # 0x9d88
movups 0x34(%rsp), %xmm0
movups 0x44(%rsp), %xmm1
movups %xmm1, 0x629d(%rip)     # 0x9d78
movups %xmm0, 0x6286(%rip)     # 0x9d68
jmp 0x3a88
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x475d
movl 0x20(%rbx), %eax
movl %eax, 0x628c(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x626e(%rip)     # 0x9d78
movups %xmm0, 0x6257(%rip)     # 0x9d68
pushq $0xe
jmp 0x3d1a
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x475d
movl 0x20(%rbx), %eax
movl %eax, 0x6258(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x623a(%rip)     # 0x9d78
movups %xmm0, 0x6223(%rip)     # 0x9d68
callq 0x3e82
xorl %eax, %eax
callq 0x231b
jmp 0x3e76
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x475d
movl 0x20(%rbx), %eax
movl %eax, 0x621a(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x61fc(%rip)     # 0x9d78
movups %xmm0, 0x61e5(%rip)     # 0x9d68
callq 0x426a
movl 0x61fa(%rip), %eax      # 0x9d88
movl %eax, 0x20(%rsp)
movups 0x61df(%rip), %xmm0     # 0x9d78
movups %xmm0, 0x10(%rsp)
movups 0x61c3(%rip), %xmm0     # 0x9d68
movups %xmm0, (%rsp)
leaq 0x34(%rsp), %rbx
pushq $0x3
popq %rsi
movq %rbx, %rdi
callq 0x49ce
movl 0x20(%rbx), %eax
movl %eax, 0x61c6(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x61a8(%rip)     # 0x9d78
movups %xmm0, 0x6191(%rip)     # 0x9d68
pushq $0x8
popq %rdi
xorl %esi, %esi
callq 0x2285
movl %eax, %ebx
callq 0x3a71
movl %ebx, %edi
jmp 0x3dcf
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x475d
movl 0x20(%rbx), %eax
movl %eax, 0x6181(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x6163(%rip)     # 0x9d78
movups %xmm0, 0x614c(%rip)     # 0x9d68
movl $0x3055, %r14d          # imm = 0x3055
pushq $0x1d
popq %rbp
callq 0x3a71
movl 0x6138(%rip), %eax      # 0x9d68
cmpl $0x1d, %eax
ja 0x3c45
btl %eax, %r14d
jb 0x3c7a
cmpl $0x1, %eax
je 0x3cb4
cmpl $0x1d, %eax
je 0x3c83
xorl %eax, %eax
callq 0x462e
movq %rbx, %rdi
xorl %eax, %eax
callq 0x475d
movl 0x54(%rsp), %eax
movl %eax, 0x6128(%rip)      # 0x9d88
movups 0x34(%rsp), %xmm0
movups 0x44(%rsp), %xmm1
movups %xmm1, 0x6107(%rip)     # 0x9d78
movups %xmm0, 0x60f0(%rip)     # 0x9d68
jmp 0x3c2a
movl %ebp, %edi
callq 0x453b
jmp 0x3c25
movq %rbx, %rdi
xorl %eax, %eax
callq 0x475d
movl 0x54(%rsp), %eax
movl %eax, 0x60f1(%rip)      # 0x9d88
movups 0x34(%rsp), %xmm0
movups 0x44(%rsp), %xmm1
movups %xmm1, 0x60d0(%rip)     # 0x9d78
movups %xmm0, 0x60b9(%rip)     # 0x9d68
jmp 0x3c25
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x475d
movl 0x20(%rbx), %eax
movl %eax, 0x60bc(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x609e(%rip)     # 0x9d78
movups %xmm0, 0x6087(%rip)     # 0x9d68
jmp 0x3e76
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x475d
movl 0x20(%rbx), %eax
movl %eax, 0x608a(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x606c(%rip)     # 0x9d78
movups %xmm0, 0x6055(%rip)     # 0x9d68
callq 0x3e82
pushq $0xd
popq %rdi
callq 0x22f4
jmp 0x3e76
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x475d
movl 0x20(%rbx), %eax
movl %eax, 0x604b(%rip)      # 0x9d88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x602d(%rip)     # 0x9d78
movups %xmm0, 0x6016(%rip)     # 0x9d68
xorl %eax, %eax
callq 0x227c
movl %eax, %ebx
callq 0x426a
movl 0x6022(%rip), %eax      # 0x9d88
movl %eax, 0x20(%rsp)
movups 0x6007(%rip), %xmm0     # 0x9d78
movups %xmm0, 0x10(%rsp)
movups 0x5feb(%rip), %xmm0     # 0x9d68
movups %xmm0, (%rsp)
leaq 0x34(%rsp), %r14
pushq $0x5
popq %rsi
movq %r14, %rdi
callq 0x49ce
movl 0x20(%r14), %eax
movl %eax, 0x5fed(%rip)      # 0x9d88
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups %xmm1, 0x5fcd(%rip)     # 0x9d78
movups %xmm0, 0x5fb6(%rip)     # 0x9d68
pushq $0x8
popq %rdi
xorl %esi, %esi
callq 0x2285
movl %eax, %ebp
callq 0x3a71
pushq $0x7
popq %rdi
movl %ebx, %esi
callq 0x2285
movl %ebp, %edi
callq 0x237b
jmp 0x3e76
leaq 0x5f8c(%rip), %rdi      # 0x9d6c
xorl %esi, %esi
callq 0x328f
movl %eax, %ebx
movl %eax, %edi
callq 0x3315
movl %eax, %ebp
movl %eax, %edi
callq 0x4a4c
testl $0xfffffffd, %ebp       # imm = 0xFFFFFFFD
je 0x3e0d
leaq 0x15a3(%rip), %rdi      # 0x53ab
callq 0x45b5
leaq 0x58(%rsp), %r14
movq %r14, %rdi
xorl %eax, %eax
callq 0x475d
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
pushq $0x1e
popq %rsi
movq %r14, %rdi
callq 0x49ce
movl 0x20(%r14), %eax
movl %eax, 0x5f38(%rip)      # 0x9d88
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups %xmm1, 0x5f18(%rip)     # 0x9d78
movups %xmm0, 0x5f01(%rip)     # 0x9d68
callq 0x3e82
pushq $0x3
popq %rdi
movl %ebx, %esi
callq 0x22b1
addq $0x80, %rsp
popq %rbx
popq %r14
popq %rbp
retq