U0 AOTStoreCodeU8(CCmpCtrl *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->lst) { if (aotc->lst_col>=24) { '\n'; aotc->lst_col=0; } "%02X ",b; aotc->lst_col+=3; } if (aotc->rip>aotc->num_bin_U8s) aotc->num_bin_U8s=aotc->rip; } U0 AOTStoreCodeU32(CCmpCtrl *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->lst) { if (aotc->lst_col>=24) { '\n'; aotc->lst_col=0; } "%08X ",d; aotc->lst_col+=9; } if (aotc->rip>aotc->num_bin_U8s) aotc->num_bin_U8s=aotc->rip; } } U0 AOTStoreCodeU64(CCmpCtrl *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->lst) { if (aotc->lst_col>=24) { '\n'; aotc->lst_col=0; } "%016X ",q; aotc->lst_col+=17; } if (aotc->rip>aotc->num_bin_U8s) aotc->num_bin_U8s=aotc->rip; } } U0 AOTStoreCodeU8At(CCmpCtrl *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(CCmpCtrl *cc) { U8 *machine_code; I64 res=0; cc->asm_undef_hash=NULL; cc->flags&=~(CCF_UNRESOLVED+CCF_LOCAL); cc->abs_cnts=0; if (!IsLexExpression2Bin(cc,&machine_code)) LexSkipEol(cc); else { if (cc->abs_cnts.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 AsmLineLst(CCmpCtrl *cc) { CAOTCtrl *aotc=cc->aotc; CLexFile *tmpf=cc->lex_include_stk; CDocEntry *doc_e=tmpf->line_start,*doc_e2; if (aotc->lst && aotc->lst_last_lfn==tmpf && doc_e) { if (doc_e2=aotc->lst_last_line) { if (tmpf->flags& LFSF_DOC) { while (doc_e2->y<doc_e->y) { "%h*c%08X ",24-aotc->lst_col,CH_SPACE,aotc->lst_last_rip; aotc->lst_col=0; doc_e2=LexPutLine(cc,doc_e2); } } else { while (*doc_e2(U8 *) && doc_e2!=doc_e) { "%h*c%08X ",24-aotc->lst_col,CH_SPACE,aotc->lst_last_rip; aotc->lst_col=0; doc_e2=LexPutLine(cc,doc_e2); } } aotc->lst_last_line=doc_e2; } else aotc->lst_last_line=doc_e; } else { aotc->lst_last_line=NULL; aotc->lst_last_lfn=tmpf; } aotc->lst_last_rip=aotc->rip; }