176 lines
3.9 KiB
HolyC
176 lines
3.9 KiB
HolyC
|
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;
|
|||
|
}
|