// File: /workspace/github_c_makefile_star2_O0/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
movq %rsp, %rbp
subq $0x240, %rsp            # imm = 0x240
movl 0x7277(%rip), %eax      # 0xbf58
movq %rax, -0x210(%rbp)
subq $0x20, %rax
ja 0x5085
movq -0x210(%rbp), %rax
leaq 0x264c(%rip), %rcx      # 0x734c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0x7248(%rip), %rdi      # 0xbf58
addq $0x4, %rdi
xorl %esi, %esi
callq 0x4350
movl %eax, -0x4(%rbp)
movl -0x4(%rbp), %edi
callq 0x43f0
movl %eax, %edi
movl %edi, -0x8(%rbp)
callq 0x6020
cmpl $0x0, -0x8(%rbp)
je 0x4d48
cmpl $0x2, -0x8(%rbp)
je 0x4d48
leaq 0x26bc(%rip), %rdi      # 0x73ff
callq 0x5940
leaq -0x58(%rbp), %rdi
movb $0x0, %al
callq 0x5ba0
movl -0x38(%rbp), %ecx
movq %rsp, %rax
movl %ecx, 0x20(%rax)
movups -0x58(%rbp), %xmm0
movups -0x48(%rbp), %xmm1
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
leaq -0x34(%rbp), %rdi
movl $0x1e, %esi
callq 0x5f20
leaq 0x71d8(%rip), %rdi      # 0xbf58
leaq -0x34(%rbp), %rsi
movl $0x24, %edx
callq 0x20e0
callq 0x5120
movl -0x4(%rbp), %esi
movl $0x3, %edi
callq 0x22c0
jmp 0x50b7
leaq -0x7c(%rbp), %rdi
movb $0x0, %al
callq 0x5ba0
leaq 0x71a1(%rip), %rdi      # 0xbf58
leaq -0x7c(%rbp), %rsi
movl $0x24, %edx
callq 0x20e0
callq 0x55f0
movl 0x71a8(%rip), %ecx      # 0xbf78
movq %rsp, %rax
movl %ecx, 0x20(%rax)
movups 0x718b(%rip), %xmm0     # 0xbf68
movups %xmm0, 0x10(%rax)
movups 0x7170(%rip), %xmm0     # 0xbf58
movups %xmm0, (%rax)
leaq -0xa0(%rbp), %rdi
movl $0x3, %esi
callq 0x5f20
leaq 0x7155(%rip), %rdi      # 0xbf58
leaq -0xa0(%rbp), %rsi
movl $0x24, %edx
callq 0x20e0
movl $0x8, %edi
xorl %esi, %esi
callq 0x2260
movl %eax, -0xc(%rbp)
callq 0x4cd0
movl -0xc(%rbp), %edi
callq 0x2440
jmp 0x50b7
leaq -0xc4(%rbp), %rdi
movb $0x0, %al
callq 0x5ba0
leaq 0x710e(%rip), %rdi      # 0xbf58
leaq -0xc4(%rbp), %rsi
movl $0x24, %edx
callq 0x20e0
callq 0x5120
movb $0x0, %al
callq 0x2390
jmp 0x50b7
leaq -0xe8(%rbp), %rdi
movb $0x0, %al
callq 0x5ba0
leaq 0x70d7(%rip), %rdi      # 0xbf58
leaq -0xe8(%rbp), %rsi
movl $0x24, %edx
callq 0x20e0
callq 0x4cd0
cmpl $0x1d, 0x70ba(%rip)     # 0xbf58
jne 0x4ecb
leaq -0x10c(%rbp), %rdi
movb $0x0, %al
callq 0x5ba0
leaq 0x70a3(%rip), %rdi      # 0xbf58
leaq -0x10c(%rbp), %rsi
movl $0x24, %edx
callq 0x20e0
jmp 0x4f68
cmpl $0x1, 0x7086(%rip)      # 0xbf58
jne 0x4eff
leaq -0x130(%rbp), %rdi
movb $0x0, %al
callq 0x5ba0
leaq 0x706f(%rip), %rdi      # 0xbf58
leaq -0x130(%rbp), %rsi
movl $0x24, %edx
callq 0x20e0
jmp 0x50b7
movl 0x7073(%rip), %ecx      # 0xbf78
movq %rsp, %rax
movl %ecx, 0x20(%rax)
movups 0x7056(%rip), %xmm0     # 0xbf68
movups %xmm0, 0x10(%rax)
movups 0x703b(%rip), %xmm0     # 0xbf58
movups %xmm0, (%rax)
callq 0x50c0
cmpl $0x0, %eax
je 0x4f36
movl $0x1d, %edi
callq 0x58a0
jmp 0x4f68
movb $0x0, %al
callq 0x59f0
leaq -0x154(%rbp), %rdi
movb $0x0, %al
callq 0x5ba0
leaq 0x7006(%rip), %rdi      # 0xbf58
leaq -0x154(%rbp), %rsi
movl $0x24, %edx
callq 0x20e0
jmp 0x4e97
jmp 0x4e92
leaq -0x178(%rbp), %rdi
movb $0x0, %al
callq 0x5ba0
leaq 0x6fd6(%rip), %rdi      # 0xbf58
leaq -0x178(%rbp), %rsi
movl $0x24, %edx
callq 0x20e0
movb $0x0, %al
callq 0x2250
movl %eax, -0x10(%rbp)
callq 0x55f0
movl 0x6fd0(%rip), %ecx      # 0xbf78
movq %rsp, %rax
movl %ecx, 0x20(%rax)
movups 0x6fb3(%rip), %xmm0     # 0xbf68
movups %xmm0, 0x10(%rax)
movups 0x6f98(%rip), %xmm0     # 0xbf58
movups %xmm0, (%rax)
leaq -0x19c(%rbp), %rdi
movl $0x5, %esi
callq 0x5f20
leaq 0x6f7d(%rip), %rdi      # 0xbf58
leaq -0x19c(%rbp), %rsi
movl $0x24, %edx
callq 0x20e0
movl $0x8, %edi
xorl %esi, %esi
callq 0x2260
movl %eax, -0xc(%rbp)
callq 0x4cd0
movl -0x10(%rbp), %esi
movl $0x7, %edi
callq 0x2260
movl -0xc(%rbp), %edi
callq 0x2440
jmp 0x50b7
leaq -0x1c0(%rbp), %rdi
movb $0x0, %al
callq 0x5ba0
leaq 0x6f29(%rip), %rdi      # 0xbf58
leaq -0x1c0(%rbp), %rsi
movl $0x24, %edx
callq 0x20e0
callq 0x5120
movl $0xd, %edi
callq 0x2330
jmp 0x50b7
leaq -0x1e4(%rbp), %rdi
movb $0x0, %al
callq 0x5ba0
leaq 0x6ef2(%rip), %rdi      # 0xbf58
leaq -0x1e4(%rbp), %rsi
movl $0x24, %edx
callq 0x20e0
movl $0xe, %edi
callq 0x2330
jmp 0x50b7
jmp 0x50b7
movb $0x0, %al
callq 0x59f0
leaq -0x208(%rbp), %rdi
movb $0x0, %al
callq 0x5ba0
leaq 0x6eb7(%rip), %rdi      # 0xbf58
leaq -0x208(%rbp), %rsi
movl $0x24, %edx
callq 0x20e0
jmp 0x4cdb
addq $0x240, %rsp            # imm = 0x240
popq %rbp
retq