Initial (manual) import
This commit is contained in:
1 parent
f39611c506
commit
895fe109de
661 files changed
+245862
No files matched your search
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,209 @@
|
||||
U0 AsmPrsInsFlags(CCmpCtrl *cc,CInst *tmpins)
|
||||
{
|
||||
I64 i;
|
||||
while (TRUE) {
|
||||
switch (cc->token) {
|
||||
case TK_IDENT:
|
||||
if ((i=LstMatch(cc->cur_str,"NO\0CB\0CW\0CD\0CP\0IB\0IW\0ID\0"))>=0) {
|
||||
tmpins->opcode_modifier=i;
|
||||
break;
|
||||
} else
|
||||
return;
|
||||
case TK_I64:
|
||||
if (cc->cur_i64==16)
|
||||
tmpins->flags|=IEF_OP_SIZE16;
|
||||
else if (cc->cur_i64==32)
|
||||
tmpins->flags|=IEF_OP_SIZE32;
|
||||
else
|
||||
return;
|
||||
break;
|
||||
case '+':
|
||||
tmpins->flags|=IEF_PLUS_OPCODE;
|
||||
case '/':
|
||||
if (Lex(cc)==TK_I64 && cc->cur_i64<8)
|
||||
tmpins->slash_val=cc->cur_i64;
|
||||
else if (cc->token==TK_IDENT) {
|
||||
if (!StrCmp(cc->cur_str,"R"))
|
||||
tmpins->slash_val=SV_R_REG;
|
||||
else if (!StrCmp(cc->cur_str,"I"))
|
||||
tmpins->slash_val=SV_I_REG;
|
||||
else
|
||||
return;
|
||||
} else
|
||||
return;
|
||||
break;
|
||||
case '!': tmpins->flags|=IEF_DONT_SWITCH_MODES; break;
|
||||
case '&': tmpins->flags|=IEF_DFT; break;
|
||||
case '%': tmpins->flags|=IEF_NOT_IN_64_BIT; break;
|
||||
case '=': tmpins->flags|=IEF_48_REX; break;
|
||||
case '`': tmpins->flags|=IEF_REX_ONLY_R8_R15; break;
|
||||
case '^': tmpins->flags|=IEF_REX_XOR_LIKE; break;
|
||||
case '*': tmpins->flags|=IEF_STI_LIKE; break;
|
||||
case '$$': tmpins->flags|=IEF_ENDING_ZERO; break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
Lex(cc);
|
||||
}
|
||||
}
|
||||
|
||||
U0 AsmHashLoad()
|
||||
{//See $LK,"::/Compiler/OpCodes.DD"$.
|
||||
I64 i,j,size,size_max;
|
||||
CInternalType *tmpit;
|
||||
CCmpCtrl *cc;
|
||||
CHashGeneric *tmph;
|
||||
CHashReg *tmpr;
|
||||
CHashOpcode *tmpo,*tmpo2,*tmpo_max;
|
||||
CInst *tmpins;
|
||||
CHashClass *tmpc;
|
||||
|
||||
cmp.size_arg_mask[0]=0x3FF0FFFFFE;
|
||||
cmp.size_arg_mask[1]=0x1110111112;
|
||||
cmp.size_arg_mask[2]=0x2220222224;
|
||||
cmp.size_arg_mask[4]=0x0440444448;
|
||||
cmp.size_arg_mask[8]=0x0880888880;
|
||||
|
||||
cmp.asm_hash=HashTableNew(1024);
|
||||
size_max=offset(CHashOpcode.ins)+sizeof(CInst)<<5;
|
||||
tmpo_max=MAlloc(size_max);
|
||||
|
||||
cc=CmpCtrlNew(FileRead("OpCodes.DD"),,"OpCodes.DD.Z");
|
||||
cc->htc.hash_table_lst=NULL;
|
||||
Lex(cc);
|
||||
while (cc->token) {
|
||||
if (cc->token!=TK_IDENT)
|
||||
LexExcept(cc,"Expecting identifier at ");
|
||||
i=LstMatch(cc->cur_str,"NONE\0R8\0R16\0R32\0R64\0SEG\0FSTK\0"
|
||||
"MM\0XMM\0OPCODE\0KEYWORD\0ASM_KEYWORD\0");
|
||||
if (i<=0)
|
||||
LexExcept(cc,"Unknown Stmt");
|
||||
Lex(cc); //skip keyword
|
||||
if (cc->token!=TK_IDENT)
|
||||
LexExcept(cc,"Expecting identifier at ");
|
||||
switch (i) {
|
||||
case REGT_R8...REGT_XMM:
|
||||
tmpr=CAlloc(sizeof(CHashReg));
|
||||
tmpr->str=cc->cur_str;
|
||||
cc->cur_str=NULL;
|
||||
Lex(cc); //skip keyword name
|
||||
if (cc->token!=TK_I64)
|
||||
LexExcept(cc,"Expecting int at ");
|
||||
tmpr->type=HTT_REG;
|
||||
tmpr->reg_type=i;
|
||||
tmpr->reg_num=cc->cur_i64;
|
||||
HashAdd(tmpr,cmp.asm_hash);
|
||||
Lex(cc); //Skip INT
|
||||
break;
|
||||
case: //OPCODE
|
||||
if (cc->token!=TK_IDENT)
|
||||
LexExcept(cc,"Expecting opcode at ");
|
||||
MemSet(tmpo_max,0,size_max);
|
||||
tmpo_max->type=HTT_OPCODE;
|
||||
tmpo_max->inst_entry_cnt=0;
|
||||
tmpo_max->str=cc->cur_str;
|
||||
cc->cur_str=0;
|
||||
Lex(cc); //Skip OPCODE
|
||||
while (cc->token && cc->token!=';' && cc->token!=':') {
|
||||
tmpins=&tmpo_max->ins[tmpo_max->inst_entry_cnt];
|
||||
tmpins->ins_entry_num=tmpo_max->inst_entry_cnt++;
|
||||
tmpins->slash_val=SV_NONE; //Not zero!!
|
||||
while (cc->token==TK_I64) {
|
||||
tmpins->opcode[tmpins->opcode_cnt++]=cc->cur_i64;
|
||||
Lex(cc);
|
||||
}
|
||||
if (cc->token==',')
|
||||
Lex(cc);
|
||||
else if (cc->token!=';')
|
||||
LexExcept(cc,"Expecting ',' at ");
|
||||
|
||||
AsmPrsInsFlags(cc,tmpins);
|
||||
|
||||
tmpins->uasm_slash_val=tmpins->slash_val;
|
||||
if (tmpins->flags&IEF_STI_LIKE && tmpins->slash_val!=SV_I_REG)
|
||||
tmpins->uasm_slash_val=SV_STI_LIKE;
|
||||
|
||||
tmpins->arg1=tmpins->arg2=tmpins->size1=tmpins->size2=0;
|
||||
if (cc->token==TK_IDENT) {
|
||||
j=DefineMatch(cc->cur_str,"ST_ARG_TYPES");
|
||||
tmpins->arg1=j;
|
||||
if (Bt(&cmp.size_arg_mask[1],j))
|
||||
tmpins->size1=8;
|
||||
else if (Bt(&cmp.size_arg_mask[2],j))
|
||||
tmpins->size1=16;
|
||||
else if (Bt(&cmp.size_arg_mask[4],j))
|
||||
tmpins->size1=32;
|
||||
else if (Bt(&cmp.size_arg_mask[8],j))
|
||||
tmpins->size1=64;
|
||||
|
||||
if (Lex(cc)==TK_IDENT) {
|
||||
j=DefineMatch(cc->cur_str,"ST_ARG_TYPES");
|
||||
Lex(cc);
|
||||
tmpins->arg2=j;
|
||||
if (Bt(&cmp.size_arg_mask[1],j))
|
||||
tmpins->size2=8;
|
||||
else if (Bt(&cmp.size_arg_mask[2],j))
|
||||
tmpins->size2=16;
|
||||
else if (Bt(&cmp.size_arg_mask[4],j))
|
||||
tmpins->size2=32;
|
||||
else if (Bt(&cmp.size_arg_mask[8],j))
|
||||
tmpins->size2=64;
|
||||
}
|
||||
}
|
||||
}
|
||||
size=offset(CHashOpcode.ins)+sizeof(CInst)*tmpo_max->inst_entry_cnt;
|
||||
tmpo=MAlloc(size);
|
||||
MemCpy(tmpo,tmpo_max,size);
|
||||
tmpo->use_cnt=0;
|
||||
if (HashFind(tmpo->str,cmp.asm_hash,HTT_OPCODE))
|
||||
LexExcept(cc,"Duplicate OPCODE entry ");
|
||||
HashAdd(tmpo,cmp.asm_hash);
|
||||
//Parse aliases.
|
||||
if (cc->token==':') {
|
||||
while (Lex(cc)==TK_IDENT) {
|
||||
tmpo2=MAllocIdent(tmpo);
|
||||
tmpo2->str=cc->cur_str;
|
||||
cc->cur_str=0;
|
||||
tmpo2->oc_flags|=OCF_ALIAS;
|
||||
if (HashFind(tmpo2->str,cmp.asm_hash,HTT_OPCODE))
|
||||
LexExcept(cc,"Duplicate OPCODE ALIAS entry ");
|
||||
HashAdd(tmpo2,cmp.asm_hash);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case: //KEYWORD
|
||||
case: //ASM_KEYWORD
|
||||
tmph=CAlloc(sizeof(CHashGeneric));
|
||||
tmph->str=cc->cur_str;
|
||||
cc->cur_str=NULL;
|
||||
Lex(cc); //skip keyword name
|
||||
if (cc->token!=TK_I64)
|
||||
LexExcept(cc,"Expecting int at ");
|
||||
tmph->user_data0=cc->cur_i64;
|
||||
if (i==10)
|
||||
tmph->type=HTT_KEYWORD;
|
||||
else
|
||||
tmph->type=HTT_ASM_KEYWORD;
|
||||
HashAdd(tmph,cmp.asm_hash);
|
||||
Lex(cc); //Skip INT
|
||||
break;
|
||||
}
|
||||
if (cc->token!=';')
|
||||
LexExcept(cc,"Missing ';' at");
|
||||
Lex(cc); //Skip ';'
|
||||
}
|
||||
Free(tmpo_max);
|
||||
CmpCtrlDel(cc);
|
||||
for (i=0;i<INTERNAL_TYPES_NUM;i++) {
|
||||
tmpit=&internal_types_table[i];
|
||||
tmpc=PrsClassNew;
|
||||
tmpc->type=HTT_INTERNAL_TYPE;
|
||||
tmpc->raw_type=tmpit->type;
|
||||
Bts(&tmpc->flags,Cf_INTERNAL_TYPE);
|
||||
tmpc->size=tmpit->size;
|
||||
tmpc->str=AStrNew(tmpit->name);
|
||||
HashAdd(tmpc,cmp.asm_hash);
|
||||
cmp.internal_types[tmpc->raw_type]=tmpc;
|
||||
}
|
||||
adam_task->hash_table->next=cmp.asm_hash;
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
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;
|
||||
}
|
||||
@@ -0,0 +1,217 @@
|
||||
U0 AsmResolve(CCmpCtrl *cc,CAsmUnresolvedRef *tmpu,U8 *label,Bool undefined)
|
||||
{
|
||||
CAOTImportExport *tmpie;
|
||||
CAsmUndefHash *tmpauh;
|
||||
I64 res=Call(tmpu->machine_code);
|
||||
if (undefined) {
|
||||
tmpauh=tmpu->asm_undef_hash;
|
||||
while (tmpauh) {
|
||||
if (tmpauh->hash->type & HTF_UNRESOLVED) {
|
||||
tmpie=CAlloc(sizeof(CAOTImportExport));
|
||||
tmpie->next=tmpauh->hash->ie_lst;
|
||||
tmpauh->hash->ie_lst=tmpie;
|
||||
tmpie->rip=tmpu->rip;
|
||||
tmpie->aot=cc->aot;
|
||||
tmpie->type=tmpu->type;
|
||||
}
|
||||
tmpauh=tmpauh->next; //Technically, more than one won't work.
|
||||
}
|
||||
} else if (!(tmpu->type&IEF_IMM_NOT_REL)) {
|
||||
res-=tmpu->rel_rip;
|
||||
if (tmpu->type==IET_REL_I8 && !(I8_MIN<=res<=I8_MAX) ||
|
||||
tmpu->type==IET_REL_I16 && !(I16_MIN<=res<=I16_MAX)) {
|
||||
PrintErr("Branch out of range at line:%04d %s\n",
|
||||
tmpu->line_num,label);
|
||||
LexExcept(cc);
|
||||
}
|
||||
if (tmpu->U8_avail && tmpu->type>IET_IMM_U8 && -124<=res<=123)
|
||||
PrintWarn("could use I8 displacement at line:%04d %s %s\n",
|
||||
tmpu->line_num,cc->aotc->last_label,label);
|
||||
}
|
||||
AOTStoreCodeU8At(cc,tmpu->rip,res.u8[0]);
|
||||
if (tmpu->type>=IET_REL_I16) {
|
||||
AOTStoreCodeU8At(cc,tmpu->rip+1,res.u8[1]);
|
||||
if (tmpu->type>=IET_REL_I32) {
|
||||
AOTStoreCodeU8At(cc,tmpu->rip+2,res.u8[2],res.u8[3]);
|
||||
if (tmpu->type>=IET_REL_I64)
|
||||
AOTStoreCodeU8At(cc,tmpu->rip+4,res.u8[4],res.u8[5],
|
||||
res.u8[6],res.u8[7]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 AOTLocalsResolve(CCmpCtrl *cc)
|
||||
{
|
||||
CAOTCtrl *aotc=cc->aotc;
|
||||
CAsmUnresolvedRef *tmpu=aotc->local_unresolved,*tmpu1;
|
||||
CAsmUndefHash *tmpauh;
|
||||
Bool undefined;
|
||||
U8 *label=NULL;
|
||||
|
||||
while (tmpu) {
|
||||
undefined=FALSE;
|
||||
tmpu1=tmpu->next;
|
||||
tmpauh=tmpu->asm_undef_hash;
|
||||
while (tmpauh) {
|
||||
if (tmpauh->hash->type & HTF_UNRESOLVED) {
|
||||
PrintErr("Undefined sym at line:%04d %s %s\n",
|
||||
tmpu->line_num,aotc->last_label,tmpauh->hash->str);
|
||||
LexExcept(cc);
|
||||
}
|
||||
label=tmpauh->hash->str;
|
||||
tmpauh=tmpauh->next;
|
||||
}
|
||||
if (!undefined)
|
||||
AsmResolve(cc,tmpu,label,FALSE);
|
||||
Free(tmpu->machine_code);
|
||||
LinkedLstDel(tmpu->asm_undef_hash);
|
||||
Free(tmpu);
|
||||
tmpu=tmpu1;
|
||||
}
|
||||
HashTableDel(cc->htc.local_hash_table);
|
||||
cc->htc.hash_table_lst=cc->htc.local_hash_table=HashTableNew(16);
|
||||
cc->htc.local_hash_table->next=cc->htc.glbl_hash_table;
|
||||
aotc->local_unresolved=NULL;
|
||||
}
|
||||
|
||||
U0 AOTGlblsResolve(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
{
|
||||
CAOTCtrl *aotc=cc->aotc;
|
||||
CHashFun *tmpf;
|
||||
CAsmUnresolvedRef *tmpu=aotc->glbl_unresolved,*tmpu1;
|
||||
I64 i,j;
|
||||
CAOTImportExport *tmpie,*tmpie1;
|
||||
CAsmUndefHash *tmpauh;
|
||||
CHashExport *tmpex;
|
||||
U8 *label;
|
||||
Bool undefined;
|
||||
CExternUsage *tmpeu,*tmpeu8;
|
||||
|
||||
while (tmpu) {
|
||||
label=NULL;
|
||||
undefined=FALSE;
|
||||
tmpu1=tmpu->next;
|
||||
tmpauh=tmpu->asm_undef_hash;
|
||||
while (tmpauh) {
|
||||
if (tmpauh->hash->type & HTF_UNRESOLVED) {
|
||||
tmpex=tmpauh->hash;
|
||||
if (tmpex->type & HTT_EXPORT_SYS_SYM&& tmpex->type & HTF_UNRESOLVED &&
|
||||
!(tmpex->type & HTF_IMPORT) &&
|
||||
(tmpf=HashFind(tmpex->str,cc->htc.hash_table_lst,HTT_FUN)) &&
|
||||
!Bt(&tmpf->flags,Cf_EXTERN)) {
|
||||
tmpex->val=tmpf->exe_addr;
|
||||
tmpex->type&=~HTF_UNRESOLVED;
|
||||
label=tmpauh->hash->str;
|
||||
} else {
|
||||
if (!(tmpex->type & HTF_IMPORT)) {
|
||||
if (cc->htc.local_var_lst) {
|
||||
tmpex->type|=HTF_GOTO_LABEL;
|
||||
tmpex->use_cnt++;
|
||||
} else {
|
||||
PrintErr("Undefined sym at line:%04d %s\n",
|
||||
tmpu->line_num,tmpex->str);
|
||||
LexExcept(cc);
|
||||
}
|
||||
} else if (undefined) {
|
||||
PrintErr("Two imports in same expression "
|
||||
"not allowed at line:%04d %s\n",
|
||||
tmpu->line_num,tmpex->str);
|
||||
LexExcept(cc);
|
||||
}
|
||||
undefined=TRUE;
|
||||
}
|
||||
} else
|
||||
label=tmpauh->hash->str;
|
||||
tmpauh=tmpauh->next;
|
||||
}
|
||||
AsmResolve(cc,tmpu,label,undefined);
|
||||
Free(tmpu->machine_code);
|
||||
LinkedLstDel(tmpu->asm_undef_hash);
|
||||
Free(tmpu);
|
||||
tmpu=tmpu1;
|
||||
}
|
||||
|
||||
for (i=0;i<=cc->htc.glbl_hash_table->mask;i++) {
|
||||
tmpex=cc->htc.glbl_hash_table->body[i];
|
||||
while (tmpex) {
|
||||
if (tmpex->type & (HTF_IMPORT|HTF_GOTO_LABEL)) {
|
||||
if (tmpex->use_cnt && (tmpie=tmpex->ie_lst)) {
|
||||
if (tmpex->type&HTF_GOTO_LABEL)
|
||||
tmpie->flags|=IEF_GOTO_LABEL;
|
||||
if (tmpex->import_name)
|
||||
tmpie->str=StrNew(tmpex->import_name);
|
||||
else
|
||||
tmpie->str=StrNew(tmpex->str);
|
||||
do {
|
||||
tmpie1=tmpie->next;
|
||||
QueIns(tmpie,tmpaot->last_ie);
|
||||
} while (tmpie=tmpie1);
|
||||
tmpex->ie_lst=NULL;
|
||||
}
|
||||
} else if (tmpex->type & (HTF_EXPORT|HTF_RESOLVE)) {
|
||||
if (tmpex->type & HTF_UNRESOLVED) {
|
||||
PrintErr("Undefined sym at %s\n",tmpex->str);
|
||||
LexExcept(cc);
|
||||
}
|
||||
if (tmpex->type & HTF_RESOLVE) {
|
||||
tmpf=tmpex;
|
||||
tmpeu=tmpf->ext_lst;
|
||||
while (tmpeu) {
|
||||
tmpeu8=tmpeu->next;
|
||||
j=tmpf->exe_addr-(tmpeu->rip+4);
|
||||
AOTStoreCodeU8At(cc,tmpeu->rip,j.u8[0],j.u8[1],j.u8[2],j.u8[3]);
|
||||
Free(tmpeu);
|
||||
tmpeu=tmpeu8;
|
||||
}
|
||||
}
|
||||
if (tmpex->type & HTF_EXPORT) {
|
||||
tmpie=CAlloc(sizeof(CAOTImportExport));
|
||||
tmpie->type=IET_REL32_EXPORT;
|
||||
if (tmpex->type & HTT_FUN)
|
||||
tmpie->rip=tmpf->exe_addr;
|
||||
else if (tmpex->type & HTT_GLBL_VAR)
|
||||
tmpie->rip=tmpex(CHashGlblVar *)->data_addr_rip;
|
||||
else
|
||||
tmpie->rip=tmpex->val;
|
||||
tmpie->aot=cc->aot;
|
||||
if (tmpex->type & HTF_IMM)
|
||||
tmpie->type++;
|
||||
tmpie->str=StrNew(tmpex->str);
|
||||
tmpie->src_link=StrNew(tmpex->src_link);
|
||||
QueIns(tmpie,tmpaot->last_ie);
|
||||
}
|
||||
}
|
||||
tmpex=tmpex->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 AsmUnresolvedAdd(CCmpCtrl *cc,U8 *machine_code,I64 type,I64 rip,I64 rel_rip,
|
||||
CAsmUndefHash *local_asm_undef_hash,CAsmUndefHash *glbl_asm_undef_hash,
|
||||
I64 line_num,Bool U8_avail)
|
||||
{
|
||||
CAsmUnresolvedRef *tmpu=MAlloc(sizeof(CAsmUnresolvedRef));
|
||||
tmpu->machine_code=machine_code;
|
||||
tmpu->type=type;
|
||||
tmpu->rip=rip;
|
||||
tmpu->rel_rip=rel_rip;
|
||||
tmpu->aot=cc->aot;
|
||||
tmpu->imm_flag=FALSE;
|
||||
tmpu->line_num=line_num;
|
||||
tmpu->U8_avail=U8_avail;
|
||||
tmpu->str=NULL;
|
||||
if (local_asm_undef_hash) {
|
||||
tmpu->asm_undef_hash=local_asm_undef_hash;
|
||||
tmpu->next=cc->aotc->local_unresolved;
|
||||
cc->aotc->local_unresolved=tmpu;
|
||||
} else {
|
||||
tmpu->asm_undef_hash=glbl_asm_undef_hash;
|
||||
tmpu->next=cc->aotc->glbl_unresolved;
|
||||
cc->aotc->glbl_unresolved=tmpu;
|
||||
if (glbl_asm_undef_hash->hash->type & HTF_IMPORT) {
|
||||
tmpu->str=StrNew(glbl_asm_undef_hash->hash->str);
|
||||
if (glbl_asm_undef_hash->hash->type & HTF_IMM)
|
||||
tmpu->imm_flag=TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,658 @@
|
||||
U0 ICAddEct(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
CICType t2,I64 r2,I64 d2,CICType t3,I64 r3,I64 d3,I64 op,I64 rip)
|
||||
{
|
||||
I64 i,tmp,res_reg=REG_RAX;
|
||||
Bool swap=FALSE;
|
||||
if (r3!=res_reg) {
|
||||
swap^=TRUE;
|
||||
SwapI64(&t2,&t3);
|
||||
SwapI64(&r2,&r3);
|
||||
SwapI64(&d2,&d3);
|
||||
}
|
||||
if (t2.raw_type>=RT_I64 && r2!=res_reg && t2&MDG_REG_DISP_SIB_RIP) {
|
||||
if (t1&MDF_REG && !(r2==r1 && t2&MDG_REG_DISP_SIB))
|
||||
res_reg=r1;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,res_reg,0,t3,r3,d3,rip);
|
||||
i=ICModr1(res_reg,t2,r2,d2);
|
||||
if (tmpi->ic_flags&ICF_LOCK)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+op);
|
||||
ICModr2(tmpi,i,,d2,rip);
|
||||
} else {
|
||||
if (t2&MDF_REG)
|
||||
tmp=r2;
|
||||
else
|
||||
tmp=REG_RCX;
|
||||
|
||||
if (t1&MDF_REG)
|
||||
res_reg=r1;
|
||||
|
||||
if (tmp==res_reg)
|
||||
res_reg=REG_RDX;
|
||||
if (swap) {
|
||||
if (r3==tmp && t3&MDG_REG_DISP_SIB)
|
||||
tmp=REG_RCX;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,tmp,0,t2,r2,d2,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,res_reg,0,t3,r3,d3,rip);
|
||||
} else {
|
||||
if (r2==res_reg && t2&MDG_REG_DISP_SIB)
|
||||
res_reg=REG_RDX;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,res_reg,0,t3,r3,d3,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,tmp,0,t2,r2,d2,rip);
|
||||
}
|
||||
i=0x48;
|
||||
if (res_reg>7)
|
||||
i+=4;
|
||||
if (tmp>7)
|
||||
i++;
|
||||
if (tmpi->ic_flags&ICF_LOCK)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
ICU24(tmpi,0xC00000+i+(tmp&7)<<16+(res_reg&7)<<19+op<<8);
|
||||
}
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,res_reg,0,rip);
|
||||
}
|
||||
|
||||
U0 ICAddSubEctImm(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
CICType t2,I64 r2,I64 d2,I64 d,I64 op,I64 rip)
|
||||
{
|
||||
I64 i;
|
||||
if (op.u8[0]==0x2B) {
|
||||
op=0x0003;
|
||||
d=-d;
|
||||
}
|
||||
if (t1&MDF_REG) {
|
||||
if (!(t2&MDF_REG)) {
|
||||
ICMov(tmpi,t1,r1,d1,t2,r2,d2,rip);
|
||||
t2=t1;
|
||||
r2=r1;
|
||||
d2=d1;
|
||||
}
|
||||
if (r1==r2) {
|
||||
if (r1>7)
|
||||
i=0x49;
|
||||
else
|
||||
i=0x48;
|
||||
if (!d &&
|
||||
(op.u8[0]==0x03||op.u8[0]==0x2B||op.u8[0]==0x33||op.u8[0]==0x0B))
|
||||
return;
|
||||
else if (d==1 && op.u8[0]==0x03) {
|
||||
ICU24(tmpi,0xC0FF00+op.u8[1]<<19+i+(r1&7)<<16);
|
||||
return;
|
||||
} else if (d==-1 && op.u8[0]==0x03) {
|
||||
ICU24(tmpi,0xC8FF00+i+(r1&7)<<16);
|
||||
return;
|
||||
} else if (I8_MIN<=d<=I8_MAX) {
|
||||
ICU24(tmpi,0xC08300+op.u8[1]<<19+i+(r1&7)<<16);
|
||||
ICU8(tmpi,d);
|
||||
return;
|
||||
} else if (I32_MIN<=d<=I32_MAX) {
|
||||
ICU24(tmpi,0xC08100+op.u8[1]<<19+i+(r1&7)<<16);
|
||||
ICU32(tmpi,d);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (op.u8[0]==0x03 && I32_MIN<=d<=I32_MAX &&
|
||||
!Bt(&cmp.non_ptr_vars_mask,r2)) {
|
||||
i=ICModr1(r1,MDF_DISP+RT_I64,r2,d);
|
||||
i.u8[1]|=0x48;
|
||||
ICU24(tmpi,i.u8[2]<<16+0x8D00+i.u8[1]);
|
||||
ICModr2(tmpi,i,,d,rip);
|
||||
return;
|
||||
}
|
||||
}
|
||||
switch (Bsr(t1)) {
|
||||
case MDf_REG:
|
||||
case MDf_DISP:
|
||||
case MDf_SIB:
|
||||
case MDf_RIP_DISP32:
|
||||
if (t1!=t2 || r1!=r2 || d1!=d2) {
|
||||
ICMov(tmpi,t1,r1,d1,t2,r2,d2,rip);
|
||||
t2=t1;
|
||||
r2=r1;
|
||||
d2=d1;
|
||||
}
|
||||
|
||||
if (!d &&(op.u8[0]==0x03||op.u8[0]==0x2B||op.u8[0]==0x33||op.u8[0]==0x0B))
|
||||
return;
|
||||
|
||||
if (op.u8[0]==0x03 && d==-1) //add -1
|
||||
op.u8[1]=1; //Decrement slash val
|
||||
|
||||
if (op.u8[0]==0x03 && (d==1 || d==-1)) { //Add
|
||||
i=ICModr1(op.u8[1],t1,r1,d1);
|
||||
if (!(t1&MDF_REG) && tmpi->ic_flags&ICF_LOCK)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
switch (t1.raw_type) {
|
||||
case RT_I8:
|
||||
case RT_U8:
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0xFE);
|
||||
break;
|
||||
case RT_I16:
|
||||
case RT_U16:
|
||||
ICOpSizeRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0xFF);
|
||||
break;
|
||||
default:
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0xFF);
|
||||
}
|
||||
ICModr2(tmpi,i,,d1,rip);
|
||||
return;
|
||||
}
|
||||
if (I8_MIN<=d<=I8_MAX || t1&(RTG_MASK-RTF_UNSIGNED)==RT_I8) {
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_IMM_U8+op.u8[1],rip+1);
|
||||
ICU8(tmpi,d);
|
||||
return;
|
||||
}
|
||||
if (I32_MIN<=d<=I32_MAX || t1.raw_type<RT_I64) {
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_IMM_U32+op.u8[1],rip);
|
||||
if (t1&(RTG_MASK-RTF_UNSIGNED)==RT_I16)
|
||||
ICU16(tmpi,d);
|
||||
else
|
||||
ICU32(tmpi,d);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case MDf_STK:
|
||||
ICAddSubEctImm(tmpi,MDF_REG+RT_I64,REG_RAX,0,t2,r2,d2,d,op,rip);
|
||||
ICPushRegs(tmpi,1<<REG_RAX);
|
||||
return;
|
||||
}
|
||||
ICAddEct(tmpi,t1,r1,d1,MDF_IMM+RT_I64,0,d,t2,r2,d2,op.u8[0],rip);
|
||||
}
|
||||
|
||||
U0 ICSub(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
CICType t2,I64 r2,I64 d2,CICType t3,I64 r3,I64 d3,I64 rip)
|
||||
{
|
||||
I64 i=0x48,op=0x2B;
|
||||
Bool swap=FALSE;
|
||||
if (r3!=REG_RAX) {
|
||||
swap=TRUE;
|
||||
SwapI64(&t2,&t3);
|
||||
SwapI64(&r2,&r3);
|
||||
SwapI64(&d2,&d3);
|
||||
}
|
||||
if (t2.raw_type>=RT_I64 && r2.u8[0]!=REG_RAX &&
|
||||
(!(t2&MDF_SIB) || r2.u8[1]&15!=REG_RAX) && t2&MDG_REG_DISP_SIB_RIP) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,rip);
|
||||
if (!swap) {
|
||||
op=0x03;
|
||||
ICU24(tmpi,0xD8F748);
|
||||
}
|
||||
i=ICModr1(REG_RAX,t2,r2,d2);
|
||||
if (tmpi->ic_flags&ICF_LOCK)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+op);
|
||||
ICModr2(tmpi,i,,d2,rip);
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
} else {
|
||||
if (!(t3&MDF_REG) || t3.raw_type<RT_I64) {
|
||||
if (swap) {
|
||||
swap=FALSE;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);
|
||||
r2=REG_RAX;
|
||||
r3=REG_RCX;
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);
|
||||
r3=REG_RAX;
|
||||
r2=REG_RCX;
|
||||
}
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);
|
||||
r2=REG_RCX;
|
||||
}
|
||||
if (swap) {
|
||||
op=0x03;
|
||||
ICU24(tmpi,0xD9F748);
|
||||
}
|
||||
if (r3>7)
|
||||
i++;
|
||||
if (r2>7)
|
||||
i+=4;
|
||||
if (tmpi->ic_flags&ICF_LOCK)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
ICU24(tmpi,0xC00000+i+(r3&7)<<16+(r2&7)<<19+op<<8);
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,r2,0,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICMul(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
I64 i,r2,r=REG_RAX,j;
|
||||
CICArg *arg1,*arg2;
|
||||
Bool alt;
|
||||
if (tmpi->arg1.type&MDF_IMM) {
|
||||
arg1=&tmpi->arg2;
|
||||
arg2=&tmpi->arg1;
|
||||
alt=TRUE;
|
||||
} else {
|
||||
arg1=&tmpi->arg1;
|
||||
arg2=&tmpi->arg2;
|
||||
alt=FALSE;
|
||||
}
|
||||
i=arg2->disp;
|
||||
if (!(tmpi->ic_class->raw_type&RTF_UNSIGNED) &&
|
||||
arg2->type&MDF_IMM && I32_MIN<=i<=I32_MAX) {
|
||||
if (tmpi->res.type==MDF_REG+RT_I64) {
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
arg1->type,arg1->reg,arg1->disp,rip);
|
||||
r=tmpi->res.reg;
|
||||
} else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg1->type,arg1->reg,arg1->disp,rip);
|
||||
if (r>7)
|
||||
j=0xC0004D;
|
||||
else
|
||||
j=0xC00048;
|
||||
if (I8_MIN<=i<=I8_MAX)
|
||||
ICU32(tmpi,i<<24+0x6B00+j+(r&7)<<16+(r&7)<<19);
|
||||
else {
|
||||
ICU24(tmpi,0x6900+j+(r&7)<<16+(r&7)<<19);
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
} else {
|
||||
if (tmpi->ic_class->raw_type&RTF_UNSIGNED)
|
||||
i=0xE0F748;
|
||||
else
|
||||
i=0xE8F748;
|
||||
if (alt) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,arg1->type,arg1->reg,arg1->disp,rip);
|
||||
r2=REG_RCX;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type,arg2->reg,arg2->disp,rip);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type,arg2->reg,arg2->disp,rip);
|
||||
if (!(arg1->type&MDF_REG) || arg1->type.raw_type<RT_I64) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
arg1->type,arg1->reg,arg1->disp,rip);
|
||||
r2=REG_RCX;
|
||||
} else
|
||||
r2=arg1->reg;
|
||||
}
|
||||
if (r2>7) {
|
||||
i++;
|
||||
r2&=7;
|
||||
}
|
||||
ICU24(tmpi,i+r2<<16);
|
||||
}
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,r,0,rip);
|
||||
}
|
||||
|
||||
U0 ICMulEqu(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
I64 i=tmpi->arg2.disp,r=REG_RAX,j;
|
||||
if (!(tmpi->ic_class->raw_type&RTF_UNSIGNED) &&
|
||||
tmpi->arg2.type&MDF_IMM && I32_MIN<=i<=I32_MAX) {
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
if (tmpi->arg1.type==MDF_REG+RT_I64)
|
||||
r=tmpi->arg1.reg;
|
||||
else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
if (r>7)
|
||||
j=0xC0004D;
|
||||
else
|
||||
j=0xC00048;
|
||||
if (I8_MIN<=i<=I8_MAX)
|
||||
ICU32(tmpi,i<<24+0x6B00+j+(r&7)<<16+(r&7)<<19);
|
||||
else {
|
||||
ICU24(tmpi,0x6900+j+(r&7)<<16+(r&7)<<19);
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
ICMov(tmpi,tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,MDF_REG+RT_I64,r,0,rip);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,
|
||||
MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,rip);
|
||||
r=REG_RBX;
|
||||
if (I8_MIN<=i<=I8_MAX)
|
||||
ICU32(tmpi,i<<24+0xDB6B48);
|
||||
else {
|
||||
ICU24(tmpi,0xDB6948);
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,
|
||||
MDF_REG+RT_I64,REG_RBX,0,rip);
|
||||
}
|
||||
} else {
|
||||
if (tmpi->ic_class->raw_type&RTF_UNSIGNED)
|
||||
i=0xE3F748;
|
||||
else
|
||||
i=0xEBF748;
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICU24(tmpi,i);
|
||||
ICMov(tmpi,tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,
|
||||
MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,rip);
|
||||
ICU24(tmpi,i);
|
||||
ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
}
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,r,0,rip);
|
||||
}
|
||||
|
||||
U0 ICDiv(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
if (tmpi->ic_class->raw_type&RTF_UNSIGNED) {
|
||||
ICZero(tmpi,REG_RDX);
|
||||
ICU24(tmpi,0xF1F748);
|
||||
} else {
|
||||
ICU16(tmpi,0x9948);
|
||||
ICU24(tmpi,0xF9F748);
|
||||
}
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICDivEqu(CIntermediateCode *tmpi,Bool is_mod,I64 rip)
|
||||
{
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
if (tmpi->ic_class->raw_type&RTF_UNSIGNED) {
|
||||
ICZero(tmpi,REG_RDX);
|
||||
ICU24(tmpi,0xF1F748);
|
||||
} else {
|
||||
ICU16(tmpi,0x9948);
|
||||
ICU24(tmpi,0xF9F748);
|
||||
}
|
||||
if (is_mod)
|
||||
ICMov(tmpi,tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,MDF_REG+RT_I64,REG_RDX,0,rip);
|
||||
else
|
||||
ICMov(tmpi,tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
//dangerous might clobber RBX in Mov, but it doesn't
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+tmpi->arg1_type_pointed_to,
|
||||
REG_RBX,0,rip);
|
||||
if (tmpi->ic_class->raw_type&RTF_UNSIGNED) {
|
||||
ICZero(tmpi,REG_RDX);
|
||||
ICU24(tmpi,0xF1F748);
|
||||
} else {
|
||||
ICU16(tmpi,0x9948);
|
||||
ICU24(tmpi,0xF9F748);
|
||||
}
|
||||
if (is_mod)
|
||||
ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RBX,0,
|
||||
MDF_REG+RT_I64,REG_RDX,0,rip);
|
||||
else
|
||||
ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RBX,0,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
if (tmpi->res.type.mode) {
|
||||
if (is_mod)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RDX,0,rip);
|
||||
else
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICMod(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
if (tmpi->ic_class->raw_type&RTF_UNSIGNED) {
|
||||
ICZero(tmpi,REG_RDX);
|
||||
ICU24(tmpi,0xF1F748);
|
||||
} else {
|
||||
ICU16(tmpi,0x9948);
|
||||
ICU24(tmpi,0xF9F748);
|
||||
}
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RDX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICAddSubEctEqu(CIntermediateCode *tmpi,U8 type_pointed_to,
|
||||
CICType t1,I64 r1,I64 d1,CICType t2,I64 r2,I64 d2,
|
||||
CICType t3,I64 r3,I64 d3,I64 op,I64 rip)
|
||||
{
|
||||
Bool done;
|
||||
I64 res_reg,tmp,i;
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
if (t3&MDF_IMM) {
|
||||
ICAddSubEctImm(tmpi,t2&MDG_MASK+type_pointed_to,r2,d2,t2&MDG_MASK+
|
||||
type_pointed_to,r2,d2,d3,op,rip);
|
||||
if (t1.mode)
|
||||
ICMov(tmpi,t1,r1,d1,t2&MDG_MASK+type_pointed_to,r2,d2,rip);
|
||||
return;
|
||||
} else {
|
||||
done=FALSE;
|
||||
if (type_pointed_to>=RT_I64) {
|
||||
if (!t1.mode && t2&MDG_REG_DISP_SIB_RIP) {
|
||||
if (t3&MDF_REG)
|
||||
tmp=r3;
|
||||
else {
|
||||
tmp=REG_RCX;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,tmp,0,t3,r3,d3,rip);
|
||||
}
|
||||
i=ICModr1(tmp,t2&MDG_MASK+type_pointed_to,r2,d2);
|
||||
if (tmpi->ic_flags&ICF_LOCK)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+op.u8[5]);
|
||||
ICModr2(tmpi,i,,d2,rip);
|
||||
return;
|
||||
}
|
||||
if (t3.raw_type>=RT_I64 && t3&MDG_REG_DISP_SIB_RIP) {
|
||||
if (t2&MDF_REG)
|
||||
res_reg=r2;
|
||||
else {
|
||||
res_reg=REG_RCX;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);
|
||||
}
|
||||
i=ICModr1(res_reg,t3&MDG_MASK+type_pointed_to,r3,d3);
|
||||
if (tmpi->ic_flags&ICF_LOCK)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+op.u8[0]);
|
||||
ICModr2(tmpi,i,,d3,rip);
|
||||
ICMov(tmpi,t2&MDG_MASK+type_pointed_to,r2,d2,
|
||||
MDF_REG+RT_I64,res_reg,0,rip);
|
||||
done=TRUE;
|
||||
}
|
||||
}
|
||||
if (!done) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,rip);
|
||||
if (t2&MDF_REG && r2!=REG_RAX)
|
||||
res_reg=r2;
|
||||
else {
|
||||
res_reg=REG_RCX;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
t2&MDG_MASK+type_pointed_to,r2,d2,rip);
|
||||
}
|
||||
if (tmpi->ic_flags&ICF_LOCK)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
if (res_reg>7)
|
||||
ICU8(tmpi,0x4C);
|
||||
else
|
||||
ICU8(tmpi,0x48);
|
||||
ICU16(tmpi,0xC000+op.u8[0]+(res_reg&7)<<11);
|
||||
ICMov(tmpi,t2&MDG_MASK+type_pointed_to,r2,d2,
|
||||
MDF_REG+RT_I64,res_reg,0,rip);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
done=FALSE;
|
||||
if (t3&MDF_IMM && op.u8[2]) {
|
||||
if (!d3.u32[1]) {
|
||||
if (tmpi->ic_flags&ICF_RES_NOT_USED &&
|
||||
t2&MDF_REG && d3(U64)<=I8_MAX) {
|
||||
ICSlashOp(tmpi,MDF_DISP+type_pointed_to,r2,0,0x838000+op.u8[4],rip);
|
||||
ICU8(tmpi,d3);
|
||||
done=TRUE;
|
||||
} else if (op.u8[2]==0x24) {//AND
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
MDF_DISP+type_pointed_to,REG_RCX,0,rip);
|
||||
res_reg=REG_RAX;
|
||||
if (tmpi->ic_flags&ICF_LOCK)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
ICU16(tmpi,op.u8[3]<<8+0x40);
|
||||
ICU32(tmpi,d3);
|
||||
ICMov(tmpi,MDF_DISP+type_pointed_to,REG_RCX,0,
|
||||
MDF_REG+RT_I64,res_reg,0,rip);
|
||||
done=TRUE;
|
||||
} else if (type_pointed_to<RT_I64) {//OR/XOR
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
MDF_DISP+type_pointed_to,REG_RCX,0,rip);
|
||||
res_reg=REG_RAX;
|
||||
if (tmpi->ic_flags&ICF_LOCK)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
if (d3.u16[1]) {
|
||||
ICU16(tmpi,op.u8[3]<<8+0x40);
|
||||
ICU32(tmpi,d3);
|
||||
} else if (d3.u8[1]) {
|
||||
ICU24(tmpi,op.u8[3]<<16+0x4000+OC_OP_SIZE_PREFIX);
|
||||
ICU16(tmpi,d3);
|
||||
} else {
|
||||
ICU16(tmpi,op.u8[2]<<8+0x40);
|
||||
ICU8(tmpi,d3);
|
||||
}
|
||||
ICMov(tmpi,MDF_DISP+type_pointed_to,REG_RCX,0,
|
||||
MDF_REG+RT_I64,res_reg,0,rip);
|
||||
done=TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!done) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,
|
||||
MDF_DISP+type_pointed_to,REG_RCX,0,rip);
|
||||
res_reg=REG_RBX;
|
||||
if (tmpi->ic_flags&ICF_LOCK)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
ICU8(tmpi,0x48);
|
||||
ICU16(tmpi,0xC000+op.u8[0]+(res_reg&7)<<11);
|
||||
ICMov(tmpi,MDF_DISP+type_pointed_to,REG_RCX,0,
|
||||
MDF_REG+RT_I64,res_reg,0,rip);
|
||||
}
|
||||
}
|
||||
if (t1.mode)
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,res_reg,0,rip);
|
||||
}
|
||||
|
||||
U0 ICShift(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
CICType t2,I64 r2,I64 d2,CICType t3,I64 r3,I64 d3,
|
||||
I64 us,I64 is,I64 rip)
|
||||
{
|
||||
I64 i=0x48,res_reg;
|
||||
if (tmpi->ic_class->raw_type&RTF_UNSIGNED ||
|
||||
tmpi->ic_flags & ICF_USE_UNSIGNED)
|
||||
is=us;
|
||||
if (t1&MDF_REG) {
|
||||
res_reg=r1;
|
||||
if (res_reg>7)
|
||||
i++;
|
||||
} else
|
||||
res_reg=REG_RAX;
|
||||
if (t3&MDF_IMM) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,res_reg,0,t2,r2,d2,rip);
|
||||
if (d3==1)
|
||||
ICU24(tmpi,i+is.u16[2]<<8+(res_reg&7)<<16);
|
||||
else {
|
||||
ICU24(tmpi,i+is.u16[0]<<8+(res_reg&7)<<16);
|
||||
ICU8(tmpi,d3);
|
||||
}
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t3,r3,d3,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,res_reg,0,t2,r2,d2,rip);
|
||||
ICU24(tmpi,i+is.u16[1]<<8+(res_reg&7)<<16);
|
||||
}
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,res_reg,0,rip);
|
||||
}
|
||||
|
||||
U0 ICShiftEqu(CIntermediateCode *tmpi,U8 type_pointed_to,
|
||||
CICType t1,I64 r1,I64 d1,
|
||||
CICType t2,I64 r2,I64 d2,
|
||||
CICType t3,I64 r3,I64 d3,I64 us,I64 is,I64 rip)
|
||||
{
|
||||
I64 res_reg;
|
||||
if (tmpi->ic_class->raw_type&RTF_UNSIGNED ||
|
||||
tmpi->ic_flags & ICF_USE_UNSIGNED)
|
||||
is=us;
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
if (!(t3&MDF_IMM))
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t3,r3,d3,rip);
|
||||
if (t2&MDF_REG)
|
||||
res_reg=r2;
|
||||
else {
|
||||
res_reg=REG_RAX;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
t2&MDG_MASK+type_pointed_to,r2,d2,rip);
|
||||
}
|
||||
if (res_reg>7)
|
||||
ICU8(tmpi,0x49);
|
||||
else
|
||||
ICU8(tmpi,0x48);
|
||||
if (t3&MDF_IMM) {
|
||||
if (d3==1)
|
||||
ICU16(tmpi,is.u16[2]+(res_reg&7)<<8);
|
||||
else {
|
||||
ICU16(tmpi,is.u16[0]+(res_reg&7)<<8);
|
||||
ICU8(tmpi,d3);
|
||||
}
|
||||
} else
|
||||
ICU16(tmpi,is.u16[1]+(res_reg&7)<<8);
|
||||
ICMov(tmpi,t2&MDG_MASK+type_pointed_to,r2,d2,
|
||||
MDF_REG+RT_I64,res_reg,0,rip);
|
||||
} else {
|
||||
if (!(t3&MDF_IMM))
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t3,r3,d3,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,t2,r2,d2,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+type_pointed_to,REG_RDX,0,rip);
|
||||
res_reg=REG_RAX;
|
||||
ICU8(tmpi,0x48);
|
||||
if (t3&MDF_IMM) {
|
||||
if (d3==1)
|
||||
ICU16(tmpi,is.u16[2]+(res_reg&7)<<8);
|
||||
else {
|
||||
ICU16(tmpi,is.u16[0]+(res_reg&7)<<8);
|
||||
ICU8(tmpi,d3);
|
||||
}
|
||||
} else
|
||||
ICU16(tmpi,is.u16[1]+(res_reg&7)<<8);
|
||||
ICMov(tmpi,
|
||||
MDF_DISP+type_pointed_to,REG_RDX,0,MDF_REG+RT_I64,res_reg,0,rip);
|
||||
}
|
||||
if (t1.mode)
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,res_reg,0,rip);
|
||||
}
|
||||
@@ -0,0 +1,719 @@
|
||||
U0 ICUnaries(CIntermediateCode *tmpi,I64 op,I64 rip)
|
||||
{
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICSlashOp(tmpi,MDF_REG+RT_I64,REG_RAX,0,op,rip);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICNot(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
I64 i;
|
||||
if (tmpi->arg1.type.raw_type<=RT_U8 && tmpi->arg1.type&MDG_DISP_SIB_RIP) {
|
||||
i=ICModr1(tmpi,tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp);
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0xF6); //TEST ?,0xFF
|
||||
ICModr2(tmpi,i,,tmpi->arg1.disp,rip+1);
|
||||
ICU8(tmpi,0xFF);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICTest(tmpi,REG_RAX);
|
||||
}
|
||||
ICU24(tmpi,0xC0940F); //SETZ AL
|
||||
ICU32(tmpi,0xC0B60F48); //MOVZX RAX,AL
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_U64,REG_RAX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICAndAnd(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
I64 r2;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
if (!(tmpi->arg1.type&MDF_REG) || tmpi->arg1.reg==REG_RAX) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r2=REG_RDX;
|
||||
} else
|
||||
r2=tmpi->arg1.reg;
|
||||
ICZero(tmpi,REG_RAX);
|
||||
ICTest(tmpi,r2);
|
||||
ICU16(tmpi,0x0874);
|
||||
ICTest(tmpi,REG_RCX);
|
||||
ICU16(tmpi,0x0374);
|
||||
ICU24(tmpi,0xC0FF48);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICOrOr(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
I64 i=0x48,r2;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
if (!(tmpi->arg1.type&MDF_REG) || tmpi->arg1.reg==REG_RAX) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r2=REG_RDX;
|
||||
} else
|
||||
r2=tmpi->arg1.reg;
|
||||
|
||||
if (r2>7) {
|
||||
i++;
|
||||
r2&=7;
|
||||
}
|
||||
ICZero(tmpi,REG_RAX);
|
||||
ICU24(tmpi,0xC80B00+i+r2<<16);
|
||||
ICU16(tmpi,0x0374);
|
||||
ICU24(tmpi,0xC0FF48);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICXorXor(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
I64 r2;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
if (!(tmpi->arg1.type&MDF_REG)) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r2=REG_RDX;
|
||||
} else
|
||||
r2=tmpi->arg1.reg;
|
||||
ICZero(tmpi,REG_RBX);
|
||||
ICTest(tmpi,r2);
|
||||
ICU16(tmpi,0x0374);
|
||||
ICU24(tmpi,0xC3FF48);
|
||||
|
||||
ICZero(tmpi,REG_RAX);
|
||||
ICTest(tmpi,REG_RCX);
|
||||
ICU16(tmpi,0x0374);
|
||||
ICU24(tmpi,0xC0FF48);
|
||||
|
||||
ICU24(tmpi,0xC33348);
|
||||
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICCmp(CIntermediateCode *tmpi,I64 us,I64 is,I64 rip)
|
||||
{
|
||||
I64 r1,d1,r2,i=0x48,j=tmpi->arg2.disp;
|
||||
if (tmpi->arg2.type&MDF_IMM && I32_MIN<=j<=I32_MAX) {
|
||||
if (!(tmpi->ic_flags&(ICF_POP_CMP|ICF_PUSH_CMP)) &&
|
||||
tmpi->arg1.type&MDF_DISP && //TODO
|
||||
tmpi->arg1.type.raw_type>=RT_I64 && tmpi->arg1.reg!=REG_RAX) {
|
||||
r1=tmpi->arg1.reg;
|
||||
d1=tmpi->arg1.disp;
|
||||
ICZero(tmpi,REG_RAX);
|
||||
if (r1>7)
|
||||
i++;
|
||||
if (I8_MIN<=j<=I8_MAX)
|
||||
i+=0x388300;
|
||||
else
|
||||
i+=0x388100;
|
||||
if (!d1) {
|
||||
ICU24(tmpi,0x000000+i+(r1&7)<<16);
|
||||
} else if (I8_MIN<=d1<=I8_MAX) {
|
||||
ICU24(tmpi,0x400000+i+(r1&7)<<16);
|
||||
ICU8(tmpi,d1);
|
||||
} else {
|
||||
ICU24(tmpi,0x800000+i+(r1&7)<<16);
|
||||
ICU32(tmpi,d1);
|
||||
}
|
||||
if (I8_MIN<=j<=I8_MAX)
|
||||
ICU8(tmpi,j);
|
||||
else
|
||||
ICU32(tmpi,j);
|
||||
} else {
|
||||
if (tmpi->ic_flags & ICF_POP_CMP) {
|
||||
ICPopRegs(tmpi,1<<REG_RCX);
|
||||
r1=REG_RCX;
|
||||
} else {
|
||||
if (tmpi->arg1.type&MDF_REG && tmpi->arg1.reg!=REG_RAX)
|
||||
r1=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r1=REG_RCX;
|
||||
}
|
||||
}
|
||||
ICZero(tmpi,REG_RAX);
|
||||
if (r1>7)
|
||||
i++;
|
||||
if (I8_MIN<=j<=I8_MAX) {
|
||||
ICU24(tmpi,0xF88300+i+(r1&7)<<16);
|
||||
ICU8(tmpi,j);
|
||||
} else {
|
||||
ICU24(tmpi,0xF88100+i+(r1&7)<<16);
|
||||
ICU32(tmpi,j);
|
||||
}
|
||||
}
|
||||
if (tmpi->ic_flags & ICF_PUSH_CMP)
|
||||
ICPush(tmpi,MDF_IMM+RT_I64,0,j,rip);
|
||||
if (tmpi->ic_class->raw_type&RTF_UNSIGNED ||
|
||||
tmpi->ic_flags & ICF_USE_UNSIGNED)
|
||||
is=us;
|
||||
ICU16(tmpi,0x300+is);
|
||||
ICU24(tmpi,0xC0FF48);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
} else {
|
||||
if (tmpi->arg2.type&MDF_REG && tmpi->arg2.reg!=REG_RAX)
|
||||
r2=tmpi->arg2.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
r2=REG_RCX;
|
||||
}
|
||||
if (tmpi->ic_flags & ICF_POP_CMP) {
|
||||
ICPopRegs(tmpi,1<<REG_RDX);
|
||||
r1=REG_RDX;
|
||||
} else {
|
||||
if (tmpi->arg1.type&MDF_REG && tmpi->arg1.reg!=REG_RAX)
|
||||
r1=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r1=REG_RDX;
|
||||
}
|
||||
}
|
||||
ICZero(tmpi,REG_RAX);
|
||||
if (r2>7)
|
||||
i++;
|
||||
if (r1>7)
|
||||
i+=4;
|
||||
if (tmpi->ic_flags & ICF_PUSH_CMP)
|
||||
ICPushRegs(tmpi,1<<r2);
|
||||
ICU24(tmpi,0xC03B00+i+(r2&7)<<16+(r1&7)<<19);
|
||||
if (tmpi->ic_class->raw_type&RTF_UNSIGNED ||
|
||||
tmpi->ic_flags & ICF_USE_UNSIGNED)
|
||||
is=us;
|
||||
ICU16(tmpi,0x300+is);
|
||||
ICU24(tmpi,0xC0FF48);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICBitOps(CIntermediateCode *tmpi,CICArg *arg1,CICArg *arg2,
|
||||
CIntermediateCode *tmpi2,I64 op,I64 op_imm,I64 rip)
|
||||
{//TODO:not fully utilizing Modr
|
||||
Bool res_not_used=ToBool(tmpi2->ic_flags&ICF_RES_NOT_USED);
|
||||
I64 r1,t2,r2,d2,i=0x48;
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
t2=arg2->type&MDG_MASK+RT_I64; //TODO: check overflow
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
if (!(t2&MDG_REG_DISP_SIB_RIP) || !(r2.u8[0]!=REG_RAX&&(!(t2&MDF_SIB) ||
|
||||
r2.u8[1]&15!=REG_RAX) || res_not_used)) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);
|
||||
t2=MDF_REG+RT_I64;
|
||||
r2=REG_RCX;
|
||||
d2=0;
|
||||
}
|
||||
if (arg1->type&MDF_REG && (arg1->reg!=REG_RAX||res_not_used))
|
||||
r1=arg1->reg;
|
||||
else if (!(arg1->type&MDF_IMM) || arg1->disp>63) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,arg1->type,arg1->reg,arg1->disp,rip);
|
||||
r1=REG_RDX;
|
||||
} else
|
||||
r1=0;
|
||||
} else {
|
||||
t2=MDF_DISP+RT_I64;
|
||||
d2=0;
|
||||
if (arg2->type&MDF_REG && (arg2->reg!=REG_RAX||res_not_used))
|
||||
r2=arg2->reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,arg2->type,arg2->reg,arg2->disp,rip);
|
||||
r2=REG_RCX;
|
||||
}
|
||||
if (arg1->type&MDF_REG && (arg1->reg!=REG_RAX||res_not_used))
|
||||
r1=arg1->reg;
|
||||
else if (!(arg1->type&MDF_IMM) || arg1->disp>63) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,arg1->type,arg1->reg,arg1->disp,rip);
|
||||
r1=REG_RDX;
|
||||
} else
|
||||
r1=0;
|
||||
}
|
||||
if (!res_not_used)
|
||||
ICZero(tmpi,REG_RAX);
|
||||
if (tmpi->ic_flags&ICF_LOCK && op!=0xA30F)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
if (arg1->type&MDF_IMM && arg1->disp<32)
|
||||
t2=t2&MDG_MASK+RT_U32;
|
||||
i=ICModr1(r1,t2,r2,d2);
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
if (arg1->type&MDF_IMM && arg1->disp<64) {
|
||||
ICU24(tmpi,i.u8[2]<<16+op_imm);
|
||||
ICModr2(tmpi,i,,d2,rip+1);
|
||||
ICU8(tmpi,arg1->disp);
|
||||
} else {
|
||||
ICU24(tmpi,i.u8[2]<<16+op);
|
||||
ICModr2(tmpi,i,,d2,rip);
|
||||
}
|
||||
if (!res_not_used) {
|
||||
ICU24(tmpi,0xC0920F); //SETC AL
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICToUpper(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICU32(tmpi,0x61F88348);
|
||||
ICU16(tmpi,0x0A7C);
|
||||
ICU32(tmpi,0x7AF88348);
|
||||
ICU16(tmpi,0x047F);
|
||||
ICU32(tmpi,0xE0C08348);
|
||||
}
|
||||
|
||||
U0 ICToI64(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
ICFCvt(cc,tmpi,REG_RAX,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,TRUE,CN_INST,rip);
|
||||
}
|
||||
|
||||
U0 ICToF64(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
ICFCvt(cc,tmpi,REG_RAX,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,FALSE,CN_INST,rip);
|
||||
}
|
||||
|
||||
U0 ICToBool(CCmpCtrl *,CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
I64 r;
|
||||
if (tmpi->arg1.type&MDF_REG)
|
||||
r=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r=REG_RAX;
|
||||
}
|
||||
ICTest(tmpi,r);
|
||||
ICU24(tmpi,0xC0950F); //SETNZ AL
|
||||
ICU32(tmpi,0xC0B60F48); //MOVZX RAX,AL
|
||||
}
|
||||
|
||||
U0 ICPreIncDec(CIntermediateCode *tmpi,I64 op,I64 rip)
|
||||
{
|
||||
I64 r;
|
||||
CHashClass *tmpc=tmpi->ic_class,*tmpc1=tmpc-1;
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
if (tmpc->ptr_stars_cnt && tmpc1->size!=1) {
|
||||
ICAddSubEctImm(tmpi,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,tmpc1->size,op.u16[3],rip);
|
||||
} else
|
||||
ICSlashOp(tmpi,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,op,rip);
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
} else {
|
||||
if (tmpi->arg1.type&MDF_REG)
|
||||
r=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r=REG_RCX;
|
||||
}
|
||||
if (tmpc->ptr_stars_cnt &&
|
||||
tmpc1->size!=1) {
|
||||
ICAddSubEctImm(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,r,0,
|
||||
MDF_DISP+tmpi->arg1_type_pointed_to,r,0,
|
||||
tmpc1->size,op.u16[3],rip);
|
||||
} else
|
||||
ICSlashOp(tmpi,
|
||||
MDF_DISP+tmpi->arg1_type_pointed_to,r,0,op,rip);
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_DISP+tmpi->arg1_type_pointed_to,r,0,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICPostIncDec(CIntermediateCode *tmpi,I64 op,I64 rip)
|
||||
{
|
||||
I64 r;
|
||||
CHashClass *tmpc=tmpi->ic_class,*tmpc1=tmpc-1;
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
if (tmpc->ptr_stars_cnt && tmpc1->size!=1)
|
||||
ICAddSubEctImm(tmpi,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,tmpc1->size,op.u16[3],rip);
|
||||
else
|
||||
ICSlashOp(tmpi,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,op,rip);
|
||||
} else {
|
||||
if (tmpi->arg1.type&MDF_REG &&
|
||||
!(tmpi->res.type&MDF_REG && tmpi->res.reg==tmpi->arg1.reg))
|
||||
r=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r=REG_RCX;
|
||||
}
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_DISP+tmpi->arg1_type_pointed_to,r,0,rip);
|
||||
if (tmpc->ptr_stars_cnt && tmpc1->size!=1)
|
||||
ICAddSubEctImm(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,r,0,
|
||||
MDF_DISP+tmpi->arg1_type_pointed_to,r,0,tmpc1->size,op.u16[3],rip);
|
||||
else
|
||||
ICSlashOp(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,r,0,op,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICDerefPostIncDec(CIntermediateCode *tmpi,I64 op,I64 rip)
|
||||
{
|
||||
CICType t;
|
||||
I64 r;
|
||||
CHashClass *tmpc1=tmpi->ic_class;
|
||||
t=tmpi->res.type.raw_type;
|
||||
if (t>tmpi->arg1_type_pointed_to)
|
||||
t=tmpi->arg1_type_pointed_to;
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
if (tmpi->arg1.type&MDF_REG)
|
||||
r=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg1.type&MDG_MASK+RT_I64,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r=REG_RDX;
|
||||
}
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_DISP+t,r,0,rip);
|
||||
if (tmpc1->size!=1)
|
||||
ICAddSubEctImm(tmpi,
|
||||
tmpi->arg1.type&MDG_MASK+RT_I64,tmpi->arg1.reg,tmpi->arg1.disp,
|
||||
tmpi->arg1.type&MDG_MASK+RT_I64,tmpi->arg1.reg,tmpi->arg1.disp,
|
||||
tmpc1->size,op.u16[3],rip);
|
||||
else
|
||||
ICSlashOp(tmpi,tmpi->arg1.type&MDG_MASK+RT_I64,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,op,rip);
|
||||
} else {
|
||||
if (tmpi->arg1.type&MDF_REG)
|
||||
r=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg1.type&MDG_MASK+RT_I64,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r=REG_RCX;
|
||||
}
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_I64,r,0,rip);
|
||||
if (tmpc1->size!=1)
|
||||
ICAddSubEctImm(tmpi,MDF_DISP+RT_I64,r,0,MDF_DISP+RT_I64,r,0,
|
||||
tmpc1->size,op.u16[3],rip);
|
||||
else
|
||||
ICSlashOp(tmpi,MDF_DISP+RT_I64,r,0,op,rip);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_DISP+t,REG_RDX,0,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICAssignPostIncDec(CIntermediateCode *tmpi,I64 op,I64 rip)
|
||||
{
|
||||
CHashClass *tmpc1=tmpi->ic_class2-1;
|
||||
I64 r;
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
if (tmpi->arg1.type&MDF_REG)
|
||||
r=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg1.type&MDG_MASK+RT_I64,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r=REG_RDX;
|
||||
}
|
||||
ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,r,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
if (tmpc1->size!=1 || tmpi->arg1.type&MDF_STK)
|
||||
ICAddSubEctImm(tmpi,tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,
|
||||
MDF_REG+RT_I64,r,0,tmpc1->size,op.u16[3],rip);
|
||||
else
|
||||
ICSlashOp(tmpi,tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,op,rip);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_I64,REG_RDX,0,rip);
|
||||
ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
if (tmpc1->size!=1)
|
||||
ICAddSubEctImm(tmpi,MDF_DISP+RT_I64,REG_RDX,0,
|
||||
MDF_REG+RT_I64,REG_RCX,0,tmpc1->size,op.u16[3],rip);
|
||||
else
|
||||
ICSlashOp(tmpi,MDF_DISP+RT_I64,REG_RDX,0,op,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICCmpAndBranch(CIntermediateCode *tmpi,Bool has_res,I64 rip,
|
||||
I64 us,I64 is,I64 not_us,I64 not_is,U8 *buf,I64 rip2)
|
||||
{
|
||||
I64 r1,r2,i=0x48,j,res_reg;
|
||||
CICType t1,t2;
|
||||
Bool short_jmp,swap,done;
|
||||
CCodeMisc *lb;
|
||||
CICArg *arg1=&tmpi->arg1,*arg2=&tmpi->arg2;
|
||||
|
||||
j=arg1->disp;
|
||||
if (arg1->type&MDF_IMM && I32_MIN<=j<=I32_MAX) {
|
||||
SwapI64(&arg1,&arg2);
|
||||
swap=TRUE;
|
||||
us=not_us;
|
||||
is=not_is;
|
||||
} else
|
||||
swap=FALSE;
|
||||
if (tmpi->ic_class->raw_type&RTF_UNSIGNED ||
|
||||
tmpi->ic_flags & ICF_USE_UNSIGNED)
|
||||
is=us;
|
||||
|
||||
j=arg2->disp;
|
||||
if (arg2->type&MDF_IMM && I32_MIN<=j<=I32_MAX) {
|
||||
if (!has_res && arg1->type&MDG_REG_DISP_SIB_RIP)
|
||||
ICAddSubEctImm(tmpi,arg1->type,arg1->reg,arg1->disp,
|
||||
arg1->type,arg1->reg,arg1->disp,j,0x073B,rip2);
|
||||
else {
|
||||
if (arg1->type&MDF_REG)
|
||||
r1=arg1->reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,arg1->type,
|
||||
arg1->reg,arg1->disp,rip2);
|
||||
r1=REG_RDX;
|
||||
}
|
||||
if (!j) {
|
||||
if (is.u8[2]==0x7C) {
|
||||
ICTest(tmpi,r1);
|
||||
is=0x78880F;
|
||||
} else if (is.u8[2]==0x7D) {
|
||||
ICTest(tmpi,r1);
|
||||
is=0x79890F;
|
||||
} else if (is.u8[2]==0x74 || is.u8[2]==0x75)
|
||||
ICTest(tmpi,r1);
|
||||
else {
|
||||
if (r1>7)
|
||||
i++;
|
||||
ICU24(tmpi,0xF88300+i+(r1&7)<<16);
|
||||
ICU8(tmpi,j);
|
||||
}
|
||||
} else {
|
||||
if (r1>7)
|
||||
i++;
|
||||
if (I8_MIN<=j<=I8_MAX) {
|
||||
ICU24(tmpi,0xF88300+i+(r1&7)<<16);
|
||||
ICU8(tmpi,j);
|
||||
} else {
|
||||
ICU24(tmpi,0xF88100+i+(r1&7)<<16);
|
||||
ICU32(tmpi,j);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (has_res) {
|
||||
if (!swap) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,MDF_IMM+RT_I64,0,j,rip2);
|
||||
res_reg=REG_RCX;
|
||||
} else
|
||||
res_reg=r1;
|
||||
}
|
||||
} else {
|
||||
done=FALSE;
|
||||
t1=arg1->type;
|
||||
r1=arg1->reg;
|
||||
r2=arg2->reg;
|
||||
t2=arg2->type;
|
||||
if (t2.raw_type>=RT_I64 && !has_res && t2&MDG_DISP_SIB_RIP) {
|
||||
if (!(t1&MDF_REG) || t1.raw_type<RT_I64) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg1->type,
|
||||
arg1->reg,arg1->disp,rip2);
|
||||
r1=REG_RAX;
|
||||
}
|
||||
i=ICModr1(r1,t2,r2,arg2->disp);
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0x3B);
|
||||
ICModr2(tmpi,i,,arg2->disp,rip2);
|
||||
done=TRUE;
|
||||
} else if (t1.raw_type>=RT_I64 && t1&MDG_REG_DISP_SIB_RIP) {
|
||||
if (!(t2&MDF_REG) || t2.raw_type<RT_I64) {
|
||||
if (t1&MDF_REG && r1==REG_RAX) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,arg2->type,
|
||||
arg2->reg,arg2->disp,rip2);
|
||||
r2=REG_RCX;
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type,
|
||||
arg2->reg,arg2->disp,rip2);
|
||||
r2=REG_RAX;
|
||||
}
|
||||
}
|
||||
i=ICModr1(r2,t1,r1,arg1->disp);
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0x39);
|
||||
ICModr2(tmpi,i,,arg1->disp,rip2);
|
||||
if (has_res)
|
||||
res_reg=r2;
|
||||
done=TRUE;
|
||||
}
|
||||
if (!done) {
|
||||
if (arg2->type&MDF_REG)
|
||||
r2=arg2->reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type,
|
||||
arg2->reg,arg2->disp,rip2);
|
||||
r2=REG_RAX;
|
||||
}
|
||||
if (arg1->type&MDF_REG)
|
||||
r1=arg1->reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,arg1->type,
|
||||
arg1->reg,arg1->disp,rip2);
|
||||
r1=REG_RCX;
|
||||
}
|
||||
if (r2>7)
|
||||
i++;
|
||||
if (r1>7)
|
||||
i+=4;
|
||||
ICU24(tmpi,0xC03B00+i+(r2&7)<<16+(r1&7)<<19);
|
||||
if (has_res)
|
||||
res_reg=r2;
|
||||
}
|
||||
}
|
||||
|
||||
rip+=tmpi->ic_cnt;
|
||||
lb=OptLabelFwd(tmpi->ic_data);
|
||||
short_jmp=ToBool(tmpi->ic_flags&ICF_SHORT_JMP);
|
||||
if (!buf && lb->addr!=INVALID_PTR) {
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP) {
|
||||
if(tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
i+=4;
|
||||
else
|
||||
i+=8;
|
||||
}
|
||||
if (I8_MIN<=i<=I8_MAX)
|
||||
short_jmp=TRUE;
|
||||
}
|
||||
|
||||
if (short_jmp) {
|
||||
tmpi->ic_flags|=ICF_SHORT_JMP;
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP) {
|
||||
if(tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
i+=4;
|
||||
else
|
||||
i+=8;
|
||||
}
|
||||
ICU16(tmpi,i<<8+is.u8[2]);
|
||||
} else {
|
||||
tmpi->ic_flags&=~ICF_SHORT_JMP;
|
||||
i=lb->addr-(rip+6);
|
||||
if (lb->flags&CMF_POP_CMP) {
|
||||
if(tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
i+=4;
|
||||
else
|
||||
i+=8;
|
||||
}
|
||||
ICU16(tmpi,is.u16[0]);
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
if (has_res)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,res_reg,0,rip2);
|
||||
}
|
||||
|
||||
U0 ICTestAndBranch(CIntermediateCode *tmpi,I64 rip,I64 is,U8 *buf,I64 rip2)
|
||||
{
|
||||
I64 i;
|
||||
Bool short_jmp;
|
||||
CCodeMisc *lb;
|
||||
|
||||
if (!(tmpi->arg1.type&MDF_REG)) {
|
||||
if (tmpi->arg1.type.raw_type<=RT_U8 && tmpi->arg1.type&MDG_DISP_SIB_RIP) {
|
||||
i=ICModr1(tmpi,tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp);
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0xF6);
|
||||
ICModr2(tmpi,i,,tmpi->arg1.disp,rip2+1);
|
||||
ICU8(tmpi,0xFF);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
ICTest(tmpi,REG_RAX);
|
||||
}
|
||||
} else
|
||||
ICTest(tmpi,tmpi->arg1.reg);
|
||||
|
||||
rip+=tmpi->ic_cnt;
|
||||
lb=OptLabelFwd(tmpi->ic_data);
|
||||
short_jmp=ToBool(tmpi->ic_flags&ICF_SHORT_JMP);
|
||||
if (!buf && lb->addr!=INVALID_PTR) {
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
if (I8_MIN<=i<=I8_MAX)
|
||||
short_jmp=TRUE;
|
||||
}
|
||||
|
||||
if (short_jmp) {
|
||||
tmpi->ic_flags|=ICF_SHORT_JMP;
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
ICU16(tmpi,i<<8+is.u8[2]);
|
||||
} else {
|
||||
tmpi->ic_flags&=~ICF_SHORT_JMP;
|
||||
i=lb->addr-(rip+6);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
ICU16(tmpi,is.u16[0]);
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICFlagBranch(CIntermediateCode *tmpi,I64 rip,I64 is,U8 *buf)
|
||||
{
|
||||
I64 i;
|
||||
Bool short_jmp;
|
||||
CCodeMisc *lb;
|
||||
|
||||
rip+=tmpi->ic_cnt;
|
||||
lb=OptLabelFwd(tmpi->ic_data);
|
||||
short_jmp=ToBool(tmpi->ic_flags&ICF_SHORT_JMP);
|
||||
if (!buf && lb->addr!=INVALID_PTR) {
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
if (I8_MIN<=i<=I8_MAX)
|
||||
short_jmp=TRUE;
|
||||
}
|
||||
|
||||
if (short_jmp) {
|
||||
tmpi->ic_flags|=ICF_SHORT_JMP;
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
ICU16(tmpi,i<<8+is.u8[2]);
|
||||
} else {
|
||||
tmpi->ic_flags&=~ICF_SHORT_JMP;
|
||||
i=lb->addr-(rip+6);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
ICU16(tmpi,is.u16[0]);
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,771 @@
|
||||
U0 ICAndBranch(CIntermediateCode *tmpi,I64 rip,I64 is,U8 *buf,I64 rip2)
|
||||
{
|
||||
U64 i;
|
||||
I64 it,t1,r1,d1,r2;
|
||||
Bool short_jmp,swap,override;
|
||||
CCodeMisc *lb;
|
||||
CICArg *arg1,*arg2;
|
||||
|
||||
if (tmpi->arg1.type&MDF_IMM) {
|
||||
swap=TRUE;
|
||||
arg1=&tmpi->arg2;
|
||||
arg2=&tmpi->arg1;
|
||||
} else {
|
||||
swap=FALSE;
|
||||
arg1=&tmpi->arg1;
|
||||
arg2=&tmpi->arg2;
|
||||
}
|
||||
|
||||
if (arg2->type&MDF_IMM && arg2->disp>U32_MAX)
|
||||
override=TRUE;
|
||||
else
|
||||
override=FALSE;
|
||||
|
||||
if (arg1->type.raw_type<arg2->type.raw_type)
|
||||
it=arg1->type.raw_type;
|
||||
else
|
||||
it=arg2->type.raw_type;
|
||||
|
||||
i=arg2->disp;
|
||||
if (arg2->type&MDF_IMM && i<=U32_MAX) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg1->type,arg1->reg,arg1->disp,rip2);
|
||||
if (i<=U8_MAX)
|
||||
ICU16(tmpi,i<<8+0xA8);
|
||||
else if (i<=U16_MAX)
|
||||
ICU32(tmpi,i<<16+0xA900+OC_OP_SIZE_PREFIX);
|
||||
else {
|
||||
ICU8(tmpi,0xA9);
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
} else {
|
||||
t1=MDF_REG+it;
|
||||
d1=0;
|
||||
if (swap && !override) {
|
||||
if (arg1->type&MDF_REG) {
|
||||
r1=arg1->reg;
|
||||
swap=TRUE;
|
||||
} else {
|
||||
r1=REG_RCX;
|
||||
swap=FALSE;
|
||||
}
|
||||
if (arg2->type&MDF_REG) {
|
||||
r2=arg2->reg;
|
||||
swap=FALSE;
|
||||
} else
|
||||
r2=REG_RDX;
|
||||
if (swap) {
|
||||
if (!(arg1->type&MDF_REG) || r1!=arg1->reg)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r1,0,arg1->type,arg1->reg,arg1->disp,rip2);
|
||||
if (arg2->type&MDG_REG_DISP_SIB_RIP) {
|
||||
t1=arg2->type&MDG_MASK+it;
|
||||
r2=arg2->reg;
|
||||
d1=arg2->disp;
|
||||
} else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r2,0,arg2->type,arg2->reg,arg2->disp,rip2);
|
||||
i=ICModr1(r1,t1,r2,d1);
|
||||
} else {
|
||||
if (arg1->type&MDG_REG_DISP_SIB_RIP) {
|
||||
t1=arg1->type&MDG_MASK+it;
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
} else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r1,0,arg1->type,arg1->reg,arg1->disp,rip2);
|
||||
if (!(arg2->type&MDF_REG) || r2!=arg2->reg)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r2,0,arg2->type,arg2->reg,arg2->disp,rip2);
|
||||
i=ICModr1(r2,t1,r1,d1);
|
||||
}
|
||||
} else {
|
||||
if (arg2->type&MDF_REG) {
|
||||
r2=arg2->reg;
|
||||
swap=FALSE;
|
||||
} else {
|
||||
r2=REG_RDX;
|
||||
swap=TRUE;
|
||||
}
|
||||
if (arg1->type&MDF_REG) {
|
||||
r1=arg1->reg;
|
||||
swap=TRUE;
|
||||
} else
|
||||
r1=REG_RCX;
|
||||
if (override)
|
||||
swap=FALSE;
|
||||
if (swap) {
|
||||
if (arg2->type&MDG_REG_DISP_SIB_RIP) {
|
||||
t1=arg2->type&MDG_MASK+it;
|
||||
r2=arg2->reg;
|
||||
d1=arg2->disp;
|
||||
} else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r2,0,arg2->type,arg2->reg,arg2->disp,rip2);
|
||||
if (!(arg1->type&MDF_REG) || r1!=arg1->reg)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r1,0,arg1->type,arg1->reg,arg1->disp,rip2);
|
||||
i=ICModr1(r1,t1,r2,d1);
|
||||
} else {
|
||||
if (!(arg2->type&MDF_REG) || r2!=arg2->reg)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r2,0,arg2->type,arg2->reg,arg2->disp,rip2);
|
||||
if (arg1->type&MDG_REG_DISP_SIB_RIP) {
|
||||
t1=arg1->type&MDG_MASK+it;
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
} else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r1,0,arg1->type,arg1->reg,arg1->disp,rip2);
|
||||
i=ICModr1(r2,t1,r1,d1);
|
||||
}
|
||||
}
|
||||
switch (it) {
|
||||
case RT_I8:
|
||||
case RT_U8:
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0x84);
|
||||
break;
|
||||
case RT_U16:
|
||||
case RT_I16:
|
||||
ICOpSizeRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0x85);
|
||||
break;
|
||||
default:
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0x85);
|
||||
}
|
||||
ICModr2(tmpi,i,,d1,rip2);
|
||||
}
|
||||
|
||||
rip+=tmpi->ic_cnt;
|
||||
lb=OptLabelFwd(tmpi->ic_data);
|
||||
short_jmp=ToBool(tmpi->ic_flags&ICF_SHORT_JMP);
|
||||
if (!buf && lb->addr!=INVALID_PTR) {
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
if (I8_MIN<=i<=I8_MAX)
|
||||
short_jmp=TRUE;
|
||||
}
|
||||
|
||||
if (short_jmp) {
|
||||
tmpi->ic_flags|=ICF_SHORT_JMP;
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
ICU16(tmpi,i<<8+is.u8[2]);
|
||||
} else {
|
||||
tmpi->ic_flags&=~ICF_SHORT_JMP;
|
||||
i=lb->addr-(rip+6);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
ICU16(tmpi,is.u16[0]);
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICAssign(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
CIntermediateCode *tmpi1;
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
ICMov(tmpi,tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
} else {
|
||||
if (tmpi->arg1.type&MDF_REG) {
|
||||
if (!(tmpi1=OptLag1(tmpi)) || tmpi1->ic_code!=IC_ADD_CONST ||
|
||||
tmpi1->res.type!=MDF_REG+RT_I64 || tmpi1->res.reg!=tmpi->arg1.reg ||
|
||||
tmpi1->arg1.type!=MDF_REG+RT_I64 ||
|
||||
tmpi1->arg1.reg!=tmpi->arg1.reg ||
|
||||
(tmpi->arg2.type&MDF_REG || tmpi->arg2.type&MDF_DISP) &&
|
||||
tmpi->arg2.reg==tmpi->arg1.reg ||
|
||||
tmpi->res.type.mode || tmpi1->ic_flags&~ICG_NO_CVT_MASK) {
|
||||
ICMov(tmpi,
|
||||
MDF_DISP+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
} else {
|
||||
tmpi->ic_flags=(tmpi->ic_flags|tmpi1->ic_flags)&
|
||||
~ICF_CODE_FINAL|ICF_DONT_RESTORE;
|
||||
tmpi->arg1.disp=tmpi1->ic_data;
|
||||
OptSetNOP1(tmpi1); //This better not be last pass!
|
||||
ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
}
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICBrBitOps(CIntermediateCode *tmpi,I64 rip,
|
||||
I64 op,I64 op_imm,I64 is,U8 *buf,I64 rip2)
|
||||
{
|
||||
I64 i,t,r1,r2,d1,d2,t1,t2;
|
||||
CICArg *arg1=&tmpi->arg1,*arg2=&tmpi->arg2;
|
||||
Bool short_jmp;
|
||||
CCodeMisc *lb;
|
||||
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
if (tmpi->ic_flags&ICF_SWAP && !(arg2->type&MDF_REG) &&
|
||||
(!(arg2->type&MDF_IMM) ||arg2->disp>63)||
|
||||
!(tmpi->ic_flags&ICF_SWAP) && arg2->type&MDF_IMM &&
|
||||
arg2->disp<64 || arg2->type&MDF_STK) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,arg2->type,arg2->reg,arg2->disp,rip2);
|
||||
t2=MDF_REG+RT_I64;
|
||||
r2=REG_RCX;
|
||||
d2=0;
|
||||
} else {
|
||||
t2=arg2->type;
|
||||
if (t2&MDF_IMM && arg2->disp<64)
|
||||
r2=0;
|
||||
else
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
}
|
||||
if (!(tmpi->ic_flags&ICF_SWAP) && !(arg1->type&MDF_REG) &&
|
||||
(!(arg1->type&MDF_IMM) || arg1->disp>63) ||
|
||||
tmpi->ic_flags&ICF_SWAP && arg1->type&MDF_IMM &&
|
||||
arg1->disp<64 || arg1->type&MDF_STK) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,arg1->type,arg1->reg,arg1->disp,rip2);
|
||||
t1=MDF_REG+RT_I64;
|
||||
r1=REG_RDX;
|
||||
d1=0;
|
||||
} else {
|
||||
t1=arg1->type;
|
||||
if (t1&MDF_IMM && arg1->disp<64)
|
||||
r1=0;
|
||||
else
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
}
|
||||
} else {
|
||||
t1=MDF_DISP+RT_I64;
|
||||
t2=MDF_DISP+RT_I64;
|
||||
d1=0;
|
||||
d2=0;
|
||||
if (arg2->type&MDF_REG)
|
||||
r2=arg2->reg;
|
||||
else if (!(tmpi->ic_flags&ICF_SWAP) || !(arg2->type&MDF_IMM) ||
|
||||
arg2->disp>63) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,arg2->type,arg2->reg,arg2->disp,rip2);
|
||||
r2=REG_RCX;
|
||||
} else
|
||||
r2=0;
|
||||
if (arg1->type&MDF_REG)
|
||||
r1=arg1->reg;
|
||||
else if (tmpi->ic_flags&ICF_SWAP ||
|
||||
!(arg1->type&MDF_IMM) || arg1->disp>63) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,arg1->type,arg1->reg,arg1->disp,rip2);
|
||||
r1=REG_RDX;
|
||||
} else
|
||||
r1=0;
|
||||
}
|
||||
if (tmpi->ic_flags&ICF_LOCK && op!=0xA30F)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
if (tmpi->ic_flags&ICF_SWAP) {
|
||||
if (arg2->type&MDF_IMM && arg2->disp<32) {
|
||||
if (op==0xA30F && arg2->disp<8) {
|
||||
t=t1&MDG_MASK+RT_U8;
|
||||
op_imm=0xF6; //TEST
|
||||
} else
|
||||
t=t1&MDG_MASK+RT_U32;
|
||||
} else
|
||||
t=t1;
|
||||
i=ICModr1(r2,t,r1,d1);
|
||||
SwapI64(&arg1,&arg2);
|
||||
} else {
|
||||
if (arg1->type&MDF_IMM && arg1->disp<32) {
|
||||
if (op==0xA30F && arg1->disp<8) {
|
||||
t=t2&MDG_MASK+RT_U8;
|
||||
op_imm=0xF6; //TEST
|
||||
} else
|
||||
t=t2&MDG_MASK+RT_U32;
|
||||
} else
|
||||
t=t2;
|
||||
i=ICModr1(r1,t,r2,d2);
|
||||
}
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
if (op_imm==0xF6) {//TEST
|
||||
ICU16(tmpi,i.u8[2]<<8+op_imm);
|
||||
ICModr2(tmpi,i,,arg2->disp,rip2+1);
|
||||
ICU8(tmpi,1<<arg1->disp);
|
||||
if (is==0x72820F)
|
||||
is=0x75850F;
|
||||
else
|
||||
is=0x74840F;
|
||||
} else if (arg1->type&MDF_IMM && arg1->disp<64) {
|
||||
ICU24(tmpi,i.u8[2]<<16+op_imm);
|
||||
ICModr2(tmpi,i,,arg2->disp,rip2+1);
|
||||
ICU8(tmpi,arg1->disp);
|
||||
} else {
|
||||
ICU24(tmpi,i.u8[2]<<16+op);
|
||||
ICModr2(tmpi,i,,arg2->disp,rip2);
|
||||
}
|
||||
|
||||
rip+=tmpi->ic_cnt;
|
||||
lb=OptLabelFwd(tmpi->ic_data);
|
||||
short_jmp=ToBool(tmpi->ic_flags&ICF_SHORT_JMP);
|
||||
if (!buf && lb->addr!=INVALID_PTR) {
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
if (I8_MIN<=i<=I8_MAX)
|
||||
short_jmp=TRUE;
|
||||
}
|
||||
|
||||
if (short_jmp) {
|
||||
tmpi->ic_flags|=ICF_SHORT_JMP;
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
ICU16(tmpi,i<<8+is.u8[2]);
|
||||
} else {
|
||||
tmpi->ic_flags&=~ICF_SHORT_JMP;
|
||||
i=lb->addr-(rip+6);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
ICU16(tmpi,is.u16[0]);
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICQueInit(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 r1;
|
||||
if (tmpi->arg1.type==MDF_REG+RT_I64)
|
||||
r1=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
r1=REG_RAX;
|
||||
}
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r1,0,MDF_REG+RT_I64,r1,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r1,sizeof(U8 *),MDF_REG+RT_I64,r1,0,rip2);
|
||||
}
|
||||
|
||||
U0 ICQueIns(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 r1,r2;
|
||||
if (tmpi->arg2.type==MDF_REG+RT_I64 && tmpi->arg2.reg!=REG_RDX)
|
||||
r2=tmpi->arg2.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);
|
||||
r2=REG_RAX;
|
||||
}
|
||||
if (tmpi->arg1.type==MDF_REG+RT_I64)
|
||||
r1=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
r1=REG_RDX;
|
||||
}
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,MDF_DISP+RT_I64,r1,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r1,0,MDF_REG+RT_I64,r2,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r2,0,MDF_REG+RT_I64,REG_RBX,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r2,sizeof(U8 *),MDF_REG+RT_I64,r1,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,REG_RBX,sizeof(U8 *),MDF_REG+RT_I64,r2,0,rip2);
|
||||
}
|
||||
|
||||
U0 ICQueInsRev(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 r1,r2;
|
||||
if (tmpi->arg2.type==MDF_REG+RT_I64 && tmpi->arg2.reg!=REG_RDX)
|
||||
r2=tmpi->arg2.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);
|
||||
r2=REG_RAX;
|
||||
}
|
||||
if (tmpi->arg1.type==MDF_REG+RT_I64)
|
||||
r1=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
r1=REG_RDX;
|
||||
}
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,MDF_DISP+RT_I64,r1,sizeof(U8 *),rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,REG_RBX,0,MDF_REG+RT_I64,r2,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r2,0,MDF_REG+RT_I64,r1,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r2,sizeof(U8 *),MDF_REG+RT_I64,REG_RBX,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r1,sizeof(U8 *),MDF_REG+RT_I64,r2,0,rip2);
|
||||
}
|
||||
|
||||
U0 ICQueRem(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 r1;
|
||||
if (tmpi->arg1.type==MDF_REG+RT_I64)
|
||||
r1=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
r1=REG_RAX;
|
||||
}
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,MDF_DISP+RT_I64,r1,0,rip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_I64,r1,sizeof(U8 *),rip2);
|
||||
ICU24(tmpi,0x1A8948);
|
||||
ICU32(tmpi,sizeof(U8 *)<<24+0x538948);
|
||||
}
|
||||
|
||||
U0 ICMinMax(CIntermediateCode *tmpi,I64 op,I64 rip2)
|
||||
{
|
||||
I64 r1,i1=0x48;
|
||||
if (tmpi->arg2.type==MDF_REG+RT_I64 && tmpi->arg2.reg!=REG_RAX) {
|
||||
r1=tmpi->arg2.reg;
|
||||
if (r1>7) {
|
||||
i1++;
|
||||
r1&=7;
|
||||
}
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
} else {
|
||||
if (tmpi->arg1.reg==REG_RAX && tmpi->arg1.type&MDG_REG_DISP_SIB) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);
|
||||
r1=REG_RDX;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);
|
||||
if (tmpi->arg1.type==MDF_REG+RT_I64) {
|
||||
r1=tmpi->arg1.reg;
|
||||
if (r1>7) {
|
||||
i1++;
|
||||
r1&=7;
|
||||
}
|
||||
} else {
|
||||
r1=REG_RDX;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
}
|
||||
}
|
||||
}
|
||||
ICU24(tmpi,0xC03B00+r1<<16+i1);
|
||||
ICU32(tmpi,0xC0000F00+op<<16+r1<<24+i1);
|
||||
}
|
||||
|
||||
U0 ICSqr(CIntermediateCode *tmpi,I64 op,I64 rip2)
|
||||
{
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
ICSlashOp(tmpi,MDF_REG+RT_I64,REG_RAX,0,op,rip2);
|
||||
}
|
||||
|
||||
U0 ICModU64(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
CICType t1;
|
||||
I64 r1,d1;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);
|
||||
if (tmpi->arg1.reg!=REG_RAX && tmpi->arg1.reg!=REG_RDX &&
|
||||
tmpi->arg1.type&MDG_REG_DISP_SIB &&
|
||||
tmpi->arg1.type.raw_type>=RT_I64) {
|
||||
t1=tmpi->arg1.type;
|
||||
r1=tmpi->arg1.reg;
|
||||
d1=tmpi->arg1.disp;
|
||||
} else {
|
||||
t1=MDF_REG+RT_I64;
|
||||
r1=REG_RBX;
|
||||
d1=0;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
}
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+RT_I64,REG_RCX,0,rip2);
|
||||
ICZero(tmpi,REG_RDX);
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_DIV,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,REG_RCX,0,MDF_REG+RT_I64,REG_RAX,0,rip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
MDF_REG+RT_I64,REG_RDX,0,rip2);
|
||||
}
|
||||
|
||||
U0 ICSwap(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 r1,r2;
|
||||
if (tmpi->arg1.type&MDF_REG)
|
||||
r1=tmpi->arg1.reg;
|
||||
else
|
||||
r1=REG_RAX;
|
||||
if (tmpi->arg2.type&MDF_REG)
|
||||
r2=tmpi->arg2.reg;
|
||||
else
|
||||
r2=REG_RAX;
|
||||
if (r1==r2) {
|
||||
if (r1==REG_RAX)
|
||||
r1=REG_RBX;
|
||||
else
|
||||
r2=REG_RAX;
|
||||
}
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r2,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r1,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
switch (tmpi->ic_code) {
|
||||
case IC_SWAP_U8:
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_U8,r1,0,rip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U8,r2,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U8,r2,0,MDF_REG+RT_I64,REG_RCX,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U8,r1,0,MDF_REG+RT_I64,REG_RDX,0,rip2);
|
||||
break;
|
||||
case IC_SWAP_U16:
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_U16,r1,0,rip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U16,r2,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U16,r2,0,MDF_REG+RT_I64,REG_RCX,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U16,r1,0,MDF_REG+RT_I64,REG_RDX,0,rip2);
|
||||
break;
|
||||
case IC_SWAP_U32:
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_U32,r1,0,rip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U32,r2,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U32,r2,0,MDF_REG+RT_I64,REG_RCX,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U32,r1,0,MDF_REG+RT_I64,REG_RDX,0,rip2);
|
||||
break;
|
||||
case IC_SWAP_I64:
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_U64,r1,0,rip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U64,r2,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U64,r2,0,MDF_REG+RT_I64,REG_RCX,0,rip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U64,r1,0,MDF_REG+RT_I64,REG_RDX,0,rip2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICAndEqu(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 i,bit;
|
||||
if (tmpi->arg2.type&MDF_IMM && !(tmpi->arg1.type&MDF_STK) &&
|
||||
tmpi->ic_flags&ICF_RES_NOT_USED) {
|
||||
i=~tmpi->arg2.disp;
|
||||
bit=Bsf(i);
|
||||
if (0<=bit==Bsr(i)) {
|
||||
tmpi->arg2.disp=bit;
|
||||
tmpi->arg2.reg=0;
|
||||
tmpi->arg1.type=tmpi->arg1.type&MDG_MASK+RT_I64;
|
||||
ICBitOps(tmpi,&tmpi->arg2,&tmpi->arg1,tmpi,0xB30F,0x30BA0F,rip2);
|
||||
return;
|
||||
}
|
||||
}
|
||||
ICAddSubEctEqu(tmpi,tmpi->arg1_type_pointed_to,
|
||||
tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,0x210425240423,rip2);
|
||||
}
|
||||
|
||||
U0 ICOrEqu(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 i,bit;
|
||||
if (tmpi->arg2.type&MDF_IMM && !(tmpi->arg1.type&MDF_STK) &&
|
||||
tmpi->ic_flags&ICF_RES_NOT_USED) {
|
||||
i=tmpi->arg2.disp;
|
||||
bit=Bsf(i);
|
||||
if (0<=bit==Bsr(i) && i>I8_MAX) {
|
||||
tmpi->arg2.disp=bit;
|
||||
tmpi->arg2.reg=0;
|
||||
tmpi->arg1.type=tmpi->arg1.type&MDG_MASK+RT_I64;
|
||||
ICBitOps(tmpi,&tmpi->arg2,&tmpi->arg1,tmpi,0xAB0F,0x28BA0F,rip2);
|
||||
return;
|
||||
}
|
||||
}
|
||||
ICAddSubEctEqu(tmpi,tmpi->arg1_type_pointed_to,
|
||||
tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,0x09010D0C010B,rip2);
|
||||
}
|
||||
|
||||
U0 ICXorEqu(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 i,bit;
|
||||
if (tmpi->arg2.type&MDF_IMM && !(tmpi->arg1.type&MDF_STK) &&
|
||||
tmpi->ic_flags&ICF_RES_NOT_USED) {
|
||||
i=tmpi->arg2.disp;
|
||||
bit=Bsf(i);
|
||||
if (0<=bit==Bsr(i)) {
|
||||
tmpi->arg2.disp=bit;
|
||||
tmpi->arg2.reg=0;
|
||||
tmpi->arg1.type=tmpi->arg1.type&MDG_MASK+RT_I64;
|
||||
ICBitOps(tmpi,&tmpi->arg2,&tmpi->arg1,tmpi,0xBB0F,0x38BA0F,rip2);
|
||||
return;
|
||||
}
|
||||
}
|
||||
ICAddSubEctEqu(tmpi,tmpi->arg1_type_pointed_to,
|
||||
tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,0x310635340633,rip2);
|
||||
}
|
||||
|
||||
U0 ICSwitch(CIntermediateCode *tmpi,I64 rip,
|
||||
Bool nobound,CCmpCtrl *cc,U8 *buf,I64 rip2)
|
||||
{
|
||||
I64 i,j,cnt,min,max,begin,r;
|
||||
CCodeMisc *lb;
|
||||
Bool short_jmp;
|
||||
CAOTAbsAddr *tmpa;
|
||||
if (!(tmpi->arg1.type&MDF_REG) || tmpi->arg1.reg&7==REG_RSP)
|
||||
r=REG_RDX;
|
||||
else
|
||||
r=tmpi->arg1.reg;
|
||||
if (nobound)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
else {
|
||||
if (tmpi->arg2.type&MDF_IMM) {
|
||||
j=tmpi->arg2.disp;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
if (I8_MIN<=j<=I8_MAX) {
|
||||
i=0xF88348+(r&7)<<16;
|
||||
if (r>7) i++;
|
||||
ICU24(tmpi,i);
|
||||
ICU8(tmpi,j);
|
||||
} else if (I32_MIN<=j<=I32_MAX) {
|
||||
i=0xF88148+(r&7)<<16;
|
||||
if (r>7) i++;
|
||||
ICU24(tmpi,i);
|
||||
ICU32(tmpi,j);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);
|
||||
i=0xC13B48+(r&7)<<19;
|
||||
if (r>7) i+=4;
|
||||
ICU24(tmpi,i);
|
||||
}
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
i=0xC13B48+(r&7)<<19;
|
||||
if (r>7) i+=4;
|
||||
ICU24(tmpi,i);
|
||||
}
|
||||
|
||||
rip+=tmpi->ic_cnt;
|
||||
lb=tmpi->ic_data(CCodeMisc *)->dft;
|
||||
short_jmp=ToBool(tmpi->ic_flags&ICF_SHORT_JMP);
|
||||
if (!buf && lb->addr!=INVALID_PTR) {
|
||||
i=lb->addr-(rip+2);
|
||||
if (I8_MIN<=i<=I8_MAX)
|
||||
short_jmp=TRUE;
|
||||
}
|
||||
if (short_jmp) {
|
||||
tmpi->ic_flags|=ICF_SHORT_JMP;
|
||||
ICU16(tmpi,(lb->addr-(rip+2))<<8+0x73);
|
||||
} else {
|
||||
tmpi->ic_flags&=~ICF_SHORT_JMP;
|
||||
ICU16(tmpi,0x830F);
|
||||
ICU32(tmpi,lb->addr-(rip+6));
|
||||
}
|
||||
}
|
||||
|
||||
lb=tmpi->ic_data;
|
||||
begin=lb->begin->addr;
|
||||
if (!buf && begin!=INVALID_PTR) {
|
||||
min=I64_MAX;
|
||||
max=I64_MIN;
|
||||
for (i=0;i<lb->range;i++) {
|
||||
if (lb->jmp_table[i]->addr==INVALID_PTR) {
|
||||
min=I64_MIN;
|
||||
max=I64_MAX;
|
||||
break;
|
||||
} else {
|
||||
j=lb->jmp_table[i]->addr-begin;
|
||||
min=MinI64(min,j);
|
||||
max=MaxI64(max,j);
|
||||
}
|
||||
}
|
||||
if (I8_MIN<=min<=max<=I8_MAX)
|
||||
lb->flags|=CMF_I8_JMP_TABLE;
|
||||
else if (U8_MIN<=min<=max<=U8_MAX)
|
||||
lb->flags|=CMF_U8_JMP_TABLE;
|
||||
else if (I16_MIN<=min<=max<=I16_MAX)
|
||||
lb->flags|=CMF_I16_JMP_TABLE;
|
||||
else if (U16_MIN<=min<=max<=U16_MAX)
|
||||
lb->flags|=CMF_U16_JMP_TABLE;
|
||||
}
|
||||
|
||||
if (lb->flags&CMF_I8_JMP_TABLE) {
|
||||
if (r<8)
|
||||
ICU8(tmpi,0x48);
|
||||
else
|
||||
ICU8(tmpi,0x49);
|
||||
ICU24(tmpi,0x98BE0F+(r&7)<<16);
|
||||
cnt=1;
|
||||
} else if (lb->flags&CMF_U8_JMP_TABLE) {
|
||||
if (r<8)
|
||||
cnt=2;
|
||||
else {
|
||||
ICU8(tmpi,0x49);
|
||||
cnt=1;
|
||||
}
|
||||
ICU24(tmpi,0x98B60F+(r&7)<<16);
|
||||
} else if (lb->flags&CMF_I16_JMP_TABLE) {
|
||||
if (r<8)
|
||||
ICU8(tmpi,0x48);
|
||||
else
|
||||
ICU8(tmpi,0x4A);
|
||||
ICU32(tmpi,0x451CBF0F+(r&7)<<27);
|
||||
cnt=0;
|
||||
} else if (lb->flags&CMF_U16_JMP_TABLE) {
|
||||
if (r<8)
|
||||
cnt=1;
|
||||
else {
|
||||
ICU8(tmpi,0x4A);
|
||||
cnt=0;
|
||||
}
|
||||
ICU32(tmpi,0x451CB70F+(r&7)<<27);
|
||||
} else {
|
||||
if (r<8)
|
||||
cnt=2;
|
||||
else {
|
||||
ICU8(tmpi,0x42);
|
||||
cnt=1;
|
||||
}
|
||||
ICU24(tmpi,0x851C8B+(r&7)<<19);
|
||||
}
|
||||
if (buf && cc->flags&CCF_AOT_COMPILE) {
|
||||
tmpa=CAlloc(sizeof(CAOTAbsAddr));
|
||||
tmpa->next=cc->aotc->abss;
|
||||
tmpa->type=AAT_ADD_U32;
|
||||
cc->aotc->abss=tmpa;
|
||||
tmpa->rip=rip2+tmpi->ic_cnt;
|
||||
ICU32(tmpi,lb->addr+cc->aotc->rip);
|
||||
} else
|
||||
ICU32(tmpi,lb->addr+buf);
|
||||
|
||||
if (lb->flags&(CMF_I8_JMP_TABLE|CMF_U8_JMP_TABLE|
|
||||
CMF_I16_JMP_TABLE|CMF_U16_JMP_TABLE)) {
|
||||
ICU16(tmpi,0xC381); //ADD EBX,0x12345678
|
||||
if (buf && cc->flags&CCF_AOT_COMPILE) {
|
||||
tmpa=CAlloc(sizeof(CAOTAbsAddr));
|
||||
tmpa->next=cc->aotc->abss;
|
||||
tmpa->type=AAT_ADD_U32;
|
||||
cc->aotc->abss=tmpa;
|
||||
tmpa->rip=rip2+tmpi->ic_cnt;
|
||||
ICU32(tmpi,begin+cc->aotc->rip);
|
||||
} else
|
||||
ICU32(tmpi,begin+buf);
|
||||
} else
|
||||
cnt+=6;
|
||||
ICU16(tmpi,0xE3FF); //JMP EBX
|
||||
for (i=0;i<cnt;i++) //Code must always shrink, not expand
|
||||
ICU8(tmpi,OC_NOP);
|
||||
tmpi->ic_flags&=~ICF_CODE_FINAL;
|
||||
}
|
||||
|
||||
U0 ICLocalVarInit(CIntermediateCode *tmpi)
|
||||
{
|
||||
ICU24(tmpi,0xC48B48);
|
||||
ICU16(tmpi,0x5748);
|
||||
ICU24(tmpi,0xF88B48);
|
||||
ICU24(tmpi,0xC1C748);
|
||||
ICU32(tmpi,tmpi->ic_data);
|
||||
ICU16(tmpi,sys_var_init_val<<8+0xB0);
|
||||
ICU24(tmpi,0xAA48F3);
|
||||
ICU16(tmpi,0x5F48);
|
||||
}
|
||||
@@ -0,0 +1,607 @@
|
||||
#define CN_A2 0
|
||||
#define CN_A1 1
|
||||
#define CN_INST 2
|
||||
#define CN_RES 3
|
||||
|
||||
U0 CmpNoteFloatOp(CCmpCtrl *cc,CIntermediateCode *tmpi,
|
||||
Bool dont_pushable,Bool dont_popable,I64 pos)
|
||||
{
|
||||
Bool link=FALSE;
|
||||
if (cc->pass==7 && cc->last_float_op_ic &&
|
||||
cc->last_dont_popable && dont_pushable) {
|
||||
switch [pos] {
|
||||
case CN_A2:
|
||||
if (cc->last_float_op_ic!=tmpi && cc->dont_push_float)
|
||||
link=TRUE;
|
||||
break;
|
||||
case CN_A1:
|
||||
if (cc->last_float_op_ic!=tmpi && cc->dont_push_float)
|
||||
link=TRUE;
|
||||
break;
|
||||
case CN_INST:
|
||||
if (cc->last_float_op_ic!=tmpi) {
|
||||
if (cc->dont_push_float) {
|
||||
if (intermediate_code_table[tmpi->ic_code].arg_cnt==IS_2_ARG &&
|
||||
cc->last_float_op_ic->res.reg!=REG_R8)
|
||||
tmpi->ic_flags|=ICF_ALT_TEMPLATE;
|
||||
else
|
||||
tmpi->ic_flags&=~ICF_ALT_TEMPLATE;
|
||||
link=TRUE;
|
||||
}
|
||||
} else {
|
||||
if (intermediate_code_table[tmpi->ic_code].arg_cnt==IS_2_ARG &&
|
||||
cc->last_float_op_pos!=CN_A1)
|
||||
tmpi->ic_flags|=ICF_ALT_TEMPLATE;
|
||||
else
|
||||
tmpi->ic_flags&=~ICF_ALT_TEMPLATE;
|
||||
link=TRUE;
|
||||
}
|
||||
break;
|
||||
case CN_RES:
|
||||
if (cc->last_float_op_ic==tmpi && cc->last_float_op_pos==CN_INST)
|
||||
link=TRUE;
|
||||
break;
|
||||
}
|
||||
if (link) {
|
||||
if (!Bts(&cc->last_float_op_ic->ic_flags,
|
||||
ICf_DONT_POP_FLOAT0+cc->last_ic_float_op_num))
|
||||
cc->last_float_op_ic->ic_flags&=~ICF_CODE_FINAL;
|
||||
if (!Bts(&tmpi->ic_flags,ICf_DONT_PUSH_FLOAT0+cc->cur_ic_float_op_num))
|
||||
tmpi->ic_flags&=~ICF_CODE_FINAL;
|
||||
}
|
||||
}
|
||||
cc->last_float_op_ic=tmpi;
|
||||
cc->last_dont_pushable=dont_pushable;
|
||||
cc->last_dont_popable=dont_popable;
|
||||
cc->last_ic_float_op_num=cc->cur_ic_float_op_num++;
|
||||
cc->last_float_op_pos=pos;
|
||||
if (cc->cur_ic_float_op_num>4)
|
||||
throw('Compiler');
|
||||
}
|
||||
|
||||
U0 CmpSetFloatOpPushPop(CCmpCtrl *cc,CIntermediateCode *tmpi,
|
||||
Bool *dont_push_float,Bool *dont_pop_float)
|
||||
{
|
||||
if (cc->pass==7) {
|
||||
*dont_push_float=FALSE;
|
||||
*dont_pop_float =FALSE;
|
||||
tmpi->ic_flags&=~ICF_CODE_FINAL;
|
||||
} else {
|
||||
*dont_push_float=Bt(&tmpi->ic_flags,
|
||||
ICf_DONT_PUSH_FLOAT0+cc->cur_ic_float_op_num);
|
||||
*dont_pop_float=Bt(&tmpi->ic_flags,
|
||||
ICf_DONT_POP_FLOAT0+cc->cur_ic_float_op_num);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICCopyTemplate(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,
|
||||
Bool off_the_record,Bool dont_pushable,Bool dont_popable,I64 pos)
|
||||
{
|
||||
Bool dont_push_float,dont_pop_float,alt;
|
||||
U8 *ptr;
|
||||
I64 i=0;
|
||||
if (!off_the_record) {
|
||||
if (tmpi->ic_flags&ICF_ALT_TEMPLATE)
|
||||
alt=TRUE;
|
||||
else
|
||||
alt=FALSE;
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
} else {
|
||||
dont_push_float=FALSE;
|
||||
dont_pop_float=FALSE;
|
||||
alt=FALSE;
|
||||
}
|
||||
if (alt && dont_push_float && !dont_pop_float) {
|
||||
ptr=cmp_templates_dont_push2[op];
|
||||
i=cmp_templates_dont_push2[op+1]-ptr;
|
||||
}
|
||||
if (!i) {
|
||||
if (dont_push_float) {
|
||||
if (dont_pop_float) {
|
||||
ptr=cmp_templates_dont_push_pop[op];
|
||||
i=cmp_templates_dont_push_pop[op+1]-ptr;
|
||||
} else {
|
||||
ptr=cmp_templates_dont_push[op];
|
||||
i=cmp_templates_dont_push[op+1]-ptr;
|
||||
}
|
||||
} else {
|
||||
if (dont_pop_float) {
|
||||
ptr=cmp_templates_dont_pop[op];
|
||||
i=cmp_templates_dont_pop[op+1]-ptr;
|
||||
} else {
|
||||
ptr=cmp_templates[op];
|
||||
i=cmp_templates[op+1]-ptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
MemCpy(&tmpi->ic_body[tmpi->ic_cnt],ptr,i);
|
||||
if (!off_the_record)
|
||||
CmpNoteFloatOp(cc,tmpi,dont_pushable,dont_popable,pos);
|
||||
tmpi->ic_cnt+=i;
|
||||
}
|
||||
|
||||
U0 ICFCvt(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 r1,
|
||||
CICType t2,I64 r2,I64 d2,Bool to_int,I64 pos,I64 rip)
|
||||
{
|
||||
I64 rsp_size=0,op1,op2;
|
||||
Bool dont_push_float,dont_pop_float;
|
||||
|
||||
if (to_int) {
|
||||
op1=SLASH_OP_FLD;
|
||||
op2=SLASH_OP_FISTTP;
|
||||
} else {
|
||||
op1=SLASH_OP_FILD;
|
||||
op2=SLASH_OP_FSTP;
|
||||
}
|
||||
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
if (!dont_push_float) {
|
||||
if (!(t2.raw_type>=RT_I64 && t2&MDG_DISP_SIB_RIP)) {
|
||||
ICPush(tmpi,t2,r2,d2,rip);
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
rsp_size=8;
|
||||
} else {
|
||||
if (!dont_pop_float) {
|
||||
rsp_size=8;
|
||||
ICAddRSP(tmpi,-8);
|
||||
}
|
||||
}
|
||||
ICSlashOp(tmpi,t2,r2,d2,op1,rip);
|
||||
} else {
|
||||
if (!dont_pop_float) {
|
||||
rsp_size=8;
|
||||
ICAddRSP(tmpi,-8);
|
||||
}
|
||||
}
|
||||
if (to_int)
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,FALSE,pos);
|
||||
else
|
||||
CmpNoteFloatOp(cc,tmpi,FALSE,TRUE,pos);
|
||||
if (dont_pop_float) {
|
||||
if (rsp_size)
|
||||
ICAddRSP(tmpi,rsp_size);
|
||||
} else {
|
||||
ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,op2,rip);
|
||||
ICPop(tmpi,MDF_REG+RT_I64,r1,0,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICFCvt2(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 r1,
|
||||
CICType t2,I64 r2,I64 d2,Bool to_int,I64 rip)
|
||||
{
|
||||
I64 rsp_size=0,op1,op2;
|
||||
if (to_int) {
|
||||
op1=SLASH_OP_FLD;
|
||||
op2=SLASH_OP_FISTTP;
|
||||
} else {
|
||||
op1=SLASH_OP_FILD;
|
||||
op2=SLASH_OP_FSTP;
|
||||
}
|
||||
if (!(t2.raw_type>=RT_I64 && t2&MDG_DISP_SIB_RIP)) {
|
||||
ICPush(tmpi,t2,r2,d2,rip);
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
rsp_size=8;
|
||||
} else {
|
||||
rsp_size=8;
|
||||
ICAddRSP(tmpi,-8);
|
||||
}
|
||||
ICSlashOp(tmpi,t2,r2,d2,op1,rip);
|
||||
ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,op2,rip);
|
||||
ICPop(tmpi,MDF_REG+RT_I64,r1,0,rip);
|
||||
cc->last_dont_pushable=cc->last_dont_popable=FALSE; //TODO: improve this
|
||||
}
|
||||
|
||||
U0 ICFUnaryMinus(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf2,I64 rip)
|
||||
{
|
||||
CICArg *arg1=&tmpi->arg1;
|
||||
I64 rsp_size=0,builtin1=0,t1,r1,d1;
|
||||
Bool dont_push_float,dont_pop_float;
|
||||
|
||||
if (cc->flags&CCF_AOT_COMPILE)
|
||||
buf2=cc->aotc->rip;
|
||||
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
if (!dont_push_float) {
|
||||
if (arg1->type.raw_type>=RT_I64 && arg1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=arg1->type;
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
} else {
|
||||
if (arg1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(arg1->disp(F64)))) {
|
||||
t1=MDF_RIP_DISP32+RT_I64;
|
||||
r1=REG_RIP;
|
||||
d1=COCFloatConstFind(cc,arg1->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,arg1->type,arg1->reg,arg1->disp,rip);
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
|
||||
rsp_size+=8;
|
||||
}
|
||||
}
|
||||
if (builtin1)
|
||||
ICU16(tmpi,builtin1);
|
||||
else
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_FLD,rip);
|
||||
}
|
||||
if (!dont_pop_float && !rsp_size) {
|
||||
rsp_size=8;
|
||||
ICAddRSP(tmpi,-8);
|
||||
}
|
||||
ICU16(tmpi,0xE0D9); //FCHS
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,TRUE,CN_INST);
|
||||
if (dont_pop_float) {
|
||||
if (rsp_size)
|
||||
ICAddRSP(tmpi,rsp_size);
|
||||
} else {
|
||||
ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,rip);
|
||||
ICPop(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICFMod(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 rip)
|
||||
{//for MOD
|
||||
Bool dont_push_float,dont_pop_float;
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
if (dont_push_float) {
|
||||
if (tmpi->ic_flags&ICF_ALT_TEMPLATE)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
}
|
||||
//TODO: unpushable,unpop? Not sure
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_INST);
|
||||
if (!dont_pop_float)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICFPow(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 rip)
|
||||
{//for POW
|
||||
I64 i;
|
||||
CAOTImportExport *tmpie;
|
||||
CHashExport *tmpex=HashFind("SYS_POW",
|
||||
cc->htc.hash_table_lst,HTT_EXPORT_SYS_SYM);
|
||||
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
if (cc->flags&CCF_AOT_COMPILE) {
|
||||
if (!tmpex) {
|
||||
tmpex=CAlloc(sizeof(CHashExport));
|
||||
tmpex->str=StrNew("SYS_POW");
|
||||
tmpex->type=HTT_EXPORT_SYS_SYM|HTF_UNRESOLVED|HTF_IMPORT;
|
||||
HashAdd(tmpex,cc->htc.glbl_hash_table);
|
||||
}
|
||||
if (tmpex->type&HTF_IMPORT) {
|
||||
if (GetOption(OPTf_USE_IMM64)) {
|
||||
ICU16(tmpi,0xBB48);
|
||||
ICU64(tmpi,0);
|
||||
if (buf) {
|
||||
tmpie=CAlloc(sizeof(CAOTImportExport));
|
||||
tmpie->type=IET_IMM_I64;
|
||||
tmpie->rip=rip+tmpi->ic_cnt-8;
|
||||
tmpie->next=tmpex->ie_lst;
|
||||
tmpex->ie_lst=tmpie;
|
||||
}
|
||||
ICU16(tmpi,0xD3FF);
|
||||
} else {
|
||||
ICU8(tmpi,0xE8);
|
||||
ICU32(tmpi,-(rip+tmpi->ic_cnt+4));
|
||||
if (buf) {
|
||||
tmpie=CAlloc(sizeof(CAOTImportExport));
|
||||
tmpie->type=IET_REL_I32;
|
||||
tmpie->rip=rip+tmpi->ic_cnt-4;
|
||||
tmpie->next=tmpex->ie_lst;
|
||||
tmpex->ie_lst=tmpie;
|
||||
}
|
||||
}
|
||||
} else {//Kernel
|
||||
if (tmpex->type&HTF_UNRESOLVED)
|
||||
throw('Compiler');
|
||||
else {
|
||||
i=tmpex->val-(rip+tmpi->ic_cnt+5);
|
||||
if (!(I32_MIN<=i<=I32_MAX)) {
|
||||
throw('Compiler');
|
||||
// ICU16(tmpi,0xBB48);
|
||||
// ICU64(tmpi,tmpex->val);
|
||||
// ICU16(tmpi,0xD3FF);
|
||||
} else {
|
||||
ICU8(tmpi,0xE8);
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
i=tmpex->val-(rip+tmpi->ic_cnt+5);
|
||||
if (!(I32_MIN<=i<=I32_MAX)) {
|
||||
ICU16(tmpi,0xBB48);
|
||||
ICU64(tmpi,tmpex->val);
|
||||
ICU16(tmpi,0xD3FF);
|
||||
} else {
|
||||
ICU8(tmpi,0xE8);
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
}
|
||||
tmpi->ic_flags&=~ICF_CODE_FINAL;
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICFOp(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,U8 *buf2,I64 rip)
|
||||
{//for ADD,SUB,DIV,MUL
|
||||
CICArg *arg1,*arg2;
|
||||
Bool dont_push_float,dont_pop_float,alt;
|
||||
I64 rsp_size=0,builtin1=0,builtin2=0,t1,r1,d1,t2,r2,d2;
|
||||
|
||||
if (tmpi->ic_flags&ICF_ALT_TEMPLATE) {
|
||||
arg1=&tmpi->arg2;
|
||||
arg2=&tmpi->arg1;
|
||||
alt=TRUE;
|
||||
} else {
|
||||
arg1=&tmpi->arg1;
|
||||
arg2=&tmpi->arg2;
|
||||
alt=FALSE;
|
||||
}
|
||||
|
||||
if (cc->flags&CCF_AOT_COMPILE)
|
||||
buf2=cc->aotc->rip;
|
||||
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
if (dont_push_float) {
|
||||
if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=arg2->type;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
} else {
|
||||
if (arg2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64)))) {
|
||||
t2=MDF_RIP_DISP32+RT_I64;
|
||||
r2=REG_RIP;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,arg2->type,arg2->reg,arg2->disp,rip);
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
rsp_size+=8;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (alt) {
|
||||
if (!(arg2->type&MDF_STK)) {
|
||||
if (arg1->type.raw_type>=RT_I64 && arg1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=arg1->type;
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
} else {
|
||||
if (arg1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(arg1->disp(F64)))) {
|
||||
t1=MDF_RIP_DISP32+RT_I64;
|
||||
r1=REG_RIP;
|
||||
d1=COCFloatConstFind(cc,arg1->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,arg1->type,arg1->reg,arg1->disp,rip);
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
|
||||
rsp_size+=8;
|
||||
}
|
||||
}
|
||||
if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=arg2->type;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
} else {
|
||||
if (arg2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64)))) {
|
||||
t2=MDF_RIP_DISP32+RT_I64;
|
||||
r2=REG_RIP;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,arg2->type,arg2->reg,arg2->disp,rip);
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
rsp_size+=8;
|
||||
if (r1==REG_RSP+REG_RSP<<8)
|
||||
d1+=8;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,arg1->type,
|
||||
arg1->reg,arg1->disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type,
|
||||
arg2->reg,arg2->disp,rip);
|
||||
ICU16(tmpi,0x5052); //PUSH EDX PUSH EAX
|
||||
rsp_size=16;
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
}
|
||||
} else {
|
||||
if (!(arg1->type&MDF_STK)) {
|
||||
if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=arg2->type;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
} else {
|
||||
if (arg2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64)))) {
|
||||
t2=MDF_RIP_DISP32+RT_I64;
|
||||
r2=REG_RIP;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,arg2->type,arg2->reg,arg2->disp,rip);
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
rsp_size+=8;
|
||||
}
|
||||
}
|
||||
if (arg1->type.raw_type>=RT_I64 && arg1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=arg1->type;
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
} else {
|
||||
if (arg1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(arg1->disp(F64)))) {
|
||||
t1=MDF_RIP_DISP32+RT_I64;
|
||||
r1=REG_RIP;
|
||||
d1=COCFloatConstFind(cc,arg1->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,arg1->type,arg1->reg,arg1->disp,rip);
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
|
||||
rsp_size+=8;
|
||||
if (r2==REG_RSP+REG_RSP<<8)
|
||||
d2+=8;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type,
|
||||
arg2->reg,arg2->disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,arg1->type,
|
||||
arg1->reg,arg1->disp,rip);
|
||||
ICU16(tmpi,0x5052); //PUSH EDX PUSH EAX
|
||||
rsp_size=16;
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!dont_pop_float && !rsp_size) {
|
||||
rsp_size=8;
|
||||
ICAddRSP(tmpi,-8);
|
||||
}
|
||||
if (!dont_push_float) {
|
||||
if (builtin2 && !builtin1) {
|
||||
alt=!alt;
|
||||
SwapI64(&t1,&t2);
|
||||
SwapI64(&r1,&r2);
|
||||
SwapI64(&d1,&d2);
|
||||
SwapI64(&builtin1,&builtin2);
|
||||
}
|
||||
if (builtin1)
|
||||
ICU16(tmpi,builtin1);
|
||||
else
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_FLD,rip);
|
||||
}
|
||||
if (alt)
|
||||
switch (op.u8[0]) {
|
||||
case 4: op=SLASH_OP_FSUBR; break;
|
||||
case 6: op=SLASH_OP_FDIVR; break;
|
||||
}
|
||||
if (builtin2) {
|
||||
ICU16(tmpi,builtin2);
|
||||
ICU16(tmpi,op.u16[2]);
|
||||
} else
|
||||
ICSlashOp(tmpi,t2,r2,d2,op,rip);
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,TRUE,CN_INST);
|
||||
if (dont_pop_float) {
|
||||
if (rsp_size)
|
||||
ICAddRSP(tmpi,rsp_size);
|
||||
} else {
|
||||
if (rsp_size==8)
|
||||
ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,rip);
|
||||
else if (rsp_size>8) {
|
||||
ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
|
||||
SLASH_OP_FSTP,rip);
|
||||
ICAddRSP(tmpi,rsp_size-8);
|
||||
}
|
||||
ICPop(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICFCmp(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,I64 rip)
|
||||
{
|
||||
Bool dont_push_float,dont_pop_float;
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
if (dont_push_float) {
|
||||
if (tmpi->ic_flags&ICF_ALT_TEMPLATE) {
|
||||
if (tmpi->ic_flags&ICF_POP_CMP)
|
||||
ICPopRegs(tmpi,1<<REG_RAX);
|
||||
else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
} else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
if (tmpi->ic_flags&ICF_POP_CMP)
|
||||
ICPopRegs(tmpi,1<<REG_RDX);
|
||||
else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
}
|
||||
if (tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
ICPushRegs(tmpi,1<<REG_RAX);
|
||||
ICCopyTemplate(cc,tmpi,op,FALSE,TRUE,FALSE,CN_INST);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICFModEqu(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
Bool dont_push_float,dont_pop_float;
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
if (dont_push_float) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,rip);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,rip);
|
||||
}
|
||||
//TODO: unpushable,unpop? Not sure
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_INST);
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,rip);
|
||||
ICMov(tmpi,tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
} else {
|
||||
if (dont_push_float) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,tmpi->arg1.type,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,rip);
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,rip);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,tmpi->arg1.type,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,rip);
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,rip);
|
||||
}
|
||||
//TODO: unpushable,unpop? Not sure
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_INST);
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,rip);
|
||||
ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,631 @@
|
||||
U0 ICFOpEqu(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,U8 *buf2,I64 rip)
|
||||
{//for ADD,SUB,DIV,MUL
|
||||
CICArg *arg1=&tmpi->arg1,
|
||||
*arg2=&tmpi->arg2;
|
||||
Bool dont_push_float,dont_pop_float,p1_mem;
|
||||
I64 rsp_size=0,builtin2=0,
|
||||
t1,r1,d1,t2,r2,d2;
|
||||
|
||||
if (cc->flags&CCF_AOT_COMPILE)
|
||||
buf2=cc->aotc->rip;
|
||||
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
if (dont_pop_float)
|
||||
throw('Compiler');
|
||||
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
p1_mem=FALSE;
|
||||
if (dont_push_float) {
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
arg1->type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
arg1->reg,arg1->disp,rip);
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,rip);
|
||||
ICPush(tmpi,MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
|
||||
rsp_size+=8;
|
||||
} else {
|
||||
if (tmpi->arg1_type_pointed_to>=RT_I64 && arg1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=arg1->type&MDG_MASK+tmpi->arg1_type_pointed_to;
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
p1_mem=TRUE;
|
||||
} else {
|
||||
ICPush(tmpi,arg1->type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
arg1->reg,arg1->disp,rip);
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
|
||||
rsp_size+=8;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64 || arg1->type&MDF_STK) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type,
|
||||
arg2->reg,arg2->disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
arg1->type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
arg1->reg,arg1->disp,rip);
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,rip);
|
||||
ICU16(tmpi,0x5052); //PUSH EDX PUSH EAX
|
||||
rsp_size=16;
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
} else {
|
||||
if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=arg2->type;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
} else {
|
||||
if (arg2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64)))) {
|
||||
t2=MDF_RIP_DISP32+RT_I64;
|
||||
r2=REG_RIP;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,arg2->type,arg2->reg,arg2->disp,rip);
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
rsp_size+=8;
|
||||
}
|
||||
}
|
||||
if (tmpi->arg1_type_pointed_to>=RT_I64 && arg1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=arg1->type&MDG_MASK+tmpi->arg1_type_pointed_to;
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
p1_mem=TRUE;
|
||||
} else {
|
||||
ICPush(tmpi,arg1->type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
arg1->reg,arg1->disp,rip);
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
|
||||
rsp_size+=8;
|
||||
if (r2==REG_RSP+REG_RSP<<8)
|
||||
d2+=8;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!rsp_size && !(p1_mem && tmpi->arg1_type_pointed_to==RT_F64)) {
|
||||
rsp_size=8;
|
||||
ICAddRSP(tmpi,-8);
|
||||
}
|
||||
if (!dont_push_float) {
|
||||
if (builtin2)
|
||||
ICU16(tmpi,builtin2);
|
||||
else
|
||||
ICSlashOp(tmpi,t2,r2,d2,SLASH_OP_FLD,rip);
|
||||
}
|
||||
switch (op.u8[0]) {
|
||||
case 4: op=SLASH_OP_FSUBR; break;
|
||||
case 6: op=SLASH_OP_FDIVR; break;
|
||||
}
|
||||
ICSlashOp(tmpi,t1,r1,d1,op,rip);
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,FALSE,CN_INST);
|
||||
if (p1_mem && tmpi->arg1_type_pointed_to==RT_F64) {
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_FSTP,rip);
|
||||
if (rsp_size)
|
||||
ICAddRSP(tmpi,rsp_size);
|
||||
} else {
|
||||
if (rsp_size==8)
|
||||
ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,rip);
|
||||
else if (rsp_size>8) {
|
||||
ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
|
||||
SLASH_OP_FSTP,rip);
|
||||
ICAddRSP(tmpi,rsp_size-8);
|
||||
}
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64) {
|
||||
ICPop(tmpi,MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,rip);
|
||||
ICMov(tmpi,arg1->type&MDG_MASK+tmpi->arg1_type_pointed_to,arg1->reg,
|
||||
arg1->disp,MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
} else
|
||||
ICPop(tmpi,arg1->type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
arg1->reg,arg1->disp,rip);
|
||||
}
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
arg1->type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
arg1->reg,arg1->disp,rip);
|
||||
} else {
|
||||
if (tmpi->arg1_type_pointed_to>=RT_I64)
|
||||
p1_mem=TRUE;
|
||||
else
|
||||
p1_mem=FALSE;
|
||||
if (dont_push_float) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,arg1->type,arg1->reg,arg1->disp,rip);
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,rip);
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,rip);
|
||||
ICPush(tmpi,MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
} else
|
||||
ICPush(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,rip);
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
|
||||
rsp_size+=8;
|
||||
} else {
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64 || arg1->type&MDF_STK) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type,
|
||||
arg2->reg,arg2->disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,arg1->type,
|
||||
arg1->reg,arg1->disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,rip);
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,rip);
|
||||
ICU16(tmpi,0x5052); //PUSH EDX PUSH EAX
|
||||
rsp_size=16;
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
} else {
|
||||
if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=arg2->type;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
} else {
|
||||
if (arg2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64)))) {
|
||||
t2=MDF_RIP_DISP32+RT_I64;
|
||||
r2=REG_RIP;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,arg2->type,arg2->reg,arg2->disp,rip);
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
rsp_size+=8;
|
||||
}
|
||||
}
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,arg1->type,
|
||||
arg1->reg,arg1->disp,rip);
|
||||
ICPush(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,rip);
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
|
||||
rsp_size+=8;
|
||||
if (r2==REG_RSP+REG_RSP<<8)
|
||||
d2+=8;
|
||||
}
|
||||
}
|
||||
if (!rsp_size && !(p1_mem && tmpi->arg1_type_pointed_to==RT_F64)) {
|
||||
rsp_size=8;
|
||||
ICAddRSP(tmpi,-8);
|
||||
}
|
||||
if (!dont_push_float) {
|
||||
if (builtin2)
|
||||
ICU16(tmpi,builtin2);
|
||||
else
|
||||
ICSlashOp(tmpi,t2,r2,d2,SLASH_OP_FLD,rip);
|
||||
}
|
||||
|
||||
switch (op.u8[0]) {
|
||||
case 4: op=SLASH_OP_FSUBR; break;
|
||||
case 6: op=SLASH_OP_FDIVR; break;
|
||||
}
|
||||
ICSlashOp(tmpi,t1,r1,d1,op,rip);
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,FALSE,CN_INST);
|
||||
if (p1_mem && tmpi->arg1_type_pointed_to==RT_F64) {
|
||||
ICSlashOp(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,
|
||||
REG_RCX,0,SLASH_OP_FSTP,rip);
|
||||
if (rsp_size)
|
||||
ICAddRSP(tmpi,rsp_size);
|
||||
} else {
|
||||
if (rsp_size==8)
|
||||
ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,rip);
|
||||
else if (rsp_size>8) {
|
||||
ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
|
||||
SLASH_OP_FSTP,rip);
|
||||
ICAddRSP(tmpi,rsp_size-8);
|
||||
}
|
||||
ICPop(tmpi,MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,rip);
|
||||
ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 rip,
|
||||
I64 us,I64 not_us,U8 *buf,I64 rip2)
|
||||
{
|
||||
CICArg *arg1,*arg2;
|
||||
Bool dont_push_float,dont_pop_float,alt,short_jmp;
|
||||
I64 i,rsp_size=0,builtin1=0,builtin2=0,t1,r1,d1,t2,r2,d2;
|
||||
CCodeMisc *lb;
|
||||
U8 *buf2;
|
||||
|
||||
if (tmpi->ic_flags&ICF_ALT_TEMPLATE) {
|
||||
arg1=&tmpi->arg2;
|
||||
arg2=&tmpi->arg1;
|
||||
alt=TRUE;
|
||||
} else {
|
||||
arg1=&tmpi->arg1;
|
||||
arg2=&tmpi->arg2;
|
||||
alt=FALSE;
|
||||
}
|
||||
|
||||
if (cc->flags&CCF_AOT_COMPILE)
|
||||
buf2=cc->aotc->rip;
|
||||
else
|
||||
buf2=buf;
|
||||
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
if (dont_push_float) {
|
||||
if (tmpi->ic_flags&ICF_POP_CMP && alt) {
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
rsp_size+=8;
|
||||
} else {
|
||||
if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=arg2->type;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
} else {
|
||||
if (arg2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64))) ||
|
||||
tmpi->ic_flags&ICF_PUSH_CMP) {
|
||||
t2=MDF_RIP_DISP32+RT_I64;
|
||||
r2=REG_RIP;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,arg2->type,arg2->reg,arg2->disp,rip2);
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
rsp_size+=8;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (alt) {
|
||||
if (!(arg2->type&MDF_STK)) {
|
||||
if (tmpi->ic_flags&ICF_POP_CMP) {
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
|
||||
rsp_size+=8;
|
||||
} else {
|
||||
if (arg1->type.raw_type>=RT_I64 && arg1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=arg1->type;
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
} else {
|
||||
if (arg1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(arg1->disp(F64)))) {
|
||||
t1=MDF_RIP_DISP32+RT_I64;
|
||||
r1=REG_RIP;
|
||||
d1=COCFloatConstFind(cc,arg1->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,arg1->type,arg1->reg,arg1->disp,rip2);
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
|
||||
rsp_size+=8;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=arg2->type;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
} else {
|
||||
if (arg2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64))) ||
|
||||
tmpi->ic_flags&ICF_PUSH_CMP) {
|
||||
t2=MDF_RIP_DISP32+RT_I64;
|
||||
r2=REG_RIP;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,arg2->type,arg2->reg,arg2->disp,rip2);
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
rsp_size+=8;
|
||||
if (r1==REG_RSP+REG_RSP<<8)
|
||||
d1+=8;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (tmpi->ic_flags&ICF_POP_CMP)
|
||||
ICPopRegs(tmpi,1<<REG_RDX);
|
||||
else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,arg1->type,
|
||||
arg1->reg,arg1->disp,rip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type,
|
||||
arg2->reg,arg2->disp,rip2);
|
||||
ICU16(tmpi,0x5052); //PUSH EDX PUSH EAX
|
||||
rsp_size=16;
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
}
|
||||
} else {
|
||||
if (!(arg1->type&MDF_STK)) {
|
||||
if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=arg2->type;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
} else {
|
||||
if (arg2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64))) ||
|
||||
tmpi->ic_flags&ICF_PUSH_CMP) {
|
||||
t2=MDF_RIP_DISP32+RT_I64;
|
||||
r2=REG_RIP;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,arg2->type,arg2->reg,arg2->disp,rip2);
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
rsp_size+=8;
|
||||
}
|
||||
}
|
||||
if (tmpi->ic_flags&ICF_POP_CMP) {
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
|
||||
rsp_size+=8;
|
||||
if (r2==REG_RSP+REG_RSP<<8)
|
||||
d1+=8;
|
||||
} else {
|
||||
if (arg1->type.raw_type>=RT_I64 && arg1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=arg1->type;
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
} else {
|
||||
if (arg1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(arg1->disp(F64)))) {
|
||||
t1=MDF_RIP_DISP32+RT_I64;
|
||||
r1=REG_RIP;
|
||||
d1=COCFloatConstFind(cc,arg1->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,arg1->type,arg1->reg,arg1->disp,rip2);
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
|
||||
rsp_size+=8;
|
||||
if (r2==REG_RSP+REG_RSP<<8)
|
||||
d2+=8;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type,
|
||||
arg2->reg,arg2->disp,rip2);
|
||||
if (tmpi->ic_flags&ICF_POP_CMP)
|
||||
ICPopRegs(tmpi,1<<REG_RDX);
|
||||
else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,arg1->type,
|
||||
arg1->reg,arg1->disp,rip2);
|
||||
ICU16(tmpi,0x5052); //PUSH EDX PUSH EAX
|
||||
rsp_size=16;
|
||||
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!dont_push_float) {
|
||||
if (builtin1)
|
||||
ICU16(tmpi,builtin1);
|
||||
else
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_FLD,rip2);
|
||||
}
|
||||
if (!alt)
|
||||
us=not_us;
|
||||
if (builtin2)
|
||||
ICU16(tmpi,builtin2);
|
||||
else
|
||||
ICSlashOp(tmpi,t2,r2,d2,SLASH_OP_FLD,rip2);
|
||||
if (tmpi->ic_flags&ICF_PUSH_CMP) {
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
if (!rsp_size) {
|
||||
rsp_size=8;
|
||||
ICAddRSP(tmpi,-8);
|
||||
} else if (rsp_size==16)
|
||||
d2=8;
|
||||
|
||||
if (alt) {
|
||||
ICU16(tmpi,0xF1DF); //FCOMIP
|
||||
ICSlashOp(tmpi,t2,r2,d2,SLASH_OP_FSTP,rip2);
|
||||
} else {
|
||||
ICU16(tmpi,0xF1DB); //FCOMI
|
||||
ICSlashOp(tmpi,t2,r2,d2,SLASH_OP_FSTP,rip2);
|
||||
ICU32(tmpi,0xF7D9C0DD); //FFREE,FINCSTP
|
||||
}
|
||||
} else {
|
||||
ICU16(tmpi,0xF1DF); //FCOMIP
|
||||
ICU32(tmpi,0xF7D9C0DD); //FFREE,FINCSTP
|
||||
}
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,FALSE,CN_INST);
|
||||
|
||||
if (tmpi->ic_flags&ICF_PUSH_CMP) {
|
||||
if (r2.u8[0]==REG_RSP) {
|
||||
while (d2 && rsp_size) {
|
||||
ICU8(tmpi,0x5B); //POP RBX (Dont change flags)
|
||||
rsp_size-=8;
|
||||
d2-=8;
|
||||
}
|
||||
} else {
|
||||
while (rsp_size) {
|
||||
ICU8(tmpi,0x5B); //POP RBX (Dont change flags)
|
||||
rsp_size-=8;
|
||||
}
|
||||
ICPush(tmpi,t2,r2,d2,rip2);
|
||||
}
|
||||
} else {
|
||||
while (rsp_size) {
|
||||
ICU8(tmpi,0x5B); //POP RBX (Dont change flags)
|
||||
rsp_size-=8;
|
||||
}
|
||||
}
|
||||
|
||||
rip+=tmpi->ic_cnt;
|
||||
lb=OptLabelFwd(tmpi->ic_data);
|
||||
short_jmp=ToBool(tmpi->ic_flags&ICF_SHORT_JMP);
|
||||
if (!buf && lb->addr!=INVALID_PTR) {
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP) {
|
||||
if(tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
i+=4;
|
||||
else
|
||||
i+=8;
|
||||
}
|
||||
if (I8_MIN<=i<=I8_MAX)
|
||||
short_jmp=TRUE;
|
||||
}
|
||||
|
||||
if (short_jmp) {
|
||||
tmpi->ic_flags|=ICF_SHORT_JMP;
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP) {
|
||||
if(tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
i+=4;
|
||||
else
|
||||
i+=8;
|
||||
}
|
||||
ICU16(tmpi,i<<8+us.u8[2]);
|
||||
} else {
|
||||
tmpi->ic_flags&=~ICF_SHORT_JMP;
|
||||
i=lb->addr-(rip+6);
|
||||
if (lb->flags&CMF_POP_CMP) {
|
||||
if(tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
i+=4;
|
||||
else
|
||||
i+=8;
|
||||
}
|
||||
ICU16(tmpi,us.u16[0]);
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICFMul(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 rip)
|
||||
{
|
||||
if (tmpi->arg1.type&MDF_IMM && tmpi->arg1.type&RTG_MASK==RT_F64 &&
|
||||
tmpi->arg1.disp(F64)==1.0) {
|
||||
CmpNoteFloatOp(cc,tmpi,FALSE,FALSE,CN_INST);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
} else if (tmpi->arg2.type&MDF_IMM &&
|
||||
tmpi->arg2.type&RTG_MASK==RT_F64&& tmpi->arg2.disp(F64)==1.0) {
|
||||
CmpNoteFloatOp(cc,tmpi,FALSE,FALSE,CN_INST);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
} else
|
||||
ICFOp(cc,tmpi,SLASH_OP_FMUL,buf,rip);
|
||||
}
|
||||
|
||||
U0 ICFDiv(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 rip)
|
||||
{
|
||||
if (tmpi->arg2.type&MDF_IMM && tmpi->arg2.type&RTG_MASK==RT_F64 &&
|
||||
tmpi->arg2.disp(F64)==1.0) {
|
||||
CmpNoteFloatOp(cc,tmpi,FALSE,FALSE,CN_INST);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
} else
|
||||
ICFOp(cc,tmpi,SLASH_OP_FDIV,buf,rip);
|
||||
}
|
||||
|
||||
U0 ICFAdd(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 rip)
|
||||
{
|
||||
Bool dont_push_float,dont_pop_float;
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
if (tmpi->arg1.type&MDF_IMM && !tmpi->arg1.disp) {
|
||||
if (dont_push_float) {
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_FSTP,FALSE,TRUE,TRUE,CN_INST);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
} else if (dont_pop_float) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_INST);
|
||||
} else {
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,TRUE,CN_INST);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
}
|
||||
} else if (tmpi->arg2.type&MDF_IMM && !tmpi->arg2.disp) {
|
||||
if (dont_push_float) {
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_FSTP,FALSE,TRUE,TRUE,CN_INST);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
} else if (dont_pop_float) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_INST);
|
||||
} else {
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,TRUE,CN_INST);
|
||||
}
|
||||
} else
|
||||
ICFOp(cc,tmpi,SLASH_OP_FADD,buf,rip);
|
||||
}
|
||||
|
||||
U0 ICFSub(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 rip)
|
||||
{
|
||||
Bool dont_push_float,dont_pop_float;
|
||||
if (tmpi->arg2.type&MDF_IMM && !tmpi->arg2.disp) {
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
if (dont_push_float) {
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_FSTP,FALSE,TRUE,TRUE,CN_INST);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
} else if (dont_pop_float) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_INST);
|
||||
} else {
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,TRUE,CN_INST);
|
||||
}
|
||||
} else
|
||||
ICFOp(cc,tmpi,SLASH_OP_FSUB,buf,rip);
|
||||
}
|
||||
|
||||
U0 ICFPreIncDec(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,I64 rip)
|
||||
{
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type&MDG_MASK+RT_I64,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICCopyTemplate(cc,tmpi,op,FALSE,TRUE,TRUE,CN_INST);
|
||||
ICMov(tmpi,tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+RT_I64,REG_RCX,0,rip);
|
||||
ICCopyTemplate(cc,tmpi,op,FALSE,TRUE,TRUE,CN_INST);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,REG_RCX,0,MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICFPostIncDec(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,I64 rip)
|
||||
{
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type&MDG_MASK+RT_I64,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
ICCopyTemplate(cc,tmpi,op,FALSE,TRUE,TRUE,CN_INST);
|
||||
ICMov(tmpi,tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+RT_I64,REG_RCX,0,rip);
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
ICCopyTemplate(cc,tmpi,op,FALSE,TRUE,TRUE,CN_INST);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,REG_RCX,0,MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
if (tmpi->res.type.mode)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RDX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICFTemplateFun(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,I64 rip)
|
||||
{
|
||||
Bool dont_push_float,dont_pop_float;
|
||||
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
if (!dont_push_float)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
|
||||
ICCopyTemplate(cc,tmpi,op,FALSE,TRUE,TRUE,CN_INST);
|
||||
if (tmpi->res.type.mode && !(tmpi->ic_flags & ICF_RES_TO_F64) &&
|
||||
!(tmpi->ic_flags & ICF_RES_TO_INT))
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
@@ -0,0 +1,708 @@
|
||||
/*Intermediate Code to Machine Code
|
||||
|
||||
RAX,RBX,RCX and RDX can be clobbered by
|
||||
each intermediate code's output code.
|
||||
However, intermediate codes must be
|
||||
coupled together based on the arg and
|
||||
res type specifications in the
|
||||
$LK,"CICArg",A="MN:CICArg"$. RAX is the most common reg
|
||||
for coupling intermediate codes.
|
||||
|
||||
Internal calculations take place on
|
||||
64-bit vals, so anything which has
|
||||
found it's way into a reg has been
|
||||
sign or zero extended to 64-bits.
|
||||
*/
|
||||
|
||||
U0 ICU8(CIntermediateCode *tmpi,U8 b)
|
||||
{
|
||||
tmpi->ic_body[tmpi->ic_cnt++]=b;
|
||||
}
|
||||
|
||||
U0 ICRex(CIntermediateCode *tmpi,U8 b)
|
||||
{
|
||||
if (b)
|
||||
tmpi->ic_body[tmpi->ic_cnt++]=b;
|
||||
}
|
||||
|
||||
U0 ICOpSizeRex(CIntermediateCode *tmpi,U8 b)
|
||||
{
|
||||
tmpi->ic_body[tmpi->ic_cnt++]=OC_OP_SIZE_PREFIX;
|
||||
if (b)
|
||||
tmpi->ic_body[tmpi->ic_cnt++]=b;
|
||||
}
|
||||
|
||||
U0 ICU16(CIntermediateCode *tmpi,U16 w)
|
||||
{
|
||||
*(&tmpi->ic_body[tmpi->ic_cnt])(U16)=w;
|
||||
tmpi->ic_cnt+=2;
|
||||
}
|
||||
|
||||
U0 ICU24(CIntermediateCode *tmpi,U32 d)
|
||||
{//Writes extra harmless overhanging byte.
|
||||
*(&tmpi->ic_body[tmpi->ic_cnt])(U32)=d;
|
||||
tmpi->ic_cnt+=3;
|
||||
}
|
||||
|
||||
U0 ICU32(CIntermediateCode *tmpi,U32 d)
|
||||
{
|
||||
*(&tmpi->ic_body[tmpi->ic_cnt])(U32)=d;
|
||||
tmpi->ic_cnt+=4;
|
||||
}
|
||||
|
||||
U0 ICU64(CIntermediateCode *tmpi,U64 q)
|
||||
{
|
||||
*(&tmpi->ic_body[tmpi->ic_cnt])(U64)=q;
|
||||
tmpi->ic_cnt+=8;
|
||||
}
|
||||
|
||||
U0 ICAddRSP(CIntermediateCode *tmpi,I64 i,Bool optimize=TRUE)
|
||||
{
|
||||
I64 j,last_start;
|
||||
CIntermediateCode *tmpil1;
|
||||
if (optimize) {
|
||||
tmpil1=tmpi;
|
||||
if (tmpi->ic_last_start<0 && !tmpi->ic_cnt &&
|
||||
(tmpil1=OptLag1(tmpi)) && tmpil1->ic_last_start<0)
|
||||
tmpil1=NULL;
|
||||
if (tmpil1) {
|
||||
j=tmpil1->ic_cnt;
|
||||
if (tmpil1->ic_last_start==j-4 && tmpil1->ic_body[j-3]==0x83 &&
|
||||
tmpil1->ic_body[j-4]==0x48) {
|
||||
if (tmpil1->ic_body[j-2]==0xEC)
|
||||
j=-tmpil1->ic_body[j-1](I8);
|
||||
else if (tmpil1->ic_body[j-2]==0xC4)
|
||||
j=tmpil1->ic_body[j-1](I8);
|
||||
else
|
||||
j=0;
|
||||
} else if (tmpil1->ic_last_start==j-7 && tmpil1->ic_body[j-6]==0x81 &&
|
||||
tmpil1->ic_body[j-7]==0x48) {
|
||||
if (tmpil1->ic_body[j-5]==0xEC)
|
||||
j=-tmpil1->ic_body[j-4](I32);
|
||||
else if (tmpil1->ic_body[j-5]==0xC4)
|
||||
j=tmpil1->ic_body[j-4](I32);
|
||||
else
|
||||
j=0;
|
||||
} else
|
||||
j=0;
|
||||
if (j) {
|
||||
if (tmpi==tmpil1) {
|
||||
tmpi->ic_cnt=tmpi->ic_last_start;
|
||||
i+=j;
|
||||
} else if (!(tmpi->ic_flags&ICF_PREV_DELETED)) {
|
||||
tmpil1->ic_flags|=ICF_DEL_PREV_INS;
|
||||
tmpi->ic_flags=tmpi->ic_flags&~ICF_CODE_FINAL|ICF_PREV_DELETED;
|
||||
i+=j;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
last_start=tmpi->ic_cnt;
|
||||
if (i>0) {
|
||||
if (i<=I8_MAX)
|
||||
ICU32(tmpi,0xC48348+i<<24);
|
||||
else if (i<=I32_MAX) {
|
||||
ICU24(tmpi,0xC48148);
|
||||
ICU32(tmpi,i);
|
||||
} else
|
||||
throw('Compiler');
|
||||
} else if (i<0) {
|
||||
i=-i;
|
||||
if (i<=I8_MAX)
|
||||
ICU32(tmpi,0xEC8348+i<<24);
|
||||
else if (i<=I32_MAX) {
|
||||
ICU24(tmpi,0xEC8148);
|
||||
ICU32(tmpi,i);
|
||||
} else
|
||||
throw('Compiler');
|
||||
}
|
||||
if (optimize && tmpi->ic_cnt>last_start)
|
||||
tmpi->ic_last_start=last_start;
|
||||
}
|
||||
|
||||
extern U0 ICMov(CIntermediateCode *tmpi,
|
||||
CICType t1,I64 r1,I64 d1,CICType t2,I64 r2,I64 d2,I64 rip);
|
||||
|
||||
#define MODR_REG 0
|
||||
#define MODR_INDIRECT_REG 1
|
||||
#define MODR_D8_INDIRECT_REG 2
|
||||
#define MODR_D32_INDIRECT_REG 3
|
||||
#define MODR_SIB_INDIRECT_REG 4
|
||||
#define MODR_SIB_D8_INDIRECT_REG 5
|
||||
#define MODR_SIB_D32_INDIRECT_REG 6
|
||||
#define MODR_RIP_REL 7
|
||||
#define MODR_RIP_REL_IMM_U32 8
|
||||
|
||||
I64 ICModr1(I64 r,CICType t2,I64 r2,I64 d2)
|
||||
{//res.u8[0] is type
|
||||
//res.u8[1] is REX
|
||||
//res.u8[2] is ModR
|
||||
//res.u8[3] is SIB
|
||||
I64 res=0;
|
||||
if (t2.raw_type<RT_I64)
|
||||
res.u8[1]=0x40;
|
||||
else
|
||||
res.u8[1]=0x48;
|
||||
if (r>7) {
|
||||
res.u8[1]+=4;
|
||||
r&=7;
|
||||
}
|
||||
switch (Bsr(t2)) {
|
||||
case MDf_REG:
|
||||
if (r2>7) {
|
||||
res.u8[1]++;
|
||||
r2&=7;
|
||||
}
|
||||
res.u8[2]=0xC0+r<<3+r2;
|
||||
res.u8[0]=MODR_REG;
|
||||
if (res.u8[1]==0x40 && (t2.raw_type>=RT_I16 || r<4 && r2<4))
|
||||
res.u8[1]=0;
|
||||
break;
|
||||
case MDf_DISP:
|
||||
if (r2>7) {
|
||||
res.u8[1]++;
|
||||
r2&=7;
|
||||
}
|
||||
if (!d2 && r2!=REG_RBP) {
|
||||
res.u8[2]=r<<3+r2;
|
||||
res.u8[0]=MODR_INDIRECT_REG;
|
||||
} else if (I8_MIN<=d2<=I8_MAX) {
|
||||
res.u8[2]=0x40+r<<3+r2;
|
||||
res.u8[0]=MODR_D8_INDIRECT_REG;
|
||||
} else {
|
||||
res.u8[2]=0x80+r<<3+r2;
|
||||
res.u8[0]=MODR_D32_INDIRECT_REG;
|
||||
}
|
||||
if (res.u8[1]==0x40 && (t2.raw_type>=RT_I16 || r<4))
|
||||
res.u8[1]=0;
|
||||
break;
|
||||
case MDf_SIB:
|
||||
if (7<r2.u8[0]<REG_NONE)
|
||||
res.u8[1]++;
|
||||
if (r2.u8[1]&15>7)
|
||||
res.u8[1]+=2;
|
||||
if (r2.u8[0]==REG_NONE) {
|
||||
res.u8[3]=5+(r2.u8[1]&7)<<3+r2.u8[1]&0xC0;
|
||||
res.u8[2]=4+r<<3;
|
||||
res.u8[0]=MODR_SIB_D32_INDIRECT_REG;
|
||||
} else {
|
||||
res.u8[3]=r2.u8[0]&7+(r2.u8[1]&7)<<3+r2.u8[1]&0xC0;
|
||||
if (!d2 && r2.u8[0]&7!=REG_RBP) {
|
||||
res.u8[2]=4+r<<3;
|
||||
res.u8[0]=MODR_SIB_INDIRECT_REG;
|
||||
} else if (I8_MIN<=d2<=I8_MAX) {
|
||||
res.u8[2]=0x44+r<<3;
|
||||
res.u8[0]=MODR_SIB_D8_INDIRECT_REG;
|
||||
} else {
|
||||
res.u8[2]=0x84+r<<3;
|
||||
res.u8[0]=MODR_SIB_D32_INDIRECT_REG;
|
||||
}
|
||||
}
|
||||
if (res.u8[1]==0x40 && (t2.raw_type>=RT_I16 || r<4))
|
||||
res.u8[1]=0;
|
||||
break;
|
||||
case MDf_RIP_DISP32:
|
||||
res.u8[2]=0x05+r<<3;
|
||||
res.u8[0]=MODR_RIP_REL;
|
||||
if (res.u8[1]==0x40 && (t2.raw_type>=RT_I16 || r<4))
|
||||
res.u8[1]=0;
|
||||
break;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
U0 ICModr2(CIntermediateCode *tmpi,I64 i,CICType t=0,I64 d,I64 rip=0)
|
||||
{
|
||||
switch [i.u8[0]] {
|
||||
case MODR_REG:
|
||||
break;
|
||||
case MODR_INDIRECT_REG:
|
||||
break;
|
||||
case MODR_D8_INDIRECT_REG:
|
||||
ICU8(tmpi,d);
|
||||
break;
|
||||
case MODR_D32_INDIRECT_REG:
|
||||
ICU32(tmpi,d);
|
||||
break;
|
||||
case MODR_SIB_INDIRECT_REG:
|
||||
ICU8(tmpi,i.u8[3]);
|
||||
break;
|
||||
case MODR_SIB_D8_INDIRECT_REG:
|
||||
ICU8(tmpi,i.u8[3]);
|
||||
ICU8(tmpi,d);
|
||||
break;
|
||||
case MODR_SIB_D32_INDIRECT_REG:
|
||||
ICU8(tmpi,i.u8[3]);
|
||||
ICU32(tmpi,d);
|
||||
break;
|
||||
case MODR_RIP_REL_IMM_U32:
|
||||
switch (t.raw_type) {
|
||||
case RT_I8:
|
||||
case RT_U8:
|
||||
d--;
|
||||
break;
|
||||
case RT_I16:
|
||||
case RT_U16:
|
||||
d-=2;
|
||||
break;
|
||||
default:
|
||||
d-=4;
|
||||
}
|
||||
case MODR_RIP_REL:
|
||||
ICU32(tmpi,d-(rip+4+tmpi->ic_cnt));
|
||||
tmpi->ic_flags&=~ICF_CODE_FINAL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#define SLASH_OP_INC 0x0003000000FFFE00
|
||||
#define SLASH_OP_DEC 0x052B000000FFFE01
|
||||
#define SLASH_OP_NOT 0x0000000000F7F602
|
||||
#define SLASH_OP_NEG 0x0000000000F7F603
|
||||
#define SLASH_OP_IMM_U8 0x0000000000838000
|
||||
#define SLASH_OP_IMM_U32 0x0000000000818300
|
||||
#define SLASH_OP_MUL 0x0000000000F7F604
|
||||
#define SLASH_OP_IMUL 0x0000000000F7F605
|
||||
#define SLASH_OP_DIV 0x0000000000F7F606
|
||||
#define SLASH_OP_MOV 0x0000000000898800
|
||||
#define SLASH_OP_MOV_IMM 0x0000000000C7C600
|
||||
#define SLASH_OP_PUSH 0x0000000000FFFF06
|
||||
#define SLASH_OP_POP 0x00000000008F8F00
|
||||
#define SLASH_OP_FADD 0x0000C1DE01DCDC00
|
||||
#define SLASH_OP_FSUB 0x0000E9DE01DCDC04
|
||||
#define SLASH_OP_FSUBR 0x0000E1DE01DCDC05
|
||||
#define SLASH_OP_FMUL 0x0000C9DE01DCDC01
|
||||
#define SLASH_OP_FDIV 0x0000F9DE01DCDC06
|
||||
#define SLASH_OP_FDIVR 0x0000F1DE01DCDC07
|
||||
#define SLASH_OP_FLD 0x0000000001DDDD00
|
||||
#define SLASH_OP_FSTP 0x0000000001DDDD03
|
||||
#define SLASH_OP_FISTTP 0x0000000001DDDD01
|
||||
#define SLASH_OP_FILD 0x0000000001DFDF05
|
||||
|
||||
U0 ICSlashOp(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,I64 op,I64 rip)
|
||||
{
|
||||
I64 i;
|
||||
if (t1&MDF_REG && !op.u8[3])
|
||||
t1=t1&(MDG_MASK|RTF_UNSIGNED)+RT_I64; //Set to 64 bit,preserving unsigned
|
||||
i=ICModr1(op.u8[0],t1,r1,d1);
|
||||
if (tmpi->ic_flags&ICF_LOCK && !(t1&MDF_REG) &&
|
||||
op&~7!=SLASH_OP_MOV && op!=SLASH_OP_MOV_IMM)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
switch (t1.raw_type) {
|
||||
case RT_I8:
|
||||
case RT_U8:
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+op.u8[1]);
|
||||
break;
|
||||
case RT_I16:
|
||||
case RT_U16:
|
||||
ICOpSizeRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+op.u8[2]);
|
||||
break;
|
||||
default:
|
||||
if (i.u8[1]!=0x48 || !op.u8[3])
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+op.u8[2]);
|
||||
}
|
||||
if (i.u8[0]==MODR_RIP_REL&& (op==SLASH_OP_MOV_IMM || op&~7==SLASH_OP_IMM_U32))
|
||||
i.u8[0]=MODR_RIP_REL_IMM_U32;
|
||||
ICModr2(tmpi,i,t1,d1,rip);
|
||||
}
|
||||
|
||||
U0 ICPush(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,I64 rip)
|
||||
{
|
||||
switch (Bsr(t1)) {
|
||||
case MDf_REG:
|
||||
if (r1>7)
|
||||
ICU16(tmpi,0x5049+(r1&7)<<8);
|
||||
else
|
||||
ICU8(tmpi,0x50+r1);
|
||||
return;
|
||||
case MDf_IMM:
|
||||
if (I8_MIN<=d1<=I8_MAX)
|
||||
ICU16(tmpi,0x6A+d1<<8);
|
||||
else if (I32_MIN<=d1<=I32_MAX) {
|
||||
ICU8(tmpi,0x68);
|
||||
ICU32(tmpi,d1);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,t1,r1,d1,rip);
|
||||
ICU8(tmpi,0x50+REG_RBX);
|
||||
}
|
||||
return;
|
||||
case MDf_STK:
|
||||
return;
|
||||
case MDf_DISP:
|
||||
case MDf_SIB:
|
||||
case MDf_RIP_DISP32:
|
||||
switch (t1.raw_type) {
|
||||
case RT_I64:
|
||||
case RT_U64:
|
||||
case RT_F64:
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_PUSH,rip);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,t1,r1,d1,rip);
|
||||
ICU16(tmpi,0x5048+REG_RBX<<8);
|
||||
}
|
||||
|
||||
U0 ICPushRegs(CIntermediateCode *tmpi,I64 mask)
|
||||
{
|
||||
I64 i;
|
||||
for (i=0;i<REG_REGS_NUM;i++) {
|
||||
if (Bt(&mask,i)) {
|
||||
if (i>7)
|
||||
ICU16(tmpi,0x5049+(i&7)<<8);
|
||||
else
|
||||
ICU8(tmpi,0x50+i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICPop(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,I64 rip)
|
||||
{
|
||||
switch (Bsr(t1)) {
|
||||
case MDf_REG:
|
||||
if (r1>7)
|
||||
ICU16(tmpi,0x5849+(r1&7)<<8);
|
||||
else
|
||||
ICU8(tmpi,0x58+r1);
|
||||
break;
|
||||
case MDf_DISP:
|
||||
case MDf_RIP_DISP32:
|
||||
case MDf_SIB:
|
||||
if (t1.raw_type<RT_I64) {
|
||||
ICU8(tmpi,0x58+REG_RBX);
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,REG_RBX,0,rip);
|
||||
} else
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_POP,rip);
|
||||
break;
|
||||
case MDf_STK:
|
||||
case MDf_IMM:
|
||||
ICU8(tmpi,0x58+REG_RBX);
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,REG_RBX,0,rip);
|
||||
break;
|
||||
default:
|
||||
ICAddRSP(tmpi,8);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICPopRegs(CIntermediateCode *tmpi,I64 mask)
|
||||
{
|
||||
I64 i;
|
||||
for (i=REG_REGS_NUM-1;i>=0;i--) {
|
||||
if (Bt(&mask,i)) {
|
||||
if (i>7)
|
||||
ICU16(tmpi,0x5849+(i&7)<<8);
|
||||
else
|
||||
ICU8(tmpi,0x58+i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICZero(CIntermediateCode *tmpi,I64 r)
|
||||
{
|
||||
if (r>7) {
|
||||
r&=7;
|
||||
ICU24(tmpi,0xC0334D+r<<16+r<<19);
|
||||
} else
|
||||
ICU16(tmpi,0xC033+r<<8+r<<11);
|
||||
}
|
||||
|
||||
U0 ICTest(CIntermediateCode *tmpi,I64 r)
|
||||
{
|
||||
I64 i=0xC08548; //TEST R,R
|
||||
if (r>7) {
|
||||
i+=5;
|
||||
r&=7;
|
||||
}
|
||||
ICU24(tmpi,i+r<<16+r<<19);
|
||||
}
|
||||
|
||||
I64 ICBuiltInFloatConst(F64 d)
|
||||
{//Returns 2-byte opcode for FLD const or zero
|
||||
if (!d)
|
||||
return 0xEED9;
|
||||
else if (d==1.0)
|
||||
return 0xE8D9;
|
||||
else if (GetOption(OPTf_NO_BUILTIN_CONST))
|
||||
return 0;
|
||||
else if (d==ã)
|
||||
return 0xEBD9;
|
||||
else if (d==log2_10)
|
||||
return 0xE9D9;
|
||||
else if (d==log2_e)
|
||||
return 0xEAD9;
|
||||
else if (d==log10_2)
|
||||
return 0xECD9;
|
||||
else if (d==loge_2)
|
||||
return 0xEDD9;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
U0 ICMov(CIntermediateCode *tmpi,
|
||||
CICType t1,I64 r1,I64 d1,CICType t2,I64 r2,I64 d2,I64 rip)
|
||||
{
|
||||
I64 i,cnt1,cnt2,b1_rex,b2_rex,b1,b2,b1_modr,b2_modr,
|
||||
b1_r1,b1_r2,b2_r1,b2_r2,last_start=tmpi->ic_cnt;
|
||||
CIntermediateCode *tmpil1;
|
||||
Bool old_lock=Btr(&tmpi->ic_flags,ICf_LOCK);
|
||||
switch (Bsr(t1)) {
|
||||
case MDf_REG:
|
||||
if (t2&MDF_IMM) {
|
||||
if (!d2)
|
||||
ICZero(tmpi,r1);
|
||||
else if (0<=d2<=U8_MAX) {
|
||||
ICZero(tmpi,r1);
|
||||
if (r1>7)
|
||||
ICU24(tmpi,d2<<16+(0xB0+r1&7)<<8+0x41);
|
||||
else if (r1>3)
|
||||
ICU24(tmpi,d2<<16+(0xB0+r1)<<8+0x40);
|
||||
else
|
||||
ICU16(tmpi,d2<<8+0xB0+r1);
|
||||
} else if (I8_MIN<=d2<0) {
|
||||
if (r1>7) {
|
||||
r1&=7;
|
||||
ICU24(tmpi,d2<<16+(0xB0+r1)<<8+0x41);
|
||||
ICU32(tmpi,0xC0BE0F4D+r1<<24+r1<<27);
|
||||
} else {
|
||||
if (r1>3)
|
||||
ICU24(tmpi,d2<<16+(0xB0+r1)<<8+0x40);
|
||||
else
|
||||
ICU16(tmpi,d2<<8+0xB0+r1);
|
||||
ICU32(tmpi,0xC0BE0F48+r1<<24+r1<<27);
|
||||
}
|
||||
} else if (0<=d2<=U32_MAX) {
|
||||
if (r1>7) {
|
||||
r1&=7;
|
||||
ICU16(tmpi,(0xB8+r1)<<8+0x41);
|
||||
ICU32(tmpi,d2);
|
||||
} else {
|
||||
ICU8(tmpi,0xB8+r1);
|
||||
ICU32(tmpi,d2);
|
||||
}
|
||||
} else if (I32_MIN<=d2<0) {
|
||||
if (r1>7) {
|
||||
r1&=7;
|
||||
ICU16(tmpi,(0xB8+r1)<<8+0x41);
|
||||
ICU32(tmpi,d2);
|
||||
ICU24(tmpi,0xC0634D+r1<<16+r1<<19);
|
||||
} else {
|
||||
ICU8(tmpi,0xB8+r1);
|
||||
ICU32(tmpi,d2);
|
||||
ICU24(tmpi,0xC06348+r1<<16+r1<<19);
|
||||
}
|
||||
} else {
|
||||
i=0xB848;
|
||||
if (r1>7) {
|
||||
i++;
|
||||
r1&=7;
|
||||
}
|
||||
ICU16(tmpi,i+r1<<8);
|
||||
ICU64(tmpi,d2);
|
||||
}
|
||||
} else if (t2&MDF_STK)
|
||||
ICPop(tmpi,t1,r1,d1,rip);
|
||||
else {
|
||||
if (r1==r2 && t2&MDF_REG)
|
||||
goto move_done;
|
||||
if (t2&MDF_REG)
|
||||
t2=MDF_REG+RT_I64;
|
||||
i=ICModr1(r1,t2,r2,d2);
|
||||
if (t2.raw_type!=RT_U32)
|
||||
i|=0x4800;
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
switch (t2.raw_type) {
|
||||
case RT_I8:
|
||||
ICU24(tmpi,i.u8[2]<<16+0xBE0F);
|
||||
break;
|
||||
case RT_I16:
|
||||
ICU24(tmpi,i.u8[2]<<16+0xBF0F);
|
||||
break;
|
||||
case RT_I32:
|
||||
ICU16(tmpi,i.u8[2]<<8+0x63);
|
||||
break;
|
||||
|
||||
case RT_U8:
|
||||
ICU24(tmpi,i.u8[2]<<16+0xB60F);
|
||||
break;
|
||||
case RT_U16:
|
||||
ICU24(tmpi,i.u8[2]<<16+0xB70F);
|
||||
break;
|
||||
default:
|
||||
ICU16(tmpi,i.u8[2]<<8+0x8B);
|
||||
}
|
||||
ICModr2(tmpi,i,,d2,rip);
|
||||
}
|
||||
break;
|
||||
case MDf_STK:
|
||||
if (tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
ICPopRegs(tmpi,1<<REG_RBX);
|
||||
if (t1.raw_type<t2.raw_type)
|
||||
ICPush(tmpi,t2&MDG_MASK+t1.raw_type,r2,d2,rip);
|
||||
else
|
||||
ICPush(tmpi,t2,r2,d2,rip);
|
||||
if (tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
ICPushRegs(tmpi,1<<REG_RBX);
|
||||
break;
|
||||
case MDf_DISP:
|
||||
case MDf_RIP_DISP32:
|
||||
case MDf_SIB:
|
||||
if (t2&MDF_IMM && (t1.raw_type<RT_I64 || (I32_MIN<=d2<=I32_MAX))) {
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_MOV_IMM,rip);
|
||||
switch (t1.raw_type) {
|
||||
case RT_I8:
|
||||
case RT_U8:
|
||||
ICU8(tmpi,d2);
|
||||
break;
|
||||
case RT_I16:
|
||||
case RT_U16:
|
||||
ICU16(tmpi,d2);
|
||||
break;
|
||||
default:
|
||||
ICU32(tmpi,d2);
|
||||
}
|
||||
} else {
|
||||
if (t2&MDF_REG)
|
||||
ICSlashOp(tmpi,t1,r1,d1,r2+SLASH_OP_MOV,rip);
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,t2,r2,d2,rip);
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,REG_RBX,0,rip);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
move_done:
|
||||
if (!((t1|t2)&(MDF_STK|MDF_RIP_DISP32))) {
|
||||
tmpil1=tmpi;
|
||||
if (tmpi->ic_last_start<0 && (tmpil1=OptLag1(tmpi)) &&
|
||||
tmpil1->ic_last_start<0)
|
||||
tmpil1=NULL;
|
||||
if (tmpil1) {
|
||||
if (tmpil1==tmpi)
|
||||
cnt1=last_start-tmpil1->ic_last_start;
|
||||
else {
|
||||
if (!(tmpil1->ic_flags&ICF_CODE_FINAL))
|
||||
tmpi->ic_flags&=~ICF_CODE_FINAL;
|
||||
if (last_start)
|
||||
cnt1=0;
|
||||
else
|
||||
cnt1=tmpil1->ic_cnt-tmpil1->ic_last_start;
|
||||
}
|
||||
cnt2=tmpi->ic_cnt-last_start;
|
||||
if (cnt1 && cnt1==cnt2) {
|
||||
b1_rex=tmpil1->ic_body[tmpil1->ic_last_start];
|
||||
b2_rex=tmpi->ic_body[last_start];
|
||||
if (b1_rex&0x48==0x48 && b2_rex&0x48==0x48) {
|
||||
for (i=1;i<cnt1;i++)
|
||||
if ((b1=tmpil1->ic_body[tmpil1->ic_last_start+i])==
|
||||
(b2=tmpi->ic_body[last_start+i])) {
|
||||
if (i==1 && (b2==0x89 || b2==0x8B)) {
|
||||
b1_modr=tmpil1->ic_body[tmpil1->ic_last_start+2];
|
||||
b1_r1=b1_modr&7 +Bt(&b1_rex,0)<<3;
|
||||
b1_r2=b1_modr>>3&7+Bt(&b1_rex,2)<<3;
|
||||
b2_modr=tmpi->ic_body[last_start+2];
|
||||
b2_r1=b2_modr&7 +Bt(&b2_rex,0)<<3;
|
||||
b2_r2=b2_modr>>3&7+Bt(&b2_rex,2)<<3;
|
||||
if (cnt1==3 && b2_modr&0xC0==0xC0) {
|
||||
if (b2_r1==b2_r2)
|
||||
goto move_redundant;
|
||||
if (b1_modr&0xC0==0xC0) {
|
||||
if (b1_r1==b2_r2 && b2_r1==b1_r2)
|
||||
goto move_redundant;
|
||||
}
|
||||
} else if (b1_rex!=b2_rex || b1_r1==b1_r2 || (t1|t2)&MDF_SIB)
|
||||
break;
|
||||
} else if (b1_rex!=b2_rex)
|
||||
break;
|
||||
} else if (i!=1)
|
||||
break;
|
||||
else if (b2!=0x89 && b2!=0x8B)
|
||||
break;
|
||||
else {
|
||||
b1_modr=tmpil1->ic_body[tmpil1->ic_last_start+2];
|
||||
b1_r1=b1_modr&7 +Bt(&b1_rex,0)<<3;
|
||||
b1_r2=b1_modr>>3&7+Bt(&b1_rex,2)<<3;
|
||||
b2_modr=tmpi->ic_body[last_start+2];
|
||||
b2_r1=b2_modr&7 +Bt(&b2_rex,0)<<3;
|
||||
b2_r2=b2_modr>>3&7+Bt(&b2_rex,2)<<3;
|
||||
if (cnt1==3 && b2_modr&0xC0==0xC0) {
|
||||
if (b2_r1==b2_r2)
|
||||
goto move_redundant;
|
||||
if (b1==0x89 && b2==0x8B || b1==0x8B && b2==0x89) {
|
||||
if (b1_modr&0xC0==0xC0) {
|
||||
if (b1_r1==b2_r1 && b1_r2==b2_r2 ||
|
||||
b1_r1==b2_r2 && b2_r1==b1_r2)
|
||||
goto move_redundant;
|
||||
}
|
||||
if (b1_rex!=b2_rex)
|
||||
break;
|
||||
} else
|
||||
break;
|
||||
} else if (b1_r1==b1_r2 || (t1|t2)&MDF_SIB || b1_rex!=b2_rex ||
|
||||
!(b1==0x89 && b2==0x8B || b1==0x8B && b2==0x89))
|
||||
break;
|
||||
}
|
||||
if (i==cnt1) {
|
||||
move_redundant:
|
||||
tmpi->ic_cnt=last_start;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (tmpi->ic_cnt>last_start>tmpi->ic_last_start)
|
||||
tmpi->ic_last_start=last_start;
|
||||
BEqu(&tmpi->ic_flags,ICf_LOCK,old_lock);
|
||||
}
|
||||
|
||||
U0 ICLea(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
CICType t2,I64 r2,I64 d2,CCmpCtrl *cc,U8 *buf,I64 rip)
|
||||
{
|
||||
I64 i;
|
||||
CAOTAbsAddr *tmpa;
|
||||
switch (Bsr(t1)) {
|
||||
case MDf_REG:
|
||||
i=ICModr1(r1,t2,r2,d2);
|
||||
i.u8[1]|=0x48;
|
||||
ICU24(tmpi,i.u8[2]<<16+0x8D00+i.u8[1]);
|
||||
ICModr2(tmpi,i,,d2,rip);
|
||||
break;
|
||||
case MDf_STK:
|
||||
if (t2&MDF_RIP_DISP32) {
|
||||
ICU8(tmpi,0x68);
|
||||
ICU32(tmpi,d2);
|
||||
if (cc->flags&CCF_AOT_COMPILE && buf && !(cc->flags&CCF_NO_ABSS)) {
|
||||
tmpa=CAlloc(sizeof(CAOTAbsAddr));
|
||||
tmpa->next=cc->aotc->abss;
|
||||
tmpa->type=AAT_ADD_U32;
|
||||
cc->aotc->abss=tmpa;
|
||||
tmpa->rip=rip+tmpi->ic_cnt-4;
|
||||
}
|
||||
tmpi->ic_flags&=~ICF_CODE_FINAL;
|
||||
break;
|
||||
} // Fall thru
|
||||
default:
|
||||
ICLea(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,cc,buf,rip);
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,REG_RCX,0,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICDeref(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
CICType t;
|
||||
t=tmpi->res.type.raw_type;
|
||||
if (t>tmpi->arg1_type_pointed_to)
|
||||
t=tmpi->arg1_type_pointed_to;
|
||||
if (tmpi->arg1.type&MDF_REG)
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_DISP+t,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_DISP+t,REG_RCX,0,rip);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,253 @@
|
||||
U0 LexPutToken(CCmpCtrl *cc)
|
||||
{//Print cur token to StdOut. (Crude)
|
||||
'"';
|
||||
if (cc->token==TK_IDENT || cc->token==TK_STR)
|
||||
"%s",cc->cur_str;
|
||||
else if (cc->token==TK_I64)
|
||||
"INT:%X",cc->cur_i64;
|
||||
else if (cc->token==TK_CHAR_CONST)
|
||||
"U8:%X",cc->cur_i64;
|
||||
else if (cc->token==TK_F64)
|
||||
"FLOAT:%e",cc->cur_f64;
|
||||
else if (cc->token=='\n')
|
||||
"<NEW_LINE>";
|
||||
else if (Bt(char_bmp_displayable,cc->token))
|
||||
'' cc->token;
|
||||
else {
|
||||
"T:%X",cc->token;
|
||||
}
|
||||
"\" ";
|
||||
}
|
||||
|
||||
U8 *LexPutLine(CCmpCtrl *cc,U8 *start)
|
||||
{//Print cur pos to end of line to StdOut.
|
||||
I64 ch;
|
||||
U8 *ptr;
|
||||
if (!start) return NULL;
|
||||
if (cc->lex_include_stk->flags&LFSF_DOC)
|
||||
return DocPutLine(cc->lex_include_stk->doc,start);
|
||||
else {
|
||||
ptr=start;
|
||||
while (ch=*ptr++) {
|
||||
if (ch=='\n') {
|
||||
if (*ptr=='\r')
|
||||
ptr++;
|
||||
break;
|
||||
} else if (ch=='\r') {
|
||||
if (*ptr=='\n')
|
||||
ptr++;
|
||||
break;
|
||||
}
|
||||
'' ch;
|
||||
}
|
||||
if (!ch) ptr--;
|
||||
'\n';
|
||||
return ptr;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
U0 LexPutPos(CCmpCtrl *cc)
|
||||
{//Print token, line link and, then, $LK,"LexPutLine",A="MN:LexPutLine"$().
|
||||
LexPutToken(cc);
|
||||
FixSet(cc->lex_include_stk->full_name,cc->lex_include_stk->line_num);
|
||||
if (IsRaw)
|
||||
"%s,%d ",cc->lex_include_stk->full_name,cc->lex_include_stk->line_num;
|
||||
else {
|
||||
PutFileLink(cc->lex_include_stk->full_name,,cc->lex_include_stk->line_num);
|
||||
AdamErr("%s,%d\n",
|
||||
cc->lex_include_stk->full_name,cc->lex_include_stk->line_num);
|
||||
'' CH_SPACE;
|
||||
}
|
||||
LexPutLine(cc,cc->lex_include_stk->line_start);
|
||||
}
|
||||
|
||||
U0 LexWarn(CCmpCtrl *cc,U8 *str=NULL)
|
||||
{//Print warn msg, then, $LK,"LexPutPos",A="MN:LexPutPos"$().
|
||||
if (str) PrintWarn(str);
|
||||
if (cc->htc.fun) {
|
||||
"in fun '%s'.\n",cc->htc.fun->str;
|
||||
if (IsRaw)
|
||||
"%s\n",cc->htc.fun->src_link;
|
||||
else {
|
||||
"$$LK,\"%s\"$$\n",cc->htc.fun->src_link;
|
||||
AdamErr("%s\n",cc->htc.fun->src_link);
|
||||
}
|
||||
} else
|
||||
LexPutPos(cc);
|
||||
cc->warning_cnt++;
|
||||
}
|
||||
|
||||
U0 LexExcept(CCmpCtrl *cc,U8 *str=NULL)
|
||||
{//Print err msg, $LK,"LexPutPos",A="MN:LexPutPos"$() and throw exception.
|
||||
if (!Bt(&sys_run_level,RLf_ADAM_SERVER)) {
|
||||
Raw(ON);
|
||||
"Note: Still in boot phase.\n";
|
||||
}
|
||||
if (str) PrintErr(str);
|
||||
if (!IsRaw)
|
||||
AdamErr("Task:%08X %s\n",Fs,str);
|
||||
LexPutPos(cc);
|
||||
cc->error_cnt++;
|
||||
FlushMsgs;
|
||||
if (!Bt(&sys_run_level,RLf_ADAM_SERVER))
|
||||
Dbg("Type \"Fix;\"");
|
||||
throw('Compiler');
|
||||
}
|
||||
|
||||
U0 UndefinedExtern()
|
||||
{
|
||||
PrintErr("Undefined Extern\nat %P\n",Caller);
|
||||
throw('UndefExt');
|
||||
}
|
||||
|
||||
U0 UnusedExternWarning(CCmpCtrl *cc,CHashClass *tmpc)
|
||||
{
|
||||
PrintWarn("Unused extern '%s'\n",tmpc->str);
|
||||
cc->warning_cnt++;
|
||||
}
|
||||
|
||||
U0 ParenWarning(CCmpCtrl *cc)
|
||||
{
|
||||
if (Bt(&cc->opts,OPTf_WARN_PAREN) &&
|
||||
!(cc->lex_include_stk->flags&LFSF_DEFINE))
|
||||
LexWarn(cc,"Unnecessary parenthesis ");
|
||||
}
|
||||
|
||||
U0 ICClassPut(CHashClass *c)
|
||||
{
|
||||
I64 i;
|
||||
if (!c) return;
|
||||
if (c->ptr_stars_cnt>4) {
|
||||
PrintErr("put_class ptrcnt=%d\n",c->ptr_stars_cnt);
|
||||
while (TRUE)
|
||||
//TODO:
|
||||
Yield;
|
||||
}
|
||||
for (i=0;i<c->ptr_stars_cnt;i++)
|
||||
'*';
|
||||
c-=c->ptr_stars_cnt;
|
||||
if (c->str)
|
||||
"%s",c->str;
|
||||
else {
|
||||
PrintErr("put_class str=NULL\n");
|
||||
while (TRUE)
|
||||
//TODO:
|
||||
Yield;
|
||||
}
|
||||
'' CH_SPACE;
|
||||
}
|
||||
|
||||
U0 ICArgPut(CICArg *a,I64 type_pointed_to)
|
||||
{
|
||||
if (type_pointed_to)
|
||||
"[%Z](%Z) %Z ",a->type.raw_type,"ST_RAW_TYPES",
|
||||
type_pointed_to,"ST_RAW_TYPES",Bsr(a->type>>8)+1,"ST_TY_TYPES";
|
||||
else
|
||||
"%Z %Z ",a->type.raw_type,"ST_RAW_TYPES",
|
||||
Bsr(a->type>>8)+1,"ST_TY_TYPES";
|
||||
switch (Bsr(a->type)) {
|
||||
case MDf_STK:
|
||||
"STK";
|
||||
break;
|
||||
case MDf_IMM:
|
||||
"#%X",a->disp;
|
||||
break;
|
||||
case MDf_REG:
|
||||
"%Z",a->reg,"ST_U64_REGS";
|
||||
break;
|
||||
case MDf_DISP:
|
||||
"%X[%Z]",a->disp,a->reg,"ST_U64_REGS";
|
||||
break;
|
||||
case MDf_RIP_DISP32:
|
||||
"[%X]",a->disp;
|
||||
break;
|
||||
case MDf_SIB:
|
||||
if (a->disp)
|
||||
"%X",a->disp;
|
||||
if (a->reg==REG_RIP)
|
||||
'[';
|
||||
else
|
||||
"[%Z+",a->reg&15,"ST_U64_REGS";
|
||||
"%Z",a->reg>>8&15,"ST_U64_REGS";
|
||||
switch (a->reg>>14) {
|
||||
case 0: "]"; break;
|
||||
case 1: "*2]"; break;
|
||||
case 2: "*4]"; break;
|
||||
case 3: "*8]"; break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
'' CH_SPACE;
|
||||
}
|
||||
|
||||
U0 ICPut(CCmpCtrl *cc,CIntermediateCode *tmpi)
|
||||
{
|
||||
I64 opcode=tmpi->ic_code,i;
|
||||
if (opcode>=IC_END_EXP && opcode!=IC_NOP2) {
|
||||
"%15ts %016X ",intermediate_code_table[opcode].name,tmpi->ic_data;
|
||||
if (cc->pass) {
|
||||
if (tmpi->res.type.mode) {
|
||||
"$$PURPLE$$RES:$$FG$$";
|
||||
ICArgPut(&tmpi->res,0);
|
||||
}
|
||||
if (tmpi->arg1.type.mode) {
|
||||
"$$PURPLE$$ARG1:$$FG$$";
|
||||
if (intermediate_code_table[tmpi->ic_code].type==IST_DEREF ||
|
||||
intermediate_code_table[tmpi->ic_code].type==IST_ASSIGN)
|
||||
ICArgPut(&tmpi->arg1,tmpi->arg1_type_pointed_to);
|
||||
else
|
||||
ICArgPut(&tmpi->arg1,0);
|
||||
}
|
||||
if (tmpi->arg2.type.mode) {
|
||||
"$$PURPLE$$ARG2:$$FG$$";
|
||||
ICArgPut(&tmpi->arg2,0);
|
||||
}
|
||||
"$$PURPLE$$:$$FG$$";
|
||||
}
|
||||
ICClassPut(tmpi->ic_class);
|
||||
if (tmpi->ic_flags & ICF_LOCK)
|
||||
"$$BROWN$$lock$$FG$$ ";
|
||||
if (tmpi->ic_flags & ICF_ARG2_TO_F64)
|
||||
"$$LTBLUE$$a2d$$FG$$ ";
|
||||
if (tmpi->ic_flags & ICF_ARG2_TO_INT)
|
||||
"$$GREEN$$a2i$$FG$$ ";
|
||||
if (tmpi->ic_flags & ICF_ARG1_TO_F64)
|
||||
"$$LTBLUE$$a1d$$FG$$ ";
|
||||
if (tmpi->ic_flags & ICF_ARG1_TO_INT)
|
||||
"$$GREEN$$a1i$$FG$$ ";
|
||||
if (tmpi->ic_flags & ICF_RES_TO_F64)
|
||||
"$$LTBLUE$$rd$$FG$$ ";
|
||||
if (tmpi->ic_flags & ICF_RES_TO_INT)
|
||||
"$$GREEN$$ri$$FG$$ ";
|
||||
if (tmpi->ic_flags & ICF_USE_F64)
|
||||
"[F64] ";
|
||||
if (tmpi->ic_flags & ICF_USE_UNSIGNED)
|
||||
"[unsigned] ";
|
||||
if (tmpi->ic_flags & ICF_USE_INT)
|
||||
"[int] ";
|
||||
if (tmpi->ic_flags & ICF_RES_NOT_USED)
|
||||
"NO_RES ";
|
||||
if (tmpi->ic_flags & ICF_BY_VAL)
|
||||
"BY_VAL ";
|
||||
if (tmpi->ic_flags & ICF_PUSH_RES)
|
||||
"PUSH ";
|
||||
if (tmpi->ic_flags & ICF_PUSH_CMP)
|
||||
"PUSH_CMP ";
|
||||
if (tmpi->ic_flags & ICF_POP_CMP)
|
||||
"POP_CMP ";
|
||||
if (tmpi->ic_flags & ICF_DEL_PREV_INS)
|
||||
"DEL_PREV ";
|
||||
if (tmpi->ic_flags & ICF_PREV_DELETED)
|
||||
"PREV_DEL ";
|
||||
for (i=0;i<3;i++) {
|
||||
if (Bt(&tmpi->ic_flags,ICf_DONT_PUSH_FLOAT0+i))
|
||||
"DONT_PUSH#%d ",i;
|
||||
if (Bt(&tmpi->ic_flags,ICf_DONT_POP_FLOAT0+i))
|
||||
"DONT_POP#%d ",i;
|
||||
}
|
||||
if (tmpi->ic_flags & ICF_ALT_TEMPLATE)
|
||||
"ALT_TMP ";
|
||||
'\n';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
import U8 *Doc2PlainText(CDoc *doc,CDocEntry *doc_e);
|
||||
import U0 DocBinsValidate(CDoc *doc);
|
||||
import U0 DocDel(CDoc *doc);
|
||||
import U0 DocLoad(CDoc *doc,U8 *src2,I64 size);
|
||||
import CDoc *DocNew(U8 *filename=NULL,CTask *task=NULL);
|
||||
import CDocEntry *DocPrint(CDoc *doc=NULL,U8 *fmt,...);
|
||||
import CDocEntry *DocPutLine(CDoc *doc,CDocEntry *doc_e);
|
||||
import I64 DocSize(CDoc *doc);
|
||||
import Bool DocWrite(CDoc *doc,Bool prompt=FALSE);
|
||||
extern U8 *CmdLinePmt();
|
||||
extern I64 HashEntrySize2(CHashSrcSym *tmph);
|
||||
extern Bool IsLexExpression2Bin(CCmpCtrl *cc,U8 **_machine_code);
|
||||
extern I64 Lex(CCmpCtrl *cc);
|
||||
extern I64 LexExpression(CCmpCtrl *cc);
|
||||
extern I64 LexGetChar(CCmpCtrl *cc);
|
||||
extern CCodeMisc *OptLabelFwd(CCodeMisc *lb);
|
||||
extern CIntermediateCode *OptPass012(CCmpCtrl *cc);
|
||||
extern U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets);
|
||||
extern U0 OptPass4(CCmpCtrl *cc,COptReg *reg_offsets,I64 *_type);
|
||||
extern U0 OptPass5(CCmpCtrl *cc);
|
||||
extern U0 OptPass6(CCmpCtrl *cc);
|
||||
extern I64 OptPass789A(
|
||||
CCmpCtrl *cc,COptReg *reg_offsets,U8 *buf,CDbgInfo **_dbg);
|
||||
extern CHashClass *PrsClass(
|
||||
CCmpCtrl *cc,I64 keyword,I64 fsp_flags,Bool is_extern);
|
||||
extern CHashFun *PrsFunJoin(
|
||||
CCmpCtrl *cc,CHashClass *tmp_return,U8 *name,I64 fsp_flags);
|
||||
extern I64 PrsKeyWord(CCmpCtrl *cc);
|
||||
extern Bool PrsStmt(CCmpCtrl *cc,I64 try_cnt=0,
|
||||
CCodeMisc *lb_break=NULL,I64 cmp_flags=CMPF_PRS_SEMICOLON);
|
||||
extern U0 PrsStreamBlk(CCmpCtrl *cc);
|
||||
extern CHashClass *PrsType(CCmpCtrl *cc,CHashClass **_tmpc1,
|
||||
I64 *_mode,CMemberLst *tmpm,U8 **_ident,CHashFun **_fun_ptr,
|
||||
CHashExport **_tmpex,CArrayDim *tmpad,I64 fsp_flags);
|
||||
extern I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,
|
||||
CMemberLst **_local_var,CArrayDim **_tmpad,I64 *unary_post_prec);
|
||||
extern I64 PrsUnaryTerm(
|
||||
CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tmpad,
|
||||
I64 *max_prec,I64 *unary_pre_prec,I64 *paren_prec);
|
||||
extern U0 PrsVarInit2(CCmpCtrl *cc,U8 **_dst,CHashClass *tmpc,
|
||||
CArrayDim *tmpad,U8 *data_addr_rip,U8 **_base,Bool data_heap,I64 pass);
|
||||
_extern CMP_TEMPLATES U32 cmp_templates[1];
|
||||
_extern CMP_TEMPLATES_DONT_POP U32 cmp_templates_dont_pop[1];
|
||||
_extern CMP_TEMPLATES_DONT_PUSH2 U32 cmp_templates_dont_push2[1];
|
||||
_extern CMP_TEMPLATES_DONT_PUSH U32 cmp_templates_dont_push[1];
|
||||
_extern CMP_TEMPLATES_DONT_PUSH_POP U32 cmp_templates_dont_push_pop[1];
|
||||
@@ -0,0 +1,141 @@
|
||||
I64 HashEntrySize(CHashSrcSym *tmph)
|
||||
{//Logical size of a std system hash entry.
|
||||
CDbgInfo *dbg_info;
|
||||
CBinFile *bfh;
|
||||
switch (HashTypeNum(tmph)) {
|
||||
case HTt_DEFINE_STR:
|
||||
return MSize(tmph(CHashDefineStr *)->data);
|
||||
case HTt_GLBL_VAR:
|
||||
case HTt_CLASS:
|
||||
case HTt_INTERNAL_TYPE:
|
||||
return tmph(CHashClass *)->size;
|
||||
case HTt_FUN:
|
||||
if (dbg_info=tmph->dbg_info)
|
||||
return dbg_info->body[dbg_info->max_line+1-dbg_info->min_line]
|
||||
-dbg_info->body[0];
|
||||
else
|
||||
return -1;
|
||||
case HTt_FILE:
|
||||
return MSize(tmph(CHashGeneric *)->user_data0);
|
||||
case HTt_MODULE:
|
||||
if (StrCmp(tmph->str,KERNEL_MODULE_NAME))
|
||||
return MSize(tmph(CHashGeneric *)->user_data0);
|
||||
else {
|
||||
bfh=mem_boot_base-sizeof(CBinFile);
|
||||
return bfh->file_size;
|
||||
}
|
||||
case HTt_WORD:
|
||||
return StrLen(tmph->str);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
I64 HashEntrySize2(CHashSrcSym *tmph)
|
||||
{//Memory size of a std system hash entry.
|
||||
CDbgInfo *dbg_info;
|
||||
I64 res=MSize2(tmph);
|
||||
if (!(tmph->type&HTT_DICT_WORD))
|
||||
res+=MSize2(tmph->str);
|
||||
if (tmph->type & HTG_SRC_SYM) {
|
||||
res+=MSize2(tmph->src_link);
|
||||
res+=MSize2(tmph->idx);
|
||||
res+=MSize2(tmph->import_name);
|
||||
res+=LinkedLstSize(tmph->ie_lst);
|
||||
if (tmph->type & (HTT_FUN | HTT_EXPORT_SYS_SYM))
|
||||
res+=MSize2(tmph->dbg_info);
|
||||
if (tmph->type & HTT_CLASS)
|
||||
res+=MemberLstSize(tmph);
|
||||
else if (tmph->type & HTT_FUN) {
|
||||
res+=MemberLstSize(tmph);
|
||||
if (dbg_info=tmph->dbg_info)
|
||||
//This should be $LK,"MSize",A="MN:MSize"$() but it would crash on AOT .BIN.Z file funs.
|
||||
res+=dbg_info->body[dbg_info->max_line+1-dbg_info->min_line]
|
||||
-dbg_info->body[0];
|
||||
} else if (tmph->type&HTT_DEFINE_STR)
|
||||
res+=MSize2(tmph(CHashDefineStr *)->data);
|
||||
else if (tmph->type & HTT_GLBL_VAR) {
|
||||
res+=LinkedLstSize(tmph(CHashGlblVar *)->dim.next);
|
||||
if (!(tmph(CHashGlblVar *)->flags&GVF_ALIAS))
|
||||
res+=MSize2(tmph(CHashGlblVar *)->data_addr);
|
||||
if (tmph(CHashGlblVar *)->fun_ptr)
|
||||
res+=HashEntrySize2(tmph(CHashGlblVar *)->fun_ptr
|
||||
-tmph(CHashGlblVar *)->fun_ptr->ptr_stars_cnt);
|
||||
}
|
||||
} else if (tmph->type & HTT_FILE)
|
||||
res+=MSize2(tmph(CHashGeneric *)->user_data0);
|
||||
else if (tmph->type & HTT_MODULE &&
|
||||
StrCmp(tmph->str,KERNEL_MODULE_NAME))
|
||||
res+=MSize2(tmph(CHashGeneric *)->user_data0);
|
||||
return res;
|
||||
}
|
||||
|
||||
I64 HashTableSize2(CHashTable *table)
|
||||
{//Memory size of std system hash table and all entries.
|
||||
I64 i,res=0;
|
||||
CHashSrcSym *tmph;
|
||||
if (!table)
|
||||
return 0;
|
||||
for (i=0;i<=table->mask;i++) {
|
||||
tmph=table->body[i];
|
||||
while (tmph) {
|
||||
res+=HashEntrySize2(tmph);
|
||||
tmph=tmph->next;
|
||||
}
|
||||
}
|
||||
res+=MSize2(table->body);
|
||||
res+=MSize2(table);
|
||||
return res;
|
||||
}
|
||||
|
||||
U0 MapFileWrite(CHashTable *h,U8 *map_name,U8 drv_let)
|
||||
{
|
||||
CHashSrcSym *tmph;
|
||||
I64 i,size;
|
||||
U8 *src_link;
|
||||
CDoc *doc;
|
||||
CDocBin *tmpb;
|
||||
CDbgInfo *dbg_info;
|
||||
|
||||
doc=DocNew(map_name);
|
||||
doc->flags|=DOCF_NO_CURSOR;
|
||||
for (i=0;i<=h->mask;i++) {
|
||||
tmph=h->body[i];
|
||||
while (tmph) {
|
||||
if (tmph->src_link && !(tmph->type & (HTF_IMPORT | HTF_PRIVATE))) {
|
||||
src_link=StrNew(tmph->src_link);
|
||||
if (drv_let && StrLen(src_link)>=4)
|
||||
src_link[3]=drv_let;
|
||||
if (dbg_info=tmph->dbg_info) {
|
||||
size=offset(CDbgInfo.body)+
|
||||
sizeof(U32)*(dbg_info->max_line+2-dbg_info->min_line);
|
||||
if (size>MSize(dbg_info)) {
|
||||
"Corrupt Map Entry\n";
|
||||
dbg_info=NULL;
|
||||
} else {
|
||||
if (dbg_info->min_line<=dbg_info->max_line) {
|
||||
tmpb=CAlloc(sizeof(CDocBin));
|
||||
tmpb->size=size;
|
||||
tmpb->data=MAlloc(size);
|
||||
MemCpy(tmpb->data,dbg_info,size);
|
||||
tmpb->num=doc->cur_bin_num++;
|
||||
tmpb->use_cnt=1;
|
||||
QueIns(tmpb,doc->bin_head.last);
|
||||
} else
|
||||
dbg_info=NULL;
|
||||
}
|
||||
}
|
||||
if (dbg_info)
|
||||
DocPrint(doc,"$$LK,\"%s\",A=\"%s\",BI=%d$$\n",
|
||||
tmph->str,src_link,tmpb->num);
|
||||
else
|
||||
DocPrint(doc,"$$LK,\"%s\",A=\"%s\"$$\n",tmph->str,src_link);
|
||||
|
||||
Free(src_link);
|
||||
}
|
||||
tmph=tmph->next;
|
||||
}
|
||||
}
|
||||
DocBinsValidate(doc);
|
||||
DocWrite(doc);
|
||||
DocDel(doc);
|
||||
}
|
||||
@@ -0,0 +1,330 @@
|
||||
#define INTERNAL_TYPES_NUM 17
|
||||
|
||||
class CInternalType
|
||||
{
|
||||
U8 type,size,name[8];
|
||||
} internal_types_table[INTERNAL_TYPES_NUM]={
|
||||
{RT_I0,0,"I0i"},{RT_I0,0,"I0"},{RT_U0,0,"U0i"},{RT_U0,0,"U0"},
|
||||
{RT_I8,1,"I8i"},{RT_I8,1,"I8"},{RT_I8,1,"Bool"},
|
||||
{RT_U8,1,"U8i"},{RT_U8,1,"U8"},
|
||||
{RT_I16,2,"I16i"},{RT_U16,2,"U16i"},
|
||||
{RT_I32,4,"I32i"},{RT_U32,4,"U32i"},
|
||||
{RT_I64,8,"I64i"},{RT_U64,8,"U64i"},
|
||||
{RT_F64,8,"F64i"},{RT_F64,8,"F64"},
|
||||
};
|
||||
|
||||
CIntermediateStruct intermediate_code_table[IC_ICS_NUM]={
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"END"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"NOP1"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"END_EXP"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"NOP2"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"LABEL"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"CALL_START"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"CALL_END"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"CALL_END2"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"RETURN_VAL"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"RETURN_VAL2"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"IMM_I64"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"IMM_F64"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"STR_CONST"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"ABS_ADDR"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"ADDR_IMPORT"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"HEAP_GLBL"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"SIZEOF"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"TYPE"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"GET_LABEL"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"RBP"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"REG"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"FS"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"MOV_FS"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GS"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"MOV_GS"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"LEA"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"MOV"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TO_I64"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TO_F64"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TO_BOOL"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TOUPPER"},
|
||||
{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"HOLYC_TYPECAST"},
|
||||
{IS_1_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"ADDR"},
|
||||
{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"COM"},
|
||||
{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"NOT"},
|
||||
{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"UNARY_MINUS"},
|
||||
{IS_1_ARG,1,IST_DEREF,FALSE,TRUE,0,0,0,"DEREF"},
|
||||
{IS_1_ARG,1,IST_DEREF,FALSE,TRUE,0,0,0,"DEREF_PP"},
|
||||
{IS_1_ARG,1,IST_DEREF,FALSE,TRUE,0,0,0,"DEREF_MM"},
|
||||
{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"_PP"},
|
||||
{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"_MM"},
|
||||
{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"PP_"},
|
||||
{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"MM_"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"SHL"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"SHR"},
|
||||
{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"SHL_CONST"},
|
||||
{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"SHR_CONST"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"POWER"},
|
||||
{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"MUL"},
|
||||
{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"DIV"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"MOD"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"AND"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"OR"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"XOR"},
|
||||
{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"ADD"},
|
||||
{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SUB"},
|
||||
{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"ADD_CONST"},
|
||||
{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"SUB_CONST"},
|
||||
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"EQU_EQU"},
|
||||
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"NOT_EQU"},
|
||||
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"LESS"},
|
||||
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"GREATER_EQU"},
|
||||
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"GREATER"},
|
||||
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"LESS_EQU"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"PUSH_CMP"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"AND_AND"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"OR_OR"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"XOR_XOR"},
|
||||
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ASSIGN"},
|
||||
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ASSIGN_PP"},
|
||||
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ASSIGN_MM"},
|
||||
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"SHL_EQU"},
|
||||
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"SHR_EQU"},
|
||||
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"MUL_EQU"},
|
||||
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"DIV_EQU"},
|
||||
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"MOD_EQU"},
|
||||
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"AND_EQU"},
|
||||
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"OR_EQU"},
|
||||
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"XOR_EQU"},
|
||||
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ADD_EQU"},
|
||||
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"SUB_EQU"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"JMP"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SUB_CALL"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SWITCH"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"NOBOUND_SWITCH"},
|
||||
{IS_V_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ADD_RSP"},
|
||||
{IS_V_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ADD_RSP1"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ENTER"},
|
||||
{IS_0_ARG,0,IST_ASSIGN,FALSE,FALSE,0,0,0,"PUSH_REGS"},
|
||||
{IS_0_ARG,0,IST_ASSIGN,FALSE,FALSE,0,0,0,"POP_REGS"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"LEAVE"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"RET"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_INDIRECT"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_INDIRECT2"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_IMPORT"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_EXTERN"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"ASM"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"PUSH"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"POP"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CLFLUSH"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"INVLPG"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"IN_U8"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"IN_U16"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"IN_U32"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"OUT_U8"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"OUT_U16"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"OUT_U32"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RFLAGS"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CARRY"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RFLAGS"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RAX"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RAX"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RBP"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RBP"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RSP"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RSP"},
|
||||
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"RIP"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"RDTSC"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BT"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BTS"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BTR"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BTC"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"LBTS"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"LBTR"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"LBTC"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BSF"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BSR"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_INIT"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_INS"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_INS_REV"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_REM"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"STRLEN"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_ZERO"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_NOT_ZERO"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_CARRY"},
|
||||
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_NOT_CARRY"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_EQU_EQU"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_NOT_EQU"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_LESS"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_GREATER_EQU"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_GREATER"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_LESS_EQU"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2EQU_EQU"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2NOT_EQU"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2LESS"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2GREATER_EQU"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2GREATER"},
|
||||
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2LESS_EQU"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_ZERO"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_NOT_ZERO"},
|
||||
{IS_1_ARG,0,IST_DEREF,FALSE,TRUE,0,0,0,"BR_MM_ZERO"},
|
||||
{IS_1_ARG,0,IST_DEREF,FALSE,TRUE,0,0,0,"BR_MM_NOT_ZERO"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_AND_ZERO"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_AND_NOT_ZERO"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_OR_OR_ZERO"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_OR_OR_NOT_ZERO"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BT"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BTS"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BTR"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BTC"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BT"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BTS"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BTR"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BTC"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U8"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U16"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U32"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U64"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ABS_I64"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SIGN_I64"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"I64_MIN"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"U64_MIN"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"I64_MAX"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"U64_MAX"},
|
||||
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MOD_U64"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SQRI64"},
|
||||
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SQRU64"},
|
||||
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SQR"},
|
||||
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"ABS"},
|
||||
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SQRT"},
|
||||
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SIN"},
|
||||
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"COS"},
|
||||
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"TAN"},
|
||||
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"ATAN"},
|
||||
};
|
||||
|
||||
U0 CmpLoadDefines()
|
||||
{
|
||||
DefineLstLoad("ST_RAW_TYPES",
|
||||
" \0 \0I0\0U0\0I8\0U8\0I16\0U16\0I32\0U32\0I64\0U64\0"
|
||||
"F32\0UF32\0F64\0UF64\0");
|
||||
DefineLstLoad("ST_NATURAL_TYPES",
|
||||
"I8\0U8\0I16\0U16\0I32\0U32\0I64\0U64\0F64\0String\0");
|
||||
DefineLstLoad("ST_INT_SIZE_TYPES",
|
||||
"I8\0U8\0I16\0U16\0I32\0U32\0I64\0U64\0");
|
||||
DefineLstLoad("ST_TY_TYPES","NULL\0STK\0IMM\0REG\0DISP\0SIB\0RIP\0");
|
||||
DefineLstLoad("ST_U8_REGS","AL\0CL\0DL\0BL\0AH\0CH\0DH\0BH\0"
|
||||
"R8u8\0R9u8\0R10u8\0R11u8\0R12u8\0R13u8\0R14u8\0R15u8\0");
|
||||
DefineLstLoad("ST_U8_REX_REGS","AL\0CL\0DL\0BL\0RSPu8\0RBPu8\0RSIu8\0RDIu8\0"
|
||||
"R8u8\0R9u8\0R10u8\0R11u8\0R12u8\0R13u8\0R14u8\0R15u8\0");
|
||||
DefineLstLoad("ST_U16_REGS","AX\0CX\0DX\0BX\0SP\0BP\0SI\0DI\0"
|
||||
"R8u16\0R9u16\0R10u16\0R11u16\0R12u16\0R13u16\0R14u16\0R15u16\0");
|
||||
DefineLstLoad("ST_U32_REGS","EAX\0ECX\0EDX\0EBX\0ESP\0EBP\0ESI\0EDI\0"
|
||||
"R8u32\0R9u32\0R10u32\0R11u32\0R12u32\0R13u32\0R14u32\0R15u32\0");
|
||||
DefineLstLoad("ST_U64_REGS","RAX\0RCX\0RDX\0RBX\0RSP\0RBP\0RSI\0RDI\0"
|
||||
"R8\0R9\0R10\0R11\0R12\0R13\0R14\0R15\0");
|
||||
DefineLstLoad("ST_MM_REGS","MM0\0MM1\0MM2\0MM3\0MM4\0MM5\0MM6\0MM7\0");
|
||||
DefineLstLoad("ST_XMM_REGS",
|
||||
"XMM0\0XMM1\0XMM2\0XMM3\0XMM4\0XMM5\0XMM6\0XMM7\0");
|
||||
DefineLstLoad("ST_ARG_TYPES","NONE\0REL8\0REL16\0REL32\0"
|
||||
"IMM8\0IMM16\0IMM32\0IMM64\0UIMM8\0UIMM16\0UIMM32\0UIMM64\0"
|
||||
"R8\0R16\0R32\0R64\0RM8\0RM16\0RM32\0RM64\0"
|
||||
"M8\0M16\0M32\0M64\0M1632\0M16N32\0M16N16\0M32N32\0"
|
||||
"MOFFS8\0MOFFS16\0MOFFS32\0MOFFS64\0"
|
||||
"AL\0AX\0EAX\0RAX\0CL\0DX\0 \0SREG\0"
|
||||
"SS\0DS\0ES\0FS\0GS\0CS\0ST0\0STI\0"
|
||||
"MM\0MM32\0MM64\0XMM\0XMM32\0XMM64\0XMM128\0XMM0\0");
|
||||
DefineLstLoad("ST_SEG_REGS","ES\0CS\0SS\0DS\0FS\0GS\0");
|
||||
DefineLstLoad("ST_FSTK_REGS","ST0\0ST1\0ST2\0ST3\0ST4\0ST5\0ST6\0ST7\0");
|
||||
}
|
||||
|
||||
U0 CmpFillTables()
|
||||
{
|
||||
I64 i;
|
||||
U32 *d;
|
||||
|
||||
cmp.to_reg_vars_map=CAlloc(REG_REGS_NUM*sizeof(U8));
|
||||
cmp.num_reg_vars=0;
|
||||
cmp.reg_vars_mask=REGG_LOCAL_VARS;
|
||||
for (i=0;i<REG_REGS_NUM;i++)
|
||||
if (Bt(&cmp.reg_vars_mask,i))
|
||||
cmp.to_reg_vars_map[cmp.num_reg_vars++]=i;
|
||||
|
||||
cmp.non_ptr_vars_map=CAlloc(REG_REGS_NUM*sizeof(U8));
|
||||
cmp.num_non_ptr_vars=0;
|
||||
cmp.non_ptr_vars_mask=REGG_LOCAL_NON_PTR_VARS;
|
||||
for (i=0;i<REG_REGS_NUM;i++)
|
||||
if (Bt(&cmp.non_ptr_vars_mask,i))
|
||||
cmp.non_ptr_vars_map[cmp.num_non_ptr_vars++]=i;
|
||||
|
||||
cmp.dual_U16_tokens1=d=CAlloc(sizeof(U32)*TK_TKS_NUM);
|
||||
d['!']=TK_NOT_EQU<<16+'=';
|
||||
d['&']=TK_AND_AND<<16+'&';
|
||||
d['*']=TK_MUL_EQU<<16+'=';
|
||||
d['+']=TK_PLUS_PLUS<<16+'+';
|
||||
d['-']=TK_DEREFERENCE<<16+'>';
|
||||
d['/']='*';
|
||||
d[':']=TK_DBL_COLON<<16+':';
|
||||
d['<']=TK_LESS_EQU<<16+'=';
|
||||
d['=']=TK_EQU_EQU<<16+'=';
|
||||
d['>']=TK_GREATER_EQU<<16+'=';
|
||||
d['^']=TK_XOR_EQU<<16+'=';
|
||||
d['|']=TK_OR_OR<<16+'|';
|
||||
d['%']=TK_MOD_EQU<<16+'=';
|
||||
|
||||
cmp.dual_U16_tokens2=d=CAlloc(sizeof(U32)*TK_TKS_NUM);
|
||||
d['&']=TK_AND_EQU<<16+'=';
|
||||
d['+']=TK_ADD_EQU<<16+'=';
|
||||
d['-']=TK_MINUS_MINUS<<16+'-';
|
||||
d['/']='/';
|
||||
d['<']=TK_SHL<<16+'<';
|
||||
d['>']=TK_SHR<<16+'>';
|
||||
d['^']=TK_XOR_XOR<<16+'^';
|
||||
d['|']=TK_OR_EQU<<16+'=';
|
||||
|
||||
cmp.dual_U16_tokens3=d=CAlloc(sizeof(U32)*TK_TKS_NUM);
|
||||
d['-']=TK_SUB_EQU<<16+'=';
|
||||
d['/']=TK_DIV_EQU<<16+'=';
|
||||
|
||||
cmp.binary_ops=d=CAlloc(sizeof(U32)*TK_TKS_NUM);
|
||||
d['`'] =(PREC_EXP+ASSOCF_RIGHT)<<16+IC_POWER;
|
||||
d[TK_SHL]=(PREC_EXP+ASSOCF_LEFT)<<16+IC_SHL;
|
||||
d[TK_SHR]=(PREC_EXP+ASSOCF_LEFT)<<16+IC_SHR;
|
||||
|
||||
d['*']=PREC_MUL<<16+IC_MUL;
|
||||
d['/']=(PREC_MUL+ASSOCF_LEFT)<<16+IC_DIV;
|
||||
d['%']=(PREC_MUL+ASSOCF_LEFT)<<16+IC_MOD;
|
||||
|
||||
d['&']=PREC_AND<<16+IC_AND;
|
||||
|
||||
d['^']=PREC_XOR<<16+IC_XOR;
|
||||
|
||||
d['|']=PREC_OR<<16+IC_OR;
|
||||
|
||||
d['+']=PREC_ADD<<16+IC_ADD;
|
||||
d['-']=(PREC_ADD+ASSOCF_LEFT)<<16+IC_SUB;
|
||||
|
||||
d['<'] =PREC_CMP<<16+IC_LESS;
|
||||
d['>'] =PREC_CMP<<16+IC_GREATER;
|
||||
d[TK_LESS_EQU] =PREC_CMP<<16+IC_LESS_EQU;
|
||||
d[TK_GREATER_EQU] =PREC_CMP<<16+IC_GREATER_EQU;
|
||||
|
||||
d[TK_EQU_EQU] =PREC_CMP2<<16+IC_EQU_EQU;
|
||||
d[TK_NOT_EQU] =PREC_CMP2<<16+IC_NOT_EQU;
|
||||
|
||||
d[TK_AND_AND] =PREC_AND_AND<<16+IC_AND_AND;
|
||||
|
||||
d[TK_XOR_XOR] =PREC_XOR_XOR<<16+IC_XOR_XOR;
|
||||
|
||||
d[TK_OR_OR] =PREC_OR_OR<<16+IC_OR_OR;
|
||||
|
||||
d['='] =(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_ASSIGN;
|
||||
d[TK_SHL_EQU]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_SHL_EQU;
|
||||
d[TK_SHR_EQU]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_SHR_EQU;
|
||||
d[TK_MUL_EQU]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_MUL_EQU;
|
||||
d[TK_DIV_EQU]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_DIV_EQU;
|
||||
d[TK_MOD_EQU]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_MOD_EQU;
|
||||
d[TK_AND_EQU]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_AND_EQU;
|
||||
d[TK_OR_EQU] =(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_OR_EQU;
|
||||
d[TK_XOR_EQU]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_XOR_EQU;
|
||||
d[TK_ADD_EQU]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_ADD_EQU;
|
||||
d[TK_SUB_EQU]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_SUB_EQU;
|
||||
}
|
||||
@@ -0,0 +1,702 @@
|
||||
U8 *LexStmt2Bin(CCmpCtrl *cc,I64 *_type,I64 cmp_flags=0)
|
||||
{//Compile one cc stmt to bin code.
|
||||
I64 size,i,j,k,*res=INVALID_PTR;
|
||||
CCodeCtrl *tmpcbh;
|
||||
if (_type) *_type=RT_I64;
|
||||
Btr(&cc->flags,CCf_PASS_TRACE_PRESENT);
|
||||
if (cc->aot_depth==2)
|
||||
COCPush(cc);
|
||||
COCInit(cc);
|
||||
if (!PrsStmt(cc,,,cmp_flags)) {
|
||||
if (cc->coc.coc_head.next!=&cc->coc.coc_head) {
|
||||
cc->coc.coc_head.last->ic_flags&=~ICF_RES_NOT_USED;
|
||||
ICAdd(cc,IC_RETURN_VAL2,0,0);
|
||||
ICAdd(cc,IC_RET,0,0);
|
||||
if (res=COCCompile(cc,&size,NULL,_type)) {
|
||||
if (cc->flags&CCF_AOT_COMPILE) {
|
||||
j=cc->aotc->rip;
|
||||
k=(size+7)>>3;
|
||||
for (i=0;i<k;i++)
|
||||
AOTStoreCodeU64(cc,res[i]);
|
||||
Free(res);
|
||||
res=j;
|
||||
}
|
||||
}
|
||||
} //TODO: else del misc?
|
||||
} else //TODO: too dangerous to del Misc?
|
||||
QueDel(&cc->coc.coc_head.next);
|
||||
if (cc->aot_depth==2) {
|
||||
tmpcbh=COCPopNoFree(cc);
|
||||
COCAppend(cc,tmpcbh);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
CAOT *CmpJoin(CCmpCtrl *cc,I64 cmp_flags,U8 *map_name=NULL,U8 mapfile_drv_let=0)
|
||||
{
|
||||
CAOTCtrl *aotc,*old_aot=cc->aotc;
|
||||
I64 i,j,l;
|
||||
U8 *buf;
|
||||
CAOTBinBlk *tmpbin;
|
||||
CAOTImportExport *tmpie;
|
||||
Bool okay=TRUE;
|
||||
CLexHashTableContext *htc=MAlloc(sizeof(CLexHashTableContext));
|
||||
CAOT *res=CAlloc(sizeof(CAOT)),*parent;
|
||||
if (parent=cc->aot) {
|
||||
res->parent_aot=parent;
|
||||
QueIns(res,parent->last);
|
||||
} else
|
||||
QueInit(res);
|
||||
cc->aot=res;
|
||||
|
||||
res->next_ie=res->last_ie=&res->next_ie;
|
||||
cc->aotc=aotc=CAlloc(sizeof(CAOTCtrl));
|
||||
cc->aot_depth++;
|
||||
|
||||
aotc->bin=CAlloc(sizeof(CAOTBinBlk));
|
||||
aotc->max_align_bits=0;
|
||||
aotc->module_org=INVALID_PTR;
|
||||
|
||||
MemCpy(htc,&cc->htc,sizeof(CLexHashTableContext));
|
||||
if (cc->htc.fun)
|
||||
cc->htc.glbl_hash_table=HashTableNew(128);
|
||||
else
|
||||
cc->htc.glbl_hash_table=HashTableNew(1024);
|
||||
if (cc->flags&CCF_AOT_COMPILE) {
|
||||
cc->htc.define_hash_table=cc->htc.glbl_hash_table;
|
||||
if (cc->aot_depth<=1)
|
||||
cc->htc.glbl_hash_table->next=cmp.asm_hash;
|
||||
else
|
||||
cc->htc.glbl_hash_table->next=htc->glbl_hash_table;
|
||||
} else
|
||||
cc->htc.glbl_hash_table->next=Fs->hash_table;
|
||||
cc->htc.hash_table_lst=cc->htc.local_hash_table=HashTableNew(16);
|
||||
cc->htc.local_hash_table->next=cc->htc.glbl_hash_table;
|
||||
cc->htc.local_var_lst=cc->htc.fun; //HolyC local vars
|
||||
cc->htc.fun=NULL;
|
||||
try {
|
||||
if (cmp_flags&CMPF_LEX_FIRST)
|
||||
Lex(cc);
|
||||
if (!(cmp_flags&CMPF_ONE_ASM_INS))
|
||||
cmp_flags|=CMPF_PRS_SEMICOLON;
|
||||
if (cc->flags&CCF_AOT_COMPILE) {
|
||||
while (cc->token!=TK_EOF) {
|
||||
buf=LexStmt2Bin(cc,NULL,cmp_flags);
|
||||
if (buf!=INVALID_PTR) {
|
||||
tmpie=CAlloc(sizeof(CAOTImportExport));
|
||||
tmpie->type=IET_MAIN;
|
||||
tmpie->rip=buf;
|
||||
QueIns(tmpie,res->last_ie);
|
||||
}
|
||||
if (cmp_flags&CMPF_ASM_BLK)
|
||||
break;
|
||||
}
|
||||
} else
|
||||
PrsStmt(cc,,,cmp_flags);
|
||||
AOTGlblsResolve(cc,res);
|
||||
} catch {
|
||||
if (Fs->except_ch=='Compiler' && !(cmp_flags&CMPF_ASM_BLK)) {
|
||||
LexPutPos(cc);
|
||||
Fs->catch_except=TRUE;
|
||||
}
|
||||
okay=FALSE;
|
||||
}
|
||||
if (!okay) {
|
||||
if (cc->error_cnt<1)
|
||||
cc->error_cnt=1;
|
||||
cc->aot=res->parent_aot;
|
||||
Free(res);
|
||||
LinkedLstDel(aotc->bin);
|
||||
res=NULL;
|
||||
} else {
|
||||
if (map_name)
|
||||
MapFileWrite(cc->htc.glbl_hash_table,map_name,mapfile_drv_let);
|
||||
HashTableDel(cc->htc.local_hash_table);
|
||||
HashTableDel(cc->htc.glbl_hash_table);
|
||||
|
||||
if (!aotc->num_bin_U8s)
|
||||
res->buf=NULL;
|
||||
else {
|
||||
if (cc->flags&CCF_AOT_COMPILE)
|
||||
res->buf=MAlloc(aotc->num_bin_U8s);
|
||||
else {
|
||||
if (aotc->module_org==INVALID_PTR)
|
||||
res->buf=MAlloc(aotc->num_bin_U8s,Fs->code_heap);
|
||||
else
|
||||
res->buf=aotc->module_org;
|
||||
}
|
||||
res->aot_U8s=aotc->num_bin_U8s;
|
||||
tmpbin=aotc->bin;
|
||||
j=0;
|
||||
l=aotc->num_bin_U8s;
|
||||
while (tmpbin) {
|
||||
i=l;
|
||||
if (i>AOT_BIN_BLK_SIZE)
|
||||
i=AOT_BIN_BLK_SIZE;
|
||||
MemCpy(res->buf+j,tmpbin->body,i);
|
||||
j+=i;
|
||||
l-=i;
|
||||
tmpbin=tmpbin->next;
|
||||
}
|
||||
}
|
||||
LinkedLstDel(aotc->bin);
|
||||
res->abss=aotc->abss;
|
||||
res->heap_glbls=aotc->heap_glbls;
|
||||
res->max_align_bits=aotc->max_align_bits;
|
||||
res->module_org=aotc->module_org;
|
||||
}
|
||||
cc->aot=parent;
|
||||
MemCpy(&cc->htc,htc,sizeof(CLexHashTableContext));
|
||||
Free(htc);
|
||||
Free(aotc);
|
||||
cc->aotc=old_aot;
|
||||
cc->aot_depth--;
|
||||
return res;
|
||||
}
|
||||
|
||||
CAOT *CmpBuf(U8 *buf,U8 *map_name=NULL,
|
||||
I64 *error_cnt=NULL, I64 *warning_cnt=NULL,U8 mapfile_drv_let=0)
|
||||
{
|
||||
CCmpCtrl *cc;
|
||||
CAOT *res=NULL;
|
||||
cc=CmpCtrlNew(buf,CCF_DONT_FREE_BUF);
|
||||
cc->flags|=CCF_AOT_COMPILE;
|
||||
QueIns(cc,Fs->last_cc);
|
||||
res=CmpJoin(cc,CMPF_LEX_FIRST,map_name,mapfile_drv_let);
|
||||
if (error_cnt) *error_cnt=cc->error_cnt;
|
||||
if (warning_cnt) *warning_cnt=cc->warning_cnt;
|
||||
QueRem(cc);
|
||||
if (res)
|
||||
CmpCtrlDel(cc);
|
||||
return res;
|
||||
}
|
||||
|
||||
U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
{
|
||||
I64 i,rip2=tmpaot->buf+tmpaot->rip,*str=NULL;
|
||||
U8 *ptr;
|
||||
CCodeMisc *g_lb;
|
||||
CAOTAbsAddr *tmpa,*tmpa1;
|
||||
CAOTImportExport *tmpie,*tmpie1;
|
||||
CHashExport *tmpex;
|
||||
|
||||
tmpa=tmpaot->abss;
|
||||
while (tmpa) {
|
||||
tmpa1=tmpa->next;
|
||||
ptr=rip2+tmpa->rip;
|
||||
switch [tmpa->type] {
|
||||
case AAT_ADD_U8: *ptr(U8 *) +=rip2; break;
|
||||
case AAT_SUB_U8: *ptr(U8 *) -=rip2; break;
|
||||
case AAT_ADD_U16: *ptr(U16 *)+=rip2; break;
|
||||
case AAT_SUB_U16: *ptr(U16 *)-=rip2; break;
|
||||
case AAT_ADD_U32: *ptr(U32 *)+=rip2; break;
|
||||
case AAT_SUB_U32: *ptr(U32 *)-=rip2; break;
|
||||
case AAT_ADD_U64: *ptr(I64 *)+=rip2; break;
|
||||
case AAT_SUB_U64: *ptr(I64 *)-=rip2; break;
|
||||
}
|
||||
Free(tmpa);
|
||||
tmpa=tmpa1;
|
||||
}
|
||||
tmpie=tmpaot->next_ie;
|
||||
while (tmpie!=&tmpaot->next_ie) {
|
||||
tmpie1=tmpie->next;
|
||||
if (tmpie->str) {
|
||||
Free(str);
|
||||
str=tmpie->str;
|
||||
}
|
||||
switch (tmpie->type) {
|
||||
case IET_REL32_EXPORT:
|
||||
case IET_IMM32_EXPORT:
|
||||
case IET_REL64_EXPORT:
|
||||
case IET_IMM64_EXPORT:
|
||||
tmpex=CAlloc(sizeof(CHashExport));
|
||||
tmpex->str=str;
|
||||
str=NULL;
|
||||
tmpex->type=HTT_EXPORT_SYS_SYM|HTF_IMM;
|
||||
if (tmpie->type==IET_IMM32_EXPORT||tmpie->type==IET_IMM64_EXPORT)
|
||||
tmpex->val=tmpie->rip;
|
||||
else
|
||||
tmpex->val=tmpie->rip+rip2;
|
||||
tmpex->src_link=tmpie->src_link;
|
||||
tmpie->src_link=NULL;
|
||||
HashAdd(tmpex,Fs->hash_table);
|
||||
SysSymImportsResolve(tmpex->str);
|
||||
break;
|
||||
case IET_REL_I0...IET_IMM_I64:
|
||||
if (tmpie->str) {
|
||||
if (tmpie->flags&IEF_GOTO_LABEL) {
|
||||
if(!(g_lb=COCGoToLabelFind(cc,str)))
|
||||
"Unresolved Reference:%s\n",str;
|
||||
else {
|
||||
g_lb->use_cnt++;
|
||||
g_lb=OptLabelFwd(g_lb);
|
||||
i=g_lb->addr+tmpaot->buf;
|
||||
}
|
||||
tmpex=NULL;
|
||||
} else {
|
||||
if (!(tmpex=HashFind(str,Fs->hash_table,
|
||||
HTG_ALL-HTT_IMPORT_SYS_SYM)))
|
||||
"Unresolved Reference:%s\n",str;
|
||||
else {
|
||||
if (tmpex->type & HTT_FUN)
|
||||
i=tmpex(CHashFun *)->exe_addr;
|
||||
else if (tmpex->type & HTT_GLBL_VAR)
|
||||
i=tmpex(CHashGlblVar *)->data_addr;
|
||||
else
|
||||
i=tmpex->val;
|
||||
}
|
||||
g_lb=NULL;
|
||||
}
|
||||
}
|
||||
if (tmpex || g_lb) {
|
||||
ptr=tmpie->rip+rip2;
|
||||
switch [tmpie->type] {
|
||||
case IET_REL_I0:
|
||||
case IET_IMM_U0:
|
||||
break;
|
||||
case IET_REL_I8:
|
||||
if (!(I8_MIN<=i-ptr-1<=I8_MAX))
|
||||
LexExcept(cc,"Branch out of range at ");
|
||||
*ptr(U8 *) =i-ptr-1;
|
||||
break;
|
||||
case IET_IMM_U8:
|
||||
*ptr(U8 *) =i;
|
||||
break;
|
||||
case IET_REL_I16:
|
||||
if (!(I16_MIN<=i-ptr-2<=I16_MAX))
|
||||
LexExcept(cc,"Branch out of range at ");
|
||||
*ptr(U16 *)=i-ptr-2;
|
||||
break;
|
||||
case IET_IMM_U16:
|
||||
*ptr(U16 *)=i;
|
||||
break;
|
||||
case IET_REL_I32:
|
||||
if (!(I32_MIN<=i-ptr-4<=I32_MAX))
|
||||
LexExcept(cc,"Branch out of range at ");
|
||||
*ptr(U32 *)=i-ptr-4;
|
||||
break;
|
||||
case IET_IMM_U32:
|
||||
*ptr(U32 *)=i;
|
||||
break;
|
||||
case IET_REL_I64:
|
||||
*ptr(I64 *)=i-ptr-8;
|
||||
break;
|
||||
case IET_IMM_I64:
|
||||
*ptr(I64 *)=i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
Free(tmpie->src_link);
|
||||
Free(tmpie);
|
||||
tmpie=tmpie1;
|
||||
}
|
||||
Free(str);
|
||||
if (!cc->aot_depth && Bt(&cc->opts,OPTf_TRACE))
|
||||
Un(rip2,tmpaot->aot_U8s,64);
|
||||
QueRem(tmpaot);
|
||||
Free(tmpaot);
|
||||
}
|
||||
|
||||
U0 CmpFixUpAOTAsm(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
{
|
||||
CAOTCtrl *aotc=cc->aotc;
|
||||
I64 i,rip2=tmpaot->rip+cc->aotc->rip;
|
||||
U8 *ptr;
|
||||
CCodeMisc *g_lb=NULL;
|
||||
CAOTAbsAddr *tmpa,*tmpa1;
|
||||
CAOTImportExport *tmpie,*tmpie1;
|
||||
|
||||
tmpa=tmpaot->abss;
|
||||
while (tmpa) {
|
||||
tmpa1=tmpa->next;
|
||||
tmpa->next=aotc->abss;
|
||||
ptr=tmpaot->buf+tmpaot->rip+tmpa->rip;
|
||||
switch [tmpa->type] {
|
||||
case AAT_ADD_U8: *ptr(U8 *)+=rip2; break;
|
||||
case AAT_SUB_U8: *ptr(U8 *)-=rip2; break;
|
||||
case AAT_ADD_U16: *ptr(U16 *)+=rip2; break;
|
||||
case AAT_SUB_U16: *ptr(U16 *)-=rip2; break;
|
||||
case AAT_ADD_U32: *ptr(U32 *)+=rip2; break;
|
||||
case AAT_SUB_U32: *ptr(U32 *)-=rip2; break;
|
||||
case AAT_ADD_U64: *ptr(I64 *)+=rip2; break;
|
||||
case AAT_SUB_U64: *ptr(I64 *)-=rip2; break;
|
||||
}
|
||||
aotc->abss=tmpa;
|
||||
tmpa->rip+=rip2;
|
||||
tmpa=tmpa1;
|
||||
}
|
||||
|
||||
tmpie=tmpaot->next_ie;
|
||||
while (tmpie!=&tmpaot->next_ie) {
|
||||
tmpie1=tmpie->next;
|
||||
QueRem(tmpie);
|
||||
if (IET_REL_I0<=tmpie->type<=IET_IMM_I64) {
|
||||
if (tmpie->str) {
|
||||
if (tmpie->flags&IEF_GOTO_LABEL) {
|
||||
if(!(g_lb=COCGoToLabelFind(cc,tmpie->str)))
|
||||
"Unresolved Reference:%s\n",tmpie->str;
|
||||
else {
|
||||
g_lb->use_cnt++;
|
||||
g_lb=OptLabelFwd(g_lb);
|
||||
}
|
||||
} else
|
||||
g_lb=NULL;
|
||||
}
|
||||
} else
|
||||
g_lb=NULL;
|
||||
|
||||
ptr=tmpaot->buf+tmpaot->rip+tmpie->rip;
|
||||
if (g_lb) {
|
||||
i=g_lb->addr+tmpaot->buf;
|
||||
switch [tmpie->type] {
|
||||
case IET_REL_I0:
|
||||
case IET_IMM_U0:
|
||||
break;
|
||||
case IET_REL_I8:
|
||||
if (!(I8_MIN<=i-ptr-1<=I8_MAX))
|
||||
LexExcept(cc,"Branch out of range at ");
|
||||
*ptr(U8 *) =i-ptr-1;
|
||||
break;
|
||||
case IET_IMM_U8:
|
||||
*ptr(U8 *) =i;
|
||||
break;
|
||||
case IET_REL_I16:
|
||||
if (!(I16_MIN<=i-ptr-2<=I16_MAX))
|
||||
LexExcept(cc,"Branch out of range at ");
|
||||
*ptr(U16 *)=i-ptr-2;
|
||||
break;
|
||||
case IET_IMM_U16:
|
||||
*ptr(U16 *)=i;
|
||||
break;
|
||||
case IET_REL_I32:
|
||||
if (!(I32_MIN<=i-ptr-4<=I32_MAX))
|
||||
LexExcept(cc,"Branch out of range at ");
|
||||
*ptr(U32 *)=i-ptr-4;
|
||||
break;
|
||||
case IET_IMM_U32:
|
||||
*ptr(U32 *)=i;
|
||||
break;
|
||||
case IET_REL_I64:
|
||||
*ptr(I64 *)=i-ptr-8;
|
||||
break;
|
||||
case IET_IMM_I64:
|
||||
*ptr(I64 *)=i;
|
||||
break;
|
||||
}
|
||||
Free(tmpie->src_link);
|
||||
Free(tmpie);
|
||||
} else {
|
||||
switch (tmpie->type) {
|
||||
start:
|
||||
case IET_REL32_EXPORT:
|
||||
case IET_IMM32_EXPORT:
|
||||
case IET_REL64_EXPORT:
|
||||
case IET_IMM64_EXPORT:
|
||||
case IET_IMM_U0:
|
||||
case IET_IMM_U8:
|
||||
case IET_IMM_U16:
|
||||
case IET_IMM_U32:
|
||||
case IET_IMM_I64:
|
||||
case IET_REL_I0:
|
||||
break;
|
||||
case IET_REL_I8: *ptr(U8 *) -=rip2; break;
|
||||
case IET_REL_I16: *ptr(U16 *)-=rip2; break;
|
||||
case IET_REL_I32: *ptr(U32 *)-=rip2; break;
|
||||
case IET_REL_I64: *ptr(I64 *)-=rip2; break;
|
||||
end:
|
||||
tmpie->rip+=rip2;
|
||||
break;
|
||||
}
|
||||
tmpie->aot=NULL;
|
||||
QueIns(tmpie,tmpaot->parent_aot->last_ie);
|
||||
}
|
||||
tmpie=tmpie1;
|
||||
}
|
||||
}
|
||||
|
||||
I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv_let=0)
|
||||
{//AOT Compile HC or PRJ file a and output BIN file. Returns err_cnt.
|
||||
U8 *ptr,*fbuf=NULL,*fbuf2=NULL,*fbuf3=NULL,
|
||||
*patch_table=MAlloc(0x20000);
|
||||
CAOT *tmpaot;
|
||||
I64 i,cnt,size=0,error_cnt=0,warning_cnt=0,aot_U8s=0;
|
||||
CBinFile *bfh;
|
||||
CAOTImportExport *tmpie,*tmpie1;
|
||||
CAOTAbsAddr *tmpa,*tmpa1;
|
||||
CAOTHeapGlblRef *tmphgr,*tmphgr1;
|
||||
CAOTHeapGlbl *tmphg,*tmphg1;
|
||||
|
||||
fbuf=DftExt(filename,"PRJ.Z");
|
||||
fbuf2=MStrPrint("#include \"%s\"",fbuf);
|
||||
if (map_name)
|
||||
fbuf3=DftExt(map_name,"MAP.Z");
|
||||
|
||||
if (tmpaot=CmpBuf(fbuf2,fbuf3,&error_cnt,&warning_cnt,mapfile_drv_let)) {
|
||||
aot_U8s=tmpaot->aot_U8s;
|
||||
ptr=patch_table;
|
||||
//See $LK,"Load",A="MN:Load"$()
|
||||
cnt=0;
|
||||
tmpa=tmpaot->abss;
|
||||
while (tmpa) {
|
||||
if (!(tmpa->type&IEF_IMM_NOT_REL))
|
||||
cnt++;
|
||||
tmpa=tmpa->next;
|
||||
}
|
||||
if (cnt) {
|
||||
*ptr++=IET_ABS_ADDR;
|
||||
*ptr(U32 *)++=cnt;
|
||||
*ptr++=0;
|
||||
tmpa=tmpaot->abss;
|
||||
while (tmpa) {
|
||||
tmpa1=tmpa->next;
|
||||
if (!(tmpa->type&IEF_IMM_NOT_REL))
|
||||
*ptr(U32 *)++ =tmpa->rip;
|
||||
Free(tmpa);
|
||||
tmpa=tmpa1;
|
||||
}
|
||||
}
|
||||
tmphg=tmpaot->heap_glbls;
|
||||
while (tmphg) {
|
||||
tmphg1=tmphg->next;
|
||||
cnt=0;
|
||||
tmphgr=tmphg->references;
|
||||
while (tmphgr) {
|
||||
cnt++;
|
||||
tmphgr=tmphgr->next;
|
||||
}
|
||||
if (cnt) {
|
||||
*ptr++=IET_DATA_HEAP;
|
||||
*ptr(U32 *)++=cnt;
|
||||
if (tmphg->str) {
|
||||
i=StrLen(tmphg->str);
|
||||
MemCpy(ptr,tmphg->str,i+1);
|
||||
Free(tmphg->str);
|
||||
ptr+=i+1;
|
||||
} else
|
||||
*ptr++=0;
|
||||
*ptr(I64 *)++=tmphg->size;
|
||||
tmphgr=tmphg->references;
|
||||
while (tmphgr) {
|
||||
tmphgr1=tmphgr->next;
|
||||
*ptr(U32 *)++=tmphgr->rip;
|
||||
Free(tmphgr);
|
||||
tmphgr=tmphgr1;
|
||||
}
|
||||
}
|
||||
Free(tmphg);
|
||||
tmphg=tmphg1;
|
||||
}
|
||||
|
||||
//Do exports first
|
||||
tmpie=tmpaot->next_ie;
|
||||
while (tmpie!=&tmpaot->next_ie) {
|
||||
tmpie1=tmpie->next;
|
||||
if (!tmpie->type || IET_REL32_EXPORT<=tmpie->type<=IET_IMM64_EXPORT) {
|
||||
QueRem(tmpie);
|
||||
*ptr++=tmpie->type;
|
||||
*ptr(U32 *)++=tmpie->rip;
|
||||
if (tmpie->str) {
|
||||
i=StrLen(tmpie->str);
|
||||
MemCpy(ptr,tmpie->str,i+1);
|
||||
Free(tmpie->str);
|
||||
ptr+=i+1;
|
||||
} else
|
||||
*ptr++=0;
|
||||
Free(tmpie->src_link);
|
||||
Free(tmpie);
|
||||
}
|
||||
tmpie=tmpie1;
|
||||
}
|
||||
|
||||
//Do imports second
|
||||
tmpie=tmpaot->next_ie;
|
||||
while (tmpie!=&tmpaot->next_ie) {
|
||||
tmpie1=tmpie->next;
|
||||
QueRem(tmpie);
|
||||
*ptr++=tmpie->type;
|
||||
if (tmpie->aot)
|
||||
tmpie->rip+=tmpie->aot->rip2;
|
||||
*ptr(U32 *)++=tmpie->rip;
|
||||
if (tmpie->str) {
|
||||
i=StrLen(tmpie->str);
|
||||
MemCpy(ptr,tmpie->str,i+1);
|
||||
Free(tmpie->str);
|
||||
ptr+=i+1;
|
||||
} else
|
||||
*ptr++=0;
|
||||
Free(tmpie->src_link);
|
||||
Free(tmpie);
|
||||
tmpie=tmpie1;
|
||||
}
|
||||
|
||||
*ptr++=IET_END;
|
||||
MemSet(ptr,0,16);
|
||||
i=ptr-patch_table;
|
||||
//Needs 16 ALIGN
|
||||
size=(sizeof(CBinFile)+aot_U8s+i+15)&-16;
|
||||
bfh=MAlloc(size);
|
||||
bfh->jmp=0xEB+256*(sizeof(CBinFile)-2);
|
||||
#assert sizeof(CBinFile)-2<=I8_MAX
|
||||
bfh->reserved=0;
|
||||
bfh->bin_signature=BIN_SIGNATURE_VAL;
|
||||
bfh->module_org=tmpaot->module_org;
|
||||
bfh->module_align_bits=tmpaot->max_align_bits;
|
||||
bfh->patch_table_offset=sizeof(CBinFile)+aot_U8s;
|
||||
bfh->file_size=size;
|
||||
MemCpy(bfh(U8 *)+sizeof(CBinFile),tmpaot->buf,aot_U8s);
|
||||
MemCpy(bfh(U8 *)+sizeof(CBinFile)+aot_U8s,patch_table,
|
||||
size-aot_U8s-sizeof(CBinFile));
|
||||
Free(fbuf2);
|
||||
if (out_name)
|
||||
fbuf2=DftExt(out_name,"BIN.Z");
|
||||
else
|
||||
fbuf2=ChgExt(fbuf,"BIN.Z");
|
||||
FileWrite(fbuf2,bfh,size);
|
||||
Free(bfh);
|
||||
Free(tmpaot->buf);
|
||||
QueDel(tmpaot);
|
||||
Free(tmpaot);
|
||||
}
|
||||
Free(patch_table);
|
||||
Free(fbuf);
|
||||
Free(fbuf2);
|
||||
Free(fbuf3);
|
||||
Print("Errs:%d Warns:%d Code:%X Size:%X\n",
|
||||
error_cnt,warning_cnt,aot_U8s,size);
|
||||
return error_cnt;
|
||||
}
|
||||
|
||||
I64 ExePutS(U8 *buf,U8 *filename=NULL,
|
||||
I64 ccf_flags=0,CLexHashTableContext *htc=NULL)
|
||||
{//JIT Compile and execute text from a puts("").
|
||||
I64 res;
|
||||
Bool okay=TRUE;
|
||||
CCmpCtrl *cc;
|
||||
if (!filename)
|
||||
filename=blkdev.tmp_filename;
|
||||
cc=CmpCtrlNew(buf,ccf_flags|CCF_DONT_FREE_BUF,filename);
|
||||
if (Fs->last_cc!=&Fs->next_cc) {
|
||||
cc->opts=Fs->last_cc->opts;
|
||||
if (htc) {
|
||||
cc->flags=cc->flags &~CCF_ASM_EXPRESSIONS |
|
||||
htc->old_flags&CCF_ASM_EXPRESSIONS;
|
||||
MemCpy(&cc->htc,htc,sizeof(CLexHashTableContext));
|
||||
}
|
||||
}
|
||||
QueIns(cc,Fs->last_cc);
|
||||
try {
|
||||
Lex(cc);
|
||||
res=ExeCmdLine(cc);
|
||||
} catch {
|
||||
if (Fs->except_ch=='Compiler' || Fs->except_ch=='Break') {
|
||||
Fs->catch_except=TRUE;
|
||||
okay=FALSE;
|
||||
res=0;
|
||||
}
|
||||
}
|
||||
QueRem(cc);
|
||||
if (okay)
|
||||
CmpCtrlDel(cc); //TODO: can crash
|
||||
return res;
|
||||
}
|
||||
|
||||
I64 ExePrint(U8 *fmt,...)
|
||||
{//JIT Compile and execute text from a printf().
|
||||
I64 res;
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
|
||||
res=ExePutS(buf);
|
||||
Free(buf);
|
||||
return res;
|
||||
}
|
||||
|
||||
I64 ExeFile(U8 *name,I64 ccf_flags=0)
|
||||
{//JIT Compile and execute a file.
|
||||
I64 res;
|
||||
U8 *name2=DftExt(name,"HC.Z"),
|
||||
*st=MStrPrint("#include \"%s\";",name2);
|
||||
res=ExePutS(st,name,ccf_flags);
|
||||
Free(st);
|
||||
Free(name2);
|
||||
return res;
|
||||
}
|
||||
|
||||
I64 RunFile(U8 *name,I64 ccf_flags=0,...)
|
||||
{//$LK,"ExeFile",A="MN:ExeFile"$() with args using $LK,"LastFun",A="MN:LastFun"$().
|
||||
ExeFile(name,ccf_flags);
|
||||
return LastFun(argc,argv);
|
||||
}
|
||||
|
||||
I64 ExePutS2(U8 *buf,U8 *filename=NULL,I64 ccf_flags=0)
|
||||
{//throws exceptions
|
||||
I64 res;
|
||||
CCmpCtrl *cc;
|
||||
if (!filename)
|
||||
filename=blkdev.tmp_filename;
|
||||
cc=CmpCtrlNew(buf,ccf_flags|CCF_DONT_FREE_BUF,filename);
|
||||
if (Fs->last_cc!=&Fs->next_cc)
|
||||
cc->opts=Fs->last_cc->opts;
|
||||
QueIns(cc,Fs->last_cc);
|
||||
Lex(cc);
|
||||
res=ExeCmdLine(cc);
|
||||
QueRem(cc);
|
||||
CmpCtrlDel(cc);
|
||||
return res;
|
||||
}
|
||||
|
||||
I64 ExePrint2(U8 *fmt,...)
|
||||
{//throws exceptions
|
||||
I64 res;
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
|
||||
res=ExePutS2(buf);
|
||||
Free(buf);
|
||||
return res;
|
||||
}
|
||||
|
||||
I64 ExeFile2(U8 *name,I64 ccf_flags=0)
|
||||
{//throws exceptions
|
||||
I64 res;
|
||||
U8 *name2=DftExt(name,"HC.Z"),*st=MStrPrint("#include \"%s\";",name2);
|
||||
res=ExePutS2(st,name,ccf_flags);
|
||||
Free(st);
|
||||
Free(name2);
|
||||
return res;
|
||||
}
|
||||
|
||||
I64 RunFile2(U8 *name,I64 ccf_flags=0,...)
|
||||
{//$LK,"ExeFile2",A="MN:ExeFile2"$() with args using $LK,"LastFun",A="MN:LastFun"$(). throws exceptions.
|
||||
ExeFile2(name,ccf_flags);
|
||||
return LastFun(argc,argv);
|
||||
}
|
||||
|
||||
I64 StreamExePrint(U8 *fmt,...)
|
||||
{//Causes value from stream to be used in an #exe{} block.
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
|
||||
I64 res=0;
|
||||
CLexHashTableContext *htc;
|
||||
CCmpCtrl *cc=Fs->last_cc;
|
||||
if (cc==&Fs->next_cc)
|
||||
PrintErr("Not Compiling\n");
|
||||
else {
|
||||
if (!(cc->flags&CCF_EXE_BLK))
|
||||
LexExcept(cc,"StreamExePrint only allowed in AOT compiled #exe{} mode.");
|
||||
if (htc=cc->htc.next)
|
||||
res=ExePutS(buf,,,htc);
|
||||
}
|
||||
Free(buf);
|
||||
return res;
|
||||
}
|
||||
|
||||
U0 CInit()
|
||||
{
|
||||
CmpLoadDefines;
|
||||
CmpFillTables;
|
||||
QueInit(&cmp.ic_nop);
|
||||
cmp.ic_nop.ic_class=cmp.internal_types[RT_I64];
|
||||
cmp.ic_nop.ic_code=IC_NOP1;
|
||||
AsmHashLoad;
|
||||
UAsmHashLoad;
|
||||
}
|
||||
|
||||
CInit;
|
||||
@@ -0,0 +1,164 @@
|
||||
Bool Option(I64 num,Bool val)
|
||||
{//Set compiler $LK,"Option",A="FI:::/Doc/Options.DD"$ to val.
|
||||
return BEqu(&Fs->last_cc->opts,num,val);
|
||||
}
|
||||
|
||||
Bool GetOption(I64 num)
|
||||
{//Get state of compiler $LK,"option",A="MN:OPTf_ECHO"$.
|
||||
return Bt(&Fs->last_cc->opts,num);
|
||||
}
|
||||
|
||||
asm {
|
||||
_LAST_FUN:: //See $LK,"_CALL_IND",A="MN:_CALL_IND"$
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
PUSH RSI
|
||||
PUSH RDI
|
||||
|
||||
XOR RAX,RAX
|
||||
MOV RAX,FS:CTask.last_fun[RAX]
|
||||
TEST RAX,RAX
|
||||
JZ @@10
|
||||
MOV RDX,U64 CHashFun.exe_addr[RAX]
|
||||
|
||||
MOV RCX,U64 SF_ARG1[RBP] //argc
|
||||
MOV RSI,U64 SF_ARG2[RBP] //argv
|
||||
SHL RCX,3
|
||||
SUB RSP,RCX
|
||||
MOV RDI,RSP
|
||||
REP_MOVSB
|
||||
TEST RDX,RDX
|
||||
JZ @@05
|
||||
|
||||
CALL RDX
|
||||
POP RDI
|
||||
POP RSI
|
||||
POP RBP
|
||||
RET1 16
|
||||
|
||||
@@05: MOV RCX,U64 SF_ARG1[RBP] //argc
|
||||
SHL RCX,3
|
||||
ADD RSP,RCX
|
||||
XOR RAX,RAX
|
||||
@@10: POP RDI
|
||||
POP RSI
|
||||
POP RBP
|
||||
RET1 16
|
||||
}
|
||||
_extern _LAST_FUN I64 LastFun(I64 argc,I64 *argv); //Execute last fun with args.
|
||||
|
||||
I64 PassTrace(I64 i=0b10001111101)
|
||||
{//Ctrls which optimizer passes are displayed.
|
||||
I64 old=Fs->last_cc->pass_trace;
|
||||
if (i) Fs->last_cc->saved_pass_trace=i;
|
||||
Fs->last_cc->pass_trace=i;
|
||||
return old;
|
||||
}
|
||||
|
||||
Bool Trace(Bool val=ON)
|
||||
{//Displays assembly code output from compiler.
|
||||
return Option(OPTf_TRACE,val);
|
||||
}
|
||||
|
||||
Bool Echo(Bool val)
|
||||
{//Displays text as it is being compiled.
|
||||
return Option(OPTf_ECHO,val);
|
||||
}
|
||||
|
||||
U0 StreamPrint(U8 *fmt,...)
|
||||
{//Injects text into the compile stream. Used in #exe{} blocks.
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv),*st;
|
||||
CCmpCtrl *cc=Fs->last_cc;
|
||||
CStreamBlk *tmpe=cc->last_stream_blk;
|
||||
if (tmpe!=&cc->next_stream_blk) {
|
||||
st=MStrPrint("%s%s",tmpe->body,buf);
|
||||
Free(tmpe->body);
|
||||
tmpe->body=st;
|
||||
} else
|
||||
PrintErr("No exe{} blk\n");
|
||||
Free(buf);
|
||||
}
|
||||
|
||||
U0 StreamDir()
|
||||
{
|
||||
U8 *dirname;
|
||||
if (dirname=DirFile(Fs->last_cc->lex_include_stk->full_name)) {
|
||||
StreamPrint("\"%s\"",dirname);
|
||||
Free(dirname);
|
||||
}
|
||||
}
|
||||
|
||||
CD2I32 *LexD2I32(CCmpCtrl *cc,CD2I32 *p)
|
||||
{//Not HolyC. Sprite-like lex 2D point.
|
||||
if (cc->token!='(')
|
||||
LexExcept(cc,"Expecting '(' at ");
|
||||
Lex(cc); //Skip (
|
||||
p->x=LexExpressionI64(cc);
|
||||
if (cc->token!=',')
|
||||
LexExcept(cc,"Expecting ',' at ");
|
||||
Lex(cc); //Skip ,
|
||||
p->y=LexExpressionI64(cc);
|
||||
if (cc->token!=')')
|
||||
LexExcept(cc,"Expecting ')' at ");
|
||||
Lex(cc); //Skip )
|
||||
return p;
|
||||
}
|
||||
|
||||
CD3I32 *LexD3I32(CCmpCtrl *cc,CD3I32 *p)
|
||||
{//Not HolyC. Sprite-like lex 3D point.
|
||||
if (cc->token!='(')
|
||||
LexExcept(cc,"Expecting '(' at ");
|
||||
Lex(cc); //Skip (
|
||||
p->x=LexExpressionI64(cc);
|
||||
if (cc->token!=',')
|
||||
LexExcept(cc,"Expecting ',' at ");
|
||||
Lex(cc); //Skip ,
|
||||
p->y=LexExpressionI64(cc);
|
||||
if (cc->token!=',')
|
||||
LexExcept(cc,"Expecting ',' at ");
|
||||
Lex(cc); //Skip ,
|
||||
p->z=LexExpressionI64(cc);
|
||||
if (cc->token!=')')
|
||||
LexExcept(cc,"Expecting ')' at ");
|
||||
Lex(cc); //Skip )
|
||||
return p;
|
||||
}
|
||||
|
||||
U8 *CmdLinePmt()
|
||||
{
|
||||
I64 i;
|
||||
U8 *res,*st;
|
||||
if (Fs->new_answer) {
|
||||
if (Fs->answer_type==RT_F64)
|
||||
"%8.6fs ansf=%15.7g\n",Fs->answer_time,Fs->answer;
|
||||
else
|
||||
"%8.6fs ans=0x%08X=%d\n",Fs->answer_time,Fs->answer,Fs->answer;
|
||||
Fs->new_answer=FALSE;
|
||||
}
|
||||
if (st=CurDir) {
|
||||
"%s",st;
|
||||
Free(st);
|
||||
}
|
||||
'>';
|
||||
if (IsDbgMode&&IsRaw)
|
||||
RawDr;
|
||||
|
||||
LBts(&Fs->task_flags,TASKf_CMD_LINE_PMT);
|
||||
st=GetStr(,,GSF_SHIFT_ESC_EXIT);
|
||||
LBtr(&Fs->task_flags,TASKf_CMD_LINE_PMT);
|
||||
|
||||
i=StrLen(st);
|
||||
res=MAlloc(i+1+2);
|
||||
MemCpy(res,st,i+1);
|
||||
i--;
|
||||
while (i>=0 && Bt(char_bmp_white_space,res[i]))
|
||||
i--;
|
||||
i++;
|
||||
if (i>0 && res[i-1]==';')
|
||||
res[i++]=';'; //The Lex goes one beyond
|
||||
res[i++]='\n';//#define goes to '\n'
|
||||
res[i]=0;
|
||||
|
||||
Free(st);
|
||||
return res;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,423 @@
|
||||
$LK,"LexPutPos",A="FL:::/Compiler/CExcept.HC.Z,50",BI=1$
|
||||
$LK,"ICAssignPostIncDec",A="FL:::/Compiler/BackB.HC.Z,429",BI=2$
|
||||
$LK,"CmpSetFloatOpPushPop",A="FL:::/Compiler/BackFA.HC.Z,62",BI=3$
|
||||
$LK,"ICFCvt2",A="FL:::/Compiler/BackFA.HC.Z,169",BI=4$
|
||||
$LK,"CmpMinTypePointed",A="FL:::/Compiler/OptLib.HC.Z,528",BI=5$
|
||||
$LK,"CmpRawTypePointed",A="FL:::/Compiler/OptLib.HC.Z,517",BI=6$
|
||||
$LK,"OptFixupBinaryOp1",A="FL:::/Compiler/OptLib.HC.Z,96",BI=7$
|
||||
$LK,"OptFixupBinaryOp2",A="FL:::/Compiler/OptLib.HC.Z,182",BI=8$
|
||||
$LK,"COCInit",A="FL:::/Compiler/PrsLib.HC.Z,99",BI=9$
|
||||
$LK,"IsLexExpression2Bin",A="FL:::/Compiler/PrsExp.HC.Z,1135",BI=10$
|
||||
$LK,"CSubSwitch",A="FL:::/Compiler/PrsStmt.HC.Z,566"$
|
||||
$LK,"LexFilePop",A="FL:::/Compiler/Lex.HC.Z,11",BI=11$
|
||||
$LK,"ExePutS",A="FL:::/Compiler/CMain.HC.Z,571",BI=12$
|
||||
$LK,"PrsStaticInit",A="FL:::/Compiler/PrsVar.HC.Z,215",BI=13$
|
||||
$LK,"LexPutLine",A="FL:::/Compiler/CExcept.HC.Z,22",BI=14$
|
||||
$LK,"PrsKeyWord",A="FL:::/Compiler/PrsLib.HC.Z,31",BI=15$
|
||||
$LK,"AsmLineLst",A="FL:::/Compiler/AsmLib.HC.Z,147",BI=16$
|
||||
$LK,"ICOpSizeRex",A="FL:::/Compiler/BackLib.HC.Z,28",BI=17$
|
||||
$LK,"CVI2",A="FL:::/Compiler/PrsVar.HC.Z,117"$
|
||||
$LK,"ICU8",A="FL:::/Compiler/BackLib.HC.Z,17",BI=18$
|
||||
$LK,"AsmStoreNum",A="FL:::/Compiler/Asm.HC.Z,268",BI=19$
|
||||
$LK,"OptPass012",A="FL:::/Compiler/OptPass012.HC.Z,23",BI=20$
|
||||
$LK,"MemberLstSize",A="FL:::/Compiler/LexLib.HC.Z,221",BI=21$
|
||||
$LK,"ICQueIns",A="FL:::/Compiler/BackC.HC.Z,354",BI=22$
|
||||
$LK,"ICAndBranch",A="FL:::/Compiler/BackC.HC.Z,1",BI=23$
|
||||
$LK,"U",A="FL:::/Compiler/UAsm.HC.Z,653",BI=24$
|
||||
$LK,"ICQueRem",A="FL:::/Compiler/BackC.HC.Z,402",BI=25$
|
||||
$LK,"LastFun",A="FL:::/Compiler/CMisc.HC.Z,48"$
|
||||
$LK,"OptLead1",A="FL:::/Compiler/OptLib.HC.Z,73",BI=26$
|
||||
$LK,"CmpNoteFloatOp",A="FL:::/Compiler/BackFA.HC.Z,6",BI=27$
|
||||
$LK,"AOTGlblsResolve",A="FL:::/Compiler/AsmResolve.HC.Z,77",BI=28$
|
||||
$LK,"ExePutS2",A="FL:::/Compiler/CMain.HC.Z,631",BI=29$
|
||||
$LK,"HashEntrySize",A="FL:::/Compiler/CHash.HC.Z,1",BI=30$
|
||||
$LK,"COCPush",A="FL:::/Compiler/PrsLib.HC.Z,107",BI=31$
|
||||
$LK,"SLASH_OP_DEC",A="FL:::/Compiler/BackLib.HC.Z,259"$
|
||||
$LK,"MODR_SIB_D32_INDIRECT_REG",A="FL:::/Compiler/BackLib.HC.Z,132"$
|
||||
$LK,"ICPushRegs",A="FL:::/Compiler/BackLib.HC.Z,350",BI=32$
|
||||
$LK,"PE_POP_HIGHER",A="FL:::/Compiler/PrsExp.HC.Z,10"$
|
||||
$LK,"SLASH_OP_FLD",A="FL:::/Compiler/BackLib.HC.Z,277"$
|
||||
$LK,"ICU32",A="FL:::/Compiler/BackLib.HC.Z,47",BI=33$
|
||||
$LK,"ICU24",A="FL:::/Compiler/BackLib.HC.Z,41",BI=34$
|
||||
$LK,"ICU16",A="FL:::/Compiler/BackLib.HC.Z,35",BI=35$
|
||||
$LK,"SLASH_OP_DIV",A="FL:::/Compiler/BackLib.HC.Z,266"$
|
||||
$LK,"CmpFillTables",A="FL:::/Compiler/CInit.HC.Z,239",BI=36$
|
||||
$LK,"AOTStoreCodeU32",A="FL:::/Compiler/AsmLib.HC.Z,30",BI=37$
|
||||
$LK,"ICU64",A="FL:::/Compiler/BackLib.HC.Z,53",BI=38$
|
||||
$LK,"SLASH_OP_INC",A="FL:::/Compiler/BackLib.HC.Z,258"$
|
||||
$LK,"AOTStoreCodeU64",A="FL:::/Compiler/AsmLib.HC.Z,68",BI=39$
|
||||
$LK,"LexPopNoRestore",A="FL:::/Compiler/LexLib.HC.Z,38",BI=40$
|
||||
$LK,"ExePrint",A="FL:::/Compiler/CMain.HC.Z,605",BI=41$
|
||||
$LK,"SLASH_OP_NEG",A="FL:::/Compiler/BackLib.HC.Z,261"$
|
||||
$LK,"PrsVarLst",A="FL:::/Compiler/PrsVar.HC.Z,416",BI=42$
|
||||
$LK,"PrsAsmDefine",A="FL:::/Compiler/Asm.HC.Z,814",BI=43$
|
||||
$LK,"PrsAddOp",A="FL:::/Compiler/PrsExp.HC.Z,15",BI=44$
|
||||
$LK,"LexWarn",A="FL:::/Compiler/CExcept.HC.Z,65",BI=45$
|
||||
$LK,"PE_POP_ALL1",A="FL:::/Compiler/PrsExp.HC.Z,12"$
|
||||
$LK,"PE_POP_ALL2",A="FL:::/Compiler/PrsExp.HC.Z,13"$
|
||||
$LK,"COCAppend",A="FL:::/Compiler/PrsLib.HC.Z,126",BI=46$
|
||||
$LK,"LexFilePush",A="FL:::/Compiler/Lex.HC.Z,1",BI=47$
|
||||
$LK,"PrsUnaryModifier",A="FL:::/Compiler/PrsExp.HC.Z,960",BI=48$
|
||||
$LK,"OptFixupUnaryOp",A="FL:::/Compiler/OptLib.HC.Z,196",BI=49$
|
||||
$LK,"LexPush",A="FL:::/Compiler/LexLib.HC.Z,12",BI=50$
|
||||
$LK,"SLASH_OP_MOV",A="FL:::/Compiler/BackLib.HC.Z,267"$
|
||||
$LK,"ICPopRegs",A="FL:::/Compiler/BackLib.HC.Z,391",BI=51$
|
||||
$LK,"SLASH_OP_MUL",A="FL:::/Compiler/BackLib.HC.Z,264"$
|
||||
$LK,"SLASH_OP_NOT",A="FL:::/Compiler/BackLib.HC.Z,260"$
|
||||
$LK,"SLASH_OP_POP",A="FL:::/Compiler/BackLib.HC.Z,270"$
|
||||
$LK,"ICFOp",A="FL:::/Compiler/BackFA.HC.Z,339",BI=52$
|
||||
$LK,"CN_A1",A="FL:::/Compiler/BackFA.HC.Z,2"$
|
||||
$LK,"CN_A2",A="FL:::/Compiler/BackFA.HC.Z,1"$
|
||||
$LK,"LexExpressionF64",A="FL:::/Compiler/PrsExp.HC.Z,1154",BI=53$
|
||||
$LK,"ICAdd",A="FL:::/Compiler/PrsLib.HC.Z,79",BI=54$
|
||||
$LK,"CmpRawType",A="FL:::/Compiler/OptLib.HC.Z,508",BI=55$
|
||||
$LK,"ICFOpEqu",A="FL:::/Compiler/BackFB.HC.Z,1",BI=56$
|
||||
$LK,"LexExpressionI64",A="FL:::/Compiler/PrsExp.HC.Z,1140",BI=57$
|
||||
$LK,"ICQueInsRev",A="FL:::/Compiler/BackC.HC.Z,378",BI=58$
|
||||
$LK,"LexExpression",A="FL:::/Compiler/PrsExp.HC.Z,1168",BI=59$
|
||||
$LK,"PrsExpression",A="FL:::/Compiler/PrsExp.HC.Z,264",BI=60$
|
||||
$LK,"PrsClassNew",A="FL:::/Compiler/PrsLib.HC.Z,40",BI=61$
|
||||
$LK,"LexInStr",A="FL:::/Compiler/Lex.HC.Z,367",BI=62$
|
||||
$LK,"internal_types_table",A="FL:::/Compiler/CInit.HC.Z,6"$
|
||||
$LK,"CN_INST",A="FL:::/Compiler/BackFA.HC.Z,3"$
|
||||
$LK,"OptPass3",A="FL:::/Compiler/OptPass3.HC.Z,1",BI=63$
|
||||
$LK,"OptPass4",A="FL:::/Compiler/OptPass4.HC.Z,133",BI=64$
|
||||
$LK,"OptPass5",A="FL:::/Compiler/OptPass5.HC.Z,1",BI=65$
|
||||
$LK,"OptPass6",A="FL:::/Compiler/OptPass6.HC.Z,96",BI=66$
|
||||
$LK,"MODR_REG",A="FL:::/Compiler/BackLib.HC.Z,126"$
|
||||
$LK,"Echo",A="FL:::/Compiler/CMisc.HC.Z,63",BI=67$
|
||||
$LK,"PrsGlblVarLst",A="FL:::/Compiler/PrsStmt.HC.Z,209",BI=68$
|
||||
$LK,"ICQueInit",A="FL:::/Compiler/BackC.HC.Z,340",BI=69$
|
||||
$LK,"ICCmp",A="FL:::/Compiler/BackB.HC.Z,102",BI=70$
|
||||
$LK,"ICAddRSP",A="FL:::/Compiler/BackLib.HC.Z,59",BI=71$
|
||||
$LK,"ICDiv",A="FL:::/Compiler/BackA.HC.Z,355",BI=72$
|
||||
$LK,"ICDeref",A="FL:::/Compiler/BackLib.HC.Z,693",BI=73$
|
||||
$LK,"ICLea",A="FL:::/Compiler/BackLib.HC.Z,661",BI=74$
|
||||
$LK,"CmpBuf",A="FL:::/Compiler/CMain.HC.Z,157",BI=75$
|
||||
$LK,"CMP_TEMPLATES_DONT_PUSH_POP",A="FL:::/Compiler/Templates.HC.Z,385"$
|
||||
$LK,"ICAddEct",A="FL:::/Compiler/BackA.HC.Z,1",BI=76$
|
||||
$LK,"ICToF64",A="FL:::/Compiler/BackB.HC.Z,283",BI=77$
|
||||
$LK,"PrsBinFile",A="FL:::/Compiler/Asm.HC.Z,888",BI=78$
|
||||
$LK,"HashTableSize2",A="FL:::/Compiler/CHash.HC.Z,72",BI=79$
|
||||
$LK,"HashEntrySize2",A="FL:::/Compiler/CHash.HC.Z,33",BI=80$
|
||||
$LK,"Ui",A="FL:::/Compiler/UAsm.HC.Z,245",BI=81$
|
||||
$LK,"ICSlashOp",A="FL:::/Compiler/BackLib.HC.Z,282",BI=82$
|
||||
$LK,"OptBrZero",A="FL:::/Compiler/OptLib.HC.Z,230",BI=83$
|
||||
$LK,"Un",A="FL:::/Compiler/UAsm.HC.Z,668",BI=84$
|
||||
$LK,"PrsSizeOf",A="FL:::/Compiler/PrsExp.HC.Z,303",BI=85$
|
||||
$LK,"ICToI64",A="FL:::/Compiler/BackB.HC.Z,277",BI=86$
|
||||
$LK,"ICMod",A="FL:::/Compiler/BackA.HC.Z,425",BI=87$
|
||||
$LK,"OptSetNOP1",A="FL:::/Compiler/OptLib.HC.Z,17",BI=88$
|
||||
$LK,"OptPass789A",A="FL:::/Compiler/OptPass789A.HC.Z,1",BI=89$
|
||||
$LK,"OptSetNOP2",A="FL:::/Compiler/OptLib.HC.Z,25",BI=90$
|
||||
$LK,"FBO1_F64",A="FL:::/Compiler/OptLib.HC.Z,94"$
|
||||
$LK,"ICXorEqu",A="FL:::/Compiler/BackC.HC.Z,581",BI=91$
|
||||
$LK,"ICToUpper",A="FL:::/Compiler/BackB.HC.Z,266",BI=92$
|
||||
$LK,"AsmLexExpression",A="FL:::/Compiler/AsmLib.HC.Z,127",BI=93$
|
||||
$LK,"ICMov",A="FL:::/Compiler/BackLib.HC.Z,445",BI=94$
|
||||
$LK,"ICNot",A="FL:::/Compiler/BackB.HC.Z,10",BI=95$
|
||||
$LK,"ICMul",A="FL:::/Compiler/BackA.HC.Z,224",BI=96$
|
||||
$LK,"ICRex",A="FL:::/Compiler/BackLib.HC.Z,22",BI=97$
|
||||
$LK,"ICPop",A="FL:::/Compiler/BackLib.HC.Z,363",BI=98$
|
||||
$LK,"SLASH_OP_FADD",A="FL:::/Compiler/BackLib.HC.Z,271"$
|
||||
$LK,"MODR_RIP_REL",A="FL:::/Compiler/BackLib.HC.Z,133"$
|
||||
$LK,"LexStmt2Bin",A="FL:::/Compiler/CMain.HC.Z,1",BI=99$
|
||||
$LK,"ICSub",A="FL:::/Compiler/BackA.HC.Z,166",BI=100$
|
||||
$LK,"COCFloatConstFind",A="FL:::/Compiler/PrsLib.HC.Z,164",BI=101$
|
||||
$LK,"ICPut",A="FL:::/Compiler/CExcept.HC.Z,184",BI=102$
|
||||
$LK,"PrsArrayDims",A="FL:::/Compiler/PrsVar.HC.Z,247",BI=103$
|
||||
$LK,"ICSqr",A="FL:::/Compiler/BackC.HC.Z,456",BI=104$
|
||||
$LK,"FBO1_NOT_CONST",A="FL:::/Compiler/OptLib.HC.Z,92"$
|
||||
$LK,"CMP_TEMPLATES_DONT_POP",A="FL:::/Compiler/Templates.HC.Z,173"$
|
||||
$LK,"PrsClass",A="FL:::/Compiler/PrsStmt.HC.Z,1",BI=105$
|
||||
$LK,"SLASH_OP_MOV_IMM",A="FL:::/Compiler/BackLib.HC.Z,268"$
|
||||
$LK,"MemberMetaData",A="FL:::/Compiler/LexLib.HC.Z,45",BI=106$
|
||||
$LK,"ICSwitch",A="FL:::/Compiler/BackC.HC.Z,602",BI=107$
|
||||
$LK,"OptBrNotZero",A="FL:::/Compiler/OptLib.HC.Z,357",BI=108$
|
||||
$LK,"LexPutToken",A="FL:::/Compiler/CExcept.HC.Z,1",BI=109$
|
||||
$LK,"SLASH_OP_FDIV",A="FL:::/Compiler/BackLib.HC.Z,275"$
|
||||
$LK,"AsmHashLoad",A="FL:::/Compiler/AsmInit.HC.Z,50",BI=110$
|
||||
$LK,"UAsmHashLoad",A="FL:::/Compiler/UAsm.HC.Z,195",BI=111$
|
||||
$LK,"UnusedExternWarning",A="FL:::/Compiler/CExcept.HC.Z,104",BI=112$
|
||||
$LK,"SLASH_OP_FILD",A="FL:::/Compiler/BackLib.HC.Z,280"$
|
||||
$LK,"ICXorXor",A="FL:::/Compiler/BackB.HC.Z,75",BI=113$
|
||||
$LK,"PrsTryBlk",A="FL:::/Compiler/PrsStmt.HC.Z,842",BI=114$
|
||||
$LK,"CInit",A="FL:::/Compiler/CMain.HC.Z,691",BI=115$
|
||||
$LK,"MemberMetaFind",A="FL:::/Compiler/LexLib.HC.Z,56",BI=116$
|
||||
$LK,"ExePrint2",A="FL:::/Compiler/CMain.HC.Z,648",BI=117$
|
||||
$LK,"FBO1_INT",A="FL:::/Compiler/OptLib.HC.Z,93"$
|
||||
$LK,"PE_DO_UNARY_OP",A="FL:::/Compiler/PrsExp.HC.Z,8"$
|
||||
$LK,"PrsVarInit",A="FL:::/Compiler/PrsVar.HC.Z,1",BI=118$
|
||||
$LK,"ICOrEqu",A="FL:::/Compiler/BackC.HC.Z,560",BI=119$
|
||||
$LK,"ICModr1",A="FL:::/Compiler/BackLib.HC.Z,136",BI=120$
|
||||
$LK,"ICModr2",A="FL:::/Compiler/BackLib.HC.Z,214",BI=121$
|
||||
$LK,"SLASH_OP_FMUL",A="FL:::/Compiler/BackLib.HC.Z,274"$
|
||||
$LK,"ICPreIncDec",A="FL:::/Compiler/BackB.HC.Z,304",BI=122$
|
||||
$LK,"PrsUnaryTerm",A="FL:::/Compiler/PrsExp.HC.Z,593",BI=123$
|
||||
$LK,"MemberLstDel",A="FL:::/Compiler/LexLib.HC.Z,183",BI=124$
|
||||
$LK,"SLASH_OP_FSUB",A="FL:::/Compiler/BackLib.HC.Z,272"$
|
||||
$LK,"ICAndAnd",A="FL:::/Compiler/BackB.HC.Z,30",BI=125$
|
||||
$LK,"InstEntriesCompare",A="FL:::/Compiler/UAsm.HC.Z,1",BI=126$
|
||||
$LK,"SLASH_OP_IMUL",A="FL:::/Compiler/BackLib.HC.Z,265"$
|
||||
$LK,"MemberLstCmp",A="FL:::/Compiler/LexLib.HC.Z,157",BI=127$
|
||||
$LK,"SLASH_OP_FSTP",A="FL:::/Compiler/BackLib.HC.Z,278"$
|
||||
$LK,"COCDel",A="FL:::/Compiler/PrsLib.HC.Z,186",BI=128$
|
||||
$LK,"PE_UNARY_TERM1",A="FL:::/Compiler/PrsExp.HC.Z,1"$
|
||||
$LK,"ICFAdd",A="FL:::/Compiler/BackFB.HC.Z,515",BI=129$
|
||||
$LK,"PE_UNARY_TERM2",A="FL:::/Compiler/PrsExp.HC.Z,2"$
|
||||
$LK,"CmdLinePmt",A="FL:::/Compiler/CMisc.HC.Z,127",BI=130$
|
||||
$LK,"AsmMakeArgMask",A="FL:::/Compiler/Asm.HC.Z,177",BI=131$
|
||||
$LK,"COCHeaderPut",A="FL:::/Compiler/PrsLib.HC.Z,229",BI=132$
|
||||
$LK,"PrsGlblInit",A="FL:::/Compiler/PrsVar.HC.Z,206",BI=133$
|
||||
$LK,"ICAndEqu",A="FL:::/Compiler/BackC.HC.Z,539",BI=134$
|
||||
$LK,"LexD2I32",A="FL:::/Compiler/CMisc.HC.Z,91",BI=135$
|
||||
$LK,"MemberLstNew",A="FL:::/Compiler/LexLib.HC.Z,150",BI=136$
|
||||
$LK,"LexD3I32",A="FL:::/Compiler/CMisc.HC.Z,107",BI=137$
|
||||
$LK,"OptClassFwd",A="FL:::/Compiler/OptLib.HC.Z,9",BI=138$
|
||||
$LK,"ICFCmp",A="FL:::/Compiler/BackFA.HC.Z,519",BI=139$
|
||||
$LK,"PrsSwitch",A="FL:::/Compiler/PrsStmt.HC.Z,578",BI=140$
|
||||
$LK,"ICFDiv",A="FL:::/Compiler/BackFB.HC.Z,504",BI=141$
|
||||
$LK,"AOTStoreCodeU8At",A="FL:::/Compiler/AsmLib.HC.Z,106",BI=142$
|
||||
$LK,"PE_PUSH_LOWER",A="FL:::/Compiler/PrsExp.HC.Z,11"$
|
||||
$LK,"OptPass6Lag",A="FL:::/Compiler/OptPass6.HC.Z,28",BI=143$
|
||||
$LK,"OptLag1",A="FL:::/Compiler/OptLib.HC.Z,51",BI=144$
|
||||
$LK,"OptLag2",A="FL:::/Compiler/OptLib.HC.Z,62",BI=145$
|
||||
$LK,"StreamPrint",A="FL:::/Compiler/CMisc.HC.Z,68",BI=146$
|
||||
$LK,"_LAST_FUN",A="FL:::/Compiler/CMisc.HC.Z,12"$
|
||||
$LK,"ICFCvt",A="FL:::/Compiler/BackFA.HC.Z,123",BI=147$
|
||||
$LK,"StreamDir",A="FL:::/Compiler/CMisc.HC.Z,82",BI=148$
|
||||
$LK,"PrsOffsetOf",A="FL:::/Compiler/PrsExp.HC.Z,353",BI=149$
|
||||
$LK,"GetOption",A="FL:::/Compiler/CMisc.HC.Z,6",BI=150$
|
||||
$LK,"PrsDoWhile",A="FL:::/Compiler/PrsStmt.HC.Z,506",BI=151$
|
||||
$LK,"ICShift",A="FL:::/Compiler/BackA.HC.Z,573",BI=152$
|
||||
$LK,"ICFMod",A="FL:::/Compiler/BackFA.HC.Z,242",BI=153$
|
||||
$LK,"COCPop",A="FL:::/Compiler/PrsLib.HC.Z,121",BI=154$
|
||||
$LK,"PrsExpression2",A="FL:::/Compiler/PrsExp.HC.Z,65",BI=155$
|
||||
$LK,"SLASH_OP_PUSH",A="FL:::/Compiler/BackLib.HC.Z,269"$
|
||||
$LK,"PE_DEREFERENCE",A="FL:::/Compiler/PrsExp.HC.Z,5"$
|
||||
$LK,"LexPopRestore",A="FL:::/Compiler/LexLib.HC.Z,23",BI=156$
|
||||
$LK,"ICUnaries",A="FL:::/Compiler/BackB.HC.Z,1",BI=157$
|
||||
$LK,"ICFMul",A="FL:::/Compiler/BackFB.HC.Z,488",BI=158$
|
||||
$LK,"ICShiftEqu",A="FL:::/Compiler/BackA.HC.Z,603",BI=159$
|
||||
$LK,"LexExpression2Bin",A="FL:::/Compiler/PrsExp.HC.Z,1117",BI=160$
|
||||
$LK,"ICFPow",A="FL:::/Compiler/BackFA.HC.Z,266",BI=161$
|
||||
$LK,"MapFileWrite",A="FL:::/Compiler/CHash.HC.Z,90",BI=162$
|
||||
$LK,"ICFSub",A="FL:::/Compiler/BackFB.HC.Z,551",BI=163$
|
||||
$LK,"ICFModEqu",A="FL:::/Compiler/BackFA.HC.Z,549",BI=164$
|
||||
$LK,"CmpF1PushPop",A="FL:::/Compiler/OptLib.HC.Z,535",BI=165$
|
||||
$LK,"OptFree",A="FL:::/Compiler/OptLib.HC.Z,33",BI=166$
|
||||
$LK,"CMP_TEMPLATES_DONT_PUSH2",A="FL:::/Compiler/Templates.HC.Z,447"$
|
||||
$LK,"CInternalType",A="FL:::/Compiler/CInit.HC.Z,3"$
|
||||
$LK,"LexDollar",A="FL:::/Compiler/Lex.HC.Z,93",BI=167$
|
||||
$LK,"AsmUnresolvedAdd",A="FL:::/Compiler/AsmResolve.HC.Z,189",BI=168$
|
||||
$LK,"AOTStoreCodeU8",A="FL:::/Compiler/AsmLib.HC.Z,1",BI=169$
|
||||
$LK,"ICBitOps",A="FL:::/Compiler/BackB.HC.Z,202",BI=170$
|
||||
$LK,"lex_zeros",A="FL:::/Compiler/Lex.HC.Z,91"$
|
||||
$LK,"ClassMemberLstDel",A="FL:::/Compiler/LexLib.HC.Z,209",BI=171$
|
||||
$LK,"CSwitchCase",A="FL:::/Compiler/PrsStmt.HC.Z,571"$
|
||||
$LK,"AsmResolve",A="FL:::/Compiler/AsmResolve.HC.Z,1",BI=172$
|
||||
$LK,"PrsAsmInst",A="FL:::/Compiler/Asm.HC.Z,395",BI=173$
|
||||
$LK,"COCCompile",A="FL:::/Compiler/PrsLib.HC.Z,249",BI=174$
|
||||
$LK,"RunFile2",A="FL:::/Compiler/CMain.HC.Z,667",BI=175$
|
||||
$LK,"Cmp",A="FL:::/Compiler/CMain.HC.Z,419",BI=176$
|
||||
$LK,"PrsPush2",A="FL:::/Compiler/PrsLib.HC.Z,11",BI=177$
|
||||
$LK,"ICArgPut",A="FL:::/Compiler/CExcept.HC.Z,141",BI=178$
|
||||
$LK,"UndefinedExtern",A="FL:::/Compiler/CExcept.HC.Z,98",BI=179$
|
||||
$LK,"CN_RES",A="FL:::/Compiler/BackFA.HC.Z,4"$
|
||||
$LK,"OptIC4",A="FL:::/Compiler/OptPass4.HC.Z,1",BI=180$
|
||||
$LK,"OptIC6",A="FL:::/Compiler/OptPass6.HC.Z,1",BI=181$
|
||||
$LK,"ICCmpAndBranch",A="FL:::/Compiler/BackB.HC.Z,468",BI=182$
|
||||
$LK,"ICDivEqu",A="FL:::/Compiler/BackA.HC.Z,372",BI=183$
|
||||
$LK,"PrsWhile",A="FL:::/Compiler/PrsStmt.HC.Z,486",BI=184$
|
||||
$LK,"ICFCmpAndBranch",A="FL:::/Compiler/BackFB.HC.Z,226",BI=185$
|
||||
$LK,"Lex",A="FL:::/Compiler/Lex.HC.Z,441",BI=186$
|
||||
$LK,"ICTestAndBranch",A="FL:::/Compiler/BackB.HC.Z,640",BI=187$
|
||||
$LK,"uasm",A="FL:::/Compiler/Compiler.PRJ.Z,21"$
|
||||
$LK,"MODR_INDIRECT_REG",A="FL:::/Compiler/BackLib.HC.Z,127"$
|
||||
$LK,"PE_MAYBE_MODIFIERS",A="FL:::/Compiler/PrsExp.HC.Z,3"$
|
||||
$LK,"PE_UNARY_MODIFIERS",A="FL:::/Compiler/PrsExp.HC.Z,4"$
|
||||
$LK,"AOTLocalsResolve",A="FL:::/Compiler/AsmResolve.HC.Z,43",BI=188$
|
||||
$LK,"PE_DO_BINARY_OP",A="FL:::/Compiler/PrsExp.HC.Z,9"$
|
||||
$LK,"CmpFixUpAOTAsm",A="FL:::/Compiler/CMain.HC.Z,302",BI=189$
|
||||
$LK,"OptLabelFwd",A="FL:::/Compiler/OptLib.HC.Z,1",BI=190$
|
||||
$LK,"ICOrOr",A="FL:::/Compiler/BackB.HC.Z,51",BI=191$
|
||||
$LK,"LexExcept",A="FL:::/Compiler/CExcept.HC.Z,81",BI=192$
|
||||
$LK,"cmp_templates",A="FL:::/Compiler/CExts.HC.Z,42"$
|
||||
$LK,"CmpF2PushPop",A="FL:::/Compiler/OptLib.HC.Z,542",BI=193$
|
||||
$LK,"INTERNAL_TYPES_NUM",A="FL:::/Compiler/CInit.HC.Z,1"$
|
||||
$LK,"CmpJoin",A="FL:::/Compiler/CMain.HC.Z,35",BI=194$
|
||||
$LK,"PrsPop2",A="FL:::/Compiler/PrsLib.HC.Z,16",BI=195$
|
||||
$LK,"CMP_TEMPLATES",A="FL:::/Compiler/Templates.HC.Z,4"$
|
||||
$LK,"MODR_D8_INDIRECT_REG",A="FL:::/Compiler/BackLib.HC.Z,128"$
|
||||
$LK,"PrsAsmBlk",A="FL:::/Compiler/Asm.HC.Z,904",BI=196$
|
||||
$LK,"PrsAsmArg",A="FL:::/Compiler/Asm.HC.Z,35",BI=197$
|
||||
$LK,"LexFirstRem",A="FL:::/Compiler/Lex.HC.Z,271",BI=198$
|
||||
$LK,"MemberClassBaseFind",A="FL:::/Compiler/LexLib.HC.Z,87",BI=199$
|
||||
$LK,"MemberFind",A="FL:::/Compiler/LexLib.HC.Z,67",BI=200$
|
||||
$LK,"cmp",A="FL:::/Compiler/Compiler.PRJ.Z,16"$
|
||||
$LK,"OptLag",A="FL:::/Compiler/OptLib.HC.Z,40",BI=201$
|
||||
$LK,"ICPostIncDec",A="FL:::/Compiler/BackB.HC.Z,345",BI=202$
|
||||
$LK,"ICFPostIncDec",A="FL:::/Compiler/BackFB.HC.Z,593",BI=203$
|
||||
$LK,"ICTest",A="FL:::/Compiler/BackLib.HC.Z,413",BI=204$
|
||||
$LK,"ICModU64",A="FL:::/Compiler/BackC.HC.Z,463",BI=205$
|
||||
$LK,"PrsAsmImm",A="FL:::/Compiler/Asm.HC.Z,1",BI=206$
|
||||
$LK,"LexExtStr",A="FL:::/Compiler/LexLib.HC.Z,248",BI=207$
|
||||
$LK,"ICAddSubEctEqu",A="FL:::/Compiler/BackA.HC.Z,442",BI=208$
|
||||
$LK,"ICAddSubEctImm",A="FL:::/Compiler/BackA.HC.Z,56",BI=209$
|
||||
$LK,"ICPush",A="FL:::/Compiler/BackLib.HC.Z,312",BI=210$
|
||||
$LK,"ICSwap",A="FL:::/Compiler/BackC.HC.Z,490",BI=211$
|
||||
$LK,"CMP_TEMPLATES_DONT_PUSH",A="FL:::/Compiler/Templates.HC.Z,260"$
|
||||
$LK,"intermediate_code_table",A="FL:::/Compiler/CInit.HC.Z,16"$
|
||||
$LK,"ICZero",A="FL:::/Compiler/BackLib.HC.Z,404",BI=212$
|
||||
$LK,"CmpCtrlDel",A="FL:::/Compiler/Lex.HC.Z,58",BI=213$
|
||||
$LK,"ICClassPut",A="FL:::/Compiler/CExcept.HC.Z,117",BI=214$
|
||||
$LK,"ICAssign",A="FL:::/Compiler/BackC.HC.Z,159",BI=215$
|
||||
$LK,"ICFTemplateFun",A="FL:::/Compiler/BackFB.HC.Z,617",BI=216$
|
||||
$LK,"RunFile",A="FL:::/Compiler/CMain.HC.Z,625",BI=217$
|
||||
$LK,"MemberAdd",A="FL:::/Compiler/LexLib.HC.Z,103",BI=218$
|
||||
$LK,"PrsPush",A="FL:::/Compiler/PrsLib.HC.Z,1",BI=219$
|
||||
$LK,"SLASH_OP_FDIVR",A="FL:::/Compiler/BackLib.HC.Z,276"$
|
||||
$LK,"SLASH_OP_FISTTP",A="FL:::/Compiler/BackLib.HC.Z,279"$
|
||||
$LK,"CmpCtrlSize",A="FL:::/Compiler/Lex.HC.Z,70",BI=220$
|
||||
$LK,"ICLocalVarInit",A="FL:::/Compiler/BackC.HC.Z,761",BI=221$
|
||||
$LK,"PrsFor",A="FL:::/Compiler/PrsStmt.HC.Z,529",BI=222$
|
||||
$LK,"PassTrace",A="FL:::/Compiler/CMisc.HC.Z,50",BI=223$
|
||||
$LK,"PrsPopDeref",A="FL:::/Compiler/PrsLib.HC.Z,21",BI=224$
|
||||
$LK,"ICCopyTemplate",A="FL:::/Compiler/BackFA.HC.Z,77",BI=225$
|
||||
$LK,"PrsStmt",A="FL:::/Compiler/PrsStmt.HC.Z,904",BI=226$
|
||||
$LK,"PrsFun",A="FL:::/Compiler/PrsStmt.HC.Z,140",BI=227$
|
||||
$LK,"LexIncludeStr",A="FL:::/Compiler/Lex.HC.Z,293",BI=228$
|
||||
$LK,"PrsType",A="FL:::/Compiler/PrsVar.HC.Z,287",BI=229$
|
||||
$LK,"CmpCtrlNew",A="FL:::/Compiler/Lex.HC.Z,28",BI=230$
|
||||
$LK,"MODR_SIB_D8_INDIRECT_REG",A="FL:::/Compiler/BackLib.HC.Z,131"$
|
||||
$LK,"cmp_type_flags_src_code",A="FL:::/Compiler/Lex.HC.Z,322"$
|
||||
$LK,"PrsVarInit2",A="FL:::/Compiler/PrsVar.HC.Z,123",BI=231$
|
||||
$LK,"PrsPop",A="FL:::/Compiler/PrsLib.HC.Z,6",BI=232$
|
||||
$LK,"asm_seg_prefixes",A="FL:::/Compiler/Asm.HC.Z,393"$
|
||||
$LK,"ICMinMax",A="FL:::/Compiler/BackC.HC.Z,418",BI=233$
|
||||
$LK,"CmpLoadDefines",A="FL:::/Compiler/CInit.HC.Z,204",BI=234$
|
||||
$LK,"PrsIf",A="FL:::/Compiler/PrsStmt.HC.Z,459",BI=235$
|
||||
$LK,"ICBuiltInFloatConst",A="FL:::/Compiler/BackLib.HC.Z,423",BI=236$
|
||||
$LK,"ICFUnaryMinus",A="FL:::/Compiler/BackFA.HC.Z,194",BI=237$
|
||||
$LK,"LexDocRead",A="FL:::/Compiler/Lex.HC.Z,305",BI=238$
|
||||
$LK,"CmpFixUpJITAsm",A="FL:::/Compiler/CMain.HC.Z,174",BI=239$
|
||||
$LK,"COCPopNoFree",A="FL:::/Compiler/PrsLib.HC.Z,114",BI=240$
|
||||
$LK,"ParenWarning",A="FL:::/Compiler/CExcept.HC.Z,110",BI=241$
|
||||
$LK,"PrsFunCall",A="FL:::/Compiler/PrsExp.HC.Z,383",BI=242$
|
||||
$LK,"SLASH_OP_IMM_U32",A="FL:::/Compiler/BackLib.HC.Z,263"$
|
||||
$LK,"ICDerefPostIncDec",A="FL:::/Compiler/BackB.HC.Z,384",BI=243$
|
||||
$LK,"Option",A="FL:::/Compiler/CMisc.HC.Z,1",BI=244$
|
||||
$LK,"ExeFile2",A="FL:::/Compiler/CMain.HC.Z,657",BI=245$
|
||||
$LK,"COptMemberVar",A="FL:::/Compiler/OptLib.HC.Z,556"$
|
||||
$LK,"PE_CHECK_BINARY_OPS1",A="FL:::/Compiler/PrsExp.HC.Z,6"$
|
||||
$LK,"PE_CHECK_BINARY_OPS2",A="FL:::/Compiler/PrsExp.HC.Z,7"$
|
||||
$LK,"LexBackupLastChar",A="FL:::/Compiler/LexLib.HC.Z,1",BI=246$
|
||||
$LK,"Trace",A="FL:::/Compiler/CMisc.HC.Z,58",BI=247$
|
||||
$LK,"ICBrBitOps",A="FL:::/Compiler/BackC.HC.Z,208",BI=248$
|
||||
$LK,"MODR_D32_INDIRECT_REG",A="FL:::/Compiler/BackLib.HC.Z,129"$
|
||||
$LK,"LexGetChar",A="FL:::/Compiler/Lex.HC.Z,107",BI=249$
|
||||
$LK,"LexSkipEol",A="FL:::/Compiler/Lex.HC.Z,264",BI=250$
|
||||
$LK,"ICFlagBranch",A="FL:::/Compiler/BackB.HC.Z,688",BI=251$
|
||||
$LK,"SLASH_OP_FSUBR",A="FL:::/Compiler/BackLib.HC.Z,273"$
|
||||
$LK,"ICFPreIncDec",A="FL:::/Compiler/BackFB.HC.Z,573",BI=252$
|
||||
$LK,"MODR_SIB_INDIRECT_REG",A="FL:::/Compiler/BackLib.HC.Z,130"$
|
||||
$LK,"SLASH_OP_IMM_U8",A="FL:::/Compiler/BackLib.HC.Z,262"$
|
||||
$LK,"ExeFile",A="FL:::/Compiler/CMain.HC.Z,614",BI=253$
|
||||
$LK,"COCMiscNew",A="FL:::/Compiler/PrsLib.HC.Z,143",BI=254$
|
||||
$LK,"cmp_templates_dont_pop",A="FL:::/Compiler/CExts.HC.Z,43"$
|
||||
$LK,"CmpOffset2Reg",A="FL:::/Compiler/OptLib.HC.Z,83",BI=255$
|
||||
$LK,"PrsFunNew",A="FL:::/Compiler/PrsLib.HC.Z,62",BI=256$
|
||||
$LK,"StreamExePrint",A="FL:::/Compiler/CMain.HC.Z,673",BI=257$
|
||||
$LK,"COCGoToLabelFind",A="FL:::/Compiler/PrsLib.HC.Z,152",BI=258$
|
||||
$LK,"OptMVCompare",A="FL:::/Compiler/OptLib.HC.Z,562",BI=259$
|
||||
$LK,"ICToBool",A="FL:::/Compiler/BackB.HC.Z,289",BI=260$
|
||||
$LK,"PrsFunJoin",A="FL:::/Compiler/PrsStmt.HC.Z,62",BI=261$
|
||||
$LK,"OptFixSizeOf",A="FL:::/Compiler/OptLib.HC.Z,484",BI=262$
|
||||
$LK,"cmp_templates_dont_push",A="FL:::/Compiler/CExts.HC.Z,45"$
|
||||
$LK,"cmp_templates_dont_push_pop",A="FL:::/Compiler/CExts.HC.Z,46"$
|
||||
$LK,"LexAttachDoc",A="FL:::/Compiler/Lex.HC.Z,325",BI=263$
|
||||
$LK,"PrsStreamBlk",A="FL:::/Compiler/PrsStmt.HC.Z,805",BI=264$
|
||||
$LK,"MODR_RIP_REL_IMM_U32",A="FL:::/Compiler/BackLib.HC.Z,134"$
|
||||
$LK,"cmp_templates_dont_push2",A="FL:::/Compiler/CExts.HC.Z,44"$
|
||||
$LK,"InstEntryFind",A="FL:::/Compiler/UAsm.HC.Z,66",BI=265$
|
||||
$LK,"PrsDotDotDot",A="FL:::/Compiler/PrsVar.HC.Z,381",BI=266$
|
||||
$LK,"ICMulEqu",A="FL:::/Compiler/BackA.HC.Z,285",BI=267$
|
||||
$LK,"AsmPrsInsFlags",A="FL:::/Compiler/AsmInit.HC.Z,1",BI=268$
|
||||
$LK,"PrsNoWarn",A="FL:::/Compiler/PrsStmt.HC.Z,791",BI=269$
|
||||
| ||||