U0 AOTStoreCodeU8(CCompCtrl *cc, U8 b)
{
    CAOTCtrl    *aotc = cc->aotc;
    I64          i = aotc->rip >> AOT_BIN_BLK_BITS;
    CAOTBinBlk  *tmpbin = aotc->bin;

    while (i--)
        if (!(tmpbin = tmpbin->next))
        {
            i = aotc->rip >> AOT_BIN_BLK_BITS + 1;
            tmpbin = &aotc->bin;
            while (i--)
            {
                if (!tmpbin->next)
                    tmpbin->next = CAlloc(sizeof(CAOTBinBlk));
                tmpbin = tmpbin->next;
            }
            break;
        }
    tmpbin->body[aotc->rip++ & (AOT_BIN_BLK_SIZE - 1)] = b;
    if (aotc->list)
    {
        if (aotc->list_col >= 24)
        {
            '\n';
            aotc->list_col = 0;
        }
        "%02X ", b;
        aotc->list_col += 3;
    }
    if (aotc->rip>aotc->num_bin_U8s)
        aotc->num_bin_U8s = aotc->rip;
}

U0 AOTStoreCodeU32(CCompCtrl *cc, U32 d)
{
    CAOTCtrl    *aotc = cc->aotc;
    I64          i = aotc->rip >> AOT_BIN_BLK_BITS, j = (aotc->rip + sizeof(U32)) >> AOT_BIN_BLK_BITS;
    U32         *_d;
    CAOTBinBlk  *tmpbin;

    if (i != j)
        for (i = 0; i < sizeof(U32); i++)
            AOTStoreCodeU8(cc, d.u8[i]);
    else
    {
        tmpbin = aotc->bin;
        while (i--)
            if (!(tmpbin = tmpbin->next))
            {
                i = aotc->rip >> AOT_BIN_BLK_BITS + 1;
                tmpbin = &aotc->bin;
                while (i--)
                {
                    if (!tmpbin->next)
                        tmpbin->next = CAlloc(sizeof(CAOTBinBlk));
                    tmpbin = tmpbin->next;
                }
                break;
            }
        _d = tmpbin->body + aotc->rip & (AOT_BIN_BLK_SIZE - 1);
        *_d = d;
        aotc->rip += sizeof(U32);
        if (aotc->list)
        {
            if (aotc->list_col >= 24)
            {
                '\n';
                aotc->list_col = 0;
            }
            "%08X ", d;
            aotc->list_col += 9;
        }
        if (aotc->rip>aotc->num_bin_U8s)
            aotc->num_bin_U8s = aotc->rip;
    }
}

U0 AOTStoreCodeU64(CCompCtrl *cc, U64 q)
{
    CAOTCtrl    *aotc = cc->aotc;
    I64          i = aotc->rip >> AOT_BIN_BLK_BITS, j = (aotc->rip + sizeof(I64)) >> AOT_BIN_BLK_BITS, *_q;
    CAOTBinBlk  *tmpbin;

    if (i != j)
        for (i = 0; i < sizeof(I64); i++)
            AOTStoreCodeU8(cc, q.u8[i]);
    else
    {
        tmpbin = aotc->bin;
        while (i--)
            if (!(tmpbin = tmpbin->next))
            {
                i = aotc->rip >> AOT_BIN_BLK_BITS + 1;
                tmpbin = &aotc->bin;
                while (i--)
                {
                    if (!tmpbin->next)
                        tmpbin->next = CAlloc(sizeof(CAOTBinBlk));
                    tmpbin = tmpbin->next;
                }
                break;
            }
        _q = tmpbin->body + aotc->rip & (AOT_BIN_BLK_SIZE - 1);
        *_q = q;
        aotc->rip += sizeof(I64);
        if (aotc->list)
        {
            if (aotc->list_col >= 24)
            {
                '\n';
                aotc->list_col = 0;
            }
            "%016X ", q;
            aotc->list_col += 17;
        }
        if (aotc->rip>aotc->num_bin_U8s)
            aotc->num_bin_U8s = aotc->rip;
    }
}

U0 AOTStoreCodeU8At(CCompCtrl *cc, I64 rip, ...)
{
    CAOTCtrl    *aotc = cc->aotc;
    CAOTBinBlk  *tmpbin;
    I64          i, j;

    for (j = 0; j < argc; j++)
    {
        i = rip >> AOT_BIN_BLK_BITS + 1;
        tmpbin = &aotc->bin;
        while (i--)
        {
            if (!tmpbin->next)
            {
                tmpbin->next = CAlloc(sizeof(CAOTBinBlk));
                tmpbin->next->next = NULL;
            }
            tmpbin = tmpbin->next;
        }
        tmpbin->body[rip++ & (AOT_BIN_BLK_SIZE - 1)] = argv[j];
    }
    if (rip > aotc->num_bin_U8s)
        aotc->num_bin_U8s = rip;
}

I64 AsmLexExpression(CCompCtrl *cc)
{
    U8 *machine_code;
    I64 res = 0;

    cc->asm_undef_hash = NULL;
    cc->flags &= ~(CCF_UNRESOLVED + CCF_LOCAL);
    cc->abs_counts = 0;
    if (!IsLexExpression2Bin(cc, &machine_code))
        LexSkipEol(cc);
    else
    {
        if (cc->abs_counts.externs)
            LexExcept(cc, "Extern Not Allowed at ");
        if (cc->flags & CCF_UNRESOLVED)
            LexExcept(cc, "Undefined sym at ");
        res = Call(machine_code);
        Free(machine_code);
    }
    return res;
}

U0 AsmLineList(CCompCtrl *cc)
{
    CAOTCtrl    *aotc = cc->aotc;
    CLexFile    *tmpf = cc->lex_include_stack;
    CDocEntry   *doc_e = tmpf->line_start, *doc_e2;

    if (aotc->list && aotc->list_last_lfn == tmpf && doc_e)
    {
        if (doc_e2 = aotc->list_last_line)
        {
            if (tmpf->flags & LFSF_DOC)
            {
                while (doc_e2->y < doc_e->y)
                {
                    "%h*c%08X ", 24 - aotc->list_col, CH_SPACE, aotc->list_last_rip;
                    aotc->list_col = 0;
                    doc_e2 = LexPutLine(cc, doc_e2);
                }
            }
            else
            {
                while (*doc_e2(U8 *) && doc_e2 != doc_e)
                {
                    "%h*c%08X ", 24 - aotc->list_col, CH_SPACE, aotc->list_last_rip;
                    aotc->list_col = 0;
                    doc_e2 = LexPutLine(cc,doc_e2);
                }
            }
            aotc->list_last_line = doc_e2;
        }
        else
            aotc->list_last_line = doc_e;
    }
    else
    {
        aotc->list_last_line = NULL;
        aotc->list_last_lfn = tmpf;
    }
    aotc->list_last_rip = aotc->rip;
}