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; }