TempleOSCDV5.00.ISO
This commit is contained in:
1 parent
122df6338e
commit
f6eacf7744
374 files changed
+11078
-11204
No files matched your search
+50
-49
@@ -277,7 +277,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
|
||||
if (num2->U8_cnt==1) {
|
||||
if (num2->num.local_asm_undef_hash||num2->num.glbl_asm_undef_hash)
|
||||
AsmUnresolvedAdd(cc,num2->num.machine_code,IET_REL_I8+num2->imm_flag,
|
||||
aotc->ip,num2->rel,num2->num.local_asm_undef_hash,
|
||||
aotc->rip,num2->rel,num2->num.local_asm_undef_hash,
|
||||
num2->num.glbl_asm_undef_hash,cc->lex_include_stk->line_num,
|
||||
U8_avail);
|
||||
else if (!num2->imm_flag && !(MIN_I8<=num2->num.i<=MAX_I8))
|
||||
@@ -287,7 +287,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
|
||||
tmpa=CAlloc(sizeof(CAOTAbsAddr));
|
||||
tmpa->next=aotc->abss;
|
||||
aotc->abss=tmpa;
|
||||
tmpa->ip=aotc->ip;
|
||||
tmpa->rip=aotc->rip;
|
||||
tmpa->type=AAT_ADD_U8;
|
||||
}
|
||||
} else {
|
||||
@@ -295,7 +295,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
|
||||
tmpa=CAlloc(sizeof(CAOTAbsAddr));
|
||||
tmpa->next=aotc->abss;
|
||||
aotc->abss=tmpa;
|
||||
tmpa->ip=aotc->ip;
|
||||
tmpa->rip=aotc->rip;
|
||||
tmpa->type=AAT_SUB_U8;
|
||||
}
|
||||
}
|
||||
@@ -304,7 +304,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
|
||||
if (num2->U8_cnt==2) {
|
||||
if (num2->num.local_asm_undef_hash||num2->num.glbl_asm_undef_hash)
|
||||
AsmUnresolvedAdd(cc,num2->num.machine_code,IET_REL_I16+num2->imm_flag,
|
||||
aotc->ip,num2->rel,num2->num.local_asm_undef_hash,
|
||||
aotc->rip,num2->rel,num2->num.local_asm_undef_hash,
|
||||
num2->num.glbl_asm_undef_hash,cc->lex_include_stk->line_num,
|
||||
U8_avail);
|
||||
else if (!num2->imm_flag && !(MIN_I16<=num2->num.i<=MAX_I16))
|
||||
@@ -314,7 +314,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
|
||||
tmpa=CAlloc(sizeof(CAOTAbsAddr));
|
||||
tmpa->next=aotc->abss;
|
||||
aotc->abss=tmpa;
|
||||
tmpa->ip=aotc->ip;
|
||||
tmpa->rip=aotc->rip;
|
||||
tmpa->type=AAT_ADD_U16;
|
||||
}
|
||||
} else {
|
||||
@@ -322,7 +322,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
|
||||
tmpa=CAlloc(sizeof(CAOTAbsAddr));
|
||||
tmpa->next=aotc->abss;
|
||||
aotc->abss=tmpa;
|
||||
tmpa->ip=aotc->ip;
|
||||
tmpa->rip=aotc->rip;
|
||||
tmpa->type=AAT_SUB_U16;
|
||||
}
|
||||
}
|
||||
@@ -331,7 +331,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
|
||||
} else if (num2->U8_cnt==4) {
|
||||
if (num2->num.local_asm_undef_hash||num2->num.glbl_asm_undef_hash)
|
||||
AsmUnresolvedAdd(cc,num2->num.machine_code,IET_REL_I32+num2->imm_flag,
|
||||
aotc->ip,num2->rel,num2->num.local_asm_undef_hash,
|
||||
aotc->rip,num2->rel,num2->num.local_asm_undef_hash,
|
||||
num2->num.glbl_asm_undef_hash,cc->lex_include_stk->line_num,
|
||||
U8_avail);
|
||||
else if (!num2->imm_flag && !(MIN_I32<=num2->num.i<=MAX_I32))
|
||||
@@ -341,7 +341,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
|
||||
tmpa=CAlloc(sizeof(CAOTAbsAddr));
|
||||
tmpa->next=aotc->abss;
|
||||
aotc->abss=tmpa;
|
||||
tmpa->ip=aotc->ip;
|
||||
tmpa->rip=aotc->rip;
|
||||
tmpa->type=AAT_ADD_U32;
|
||||
}
|
||||
} else {
|
||||
@@ -349,7 +349,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
|
||||
tmpa=CAlloc(sizeof(CAOTAbsAddr));
|
||||
tmpa->next=aotc->abss;
|
||||
aotc->abss=tmpa;
|
||||
tmpa->ip=aotc->ip;
|
||||
tmpa->rip=aotc->rip;
|
||||
tmpa->type=AAT_SUB_U32;
|
||||
}
|
||||
}
|
||||
@@ -357,7 +357,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
|
||||
} else if (num2->U8_cnt==8) {
|
||||
if (num2->num.local_asm_undef_hash||num2->num.glbl_asm_undef_hash)
|
||||
AsmUnresolvedAdd(cc,num2->num.machine_code,IET_REL_I64+num2->imm_flag,
|
||||
aotc->ip,num2->rel,num2->num.local_asm_undef_hash,
|
||||
aotc->rip,num2->rel,num2->num.local_asm_undef_hash,
|
||||
num2->num.glbl_asm_undef_hash,cc->lex_include_stk->line_num,
|
||||
U8_avail);
|
||||
if (num2->imm_flag) {
|
||||
@@ -365,7 +365,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
|
||||
tmpa=CAlloc(sizeof(CAOTAbsAddr));
|
||||
tmpa->next=aotc->abss;
|
||||
aotc->abss=tmpa;
|
||||
tmpa->ip=aotc->ip;
|
||||
tmpa->rip=aotc->rip;
|
||||
tmpa->type=AAT_ADD_U64;
|
||||
}
|
||||
} else {
|
||||
@@ -373,7 +373,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
|
||||
tmpa=CAlloc(sizeof(CAOTAbsAddr));
|
||||
tmpa->next=aotc->abss;
|
||||
aotc->abss=tmpa;
|
||||
tmpa->ip=aotc->ip;
|
||||
tmpa->rip=aotc->rip;
|
||||
tmpa->type=AAT_SUB_U64;
|
||||
}
|
||||
}
|
||||
@@ -395,7 +395,7 @@ U8 asm_seg_prefixes[6]={0x26,0x2E,0x36,0x3E,0x64,0x65};
|
||||
Bool PrsAsmInst(CCmpCtrl *cc,CHashOpcode *tmpo,I64 argcnt)
|
||||
{
|
||||
CAOTCtrl *aotc=cc->aotc;
|
||||
I64 i,j,a1,a2,om,seg,arg1mask,arg2mask;
|
||||
I64 i,j,arg1,arg2,om,seg,arg1mask,arg2mask;
|
||||
CAsmArg *tmpa1,*tmpa2;
|
||||
Bool ModrM_complete,U8_avail=FALSE,found_second_possible=FALSE;
|
||||
CInst *tmpins;
|
||||
@@ -429,8 +429,8 @@ Bool PrsAsmInst(CCmpCtrl *cc,CHashOpcode *tmpo,I64 argcnt)
|
||||
cur.disp.imm_flag=TRUE;
|
||||
cur.imm.imm_flag=TRUE;
|
||||
om=tmpins->opcode_modifier;
|
||||
a1=tmpins->arg1;
|
||||
a2=tmpins->arg2;
|
||||
arg1=tmpins->arg1;
|
||||
arg2=tmpins->arg2;
|
||||
tmpa1=&aotc->arg1;
|
||||
tmpa2=&aotc->arg2;
|
||||
cur.last_opcode_U8=tmpins->opcode[tmpins->opcode_cnt-1];
|
||||
@@ -479,9 +479,9 @@ Bool PrsAsmInst(CCmpCtrl *cc,CHashOpcode *tmpo,I64 argcnt)
|
||||
cur.last_opcode_U8+=tmpa1->reg1;
|
||||
}
|
||||
}
|
||||
if (a1==ARGT_R64 || a1==ARGT_RM64 || a1==ARGT_M64)
|
||||
if (arg1==ARGT_R64 || arg1==ARGT_RM64 || arg1==ARGT_M64)
|
||||
cur.REX|=8;
|
||||
if (ARGT_RM8<=a1<=ARGT_RM64 || ARGT_M8<=a1<=ARGT_M64) {
|
||||
if (ARGT_RM8<=arg1<=ARGT_RM64 || ARGT_M8<=arg1<=ARGT_M64) {
|
||||
if (aotc->seg_size==16)
|
||||
cur.has_addr_prefix=TRUE;
|
||||
|
||||
@@ -563,9 +563,9 @@ Bool PrsAsmInst(CCmpCtrl *cc,CHashOpcode *tmpo,I64 argcnt)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (ARGT_REL8<=a1<=ARGT_REL32 || ARGT_IMM8<=a1<=ARGT_IMM64 ||
|
||||
ARGT_UIMM8<=a1<=ARGT_UIMM64) {
|
||||
if (a1==ARGT_IMM64 || a2==ARGT_UIMM64)
|
||||
} else if (ARGT_REL8<=arg1<=ARGT_REL32 || ARGT_IMM8<=arg1<=ARGT_IMM64 ||
|
||||
ARGT_UIMM8<=arg1<=ARGT_UIMM64) {
|
||||
if (arg1==ARGT_IMM64 || arg2==ARGT_UIMM64)
|
||||
cur.REX|=8;
|
||||
MemCpy(&cur.imm.num,&tmpa1->num,sizeof(CAsmNum));
|
||||
}
|
||||
@@ -579,7 +579,7 @@ Bool PrsAsmInst(CCmpCtrl *cc,CHashOpcode *tmpo,I64 argcnt)
|
||||
}
|
||||
if (tmpins->flags & IEF_PLUS_OPCODE) {
|
||||
if (tmpins->slash_val==SV_R_REG) {
|
||||
if (ARGT_AL<=a1<=ARGT_RAX) {
|
||||
if (ARGT_AL<=arg1<=ARGT_RAX) {
|
||||
cur.last_opcode_U8|=tmpa2->reg1&7;
|
||||
if (tmpa2->reg1&15>7)
|
||||
cur.REX|=1;
|
||||
@@ -599,15 +599,16 @@ Bool PrsAsmInst(CCmpCtrl *cc,CHashOpcode *tmpo,I64 argcnt)
|
||||
cur.last_opcode_U8|=tmpa2->reg1;
|
||||
}
|
||||
}
|
||||
if (a1==ARGT_RM64 || a2==ARGT_RM64 || a1==ARGT_M64 || a2==ARGT_M64 ||
|
||||
a1==ARGT_R64 || a2==ARGT_R64)
|
||||
if (arg1==ARGT_RM64 || arg2==ARGT_RM64 ||
|
||||
arg1==ARGT_M64 || arg2==ARGT_M64 ||
|
||||
arg1==ARGT_R64 || arg2==ARGT_R64)
|
||||
cur.REX|=8;
|
||||
if (ARGT_RM8<=a1<=ARGT_RM64 || ARGT_RM8<=a2<=ARGT_RM64 ||
|
||||
ARGT_M8<=a1<=ARGT_M64 || ARGT_M8<=a2<=ARGT_M64) {
|
||||
if (ARGT_RM8<=arg1<=ARGT_RM64 || ARGT_RM8<=arg2<=ARGT_RM64 ||
|
||||
ARGT_M8<=arg1<=ARGT_M64 || ARGT_M8<=arg2<=ARGT_M64) {
|
||||
if (aotc->seg_size==16)
|
||||
cur.has_addr_prefix=TRUE;
|
||||
cur.has_ModrM=TRUE;
|
||||
if (ARGT_RM8<=a2<=ARGT_RM64 || ARGT_M8<=a2<=ARGT_M64) {
|
||||
if (ARGT_RM8<=arg2<=ARGT_RM64 || ARGT_M8<=arg2<=ARGT_M64) {
|
||||
tmpa1=&aotc->arg2;
|
||||
tmpa2=&aotc->arg1;
|
||||
}
|
||||
@@ -709,39 +710,39 @@ Bool PrsAsmInst(CCmpCtrl *cc,CHashOpcode *tmpo,I64 argcnt)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (ARGT_MOFFS8<=a1<=ARGT_MOFFS64) {
|
||||
} else if (ARGT_MOFFS8<=arg1<=ARGT_MOFFS64) {
|
||||
MemCpy(&cur.disp.num,&tmpa1->num,sizeof(CAsmNum));
|
||||
if (aotc->seg_size==16)
|
||||
cur.disp.U8_cnt=2;
|
||||
else
|
||||
cur.disp.U8_cnt=4;
|
||||
cur.has_addr_prefix=FALSE;
|
||||
} else if (ARGT_MOFFS8<=a2<=ARGT_MOFFS64) {
|
||||
} else if (ARGT_MOFFS8<=arg2<=ARGT_MOFFS64) {
|
||||
MemCpy(&cur.disp.num,&tmpa2->num,sizeof(CAsmNum));
|
||||
if (aotc->seg_size==16)
|
||||
cur.disp.U8_cnt=2;
|
||||
else
|
||||
cur.disp.U8_cnt=4;
|
||||
cur.has_addr_prefix=FALSE;
|
||||
} else if (ARGT_IMM8<=a1<=ARGT_IMM64 ||
|
||||
ARGT_UIMM8<=a1<=ARGT_UIMM64) {
|
||||
} else if (ARGT_IMM8<=arg1<=ARGT_IMM64 ||
|
||||
ARGT_UIMM8<=arg1<=ARGT_UIMM64) {
|
||||
MemCpy(&cur.imm.num,&tmpa1->num,sizeof(CAsmNum));
|
||||
if (a1==ARGT_IMM8 || a1==ARGT_UIMM8) cur.imm.U8_cnt=1;
|
||||
else if (a1==ARGT_IMM16 || a1==ARGT_UIMM16) cur.imm.U8_cnt=2;
|
||||
else if (a1==ARGT_IMM32 || a1==ARGT_UIMM32) cur.imm.U8_cnt=4;
|
||||
if (arg1==ARGT_IMM8 || arg1==ARGT_UIMM8) cur.imm.U8_cnt=1;
|
||||
else if (arg1==ARGT_IMM16 || arg1==ARGT_UIMM16) cur.imm.U8_cnt=2;
|
||||
else if (arg1==ARGT_IMM32 || arg1==ARGT_UIMM32) cur.imm.U8_cnt=4;
|
||||
else {
|
||||
cur.imm.U8_cnt=8;
|
||||
cur.REX|=8;
|
||||
}
|
||||
}
|
||||
if (ARGT_IMM8<=a2<=ARGT_IMM64 ||
|
||||
ARGT_UIMM8<=a2<=ARGT_UIMM64) {
|
||||
if (ARGT_IMM8<=arg2<=ARGT_IMM64 ||
|
||||
ARGT_UIMM8<=arg2<=ARGT_UIMM64) {
|
||||
MemCpy(&cur.imm.num,&tmpa2->num,sizeof(CAsmNum));
|
||||
if (a2==ARGT_IMM8 || a2==ARGT_UIMM8) cur.imm.U8_cnt=1;
|
||||
else if (a2==ARGT_IMM16 || a2==ARGT_UIMM16) cur.imm.U8_cnt=2;
|
||||
else if (a2==ARGT_IMM32 || a2==ARGT_UIMM32) {
|
||||
if (arg2==ARGT_IMM8 || arg2==ARGT_UIMM8) cur.imm.U8_cnt=1;
|
||||
else if (arg2==ARGT_IMM16 || arg2==ARGT_UIMM16) cur.imm.U8_cnt=2;
|
||||
else if (arg2==ARGT_IMM32 || arg2==ARGT_UIMM32) {
|
||||
cur.imm.U8_cnt=4;
|
||||
if (tmpins->flags&IEF_REX_ONLY_R8_R15 && a2==ARGT_UIMM32)
|
||||
if (tmpins->flags&IEF_REX_ONLY_R8_R15 && arg2==ARGT_UIMM32)
|
||||
cur.REX&=~8;
|
||||
} else {
|
||||
cur.imm.U8_cnt=8;
|
||||
@@ -793,13 +794,13 @@ Bool PrsAsmInst(CCmpCtrl *cc,CHashOpcode *tmpo,I64 argcnt)
|
||||
AOTStoreCodeU8(cc,best.SIB);
|
||||
|
||||
if (best.disp.U8_cnt) {
|
||||
best.disp.rel=aotc->ip+best.disp.U8_cnt+best.imm.U8_cnt;
|
||||
best.disp.rel=aotc->rip+best.disp.U8_cnt+best.imm.U8_cnt;
|
||||
if (!AsmStoreNum(cc,&best.disp,1,U8_avail))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (best.imm.U8_cnt) {
|
||||
best.imm.rel=aotc->ip+best.imm.U8_cnt;
|
||||
best.imm.rel=aotc->rip+best.imm.U8_cnt;
|
||||
if (!AsmStoreNum(cc,&best.imm,1,U8_avail))
|
||||
return FALSE;
|
||||
}
|
||||
@@ -949,7 +950,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
|
||||
LexExcept(cc,"ORG not allowed in fun asm blk ");
|
||||
if (aotc->module_org!=INVALID_PTR)
|
||||
LexExcept(cc,"Just one org allowed ");
|
||||
if (aotc->ip)
|
||||
if (aotc->rip)
|
||||
LexExcept(cc,"ORG must be at beginning ");
|
||||
aotc->module_org=AsmLexExpression(cc);
|
||||
break;
|
||||
@@ -963,12 +964,12 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
|
||||
if (!(cc->flags&CCF_AOT_COMPILE) && i>8)
|
||||
LexExcept(cc,"In JIT mode, max ALIGN is 8 ");
|
||||
if (j>aotc->max_align_bits) aotc->max_align_bits=j;
|
||||
i=CeilU64(aotc->ip,i);
|
||||
i=CeilU64(aotc->rip,i);
|
||||
if (cc->token!=',')
|
||||
LexExcept(cc,"Expecting ',' at ");
|
||||
Lex(cc);
|
||||
k=AsmLexExpression(cc);
|
||||
for (j=aotc->ip;j<i;j++)
|
||||
for (j=aotc->rip;j<i;j++)
|
||||
AOTStoreCodeU8(cc,k);
|
||||
break;
|
||||
case AKW_DU8:
|
||||
@@ -1031,14 +1032,14 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
|
||||
} else if (cc->hash_entry->type & HTT_EXPORT_SYS_SYM) {
|
||||
if (Btr(&cc->hash_entry->type,HTf_UNRESOLVED)) {
|
||||
if (cc->hash_entry->type & HTF_LOCAL) {
|
||||
cc->hash_entry(CHashExport *)->val=aotc->ip;
|
||||
cc->hash_entry(CHashExport *)->val=aotc->rip;
|
||||
if (Lex(cc)!=':')
|
||||
LexExcept(cc,"Expecting ':' at ");
|
||||
Lex(cc);
|
||||
} else {
|
||||
if (cc->hash_entry->type & HTF_IMPORT)
|
||||
LexExcept(cc,"attempt to define import at ");
|
||||
cc->hash_entry(CHashExport *)->val=aotc->ip;
|
||||
cc->hash_entry(CHashExport *)->val=aotc->rip;
|
||||
next_last_label=cc->hash_entry->str;
|
||||
Lex(cc); //Skip cur_str
|
||||
if (cc->token!=':' && cc->token!=TK_DBL_COLON)
|
||||
@@ -1052,7 +1053,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
|
||||
}
|
||||
Lex(cc);
|
||||
}
|
||||
} else if (cc->hash_entry(CHashExport *)->val==aotc->ip) {
|
||||
} else if (cc->hash_entry(CHashExport *)->val==aotc->rip) {
|
||||
Lex(cc); //Skip cur_str
|
||||
if (cc->token!=':' && cc->token!=TK_DBL_COLON)
|
||||
LexExcept(cc,"Expecting ':' at ");
|
||||
@@ -1066,7 +1067,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
|
||||
tmpex->str=cc->cur_str;
|
||||
cc->cur_str=0;
|
||||
tmpex->type=HTT_EXPORT_SYS_SYM;
|
||||
tmpex->val=aotc->ip;
|
||||
tmpex->val=aotc->rip;
|
||||
Lex(cc); //Skip cur_str
|
||||
if (cc->token!=':' && cc->token!=TK_DBL_COLON)
|
||||
LexExcept(cc,"Expecting ':' at ");
|
||||
@@ -1085,7 +1086,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
|
||||
LexExcept(cc,"Duplicate goto label at ");
|
||||
g_lb->type=CMT_ASM_LABEL;
|
||||
g_lb->flags|=CMF_DEFINED;
|
||||
g_lb->ip=aotc->ip;
|
||||
g_lb->rip=aotc->rip;
|
||||
g_lb->use_cnt++; //Disable warning on unused labels.
|
||||
ICAdd(cc,IC_LABEL,g_lb,0);
|
||||
}
|
||||
|
||||
+26
-26
@@ -1,11 +1,11 @@
|
||||
U0 AOTStoreCodeU8(CCmpCtrl *cc,U8 b)
|
||||
{
|
||||
CAOTCtrl *aotc=cc->aotc;
|
||||
I64 i=aotc->ip>>AOT_BIN_BLK_BITS;
|
||||
I64 i=aotc->rip>>AOT_BIN_BLK_BITS;
|
||||
CAOTBinBlk *tmpbin=aotc->bin;
|
||||
while (i--)
|
||||
if (!(tmpbin=tmpbin->next)) {
|
||||
i=aotc->ip>>AOT_BIN_BLK_BITS+1;
|
||||
i=aotc->rip>>AOT_BIN_BLK_BITS+1;
|
||||
tmpbin=&aotc->bin;
|
||||
while (i--) {
|
||||
if (!tmpbin->next)
|
||||
@@ -14,7 +14,7 @@ U0 AOTStoreCodeU8(CCmpCtrl *cc,U8 b)
|
||||
}
|
||||
break;
|
||||
}
|
||||
tmpbin->body[aotc->ip++ & (AOT_BIN_BLK_SIZE-1)]=b;
|
||||
tmpbin->body[aotc->rip++ & (AOT_BIN_BLK_SIZE-1)]=b;
|
||||
if (aotc->lst) {
|
||||
if (aotc->lst_col>=24) {
|
||||
'\n';
|
||||
@@ -23,14 +23,14 @@ U0 AOTStoreCodeU8(CCmpCtrl *cc,U8 b)
|
||||
"%02X ",b;
|
||||
aotc->lst_col+=3;
|
||||
}
|
||||
if (aotc->ip>aotc->num_bin_U8s)
|
||||
aotc->num_bin_U8s=aotc->ip;
|
||||
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->ip>>AOT_BIN_BLK_BITS,j=(aotc->ip+sizeof(U32))>>AOT_BIN_BLK_BITS;
|
||||
I64 i=aotc->rip>>AOT_BIN_BLK_BITS,j=(aotc->rip+sizeof(U32))>>AOT_BIN_BLK_BITS;
|
||||
U32 *_d;
|
||||
CAOTBinBlk *tmpbin;
|
||||
if (i!=j)
|
||||
@@ -40,7 +40,7 @@ U0 AOTStoreCodeU32(CCmpCtrl *cc,U32 d)
|
||||
tmpbin=aotc->bin;
|
||||
while (i--)
|
||||
if (!(tmpbin=tmpbin->next)) {
|
||||
i=aotc->ip>>AOT_BIN_BLK_BITS+1;
|
||||
i=aotc->rip>>AOT_BIN_BLK_BITS+1;
|
||||
tmpbin=&aotc->bin;
|
||||
while (i--) {
|
||||
if (!tmpbin->next)
|
||||
@@ -49,9 +49,9 @@ U0 AOTStoreCodeU32(CCmpCtrl *cc,U32 d)
|
||||
}
|
||||
break;
|
||||
}
|
||||
_d=tmpbin->body+ aotc->ip&(AOT_BIN_BLK_SIZE-1);
|
||||
_d=tmpbin->body+ aotc->rip&(AOT_BIN_BLK_SIZE-1);
|
||||
*_d=d;
|
||||
aotc->ip+=sizeof(U32);
|
||||
aotc->rip+=sizeof(U32);
|
||||
if (aotc->lst) {
|
||||
if (aotc->lst_col>=24) {
|
||||
'\n';
|
||||
@@ -60,16 +60,16 @@ U0 AOTStoreCodeU32(CCmpCtrl *cc,U32 d)
|
||||
"%08X ",d;
|
||||
aotc->lst_col+=9;
|
||||
}
|
||||
if (aotc->ip>aotc->num_bin_U8s)
|
||||
aotc->num_bin_U8s=aotc->ip;
|
||||
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->ip>>AOT_BIN_BLK_BITS,j=(aotc->ip+sizeof(I64))>>AOT_BIN_BLK_BITS,
|
||||
*_q;
|
||||
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++)
|
||||
@@ -78,7 +78,7 @@ U0 AOTStoreCodeU64(CCmpCtrl *cc,U64 q)
|
||||
tmpbin=aotc->bin;
|
||||
while (i--)
|
||||
if (!(tmpbin=tmpbin->next)) {
|
||||
i=aotc->ip>>AOT_BIN_BLK_BITS+1;
|
||||
i=aotc->rip>>AOT_BIN_BLK_BITS+1;
|
||||
tmpbin=&aotc->bin;
|
||||
while (i--) {
|
||||
if (!tmpbin->next)
|
||||
@@ -87,9 +87,9 @@ U0 AOTStoreCodeU64(CCmpCtrl *cc,U64 q)
|
||||
}
|
||||
break;
|
||||
}
|
||||
_q=tmpbin->body+ aotc->ip&(AOT_BIN_BLK_SIZE-1);
|
||||
_q=tmpbin->body+ aotc->rip&(AOT_BIN_BLK_SIZE-1);
|
||||
*_q=q;
|
||||
aotc->ip+=sizeof(I64);
|
||||
aotc->rip+=sizeof(I64);
|
||||
if (aotc->lst) {
|
||||
if (aotc->lst_col>=24) {
|
||||
'\n';
|
||||
@@ -98,18 +98,18 @@ U0 AOTStoreCodeU64(CCmpCtrl *cc,U64 q)
|
||||
"%016X ",q;
|
||||
aotc->lst_col+=17;
|
||||
}
|
||||
if (aotc->ip>aotc->num_bin_U8s)
|
||||
aotc->num_bin_U8s=aotc->ip;
|
||||
if (aotc->rip>aotc->num_bin_U8s)
|
||||
aotc->num_bin_U8s=aotc->rip;
|
||||
}
|
||||
}
|
||||
|
||||
U0 AOTStoreCodeU8At(CCmpCtrl *cc,I64 ip,...)
|
||||
U0 AOTStoreCodeU8At(CCmpCtrl *cc,I64 rip,...)
|
||||
{
|
||||
CAOTCtrl *aotc=cc->aotc;
|
||||
CAOTBinBlk *tmpbin;
|
||||
I64 i,j;
|
||||
for (j=0;j<argc;j++) {
|
||||
i=ip>>AOT_BIN_BLK_BITS+1;
|
||||
i=rip>>AOT_BIN_BLK_BITS+1;
|
||||
tmpbin=&aotc->bin;
|
||||
while (i--) {
|
||||
if (!tmpbin->next) {
|
||||
@@ -118,10 +118,10 @@ U0 AOTStoreCodeU8At(CCmpCtrl *cc,I64 ip,...)
|
||||
}
|
||||
tmpbin=tmpbin->next;
|
||||
}
|
||||
tmpbin->body[ip++ & (AOT_BIN_BLK_SIZE-1)]=argv[j];
|
||||
tmpbin->body[rip++ & (AOT_BIN_BLK_SIZE-1)]=argv[j];
|
||||
}
|
||||
if (ip>aotc->num_bin_U8s)
|
||||
aotc->num_bin_U8s=ip;
|
||||
if (rip>aotc->num_bin_U8s)
|
||||
aotc->num_bin_U8s=rip;
|
||||
}
|
||||
|
||||
I64 AsmLexExpression(CCmpCtrl *cc)
|
||||
@@ -153,13 +153,13 @@ U0 AsmLineLst(CCmpCtrl *cc)
|
||||
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_ip;
|
||||
"%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_ip;
|
||||
"%h*c%08X ",24-aotc->lst_col,CH_SPACE,aotc->lst_last_rip;
|
||||
aotc->lst_col=0;
|
||||
doc_e2=LexPutLine(cc,doc_e2);
|
||||
}
|
||||
@@ -171,5 +171,5 @@ U0 AsmLineLst(CCmpCtrl *cc)
|
||||
aotc->lst_last_line=NULL;
|
||||
aotc->lst_last_lfn=tmpf;
|
||||
}
|
||||
aotc->lst_last_ip=aotc->ip;
|
||||
aotc->lst_last_rip=aotc->rip;
|
||||
}
|
||||
+19
-18
@@ -2,7 +2,7 @@ U0 AsmResolve(CCmpCtrl *cc,CAsmUnresolvedRef *tmpu,U8 *label,Bool undefined)
|
||||
{
|
||||
CAOTImportExport *tmpie;
|
||||
CAsmUndefHash *tmpauh;
|
||||
I64 r=Call(tmpu->machine_code);
|
||||
I64 res=Call(tmpu->machine_code);
|
||||
if (undefined) {
|
||||
tmpauh=tmpu->asm_undef_hash;
|
||||
while (tmpauh) {
|
||||
@@ -10,31 +10,32 @@ U0 AsmResolve(CCmpCtrl *cc,CAsmUnresolvedRef *tmpu,U8 *label,Bool undefined)
|
||||
tmpie=CAlloc(sizeof(CAOTImportExport));
|
||||
tmpie->next=tmpauh->hash->ie_lst;
|
||||
tmpauh->hash->ie_lst=tmpie;
|
||||
tmpie->ip=tmpu->ip;
|
||||
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)) {
|
||||
r-=tmpu->rel_ip;
|
||||
if (tmpu->type==IET_REL_I8 && !(MIN_I8<=r<=MAX_I8) ||
|
||||
tmpu->type==IET_REL_I16 && !(MIN_I16<=r<=MAX_I16)) {
|
||||
res-=tmpu->rel_rip;
|
||||
if (tmpu->type==IET_REL_I8 && !(MIN_I8<=res<=MAX_I8) ||
|
||||
tmpu->type==IET_REL_I16 && !(MIN_I16<=res<=MAX_I16)) {
|
||||
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<=r<=123)
|
||||
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->ip,r.u8[0]);
|
||||
AOTStoreCodeU8At(cc,tmpu->rip,res.u8[0]);
|
||||
if (tmpu->type>=IET_REL_I16) {
|
||||
AOTStoreCodeU8At(cc,tmpu->ip+1,r.u8[1]);
|
||||
AOTStoreCodeU8At(cc,tmpu->rip+1,res.u8[1]);
|
||||
if (tmpu->type>=IET_REL_I32) {
|
||||
AOTStoreCodeU8At(cc,tmpu->ip+2,r.u8[2],r.u8[3]);
|
||||
AOTStoreCodeU8At(cc,tmpu->rip+2,res.u8[2],res.u8[3]);
|
||||
if (tmpu->type>=IET_REL_I64)
|
||||
AOTStoreCodeU8At(cc,tmpu->ip+4,r.u8[4],r.u8[5],r.u8[6],r.u8[7]);
|
||||
AOTStoreCodeU8At(cc,tmpu->rip+4,res.u8[4],res.u8[5],
|
||||
res.u8[6],res.u8[7]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -157,8 +158,8 @@ U0 AOTGlblsResolve(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
tmpeu=tmpf->ext_lst;
|
||||
while (tmpeu) {
|
||||
tmpeu8=tmpeu->next;
|
||||
j=tmpf->exe_addr-(tmpeu->ip+4);
|
||||
AOTStoreCodeU8At(cc,tmpeu->ip,j.u8[0],j.u8[1],j.u8[2],j.u8[3]);
|
||||
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;
|
||||
}
|
||||
@@ -167,11 +168,11 @@ U0 AOTGlblsResolve(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
tmpie=CAlloc(sizeof(CAOTImportExport));
|
||||
tmpie->type=IET_REL32_EXPORT;
|
||||
if (tmpex->type & HTT_FUN)
|
||||
tmpie->ip=tmpf->exe_addr;
|
||||
tmpie->rip=tmpf->exe_addr;
|
||||
else if (tmpex->type & HTT_GLBL_VAR)
|
||||
tmpie->ip=tmpex(CHashGlblVar *)->data_addr_ip;
|
||||
tmpie->rip=tmpex(CHashGlblVar *)->data_addr_rip;
|
||||
else
|
||||
tmpie->ip=tmpex->val;
|
||||
tmpie->rip=tmpex->val;
|
||||
tmpie->aot=cc->aot;
|
||||
if (tmpex->type & HTF_IMM)
|
||||
tmpie->type++;
|
||||
@@ -185,15 +186,15 @@ U0 AOTGlblsResolve(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
}
|
||||
}
|
||||
|
||||
U0 AsmUnresolvedAdd(CCmpCtrl *cc,U8 *machine_code,I64 type,I64 ip,I64 rel_ip,
|
||||
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->ip=ip;
|
||||
tmpu->rel_ip=rel_ip;
|
||||
tmpu->rip=rip;
|
||||
tmpu->rel_rip=rel_rip;
|
||||
tmpu->aot=cc->aot;
|
||||
tmpu->imm_flag=FALSE;
|
||||
tmpu->line_num=line_num;
|
||||
|
||||
+148
-184
@@ -1,5 +1,5 @@
|
||||
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 ip)
|
||||
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;
|
||||
@@ -12,13 +12,13 @@ U0 ICAddEct(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
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,ip);
|
||||
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,ip+4);
|
||||
ICModr2(tmpi,i,,d2,rip);
|
||||
} else {
|
||||
if (t2&MDF_REG)
|
||||
tmp=r2;
|
||||
@@ -33,13 +33,13 @@ U0 ICAddEct(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
if (swap) {
|
||||
if (r3==tmp && t3&MDG_REG_DISP_SIB)
|
||||
tmp=REG_RCX;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,tmp,0,t2,r2,d2,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,res_reg,0,t3,r3,d3,ip);
|
||||
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,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,tmp,0,t2,r2,d2,ip);
|
||||
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)
|
||||
@@ -50,20 +50,20 @@ U0 ICAddEct(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
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,ip);
|
||||
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 ip)
|
||||
CICType t2,I64 r2,I64 d2,I64 d,I64 op,I64 rip)
|
||||
{
|
||||
I64 i,r;
|
||||
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,ip);
|
||||
ICMov(tmpi,t1,r1,d1,t2,r2,d2,rip);
|
||||
t2=t1;
|
||||
r2=r1;
|
||||
d2=d1;
|
||||
@@ -97,7 +97,7 @@ U0 ICAddSubEctImm(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
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,ip+4);
|
||||
ICModr2(tmpi,i,,d,rip);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -107,7 +107,7 @@ U0 ICAddSubEctImm(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
case MDf_SIB:
|
||||
case MDf_RIP_DISP32:
|
||||
if (t1!=t2 || r1!=r2 || d1!=d2) {
|
||||
ICMov(tmpi,t1,r1,d1,t2,r2,d2,ip);
|
||||
ICMov(tmpi,t1,r1,d1,t2,r2,d2,rip);
|
||||
t2=t1;
|
||||
r2=r1;
|
||||
d2=d1;
|
||||
@@ -115,12 +115,12 @@ U0 ICAddSubEctImm(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
|
||||
if (!d &&(op.u8[0]==0x03||op.u8[0]==0x2B||op.u8[0]==0x33||op.u8[0]==0x0B))
|
||||
return;
|
||||
r=op.u8[1]; //not a reg but a slash val
|
||||
|
||||
if (op.u8[0]==0x03 && d==-1) //add -1
|
||||
r=1; //Decrement slash val
|
||||
op.u8[1]=1; //Decrement slash val
|
||||
|
||||
if (op.u8[0]==0x03 && (d==1 || d==-1)) { //Add
|
||||
i=ICModr1(r,t1,r1,d1);
|
||||
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) {
|
||||
@@ -138,55 +138,16 @@ U0 ICAddSubEctImm(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0xFF);
|
||||
}
|
||||
ICModr2(tmpi,i,d1,ip+4);
|
||||
ICModr2(tmpi,i,,d1,rip);
|
||||
return;
|
||||
}
|
||||
if (MIN_I8<=d<=MAX_I8 || t1&(RTG_MASK-RTF_UNSIGNED)==RT_I8) {
|
||||
i=ICModr1(r,t1,r1,d1);
|
||||
if (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+0x80);
|
||||
break;
|
||||
case RT_I16:
|
||||
case RT_U16:
|
||||
ICOpSizeRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0x83);
|
||||
break;
|
||||
default:
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0x83);
|
||||
}
|
||||
ICModr2(tmpi,i,d1,ip+5);
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_IMM_U8+op.u8[1],rip+1);
|
||||
ICU8(tmpi,d);
|
||||
return;
|
||||
}
|
||||
if (MIN_I32<=d<=MAX_I32 || t1.raw_type<RT_I64) {
|
||||
i=ICModr1(r,t1,r1,d1);
|
||||
if (tmpi->ic_flags&ICF_LOCK)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
switch (t1.raw_type) {
|
||||
case RT_I16:
|
||||
case RT_U16:
|
||||
ICOpSizeRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0x81);
|
||||
break;
|
||||
default:
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0x81);
|
||||
}
|
||||
if (i.u8[0]!=MODR_RIP_REL)
|
||||
ICModr2(tmpi,i,d1,);
|
||||
else {
|
||||
if (t1&(RTG_MASK-RTF_UNSIGNED)==RT_I16)
|
||||
ICU32(tmpi,d1-(ip+tmpi->ic_cnt+6));
|
||||
else
|
||||
ICU32(tmpi,d1-(ip+tmpi->ic_cnt+8));
|
||||
tmpi->ic_flags&=~ICF_CODE_FINAL;
|
||||
}
|
||||
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
|
||||
@@ -195,15 +156,15 @@ U0 ICAddSubEctImm(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
}
|
||||
break;
|
||||
case MDf_STK:
|
||||
ICAddSubEctImm(tmpi,MDF_REG+RT_I64,REG_RAX,0,t2,r2,d2,d,op,ip);
|
||||
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],ip);
|
||||
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 ip)
|
||||
CICType t2,I64 r2,I64 d2,CICType t3,I64 r3,I64 d3,I64 rip)
|
||||
{
|
||||
I64 i=0x48,op=0x2B;
|
||||
Bool swap=FALSE;
|
||||
@@ -215,7 +176,7 @@ U0 ICSub(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
}
|
||||
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,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,rip);
|
||||
if (!swap) {
|
||||
op=0x03;
|
||||
ICU24(tmpi,0xD8F748);
|
||||
@@ -225,24 +186,24 @@ U0 ICSub(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+op);
|
||||
ICModr2(tmpi,i,d2,ip+4);
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
|
||||
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,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
|
||||
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,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);
|
||||
r2=REG_RCX;
|
||||
}
|
||||
if (swap) {
|
||||
@@ -256,33 +217,33 @@ U0 ICSub(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
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,ip);
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,r2,0,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICMul(CIntermediateCode *tmpi,I64 ip)
|
||||
U0 ICMul(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
I64 i,r2,r=REG_RAX,j;
|
||||
CICArg *a1,*a2;
|
||||
CICArg *arg1,*arg2;
|
||||
Bool alt;
|
||||
if (tmpi->a1.type&MDF_IMM) {
|
||||
a1=&tmpi->a2;
|
||||
a2=&tmpi->a1;
|
||||
if (tmpi->arg1.type&MDF_IMM) {
|
||||
arg1=&tmpi->arg2;
|
||||
arg2=&tmpi->arg1;
|
||||
alt=TRUE;
|
||||
} else {
|
||||
a1=&tmpi->a1;
|
||||
a2=&tmpi->a2;
|
||||
arg1=&tmpi->arg1;
|
||||
arg2=&tmpi->arg2;
|
||||
alt=FALSE;
|
||||
}
|
||||
i=a2->disp;
|
||||
i=arg2->disp;
|
||||
if (!(tmpi->ic_class->raw_type&RTF_UNSIGNED) &&
|
||||
a2->type&MDF_IMM && MIN_I32<=i<=MAX_I32) {
|
||||
if (tmpi->r.type==MDF_REG+RT_I64) {
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
a1->type,a1->reg,a1->disp,ip);
|
||||
r=tmpi->r.reg;
|
||||
arg2->type&MDF_IMM && MIN_I32<=i<=MAX_I32) {
|
||||
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,a1->type,a1->reg,a1->disp,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg1->type,arg1->reg,arg1->disp,rip);
|
||||
if (r>7)
|
||||
j=0xC0004D;
|
||||
else
|
||||
@@ -299,16 +260,17 @@ U0 ICMul(CIntermediateCode *tmpi,I64 ip)
|
||||
else
|
||||
i=0xE8F748;
|
||||
if (alt) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
|
||||
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,a2->type,a2->reg,a2->disp,ip);
|
||||
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,a2->type,a2->reg,a2->disp,ip);
|
||||
if (!(a1->type&MDF_REG) || a1->type.raw_type<RT_I64) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
|
||||
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=a1->reg;
|
||||
r2=arg1->reg;
|
||||
}
|
||||
if (r2>7) {
|
||||
i++;
|
||||
@@ -316,21 +278,22 @@ U0 ICMul(CIntermediateCode *tmpi,I64 ip)
|
||||
}
|
||||
ICU24(tmpi,i+r2<<16);
|
||||
}
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,MDF_REG+RT_I64,r,0,ip);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,r,0,rip);
|
||||
}
|
||||
|
||||
U0 ICMulEqu(CIntermediateCode *tmpi,I64 ip)
|
||||
U0 ICMulEqu(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
I64 i=tmpi->a2.disp,r=REG_RAX,j;
|
||||
I64 i=tmpi->arg2.disp,r=REG_RAX,j;
|
||||
if (!(tmpi->ic_class->raw_type&RTF_UNSIGNED) &&
|
||||
tmpi->a2.type&MDF_IMM && MIN_I32<=i<=MAX_I32) {
|
||||
tmpi->arg2.type&MDF_IMM && MIN_I32<=i<=MAX_I32) {
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
if (tmpi->a1.type==MDF_REG+RT_I64)
|
||||
r=tmpi->a1.reg;
|
||||
if (tmpi->arg1.type==MDF_REG+RT_I64)
|
||||
r=tmpi->arg1.reg;
|
||||
else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
if (r>7)
|
||||
j=0xC0004D;
|
||||
else
|
||||
@@ -341,13 +304,13 @@ U0 ICMulEqu(CIntermediateCode *tmpi,I64 ip)
|
||||
ICU24(tmpi,0x6900+j+(r&7)<<16+(r&7)<<19);
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
ICMov(tmpi,tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,MDF_REG+RT_I64,r,0,ip);
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,
|
||||
MDF_DISP+tmpi->a1_type_pointed_to,REG_RCX,0,ip);
|
||||
MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,rip);
|
||||
r=REG_RBX;
|
||||
if (MIN_I8<=i<=MAX_I8)
|
||||
ICU32(tmpi,i<<24+0xDB6B48);
|
||||
@@ -355,8 +318,8 @@ U0 ICMulEqu(CIntermediateCode *tmpi,I64 ip)
|
||||
ICU24(tmpi,0xDB6948);
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
ICMov(tmpi,MDF_DISP+tmpi->a1_type_pointed_to,REG_RCX,0,
|
||||
MDF_REG+RT_I64,REG_RBX,0,ip);
|
||||
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)
|
||||
@@ -365,35 +328,36 @@ U0 ICMulEqu(CIntermediateCode *tmpi,I64 ip)
|
||||
i=0xEBF748;
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,
|
||||
tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICU24(tmpi,i);
|
||||
ICMov(tmpi,tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,
|
||||
MDF_DISP+tmpi->a1_type_pointed_to,REG_RCX,0,ip);
|
||||
MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,rip);
|
||||
ICU24(tmpi,i);
|
||||
ICMov(tmpi,MDF_DISP+tmpi->a1_type_pointed_to,REG_RCX,0,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
}
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,MDF_REG+RT_I64,r,0,ip);
|
||||
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 ip)
|
||||
U0 ICDiv(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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);
|
||||
@@ -401,18 +365,18 @@ U0 ICDiv(CIntermediateCode *tmpi,I64 ip)
|
||||
ICU16(tmpi,0x9948);
|
||||
ICU24(tmpi,0xF9F748);
|
||||
}
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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 ip)
|
||||
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->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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);
|
||||
@@ -421,19 +385,19 @@ U0 ICDivEqu(CIntermediateCode *tmpi,Bool is_mod,I64 ip)
|
||||
ICU24(tmpi,0xF9F748);
|
||||
}
|
||||
if (is_mod)
|
||||
ICMov(tmpi,tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,MDF_REG+RT_I64,REG_RDX,0,ip);
|
||||
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->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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->a1_type_pointed_to,
|
||||
REG_RBX,0,ip);
|
||||
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);
|
||||
@@ -442,28 +406,28 @@ U0 ICDivEqu(CIntermediateCode *tmpi,Bool is_mod,I64 ip)
|
||||
ICU24(tmpi,0xF9F748);
|
||||
}
|
||||
if (is_mod)
|
||||
ICMov(tmpi,MDF_DISP+tmpi->a1_type_pointed_to,REG_RBX,0,
|
||||
MDF_REG+RT_I64,REG_RDX,0,ip);
|
||||
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->a1_type_pointed_to,REG_RBX,0,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RBX,0,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
if (tmpi->r.type.mode) {
|
||||
if (tmpi->res.type.mode) {
|
||||
if (is_mod)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RDX,0,ip);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RDX,0,rip);
|
||||
else
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICMod(CIntermediateCode *tmpi,I64 ip)
|
||||
U0 ICMod(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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);
|
||||
@@ -471,22 +435,22 @@ U0 ICMod(CIntermediateCode *tmpi,I64 ip)
|
||||
ICU16(tmpi,0x9948);
|
||||
ICU24(tmpi,0xF9F748);
|
||||
}
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RDX,0,ip);
|
||||
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 ip)
|
||||
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,ip);
|
||||
type_pointed_to,r2,d2,d3,op,rip);
|
||||
if (t1.mode)
|
||||
ICMov(tmpi,t1,r1,d1,t2&MDG_MASK+type_pointed_to,r2,d2,ip);
|
||||
ICMov(tmpi,t1,r1,d1,t2&MDG_MASK+type_pointed_to,r2,d2,rip);
|
||||
return;
|
||||
} else {
|
||||
done=FALSE;
|
||||
@@ -496,14 +460,14 @@ U0 ICAddSubEctEqu(CIntermediateCode *tmpi,U8 type_pointed_to,
|
||||
tmp=r3;
|
||||
else {
|
||||
tmp=REG_RCX;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,tmp,0,t3,r3,d3,ip);
|
||||
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,ip+4);
|
||||
ICModr2(tmpi,i,,d2,rip);
|
||||
return;
|
||||
}
|
||||
if (t3.raw_type>=RT_I64 && t3&MDG_REG_DISP_SIB_RIP) {
|
||||
@@ -511,27 +475,27 @@ U0 ICAddSubEctEqu(CIntermediateCode *tmpi,U8 type_pointed_to,
|
||||
res_reg=r2;
|
||||
else {
|
||||
res_reg=REG_RCX;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
|
||||
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,ip+4);
|
||||
ICModr2(tmpi,i,,d3,rip);
|
||||
ICMov(tmpi,t2&MDG_MASK+type_pointed_to,r2,d2,
|
||||
MDF_REG+RT_I64,res_reg,0,ip);
|
||||
MDF_REG+RT_I64,res_reg,0,rip);
|
||||
done=TRUE;
|
||||
}
|
||||
}
|
||||
if (!done) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
|
||||
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,ip);
|
||||
t2&MDG_MASK+type_pointed_to,r2,d2,rip);
|
||||
}
|
||||
if (tmpi->ic_flags&ICF_LOCK)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
@@ -541,7 +505,7 @@ U0 ICAddSubEctEqu(CIntermediateCode *tmpi,U8 type_pointed_to,
|
||||
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,ip);
|
||||
MDF_REG+RT_I64,res_reg,0,rip);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -550,25 +514,25 @@ U0 ICAddSubEctEqu(CIntermediateCode *tmpi,U8 type_pointed_to,
|
||||
if (!d3.u32[1]) {
|
||||
if (tmpi->ic_flags&ICF_RES_NOT_USED &&
|
||||
t2&MDF_REG && d3(U64)<=MAX_I8) {
|
||||
ICSlashOp(tmpi,MDF_DISP+type_pointed_to,r2,0,0x838000+op.u8[4],ip);
|
||||
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,ip);
|
||||
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,ip);
|
||||
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,ip);
|
||||
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,ip);
|
||||
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,ip);
|
||||
MDF_DISP+type_pointed_to,REG_RCX,0,rip);
|
||||
res_reg=REG_RAX;
|
||||
if (tmpi->ic_flags&ICF_LOCK)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
@@ -583,32 +547,32 @@ U0 ICAddSubEctEqu(CIntermediateCode *tmpi,U8 type_pointed_to,
|
||||
ICU8(tmpi,d3);
|
||||
}
|
||||
ICMov(tmpi,MDF_DISP+type_pointed_to,REG_RCX,0,
|
||||
MDF_REG+RT_I64,res_reg,0,ip);
|
||||
MDF_REG+RT_I64,res_reg,0,rip);
|
||||
done=TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!done) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
|
||||
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,ip);
|
||||
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,ip);
|
||||
MDF_REG+RT_I64,res_reg,0,rip);
|
||||
}
|
||||
}
|
||||
if (t1.mode)
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,res_reg,0,ip);
|
||||
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 ip)
|
||||
I64 us,I64 is,I64 rip)
|
||||
{
|
||||
I64 i=0x48,res_reg;
|
||||
if (tmpi->ic_class->raw_type&RTF_UNSIGNED ||
|
||||
@@ -621,7 +585,7 @@ U0 ICShift(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
} else
|
||||
res_reg=REG_RAX;
|
||||
if (t3&MDF_IMM) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,res_reg,0,t2,r2,d2,ip);
|
||||
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 {
|
||||
@@ -629,17 +593,17 @@ U0 ICShift(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
ICU8(tmpi,d3);
|
||||
}
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,res_reg,0,t2,r2,d2,ip);
|
||||
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,ip);
|
||||
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 ip)
|
||||
CICType t3,I64 r3,I64 d3,I64 us,I64 is,I64 rip)
|
||||
{
|
||||
I64 res_reg;
|
||||
if (tmpi->ic_class->raw_type&RTF_UNSIGNED ||
|
||||
@@ -647,13 +611,13 @@ U0 ICShiftEqu(CIntermediateCode *tmpi,U8 type_pointed_to,
|
||||
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,ip);
|
||||
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,ip);
|
||||
t2&MDG_MASK+type_pointed_to,r2,d2,rip);
|
||||
}
|
||||
if (res_reg>7)
|
||||
ICU8(tmpi,0x49);
|
||||
@@ -669,12 +633,12 @@ U0 ICShiftEqu(CIntermediateCode *tmpi,U8 type_pointed_to,
|
||||
} 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,ip);
|
||||
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,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,t2,r2,d2,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+type_pointed_to,REG_RDX,0,ip);
|
||||
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) {
|
||||
@@ -687,8 +651,8 @@ U0 ICShiftEqu(CIntermediateCode *tmpi,U8 type_pointed_to,
|
||||
} 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,ip);
|
||||
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,ip);
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,res_reg,0,rip);
|
||||
}
|
||||
+235
-229
@@ -1,64 +1,64 @@
|
||||
U0 ICUnaries(CIntermediateCode *tmpi,I64 op,I64 ip)
|
||||
U0 ICUnaries(CIntermediateCode *tmpi,I64 op,I64 rip)
|
||||
{
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
ICSlashOp(tmpi,MDF_REG+RT_I64,REG_RAX,0,op,ip);
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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 ip)
|
||||
U0 ICNot(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
I64 i;
|
||||
if (tmpi->a1.type.raw_type<=RT_U8 && tmpi->a1.type&MDG_DISP_SIB_RIP) {
|
||||
i=ICModr1(tmpi,tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp);
|
||||
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->a1.disp,ip+5);
|
||||
ICModr2(tmpi,i,,tmpi->arg1.disp,rip+1);
|
||||
ICU8(tmpi,0xFF);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_U64,REG_RAX,0,ip);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_U64,REG_RAX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICAndAnd(CIntermediateCode *tmpi,I64 ip)
|
||||
U0 ICAndAnd(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
I64 r2;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
if (!(tmpi->a1.type&MDF_REG) || tmpi->a1.reg==REG_RAX) {
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r2=REG_RDX;
|
||||
} else
|
||||
r2=tmpi->a1.reg;
|
||||
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->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICOrOr(CIntermediateCode *tmpi,I64 ip)
|
||||
U0 ICOrOr(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
I64 i=0x48,r2;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
if (!(tmpi->a1.type&MDF_REG) || tmpi->a1.reg==REG_RAX) {
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r2=REG_RDX;
|
||||
} else
|
||||
r2=tmpi->a1.reg;
|
||||
r2=tmpi->arg1.reg;
|
||||
|
||||
if (r2>7) {
|
||||
i++;
|
||||
@@ -68,21 +68,21 @@ U0 ICOrOr(CIntermediateCode *tmpi,I64 ip)
|
||||
ICU24(tmpi,0xC80B00+i+r2<<16);
|
||||
ICU16(tmpi,0x0374);
|
||||
ICU24(tmpi,0xC0FF48);
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
|
||||
U0 ICXorXor(CIntermediateCode *tmpi,I64 ip)
|
||||
U0 ICXorXor(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
I64 r2;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
if (!(tmpi->a1.type&MDF_REG)) {
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r2=REG_RDX;
|
||||
} else
|
||||
r2=tmpi->a1.reg;
|
||||
r2=tmpi->arg1.reg;
|
||||
ICZero(tmpi,REG_RBX);
|
||||
ICTest(tmpi,r2);
|
||||
ICU16(tmpi,0x0374);
|
||||
@@ -95,19 +95,19 @@ U0 ICXorXor(CIntermediateCode *tmpi,I64 ip)
|
||||
|
||||
ICU24(tmpi,0xC33348);
|
||||
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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 ip)
|
||||
U0 ICCmp(CIntermediateCode *tmpi,I64 us,I64 is,I64 rip)
|
||||
{
|
||||
I64 r1,d1,r2,i=0x48,j=tmpi->a2.disp;
|
||||
if (tmpi->a2.type&MDF_IMM && MIN_I32<=j<=MAX_I32) {
|
||||
I64 r1,d1,r2,i=0x48,j=tmpi->arg2.disp;
|
||||
if (tmpi->arg2.type&MDF_IMM && MIN_I32<=j<=MAX_I32) {
|
||||
if (!(tmpi->ic_flags&(ICF_POP_CMP|ICF_PUSH_CMP)) &&
|
||||
tmpi->a1.type&MDF_DISP && //TODO
|
||||
tmpi->a1.type.raw_type>=RT_I64 && tmpi->a1.reg!=REG_RAX) {
|
||||
r1=tmpi->a1.reg;
|
||||
d1=tmpi->a1.disp;
|
||||
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++;
|
||||
@@ -133,11 +133,11 @@ U0 ICCmp(CIntermediateCode *tmpi,I64 us,I64 is,I64 ip)
|
||||
ICPopRegs(tmpi,1<<REG_RCX);
|
||||
r1=REG_RCX;
|
||||
} else {
|
||||
if (tmpi->a1.type&MDF_REG && tmpi->a1.reg!=REG_RAX)
|
||||
r1=tmpi->a1.reg;
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r1=REG_RCX;
|
||||
}
|
||||
}
|
||||
@@ -153,31 +153,31 @@ U0 ICCmp(CIntermediateCode *tmpi,I64 us,I64 is,I64 ip)
|
||||
}
|
||||
}
|
||||
if (tmpi->ic_flags & ICF_PUSH_CMP)
|
||||
ICPush(tmpi,MDF_IMM+RT_I64,0,j,ip);
|
||||
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->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
} else {
|
||||
if (tmpi->a2.type&MDF_REG && tmpi->a2.reg!=REG_RAX)
|
||||
r2=tmpi->a2.reg;
|
||||
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->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
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->a1.type&MDF_REG && tmpi->a1.reg!=REG_RAX)
|
||||
r1=tmpi->a1.reg;
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r1=REG_RDX;
|
||||
}
|
||||
}
|
||||
@@ -194,47 +194,47 @@ U0 ICCmp(CIntermediateCode *tmpi,I64 us,I64 is,I64 ip)
|
||||
is=us;
|
||||
ICU16(tmpi,0x300+is);
|
||||
ICU24(tmpi,0xC0FF48);
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICBitOps(CIntermediateCode *tmpi,CICArg *a1,CICArg *a2,
|
||||
CIntermediateCode *tmpi2,I64 op,I64 op_imm,I64 ip)
|
||||
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=a2->type&MDG_MASK+RT_I64; //TODO: check overflow
|
||||
r2=a2->reg;
|
||||
d2=a2->disp;
|
||||
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,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);
|
||||
t2=MDF_REG+RT_I64;
|
||||
r2=REG_RCX;
|
||||
d2=0;
|
||||
}
|
||||
if (a1->type&MDF_REG && (a1->reg!=REG_RAX||res_not_used))
|
||||
r1=a1->reg;
|
||||
else if (!(a1->type&MDF_IMM) || a1->disp>63) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
|
||||
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 (a2->type&MDF_REG && (a2->reg!=REG_RAX||res_not_used))
|
||||
r2=a2->reg;
|
||||
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,a2->type,a2->reg,a2->disp,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,arg2->type,arg2->reg,arg2->disp,rip);
|
||||
r2=REG_RCX;
|
||||
}
|
||||
if (a1->type&MDF_REG && (a1->reg!=REG_RAX||res_not_used))
|
||||
r1=a1->reg;
|
||||
else if (!(a1->type&MDF_IMM) || a1->disp>63) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
|
||||
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;
|
||||
@@ -243,30 +243,30 @@ U0 ICBitOps(CIntermediateCode *tmpi,CICArg *a1,CICArg *a2,
|
||||
ICZero(tmpi,REG_RAX);
|
||||
if (tmpi->ic_flags&ICF_LOCK && op!=0xA30F)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
if (a1->type&MDF_IMM && a1->disp<32)
|
||||
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 (a1->type&MDF_IMM && a1->disp<64) {
|
||||
if (arg1->type&MDF_IMM && arg1->disp<64) {
|
||||
ICU24(tmpi,i.u8[2]<<16+op_imm);
|
||||
ICModr2(tmpi,i,d2,ip+5);
|
||||
ICU8(tmpi,a1->disp);
|
||||
ICModr2(tmpi,i,,d2,rip+1);
|
||||
ICU8(tmpi,arg1->disp);
|
||||
} else {
|
||||
ICU24(tmpi,i.u8[2]<<16+op);
|
||||
ICModr2(tmpi,i,d2,ip+4);
|
||||
ICModr2(tmpi,i,,d2,rip);
|
||||
}
|
||||
if (!res_not_used) {
|
||||
ICU24(tmpi,0xC0920F); //SETC AL
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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 ip)
|
||||
U0 ICToUpper(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
ICU32(tmpi,0x61F88348);
|
||||
ICU16(tmpi,0x0A7C);
|
||||
ICU32(tmpi,0x7AF88348);
|
||||
@@ -274,26 +274,26 @@ U0 ICToUpper(CIntermediateCode *tmpi,I64 ip)
|
||||
ICU32(tmpi,0xE0C08348);
|
||||
}
|
||||
|
||||
U0 ICToI64(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 ip)
|
||||
U0 ICToI64(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
ICFCvt(cc,tmpi,REG_RAX,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,TRUE,CN_MAIN,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,TRUE,CN_INST,rip);
|
||||
}
|
||||
|
||||
U0 ICToF64(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 ip)
|
||||
U0 ICToF64(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
ICFCvt(cc,tmpi,REG_RAX,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,FALSE,CN_MAIN,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,FALSE,CN_INST,rip);
|
||||
}
|
||||
|
||||
U0 ICToBool(CCmpCtrl *,CIntermediateCode *tmpi,I64 ip)
|
||||
U0 ICToBool(CCmpCtrl *,CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
I64 r;
|
||||
if (tmpi->a1.type&MDF_REG)
|
||||
r=tmpi->a1.reg;
|
||||
if (tmpi->arg1.type&MDF_REG)
|
||||
r=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r=REG_RAX;
|
||||
}
|
||||
ICTest(tmpi,r);
|
||||
@@ -301,182 +301,182 @@ U0 ICToBool(CCmpCtrl *,CIntermediateCode *tmpi,I64 ip)
|
||||
ICU32(tmpi,0xC0B60F48); //MOVZX RAX,AL
|
||||
}
|
||||
|
||||
U0 ICPreIncDec(CIntermediateCode *tmpi,I64 op,I64 ip)
|
||||
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->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,
|
||||
tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,tmpc1->size,op.u16[3],ip);
|
||||
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->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,op,ip);
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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->a1.type&MDF_REG)
|
||||
r=tmpi->a1.reg;
|
||||
if (tmpi->arg1.type&MDF_REG)
|
||||
r=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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->a1_type_pointed_to,r,0,
|
||||
MDF_DISP+tmpi->a1_type_pointed_to,r,0,
|
||||
tmpc1->size,op.u16[3],ip);
|
||||
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->a1_type_pointed_to,r,0,op,ip);
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_DISP+tmpi->a1_type_pointed_to,r,0,ip);
|
||||
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 ip)
|
||||
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->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,
|
||||
tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,tmpc1->size,op.u16[3],ip);
|
||||
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->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,op,ip);
|
||||
tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,op,rip);
|
||||
} else {
|
||||
if (tmpi->a1.type&MDF_REG &&
|
||||
!(tmpi->r.type&MDF_REG && tmpi->r.reg==tmpi->a1.reg))
|
||||
r=tmpi->a1.reg;
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r=REG_RCX;
|
||||
}
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_DISP+tmpi->a1_type_pointed_to,r,0,ip);
|
||||
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->a1_type_pointed_to,r,0,
|
||||
MDF_DISP+tmpi->a1_type_pointed_to,r,0,tmpc1->size,op.u16[3],ip);
|
||||
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->a1_type_pointed_to,r,0,op,ip);
|
||||
ICSlashOp(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,r,0,op,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICDerefPostIncDec(CIntermediateCode *tmpi,I64 op,I64 ip)
|
||||
U0 ICDerefPostIncDec(CIntermediateCode *tmpi,I64 op,I64 rip)
|
||||
{
|
||||
CICType t;
|
||||
I64 r;
|
||||
CHashClass *tmpc1=tmpi->ic_class;
|
||||
t=tmpi->r.type.raw_type;
|
||||
if (t>tmpi->a1_type_pointed_to)
|
||||
t=tmpi->a1_type_pointed_to;
|
||||
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->a1.type&MDF_REG)
|
||||
r=tmpi->a1.reg;
|
||||
if (tmpi->arg1.type&MDF_REG)
|
||||
r=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->a1.type&MDG_MASK+RT_I64,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type&MDG_MASK+RT_I64,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r=REG_RDX;
|
||||
}
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_DISP+t,r,0,ip);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_DISP+t,r,0,rip);
|
||||
if (tmpc1->size!=1)
|
||||
ICAddSubEctImm(tmpi,
|
||||
tmpi->a1.type&MDG_MASK+RT_I64,tmpi->a1.reg,tmpi->a1.disp,
|
||||
tmpi->a1.type&MDG_MASK+RT_I64,tmpi->a1.reg,tmpi->a1.disp,
|
||||
tmpc1->size,op.u16[3],ip);
|
||||
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->a1.type&MDG_MASK+RT_I64,tmpi->a1.reg,tmpi->a1.disp,op,ip);
|
||||
ICSlashOp(tmpi,tmpi->arg1.type&MDG_MASK+RT_I64,
|
||||
tmpi->arg1.reg,tmpi->arg1.disp,op,rip);
|
||||
} else {
|
||||
if (tmpi->a1.type&MDF_REG)
|
||||
r=tmpi->a1.reg;
|
||||
if (tmpi->arg1.type&MDF_REG)
|
||||
r=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->a1.type&MDG_MASK+RT_I64,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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,ip);
|
||||
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],ip);
|
||||
tmpc1->size,op.u16[3],rip);
|
||||
else
|
||||
ICSlashOp(tmpi,MDF_DISP+RT_I64,r,0,op,ip);
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_DISP+t,REG_RDX,0,ip);
|
||||
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 ip)
|
||||
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->a1.type&MDF_REG)
|
||||
r=tmpi->a1.reg;
|
||||
if (tmpi->arg1.type&MDF_REG)
|
||||
r=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->a1.type&MDG_MASK+RT_I64,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type&MDG_MASK+RT_I64,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
r=REG_RDX;
|
||||
}
|
||||
ICMov(tmpi,MDF_DISP+tmpi->a1_type_pointed_to,r,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
if (tmpc1->size!=1 || tmpi->a1.type&MDF_STK)
|
||||
ICAddSubEctImm(tmpi,tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,
|
||||
MDF_REG+RT_I64,r,0,tmpc1->size,op.u16[3],ip);
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,op,ip);
|
||||
ICSlashOp(tmpi,tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,op,rip);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_I64,REG_RDX,0,ip);
|
||||
ICMov(tmpi,MDF_DISP+tmpi->a1_type_pointed_to,REG_RCX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
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],ip);
|
||||
MDF_REG+RT_I64,REG_RCX,0,tmpc1->size,op.u16[3],rip);
|
||||
else
|
||||
ICSlashOp(tmpi,MDF_DISP+RT_I64,REG_RDX,0,op,ip);
|
||||
ICSlashOp(tmpi,MDF_DISP+RT_I64,REG_RDX,0,op,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICCmpAndBranch(CIntermediateCode *tmpi,Bool has_res,I64 ip,
|
||||
I64 us,I64 is,I64 not_us,I64 not_is,U8 *buf,I64 ip2)
|
||||
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 *a1=&tmpi->a1,*a2=&tmpi->a2;
|
||||
CICArg *arg1=&tmpi->arg1,*arg2=&tmpi->arg2;
|
||||
|
||||
j=a1->disp;
|
||||
if (a1->type&MDF_IMM && MIN_I32<=j<=MAX_I32) {
|
||||
SwapI64(&a1,&a2);
|
||||
j=arg1->disp;
|
||||
if (arg1->type&MDF_IMM && MIN_I32<=j<=MAX_I32) {
|
||||
SwapI64(&arg1,&arg2);
|
||||
swap=TRUE;
|
||||
us=not_us;
|
||||
is=not_is;
|
||||
@@ -486,16 +486,17 @@ U0 ICCmpAndBranch(CIntermediateCode *tmpi,Bool has_res,I64 ip,
|
||||
tmpi->ic_flags & ICF_USE_UNSIGNED)
|
||||
is=us;
|
||||
|
||||
j=a2->disp;
|
||||
if (a2->type&MDF_IMM && MIN_I32<=j<=MAX_I32) {
|
||||
if (!has_res && a1->type&MDG_REG_DISP_SIB_RIP)
|
||||
ICAddSubEctImm(tmpi,a1->type,a1->reg,a1->disp,
|
||||
a1->type,a1->reg,a1->disp,j,0x073B,ip2);
|
||||
j=arg2->disp;
|
||||
if (arg2->type&MDF_IMM && MIN_I32<=j<=MAX_I32) {
|
||||
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 (a1->type&MDF_REG)
|
||||
r1=a1->reg;
|
||||
if (arg1->type&MDF_REG)
|
||||
r1=arg1->reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,arg1->type,
|
||||
arg1->reg,arg1->disp,rip2);
|
||||
r1=REG_RDX;
|
||||
}
|
||||
if (!j) {
|
||||
@@ -527,56 +528,61 @@ U0 ICCmpAndBranch(CIntermediateCode *tmpi,Bool has_res,I64 ip,
|
||||
}
|
||||
if (has_res) {
|
||||
if (!swap) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,MDF_IMM+RT_I64,0,j,ip2);
|
||||
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=a1->type;
|
||||
r1=a1->reg;
|
||||
r2=a2->reg;
|
||||
t2=a2->type;
|
||||
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,a1->type,a1->reg,a1->disp,ip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg1->type,
|
||||
arg1->reg,arg1->disp,rip2);
|
||||
r1=REG_RAX;
|
||||
}
|
||||
i=ICModr1(r1,t2,r2,a2->disp);
|
||||
i=ICModr1(r1,t2,r2,arg2->disp);
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0x3B);
|
||||
ICModr2(tmpi,i,a2->disp,ip2+4);
|
||||
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,a2->type,a2->reg,a2->disp,ip2);
|
||||
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,a2->type,a2->reg,a2->disp,ip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type,
|
||||
arg2->reg,arg2->disp,rip2);
|
||||
r2=REG_RAX;
|
||||
}
|
||||
}
|
||||
i=ICModr1(r2,t1,r1,a1->disp);
|
||||
i=ICModr1(r2,t1,r1,arg1->disp);
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0x39);
|
||||
ICModr2(tmpi,i,a1->disp,ip2+4);
|
||||
ICModr2(tmpi,i,,arg1->disp,rip2);
|
||||
if (has_res)
|
||||
res_reg=r2;
|
||||
done=TRUE;
|
||||
}
|
||||
if (!done) {
|
||||
if (a2->type&MDF_REG)
|
||||
r2=a2->reg;
|
||||
if (arg2->type&MDF_REG)
|
||||
r2=arg2->reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type,
|
||||
arg2->reg,arg2->disp,rip2);
|
||||
r2=REG_RAX;
|
||||
}
|
||||
if (a1->type&MDF_REG)
|
||||
r1=a1->reg;
|
||||
if (arg1->type&MDF_REG)
|
||||
r1=arg1->reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,arg1->type,
|
||||
arg1->reg,arg1->disp,rip2);
|
||||
r1=REG_RCX;
|
||||
}
|
||||
if (r2>7)
|
||||
@@ -589,11 +595,11 @@ U0 ICCmpAndBranch(CIntermediateCode *tmpi,Bool has_res,I64 ip,
|
||||
}
|
||||
}
|
||||
|
||||
ip+=tmpi->ic_cnt;
|
||||
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-(ip+2);
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP) {
|
||||
if(tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
i+=4;
|
||||
@@ -606,7 +612,7 @@ U0 ICCmpAndBranch(CIntermediateCode *tmpi,Bool has_res,I64 ip,
|
||||
|
||||
if (short_jmp) {
|
||||
tmpi->ic_flags|=ICF_SHORT_JMP;
|
||||
i=lb->addr-(ip+2);
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP) {
|
||||
if(tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
i+=4;
|
||||
@@ -616,7 +622,7 @@ U0 ICCmpAndBranch(CIntermediateCode *tmpi,Bool has_res,I64 ip,
|
||||
ICU16(tmpi,i<<8+is.u8[2]);
|
||||
} else {
|
||||
tmpi->ic_flags&=~ICF_SHORT_JMP;
|
||||
i=lb->addr-(ip+6);
|
||||
i=lb->addr-(rip+6);
|
||||
if (lb->flags&CMF_POP_CMP) {
|
||||
if(tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
i+=4;
|
||||
@@ -627,36 +633,36 @@ U0 ICCmpAndBranch(CIntermediateCode *tmpi,Bool has_res,I64 ip,
|
||||
ICU32(tmpi,i);
|
||||
}
|
||||
if (has_res)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,res_reg,0,ip2);
|
||||
ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,
|
||||
MDF_REG+RT_I64,res_reg,0,rip2);
|
||||
}
|
||||
|
||||
U0 ICTestAndBranch(CIntermediateCode *tmpi,I64 ip,I64 is,U8 *buf,I64 ip2)
|
||||
U0 ICTestAndBranch(CIntermediateCode *tmpi,I64 rip,I64 is,U8 *buf,I64 rip2)
|
||||
{
|
||||
I64 i;
|
||||
Bool short_jmp;
|
||||
CCodeMisc *lb;
|
||||
|
||||
if (!(tmpi->a1.type&MDF_REG)) {
|
||||
if (tmpi->a1.type.raw_type<=RT_U8 && tmpi->a1.type&MDG_DISP_SIB_RIP) {
|
||||
i=ICModr1(tmpi,tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp);
|
||||
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->a1.disp,ip2+5);
|
||||
ICModr2(tmpi,i,,tmpi->arg1.disp,rip2+1);
|
||||
ICU8(tmpi,0xFF);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip2);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
ICTest(tmpi,REG_RAX);
|
||||
}
|
||||
} else
|
||||
ICTest(tmpi,tmpi->a1.reg);
|
||||
ICTest(tmpi,tmpi->arg1.reg);
|
||||
|
||||
ip+=tmpi->ic_cnt;
|
||||
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-(ip+2);
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
if (MIN_I8<=i<=MAX_I8)
|
||||
@@ -665,13 +671,13 @@ U0 ICTestAndBranch(CIntermediateCode *tmpi,I64 ip,I64 is,U8 *buf,I64 ip2)
|
||||
|
||||
if (short_jmp) {
|
||||
tmpi->ic_flags|=ICF_SHORT_JMP;
|
||||
i=lb->addr-(ip+2);
|
||||
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-(ip+6);
|
||||
i=lb->addr-(rip+6);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
ICU16(tmpi,is.u16[0]);
|
||||
@@ -679,17 +685,17 @@ U0 ICTestAndBranch(CIntermediateCode *tmpi,I64 ip,I64 is,U8 *buf,I64 ip2)
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICFlagBranch(CIntermediateCode *tmpi,I64 ip,I64 is,U8 *buf)
|
||||
U0 ICFlagBranch(CIntermediateCode *tmpi,I64 rip,I64 is,U8 *buf)
|
||||
{
|
||||
I64 i;
|
||||
Bool short_jmp;
|
||||
CCodeMisc *lb;
|
||||
|
||||
ip+=tmpi->ic_cnt;
|
||||
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-(ip+2);
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
if (MIN_I8<=i<=MAX_I8)
|
||||
@@ -698,13 +704,13 @@ U0 ICFlagBranch(CIntermediateCode *tmpi,I64 ip,I64 is,U8 *buf)
|
||||
|
||||
if (short_jmp) {
|
||||
tmpi->ic_flags|=ICF_SHORT_JMP;
|
||||
i=lb->addr-(ip+2);
|
||||
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-(ip+6);
|
||||
i=lb->addr-(rip+6);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
ICU16(tmpi,is.u16[0]);
|
||||
|
||||
+272
-269
@@ -1,34 +1,34 @@
|
||||
U0 ICAndBranch(CIntermediateCode *tmpi,I64 ip,I64 is,U8 *buf,I64 ip2)
|
||||
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 *a1,*a2;
|
||||
CICArg *arg1,*arg2;
|
||||
|
||||
if (tmpi->a1.type&MDF_IMM) {
|
||||
if (tmpi->arg1.type&MDF_IMM) {
|
||||
swap=TRUE;
|
||||
a1=&tmpi->a2;
|
||||
a2=&tmpi->a1;
|
||||
arg1=&tmpi->arg2;
|
||||
arg2=&tmpi->arg1;
|
||||
} else {
|
||||
swap=FALSE;
|
||||
a1=&tmpi->a1;
|
||||
a2=&tmpi->a2;
|
||||
arg1=&tmpi->arg1;
|
||||
arg2=&tmpi->arg2;
|
||||
}
|
||||
|
||||
if (a2->type&MDF_IMM && a2->disp>MAX_U32)
|
||||
if (arg2->type&MDF_IMM && arg2->disp>MAX_U32)
|
||||
override=TRUE;
|
||||
else
|
||||
override=FALSE;
|
||||
|
||||
if (a1->type.raw_type<a2->type.raw_type)
|
||||
it=a1->type.raw_type;
|
||||
if (arg1->type.raw_type<arg2->type.raw_type)
|
||||
it=arg1->type.raw_type;
|
||||
else
|
||||
it=a2->type.raw_type;
|
||||
it=arg2->type.raw_type;
|
||||
|
||||
i=a2->disp;
|
||||
if (a2->type&MDF_IMM && i<=MAX_U32) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip2);
|
||||
i=arg2->disp;
|
||||
if (arg2->type&MDF_IMM && i<=MAX_U32) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg1->type,arg1->reg,arg1->disp,rip2);
|
||||
if (i<=MAX_U8)
|
||||
ICU16(tmpi,i<<8+0xA8);
|
||||
else if (i<=MAX_U16)
|
||||
@@ -41,73 +41,73 @@ U0 ICAndBranch(CIntermediateCode *tmpi,I64 ip,I64 is,U8 *buf,I64 ip2)
|
||||
t1=MDF_REG+it;
|
||||
d1=0;
|
||||
if (swap && !override) {
|
||||
if (a1->type&MDF_REG) {
|
||||
r1=a1->reg;
|
||||
if (arg1->type&MDF_REG) {
|
||||
r1=arg1->reg;
|
||||
swap=TRUE;
|
||||
} else {
|
||||
r1=REG_RCX;
|
||||
swap=FALSE;
|
||||
}
|
||||
if (a2->type&MDF_REG) {
|
||||
r2=a2->reg;
|
||||
if (arg2->type&MDF_REG) {
|
||||
r2=arg2->reg;
|
||||
swap=FALSE;
|
||||
} else
|
||||
r2=REG_RDX;
|
||||
if (swap) {
|
||||
if (!(a1->type&MDF_REG) || r1!=a1->reg)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
|
||||
if (a2->type&MDG_REG_DISP_SIB_RIP) {
|
||||
t1=a2->type&MDG_MASK+it;
|
||||
r2=a2->reg;
|
||||
d1=a2->disp;
|
||||
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,a2->type,a2->reg,a2->disp,ip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r2,0,arg2->type,arg2->reg,arg2->disp,rip2);
|
||||
i=ICModr1(r1,t1,r2,d1);
|
||||
} else {
|
||||
if (a1->type&MDG_REG_DISP_SIB_RIP) {
|
||||
t1=a1->type&MDG_MASK+it;
|
||||
r1=a1->reg;
|
||||
d1=a1->disp;
|
||||
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,a1->type,a1->reg,a1->disp,ip2);
|
||||
if (!(a2->type&MDF_REG) || r2!=a2->reg)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
|
||||
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 (a2->type&MDF_REG) {
|
||||
r2=a2->reg;
|
||||
if (arg2->type&MDF_REG) {
|
||||
r2=arg2->reg;
|
||||
swap=FALSE;
|
||||
} else {
|
||||
r2=REG_RDX;
|
||||
swap=TRUE;
|
||||
}
|
||||
if (a1->type&MDF_REG) {
|
||||
r1=a1->reg;
|
||||
if (arg1->type&MDF_REG) {
|
||||
r1=arg1->reg;
|
||||
swap=TRUE;
|
||||
} else
|
||||
r1=REG_RCX;
|
||||
if (override)
|
||||
swap=FALSE;
|
||||
if (swap) {
|
||||
if (a2->type&MDG_REG_DISP_SIB_RIP) {
|
||||
t1=a2->type&MDG_MASK+it;
|
||||
r2=a2->reg;
|
||||
d1=a2->disp;
|
||||
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,a2->type,a2->reg,a2->disp,ip2);
|
||||
if (!(a1->type&MDF_REG) || r1!=a1->reg)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
|
||||
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 (!(a2->type&MDF_REG) || r2!=a2->reg)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
|
||||
if (a1->type&MDG_REG_DISP_SIB_RIP) {
|
||||
t1=a1->type&MDG_MASK+it;
|
||||
r1=a1->reg;
|
||||
d1=a1->disp;
|
||||
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,a1->type,a1->reg,a1->disp,ip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r1,0,arg1->type,arg1->reg,arg1->disp,rip2);
|
||||
i=ICModr1(r2,t1,r1,d1);
|
||||
}
|
||||
}
|
||||
@@ -126,14 +126,14 @@ U0 ICAndBranch(CIntermediateCode *tmpi,I64 ip,I64 is,U8 *buf,I64 ip2)
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0x85);
|
||||
}
|
||||
ICModr2(tmpi,i,d1,ip2+4);
|
||||
ICModr2(tmpi,i,,d1,rip2);
|
||||
}
|
||||
|
||||
ip+=tmpi->ic_cnt;
|
||||
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-(ip+2);
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
if (MIN_I8<=i<=MAX_I8)
|
||||
@@ -142,13 +142,13 @@ U0 ICAndBranch(CIntermediateCode *tmpi,I64 ip,I64 is,U8 *buf,I64 ip2)
|
||||
|
||||
if (short_jmp) {
|
||||
tmpi->ic_flags|=ICF_SHORT_JMP;
|
||||
i=lb->addr-(ip+2);
|
||||
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-(ip+6);
|
||||
i=lb->addr-(rip+6);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
ICU16(tmpi,is.u16[0]);
|
||||
@@ -156,111 +156,114 @@ U0 ICAndBranch(CIntermediateCode *tmpi,I64 ip,I64 is,U8 *buf,I64 ip2)
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICAssign(CIntermediateCode *tmpi,I64 ip)
|
||||
U0 ICAssign(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
CIntermediateCode *tmpi1;
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
ICMov(tmpi,tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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->a1.type&MDF_REG) {
|
||||
if (tmpi->arg1.type&MDF_REG) {
|
||||
if (!(tmpi1=OptLag1(tmpi)) || tmpi1->ic_code!=IC_ADD_CONST ||
|
||||
tmpi1->r.type!=MDF_REG+RT_I64 || tmpi1->r.reg!=tmpi->a1.reg ||
|
||||
tmpi1->a1.type!=MDF_REG+RT_I64 || tmpi1->a1.reg!=tmpi->a1.reg ||
|
||||
(tmpi->a2.type&MDF_REG || tmpi->a2.type&MDF_DISP) &&
|
||||
tmpi->a2.reg==tmpi->a1.reg ||
|
||||
tmpi->r.type.mode || tmpi1->ic_flags&~ICG_NO_CVT_MASK) {
|
||||
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->a1_type_pointed_to,tmpi->a1.reg,tmpi->a1.disp,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
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->a1.disp=tmpi1->ic_data;
|
||||
tmpi->arg1.disp=tmpi1->ic_data;
|
||||
OptSetNOP1(tmpi1); //This better not be last pass!
|
||||
ICMov(tmpi,MDF_DISP+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
ICMov(tmpi,MDF_DISP+tmpi->a1_type_pointed_to,REG_RCX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
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 ip,
|
||||
I64 op,I64 op_imm,I64 is,U8 *buf,I64 ip2)
|
||||
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 *a1=&tmpi->a1,*a2=&tmpi->a2;
|
||||
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 && !(a2->type&MDF_REG) &&
|
||||
(!(a2->type&MDF_IMM) ||a2->disp>63)||
|
||||
!(tmpi->ic_flags&ICF_SWAP) && a2->type&MDF_IMM &&
|
||||
a2->disp<64 || a2->type&MDF_STK) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
|
||||
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=a2->type;
|
||||
if (t2&MDF_IMM && a2->disp<64)
|
||||
t2=arg2->type;
|
||||
if (t2&MDF_IMM && arg2->disp<64)
|
||||
r2=0;
|
||||
else
|
||||
r2=a2->reg;
|
||||
d2=a2->disp;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
}
|
||||
if (!(tmpi->ic_flags&ICF_SWAP) && !(a1->type&MDF_REG) &&
|
||||
(!(a1->type&MDF_IMM) || a1->disp>63) ||
|
||||
tmpi->ic_flags&ICF_SWAP && a1->type&MDF_IMM &&
|
||||
a1->disp<64 || a1->type&MDF_STK) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
|
||||
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=a1->type;
|
||||
if (t1&MDF_IMM && a1->disp<64)
|
||||
t1=arg1->type;
|
||||
if (t1&MDF_IMM && arg1->disp<64)
|
||||
r1=0;
|
||||
else
|
||||
r1=a1->reg;
|
||||
d1=a1->disp;
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
}
|
||||
} else {
|
||||
t1=MDF_DISP+RT_I64;
|
||||
t2=MDF_DISP+RT_I64;
|
||||
d1=0;
|
||||
d2=0;
|
||||
if (a2->type&MDF_REG)
|
||||
r2=a2->reg;
|
||||
else if (!(tmpi->ic_flags&ICF_SWAP) || !(a2->type&MDF_IMM) ||
|
||||
a2->disp>63) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
|
||||
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 (a1->type&MDF_REG)
|
||||
r1=a1->reg;
|
||||
else if (tmpi->ic_flags&ICF_SWAP || !(a1->type&MDF_IMM) || a1->disp>63) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
|
||||
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;
|
||||
@@ -268,8 +271,8 @@ U0 ICBrBitOps(CIntermediateCode *tmpi,I64 ip,
|
||||
if (tmpi->ic_flags&ICF_LOCK && op!=0xA30F)
|
||||
ICU8(tmpi,OC_LOCK_PREFIX);
|
||||
if (tmpi->ic_flags&ICF_SWAP) {
|
||||
if (a2->type&MDF_IMM && a2->disp<32) {
|
||||
if (op==0xA30F && a2->disp<8) {
|
||||
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
|
||||
@@ -277,10 +280,10 @@ U0 ICBrBitOps(CIntermediateCode *tmpi,I64 ip,
|
||||
} else
|
||||
t=t1;
|
||||
i=ICModr1(r2,t,r1,d1);
|
||||
SwapI64(&a1,&a2);
|
||||
SwapI64(&arg1,&arg2);
|
||||
} else {
|
||||
if (a1->type&MDF_IMM && a1->disp<32) {
|
||||
if (op==0xA30F && a1->disp<8) {
|
||||
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
|
||||
@@ -292,26 +295,26 @@ U0 ICBrBitOps(CIntermediateCode *tmpi,I64 ip,
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
if (op_imm==0xF6) {//TEST
|
||||
ICU16(tmpi,i.u8[2]<<8+op_imm);
|
||||
ICModr2(tmpi,i,a2->disp,ip2+5);
|
||||
ICU8(tmpi,1<<a1->disp);
|
||||
ICModr2(tmpi,i,,arg2->disp,rip2+1);
|
||||
ICU8(tmpi,1<<arg1->disp);
|
||||
if (is==0x72820F)
|
||||
is=0x75850F;
|
||||
else
|
||||
is=0x74840F;
|
||||
} else if (a1->type&MDF_IMM && a1->disp<64) {
|
||||
} else if (arg1->type&MDF_IMM && arg1->disp<64) {
|
||||
ICU24(tmpi,i.u8[2]<<16+op_imm);
|
||||
ICModr2(tmpi,i,a2->disp,ip2+5);
|
||||
ICU8(tmpi,a1->disp);
|
||||
ICModr2(tmpi,i,,arg2->disp,rip2+1);
|
||||
ICU8(tmpi,arg1->disp);
|
||||
} else {
|
||||
ICU24(tmpi,i.u8[2]<<16+op);
|
||||
ICModr2(tmpi,i,a2->disp,ip2+4);
|
||||
ICModr2(tmpi,i,,arg2->disp,rip2);
|
||||
}
|
||||
|
||||
ip+=tmpi->ic_cnt;
|
||||
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-(ip+2);
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
if (MIN_I8<=i<=MAX_I8)
|
||||
@@ -320,13 +323,13 @@ U0 ICBrBitOps(CIntermediateCode *tmpi,I64 ip,
|
||||
|
||||
if (short_jmp) {
|
||||
tmpi->ic_flags|=ICF_SHORT_JMP;
|
||||
i=lb->addr-(ip+2);
|
||||
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-(ip+6);
|
||||
i=lb->addr-(rip+6);
|
||||
if (lb->flags&CMF_POP_CMP)
|
||||
i+=8;
|
||||
ICU16(tmpi,is.u16[0]);
|
||||
@@ -334,107 +337,107 @@ U0 ICBrBitOps(CIntermediateCode *tmpi,I64 ip,
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICQueInit(CIntermediateCode *tmpi,I64 ip2)
|
||||
U0 ICQueInit(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 r1;
|
||||
if (tmpi->a1.type==MDF_REG+RT_I64)
|
||||
r1=tmpi->a1.reg;
|
||||
if (tmpi->arg1.type==MDF_REG+RT_I64)
|
||||
r1=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip2);
|
||||
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,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r1,sizeof(U8 *),MDF_REG+RT_I64,r1,0,ip2);
|
||||
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 ip2)
|
||||
U0 ICQueIns(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 r1,r2;
|
||||
if (tmpi->a2.type==MDF_REG+RT_I64 && tmpi->a2.reg!=REG_RDX)
|
||||
r2=tmpi->a2.reg;
|
||||
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->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip2);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);
|
||||
r2=REG_RAX;
|
||||
}
|
||||
if (tmpi->a1.type==MDF_REG+RT_I64)
|
||||
r1=tmpi->a1.reg;
|
||||
if (tmpi->arg1.type==MDF_REG+RT_I64)
|
||||
r1=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip2);
|
||||
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,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r1,0,MDF_REG+RT_I64,r2,0,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r2,0,MDF_REG+RT_I64,REG_RBX,0,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r2,sizeof(U8 *),MDF_REG+RT_I64,r1,0,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,REG_RBX,sizeof(U8 *),MDF_REG+RT_I64,r2,0,ip2);
|
||||
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 ip2)
|
||||
U0 ICQueInsRev(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 r1,r2;
|
||||
if (tmpi->a2.type==MDF_REG+RT_I64 && tmpi->a2.reg!=REG_RDX)
|
||||
r2=tmpi->a2.reg;
|
||||
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->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip2);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);
|
||||
r2=REG_RAX;
|
||||
}
|
||||
if (tmpi->a1.type==MDF_REG+RT_I64)
|
||||
r1=tmpi->a1.reg;
|
||||
if (tmpi->arg1.type==MDF_REG+RT_I64)
|
||||
r1=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip2);
|
||||
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 *),ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,REG_RBX,0,MDF_REG+RT_I64,r2,0,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r2,0,MDF_REG+RT_I64,r1,0,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r2,sizeof(U8 *),MDF_REG+RT_I64,REG_RBX,0,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,r1,sizeof(U8 *),MDF_REG+RT_I64,r2,0,ip2);
|
||||
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 ip2)
|
||||
U0 ICQueRem(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 r1;
|
||||
if (tmpi->a1.type==MDF_REG+RT_I64)
|
||||
r1=tmpi->a1.reg;
|
||||
if (tmpi->arg1.type==MDF_REG+RT_I64)
|
||||
r1=tmpi->arg1.reg;
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip2);
|
||||
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,ip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_I64,r1,sizeof(U8 *),ip2);
|
||||
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 ip2)
|
||||
U0 ICMinMax(CIntermediateCode *tmpi,I64 op,I64 rip2)
|
||||
{
|
||||
I64 r1,i1=0x48;
|
||||
if (tmpi->a2.type==MDF_REG+RT_I64 && tmpi->a2.reg!=REG_RAX) {
|
||||
r1=tmpi->a2.reg;
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip2);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
} else {
|
||||
if (tmpi->a1.reg==REG_RAX && tmpi->a1.type&MDG_REG_DISP_SIB) {
|
||||
if (tmpi->arg1.reg==REG_RAX && tmpi->arg1.type&MDG_REG_DISP_SIB) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip2);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);
|
||||
r1=REG_RDX;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip2);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip2);
|
||||
if (tmpi->a1.type==MDF_REG+RT_I64) {
|
||||
r1=tmpi->a1.reg;
|
||||
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;
|
||||
@@ -442,7 +445,7 @@ U0 ICMinMax(CIntermediateCode *tmpi,I64 op,I64 ip2)
|
||||
} else {
|
||||
r1=REG_RDX;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip2);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -450,49 +453,49 @@ U0 ICMinMax(CIntermediateCode *tmpi,I64 op,I64 ip2)
|
||||
ICU32(tmpi,0xC0000F00+op<<16+r1<<24+i1);
|
||||
}
|
||||
|
||||
U0 ICSqr(CIntermediateCode *tmpi,I64 op,I64 ip2)
|
||||
U0 ICSqr(CIntermediateCode *tmpi,I64 op,I64 rip2)
|
||||
{
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip2);
|
||||
ICSlashOp(tmpi,MDF_REG+RT_I64,REG_RAX,0,op,ip2);
|
||||
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 ip2)
|
||||
U0 ICModU64(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
CICType t1;
|
||||
I64 r1,d1;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip2);
|
||||
if (tmpi->a1.reg!=REG_RAX && tmpi->a1.reg!=REG_RDX &&
|
||||
tmpi->a1.type&MDG_REG_DISP_SIB &&
|
||||
tmpi->a1.type.raw_type>=RT_I64) {
|
||||
t1=tmpi->a1.type;
|
||||
r1=tmpi->a1.reg;
|
||||
d1=tmpi->a1.disp;
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip2);
|
||||
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,ip2);
|
||||
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,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,REG_RCX,0,MDF_REG+RT_I64,REG_RAX,0,ip2);
|
||||
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,ip2);
|
||||
MDF_REG+RT_I64,REG_RDX,0,rip2);
|
||||
}
|
||||
|
||||
U0 ICSwap(CIntermediateCode *tmpi,I64 ip2)
|
||||
U0 ICSwap(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 r1,r2;
|
||||
if (tmpi->a1.type&MDF_REG)
|
||||
r1=tmpi->a1.reg;
|
||||
if (tmpi->arg1.type&MDF_REG)
|
||||
r1=tmpi->arg1.reg;
|
||||
else
|
||||
r1=REG_RAX;
|
||||
if (tmpi->a2.type&MDF_REG)
|
||||
r2=tmpi->a2.reg;
|
||||
if (tmpi->arg2.type&MDF_REG)
|
||||
r2=tmpi->arg2.reg;
|
||||
else
|
||||
r2=REG_RAX;
|
||||
if (r1==r2) {
|
||||
@@ -502,119 +505,119 @@ U0 ICSwap(CIntermediateCode *tmpi,I64 ip2)
|
||||
r2=REG_RAX;
|
||||
}
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r2,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip2);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r1,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip2);
|
||||
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,ip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U8,r2,0,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U8,r2,0,MDF_REG+RT_I64,REG_RCX,0,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U8,r1,0,MDF_REG+RT_I64,REG_RDX,0,ip2);
|
||||
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,ip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U16,r2,0,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U16,r2,0,MDF_REG+RT_I64,REG_RCX,0,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U16,r1,0,MDF_REG+RT_I64,REG_RDX,0,ip2);
|
||||
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,ip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U32,r2,0,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U32,r2,0,MDF_REG+RT_I64,REG_RCX,0,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U32,r1,0,MDF_REG+RT_I64,REG_RDX,0,ip2);
|
||||
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,ip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U64,r2,0,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U64,r2,0,MDF_REG+RT_I64,REG_RCX,0,ip2);
|
||||
ICMov(tmpi,MDF_DISP+RT_U64,r1,0,MDF_REG+RT_I64,REG_RDX,0,ip2);
|
||||
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 ip2)
|
||||
U0 ICAndEqu(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 i,bit;
|
||||
if (tmpi->a2.type&MDF_IMM && !(tmpi->a1.type&MDF_STK) &&
|
||||
if (tmpi->arg2.type&MDF_IMM && !(tmpi->arg1.type&MDF_STK) &&
|
||||
tmpi->ic_flags&ICF_RES_NOT_USED) {
|
||||
i=~tmpi->a2.disp;
|
||||
i=~tmpi->arg2.disp;
|
||||
bit=Bsf(i);
|
||||
if (0<=bit==Bsr(i)) {
|
||||
tmpi->a2.disp=bit;
|
||||
tmpi->a2.reg=0;
|
||||
tmpi->a1.type=tmpi->a1.type&MDG_MASK+RT_I64;
|
||||
ICBitOps(tmpi,&tmpi->a2,&tmpi->a1,tmpi,0xB30F,0x30BA0F,ip2);
|
||||
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->a1_type_pointed_to,
|
||||
tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,0x210425240423,ip2);
|
||||
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 ip2)
|
||||
U0 ICOrEqu(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 i,bit;
|
||||
if (tmpi->a2.type&MDF_IMM && !(tmpi->a1.type&MDF_STK) &&
|
||||
if (tmpi->arg2.type&MDF_IMM && !(tmpi->arg1.type&MDF_STK) &&
|
||||
tmpi->ic_flags&ICF_RES_NOT_USED) {
|
||||
i=tmpi->a2.disp;
|
||||
i=tmpi->arg2.disp;
|
||||
bit=Bsf(i);
|
||||
if (0<=bit==Bsr(i) && i>MAX_I8) {
|
||||
tmpi->a2.disp=bit;
|
||||
tmpi->a2.reg=0;
|
||||
tmpi->a1.type=tmpi->a1.type&MDG_MASK+RT_I64;
|
||||
ICBitOps(tmpi,&tmpi->a2,&tmpi->a1,tmpi,0xAB0F,0x28BA0F,ip2);
|
||||
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->a1_type_pointed_to,
|
||||
tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,0x09010D0C010B,ip2);
|
||||
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 ip2)
|
||||
U0 ICXorEqu(CIntermediateCode *tmpi,I64 rip2)
|
||||
{
|
||||
I64 i,bit;
|
||||
if (tmpi->a2.type&MDF_IMM && !(tmpi->a1.type&MDF_STK) &&
|
||||
if (tmpi->arg2.type&MDF_IMM && !(tmpi->arg1.type&MDF_STK) &&
|
||||
tmpi->ic_flags&ICF_RES_NOT_USED) {
|
||||
i=tmpi->a2.disp;
|
||||
i=tmpi->arg2.disp;
|
||||
bit=Bsf(i);
|
||||
if (0<=bit==Bsr(i)) {
|
||||
tmpi->a2.disp=bit;
|
||||
tmpi->a2.reg=0;
|
||||
tmpi->a1.type=tmpi->a1.type&MDG_MASK+RT_I64;
|
||||
ICBitOps(tmpi,&tmpi->a2,&tmpi->a1,tmpi,0xBB0F,0x38BA0F,ip2);
|
||||
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->a1_type_pointed_to,
|
||||
tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,0x310635340633,ip2);
|
||||
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 ip,
|
||||
Bool nobound,CCmpCtrl *cc,U8 *buf,I64 ip2)
|
||||
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->a1.type&MDF_REG) || tmpi->a1.reg&7==REG_RSP)
|
||||
if (!(tmpi->arg1.type&MDF_REG) || tmpi->arg1.reg&7==REG_RSP)
|
||||
r=REG_RDX;
|
||||
else
|
||||
r=tmpi->a1.reg;
|
||||
r=tmpi->arg1.reg;
|
||||
if (nobound)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip2);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
else {
|
||||
if (tmpi->a2.type&MDF_IMM) {
|
||||
j=tmpi->a2.disp;
|
||||
if (tmpi->arg2.type&MDF_IMM) {
|
||||
j=tmpi->arg2.disp;
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip2);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
if (MIN_I8<=j<=MAX_I8) {
|
||||
i=0xF88348+(r&7)<<16;
|
||||
if (r>7) i++;
|
||||
@@ -627,36 +630,36 @@ U0 ICSwitch(CIntermediateCode *tmpi,I64 ip,
|
||||
ICU32(tmpi,j);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip2);
|
||||
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->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip2);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,r,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip2);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);
|
||||
i=0xC13B48+(r&7)<<19;
|
||||
if (r>7) i+=4;
|
||||
ICU24(tmpi,i);
|
||||
}
|
||||
|
||||
ip+=tmpi->ic_cnt;
|
||||
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-(ip+2);
|
||||
i=lb->addr-(rip+2);
|
||||
if (MIN_I8<=i<=MAX_I8)
|
||||
short_jmp=TRUE;
|
||||
}
|
||||
if (short_jmp) {
|
||||
tmpi->ic_flags|=ICF_SHORT_JMP;
|
||||
ICU16(tmpi,(lb->addr-(ip+2))<<8+0x73);
|
||||
ICU16(tmpi,(lb->addr-(rip+2))<<8+0x73);
|
||||
} else {
|
||||
tmpi->ic_flags&=~ICF_SHORT_JMP;
|
||||
ICU16(tmpi,0x830F);
|
||||
ICU32(tmpi,lb->addr-(ip+6));
|
||||
ICU32(tmpi,lb->addr-(rip+6));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -730,8 +733,8 @@ U0 ICSwitch(CIntermediateCode *tmpi,I64 ip,
|
||||
tmpa->next=cc->aotc->abss;
|
||||
tmpa->type=AAT_ADD_U32;
|
||||
cc->aotc->abss=tmpa;
|
||||
tmpa->ip=ip2+tmpi->ic_cnt;
|
||||
ICU32(tmpi,lb->addr+cc->aotc->ip);
|
||||
tmpa->rip=rip2+tmpi->ic_cnt;
|
||||
ICU32(tmpi,lb->addr+cc->aotc->rip);
|
||||
} else
|
||||
ICU32(tmpi,lb->addr+buf);
|
||||
|
||||
@@ -743,8 +746,8 @@ U0 ICSwitch(CIntermediateCode *tmpi,I64 ip,
|
||||
tmpa->next=cc->aotc->abss;
|
||||
tmpa->type=AAT_ADD_U32;
|
||||
cc->aotc->abss=tmpa;
|
||||
tmpa->ip=ip2+tmpi->ic_cnt;
|
||||
ICU32(tmpi,begin+cc->aotc->ip);
|
||||
tmpa->rip=rip2+tmpi->ic_cnt;
|
||||
ICU32(tmpi,begin+cc->aotc->rip);
|
||||
} else
|
||||
ICU32(tmpi,begin+buf);
|
||||
} else
|
||||
@@ -763,6 +766,6 @@ U0 ICLocalVarInit(CIntermediateCode *tmpi)
|
||||
ICU24(tmpi,0xC1C748);
|
||||
ICU32(tmpi,tmpi->ic_data);
|
||||
ICU16(tmpi,sys_var_init_val<<8+0xB0);
|
||||
ICU16(tmpi,0xAAF3);
|
||||
ICU24(tmpi,0xAA48F3);
|
||||
ICU16(tmpi,0x5F48);
|
||||
}
|
||||
+158
-154
@@ -1,7 +1,7 @@
|
||||
#define CN_A2 0
|
||||
#define CN_A1 1
|
||||
#define CN_MAIN 2
|
||||
#define CN_R 3
|
||||
#define CN_INST 2
|
||||
#define CN_RES 3
|
||||
|
||||
U0 CmpNoteFloatOp(CCmpCtrl *cc,CIntermediateCode *tmpi,
|
||||
Bool dont_pushable,Bool dont_popable,I64 pos)
|
||||
@@ -18,11 +18,11 @@ U0 CmpNoteFloatOp(CCmpCtrl *cc,CIntermediateCode *tmpi,
|
||||
if (cc->last_float_op_ic!=tmpi && cc->dont_push_float)
|
||||
link=TRUE;
|
||||
break;
|
||||
case CN_MAIN:
|
||||
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->r.reg!=REG_R8)
|
||||
cc->last_float_op_ic->res.reg!=REG_R8)
|
||||
tmpi->ic_flags|=ICF_ALT_TEMPLATE;
|
||||
else
|
||||
tmpi->ic_flags&=~ICF_ALT_TEMPLATE;
|
||||
@@ -37,8 +37,8 @@ U0 CmpNoteFloatOp(CCmpCtrl *cc,CIntermediateCode *tmpi,
|
||||
link=TRUE;
|
||||
}
|
||||
break;
|
||||
case CN_R:
|
||||
if (cc->last_float_op_ic==tmpi && cc->last_float_op_pos==CN_MAIN)
|
||||
case CN_RES:
|
||||
if (cc->last_float_op_ic==tmpi && cc->last_float_op_pos==CN_INST)
|
||||
link=TRUE;
|
||||
break;
|
||||
}
|
||||
@@ -121,7 +121,7 @@ U0 ICCopyTemplate(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,
|
||||
}
|
||||
|
||||
U0 ICFCvt(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 r1,
|
||||
CICType t2,I64 r2,I64 d2,Bool to_int,I64 pos,I64 ip)
|
||||
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;
|
||||
@@ -137,7 +137,7 @@ U0 ICFCvt(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 r1,
|
||||
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,ip);
|
||||
ICPush(tmpi,t2,r2,d2,rip);
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
rsp_size=8;
|
||||
} else {
|
||||
@@ -146,7 +146,7 @@ U0 ICFCvt(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 r1,
|
||||
ICAddRSP(tmpi,-8);
|
||||
}
|
||||
}
|
||||
ICSlashOp(tmpi,t2,r2,d2,op1,ip);
|
||||
ICSlashOp(tmpi,t2,r2,d2,op1,rip);
|
||||
} else {
|
||||
if (!dont_pop_float) {
|
||||
rsp_size=8;
|
||||
@@ -161,13 +161,13 @@ U0 ICFCvt(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 r1,
|
||||
if (rsp_size)
|
||||
ICAddRSP(tmpi,rsp_size);
|
||||
} else {
|
||||
ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,op2,ip);
|
||||
ICPop(tmpi,MDF_REG+RT_I64,r1,0,ip);
|
||||
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 ip)
|
||||
CICType t2,I64 r2,I64 d2,Bool to_int,I64 rip)
|
||||
{
|
||||
I64 rsp_size=0,op1,op2;
|
||||
if (to_int) {
|
||||
@@ -178,43 +178,43 @@ U0 ICFCvt2(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 r1,
|
||||
op2=SLASH_OP_FSTP;
|
||||
}
|
||||
if (!(t2.raw_type>=RT_I64 && t2&MDG_DISP_SIB_RIP)) {
|
||||
ICPush(tmpi,t2,r2,d2,ip);
|
||||
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,ip);
|
||||
ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,op2,ip);
|
||||
ICPop(tmpi,MDF_REG+RT_I64,r1,0,ip);
|
||||
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 ip)
|
||||
U0 ICFUnaryMinus(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf2,I64 rip)
|
||||
{
|
||||
CICArg *a1=&tmpi->a1;
|
||||
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->ip;
|
||||
buf2=cc->aotc->rip;
|
||||
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
if (!dont_push_float) {
|
||||
if (a1->type.raw_type>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=a1->type;
|
||||
r1=a1->reg;
|
||||
d1=a1->disp;
|
||||
if (arg1->type.raw_type>=RT_I64 && arg1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=arg1->type;
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
} else {
|
||||
if (a1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
|
||||
if (arg1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(arg1->disp(F64)))) {
|
||||
t1=MDF_RIP_DISP32+RT_I64;
|
||||
r1=REG_RIP;
|
||||
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
|
||||
d1=COCFloatConstFind(cc,arg1->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,a1->type,a1->reg,a1->disp,ip);
|
||||
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;
|
||||
}
|
||||
@@ -222,48 +222,48 @@ U0 ICFUnaryMinus(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf2,I64 ip)
|
||||
if (builtin1)
|
||||
ICU16(tmpi,builtin1);
|
||||
else
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_FLD,ip);
|
||||
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_MAIN);
|
||||
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,ip);
|
||||
ICPop(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,ip);
|
||||
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 ip)
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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_MAIN);
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_INST);
|
||||
if (!dont_pop_float)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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 ip)
|
||||
U0 ICFPow(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 rip)
|
||||
{//for POW
|
||||
I64 i;
|
||||
CAOTImportExport *tmpie;
|
||||
@@ -271,9 +271,9 @@ U0 ICFPow(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 ip)
|
||||
cc->htc.hash_table_lst,HTT_EXPORT_SYS_SYM);
|
||||
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
if (cc->flags&CCF_AOT_COMPILE) {
|
||||
if (!tmpex) {
|
||||
tmpex=CAlloc(sizeof(CHashExport));
|
||||
@@ -288,18 +288,18 @@ U0 ICFPow(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 ip)
|
||||
if (buf) {
|
||||
tmpie=CAlloc(sizeof(CAOTImportExport));
|
||||
tmpie->type=IET_IMM_I64;
|
||||
tmpie->ip=ip+tmpi->ic_cnt-8;
|
||||
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,-(ip+tmpi->ic_cnt+4));
|
||||
ICU32(tmpi,-(rip+tmpi->ic_cnt+4));
|
||||
if (buf) {
|
||||
tmpie=CAlloc(sizeof(CAOTImportExport));
|
||||
tmpie->type=IET_REL_I32;
|
||||
tmpie->ip=ip+tmpi->ic_cnt-4;
|
||||
tmpie->rip=rip+tmpi->ic_cnt-4;
|
||||
tmpie->next=tmpex->ie_lst;
|
||||
tmpex->ie_lst=tmpie;
|
||||
}
|
||||
@@ -308,7 +308,7 @@ U0 ICFPow(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 ip)
|
||||
if (tmpex->type&HTF_UNRESOLVED)
|
||||
throw('Compiler');
|
||||
else {
|
||||
i=tmpex->val-(ip+tmpi->ic_cnt+5);
|
||||
i=tmpex->val-(rip+tmpi->ic_cnt+5);
|
||||
if (!(MIN_I32<=i<=MAX_I32)) {
|
||||
throw('Compiler');
|
||||
// ICU16(tmpi,0xBB48);
|
||||
@@ -321,7 +321,7 @@ U0 ICFPow(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 ip)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
i=tmpex->val-(ip+tmpi->ic_cnt+5);
|
||||
i=tmpex->val-(rip+tmpi->ic_cnt+5);
|
||||
if (!(MIN_I32<=i<=MAX_I32)) {
|
||||
ICU16(tmpi,0xBB48);
|
||||
ICU64(tmpi,tmpex->val);
|
||||
@@ -332,81 +332,81 @@ U0 ICFPow(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 ip)
|
||||
}
|
||||
}
|
||||
tmpi->ic_flags&=~ICF_CODE_FINAL;
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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 ip)
|
||||
U0 ICFOp(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,U8 *buf2,I64 rip)
|
||||
{//for ADD,SUB,DIV,MUL
|
||||
CICArg *a1,*a2;
|
||||
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) {
|
||||
a1=&tmpi->a2;
|
||||
a2=&tmpi->a1;
|
||||
arg1=&tmpi->arg2;
|
||||
arg2=&tmpi->arg1;
|
||||
alt=TRUE;
|
||||
} else {
|
||||
a1=&tmpi->a1;
|
||||
a2=&tmpi->a2;
|
||||
arg1=&tmpi->arg1;
|
||||
arg2=&tmpi->arg2;
|
||||
alt=FALSE;
|
||||
}
|
||||
|
||||
if (cc->flags&CCF_AOT_COMPILE)
|
||||
buf2=cc->aotc->ip;
|
||||
buf2=cc->aotc->rip;
|
||||
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
if (dont_push_float) {
|
||||
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=a2->type;
|
||||
r2=a2->reg;
|
||||
d2=a2->disp;
|
||||
if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=arg2->type;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
} else {
|
||||
if (a2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
|
||||
if (arg2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64)))) {
|
||||
t2=MDF_RIP_DISP32+RT_I64;
|
||||
r2=REG_RIP;
|
||||
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,a2->type,a2->reg,a2->disp,ip);
|
||||
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 (!(a2->type&MDF_STK)) {
|
||||
if (a1->type.raw_type>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=a1->type;
|
||||
r1=a1->reg;
|
||||
d1=a1->disp;
|
||||
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 (a1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
|
||||
if (arg1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(arg1->disp(F64)))) {
|
||||
t1=MDF_RIP_DISP32+RT_I64;
|
||||
r1=REG_RIP;
|
||||
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
|
||||
d1=COCFloatConstFind(cc,arg1->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,a1->type,a1->reg,a1->disp,ip);
|
||||
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 (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=a2->type;
|
||||
r2=a2->reg;
|
||||
d2=a2->disp;
|
||||
if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=arg2->type;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
} else {
|
||||
if (a2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
|
||||
if (arg2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64)))) {
|
||||
t2=MDF_RIP_DISP32+RT_I64;
|
||||
r2=REG_RIP;
|
||||
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,a2->type,a2->reg,a2->disp,ip);
|
||||
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)
|
||||
@@ -414,45 +414,47 @@ U0 ICFOp(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,U8 *buf2,I64 ip)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
|
||||
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 (!(a1->type&MDF_STK)) {
|
||||
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=a2->type;
|
||||
r2=a2->reg;
|
||||
d2=a2->disp;
|
||||
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 (a2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
|
||||
if (arg2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64)))) {
|
||||
t2=MDF_RIP_DISP32+RT_I64;
|
||||
r2=REG_RIP;
|
||||
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,a2->type,a2->reg,a2->disp,ip);
|
||||
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 (a1->type.raw_type>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=a1->type;
|
||||
r1=a1->reg;
|
||||
d1=a1->disp;
|
||||
if (arg1->type.raw_type>=RT_I64 && arg1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=arg1->type;
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
} else {
|
||||
if (a1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
|
||||
if (arg1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(arg1->disp(F64)))) {
|
||||
t1=MDF_RIP_DISP32+RT_I64;
|
||||
r1=REG_RIP;
|
||||
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
|
||||
d1=COCFloatConstFind(cc,arg1->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,a1->type,a1->reg,a1->disp,ip);
|
||||
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)
|
||||
@@ -460,8 +462,10 @@ U0 ICFOp(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,U8 *buf2,I64 ip)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
|
||||
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;
|
||||
@@ -484,7 +488,7 @@ U0 ICFOp(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,U8 *buf2,I64 ip)
|
||||
if (builtin1)
|
||||
ICU16(tmpi,builtin1);
|
||||
else
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_FLD,ip);
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_FLD,rip);
|
||||
}
|
||||
if (alt)
|
||||
switch (op.u8[0]) {
|
||||
@@ -495,24 +499,24 @@ U0 ICFOp(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,U8 *buf2,I64 ip)
|
||||
ICU16(tmpi,builtin2);
|
||||
ICU16(tmpi,op.u16[2]);
|
||||
} else
|
||||
ICSlashOp(tmpi,t2,r2,d2,op,ip);
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,TRUE,CN_MAIN);
|
||||
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,ip);
|
||||
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,ip);
|
||||
SLASH_OP_FSTP,rip);
|
||||
ICAddRSP(tmpi,rsp_size-8);
|
||||
}
|
||||
ICPop(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,ip);
|
||||
ICPop(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,rip);
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICFCmp(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,I64 ip)
|
||||
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);
|
||||
@@ -522,82 +526,82 @@ U0 ICFCmp(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,I64 ip)
|
||||
ICPopRegs(tmpi,1<<REG_RAX);
|
||||
else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
} else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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_MAIN);
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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 ip)
|
||||
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->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
if (tmpi->a1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,ip);
|
||||
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->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,
|
||||
tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
if (tmpi->a1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,ip);
|
||||
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_MAIN);
|
||||
if (tmpi->a1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,ip);
|
||||
ICMov(tmpi,tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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->a1.type,
|
||||
tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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->a1_type_pointed_to,REG_RCX,0,ip);
|
||||
if (tmpi->a1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,ip);
|
||||
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->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,tmpi->a1.type,
|
||||
tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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->a1_type_pointed_to,REG_RCX,0,ip);
|
||||
if (tmpi->a1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,ip);
|
||||
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_MAIN);
|
||||
if (tmpi->a1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,ip);
|
||||
ICMov(tmpi,MDF_DISP+tmpi->a1_type_pointed_to,REG_RCX,0,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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);
|
||||
}
|
||||
}
|
||||
+251
-240
@@ -1,13 +1,13 @@
|
||||
U0 ICFOpEqu(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,U8 *buf2,I64 ip)
|
||||
U0 ICFOpEqu(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,U8 *buf2,I64 rip)
|
||||
{//for ADD,SUB,DIV,MUL
|
||||
CICArg *a1=&tmpi->a1,
|
||||
*a2=&tmpi->a2;
|
||||
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->ip;
|
||||
buf2=cc->aotc->rip;
|
||||
|
||||
CmpSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float);
|
||||
if (dont_pop_float)
|
||||
@@ -16,63 +16,66 @@ U0 ICFOpEqu(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,U8 *buf2,I64 ip)
|
||||
if (tmpi->ic_flags & ICF_BY_VAL) {
|
||||
p1_mem=FALSE;
|
||||
if (dont_push_float) {
|
||||
if (tmpi->a1_type_pointed_to!=RT_F64) {
|
||||
if (tmpi->arg1_type_pointed_to!=RT_F64) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,
|
||||
a1->type&MDG_MASK+tmpi->a1_type_pointed_to,a1->reg,a1->disp,ip);
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,ip);
|
||||
ICPush(tmpi,MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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->a1_type_pointed_to>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=a1->type&MDG_MASK+tmpi->a1_type_pointed_to;
|
||||
r1=a1->reg;
|
||||
d1=a1->disp;
|
||||
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,a1->type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
a1->reg,a1->disp,ip);
|
||||
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->a1_type_pointed_to!=RT_F64 || a1->type&MDF_STK) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
|
||||
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,
|
||||
a1->type&MDG_MASK+tmpi->a1_type_pointed_to,a1->reg,a1->disp,ip);
|
||||
if (tmpi->a1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,ip);
|
||||
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 (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=a2->type;
|
||||
r2=a2->reg;
|
||||
d2=a2->disp;
|
||||
if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=arg2->type;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
} else {
|
||||
if (a2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
|
||||
if (arg2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64)))) {
|
||||
t2=MDF_RIP_DISP32+RT_I64;
|
||||
r2=REG_RIP;
|
||||
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,a2->type,a2->reg,a2->disp,ip);
|
||||
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->a1_type_pointed_to>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=a1->type&MDG_MASK+tmpi->a1_type_pointed_to;
|
||||
r1=a1->reg;
|
||||
d1=a1->disp;
|
||||
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,a1->type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
a1->reg,a1->disp,ip);
|
||||
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)
|
||||
@@ -80,7 +83,7 @@ U0 ICFOpEqu(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,U8 *buf2,I64 ip)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!rsp_size && !(p1_mem && tmpi->a1_type_pointed_to==RT_F64)) {
|
||||
if (!rsp_size && !(p1_mem && tmpi->arg1_type_pointed_to==RT_F64)) {
|
||||
rsp_size=8;
|
||||
ICAddRSP(tmpi,-8);
|
||||
}
|
||||
@@ -88,93 +91,97 @@ U0 ICFOpEqu(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,U8 *buf2,I64 ip)
|
||||
if (builtin2)
|
||||
ICU16(tmpi,builtin2);
|
||||
else
|
||||
ICSlashOp(tmpi,t2,r2,d2,SLASH_OP_FLD,ip);
|
||||
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,ip);
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,FALSE,CN_MAIN);
|
||||
if (p1_mem && tmpi->a1_type_pointed_to==RT_F64) {
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_FSTP,ip);
|
||||
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,ip);
|
||||
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,ip);
|
||||
SLASH_OP_FSTP,rip);
|
||||
ICAddRSP(tmpi,rsp_size-8);
|
||||
}
|
||||
if (tmpi->a1_type_pointed_to!=RT_F64) {
|
||||
ICPop(tmpi,MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,ip);
|
||||
ICMov(tmpi,a1->type&MDG_MASK+tmpi->a1_type_pointed_to,a1->reg,
|
||||
a1->disp,MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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,a1->type&MDG_MASK+tmpi->a1_type_pointed_to,
|
||||
a1->reg,a1->disp,ip);
|
||||
ICPop(tmpi,arg1->type&MDG_MASK+tmpi->arg1_type_pointed_to,
|
||||
arg1->reg,arg1->disp,rip);
|
||||
}
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
a1->type&MDG_MASK+tmpi->a1_type_pointed_to,a1->reg,a1->disp,ip);
|
||||
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->a1_type_pointed_to>=RT_I64)
|
||||
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,a1->type,a1->reg,a1->disp,ip);
|
||||
if (tmpi->a1_type_pointed_to!=RT_F64) {
|
||||
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->a1_type_pointed_to,REG_RCX,0,ip);
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,ip);
|
||||
ICPush(tmpi,MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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->a1_type_pointed_to,REG_RCX,0,ip);
|
||||
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->a1_type_pointed_to!=RT_F64 || a1->type&MDF_STK) {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
|
||||
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->a1_type_pointed_to,REG_RCX,0,ip);
|
||||
if (tmpi->a1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,ip);
|
||||
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 (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=a2->type;
|
||||
r2=a2->reg;
|
||||
d2=a2->disp;
|
||||
if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=arg2->type;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
} else {
|
||||
if (a2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
|
||||
if (arg2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64)))) {
|
||||
t2=MDF_RIP_DISP32+RT_I64;
|
||||
r2=REG_RIP;
|
||||
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,a2->type,a2->reg,a2->disp,ip);
|
||||
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,a1->type,a1->reg,a1->disp,ip);
|
||||
ICPush(tmpi,MDF_DISP+tmpi->a1_type_pointed_to,REG_RCX,0,ip);
|
||||
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->a1_type_pointed_to==RT_F64)) {
|
||||
if (!rsp_size && !(p1_mem && tmpi->arg1_type_pointed_to==RT_F64)) {
|
||||
rsp_size=8;
|
||||
ICAddRSP(tmpi,-8);
|
||||
}
|
||||
@@ -182,61 +189,61 @@ U0 ICFOpEqu(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,U8 *buf2,I64 ip)
|
||||
if (builtin2)
|
||||
ICU16(tmpi,builtin2);
|
||||
else
|
||||
ICSlashOp(tmpi,t2,r2,d2,SLASH_OP_FLD,ip);
|
||||
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,ip);
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,FALSE,CN_MAIN);
|
||||
if (p1_mem && tmpi->a1_type_pointed_to==RT_F64) {
|
||||
ICSlashOp(tmpi,MDF_DISP+tmpi->a1_type_pointed_to,
|
||||
REG_RCX,0,SLASH_OP_FSTP,ip);
|
||||
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,ip);
|
||||
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,ip);
|
||||
SLASH_OP_FSTP,rip);
|
||||
ICAddRSP(tmpi,rsp_size-8);
|
||||
}
|
||||
ICPop(tmpi,MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
if (tmpi->a1_type_pointed_to!=RT_F64)
|
||||
ICFCvt2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,ip);
|
||||
ICMov(tmpi,MDF_DISP+tmpi->a1_type_pointed_to,REG_RCX,0,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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 ip,
|
||||
I64 us,I64 not_us,U8 *buf,I64 ip2)
|
||||
U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 rip,
|
||||
I64 us,I64 not_us,U8 *buf,I64 rip2)
|
||||
{
|
||||
CICArg *a1,*a2;
|
||||
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) {
|
||||
a1=&tmpi->a2;
|
||||
a2=&tmpi->a1;
|
||||
arg1=&tmpi->arg2;
|
||||
arg2=&tmpi->arg1;
|
||||
alt=TRUE;
|
||||
} else {
|
||||
a1=&tmpi->a1;
|
||||
a2=&tmpi->a2;
|
||||
arg1=&tmpi->arg1;
|
||||
arg2=&tmpi->arg2;
|
||||
alt=FALSE;
|
||||
}
|
||||
|
||||
if (cc->flags&CCF_AOT_COMPILE)
|
||||
buf2=cc->aotc->ip;
|
||||
buf2=cc->aotc->rip;
|
||||
else
|
||||
buf2=buf;
|
||||
|
||||
@@ -246,20 +253,20 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 ip,
|
||||
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
|
||||
rsp_size+=8;
|
||||
} else {
|
||||
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=a2->type;
|
||||
r2=a2->reg;
|
||||
d2=a2->disp;
|
||||
if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=arg2->type;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
} else {
|
||||
if (a2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64))) ||
|
||||
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,a2->disp(F64))+buf2;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,a2->type,a2->reg,a2->disp,ip2);
|
||||
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;
|
||||
}
|
||||
@@ -267,43 +274,43 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 ip,
|
||||
}
|
||||
} else {
|
||||
if (alt) {
|
||||
if (!(a2->type&MDF_STK)) {
|
||||
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 (a1->type.raw_type>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=a1->type;
|
||||
r1=a1->reg;
|
||||
d1=a1->disp;
|
||||
if (arg1->type.raw_type>=RT_I64 && arg1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=arg1->type;
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
} else {
|
||||
if (a1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
|
||||
if (arg1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(arg1->disp(F64)))) {
|
||||
t1=MDF_RIP_DISP32+RT_I64;
|
||||
r1=REG_RIP;
|
||||
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
|
||||
d1=COCFloatConstFind(cc,arg1->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,a1->type,a1->reg,a1->disp,ip2);
|
||||
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 (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=a2->type;
|
||||
r2=a2->reg;
|
||||
d2=a2->disp;
|
||||
if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=arg2->type;
|
||||
r2=arg2->reg;
|
||||
d2=arg2->disp;
|
||||
} else {
|
||||
if (a2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64))) ||
|
||||
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,a2->disp(F64))+buf2;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,a2->type,a2->reg,a2->disp,ip2);
|
||||
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)
|
||||
@@ -314,29 +321,31 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 ip,
|
||||
if (tmpi->ic_flags&ICF_POP_CMP)
|
||||
ICPopRegs(tmpi,1<<REG_RDX);
|
||||
else
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
|
||||
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 (!(a1->type&MDF_STK)) {
|
||||
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
|
||||
t2=a2->type;
|
||||
r2=a2->reg;
|
||||
d2=a2->disp;
|
||||
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 (a2->type&MDF_IMM) {
|
||||
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64))) ||
|
||||
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,a2->disp(F64))+buf2;
|
||||
d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,a2->type,a2->reg,a2->disp,ip2);
|
||||
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;
|
||||
}
|
||||
@@ -347,19 +356,19 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 ip,
|
||||
if (r2==REG_RSP+REG_RSP<<8)
|
||||
d1+=8;
|
||||
} else {
|
||||
if (a1->type.raw_type>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=a1->type;
|
||||
r1=a1->reg;
|
||||
d1=a1->disp;
|
||||
if (arg1->type.raw_type>=RT_I64 && arg1->type&MDG_DISP_SIB_RIP) {
|
||||
t1=arg1->type;
|
||||
r1=arg1->reg;
|
||||
d1=arg1->disp;
|
||||
} else {
|
||||
if (a1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
|
||||
if (arg1->type&MDF_IMM) {
|
||||
if (!(builtin1=ICBuiltInFloatConst(arg1->disp(F64)))) {
|
||||
t1=MDF_RIP_DISP32+RT_I64;
|
||||
r1=REG_RIP;
|
||||
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
|
||||
d1=COCFloatConstFind(cc,arg1->disp(F64))+buf2;
|
||||
}
|
||||
} else {
|
||||
ICPush(tmpi,a1->type,a1->reg,a1->disp,ip2);
|
||||
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)
|
||||
@@ -368,11 +377,13 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 ip,
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
|
||||
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,a1->type,a1->reg,a1->disp,ip2);
|
||||
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;
|
||||
@@ -384,14 +395,14 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 ip,
|
||||
if (builtin1)
|
||||
ICU16(tmpi,builtin1);
|
||||
else
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_FLD,ip2);
|
||||
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,ip2);
|
||||
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) {
|
||||
@@ -402,17 +413,17 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 ip,
|
||||
|
||||
if (alt) {
|
||||
ICU16(tmpi,0xF1DF); //FCOMIP
|
||||
ICSlashOp(tmpi,t2,r2,d2,SLASH_OP_FSTP,ip2);
|
||||
ICSlashOp(tmpi,t2,r2,d2,SLASH_OP_FSTP,rip2);
|
||||
} else {
|
||||
ICU16(tmpi,0xF1DB); //FCOMI
|
||||
ICSlashOp(tmpi,t2,r2,d2,SLASH_OP_FSTP,ip2);
|
||||
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_MAIN);
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,FALSE,CN_INST);
|
||||
|
||||
if (tmpi->ic_flags&ICF_PUSH_CMP) {
|
||||
if (r2.u8[0]==REG_RSP) {
|
||||
@@ -426,7 +437,7 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 ip,
|
||||
ICU8(tmpi,0x5B); //POP RBX (Dont change flags)
|
||||
rsp_size-=8;
|
||||
}
|
||||
ICPush(tmpi,t2,r2,d2,ip2);
|
||||
ICPush(tmpi,t2,r2,d2,rip2);
|
||||
}
|
||||
} else {
|
||||
while (rsp_size) {
|
||||
@@ -435,11 +446,11 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 ip,
|
||||
}
|
||||
}
|
||||
|
||||
ip+=tmpi->ic_cnt;
|
||||
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-(ip+2);
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP) {
|
||||
if(tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
i+=4;
|
||||
@@ -452,7 +463,7 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 ip,
|
||||
|
||||
if (short_jmp) {
|
||||
tmpi->ic_flags|=ICF_SHORT_JMP;
|
||||
i=lb->addr-(ip+2);
|
||||
i=lb->addr-(rip+2);
|
||||
if (lb->flags&CMF_POP_CMP) {
|
||||
if(tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
i+=4;
|
||||
@@ -462,7 +473,7 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 ip,
|
||||
ICU16(tmpi,i<<8+us.u8[2]);
|
||||
} else {
|
||||
tmpi->ic_flags&=~ICF_SHORT_JMP;
|
||||
i=lb->addr-(ip+6);
|
||||
i=lb->addr-(rip+6);
|
||||
if (lb->flags&CMF_POP_CMP) {
|
||||
if(tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
i+=4;
|
||||
@@ -474,147 +485,147 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 ip,
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICFMul(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 ip)
|
||||
U0 ICFMul(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 rip)
|
||||
{
|
||||
if (tmpi->a1.type&MDF_IMM && tmpi->a1.type&RTG_MASK==RT_F64 &&
|
||||
tmpi->a1.disp(F64)==1.0) {
|
||||
CmpNoteFloatOp(cc,tmpi,FALSE,FALSE,CN_MAIN);
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
} else if (tmpi->a2.type&MDF_IMM &&
|
||||
tmpi->a2.type&RTG_MASK==RT_F64&& tmpi->a2.disp(F64)==1.0) {
|
||||
CmpNoteFloatOp(cc,tmpi,FALSE,FALSE,CN_MAIN);
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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,ip);
|
||||
ICFOp(cc,tmpi,SLASH_OP_FMUL,buf,rip);
|
||||
}
|
||||
|
||||
U0 ICFDiv(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 ip)
|
||||
U0 ICFDiv(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 rip)
|
||||
{
|
||||
if (tmpi->a2.type&MDF_IMM && tmpi->a2.type&RTG_MASK==RT_F64 &&
|
||||
tmpi->a2.disp(F64)==1.0) {
|
||||
CmpNoteFloatOp(cc,tmpi,FALSE,FALSE,CN_MAIN);
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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,ip);
|
||||
ICFOp(cc,tmpi,SLASH_OP_FDIV,buf,rip);
|
||||
}
|
||||
|
||||
U0 ICFAdd(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 ip)
|
||||
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->a1.type&MDF_IMM && !tmpi->a1.disp) {
|
||||
if (tmpi->arg1.type&MDF_IMM && !tmpi->arg1.disp) {
|
||||
if (dont_push_float) {
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_FSTP,FALSE,TRUE,TRUE,CN_MAIN);
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
|
||||
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_MAIN);
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a2.type,tmpi->a2.reg,tmpi->a2.disp,ip);
|
||||
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->a2.type&MDF_IMM && !tmpi->a2.disp) {
|
||||
} else if (tmpi->arg2.type&MDF_IMM && !tmpi->arg2.disp) {
|
||||
if (dont_push_float) {
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_FSTP,FALSE,TRUE,TRUE,CN_MAIN);
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
|
||||
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->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,TRUE,CN_MAIN);
|
||||
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,ip);
|
||||
ICFOp(cc,tmpi,SLASH_OP_FADD,buf,rip);
|
||||
}
|
||||
|
||||
U0 ICFSub(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 ip)
|
||||
U0 ICFSub(CCmpCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 rip)
|
||||
{
|
||||
Bool dont_push_float,dont_pop_float;
|
||||
if (tmpi->a2.type&MDF_IMM && !tmpi->a2.disp) {
|
||||
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_MAIN);
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
|
||||
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->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
CmpNoteFloatOp(cc,tmpi,TRUE,TRUE,CN_MAIN);
|
||||
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,ip);
|
||||
ICFOp(cc,tmpi,SLASH_OP_FSUB,buf,rip);
|
||||
}
|
||||
|
||||
U0 ICFPreIncDec(CCmpCtrl *cc,CIntermediateCode *tmpi,I64 op,I64 ip)
|
||||
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->a1.type&MDG_MASK+RT_I64,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
ICCopyTemplate(cc,tmpi,op,FALSE,TRUE,TRUE,CN_MAIN);
|
||||
ICMov(tmpi,tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+RT_I64,REG_RCX,0,ip);
|
||||
ICCopyTemplate(cc,tmpi,op,FALSE,TRUE,TRUE,CN_MAIN);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,REG_RCX,0,MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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 ip)
|
||||
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->a1.type&MDG_MASK+RT_I64,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
ICCopyTemplate(cc,tmpi,op,FALSE,TRUE,TRUE,CN_MAIN);
|
||||
ICMov(tmpi,tmpi->a1.type,tmpi->a1.reg,tmpi->a1.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+RT_I64,REG_RCX,0,ip);
|
||||
if (tmpi->r.type.mode)
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
ICCopyTemplate(cc,tmpi,op,FALSE,TRUE,TRUE,CN_MAIN);
|
||||
ICMov(tmpi,MDF_DISP+RT_I64,REG_RCX,0,MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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->r.type.mode)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RDX,0,ip);
|
||||
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 ip)
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);
|
||||
|
||||
ICCopyTemplate(cc,tmpi,op,FALSE,TRUE,TRUE,CN_MAIN);
|
||||
if (tmpi->r.type.mode && !(tmpi->ic_flags & ICF_R_TO_F64) &&
|
||||
!(tmpi->ic_flags & ICF_R_TO_INT))
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_REG+RT_I64,REG_RAX,0,ip);
|
||||
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);
|
||||
}
|
||||
+79
-95
@@ -121,7 +121,7 @@ U0 ICAddRSP(CIntermediateCode *tmpi,I64 i,Bool optimize=TRUE)
|
||||
}
|
||||
|
||||
extern U0 ICMov(CIntermediateCode *tmpi,
|
||||
CICType t1,I64 r1,I64 d1,CICType t2,I64 r2,I64 d2,I64 ip);
|
||||
CICType t1,I64 r1,I64 d1,CICType t2,I64 r2,I64 d2,I64 rip);
|
||||
|
||||
#define MODR_REG 0
|
||||
#define MODR_INDIRECT_REG 1
|
||||
@@ -131,6 +131,7 @@ extern U0 ICMov(CIntermediateCode *tmpi,
|
||||
#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
|
||||
@@ -210,8 +211,8 @@ I64 ICModr1(I64 r,CICType t2,I64 r2,I64 d2)
|
||||
return res;
|
||||
}
|
||||
|
||||
U0 ICModr2(CIntermediateCode *tmpi,I64 i,I64 d,I64 ip=0)
|
||||
{//t=0 means no SIB
|
||||
U0 ICModr2(CIntermediateCode *tmpi,I64 i,CICType t=0,I64 d,I64 rip=0)
|
||||
{
|
||||
switch [i.u8[0]] {
|
||||
case MODR_REG:
|
||||
break;
|
||||
@@ -234,42 +235,58 @@ U0 ICModr2(CIntermediateCode *tmpi,I64 i,I64 d,I64 ip=0)
|
||||
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-(ip+tmpi->ic_cnt));
|
||||
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_MUL 0x0000000000F7F604
|
||||
#define SLASH_OP_IMUL 0x0000000000F7F605
|
||||
#define SLASH_OP_DIV 0x0000000000F7F606
|
||||
#define SLASH_OP_MOV 0x0000000000898800
|
||||
#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
|
||||
#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 ip)
|
||||
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 && op!=SLASH_OP_MOV && !(t1&MDF_REG))
|
||||
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:
|
||||
@@ -287,10 +304,12 @@ U0 ICSlashOp(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,I64 op,I64 ip)
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+op.u8[2]);
|
||||
}
|
||||
ICModr2(tmpi,i,d1,ip+4);
|
||||
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 ip)
|
||||
U0 ICPush(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,I64 rip)
|
||||
{
|
||||
switch (Bsr(t1)) {
|
||||
case MDf_REG:
|
||||
@@ -306,7 +325,7 @@ U0 ICPush(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,I64 ip)
|
||||
ICU8(tmpi,0x68);
|
||||
ICU32(tmpi,d1);
|
||||
} else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,t1,r1,d1,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,t1,r1,d1,rip);
|
||||
ICU8(tmpi,0x50+REG_RBX);
|
||||
}
|
||||
return;
|
||||
@@ -319,12 +338,12 @@ U0 ICPush(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,I64 ip)
|
||||
case RT_I64:
|
||||
case RT_U64:
|
||||
case RT_F64:
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_PUSH,ip);
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_PUSH,rip);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,t1,r1,d1,ip);
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,t1,r1,d1,rip);
|
||||
ICU16(tmpi,0x5048+REG_RBX<<8);
|
||||
}
|
||||
|
||||
@@ -341,7 +360,7 @@ U0 ICPushRegs(CIntermediateCode *tmpi,I64 mask)
|
||||
}
|
||||
}
|
||||
|
||||
U0 ICPop(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,I64 ip)
|
||||
U0 ICPop(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,I64 rip)
|
||||
{
|
||||
switch (Bsr(t1)) {
|
||||
case MDf_REG:
|
||||
@@ -355,14 +374,14 @@ U0 ICPop(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,I64 ip)
|
||||
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,ip);
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,REG_RBX,0,rip);
|
||||
} else
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_POP,ip);
|
||||
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,ip);
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,REG_RBX,0,rip);
|
||||
break;
|
||||
default:
|
||||
ICAddRSP(tmpi,8);
|
||||
@@ -424,7 +443,7 @@ I64 ICBuiltInFloatConst(F64 d)
|
||||
}
|
||||
|
||||
U0 ICMov(CIntermediateCode *tmpi,
|
||||
CICType t1,I64 r1,I64 d1,CICType t2,I64 r2,I64 d2,I64 ip)
|
||||
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;
|
||||
@@ -485,7 +504,7 @@ U0 ICMov(CIntermediateCode *tmpi,
|
||||
ICU64(tmpi,d2);
|
||||
}
|
||||
} else if (t2&MDF_STK)
|
||||
ICPop(tmpi,t1,r1,d1,ip);
|
||||
ICPop(tmpi,t1,r1,d1,rip);
|
||||
else {
|
||||
if (r1==r2 && t2&MDF_REG)
|
||||
goto move_done;
|
||||
@@ -515,16 +534,16 @@ U0 ICMov(CIntermediateCode *tmpi,
|
||||
default:
|
||||
ICU16(tmpi,i.u8[2]<<8+0x8B);
|
||||
}
|
||||
ICModr2(tmpi,i,d2,ip+4);
|
||||
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,ip);
|
||||
ICPush(tmpi,t2&MDG_MASK+t1.raw_type,r2,d2,rip);
|
||||
else
|
||||
ICPush(tmpi,t2,r2,d2,ip);
|
||||
ICPush(tmpi,t2,r2,d2,rip);
|
||||
if (tmpi->ic_flags&ICF_PUSH_CMP)
|
||||
ICPushRegs(tmpi,1<<REG_RBX);
|
||||
break;
|
||||
@@ -532,42 +551,7 @@ U0 ICMov(CIntermediateCode *tmpi,
|
||||
case MDf_RIP_DISP32:
|
||||
case MDf_SIB:
|
||||
if (t2&MDF_IMM && (t1.raw_type<RT_I64 || (MIN_I32<=d2<=MAX_I32))) {
|
||||
i=ICModr1(0,t1,r1,d1);
|
||||
switch (t1.raw_type) {
|
||||
case RT_I8:
|
||||
case RT_U8:
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0xC6);
|
||||
break;
|
||||
case RT_U16:
|
||||
case RT_I16:
|
||||
ICOpSizeRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0xC7);
|
||||
break;
|
||||
default:
|
||||
ICRex(tmpi,i.u8[1]);
|
||||
ICU16(tmpi,i.u8[2]<<8+0xC7);
|
||||
}
|
||||
if (i.u8[0]!=MODR_RIP_REL)
|
||||
ICModr2(tmpi,i,d1,);
|
||||
else {
|
||||
i=d1-(ip+tmpi->ic_cnt+4);
|
||||
switch (t1.raw_type) {
|
||||
case RT_I8:
|
||||
case RT_U8:
|
||||
i--;
|
||||
break;
|
||||
case RT_I16:
|
||||
case RT_U16:
|
||||
i-=2;
|
||||
break;
|
||||
default:
|
||||
i-=4;
|
||||
}
|
||||
ICU32(tmpi,i);
|
||||
tmpi->ic_flags&=~ICF_CODE_FINAL;
|
||||
}
|
||||
|
||||
ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_MOV_IMM,rip);
|
||||
switch (t1.raw_type) {
|
||||
case RT_I8:
|
||||
case RT_U8:
|
||||
@@ -582,10 +566,10 @@ U0 ICMov(CIntermediateCode *tmpi,
|
||||
}
|
||||
} else {
|
||||
if (t2&MDF_REG)
|
||||
ICSlashOp(tmpi,t1,r1,d1,r2+SLASH_OP_MOV,ip);
|
||||
ICSlashOp(tmpi,t1,r1,d1,r2+SLASH_OP_MOV,rip);
|
||||
else {
|
||||
ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,t2,r2,d2,ip);
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,REG_RBX,0,ip);
|
||||
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;
|
||||
@@ -675,7 +659,7 @@ move_redundant:
|
||||
}
|
||||
|
||||
U0 ICLea(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
CICType t2,I64 r2,I64 d2,CCmpCtrl *cc,U8 *buf,I64 ip)
|
||||
CICType t2,I64 r2,I64 d2,CCmpCtrl *cc,U8 *buf,I64 rip)
|
||||
{
|
||||
I64 i;
|
||||
CAOTAbsAddr *tmpa;
|
||||
@@ -684,7 +668,7 @@ U0 ICLea(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
i=ICModr1(r1,t2,r2,d2);
|
||||
i.u8[1]|=0x48;
|
||||
ICU24(tmpi,i.u8[2]<<16+0x8D00+i.u8[1]);
|
||||
ICModr2(tmpi,i,d2,ip+4);
|
||||
ICModr2(tmpi,i,,d2,rip);
|
||||
break;
|
||||
case MDf_STK:
|
||||
if (t2&MDF_RIP_DISP32) {
|
||||
@@ -695,30 +679,30 @@ U0 ICLea(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,
|
||||
tmpa->next=cc->aotc->abss;
|
||||
tmpa->type=AAT_ADD_U32;
|
||||
cc->aotc->abss=tmpa;
|
||||
tmpa->ip=ip+tmpi->ic_cnt-4;
|
||||
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,ip);
|
||||
ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,REG_RCX,0,ip);
|
||||
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 ip)
|
||||
U0 ICDeref(CIntermediateCode *tmpi,I64 rip)
|
||||
{
|
||||
CICType t;
|
||||
t=tmpi->r.type.raw_type;
|
||||
if (t>tmpi->a1_type_pointed_to)
|
||||
t=tmpi->a1_type_pointed_to;
|
||||
if (tmpi->a1.type&MDF_REG)
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_DISP+t,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
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->a1.type,tmpi->a1.reg,tmpi->a1.disp,ip);
|
||||
ICMov(tmpi,tmpi->r.type,tmpi->r.reg,tmpi->r.disp,
|
||||
MDF_DISP+t,REG_RCX,0,ip);
|
||||
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);
|
||||
}
|
||||
}
|
||||
+17
-17
@@ -11,7 +11,7 @@ U0 LexPutToken(CCmpCtrl *cc)
|
||||
"FLOAT:%e",cc->cur_f64;
|
||||
else if (cc->token=='\n')
|
||||
"<NEW_LINE>";
|
||||
else if (Bt(chars_bmp_displayable,cc->token))
|
||||
else if (Bt(char_bmp_displayable,cc->token))
|
||||
'' cc->token;
|
||||
else {
|
||||
"T:%X",cc->token;
|
||||
@@ -187,38 +187,38 @@ U0 ICPut(CCmpCtrl *cc,CIntermediateCode *tmpi)
|
||||
if (opcode>=IC_END_EXP && opcode!=IC_NOP2) {
|
||||
"%15ts %016X ",intermediate_code_table[opcode].name,tmpi->ic_data;
|
||||
if (cc->pass) {
|
||||
if (tmpi->r.type.mode) {
|
||||
"$$PURPLE$$R:$$FG$$";
|
||||
ICArgPut(&tmpi->r,0);
|
||||
if (tmpi->res.type.mode) {
|
||||
"$$PURPLE$$RES:$$FG$$";
|
||||
ICArgPut(&tmpi->res,0);
|
||||
}
|
||||
if (tmpi->a1.type.mode) {
|
||||
"$$PURPLE$$A1:$$FG$$";
|
||||
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->a1,tmpi->a1_type_pointed_to);
|
||||
ICArgPut(&tmpi->arg1,tmpi->arg1_type_pointed_to);
|
||||
else
|
||||
ICArgPut(&tmpi->a1,0);
|
||||
ICArgPut(&tmpi->arg1,0);
|
||||
}
|
||||
if (tmpi->a2.type.mode) {
|
||||
"$$PURPLE$$A2:$$FG$$";
|
||||
ICArgPut(&tmpi->a2,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_A2_TO_F64)
|
||||
if (tmpi->ic_flags & ICF_ARG2_TO_F64)
|
||||
"$$LTBLUE$$a2d$$FG$$ ";
|
||||
if (tmpi->ic_flags & ICF_A2_TO_INT)
|
||||
if (tmpi->ic_flags & ICF_ARG2_TO_INT)
|
||||
"$$GREEN$$a2i$$FG$$ ";
|
||||
if (tmpi->ic_flags & ICF_A1_TO_F64)
|
||||
if (tmpi->ic_flags & ICF_ARG1_TO_F64)
|
||||
"$$LTBLUE$$a1d$$FG$$ ";
|
||||
if (tmpi->ic_flags & ICF_A1_TO_INT)
|
||||
if (tmpi->ic_flags & ICF_ARG1_TO_INT)
|
||||
"$$GREEN$$a1i$$FG$$ ";
|
||||
if (tmpi->ic_flags & ICF_R_TO_F64)
|
||||
if (tmpi->ic_flags & ICF_RES_TO_F64)
|
||||
"$$LTBLUE$$rd$$FG$$ ";
|
||||
if (tmpi->ic_flags & ICF_R_TO_INT)
|
||||
if (tmpi->ic_flags & ICF_RES_TO_INT)
|
||||
"$$GREEN$$ri$$FG$$ ";
|
||||
if (tmpi->ic_flags & ICF_USE_F64)
|
||||
"[F64] ";
|
||||
|
||||
+1
-1
@@ -38,7 +38,7 @@ 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_ip,U8 **_base,Bool data_heap,I64 pass);
|
||||
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];
|
||||
|
||||
+1
-1
@@ -21,7 +21,7 @@ I64 HashEntrySize(CHashSrcSym *tmph)
|
||||
if (StrCmp(tmph->str,KERNEL_MODULE_NAME))
|
||||
return MSize(tmph(CHashGeneric *)->user_data0);
|
||||
else {
|
||||
bfh=sys_boot_base-sizeof(CBinFile);
|
||||
bfh=mem_boot_base-sizeof(CBinFile);
|
||||
return bfh->file_size;
|
||||
}
|
||||
case HTt_WORD:
|
||||
|
||||
+38
-38
@@ -14,7 +14,7 @@ U8 *LexStmt2Bin(CCmpCtrl *cc,I64 *_type,I64 cmp_flags=0)
|
||||
ICAdd(cc,IC_RET,0,0);
|
||||
if (res=COCCompile(cc,&size,NULL,_type)) {
|
||||
if (cc->flags&CCF_AOT_COMPILE) {
|
||||
j=cc->aotc->ip;
|
||||
j=cc->aotc->rip;
|
||||
k=(size+7)>>3;
|
||||
for (i=0;i<k;i++)
|
||||
AOTStoreCodeU64(cc,res[i]);
|
||||
@@ -85,7 +85,7 @@ CAOT *CmpJoin(CCmpCtrl *cc,I64 cmp_flags,U8 *map_name=NULL,U8 mapfile_drv_let=0)
|
||||
if (buf!=INVALID_PTR) {
|
||||
tmpie=CAlloc(sizeof(CAOTImportExport));
|
||||
tmpie->type=IET_MAIN;
|
||||
tmpie->ip=buf;
|
||||
tmpie->rip=buf;
|
||||
QueIns(tmpie,res->last_ie);
|
||||
}
|
||||
if (cmp_flags&CMPF_ASM_BLK)
|
||||
@@ -173,7 +173,7 @@ CAOT *CmpBuf(U8 *buf,U8 *map_name=NULL,
|
||||
|
||||
U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
{
|
||||
I64 i,ip2=tmpaot->buf+tmpaot->ip,*str=NULL;
|
||||
I64 i,rip2=tmpaot->buf+tmpaot->rip,*str=NULL;
|
||||
U8 *ptr;
|
||||
CCodeMisc *g_lb;
|
||||
CAOTAbsAddr *tmpa,*tmpa1;
|
||||
@@ -183,16 +183,16 @@ U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
tmpa=tmpaot->abss;
|
||||
while (tmpa) {
|
||||
tmpa1=tmpa->next;
|
||||
ptr=ip2+tmpa->ip;
|
||||
ptr=rip2+tmpa->rip;
|
||||
switch [tmpa->type] {
|
||||
case AAT_ADD_U8: *ptr(U8 *) +=ip2; break;
|
||||
case AAT_SUB_U8: *ptr(U8 *) -=ip2; break;
|
||||
case AAT_ADD_U16: *ptr(U16 *)+=ip2; break;
|
||||
case AAT_SUB_U16: *ptr(U16 *)-=ip2; break;
|
||||
case AAT_ADD_U32: *ptr(U32 *)+=ip2; break;
|
||||
case AAT_SUB_U32: *ptr(U32 *)-=ip2; break;
|
||||
case AAT_ADD_U64: *ptr(I64 *)+=ip2; break;
|
||||
case AAT_SUB_U64: *ptr(I64 *)-=ip2; break;
|
||||
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;
|
||||
@@ -214,9 +214,9 @@ U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
str=NULL;
|
||||
tmpex->type=HTT_EXPORT_SYS_SYM|HTF_IMM;
|
||||
if (tmpie->type==IET_IMM32_EXPORT||tmpie->type==IET_IMM64_EXPORT)
|
||||
tmpex->val=tmpie->ip;
|
||||
tmpex->val=tmpie->rip;
|
||||
else
|
||||
tmpex->val=tmpie->ip+ip2;
|
||||
tmpex->val=tmpie->rip+rip2;
|
||||
tmpex->src_link=tmpie->src_link;
|
||||
tmpie->src_link=NULL;
|
||||
HashAdd(tmpex,Fs->hash_table);
|
||||
@@ -249,7 +249,7 @@ U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
}
|
||||
}
|
||||
if (tmpex || g_lb) {
|
||||
ptr=tmpie->ip+ip2;
|
||||
ptr=tmpie->rip+rip2;
|
||||
switch [tmpie->type] {
|
||||
case IET_REL_I0:
|
||||
case IET_IMM_U0:
|
||||
@@ -294,7 +294,7 @@ U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
}
|
||||
Free(str);
|
||||
if (!cc->aot_depth && Bt(&cc->opts,OPTf_TRACE))
|
||||
Un(ip2,tmpaot->aot_U8s,64);
|
||||
Un(rip2,tmpaot->aot_U8s,64);
|
||||
QueRem(tmpaot);
|
||||
Free(tmpaot);
|
||||
}
|
||||
@@ -302,7 +302,7 @@ U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
U0 CmpFixUpAOTAsm(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
{
|
||||
CAOTCtrl *aotc=cc->aotc;
|
||||
I64 i,ip2=tmpaot->ip+cc->aotc->ip;
|
||||
I64 i,rip2=tmpaot->rip+cc->aotc->rip;
|
||||
U8 *ptr;
|
||||
CCodeMisc *g_lb=NULL;
|
||||
CAOTAbsAddr *tmpa,*tmpa1;
|
||||
@@ -312,19 +312,19 @@ U0 CmpFixUpAOTAsm(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
while (tmpa) {
|
||||
tmpa1=tmpa->next;
|
||||
tmpa->next=aotc->abss;
|
||||
ptr=tmpaot->buf+tmpaot->ip+tmpa->ip;
|
||||
ptr=tmpaot->buf+tmpaot->rip+tmpa->rip;
|
||||
switch [tmpa->type] {
|
||||
case AAT_ADD_U8: *ptr(U8 *)+=ip2; break;
|
||||
case AAT_SUB_U8: *ptr(U8 *)-=ip2; break;
|
||||
case AAT_ADD_U16: *ptr(U16 *)+=ip2; break;
|
||||
case AAT_SUB_U16: *ptr(U16 *)-=ip2; break;
|
||||
case AAT_ADD_U32: *ptr(U32 *)+=ip2; break;
|
||||
case AAT_SUB_U32: *ptr(U32 *)-=ip2; break;
|
||||
case AAT_ADD_U64: *ptr(I64 *)+=ip2; break;
|
||||
case AAT_SUB_U64: *ptr(I64 *)-=ip2; break;
|
||||
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->ip+=ip2;
|
||||
tmpa->rip+=rip2;
|
||||
tmpa=tmpa1;
|
||||
}
|
||||
|
||||
@@ -347,7 +347,7 @@ U0 CmpFixUpAOTAsm(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
} else
|
||||
g_lb=NULL;
|
||||
|
||||
ptr=tmpaot->buf+tmpaot->ip+tmpie->ip;
|
||||
ptr=tmpaot->buf+tmpaot->rip+tmpie->rip;
|
||||
if (g_lb) {
|
||||
i=g_lb->addr+tmpaot->buf;
|
||||
switch [tmpie->type] {
|
||||
@@ -401,12 +401,12 @@ U0 CmpFixUpAOTAsm(CCmpCtrl *cc,CAOT *tmpaot)
|
||||
case IET_IMM_I64:
|
||||
case IET_REL_I0:
|
||||
break;
|
||||
case IET_REL_I8: *ptr(U8 *) -=ip2; break;
|
||||
case IET_REL_I16: *ptr(U16 *)-=ip2; break;
|
||||
case IET_REL_I32: *ptr(U32 *)-=ip2; break;
|
||||
case IET_REL_I64: *ptr(I64 *)-=ip2; 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->ip+=ip2;
|
||||
tmpie->rip+=rip2;
|
||||
break;
|
||||
}
|
||||
tmpie->aot=NULL;
|
||||
@@ -452,7 +452,7 @@ I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv_let=0)
|
||||
while (tmpa) {
|
||||
tmpa1=tmpa->next;
|
||||
if (!(tmpa->type&IEF_IMM_NOT_REL))
|
||||
*ptr(U32 *)++ =tmpa->ip;
|
||||
*ptr(U32 *)++ =tmpa->rip;
|
||||
Free(tmpa);
|
||||
tmpa=tmpa1;
|
||||
}
|
||||
@@ -480,7 +480,7 @@ I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv_let=0)
|
||||
tmphgr=tmphg->references;
|
||||
while (tmphgr) {
|
||||
tmphgr1=tmphgr->next;
|
||||
*ptr(U32 *)++=tmphgr->ip;
|
||||
*ptr(U32 *)++=tmphgr->rip;
|
||||
Free(tmphgr);
|
||||
tmphgr=tmphgr1;
|
||||
}
|
||||
@@ -496,7 +496,7 @@ I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv_let=0)
|
||||
if (!tmpie->type || IET_REL32_EXPORT<=tmpie->type<=IET_IMM64_EXPORT) {
|
||||
QueRem(tmpie);
|
||||
*ptr++=tmpie->type;
|
||||
*ptr(U32 *)++=tmpie->ip;
|
||||
*ptr(U32 *)++=tmpie->rip;
|
||||
if (tmpie->str) {
|
||||
i=StrLen(tmpie->str);
|
||||
MemCpy(ptr,tmpie->str,i+1);
|
||||
@@ -517,8 +517,8 @@ I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv_let=0)
|
||||
QueRem(tmpie);
|
||||
*ptr++=tmpie->type;
|
||||
if (tmpie->aot)
|
||||
tmpie->ip+=tmpie->aot->ip2;
|
||||
*ptr(U32 *)++=tmpie->ip;
|
||||
tmpie->rip+=tmpie->aot->rip2;
|
||||
*ptr(U32 *)++=tmpie->rip;
|
||||
if (tmpie->str) {
|
||||
i=StrLen(tmpie->str);
|
||||
MemCpy(ptr,tmpie->str,i+1);
|
||||
|
||||
+1
-1
@@ -151,7 +151,7 @@ U8 *CmdLinePmt()
|
||||
res=MAlloc(i+1+2);
|
||||
MemCpy(res,st,i+1);
|
||||
i--;
|
||||
while (i>=0 && Bt(chars_bmp_white_space,res[i]))
|
||||
while (i>=0 && Bt(char_bmp_white_space,res[i]))
|
||||
i--;
|
||||
i++;
|
||||
if (i>0 && res[i-1]==';')
|
||||
|
||||
Binary file not shown.
+191
-193
@@ -7,8 +7,8 @@ $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,1128",BI=10$
|
||||
$LK,"CSubSwitch",A="FL:::/Compiler/PrsStmt.HC.Z,574"$
|
||||
$LK,"IsLexExpression2Bin",A="FL:::/Compiler/PrsExp.HC.Z,1129",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$
|
||||
@@ -21,163 +21,163 @@ $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,351",BI=22$
|
||||
$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,645",BI=24$
|
||||
$LK,"ICQueRem",A="FL:::/Compiler/BackC.HC.Z,399",BI=25$
|
||||
$LK,"CN_R",A="FL:::/Compiler/BackFA.HC.Z,4"$
|
||||
$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,76",BI=28$
|
||||
$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,245"$
|
||||
$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,331",BI=32$
|
||||
$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,260"$
|
||||
$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,250"$
|
||||
$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,244"$
|
||||
$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,247"$
|
||||
$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,813",BI=43$
|
||||
$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,"CN_MAIN",A="FL:::/Compiler/BackFA.HC.Z,3"$
|
||||
$LK,"PrsUnaryModifier",A="FL:::/Compiler/PrsExp.HC.Z,954",BI=48$
|
||||
$LK,"PrsUnaryModifier",A="FL:::/Compiler/PrsExp.HC.Z,955",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,251"$
|
||||
$LK,"ICPopRegs",A="FL:::/Compiler/BackLib.HC.Z,372",BI=51$
|
||||
$LK,"SLASH_OP_MUL",A="FL:::/Compiler/BackLib.HC.Z,248"$
|
||||
$LK,"SLASH_OP_NOT",A="FL:::/Compiler/BackLib.HC.Z,246"$
|
||||
$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,"NUM_INTERNAL_TYPES",A="FL:::/Compiler/CInit.HC.Z,1"$
|
||||
$LK,"SLASH_OP_POP",A="FL:::/Compiler/BackLib.HC.Z,253"$
|
||||
$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,1147",BI=53$
|
||||
$LK,"LexExpressionF64",A="FL:::/Compiler/PrsExp.HC.Z,1148",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,1133",BI=57$
|
||||
$LK,"ICQueInsRev",A="FL:::/Compiler/BackC.HC.Z,375",BI=58$
|
||||
$LK,"LexExpression",A="FL:::/Compiler/PrsExp.HC.Z,1161",BI=59$
|
||||
$LK,"LexExpressionI64",A="FL:::/Compiler/PrsExp.HC.Z,1134",BI=57$
|
||||
$LK,"ICQueInsRev",A="FL:::/Compiler/BackC.HC.Z,378",BI=58$
|
||||
$LK,"LexExpression",A="FL:::/Compiler/PrsExp.HC.Z,1162",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,373",BI=62$
|
||||
$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,132",BI=64$
|
||||
$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,337",BI=69$
|
||||
$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,391",BI=72$
|
||||
$LK,"ICDeref",A="FL:::/Compiler/BackLib.HC.Z,709",BI=73$
|
||||
$LK,"ICLea",A="FL:::/Compiler/BackLib.HC.Z,677",BI=74$
|
||||
$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,887",BI=78$
|
||||
$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,238",BI=81$
|
||||
$LK,"ICSlashOp",A="FL:::/Compiler/BackLib.HC.Z,265",BI=82$
|
||||
$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,660",BI=84$
|
||||
$LK,"Un",A="FL:::/Compiler/UAsm.HC.Z,668",BI=84$
|
||||
$LK,"PrsSizeOf",A="FL:::/Compiler/PrsExp.HC.Z,298",BI=85$
|
||||
$LK,"ICToI64",A="FL:::/Compiler/BackB.HC.Z,277",BI=86$
|
||||
$LK,"ICMod",A="FL:::/Compiler/BackA.HC.Z,461",BI=87$
|
||||
$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,578",BI=91$
|
||||
$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,426",BI=94$
|
||||
$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,263",BI=96$
|
||||
$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,344",BI=98$
|
||||
$LK,"SLASH_OP_FADD",A="FL:::/Compiler/BackLib.HC.Z,254"$
|
||||
$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,205",BI=100$
|
||||
$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,453",BI=104$
|
||||
$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,599",BI=107$
|
||||
$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,258"$
|
||||
$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,188",BI=111$
|
||||
$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,263"$
|
||||
$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,850",BI=114$
|
||||
$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,557",BI=119$
|
||||
$LK,"ICModr1",A="FL:::/Compiler/BackLib.HC.Z,135",BI=120$
|
||||
$LK,"ICModr2",A="FL:::/Compiler/BackLib.HC.Z,213",BI=121$
|
||||
$LK,"SLASH_OP_FMUL",A="FL:::/Compiler/BackLib.HC.Z,257"$
|
||||
$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,588",BI=123$
|
||||
$LK,"MemberLstDel",A="FL:::/Compiler/LexLib.HC.Z,183",BI=124$
|
||||
$LK,"SLASH_OP_FSUB",A="FL:::/Compiler/BackLib.HC.Z,255"$
|
||||
$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,249"$
|
||||
$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,261"$
|
||||
$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,504",BI=129$
|
||||
$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,536",BI=134$
|
||||
$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,515",BI=139$
|
||||
$LK,"PrsSwitch",A="FL:::/Compiler/PrsStmt.HC.Z,586",BI=140$
|
||||
$LK,"ICFDiv",A="FL:::/Compiler/BackFB.HC.Z,493",BI=141$
|
||||
$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$
|
||||
@@ -189,33 +189,33 @@ $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,348",BI=149$
|
||||
$LK,"GetOption",A="FL:::/Compiler/CMisc.HC.Z,6",BI=150$
|
||||
$LK,"PrsDoWhile",A="FL:::/Compiler/PrsStmt.HC.Z,514",BI=151$
|
||||
$LK,"ICShift",A="FL:::/Compiler/BackA.HC.Z,609",BI=152$
|
||||
$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,252"$
|
||||
$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,477",BI=158$
|
||||
$LK,"ICShiftEqu",A="FL:::/Compiler/BackA.HC.Z,639",BI=159$
|
||||
$LK,"LexExpression2Bin",A="FL:::/Compiler/PrsExp.HC.Z,1110",BI=160$
|
||||
$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,1111",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,540",BI=163$
|
||||
$LK,"ICFModEqu",A="FL:::/Compiler/BackFA.HC.Z,545",BI=164$
|
||||
$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,188",BI=168$
|
||||
$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,579"$
|
||||
$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$
|
||||
@@ -224,19 +224,20 @@ $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,408",BI=183$
|
||||
$LK,"PrsWhile",A="FL:::/Compiler/PrsStmt.HC.Z,494",BI=184$
|
||||
$LK,"ICFCmpAndBranch",A="FL:::/Compiler/BackFB.HC.Z,219",BI=185$
|
||||
$LK,"Lex",A="FL:::/Compiler/Lex.HC.Z,447",BI=186$
|
||||
$LK,"ICTestAndBranch",A="FL:::/Compiler/BackB.HC.Z,634",BI=187$
|
||||
$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,42",BI=188$
|
||||
$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$
|
||||
@@ -248,61 +249,62 @@ $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,903",BI=196$
|
||||
$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,277",BI=198$
|
||||
$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,582",BI=203$
|
||||
$LK,"ICTest",A="FL:::/Compiler/BackLib.HC.Z,394",BI=204$
|
||||
$LK,"ICModU64",A="FL:::/Compiler/BackC.HC.Z,460",BI=205$
|
||||
$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,478",BI=208$
|
||||
$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,293",BI=210$
|
||||
$LK,"ICSwap",A="FL:::/Compiler/BackC.HC.Z,487",BI=211$
|
||||
$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,385",BI=212$
|
||||
$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,606",BI=216$
|
||||
$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,259"$
|
||||
$LK,"SLASH_OP_FISTTP",A="FL:::/Compiler/BackLib.HC.Z,262"$
|
||||
$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,758",BI=221$
|
||||
$LK,"PrsFor",A="FL:::/Compiler/PrsStmt.HC.Z,537",BI=222$
|
||||
$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,912",BI=226$
|
||||
$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,299",BI=228$
|
||||
$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,328"$
|
||||
$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,415",BI=233$
|
||||
$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,467",BI=235$
|
||||
$LK,"ICBuiltInFloatConst",A="FL:::/Compiler/BackLib.HC.Z,404",BI=236$
|
||||
$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,311",BI=238$
|
||||
$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,378",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$
|
||||
@@ -311,14 +313,15 @@ $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,206",BI=248$
|
||||
$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,270",BI=250$
|
||||
$LK,"ICFlagBranch",A="FL:::/Compiler/BackB.HC.Z,682",BI=251$
|
||||
$LK,"SLASH_OP_FSUBR",A="FL:::/Compiler/BackLib.HC.Z,256"$
|
||||
$LK,"ICFPreIncDec",A="FL:::/Compiler/BackFB.HC.Z,562",BI=252$
|
||||
$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"$
|
||||
@@ -332,99 +335,94 @@ $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,331",BI=263$
|
||||
$LK,"PrsStreamBlk",A="FL:::/Compiler/PrsStmt.HC.Z,813",BI=264$
|
||||
$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,322",BI=267$
|
||||
$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,799",BI=269$
|
||||
| ||||