// File: /workspace/github_c_makefile_star2_O3/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 0x264e(%rip), %r14      # 0x6368
movl 0x7048(%rip), %eax      # 0xad68
cmpq $0xd, %rax
ja 0x3d2f
movslq (%r14,%rax,4), %rax
addq %r14, %rax
jmpq *%rax
cmpl $0x1d, %eax
je 0x4119
cmpl $0x20, %eax
je 0x4078
xorl %eax, %eax
callq 0x4b48
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4c9c
movl 0x54(%rsp), %eax
movl %eax, 0x702c(%rip)      # 0xad88
movups 0x34(%rsp), %xmm0
movups 0x44(%rsp), %xmm1
movups %xmm1, 0x700b(%rip)     # 0xad78
movups %xmm0, 0x6ff4(%rip)     # 0xad68
jmp 0x3d1a
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4c9c
movl 0x20(%rbx), %eax
movl %eax, 0x6ffa(%rip)      # 0xad88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x6fdc(%rip)     # 0xad78
movups %xmm0, 0x6fc5(%rip)     # 0xad68
movl $0xe, %edi
jmp 0x3fb4
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4c9c
movl 0x20(%rbx), %eax
movl %eax, 0x6fc3(%rip)      # 0xad88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x6fa5(%rip)     # 0xad78
movups %xmm0, 0x6f8e(%rip)     # 0xad68
callq 0x4125
xorl %eax, %eax
callq 0x23b8
jmp 0x4119
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4c9c
movl 0x20(%rbx), %eax
movl %eax, 0x6f85(%rip)      # 0xad88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x6f67(%rip)     # 0xad78
movups %xmm0, 0x6f50(%rip)     # 0xad68
callq 0x4544
movl 0x6f65(%rip), %eax      # 0xad88
movl %eax, 0x20(%rsp)
movups 0x6f4a(%rip), %xmm0     # 0xad78
movups %xmm0, 0x10(%rsp)
movups 0x6f2e(%rip), %xmm0     # 0xad68
movups %xmm0, (%rsp)
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
movl $0x3, %esi
callq 0x4f55
movl 0x20(%rbx), %eax
movl %eax, 0x6f2f(%rip)      # 0xad88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x6f11(%rip)     # 0xad78
movups %xmm0, 0x6efa(%rip)     # 0xad68
movl $0x8, %edi
xorl %esi, %esi
callq 0x22c5
movl %eax, %ebx
callq 0x3d03
movl %ebx, %edi
jmp 0x406e
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4c9c
movl 0x20(%rbx), %eax
movl %eax, 0x6ee8(%rip)      # 0xad88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x6eca(%rip)     # 0xad78
movups %xmm0, 0x6eb3(%rip)     # 0xad68
movl $0x3055, %ebp           # imm = 0x3055
callq 0x3d03
movl 0x6ea3(%rip), %eax      # 0xad68
cmpl $0x1d, %eax
ja 0x3ed9
btl %eax, %ebp
jb 0x3f0e
cmpl $0x1, %eax
je 0x3f4b
cmpl $0x1d, %eax
je 0x3f1a
xorl %eax, %eax
callq 0x4b48
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4c9c
movl 0x54(%rsp), %eax
movl %eax, 0x6e94(%rip)      # 0xad88
movups 0x34(%rsp), %xmm0
movups 0x44(%rsp), %xmm1
movups %xmm1, 0x6e73(%rip)     # 0xad78
movups %xmm0, 0x6e5c(%rip)     # 0xad68
jmp 0x3ebf
movl $0x1d, %edi
callq 0x4a4f
jmp 0x3eba
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4c9c
movl 0x54(%rsp), %eax
movl %eax, 0x6e5a(%rip)      # 0xad88
movups 0x34(%rsp), %xmm0
movups 0x44(%rsp), %xmm1
movups %xmm1, 0x6e39(%rip)     # 0xad78
movups %xmm0, 0x6e22(%rip)     # 0xad68
jmp 0x3eba
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4c9c
movl 0x20(%rbx), %eax
movl %eax, 0x6e25(%rip)      # 0xad88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x6e07(%rip)     # 0xad78
movups %xmm0, 0x6df0(%rip)     # 0xad68
jmp 0x4119
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4c9c
movl 0x20(%rbx), %eax
movl %eax, 0x6df3(%rip)      # 0xad88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x6dd5(%rip)     # 0xad78
movups %xmm0, 0x6dbe(%rip)     # 0xad68
callq 0x4125
movl $0xd, %edi
callq 0x2372
jmp 0x4119
leaq 0x34(%rsp), %rbx
movq %rbx, %rdi
xorl %eax, %eax
callq 0x4c9c
movl 0x20(%rbx), %eax
movl %eax, 0x6db2(%rip)      # 0xad88
movups (%rbx), %xmm0
movups 0x10(%rbx), %xmm1
movups %xmm1, 0x6d94(%rip)     # 0xad78
movups %xmm0, 0x6d7d(%rip)     # 0xad68
xorl %eax, %eax
callq 0x22bc
movl %eax, %ebx
callq 0x4544
movl 0x6d89(%rip), %eax      # 0xad88
movl %eax, 0x20(%rsp)
movups 0x6d6e(%rip), %xmm0     # 0xad78
movups %xmm0, 0x10(%rsp)
movups 0x6d52(%rip), %xmm0     # 0xad68
movups %xmm0, (%rsp)
leaq 0x34(%rsp), %r14
movq %r14, %rdi
movl $0x5, %esi
callq 0x4f55
movl 0x20(%r14), %eax
movl %eax, 0x6d52(%rip)      # 0xad88
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups %xmm1, 0x6d32(%rip)     # 0xad78
movups %xmm0, 0x6d1b(%rip)     # 0xad68
movl $0x8, %edi
xorl %esi, %esi
callq 0x22c5
movl %eax, %ebp
callq 0x3d03
movl $0x7, %edi
movl %ebx, %esi
callq 0x22c5
movl %ebp, %edi
callq 0x2431
jmp 0x4119
leaq 0x6ced(%rip), %rdi      # 0xad6c
xorl %esi, %esi
callq 0x34c4
movl %eax, %ebx
movl %eax, %edi
callq 0x358a
movl %eax, %ebp
movl %eax, %edi
callq 0x502d
testl $0xfffffffd, %ebp       # imm = 0xFFFFFFFD
je 0x40ac
leaq 0x2328(%rip), %rdi      # 0x63cf
callq 0x4acf
leaq 0x58(%rsp), %r14
movq %r14, %rdi
xorl %eax, %eax
callq 0x4c9c
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 0x4f55
movl 0x20(%r14), %eax
movl %eax, 0x6c97(%rip)      # 0xad88
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups %xmm1, 0x6c77(%rip)     # 0xad78
movups %xmm0, 0x6c60(%rip)     # 0xad68
callq 0x4125
movl $0x3, %edi
movl %ebx, %esi
callq 0x2310
addq $0x80, %rsp
popq %rbx
popq %r14
popq %rbp
retq