TempleOSCDV5.00.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:48:09 +02:00
1 parent 122df6338e
commit f6eacf7744
374 files changed
+11078 -11204

No files matched your search

+50 -49
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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$
H2@2#2#;#A#\#a#Œ#�#Ã#­#Ó#Ú#ë#ş#¨­Ó÷c÷c␍dd d,dLd.d[dadad‹d’d½dËdËdøde2e eAemeZe„e‹e¶e¶e½eáe÷e÷e÷efH>L7ÿ7ÿQÿ[ÿ_ÿcÿhÿjÿ‚ÿšÿšÿ¤ÿp©ÁGGqsz€†ˆ�”ª½ÌÑÓØâ÷␍ EW(NåNåbåƒå‡å‡å�å8åå'å,å7å@åGåIåNåd`µÙÙ$Ù(Ù5Ù7ÙDÙFÙRÙRÙ_ÙaÙnÙpÙ|Ù|Ù—Ù¥Ù¥Ù°Ù·ÙÆÙÑÙ×ÙÜÙŞÙêÙñÙÚ ÚÚÚÚ$ÚTÚzÚŠÚšÚªÚ¬Ú¼ÚÌÚÜÚÜÚáÚôÚûÚÛÛÛÛ Û Û+Û1Û7Û=ÛAÛAÛAÛnÛuÛ‹Û—Û�Û£Û©Û«Û«Û¹ÛDþ۾ÛÔÛ×ÛÚÛçÛíÛúÛıÛÜÜÜÜ ,cj‹‹‹(‹3‹>‹D‹J‹
hl––¤¹¿ P z7z7ˆ7—7³7¹7Ë7Ë7Ö7ß7å7ì7ò7 ”;\�L�L—L›L´LÎLëL MM&MJMaMaM€M�M˜M¥M¬MŞMïMóMûMûMNN"N&N␍Œ×ö.6:HNTT€–ª¸ÏÕáæô  ) + 2 2 8 8 H |1’"’"¨"±"¼"Ö"Ö"Ù"è"î"÷"ù"ÿ"#
###!#$#$#.#0 'X‰X‰f‰†‰Œ‰’‰’‰˜‰„“°ø¡ø¡ ¢¢¢¢B¢U¢\¢m¢’¢�¢¨¢ª¢µ¢Ú¢å¢ğ¢ò¢ù¢££££@£("ÇáÇáÖáíáâââ gágáváŒá’á ˆ€´€´¥´¬´Ã´Ï´Ú´ì´ı´î´ì´µ8µDµKµQµ]µgµnµuµyµ{µ�µ�µ—µ�µ¥µ©µ©µ³µ¸µÃµÕµæµ×µÕµ'¶3¶:¶@¶L¶V¶]¶d¶h¶j¶p¶|¶†¶�”¶˜¶˜¶¥¶³¶Ã¶Õ¶æ¶×¶Õ¶·'·3·:·@·L·V·]·d·h·j·p·|·†·�·”·˜·˜·¢·²·Ä·Õ·Æ·Ä·õ·ü·¸¸¸ ¸&¸*¸,¸2¸>¸H¸O¸V¸Z¸Z¸d¸r¸{¸”¸ ¸¤¸¤¸§¸°¸&¹Ôo„o„Œ„Zª”„£„Ƅфã„ê„û„……
………H…H…]…_…_…k…s…w…„…„…�…˜…œ…©…©…©…Å…Ğ…á…á…æ…ş…␍†††#†(†(†-†E†T†Y†_†j†o†o†}†††’†š†¢†ª†­†³†¸†Á†Ó†܆í†ı†ı†‡
‡‡‡‡‡ ‡ ‡ ‡&‡)‡0‡;‡P‡u‡Œ‡™‡¡‡©‡µ‡Á‡LJ·ׇÛ‡އê‡ğ‡÷‡ü‡ü‡
ˆˆˆ'ˆ'ˆ/ˆ7ˆ@ˆOˆTˆTˆ[ˆfˆlˆtˆzˆ…ˆŠˆŠˆ™ˆ¤ˆ¶ˆ¼ˆĈʈψÚˆìˆòˆúˆ‰‰‰‰ ‰*‰0‰2‰B‰H‰H‰m‰”‰™‰™‰­‰³‰ɉÚ‰à‰å‰ş‰ŠŠŠ$Š*Š/Š/ŠCŠIŠ_ŠpŠvŠ{Š”ŠšŠªŠ²ŠºŠÀŠÅŠÅŠÛŠáŠ÷Š‹‹‹"‹(‹9‹A‹I‹O‹V‹[‹[‹q‹w‹�‹�‹¤‹¦‹µ‹»‹Å‹Í‹Õ‹Û‹â‹â‹â‹ô‹ı‹ŒŒŒ#Œ#Œ1Œ9ŒJŒ]ŒdŒjŒrŒxŒˆŒ�Œ–ŒœŒœŒœŒ¡Œ¡Œ¡Œ¡Œ¡ŒÀŒÌŒÑŒÑŒàŒéŒôŒıŒ����.�4�J�[�a�f�x�~�ƒ�œ�º�º�¿�¿�Ë�Ó�Ö�Ü�â�ç�ç� ���+�1�7�7�H�f�f�k�k�w��‚�‰���”�”�´�¼�Ì�Ò�Ù�÷���&�.�1�8�>�V�^�v�~���ˆ�������­�½�É�Ñ�Ô�Û�á�ñ�� �'�/�2�9�?�W�c�~�†�‰���–�–�–�–�›�›�¤�´�Ê�Ğ�è�û�‘‘‘‘#‘?‘E‘Q‘Y‘\‘c‘i‘’‘š‘ª‘°‘·‘·‘·‘¼‘¼‘őݑó‘ù‘’$’*’/’Z’`’s’ª’¼’Ù’á’ç’ì’ì’“““)“)“.“.“H“T“`“k“k“p“p“Š“–“¢“­“­“²“²“È“ΓÚ“à“å“÷“ı“”””)”/”5”<”O”Z”c”o”w”z”€”†”‹”Ÿ”®”¶”Δ֔ٔߔå”ı”•%•?•G•J•P•V•V•g•p•|•„•‡•�•”•™•«•º••Ú•â•å•ì•ò•
––1–K–S–V–]–c–c–s–|–ˆ–�–“–™–Ÿ–¤–¸–Ç–Ï–é–ñ–ô–ú–—— —B—^—f—i—o—u—u—†—�—›—£—¦—­—³—¸—Ê—Ù—á—ü—˜˜˜˜,˜4˜V˜s˜{˜~˜…˜‹˜‹˜‹˜‹˜‹˜�˜�˜¦˜¬˜¸˜¾˜ØÕ˜Û˜à˜î˜ú˜™™™™!™'™,™>™M™U™m™u™x™™…™�™¥™Ä™Ş™æ™é™ğ™ö™ö™ö™ššš$š'š.š4šKšZšfš�š‰šŒš“š™š±š½šßšüš››››››››››,›G›M›X›]›]›p›†›Œ›—›™›™›¬›Ï›Õ›à›à›ò›û› œœ#œ3œ3œ8œ8œKœaœgœuœ„œ‰œ‰œœœ²œ¸œÆœÕœÚœÚœğœöœ�+�+�U�[�`�l�u�„�„�‰�‰�Ÿ�¥�Â�Ú�Ú��
���$�3�3�8�8�N�T�q�‰�‰�³�¹�¾�Ê�Ó�â�â�ç�ç�ı�Ÿ Ÿ8Ÿ8ŸbŸhŸjŸvŸŸŠŸŠŸŠŸŠŸ�Ÿ�Ÿ¦Ÿ·Ÿ¹ŸËŸØŸØŸØŸèŸøŸıŸ! - . 3 H e u ™ © ¯ ¯ ¯ ´ ¹ Πá  ¡/¡5¡7¡<¡M¡\¡�¡–¡œ¡�¡£¡ª¡ª¡³¡Å¡Ø¡á¡ğ¡ğ¡õ¡ú¡ ¢¢¢ ¢(¢3¢3¢T¢[¢a¢i¢t¢z¢Š¢�¢˜¢£¢©¢©¢®¢³¢º¢Á¢È¢Ï¢Ø¢ç¢ç¢ç¢ì¢ì¢ì¢ş¢£££ £(£0£6£6£6£;£;£F£W£Z£f£o£{£‚£ˆ£�£�£˜£©£¬£¸£Á£Í£Ô£Ú£ߣߣߣߣä£é£é£ô£ø£ø£¤␍¤¤¤¤¤3¤:¤@¤O¤Z¤e¤k¤w¤{¤{¤‡¤�¤“¤“¤�¤ ¤¶¤½¤äˤÖ¤á¤ç¤ñ¤ô¤ø¤ø¤¥¥
¥ ¥¥¥$¥'¥'¥2¥4¥R¥Y¥d¥o¥r¥x¥}¥}¥ˆ¥Œ¥Œ¥˜¥¡¥¤¥¤¥¯¥±¥Ç¥Î¥Ô¥ã¥î¥ù¥ÿ¥ ¦¦¦¦$¦'¦'¦2¦4¦J¦Q¦W¦_¦j¦u¦{¦…¦ˆ¦Œ¦Œ¦”¦›¦�¦ ¦«¦¯¦¸¦»¦»¦ƦȦæ¦í¦ø¦§§ §§§#§'§'§3§<§?§?§J§L§b§i§o§�§Œ§—§�§¢§¢§­§²§²§½§§§ͧЧÔ§Û§à§å§ê§ê§ş§¨¨¨¨%¨-¨1¨E¨L¨P¨P¨]¨i¨q¨w¨‡¨‹¨œ¨®¨¹¨½¨½¨ʨÒ¨Ú¨à¨à¨à¨à¨à¨â¨â¨ğ¨÷¨©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©© © ©7©?©K©K©l©{©“©•©¡©®©®©Ñ©Ş©é©ò©û©ª␍ª␍ªªªª,ªJªVªVªƒ¬xİ÷R5R5d5f5j5s55‹5 5 5Ï5Ó5Ø5ä5÷566666$6l_vÇÇİìñ€ó€€€%€:€'€I€O€h€�€š€³€Ì€Ö€„�pp%p-p3p:pApCpFpMpTpTpepipopop„p�p�p–p¯pÒpópøpqq*q5q:qJqMqaqgqlqrqtqzq}qƒqˆq‹q“qœq¬qÏqİqõqúqşq#r6r;rIrarfrjr�rŸrÂrÕrÚràrårèrêrğrörürsssss"s0sHsMsQsvs†s©s¼sÁsÑsôstt t#tHt[t[tvtvtvt„tœt�t�t�t¬tÄtÆtÆtÔtìtìtştştuu*uJuduluwuŠu�u�u�u•u›uµu½uÈuãuåuëuv␍vv&v1v1vKvH…“¨†¨†¿†Õ†å†ì†‡‡0‡4‡w‡L��ç�ç�û�‚‚
‚-‚/‚H‚a‚l‚w‚‚4IR�Ø�ؚؗؗبضعؾØì=ıı?ıBı`ıwıˆıˆı£ı©ı®ı®ıÉıÏıÔıÔıİıëış ş%ş,ş2ş4şQşaşfşmşsşuşuşˆş�ş�ş�ş�ş“ş¯ş¿şÑşÖşÖşÖşİşäşëşÿÿ#ÿ#ÿ5ÿÌL»¸¦¸¦Ò¦İ¦è¦ñ¦ù¦ü¦§§§#§'§-§;§X§e§t§y§…§Š§‘§�§¢§¥§¯§§§¿§È§Ù§×§Ï§ç§ğ§ö§ö§¨¨¨$¨-¨4¨8¨=¨T¨l¨u¨ƒ¨Ÿ¨«¨«¨Ã¨Ô¨Ô¨Û¨ô¨©©©"©6©?©F©J©U©Z©a©~©«©²©¶©¸©Ã©Ï©Ó©è©ê©û©ªªª)ª8ªQªQªTª\ªaªãªPw‡'O'OCOTOgO~O›O¶O¼OÅOÓOÙOÜOèOŒ ¨b¨b¸bÜbÜbêbêbêbêbóbóbúbc*c2c2c=c=cKc[c[cicococ‡c‡c�c³c (kqP‹P‹^‹j‹z‹�‹‡‹ @KW¿ë¿ëÍëÕëÜëûëìì ì␍ìì!$/4oâoâ|â‘â–âœâ"$).?â?âLâaâfâlâ#$#(âââ4â9â?â$€ïK**4DZbl‡Œœ²ºÄßäú   " , 6 @ J T ^ h r | ’ œ ¦ ° º Ä Î Ø â ø  " , 6 @ J T ^ h r | † � š ¤ ® ¸ Â Ì Ö à ê ô ş !!!&!0!:!D!N!\!%¤Cø�ø���*�;�M�O�V�\�l�w���Œ�£�¦�¨�º�À�Ğ�Ú�ä�ë�ö� ŸŸŸ)Ÿ)Ÿ)Ÿ=Ÿ&$5:ŸâŸâ­âÂâÇâÍâ'¤Di@Ÿ@ŸVŸ]ŸrŸƒŸ•Ÿ—Ÿ�Ÿ¤Ÿ´Ÿ¿ŸÉŸÔŸëŸîŸğŸ    # - 4 ? S [ [ q q q † ((&,ò/ò/00000)0]e'N'N=NPN_NeNhNpN*  ßn%n%�%˜%�%«%²%Î%Ô%Ô%Ô%á%ã%î%ø%ÿ%&& &)&/&@&@&K&U&U&g&m&}&ƒ&ˆ&�&�&°&¶&È&Û&á&ä&ê&ê&ì&ò&ø&ú&ú&ú& ''''/'9'9'M'V'\'b'x'}'…'›'Ÿ'Ÿ'§'­'³'½'Ä'Ë'Ô'æ'æ' ((((-(@(F(J(P(V(\(\(^(b(h(n(t(y(y(y(y(¤(µ(µ(Ì(Ù(İ(å(÷())) )$)*)*)<)M)b)v)~)�)“)¤)¨)®)Ç)É)Ï)Ü)Ş)ê)***<*G*M*S*Y*b*h*z*‹*“*—*¨*¬*²*Ë*Í*Ó*à*â*î* ++++'+-+J+=+d+m+s+s+ˆ+�+�+”+�+³+¸+¸+¸+Õ+×+ô+ö+,,!,%,,,O,U,[,g,~,…,‹,–,›,›,¢,¦,°,¾,À,È,Í,Õ,à,æ,õ,ú,--␍--!-8-H-U-`-|-~-š-š-¡-¶-»-Ä-Ñ-Ö-Ü-á-á-è-ì-ö-..... .,.3.7.?.G.O.a.o.t.€.€.ˆ.ˆ.«.«.¹.¿.Ä.È.Í.Í.Í.Í.Ó.Õ.Õ.ø.ş./ /!/#/#/#/./././3/\0+4-vfÊfʀʄʜʤʬʶʺÊÁÊÇÊÛÊãÊèÊëÊöÊË ËË Ë!Ë7Ë>ËEËPË[Ë]ËhËsËuË�ËŠËŠË Ë«ËÃËÉËÒËãËéËòËÌ
Ì
ÌÌÌ!Ì&Ì8ÌCÌGÌUÌWÌ[ÌjÌjÌjÌ{Ì{̘̀̒ÌÍ,Ô@–æ–æ¬æ³æ¶æÚæÚæ÷æ
çç0ç5ç5çSçaçtç‡ç�ç�ç‘ç‘ç‘ç¤ç¦ç¦ç¦ç­çÀçÓçÓçÓçæçñçèè è#è*è?èRèYèYè\è�è-LAP$$$!$-$H$M$m$o$Š$¥$¥$­$´$Û$.P~�؋؋æ‹ó‹ŒŒŒ,Œ9ŒGŒYŒdŒrŒxŒ~Œ/4
77(747E7W7`7n7t70|ºU– – ¸ ¿ Í Ø ş ş     < C C R a } ˆ ˆ • � ® · Õ à â û ␍ ␍␍.␍7␍B␍G␍M␍T␍|␍�␍�␍˜␍˜␍Ÿ␍®␍Å␍Å␍Ô␍İ␍ñ␍ø␍ÿ␍CLSXco~’—Ÿ«½½Ùàèø
(.BGWk}‚’¥­Áßöú9KQ\hxˆ�——©­¹Ğìş+;MSSXZZ__ntzz~÷1ŒÄãÜÜ2Ü>ÜBÜFÜMÜTÜcÜnÜtÜyÜ{܇Ü�ܖܜܢܦܦܼܵÜÄÜÊÜĞÜÒÜÒÜŞÜ28 */*/8/>/J/U/f/p/w/}/3@t€ í í-í8í?í^íkíkínípíví4ÌSÇ Ç í 




$LK,"PrsNoWarn",A="FL:::/Compiler/PrsStmt.HC.Z,791",BI=269$
H2@2#2#;#A#\#a#Œ#�#Ã#­#Ó#Ú#ë#ş#¨­ÓŸ`Ÿ`µ`½`È`Ô`ô`Ö`a a a3a:aeasasa aÂaÚaÇaéabb,b3b^b^beb‰bŸbŸbŸb©bH>L�ı�ı©ı³ı·ı»ıÀıÂıÚıòıòıüıp©ÁŸŸÉËÒØŞàæì$)+0:Oex�¯(åå2åSåWåWå_å8îäîä÷äüäåååååd`µÖØÖØôØøØÙÙÙÙ"Ù"Ù/Ù1Ù>Ù@ÙLÙLÙgÙuÙuـهٖ١٧٬ٮٺÙÁÙĞÙÛÙáÙæÙèÙôÙ$ÚJÚZÚjÚzÚ|ڌڜڬڬڱÚÄÚËÚÒÚÒÚÒÚÒÚÙÚïÚûÚÛÛ␍ÛÛÛÛ>ÛEÛ[ÛgÛmÛsÛyÛ{Û{Û‰ÛDÃ�Û�Û¤Û§ÛªÛ·Û½ÛÊÛÍÛĞÛÖÛØÛâÛ ,cjàŠàŠîŠøŠ‹‹‹‹
imfft‰� P ‚7‚7�7Ÿ7»7Á7Ó7Ó7Ş7ç7í7ô7ú7 ”;\÷K÷KÿKLL6LSLtL}L�L²LÉLÉLèL÷LM␍MMFMWM[McMcMvM†MŠM�M␍Œ×öŞŞş
$$PfzˆŸ¥±Äàéùû     |1’"’"¨"±"¼"Ö"Ö"Ù"è"î"÷"ù"ÿ"#
###!#$#$#.#0 '(‰(‰6‰V‰\‰b‰b‰h‰„“°È¡È¡Ü¡ã¡ê¡î¡¢%¢,¢=¢b¢m¢x¢z¢…¢ª¢µ¢À¢Â¢É¢Ò¢Ô¢ß¢æ¢£("·à·àÆàİàøàøàşà WàWàfà|à‚à ˆP´P´u´|´“´Ÿ´ª´¼´Í´¾´¼´í´µµµ!µ-µ7µ>µEµIµKµQµ]µgµnµuµyµyµƒµˆµ“µ¥µ¶µ§µ¥µÖµ÷µ
&¶-¶4¶8¶:¶@¶L¶V¶]¶d¶h¶h¶u¶ƒ¶“¶¥¶¶¶§¶¥¶Ö¶÷¶·
···&·-·4·8·:·@·L·V·]·d·h·h·r·‚·”·¥·–·”·Å·Ì·Ò·Ş·è·ï·ö·ú·ü·¸¸¸ ¸&¸*¸*¸4¸B¸K¸d¸p¸t¸t¸w¸€¸ö¸ÔoƒoƒŒƒZ©”ƒ£ƒƃуãƒêƒûƒ„„
„„„H„H„]„_„_„k„s„w„„„„„�„˜„œ„©„©„©„ńЄá„á„æ„ş„␍………#…(…(…-…E…T…Y…_…j…o…o…}…†…’…š…¢…ª…­…³…¸…Á…Ó…Ü…í…ı…ı…†
††††† † † †&†)†0†;†P†u†Œ†™†¡†©†µ†Á†džΆ׆Û†ކê†ğ†÷†ü†ü†
‡‡‡'‡'‡/‡7‡@‡O‡T‡T‡[‡f‡l‡t‡z‡…‡ЇЇ™‡¤‡¶‡¼‡ćʇχÚ‡ì‡ò‡ú‡ˆˆˆˆ ˆ*ˆ0ˆ2ˆBˆHˆHˆmˆ”ˆ™ˆ™ˆ­ˆ³ˆɈÚˆàˆåˆşˆ‰‰‰$‰*‰/‰/‰C‰I‰_‰p‰v‰{‰”‰š‰ª‰²‰º‰À‰ʼnʼnÛ‰á‰÷‰ŠŠŠ"Š(Š9ŠAŠIŠOŠVŠ[Š[ŠqŠwŠ�Š�ФЦелŠÅŠÍŠÕŠÛŠâŠâŠâŠôŠıŠ‹‹‹#‹#‹1‹9‹J‹]‹d‹j‹r‹x‹ˆ‹�‹–‹œ‹œ‹œ‹¡‹¡‹¡‹¡‹¡‹À‹Ì‹Ñ‹Ñ‹à‹é‹ô‹ı‹ŒŒŒŒ.Œ4ŒJŒ[ŒaŒfŒxŒ~ŒƒŒœŒºŒºŒ¿Œ¿ŒËŒÓŒÖŒÜŒâŒçŒçŒ ���+�1�7�7�H�f�f�k�k�w��‚�‰���”�”�´�¼�Ì�Ò�Ù�÷���&�.�1�8�>�V�^�v�~���ˆ�������­�½�É�Ñ�Ô�Û�á�ñ�� �'�/�2�9�?�W�c�~�†�‰���–�–�–�–�›�›�¤�´�Ê�Ğ�è�û�����#�?�E�Q�Y�\�c�i�’�š�ª�°�·�·�·�¼�¼�Å�İ�ó�ù�‘$‘*‘/‘Z‘`‘s‘ª‘¼‘Ù‘á‘ç‘ì‘ì‘’’’)’)’.’.’H’T’`’k’k’p’p’Š’–’¢’­’­’²’²’È’Î’Ú’à’å’÷’ı’“““)“/“5“<“O“Z“c“o“w“z“€“†“‹“Ÿ“®“¶“ΓÖ“Ù“ß“å“ı“”%”?”G”J”P”V”V”g”p”|”„”‡”�”””™”«”º””Ú”â”å”ì”ò”
••1•K•S•V•]•c•c•s•|•ˆ•�•“•™•Ÿ•¤•¸•Ǖϕé•ñ•ô•ú•–– –B–^–f–i–o–u–u–†–�–›–£–¦–­–³–¸–Ê–Ù–á–ü–————,—4—V—s—{—~—…—‹—‹—‹—‹—‹—�—�—¦—¬—¸—¾—×Õ—Û—à—î—ú—˜˜˜˜!˜'˜,˜>˜M˜U˜m˜u˜x˜˜…˜�˜¥˜Ęޘæ˜é˜ğ˜ö˜ö˜ö˜™™™$™'™.™4™K™Z™f™�™‰™Œ™“™™™±™½™ß™ü™šššššššššš,šGšMšXš]š]špš†šŒš—š™š™š¬šÏšÕšàšàšòšûš ››#›3›3›8›8›K›a›g›u›„›‰›‰›œ›²›¸›Æ›Õ›Ú›Ú›ğ›ö›œ+œ+œUœ[œ`œlœuœ„œ„œ‰œ‰œŸœ¥œœÚœÚœ�
���$�3�3�8�8�N�T�q�‰�‰�³�¹�¾�Ê�Ó�â�â�ç�ç�ı�� �8�8�b�h�j�v��Š�Š�Š�Š�����¦�·�¹�Ë�Ø�Ø�Ø�è�ø�ı�!Ÿ-Ÿ.Ÿ3ŸHŸeŸuŸ™Ÿ©Ÿ¯Ÿ¯Ÿ¯Ÿ´Ÿ¹ŸΟ០ / 5 7 < M \ � – œ � £ ª ª ³ Å Ø á ğ ğ õ ú  ¡¡¡ ¡(¡3¡3¡T¡[¡a¡i¡t¡z¡Š¡�¡˜¡£¡©¡©¡®¡³¡º¡Á¡È¡Ï¡Ø¡ç¡ç¡ç¡ì¡ì¡ì¡ş¡¢¢¢ ¢(¢0¢6¢6¢6¢;¢;¢F¢W¢Z¢f¢o¢{¢‚¢ˆ¢�¢�¢˜¢©¢¬¢¸¢Á¢Í¢Ô¢Ú¢ߢߢߢߢä¢é¢é¢ô¢ø¢ø¢£␍£££££3£:£@£O£Z£e£k£w£{£{£‡£�£“£“£�£ £¶£½£ãË£Ö£á£ç£ñ£ô£ø£ø£¤¤
¤ ¤¤¤$¤'¤'¤2¤4¤R¤Y¤d¤o¤r¤x¤}¤}¤ˆ¤Œ¤Œ¤˜¤¡¤¤¤¤¤¯¤±¤ǤΤÔ¤ã¤î¤ù¤ÿ¤ ¥¥¥¥$¥'¥'¥2¥4¥J¥Q¥W¥_¥j¥u¥{¥…¥ˆ¥Œ¥Œ¥”¥›¥�¥ ¥«¥¯¥¸¥»¥»¥Æ¥È¥æ¥í¥ø¥¦¦ ¦¦¦#¦'¦'¦3¦<¦?¦?¦J¦L¦b¦i¦o¦�¦Œ¦—¦�¦¢¦¢¦­¦²¦²¦½¦¦¦ͦЦÔ¦Û¦à¦å¦ê¦ê¦ş¦§§§§%§-§1§E§L§P§P§]§i§q§w§‡§‹§œ§®§¹§½§½§ʧÒ§Ú§à§à§à§à§à§â§â§ğ§÷§¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨ ¨7¨?¨K¨K¨l¨{¨“¨•¨¡¨®¨®¨Ѩިé¨ò¨û¨©␍©␍©©©©,©J©V©V©�«xİ÷Z5Z5l5n5r5{5‡5“5¨5¨5×5Û5à5ì5ÿ5 6 666"6,6lbyg|g|}|Œ|‘|¦|“|µ|¸|¸|Å|Ú|Ç|é|ï|}!}:}S}l}v}„�§l§lÅlÍlÓlÚlálãlælílôlôlm mmm$m.m.m6mOmrm“m˜m¹m¾mÊmÕmÚmêmímnn nnnnn#n(n+n3n<nLnon}n•nšn�nÃnÖnÛnénoo
o/o?obouozo€o…oˆoŠo�o–oœo¡o§o¯o¯o¹oÂoĞoèoíoñop&pIp\papqp”p¢pºp¿pÃpèpûpûpqqq$q<q>q>q>qLqdqfqfqtqŒqŒq�q�q¦q³qÉqéqr rr)r-r-r-r4r:rTr\rgr‚r„rŠr¤r¬r·rÅrĞrĞrêrH�›x†x†�†¥†µ†¼†Ó†î†‡‡G‡L’¡‡~‡~›~¨~¾~ª~Í~Ï~è~  4IR^Ø^ØgØgØjØx؆؉Ø�Øì=oûoû—ûšû¸ûÏûàûàûûûüüü!ü'ü,ü,ü5üCü`üxü}ü„üŠüŒü©ü¹ü¾üÅüËüÍüÍüàüæüæüæüöüëüıı)ı.ı.ı.ı5ı<ıCıXı_ı{ı{ı�ıÌM¼ˆ¦ˆ¦¢¦­¦¸¦Á¦É¦Ì¦Ó¦×¦à¦ó¦÷¦ı¦ §(§5§D§I§U§Z§a§m§r§u§§w§�§˜§©§§§Ÿ§·§À§Æ§Æ§Ô§×§ë§ô§ı§¨¨␍¨$¨<¨E¨S¨o¨{¨{¨“¨¤¨¤¨«¨Ä¨Ğ¨Ø¨ë¨ò¨©©©©%©*©1©N©{©‚©†©ˆ©“©Ÿ©£©¸©º©Ë©Õ©à©ê©ù©ª!ª!ª$ª,ª1ª³ªPw‡�N�N«N¼NÏNæNOO$O-O;OAODOPOŒ xbxbˆb¬b¬bºbºbºbºbÃbÃbÊbåbúbcc␍c␍cc+c+c9c?c?cWcWc]cƒc (kq ‹ ‹.‹:‹J‹Q‹W‹ @^j7ë7ëEëMëTësë€ë€ëƒë…ë‹ë!$/4_á_álá�á†áŒá"$)./á/á<áQáVá\á#$#(ÿàÿàá$á)á/á$€ïK**4DZbl‡Œœ²ºÄßäú   " , 6 @ J T ^ h r | ’ œ ¦ ° º Ä Î Ø â ø  " , 6 @ J T ^ h r | † � š ¤ ® ¸ Â Ì Ö à ê ô ş !!!&!0!:!D!N!\!%¤CÈ�È�Ş�å�ú� �� �&�,�<�G�Q�\�s�v�x�Š��� �ª�´�»�Æ�Û�ã�ã�ù�ù�ù�␍Ÿ&$5:�á�á�á²á·á½á'¤DiŸŸ&Ÿ-Ÿ4ŸBŸSŸeŸgŸnŸtŸ„Ÿ�Ÿ™Ÿ¤Ÿ»Ÿ¾ŸÀŸÒŸÙŸéŸóŸıŸ  # + + A A A V ((&,ú/ú/000 0%0)0]e�M�M¥M¸MÇMÍMĞMØM*ä Õ>%>%`%h%n%{%‚%�%¤%¤%¯%¹%¹%Æ%Ï%Ş%é%ï%ù%ÿ%&&&%&%&7&=&M&S&X&_&_&€&†&˜&«&±&´&º&º&¼&Â&È&Ê&Ê&Ê&Û&å&ê&ê&ÿ& ' ''&','2'H'M'U'k'o'o'w'}'ƒ'�'”'›'¤'¶'¶'Û'ß'å'ë'ı'((( (&(,(,(.(2(8(>(D(I(I(I(I(t(…(…(œ(©(­(µ(Ç(ç(ç(í(ğ(ô(ú(ú( ))2)F)N)_)c)i)v)x)„)¢)¨)³)Ö)á)ç)í)ó)ü)**%*-*1*7*D*F*R*p*v*|*‚*‹*‘*®*¡*È*Ñ*×*×*ì*ñ*ñ*ø*+++++9+;+X+Z+w+}+…+‰+�+³+¹+¿+Ë+â+é+ï+ú+ÿ+ÿ+,
,,",$,,,1,9,D,J,Y,^,d,i,q,v,…,œ,¬,¹,Ä,à,â,ş,ş,-- -(-5-:-@-E-E-L-P-Z-h-j-r-v-z-„-�-—-›-£-«-³-Å-Ó-Ø-ä-ä-ì-ì-...#.(.,.1.1.1.1.7.9.9.\.b.h.o.….‡.‡.‡.’.’.’.—.À/+4.w6Ê6ÊPÊTÊlÊtÊ|Ê†ÊŠÊ‘Ê—Ê«Ê³Ê¸Ê»ÊÆÊÑÊÙÊäÊïÊñÊËËË Ë+Ë-Ë8ËCËEËQËZËZËpË{˓˙ˢ˳˹ËÂËÔËÚËÚËâËæËñËöËÌÌÌ%Ì'Ì+Ì:Ì:Ì:ÌKÌKÌPÌbÌhÌÖÌ,Ô@fæfæ|æƒæ†æªæªæÇæÚæíæççç#ç1çDçWç_ç_çaçaçaçtçvçvçvç}ç�ç£ç£ç£ç¶çÁçÔçêçïçóçúçè"è)è)è,èQè-LAP$$$!$-$H$M$m$o$Š$¥$¥$­$´$Û$.P~�¨‹¨‹¶‹Ã‹Ñ‹ã‹î‹ü‹ ŒŒ)Œ4ŒBŒHŒNŒ/4
"7"707<7M7_7h7v7|70|»Vf f ˆ � � ¨ Î Î × Ù Ù à    " 1 M X X e m ~ ‡ ¥ ° ² Ë Ñ Ü ì ş ␍␍␍␍$␍L␍Q␍_␍h␍h␍o␍~␍•␍•␍¤␍­␍Á␍È␍Ï␍Ô␍ß␍å␍í␍#(3?Nbgo{��©°¸ÈÚàééøş';MRbu}‘¯ÆÊÖí !,8HX^ggy}‰ ¼ÎÔßëû ##(**//>DJJNÇ1ŒÄãæÛæÛÜÜÜÜÜ$Ü3Ü>ÜDÜIÜKÜWÜ^ÜfÜlÜrÜvÜv܅܌ܔܚܠܢܢܮÜ28 2/2/@/F/R/]/n/x//…/3@‡“—ì—ì¥ì°ì·ìÖìãìãìæìèìîì4ÜS  EX_fmsu|ƒ††˜˜ªµÉÑÚâçí  ( - F ^ b b g p z � – Ÿ § ¬ ³ Å Õ ê ì 

$
+
.
.
@
@
R
]
q
y
‚
Š
�
•
«
»
Ğ
Õ
î
 

  " 6 > G O T [ m } ’ ” ­ Å É É İ å î ö û   ' < A Z r v ‰ ‰ ‰ � ° Ò İ ã û ␍␍#␍7␍?␍H␍P␍R␍X␍j␍z␍�␍‘␍ª␍Â␍Æ␍Æ␍Ú␍â␍ë␍ó␍ø␍ÿ␍%:?Xpt‡‡‡Œ®ĞÛáù#-8JZqˆŸÉäää##,6C]kr…‡¦µ®Íİ÷÷5D{ˆ.BKQccgjr6\ObhŠhŠˆŠ—Š Š©Š­Š±Š½ŠÂŠÇŠÇŠØŠÜŠäŠüŠÿŠ ‹70üöäöäÿäå␍åååå8tÚ‡‡©°·ÂØØêJ$Yp�•™�³ËĞØÜîá␍!%%*;ƒ]’°»ÁÕíò $+=Mce~–šš¯ÇÌÔØçÚ----@FPWj……¡±¿¿Óáï;JCbryа¡ÖØMR]cn�ª—¹Ğáü*L�n�®¹¿Óëğ ");Kac|”˜˜ºÓçëúúú␍$7RRRn~ŒŒ ®Ç¼Úíò   8 H Y w w ™ ™   à à à ã 9DmzÆÆÖêóù  :lw�×€×€í€ü€���%�(�(�5�J�7�Y�_�x�‘�ª�Ã�Ü�æ�;<‰”vv†— ¦ªµ<”)FïFïNïRï^ïoïqï�ïŒï�ï©ï´ïÃïÔïÛïôïøï ğ ğğğ-ğ6ğDğXğtğyğ–ğ=d(=˜‰˜‰¤‰¸‰»‰Ï‰×‰Û‰å‰ï‰÷‰ú‰Š>4u¾8G8G^GaGeGrG{G†G–G�G¨GĞGĞGàGåGåGõGúGúG
HHH H$H$H4H9H9HIHNHNH^HcHcHsHxHxHˆH�H�H�H�H™H²HÀH×HêHìHòHôH÷HI␍I␍II#I#I.I>IKIcIkIqIqI…I…I�I‘IQJ?Ä n‡¬‡¬¤¬¬¬¯¬½¬ˬà¬é¬­­/­:­K­O­a­d­o­x­„­—­È­½­£­Ø­ï­®®®>®S®w®‹®�®®®”®É®Ì®Ñ®Ô®Ô®Û®ñ®ø®¯
¯¯&¯9¯9¯Q¯U¯‚¯‚¯š¯Ÿ¯Ÿ¯¯¯³¯įί߯é¯ü¯°°°°&°0°A°K°^°j°o°o°o°‘°¢°§°´°ɰɰΰذç°ì°ò°÷°÷°ü°±±± ±%±%±+±1±6±6±>±Q±]±j±v±…±�±•±�±µ±ɱÚ±ç±ì±²².²;²C²R²\²b²k²t²t²y²y²y²y²y²‰²‰²‰²¡²·²¿²Ú²ë²ø²ú²³ ³ ³ ³³%³*³*³1³?³D³\³h³z³†³Œ³”³š³£³ɳÕ³Û³á³ğ³ø³´-´>´K´M´[´[´`´`´g´u´z´�´™´¥´«´±´º´¿´¿´¿´¿´¿´×´Ü´Ü´Ü´Ü´Ü´í´í´í´í´í´í´í´í´í´í´µµ#µ>µOµ\µ^µkµ{µ€µ€µ€µ‰µ£µ¯µ´µÖµâµâµçµçµçµçµçµçµçµçµüµ)¶;¶S¶h¶‰¶ª¶µ¶ƶ˶˶˶Ô¶ú¶···;·T·\·d·r·œ·¥·«·Ì·å·å·å·å·å·¸@¸I¸O¸U¸Z¸c¸l¸q¸q¸q¸q¸€¸”¸²¸¸ȸ͸͸à¸ô¸¹-¹3¹3¹8¹8¹G¹[¹y¹‰¹�¹”¹”¹§¹»¹á¹ô¹ú¹ú¹ÿ¹ÿ¹ÿ¹º-º5ºPºaºnºpºº�º�º�º�º�º•º•º•º•º•º•º•º•º•º•º•º•º•º•º•º•º¤º³º¾ºÀºÀºɺ˺˺ߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺߺáºáºøº» » »»»%»A»Y»h»t»Š»¤»§»±»½»ã»¼#¼G¼I¼\¼мb¼¥¼¥¼¨¼¸¼À¼Û¼ì¼ï¼ ½½#½;½;½f½i½x½Œ½­½Á½ݽɽù½¾,¾a¾_¾T¾I¾:¾o¾o¾o¾r¾w¾z¾”¾¢¾оò¾ò¾¿ ¿/¿C¿d¿x¿”¿€¿°¿°¿οÀÀö¿ë¿Ü¿ÀÀÀÀÀÀ À0ÀQÀ]À°Ã@À„°7È7ÈMÈQÈ\ÈcÈnȂȂÈ�È�ȥȲȾÈËÈÏÈàÈàÈéÈîÈöÈÉÉ#É.ÉAÉAÉYÉYÉtɠɠɴɶɶÉÀÉÈÉÈÉÒÉÚÉÚÉÚÉëÉëÉëÉñÉùÉÿÉÊÊ
ÊÊÊÊ!Ê!Ê7ÊGÊQÊ`ÊeÊmÊmÊrÊrÊyÊ�ÊŸÊ©Ê±Ê·ÊÆÊËÊÓÊÙÊÙÊŞÊåÊğÊ$Ë3Ë=ËEËKË`ËfËkËkËkËkËkËkËkËkËkËv˄˔˚ˢ˱˶ËÃËËËĞËĞËĞËØËáËêË÷ËÿË ÌÌJÌRÌaÌkÌ…Ì‹Ì�Ì�̗̪̲ÌÇÌÏÌ×ÌìÌîÌùÌÍÍÍÍ/Í7Í>ÍDÍJÍNÍWÍ\Í€ÍŒÍ”Í©ÍµÍºÍÆÍÑÍÖÍÖÍÖÍìÍ ÎÎÎ'Î/Î7ÎLÎQÎ\ÎdÎyÎ~Î~΢ήζÎËÎ×ÎÜÎèÎóÎøÎøÎøÎøÎøÎøÎÏÏÏÏÏÏÏÏÏÏÏÏÏÏ Ï.Ï>ÏDÏLÏ[Ï`ÏhÏpÏrÏzωÏ�Ï—ÏŸÏ¡Ï©ÏÆÏÏÏ×ÏßÏæÏúÏĞ ĞĞĞ(Ğ0Ğ>ĞCĞHĞZĞ�ЖХЯĞÉĞÑĞÖĞÖĞÖĞßĞèĞëĞõĞÑÑÑ)Ñ;Ñ;Ñ;ÑFÑKÑhÑmÑmÑvÑ{Ñ{Ñ{Ñ{Ñ{Ñ{Ñ{Ñ{Ñ{Ñ{Ñ{Ñ{Ñ{Ñ{Ñ{Ñ{цђѪѽÑÅÑÔÑÙÑáÑèÑõÑşÑÒÒÒÒÒ#Ò+ÒIÒQÒTÒVÒfÒpÒpÒpÒrÒ‡Ò˜Ò›Ò�Ò¦Ò«Ò«Ò´Ò¹ÒÁÒÈÒÕÒêÒñÒÓÓ+ÓDÓYÓnÓuÓuÓzÓzÓzÓzÓzÓzÓzÓ‚Ó�Ó™Ó¨Ó­Ó­ÓµÓ½ÓÊÓÏÓÏÓÏÓÓÓØÓØÓèÓíÓíÓíÓùÓÔÔÔÔ,Ô;ÔCÔTÔ\ÔÔ…ÔŒÔ�Ô”Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô›Ô�Ô�Ô¸ÔÂÔĞÔĞÔÕÔàÔçÔÕÕÕÕÕ Õ=ÕKÕA×Ax[G×G×]×d×k×v×}×�טןש׼×Ä×Ä×ß×ù×ÿ×ØØØØ&Ø-Ø0Ø5Ø@ØJØ\ØbØxØØ‡Ø�ؤؤؤزØÙØâØêØüØÙÙÙÙÙ+Ù1ÙGÙNÙVÙ]Ùrككييي٘ٿÙÌÙÕÙİÙïÙ÷Ù÷Ù÷ÙÚ␍Ú␍ÚÚÚ5ÚAÚ†ÚBt`¹—İ—İ¯İ¿İÆİÍİØİëİîİöİıİŞŞŞ)Ş4Ş7ŞBŞXŞcŞnŞyބދŞ�ުŞÇŞĞŞØŞøŞûŞßßßß#ß2ß8ß@ß@ßLßZßißq߀߈߫߱߷߹߿ßÅßÅßÅßêßïß àààà#à'à2àLàXàhà{à—à¬à´à¾àİàñàñàeáC ?C11‰1‘1–1DÑÒÿZÿZ [+[<[+[V[d[d[t[}[„[ˆ[‘[‘[™[�[½[Ë[×[İ[è[ \ \\(\.\5\:\:\M\X\i\t\\†\�\�\�\¯\´\´\Â\Ç\Ç\Ø\Ø\ë\ğ\]]]%]9]9]>]>]L]Q]Q]V]]]e]l]n]v]}]}]Œ]’]Ÿ]¦]®]Ò]Ò]Ú]é]ô]û]ı]^ ^%^*^*^*^=^B^Q^X^a^v^Š^Š^�^�^—^­^²^Æ^Í^Ò^Ò^Ş^í^ÿ^_)_4_N_`_r_�_ _«_°_¿_Ó_Ú_á_ô_ö_```'`5`E`L`c`j`v`‡`�` `¬`·`¹`¹`Ä`Ø`å`í`ï`aaa-a;a]adapa�a�a�a–a¡a¥a­a±a¹aÀaĞaÛaùaşabbb#b(b(b7bDbRb]bhbvb|b‚bˆb‘b—b¦b¾bÆbÒbàb÷bùbc␍ccc9c?cEcKcTcecŒc”c�c¬cÄcËc×cæcûcûcd␍d d%d%d%d%d/eEDQ^GG[h~j��§¿ÇFœfÉ¿U¿UáUëUV"V-VFVKVOVWV`VoVvVV„V™VªVÉVÑVÓVòVúV WWW!W(W0W6W8WIWNWdWPWsWyWyW�WŠW™W¸W¿WÁWàWçWçWçWşWXXX%X;X0XSXXXiXnX„XpX“X™X X¨X®X°XÁXÆXÜXÈXëXñXñXùXYY Y Y$YTY]YiYmY{Y‘Y†Y©Y©Y»YG ;zÏâÏâîâ÷âúâ ã"ã$ã-ã2ãSãqã€ã�ã²ãÊãÑã÷ãä$äAäRäiämämäqävä{ä…äˆä’ä—ä°ä³ä³ä³ä³ä¸ä¾äÚäèäôäıäåå"å>åIåUå^årårå�å†å†å”åHP‡—�C�C°C�CÒC¿CáCğCøCDDDDD=DCDIPÅÕgügü{ü€ü�ü�ü–üÃüÙüÅüöüèüııJŒ¥Äßúßúû>û>ûQûUûwû‹û�û�û—ûŸû§û¼ûÈûÙûŞûïûüü
ü
ü
ü&üDüDüaüKP�­·=·=à=â=ğ=ö=> >/>>>L>W>Z>j>Lè7Ÿ0Ÿ0Ê0Í0Ğ0Ö0Û0ò0 1 1D1`1c1‚1œ1®1»1Ñ1ä1é1ô1ü1ü12222+212P2o2q2†2Œ2«2Ê2Ò2İ2İ2ç2ç2ù273O3a3M$ g]g]’]{]œ]¤]NLw†ÍÍÍ-Í>ÍOÍVÍ^ÍnÍyÍŠÍ�ÍÂÍOTHY`e`erete}e†e”e™e¢e¥eªe¸eÂeÅeÏeP¨!G¸c¸cÈcÑcäcñcıc dd!d8d8dGdRd[dbdkd‚d™d�d°d¿dËdİdİdæd e e ee e:eFeIe`eQhî„PpPpiptp„pÍpÔpèpïp÷pÿpqqqq"q*q1q8qWqoqxqxq­q×qàqrr9rcror‘r“ršr¡r¡rÄràrs#sJsfs�s©sĞsìst/tVtVtetrtwtwt†t“t˜t˜tŸtªt¼tÔtìtuuuu u uu u u u0u>uQufu¢u©u©u©u±uÎuÜuúuv vv'vAv]v]v]vov}v™v·v·v·vÂvÅvôvöv ww$w-w/w<w>wKwMwZwZw~w€w‡w˜w¡w£w±w³wÁwÃwÑwÑwñwñwñwñwxExkxsxwxxƒx‘xŸx¡x©x­x±x¹xÇxÕxÕxïxúxy$yDy]yhyryyy’y�y¥y¾y¾yĞyÕy×yİyîyÿyzz&z/z1z?zAzOzQz_z_z_zƒzƒz¢z©z°z³z¿zÂzĞzÔzâzæzôzøzøz{{{+{>{E{`{€{“{¢{¤{³{µ{Ä{Î{Î{Ü{å{û{|'|,|U|…|Š|˜|š|¨|±|Ë|Í|Ï|Ö|ç|ğ|ò|}}}} } }@}@}@}@}@}_}_}_}j}†}«}Ä}É}É}É}ë}ğ}ğ}ğ}~~~~4~9~9~@~B~B~J~L~L~S~S~V~[~z~�~µ~Ñ~å~ê~ê~#,FHHMHnppxs³³³ÒÒÒóøøø€ € € €?€D€D€D€c€h€h€ƒ€‘€“€¢€«€Å€Ç€Ç€Ì€Ç€í€ï€ï€÷€ò€2�2�2�=�=�g�g�‘�©�Á�Ì�â�ö�‚'‚?‚]‚_‚p‚�‚¤‚«‚£†R| $÷è÷èé#é9éSékévé’é’é’éŸéºé¼é¼é¼éÉéäéæéæéôéêêê,ê>êSædŞÜŞÜøÜİ!İ!İ'İ/İ7İ?İGİMİZİZİtİyİyİ݄݄݊İ�İ�ݕݚݚݲİÅİËİĞİĞİÙİùİùİùİŞŞŞ Ş Ş ŞŞŞŞŞŞ Ş Ş'Ş)Ş)Ş/Ş/Ş6Ş6Ş>ŞDŞJŞRŞRŞRŞRŞ^ŞfŞnŞvŞ~ކŞ�ޔެ޻ŞÅŞÈŞÈŞÒŞØŞŞŞŞŞâŞêŞñŞõŞıŞß ßßß"ß*ß.ß4ß?ßEßRß^ßdßlßpßwß߇ߋߑߙߠߨ߰ߴߺßÅßÊßàßñßößùß�àTL”£x‡x‡‘‡“‡š‡°‡À‡Æ‡Ş‡ö‡ù‡ ˆSˆUÔ*[–ğ–ğªğ¿ğÎğÒğàğéğøğøğñññ(ñ/ñ?ñVñmñsñxñ|ñ�ñ�ñ¥ñ§ñ±ñÕñàñâñûñÿñ òòòò(ò0òCò­òV$']']R];]\]d]WPÍİ·F·FØFÅFúFçF GG G+G-G8GCGCGeGkGX,n×n×w×}×…×�חל×Y�בבø‘ ’’(’[’h’z’š’ª’ª’·’·’¾’Ñ’Ï’ß’ß’ê’ô’ú’““““0“7“:“O“T“_“j“„“�“¯“µ“»““à“È“é“ï“õ“ı“””&”,”2”:”:”A”_”G”h”n”t”|”œ”„”¥”«”±”¹”¹”¹”ϔϔϔϔڔä”í” ••*•/•@•T•Y•Y•d•l•w•€•Œ• •°•ŕڕ÷•ü•ü•–––'–7–F–c–x–�–˜–�–�–¨–¾–Ó–ß–ğ–õ–———%——=—B—B—Q—V—V—e—j—j—{—€—€—‘—–—–—©—¸—½—½—Ğ—ß—ä—ò—ä—˜ ˜˜ ˜-˜2˜@˜2˜T˜Y˜g˜Y˜{˜€˜€˜�˜¢˜Ęɘטɘë˜ğ˜ğ˜ ™™4™9™G™9™[™`™`™}™‚™¤™©™·™©™Ë™Ğ™Ğ™í™ò™šš'šš;š@š@š[š`š`š{š€š€š›š š š»šÀšÀšÛšàšàšûš››› › ›;›@›@›Q›V›V›g›l›l›x›ƒ›˜›�›�›©››Ç›í›ô›ş›œœœ3œ>œCœTœ_œgœlœlœpœtœ{œ…œ�œ�œ¢œ§œ§œ§œ«œÄœÍœÍœóœøœøœ���7�D�O�Z�e�w�ƒ�Œ�‘�‘�‘�¢�¿�Ê�Ô�ß�ä�Line truncated
¢¢9¢>¢>¢F¢g¢P¢N¢¢„¢˜¢„¢°¢µ¢µ¢¢Ç¢Ç¢Ï¢Ô¢Ô¢æ¢ø¢ı¢ı¢£ı¢)£.£.£6£;£;£N£S£S£f£k£k£…£•£š£š£´£Ä£É£É£ã£ó£ø£ø£¤"¤'¤>¤'¤V¤[¤[¤f¤k¤§¤•¤ƒ¤k¤¿¤Ĥ¥î¤ܤĤ¥¥¥,¥<¥A¥A¥P¥`¥e¥e¥t¥‚¥‡¥¯¥�¥‡¥Ç¥Ì¥ô¥â¥Ì¥ ¦¦9¦'¦¦Q¦V¦V¦s¦]¦�¦­¦²¦²¦ͦ¹¦÷¦§ § §§§§)§.§.§A§Q§V§V§i§y§~§~§‘§¡§¦§¦§¹§ɧΧΧÖ§Û§Û§ã§è§è§ğ§õ§õ§ı§¨¨¨¨¨-¨2¨€¨n¨\¨J¨2¨�¨’¨à¨Ψ¼¨ª¨’¨í¨ò¨ò¨©©!©!©2©M©R©R©c©q©v©v©~©ƒ©ƒ©‹©�©�©˜©�©�©Õ©é±©¤©ô©ªªªLª:ª(ªªkª†ª‹ªÀª®ª£ª‹ªتݪ««õªݪ*«/«I«3«/«a«f«ƒ«m«f«›« « «¬«Å«Õ«æ«æ« ¬␍¬#¬)¬)¬F¬S¬„¬µ¬£¬جà¬à¬à¬ì¬ñ¬ñ¬­­­­)­3­8­8­R­W­W­_­d­x­d­‡­’­—­«­—­º­Å­Ê­Ê­Õ­æ­ë­ë­ö­®®®®®®6®A®F®Q®F®`®e®y®e®ˆ®�®˜®�®§®¬®À®¬®Ï®Ô®Ô®è®Ô®÷®÷®÷®ü®¯ü®¯ ¯ ¯,¯ ¯?¯D¯D¯P¯D¯c¯h¯h¯t¯h¯‡¯Œ¯ ¯Œ¯¯¯»¯ƯѯÖ¯ê¯Ö¯ù¯°°° °4° °K°C°T°Y°Y°a°f°f°o°t°t°}°‚°‚°‹°�°�°›° ° °«°°°°°»°À°À°˰ааÛ°à°à°ë°ğ°ğ°û°±±±#±.±9±D±I±I±S±X±X±b±g±g±q±v±v±€±…±…±�±’±’±Ÿ±¤±¤±±±¶±¶±¶±±¶±¾±ññ˱ббرݱݱå±ê±ê±ò±÷± ²÷±²+²0²0²7²B²b²g²}²ˆ²¡²�²°²»²Ʋ˲˲Ò²ݲı²³³#³<³(³K³V³a³f³f³m³x³˜³�³³³¾³׳óæ³ñ³ü³´´´´+´K´P´f´q´Š´v´­´™´¼´Ç´Ì´Ì´ç´Ó´ö´µµ1µ<µUµAµxµdµ‡µ’µ—µ—µ²µ�µÁµáµæµüµ C¶/¶R¶]¶b¶b¶q¶vv…жжж�•••Ÿ¡¡«¶²Õ××á¶áááá¶ã¶ã¶ú¶· · ···$·/·:·E·?·`·}·r·•·•·£·�·É·¾·á·á·á·ê·ñ·¸ ¸¸*¸*¸I¸T¸k¸‹¸‹¸‹¸¬¸¼¸Ѹã¸ó¸ó¸¹ ¹.¹@¹@¹D¹I¹P¹`¹¹¹ƒ¹š¹¡¹¦¹¦¹ª¹µ¹Á¹Ϲü¹ºº$ºWºcºhº~º–º¢º³º¸ºɺ躻?»B»R»T»T»X»w»‚»‚»…»–»Ç»ê»ê»í»¾Z, �×�׬ײ×׿×È×Î×[`BVç‰ç‰ı‰ ŠŠŠ%Š>ŠBŠHŠ^Š{Š}Š}Š®ŠœŠ}ŠÍŠ׊\8
·\·\Ø\Å\ç\ò\ı\]] ]%]]\’@¡@¡N¡P¡[¡c¡n¡y¡„¡†¡œ¡œ¡®¡º¡Ã¡Æ¡õ¡^øª¤çîçî ïïïJïJïUïbï€ïˆïµïºïãïğ ğ%ğ)ğLğrğwğ ğ½ğãğúğñññ%ñ*ñ;ñCñbñhñlñ…ñ�ñ¬ñ±ñÂñÊñéñîñöñüñòòòò#òAòFòSòXòXòeò}òŒò™ò¹ò¹òĞòÕòÕòìòîòîòóóóóóó4ó6ó6óMóMóbógógóvóvó¯óÈóÈóÛóàóàóàóàóô'ôCôCôCôPôgôiôiôiôvô�ô�ô�ôœô³ô³ôÊôÌôçôõõõõ õ õ õõõõõõ õ$õ$õ@õ@õ@õHõMõMõMõUõZõZõbõbõdõ�õ�õ°õĞõĞõĞõĞõĞõêõíõö ö öö'ö)ö5ö5ö=öOöOö[önö…ö�ö·öÉöåö÷&÷:÷X÷}÷�÷¯÷Õ÷î÷ı÷ø/ø4ø4øhømømø€ø€øŒø�ø£ø£ø·øÕøúø␍ù,ùRùsù‚ù°ùÂùÌùîùğùğùğùüùüùüùúJúLúLú[ú[ú`ú`ú`ú`ú`úwú|ú�úŞú_\
RRR/RKRXRoR‚R�R¢R�R±R¹RÄRÚRĞRòRøR`øA?=?=]=`=g=n=u=y={=‚=‰=�=‘=¤=Ì=ç=Ô=ÿ=>(>(>4><>K>…>Š>·>¿>Ä>Í>Ù>á>è>
??2?4?V?b?„?Š?‘?‘?—?š?�?¯?Ò?ä?a$—á—á¦áÁáÁáÇáb|Xsìì1ì]ì]ì|ìŒì�ì�ì�ì�ì•ì�ì¸ìÑìÓìÓìÓìÛìöìøìøìíííc”"÷5÷56#6/646D6J6_6s6ƒ6‘6Ÿ6¶6¾6È6×6ß6ì6ô6÷6÷6÷6ù6777#7&787dôÍ':':P:]:`:i:o:†:�:´:¿:õ:;; ;*;D;V;c;y;�;¦;«;½;Â;Å;å;<␍<<<:<Z<b<j<l<Œ<”<™<�<©<©<´<´<À<À<Ò<=+=+=;=ed¤¹0�0�@�G�S�Y�a�o�‚���¨�µ�µ�¸�Æ�Ö�ğ�ô�ü�f(¸şr*r*ˆ*�*¡*Ğ*à*ç*÷*+
++8+b+s+�+�+ˆ+˜+¤+´+½+Ô+Ô+ê+ê+,,,,,,,,B,B,X,X,n,n,„,„,›,›,²,²,É,É,à,à,÷,÷,--%-%-<-D-O-`-k-|--�-˜-Ÿ-à.g¬÷N N h n u } … ˆ “ ¥ ¥ ¼ à Æ È Ô å å è ğ      $ ( 0 > P c f µ h(ÅË„„>„+„M„_„g„i= R RBRWR\RdRlRtR�R‡R�R–R›RºRÓRØRŞRàRâRïRïRôRıRSSSS S(S0S=SCSNSUSeSpSS S§S²S»SÌSĞSØSØSìSüSTTmTj8-7"0"060:0?0J0U0X0\0d0kˆWõ׊׊ñŠ ‹‹‹‹ ‹E‹J‹U‹s‹]‹‚‹•‹§‹°‹¸‹‹à‹ò‹û‹Œ␍Œ(ŒŒ7ŒIŒSŒ[ŒsŒ]Œ˜Œ‚Œ§Œ¹ŒÃŒËŒËŒÔŒÜŒòŒ ��,�0�0�7�<�Z�\�a�l�‚�‚�‚�†�’�³�½�Ç�Ğ�ñ�û����$�2�@�C�\�`�{����¢�½�Á�Á�Á�Ç�Õ�ß�ø�ş� ��� �%�>�I�W�a�z�}�…�‘�“�›���·�¹�Å�Ç�Ï�Õ�î���'�,�A�Q�j�{�{�†�‘�©�µ�Ê�Ï�ä�ô�␍‘‘‘$‘/‘7‘E‘L‘^‘leã�à�à¸àÁàáàáàçàïà÷àÿàá␍ááá(á-á-á3á8á8á>áCáCáIáNáNáfáyáá„á„á�á­á­á­á´ááá½á¿á¿áÅáÅáÌáÎáÎáÔáÔáÛáİáİáãáãáêáêáòáøáşáââââââ"â*â2â:âBâHâ`âoâyâ|â|â†âŒâ’â’â–â�â¥â­âµâ¹â¿âÇâÎâÖâŞâââèâóâùâããã ã$ã+ã3ã;ã?ãEãMãTã\ãdãhãnãyã~ã”ã¥ãªã­ãRäm`b!b!k!r!†!š!Ÿ!½!Â!à!â!"""-"6"8"L"\"�"n�2Òh•h•~•�• •±••ӕæ•î•ü•–%–+–8–M–M–`–q–w–Œ–§–§–³–»–Öɖޖæ–ê–ò–—— — — —5—<—D—L—R—u—ˆ—”—˜—¢—»—Á—×Зҗä—ä—ë—󗘘6˜D˜W˜[˜e˜i˜u˜y˜…˜‰˜•˜™˜™˜¯˜Â˜È˜Ì˜Ö˜Ú˜é˜í˜ü˜™™™™™™.™<™I™Q™h™x™†™‘™§™´™Ã™Ë™Ø™ó™šššššš%š4š<šBšWšfš{šŒšœš¢š¢š¢š´šºšÆšÌšÙšôš›››#›5›C›e›ïœoÔ¼í`n`nrnƒn�n™n²nÄnÜnánğn÷no oo o"o%o*o,o2oLofo|o”o™o¨o¯o¼oÓoñoøoúoıop%pCpOpp$hm&& &4&;&U&qxKeÏTÏT÷TãTU!U␍U0U5U<UDUKUVUaUiUqU|U‡U�U’UµU½UrR�ouou‹u’uªuÂuÌu×u×uÜuçuóuşu vv,v3v9vNvcvcvwvv�vœv«v¸vÉvÚvèvövıvww-w-wAwNw_wowxw‰w‰w�w�w®w»wËw-xs8³½ÏQÏQÓQØQİQîQüQR
RRRt88Bj0j0~0‚0‡0’0œ0Ÿ0£0«0u0ˆ�ïOïOPP%P+P.P6PvÜtØãî÷ %+A0Ubem…Š­ÀÄÊáç÷ı *CQZjlsx€Ÿ­¹Óòù$*@au�˜£²ÀÏÜìú"0L^u~„�”š±¼ÉĞĞŞíïı &ITˆw`-Açˆçˆıˆ‰‰‰)‰H‰L‰R‰h‰…‰‡‰‡‰¸‰¦‰‡‰׉á‰xD‡Ô—å—å©å±å¼åÂåÈåÌåĞåüåüåææ ææ!æHæLæQæQæXæ[æ`ælæ}æ�æ’æ¤æ¨æªæ¼æÀæÜæàæåæåæùæüæ
çççAçLçPçUç‹ç¤ç¯ç³çÄçÏçÓçÕçàçäçäçøçüçşçşç è␍è!è%è%è%è)èKèyˆÕóOèOècèyèyèyè{è{è‚è„è„è‹è�è�èšèœèœè©è°è²è²è¿èÆèÈèÈèàèåèåèõèz°0X^^/^7^B^¦^Œ^�^g^P^¬^¾^®^Ş^Ş^õ^é^'_,_8_M_:_\_b_i_�_|_p_¤_¦_Â_Â_É_ó_ó_ó_ÿ_{ÄL¹>ü>ü\ügürü˜ü˜üšü§ü²ü¸üÉüØüçüôüôüúüÿüıı-ı8ı<ıNı[ıcınıjı…ı“ı“ı“ı�ı¹ı¤ıÁıÔıÖıòıŞıúışş
ş&ş&ş-ş3ş<şCşFşhş|şoş„şŠş“ş“ş“ş¦ş«ş«ş³ş³ş¾şÓşÜşÜşÜşÜşøşÿÿÿÿ/ÿ5ÿ:ÿ:ÿFÿcÿƒÿˆÿ�ÿ�ÿ™ÿ¶ÿÅÿÔÿÜÿáÿçÿìÿìÿóÿúÿ:<Ynntt�ŠŠ¨¾ÉÎÛæï÷..@Fu~~€‡ŒŒ™¤ª³³ÆÓåğş 6?JOV^q†‹’Ÿ¦¸ÍÔÚããì␍ 0>>DKTTgy||�•�©ÆÍÚÜã÷000==R]o|‡• ¯Ïâäó
--3<<IOaanq|�• ¥­´¿ÄÙÛõ


 *8JJPW`e‰’’˜¡¡ÀÀÍĞÙâêõ␍%(1:BM_epp}€‰’”ÉŞäï“ |t·ĞJ4J4\4e4h4q4z4Œ4Œ4¸4¼4Á4Ä4Í4Ü4â4å4í4ğ4õ4ÿ4}`2ÿRÿR'SS6S[SGSjSoSvS~S…S�S˜S£S¹S®SÑSÙS~À-ègèghh h h*h*h4hFhShVhXhahnhnh|h�h�h´hÁhÁhÑhŞhŞhiii#iEiZi|i…i’i’iµi¿i¿iòi%j+j+j+j=jt�R3R3f3‡3™3­3´3À3Ú3ã3é3ü344444 444:4<4<4D4€¸ºä����&�*�7�:�T�T�T�Z�^�f�q�…�‘�“�“�œ�����§�©�©�²�´�´�½�½�Æ�Ì�Ï�Ù�ê�ğ�ü�ü�d��œøO*O*m*~*–*�*¹*®*Ñ*ñ*İ*+++7+#+O+l+s+�+„+§+Ç+³+Ö+ç+ı+é+,",",:,:,D,‚¨¥44#434>4h4˜4©4º4Ì4Ó4Ú4î4õ4õ455!595H5U5X5q5t5y5�5 5°5´5»5ñ5ƒx± X±X±n±u±|±›±ª±¹±È±×±æ±ğ±ğ±õ±ü±²²#²>²X²X²n²€²„²’²™²�²�²¥²·²À²Â²Ğ²â²â²â²ô²ÿ²³³)³.³>³C³S³_³d³q³v³†³‹³›³�³­³¯³¿³Á³Ò³Û³Û³İ³í³ô³´´ ´1´C´U´e´e´e´h´{´„\åøh�h�ƒ�Š�����²�¹�Ã�Ñ�Ô�Ö�à�ò�ò�ù�/�…0ÎÖ––®îâ¸
†`,ç‡ç‡ı‡ˆˆ ˆ/ˆHˆLˆRˆhˆ…ˆ‡ˆ‡ˆ¸ˆ¦ˆ‡ˆ׈ሇL[j�2�2�2¯2µ2½2Ï2Õ2Ş2ğ2ö2ù253ˆ(–œ"3"303?3C3F3L3‰\k~7373E3W3]3e3w3}3†3˜3�3§3¹3¿3Â34Š, F×F×T×[×c×h×n׋„ 5GNUdi‹‹�²Ç´Öåç   4*LVŒ`J÷i÷ijj#jHjVjXjfjsjyj„j›jªjµj¹jÄjĞj×jãjújk$k;kEkSkekgkuk‡k‡k�k¡k§k·k·kÏkÏkôkôkùkùklll'l<lSlblmll‹l¢lºlÛlÛlälélélélélùlm
mmm+m;m@m@mNmNmSmSm]mhmzm€mŒmœm§m±mµm¾m×mÚmêmñmnnn'n7nGnNnTn`nhnsnzn~n‘n—n¤n¯nµnÅnÕnÕno o,o4o?oFoQoaoqoqo�o†o†o�o›o­o³oÁoÎoÛoåoéoòo ppp%p*p*p>p>pCpGpWp`prpxpzpzpˆp�p—p¨p±p½pÍpÍpÍpÒpêpêpùpüpq.q9qbqtqq‘q•qšq¡q³qÃqŞqåqéqïq÷qrs�8í÷¯)¯)É)Ş)ô)**-*E*E*O*�`j~ˆ ˆ ¨ ¯ · Â Ì × ß î ø û  ¡"¡2¡2¡@¡�_ŸÛŸÛÁÛÈÛÏÛÔÛëÛıÛÜ␍Ü Ü$Ü0Ü8Ü;Ü=ÜGÜQÜQÜUÜ]ÜeÜmÜw܀܈܋ܔܯÜÀÜÇÜÊÜÏÜŞÜäÜìÜìÜóÜöÜûÜ
İİİİ&İ)İ.İ=İHİPİPİ[İoİvİ}İ”İ�83=&Ø&Ø/Ø/Ø=ØAØOØRØWØ‘8>H^Ø^ØgØgØuØy؀؃؈ؒDDQ—1—1±1Ä1Î1Õ1á1ù12222=2“Ä{¨ßß   %++=DZm|‚„‹‘››¯±¸¾ÈÈÈßñø  22D”0RZ?2?2H2n22…2…2�2•„\y®ò®òÀòÕòßòèòêòñòó óóóó!ó2ó5ó5óYódófóó†óŠó™ó¬óÿó– 
�0�0—0´0¹0—hOgOgegpg{g‰g”g�g®g·gÈgÎgÚgñgñghh!h*h;hAh�h˜„a~§M§M×MİMæMòMúMNNNNNN2N\NaN…N�N�N§N¿NãNOO™lò  18?ac…š‡¼©ËËİäš y}¸‹¸‹Á‹Í‹Ò‹›(A†è†è¨è°è¶è¾èÀèÀèÑèÑèÑèÙèáèóèéóèééé3é5é5é@éFé`éeéeéeézé|é‰é‹é˜éšé§é¯é·é¾éÒéßéáéòéÿéÿéÿéêê-ê3ê;ê=êJêJê_ê_ê_êjêtêŒê‘ê‘ê‘êŸê¥êªê²ê½êÏêÚêßêßêæêêêøêüêë ë*ë7ë>ëGëcëhëhëhëhëpë{ë‰ë‰ë©ë©ë©ë°ë¾ëÍëàëóëõëõëõëììììì!ì3ì=ìYìƒì‰ì‰ì�ì¢ìÆìÍìÙì÷ì
ííí í í í í+í5íCíeípí�í—í—í¥íÃíóíîî.îAîFîFîFîNîYîkîvî{î{î{î�î·î½î½î½îÈîÒîŞîéîëîëîëîğîüîüîFïœH%‚/‚/�/—/¢/¯/º/Â/Â/Ú/ä/ê/ğ/�0 �Q�Q¶Q£QÅQáQ×QùQR�LİìŸ(Ÿ(¹(Î(ä()ò()")M)n)[)†)�)�)¨)Ÿğ·OOLOUOaOiOtO“O“O�OŸOºO¢OÉOÉO×OáOèOP
P$P+P+PGPGPnPsP’P«PÈPËPÓPÚPúPüPQQQ9Q9QVQVQ}Q�Q TVgşş!'->LZlpv„‡‘¡0
R>3_K‚n‘�¢®¾ÅÒİéôü␍&-1<ALenz“š��£¼ÁÚï       4 I T ^ i k v ~ ~ � ƒ ¦ Æ ¢àZ�ĞeĞeêeøeıe
ff!f<fJfofxfˆf£f®f¾fÀfÂfÌfØfÜféfõfgg'g+g+g+g+g0gNghghgogrgzg†g�gåg£d1G,G,e,},�,•,±,¦,É,é,Õ,ø, - - -7-D-D-\-\-f-¤ü!\WWo�Œ¹Ÿ“Èéşë3␍B___q��ÃÚÎ $L:[|”�¯£×Åæ22SZ||„¥(–å–å¤åÇåÍåÒåÒåØå¦(!'Î×Î×××å×ë×í×ò×§D]j::2:9:B:N:c:k:q:w:y:y:‰:¨„¼Ùèªèª«'«+«3«;«?«J«N«R«V«^«c«g«x«‰«‹«�« «±«À«Ó«Û«æ«æ«æ«ø«©€ğœğœ ����$�4�?�I�T�k�n�p�‹�•�Ÿ�¦�±�Ã�Ë�Ë�á�á�ó�ª Ê ¿Y¿YåYZ
ZZ%Z.Z2ZMZcZ|Z‚ZŠZ�Z¢Z§Z¹ZÛZáZéZîZôZ÷Z␍[[[:[B[W[\[k[�[“[˜[˜[˜[¥[¶[Á[Î[Ú[í[ú[\\2\<\>\U\i\n\y\€\£\£\£\µ\«<ÑÜ55 555$5,545;5K5K5P5¬°)@£@£c£p£u£y£‚£‘£�£¨£³£»£Æ£Î£Ñ£İ£å£ÿ£%¤ ¤5¤>¤s¤_¤ƒ¤ƒ¤›¤¦¤Â¤É¤í¤&¥&¥&¥&¥‡¥­”‹,.¹.¹K¹R¹Z¹e¹|¹†¹†¹�¹§¹Â¹Ø¹æ¹ê¹
ºº2º9º=ºVº`ºqº~º~º…ºŒº‘º–º›º¢º©ºÃºÊºÚºŞºŞºèºşº»»»&»9»9»?»J»Q»Y»d»k»s»~»…»…»�»®»²»Ê»»»å»å»ë»ò»¼ ¼¼ ¼$¼&¼8¼8¼8¼J¼R¼x¼†¼†¼Š¼Ÿ¼§¼·¼Â¼×¼Ü¼ê¼ù¼½½½ ½%½-½1½@½B½Q½S½b½d½s½z½~½’½œ½ª½±½µ½Å½Ğ½Õ½ó½ı½ ¾¾¾ ¾.¾5¾9¾C¾W¾_¾j¾n¾n¾n¾y¾„¾”¾ ¾¶¾¾¾É¾Ø¾à¾ë¾ğ¾ø¾¿¿¿¿#¿7¿?¿J¿J¿J¿J¿g¿„¿�¿˜¿¨¿¸¿Ö¿Ú¿ Àş¿ï¿ÀÀ#À*À9ÀHÀRÀ`ÀgÀkÀmÀ|À†À”À›ÀŸÀŸÀ¡À³À³ÀÅÀÅÀÅÀ×ÀéÀñÀ Á5ÁCÁGÁeÁlÁsÁ~Á”Á™Á Á³Á½ÁËÁÒÁÖÁØÁëÁõÁÂ
ÂÂÂÂÂÂ'Â6Â@ÂNÂYÂ]Â]ÂbÂjÂnÂ}ÂÂ�Â�Ÿ¡°·»ÂÏÂÙÂçÂîÂòÂÃ␍ÃÃ0Ã:ÃHÃOÃSÃ]ÃkÃrÃvÀÔÜçëëëöýÃËÃåÃõÃÄÄÄ%Ä5ÄAÄWÄ_ÄjÄyÄ�ČđęĤİĴĿÄÄÄØÄàÄëÄëÄëÄëÄÿÄÅ$Å1Å5ÅIÅZÅoÅ|Å€Å�ţųÅÊÅãÅüÅşÅ ÆÆÆÆ7ÆHÆ_ÆxƆƑÆ�ƥƧƲƺƺƺÆ×ÆåÆóÆ
Ç!Ç0Ç=Ç]ÇdÇdÇtLjǢǢǦǼÇËÇæÇñÇÈÈÈ5È5ÈHÈcÈlȃÈ�ȬȹÈÙÈçÈıÈÉ)ÉAÉAÉYÉYÉeɀɘɡɡɡɭɾÉÖÉßÉßÉæÉïÉõÉÊ`Ê®<ùD0�0�U�a�l�v�|�†�Œ�–�¤�®�À�Ê�Ğ�Ú�à�ê�ñ�ı�‘ ‘7‘F‘I‘K‘U‘g‘q‘ƒ‘�‘¢‘¢‘¥‘¯‘đɑّä‘é‘ı‘ÿ‘’3’3’=’R’`’i’q’’�’ ’±’¾’¾’Ë’Ë’Ó’á’(“¯$› ¯P¯PÃPËPÖPÜP°l£:÷F÷FG(G8GXGjG‚G�G�GÇGÏGÓGÖGÚGßGéGìGóGùGHH
HHH*H1H8H:H>HGHQHTH_HkHnHHŠH�H—H H¹HÊHÓHÜHäHïHúHII(I4IBIDIKIRIWI[IhIoI’I IªI´I½IÖIçIğIùIJ
JJJJJ*J1J?JIJ^JhJqJŠJ›J¤J­JµJ¾JÄJÈJÍJÓJİJçJKKK K'K/K7KDKLKkK^K€K‰K¤K¸KËKÒKÛKäKëKôKıKL LL/L3L�L±  °ˆ°ˆ¾ˆàˆæˆ²¸�·z'z'ˆ'�'È'Ê'ÿ'*(*(:(?(?(S(X(X(t(y(y(™(�(�(²(·(·(Ô(Ô(â(),)L)^)p)‚)’)’)’)’)™)r*³$bgÊ%Ê%Î%æ%ø%&´ƒ·Ã·ÃÉÃØÃØÃÛÃäÃğÃğÃÄÄ.Ä5Ä9ÄIÄiÄ{Ä�Ä�Ä™Ä�ģĬÄÂÄÆÄãÄÅÅÅ(Å:ÅFÅHÅTÅ\Å`ÅfÅoÅoÅoÅ�ŌŒŨůŷÅÍÅÔÅÔÅÔÅâÅ ÆÆÆ,Æ4Æ=ÆHÆNÆdÆkÆsÆzÆ�ƠƠƧƧƧƵÆÜÆéÆòÆúÆ ÇÇÇÇ(Ç/Ç=ÇAÇMÇeÇmÇsǂNjÇ�ǗǠǠǮǶǼÇÙÇâÇêÇğÇöÇöÇöÇıÇÈÈÈ!È'È'È)È3ȵx‡Ú‡Ú•ÚªÚ±Ú¼ÚÒÚüÚÛ Û7Û=ÛLÛUÛ]ÛeÛgÛmÛsÛ‚ÛŠÛ�Û’Û˜Û¤Ôyff*f2fBfJfnf…f‰f‘f™fŸf¨f´f¼f¼fÄfôf3ggVg[gcgsgug£g©g²g¹gÁgÉgÕgİgågøghhh/h6h8hBhQhqhxhzhšh¡h¡h¡hªh±hÊhĞhØhØhİháhíhöhÿh i.i<ijimi‰i–iªiÄiÈiçiõij/j5j7jejhjhj„j‘j¥j¿jÇjËjÖjŞjîjğjk!k)k9k;kikokokykyk„kµk½k½k½k½kÆkÒkèklll'l.l.lAlElElElLlQldlklwl~l~l˜lšlŸl²l¹lÅlÌlÌlÙlãlãlèl m mm·à˜ÌGDGD\DzDgD¯D•D‰D¾DÍDÕDàDâDíDøDøDıD2E7ElE„EqE¦E“EºEµEÖEåEíEøEúEFFFF6F8FYFYF`FeF‡F‰F«F«F«F³F¸\î_f_fuf‡f�f˜f¦f²fÉfÉfÛfáfìfüfgg"gNg¹ÛÜç ç    & - 1 3 : A E E M f p p „ � � ® ² · Ë Ï Ø Ü á ç !!!)!.!G!X!\!\!\!a!l!v!}!�!”!™!­!µ!¾!Â!Ä!Ë!İ!í!"" "2"6"6"6"J"N"W"["`"f"ƒ"ƒ"‘"¨"­"Æ"×"Û"í"í"í"ò"#%#G#R#X#n##„#�#£#§#°#´#¶#¼#Õ#Õ#ã#ú#ü#$&$*$*$1$D$H$Z$_$s${$„$ˆ$�$”$ª$º$Ñ$Ö$ï$%%%%%%%?%N%r%}%ƒ%™%ª%ª%ª%±%Ä%İ%İ%İ%ì%ì%ÿ%&!&2&7&=&G&I&U&U&\&g&|&~&‰&�&ª&¬&·&Ã&Ó&Ú&á&ë&ó&÷&û&ı&'
'' '"'''/'3'5'5'>'K'a'�'›'©'µ'¼'¼'Ï'Ó'Ó'Ó'Ú'ß'ù'((((4(6(;(U(c(o(v(v(ƒ(�(�(Ÿ(º¤ ¿¤XJXJuJ„J„J„J¡J¡J²J²J¸JºJºJÀJÂJÂJÈJÊJÊJÑJÕJÚJÚJÚJÚJÚJÚJâJúJúJKK$K1KIKKKjKlK‹K�K¯K´KºKºKÓKÖKıK
L"LBLBLKLPLnL\LtLƒLˆL�L˜L«L³L»LÀLÀLÀLÉLâLèLèLMM,MEMGMOMUM]MbMbMhMhMqM‚M„M™M›M£M©M±M¶M¶M¶M¶MÄMÛMİMñMñMùMÿMN NNN&N,N2N4N4N4N<N<NJNaNeNgNsNuN�N–N�N£N¬N·N»NÁNÅNÎNÑNÑNßNğNòNO7O=OEOJOSOXOXO]O_OgOgO‚O”O™O¥O«O®OÅOÇOÊOÚOŞOåOîOıO PPPP&P+P+P7P?PLPdPiPsP›P¦P±P¼PÇPÒPİPèPóPşPşPşPQQ(Q6QSQlQnQtQvQyQ„Q†Q†QŒQ’Q’QšQ£Q©QµQµQ¼Q¿QŞQéQñQùQşQşQR RR R%R/R9R9RFRmRmRvR„R•R¡R¨R¶RÅRÛRáRæRæRëRS␍SS%S/S8SFSMSOSXSXSbSpS|S“S©SÀSÆSÈSßSäSäSTTTT%T+T4TBTGTGT^TdTfTqTƒT™T™T­T½TÏTÔTàTæTéTUUUU U"U"U1UHUZU_UkUqUtU‹U�U�U U¤U¬UºU¿UÄUÄUÊUÒU×U×UİUİUëUñU÷UV VV.V1V3V=V=V?VGVLVQVVVVV\VdViViVnVyV~VƒV�V“V¹V»VÀVÅVÊVÏVÔVÙVŞVŞVãVèVWW"W6W<WDWDWRWXW^WhWrW€W•W˜WšW¤W³W¸W¸W¸WÀWÅWÎWÎWÓWÓWÙWáWæWæWëWöWûWXXXX%X+X+X9X?XEXOXYXgX|XX�X‹XšXŸXŸXŸX§X¬XµXºXºXÀXÈXÍXÍXÒXİXâXçXìXûXûX YYY Y&Y,Y6Y@YNYcYfYhYrY�Y†Y†Y†Y�Y“YœY¡Y¡Y§Y¯Y´Y´YÁYÇYÇYÕYÛYáYëYõYZZZZ'Z6Z;Z;Z;ZCZHZQZVZVZ\ZdZiZiZvZ|Z|ZŠZ�Z–Z ZªZ¸ZÍZĞZÒZÜZëZğZğZğZøZıZ[ [ [[["["["[([2[8[L[Q[Q[W[a[g[l[l[u[ƒ[Œ[š[Ÿ[Ÿ[¨[¶[Â[Ó[à[ç[ï[ù[\\ \ \\\\\ \ \'\+\0\8\>\@\I\X\`\e\k\k\s\|\Š\•\š\ \¨\­\­\­\­\­\­\­\­\­\­\Æ\Ì\Õ\Û\ã\è\í\ö\]
]]]]]]%]*]*].]3]3]<]J]V]_]e]e]n]„]„]Š]“]©]©]²]´]º]Ã]Ù]Ù]â]â]â]ë]ğ]ğ]ø]ı]ı]^(^4^9^?^I^Q^V^V^V^j^s^y^‹^•^•^�^�^¥^§^§^À^Ê^Ó^Õ^Õ^Õ^Û^ß^á^á^á^á^æ^ì^ò^ö^mb»Ìz© m mAmLmbm~m‹m¢mµmÀmÖmÂmåmímímümümnn&n;nJnUnhnnnnnnnsnxn‡n’n¬n®n³nÂnÍnÚnänänòn¼”*Kˆ¥ˆ¥ ¥§¥®¥±¥º¥½¥À¥Ä¥É¥ë¥Ø¥û¥¦ ¦¦¦ ¦)¦2¦8¦;¦L¦j¦{¦†¦¸¦½à.¢CC%C0CACDCHCQCXCfCuC‹CœC­C¿CÑCàCïCDDDD!D%D*D.D;DBDPDdDmDsD�DšDœD DªDªD¯D¯D¯D´D´DÃDÌDÔDêDêDêDïDïDEEE#E#E&E+E+EJEVEcEeEeEiEkEkEŠE–E¢E¤E¤E§E©E©E¶E¸E¸E»E»EÄEÊEÏEëEëEëEëEëEëEëEëEëEëEëEëEíEşEF F.F.F2F2F:FSFWF\F÷F¾,××,×3×;×@×F׿l3JßSßSõSTûSTCT/TRTWT^T^TdTgTkTsT‹T–T¬T¡TÄTÎTÀPQaâ$â$ğ$ş$%%&%+%H%N%U%\%j%v%ˆ%Ä%ÁD+ŞåŞåòåææ)æ/æ5æZæ`æfælælætæÂô#œ?7?7G7V7Z7g7t7ˆ7—7´7Á7Ó7õ78+8G8Y8q8ˆ8“8´8Ò8á8ü89"9;9;9V99™9´9Æ9Õ9ä9ä9ï9::&:6:C:O:^:{:{:ƒ:ƒ:ƒ:”:¡:¨:Ç:Ğ:á:å:í:ø:;(;1;A;I;N;r;‚;’;�;±;¶;¾;ä;æ;ñ;$<><><V<e<m<|<…<�<Ÿ<Á<É<Ñ<Ü<Ş<î<==6=N=`=w=€=‰=›=©=­=±=à èˆèˆñˆ‰‰Ä\‡ZÆÍÆÍàÍçÍôÍÿÍÎ
ÎÎ"Î:Î@Î^ÎtÎ΅ΧΧηÎÌÎÎÎÑÎİÎåÎíÎõÎÏ ÏÏÏÏ Ï2Ï8Ï=Ï=ÏTÏTÏrÏrÏ…Ï’Ï—Ï—Ï®Ï·ÏÆÏÜÏçÏõÏĞĞĞ/Ğ5Ğ?ĞKĞXĞZĞZĞbĞgĞgĞoĞtĞtĞ|Ğ�Ğ�ЉĞ�Ğ�ДЙЙРХХЬббмĞÁĞÁĞÌĞÑĞÑĞÜĞáĞáĞìĞìĞÑÑÑÑ"Ñ%Ñ9ÑFÑUÑ\Ñ_ÑqÑsÑyÑ�њѩѩѩѩѳÑÍÑâÑôÑÒÒ Ò%Ò*Ò5ÒGÒXÒgÒmÒ~Ò‰Ò“Ò£Ò²Ò¸ÒÃÒÉÒŞÒäÒõÒÓÓÓÓ&Ó9ÓEÓMÓ]ÓdÓjÓ{Ó†Ó‹Ó¨Ó½ÓËÓÛÓçÓùÓÔÔÔ'Ô/Ô4Ô;Ô?ÔMÔWÔ]ÔgÔmÔxÔ~Ô€Ô�ÔšÔ¤Ô½ÔËÔËÔÑÔØÔ×ÅD#°(­(­G­i­q­q­­’­¬­¯­¸­Ô­Ô­Ô­Ü­Ş­Ş­æ­è­è­ğ­ò­ò­ú­ú­® ®®®®&®*®/®5®:®:®:®:®B®K®Q®V®V®[®h®�® ®£®¹®Ø®Ø®Ø®à®â®â®â®ê®ì®ì®ì®ô®ö®ö®ö®ş®¯¯ ¯ ¯¯¯¯¯¯¯(¯:¯H¯V¯`¯`¯`¯p¯p¯w¯{¯�¯™¯§¯º¯Ç¯ğ¯ó¯ü¯°° °(°3°3°>°D°I°I°I°P°V°k°s°y°„°›°²°¾°Ä°É°É°Ğ°Û°Û°à°ò°ø°ø°ø°ø°T±Æd*DD2D<D?D?DID\D^DkDmDxDŒD”D¤D©D¯D·DºDÌDÇLWf11.12171B1B1L1R1R1V1^1È\CV²0²0È0È0Ì0Ñ0ä0ç0ì0ì0ö0ü0ü0
1 11É8(2ö×ö×ÿ×ÿ×␍ØØØØ ØÊ¨Yÿ_ÿ_` `*`=`1`o`Ó`¹`®`”`}`Ù`î`Ş`aa0a5aJa7aYa_a_afa�a»a�aÒağağağaüaËlF]‡.‡.¡.Ê.¬.Ù.ù./ /-/E/2/T/m/�/Ÿ/¸/¸/¿/á/á/ë/Ì4Š“×í×íëíğíöíúíşíî%îÍxÌæg„g„’„„¡„«„²„Ȅ̈́҄ք؄ބä„ú„ç„ …"…*…<…_…U…n…z…Δ"ø«ø«¬¬¬$¬,¬7¬B¬J¬U¬`¬e¬{¬‚¬‰¬”¬Ÿ¬¡¬¬¬·¬¹¬Å¬Ğ¬Û¬ä¬ì¬ì¬ğ¬'­Ï€ø*6*6H6L6P6X6f6i6l6‚6ˆ6Š6œ6 6¤6¬6´6À6Õ6æ6í6ô6ô677ĞŞ`oGoGŸGªGÏG±GéG H$H$H'H1HIHXHZHbH„H¥H·HÄHßHóHøHIII#I:IaIsI€I›I»I±IÕIÛIÛIäIJJJJ0JJ?J?JQJQJ_JiJ”JŠJ®J®J³J¶JÌJØJíJKK!K1KYKHKhKjK|K�K¤KšK¹K¿KÎKöKåKLLL#L7LALJLaLkLmL�L‹L‹LªL°L°L°L¹LÙLMğLMM'M/MZMPMoMoMoM•M•M§MÑ`8Ìg3g3�3¥3­3¶3Á3È3à3å3è3ë3ô34 4494>4K4w4|4‰4©4®4½4é4ñ4ö4 575?5D5D5W5j5~5‚5¤5µ5º5º5æ5æ5æ5æ5æ5ú566666J6O6X6e6m6ˆ6Ÿ6­6¸6Ô6Ô6Ô6á6ø6ú6ú6ú677 7 7-7D7D7T7Y7€7—7©7Å7Å7Å7Ò7é7ë7ë7ë7ø788885858E8M8R8r8‰8›8·8·8·8Ä8Û8İ8İ8ê89999%9G9e9j9x9†9�9’9’9’9¯9·9¹9¹9á9':Ò¤%J?ê?êYê…ê…ê¤ê´ê¹ê¹êÈêÚêôêüêëë#ë+ë+ë+ë-ë-ë-ë-ëIëIëIëIë`ëbëbëbëbë}ëˆë½ëÓĞç……•…¡…¦…¦…²…·…¼…Ç…Ì…Ì…Ì…†î…†7†7†P†i†‚†›† † †¹†Ò†ë†‡ ‡ ‡"‡;‡T‡m‡o‡o‡ˆ‡¡‡º‡Ó‡Ó‡Ó‡å‡Ô0�‰wíwí…í‹í�í®íÏíÏíÕíÕ<:E99#9.9<9H9T9]9f9o9u9z9ÖluŒª&ª&¸&Â&É&à&à&å&ç&ó&ı& '('*':':'?'A'H'z'×ÈŸÍOvOvcv�v‚vnv­vßvÅv¸v
www(w7wNwkwÄw¬w˜wÊwÕwxxx-x5xZxOx;xmx†xrx©x•xÀxÇxóxóxóxóxûxØL^mï/ï/␍0 0&0H0H0Z0g0w0m0�0™0Ù$qv÷N÷N OOO$OÚÈg•b1b1†1Š1©1Ë1×1Ş1é1÷12␍2␍22242?2O2[2b2m2~2€2‘2“2•2•2•2�2�2§2§2¯2·2¿2Ç2Ë2Ö2"3Û XˆXˆfˆ}ˆƒˆÜ`FZz9z9Š9‘9“9˜9§9­9Â9Â9Ğ9Ğ9Ü9å9è9ö9:: :İ<ö_‘_‘h‘s‘~‘‰‘”‘�‘¼‘Ç‘בŞ =�h�h§h¹h¿hËhÖhähğhii"i4i:i@iFiYi_ihini€i†i‘i™i§i´iñiß,29111.1G1[1^1d1à4‰‰&‰0‰9‰@‰G‰Q‰Q‰W‰áÄMz§ÿ§ÿÓÿÖÿÛÿèÿíÿÿÿ   8^gry’¸½Öü!GIbˆˆˆ ºÉÛâ �Ï/x/xMxPxVxjxrxƒx�x–x›x›x¨x±x·xÇxÕx×xöx
yyy-y-y;yNyYy]ynynynysysyy�y¡y§y¬yÀyÆyÎyàyæyèy÷yz
zzzz!z(z4z;z=zBzJzLzQz]z_zdzlznzsz{z}z‚zŠzŒz‘z™z™z™z©z©z©zÀzÆzÌz×zÜzõzûz{{{{"{;{F{Q{W{d{i{n{n{ƒ{‹{•{�{¥{Æ{Ñ{Ü{è{â{ñ{ú{ÿ{|| |)|5|;|G|K|P|U|`|k|v|x|~|‹|�|•|®|¹|Ä|Ä|Ê|×|Ù|Ş|ç|} }}})})}-}2}2}C}E}E}X}Z}Z}m}o}o}‚}„}„}—}™}™}«}«}±}¶}¶}Í}á}Ö}î}ö}ı}~ ~~)~ ~9~9~;~S~V~X~g~y~‰~•~¬~Æ~Ë~ß~ï~$6AIQUcinntˆ˜��£©®®®´ÃÖãçììğõõú€€+€A€M€M€S€`€b€o€{€Š€�€�€ª€¶€¶€¶€¶€º€¿€Ğ€â€í€õ€ı€ÿ€��$�3�9�F�F�]�m�m�������˜�¤�»�»�Á�Î�Ğ�â�â�í�í�í�í�í�i„ã ŒĞ'W'WEWSWjWoW”WšWŸW¥W³WºWÉWÎWÚWìWìW
XX(X/XIXfXrX�X¥XÁXÊXÙXáXîX÷XüX YY:Y?YGY`YrY‚YˆY“YœY¢YèYÒYÃYøY3ZZZCZFZkZúZä<+6ĞDĞDñD÷DEE+E3EMEYEå„ |Ø ã ê ò õ õ !!!!!!!'!-!3!:!@!Q!Q!S!\!h!n!“!—!š!ª!²!·!·!¾!Ç!Ø!Ş!ç!ò!"" """"")"1"7"9"G"^"a"p"}"Š"Š"Š"Š"�"¢"«"¼"İ"î"#␍## #&#&#/#6#B#R#]#]#]#q#…#•#˜#S$æ„9ò7ò788$8(8>8k8�8’8›8©8»8Ô8Ô8æ899 99çX{Í��¹ÃÖáó '=EXm}‡‰™©²¸½ÄÊĞÖáìïö2GTW_cu„‹“®ËÏØßñù␍!8FLPR___ax~~�è 
ˆˆˆˆ‘ˆ¥ˆªˆé¤ŸÄ‚‚›‚¡‚³‚¸‚¾‚Á‚łłè‚킃ƒ)ƒBƒ.ƒQƒgƒSƒvƒ~ƒƒƒ‰ƒŒƒ�ƒ’ƒ«ƒ—ƒºƒºƒºƒÕƒ„„ê˜Ìîââëææúõ ""11@@OO^^m�|‹‹š©¸#ëxÓí/e/eMe_eeeqeˆeˆeše e«e»eÇeĞeÖeÜeçeõefff+f+f[fìd”©'î'î+î>î>îXî_îkîkî‚î‚î™î™î°î°îÇîÇîŞîàîàîäîíÌÂñWWy€‹¡¡³¾ÒÖÛßáçù5DHHH[pp|‚Œ—¥¬»½ÖğğîP7G`E`EvE‚EŠE�EŸE­E³E¿EÇEÒEØEÛEåEï ®-o>o>‰>”>˜>¡>¨>¯>Å>Ö>ç>ù> ??)?:?I?I?P?T?]?j?q?z?�?…?¥?¥?¥?¥?¥?±?µ?¸?À?Î?Ö?ã?ë?ó?@@@@!@'@6@M@O@Z@g@r@u@{@w@�@¦@¨@¶@¸@Ã@É@É@Ñ@Ñ@ã@ê@AAAAAA+A6A;A;A>ACACAbApA}AAAƒA…A…A¤A²A¾AÀAÀAÃAÅAÅAÒAÔAÔA×A×A×A×A×AàAæAêAöAB#B1B8BCğ(rxˆ‹ˆ‹–‹�‹­‹°‹¶‹ñ(ntZ&Z&c&m&~&‰&‰&§&òTzKôô$ô*ô-ô6ô@ôXôhôqôwôzô~ô€ô˜ô¨ôµô»ô¿ôÅôÇôÊôÎôÎôñôõôûôûôõ)õ>õQõdõjõqõ|õ†õŠõ�õ”õšõ�õ¤õµõ»õÀõÅõÒõÔõæõèõïõüõşõööööö4ö?öKöböböwöƒö öÄöŞöãöúöÿö␍÷$÷)÷/÷@÷U÷[÷k÷x÷Œ÷“÷Ÿ÷·÷Ã÷Ã÷Ã÷É÷Ì÷Ï÷è÷î÷øø␍øøøø*ø7ø7ø=øKøbøhøkønøuø~ø…ø…øŠø—ø¤ø¤øªø¸øÏøÕøØøÛøâøâøóøúøùùùù%ù,ù2ù9ùDùXùXùrùwù~ù†ù�ù�ù¡ùªùÂùÇùÎùğùûùú ú"ú6ú6úQúQúkúyú€ú‡ú©ú¼úàúâúìúûûû'û3ûDûcûgû<üóÀ€¬ÿaÿabb b/b:bFbgbHbvb{b{b bÑb´b§bôbùb"c'c3cTc5ccchc�cˆc«cÁcÁcçcçcócô ^0^0m0†0Œ0õ4‘š7P7POPrPP…P‹P�P®Pö8 â.â.ğ.÷./
/////#/÷ :>g1g1q1y1~1øÎPÿxÿxy-y8yNykyzy�yÌyÒyØyàyâyêyÿyz␍zz/zLz[zz­z³z¹zÁzÆzÎzãzæzñzız{{{{{&{6{N{\{Š{�{•{�{­{Ó{|| | ||(|3|P|h|t|||Š|Š|�|¢|¹|»|Ø|ğ|ü|}}}}*}7}A}X}o}ˆ}š}§}É}à}÷}~~~5~5~>~J~`~y~Œ~—~ª~®~®~®~µ~º~Í~Ø~ò~ô~ù~ $..@ù˜k␍�:�:¦:²:²:È:Ó:Õ:õ:õ:õ:ü:;
;;;;;;4;4;j;v;ˆ;˜;¯;´;·;¼;¼;¼;Ø;ß;ì;ó;û;<<<(<0<5<5<Q<^<f<k<k<‡<“<œ<¤<¬<¸<Î<Ù<ü<=====7=Q=[=g=o=t=t=“=Ÿ=±=¶=Ò=Ş=í=ò=>>>>>>>>>>:>F>X>Z>]>b>b>b>l>t>{>ƒ>Œ>—>�>ª>¸>¸>Â>Ë>Ó>???$?>?C?C?V?^?^?`?`?`?e?e?l?r?v?}?�?�?�?�?�?�?µ?¾?¾?Â?İCú(àCàCîC÷CD Dû�ªÊ÷n÷noo)o?oTobomo|o‚o‚o‚o‡oŒošo¥o¾oÀoÅoÓoŞoëoòopü\2Eg-g-�-¦-ˆ-µ-Ñ-Ç-é-ş-ë-␍.&.8.Q.Q.X.z.z.„.ı8fpwNwN�N�N²NÁNÇNÍNĞNğNş0�—€Œ€Œ”Œ Œ®Œ±ŒÉŒÌŒÔŒÿ0S[¾Ø¾ØÒØÚØçØñØÙP>NŠŠ Š Š#Š7Š?ŠCŠMŠWŠ_ŠbŠhŠT¡²ßPßPùP QQQ&Q;Q=QOQYQmQmQsQvQÊQ<˜£ØŒØŒìŒóŒÿŒ �� �#�'�/� 26vævæ„æ�æH!/§]§]»]Ç]İ]É]ì]î]õ]^ ^^D>‹oToT‘TœT¡T©TÃTÊTÌTÌTèTîTğTûTUUUUU&U/U7U>UEUIUPUXU^UcUkU‚U†UœU¯UµUÉUÎUÛUÛUïUúUV
VV!VDVJVNVSVXV[VeVjVvVV“VšV¬VÀVÇVÇVÎVÑV#WläûVäVäjä€ä�ä™ä�ä¤ä¨ä±äÀäÂäÂäÖäØäáäçäçäçäçäïä´KtğEğEF'F,F3F=F=FEFXF\FaFvFxF{FF†FšF�F¦F²F¹F½FÅFÇFÏFİFåFçFêFG GG!G%G3G -Q¯s¯s¿sËs×sçsÿstt$t,t3tLtyt“t t­t½tÃtÅtÖtøtÿtuuu1u<uBuHuku ôB»@j@jZj]jdjoj~j€j‹jšjšj§jµj¸jºjºj¿jÄjÍjØjŞjçjújÿjk k)k)k?k?klk€k—k�k¢k©k¯k¶k»k»kÁkÇkÌkÌkßkíkl ll$l.l5l5lRlmlslxlxl£l¨l¨lÓlúlÿlÿlÿlm mmmmm!m'm,m,mCmWm]m€m†m–m¢m¨m¶m½m¿mÓmÙmàmàmâmâmâmçmímòmömømûmnnnnnn#n#n1n[n
˜}ŸV$V$r$w$~$ˆ$�$™$©$±$¹$¾$É$Ó$Ù$ä$ô$ü$ %%%#%+%3%8%C%Q%Q%g%  B†ç?ç?ÿ?@@A@L@Y@g@[@�@�@œ@¤@³@í@ï@A$A$AYAqA^A’A€A¡A§A¶AËAÍAØAàAàABBBB#BAB.BvB\BPB…B¢B�BÂBÚBÇBüBéBC C,C>C4CUCUCUC~C~CŠC Ğ1(“(“<“<“b“b“‚“†“‹“‹“‹“—“œ“¬“±“±“±“¶“¶“ϓ֓å“ó“ü“ ”””””””%”,”3”:”A”H”O”O”Q”Q”W”\”c•␍D ,ss%s/s9sIsNsWscseswswsys©s
!
!
5
=
F
N
S
Y
o

”
™
²
Ê
Î
á
á
á
ó
æ
  * 5 ; S k p { � —   ¨ ª °  Ò ç é     2 : C K P W m } ’ — ° È Ì ß ß ß ñ ä ␍␍(␍3␍9␍Q␍i␍i␍i␍u␍{␍…␍�␍¢␍²␍É␍à␍÷␍!<<<]m{{„�›µÃÊİßş␍%5OOh5D|‰îîş!337:B6\Ob8Š8ŠXŠgŠpŠyŠ}Š�Š�ВЗЗЍЬдŠÌŠÏŠÛŠ70üÆäÆäÏäÔäİäääæäëä8�áßß00B[[fju¢‰|±ÈÙíñö #(04F9ey}}‚ “Ûµê-EJ^fow|ƒ•¥»½Öîòò $,0?2^rv…………˜�¨¯Âİİù +9G\ot“¢›ºÊÑâù.0\\\tg¥ªµ»Æèï(9Thlq�‚±¤ÙÆè+CH\dmuz�“£¹»Ôìğğğ+?CRRReku|�ªªªÆÖääø 2EJixq� ±ÏÏññø;9Dn{––¦ºÃÉÛÛßâê:lz‘w}w}�}œ}¡}¶}£}Å}È}È}Õ}ê}×}ù}ÿ}~1~J~c~|~†~;<Š•FFVgpvz…<”)ïïï"ï.ï?ïAïQï\ïnïyï„ï“ï¤ï«ïÄïÈïÙïÙïãïêïıïğğ(ğDğIğfğ=d(=h‰h‰t‰ˆ‰‹‰Ÿ‰§‰«‰µ‰¿‰Ç‰Ê‰Ğ‰>4o¸GG.G1G5GBGKGVGfGnGxG G G°GµGµGÅGÊGÊGÚGßGßGïGôGôGH H HHHH.H3H3HCHHHHHXH]H]H]H`HiH‚H�H§HºH¼HÂHÄHÇHØHİHİHãHóHóHşHII3I;IAIAIUIUI^IaI!J?Ä n‡«‡«¤«¬«¯«½«Ë«à«é«¬¬/¬:¬K¬O¬a¬d¬o¬x¬„¬—¬Ȭ½¬£¬جשּׂ­­>­S­w­‹­�­®­”­É­Ì­Ñ­Ô­Ô­Û­ñ­ø­®
®®&®9®9®Q®U®‚®‚®š®Ÿ®Ÿ®¯®³®Ä®ήß®é®ü®¯¯¯¯&¯0¯A¯K¯^¯j¯o¯o¯o¯‘¯¢¯§¯´¯ɯɯίدç¯ì¯ò¯÷¯÷¯ü¯°°° °%°%°+°1°6°6°>°Q°]°j°v°…°�°•°�°µ°ɰÚ°ç°ì°±±.±;±C±R±\±b±k±t±t±y±y±y±y±y±‰±‰±‰±¡±·±¿±Ú±ë±ø±ú±² ² ² ²²%²*²*²1²?²D²\²h²z²†²Œ²”²š²£²ɲÕ²Û²á²ğ²ø²³-³>³K³M³[³[³`³`³g³u³z³�³™³¥³«³±³º³¿³¿³¿³¿³¿³׳ܳܳܳܳܳí³í³í³í³í³í³í³í³í³í³´´#´>´O´\´^´k´{´€´€´€´‰´£´¯´´´Ö´â´â´ç´ç´ç´ç´ç´ç´ç´ç´ü´µµµµµµµ)µ;µSµhµ‰µªµµµƵ˵˵˵Ôµúµ;¶T¶\¶d¶r¶œ¶¥¶«¶̶å¶å¶å¶å¶å¶·@·I·O·U·Z·c·l·q·q·q·q·€·”·²··È·Í·Í·à·ô·¸-¸3¸3¸8¸8¸G¸[¸y¸‰¸�¸”¸”¸§¸»¸á¸ô¸ú¸ú¸ÿ¸ÿ¸ÿ¸¹-¹5¹P¹a¹n¹p¹¹�¹�¹�¹�¹�¹•¹•¹•¹•¹•¹•¹•¹•¹•¹•¹•¹•¹•¹•¹•¹•¹¤¹³¹¾¹À¹À¹ɹ˹˹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹߹á¹á¹ø¹º º ººº%ºAºYºhºtºŠº¤º§º±º½ºãº»#»G»I»\»Š»b»¥»¥»¨»¸»À»Û»ì»ï» ¼¼#¼;¼;¼f¼i¼x¼Œ¼­¼Á¼ݼɼù¼½,½a½_½T½I½:½o½o½o½r½w½z½”½¢½нò½ò½¾ ¾/¾C¾d¾x¾”¾€¾°¾°¾ξ¿¿ö¾ë¾ܾ¿¿¿¿¿¿ ¿0¿Q¿]¿®Â@Ä…²/Ç/ÇEÇIÇTÇ[ÇfÇzÇzÇ…Ç–Ç�ǪǶÇÃÇÇÇØÇØÇáÇæÇîÇşÇ ÈÈ&È9È9ÈQÈQÈlȘȘȬȮȮȸÈÀÈÀÈÊÈÒÈÒÈÒÈãÈãÈãÈéÈñÈ÷ÈüÈüÈÉ
ÉÉÉÉÉ/É?ÉIÉXÉ]ÉeÉeÉjÉjÉqɇɗɡɩɯɾÉÃÉËÉÑÉÑÉÖÉİÉèÉÊ+Ê5Ê=ÊCÊXÊ^ÊcÊcÊcÊcÊcÊcÊcÊcÊcÊnÊ|ʌʒʚʩʮʻÊÃÊÈÊÈÊÈÊĞÊÙÊâÊïÊ÷ÊËËBËJËYËcË}˃ˈˈË�ˢ˪˿ËÇËÏËäËæËñËùËÌÌÌ'Ì/Ì6Ì<ÌBÌFÌOÌTÌx̡̭̲̄̌̾ÌÉÌÎÌÎÌÎÌäÌÍÍÍ Í'Í/ÍDÍIÍTÍ\ÍqÍvÍv͚ͦͮÍÃÍÏÍÔÍàÍëÍğÍğÍğÍğÍğÍğÍûÍûÍûÍûÍûÍûÍûÍûÍûÍûÍûÍûÍÎÎÎ&Î6Î<ÎDÎSÎXÎ`ÎhÎjÎrÎ�·Î�ΗΙΡξÎÇÎÏÎ×ÎŞÎòÎûÎÏ ÏÏ Ï(Ï6Ï;Ï@ÏRφÏ�Ï�ϧÏÁÏÉÏÎÏÎÏÎÏ×ÏàÏãÏíÏûÏ␍ĞĞ!Ğ3Ğ3Ğ3Ğ>ĞCĞ`ĞeĞeĞnĞsĞsĞsĞsĞsĞsĞsĞsĞsĞsĞsĞsĞsĞsĞsĞsĞ~ЊТенĞÌĞÑĞÙĞàĞíĞöĞÿĞÑÑÑÑÑ#ÑAÑIÑLÑNÑ^ÑhÑhÑhÑjÑÑ�ѓіÑ�ѣѣѬѱѹÑÀÑÍÑâÑéÑúÑÒ#Ò<ÒQÒfÒmÒmÒrÒrÒrÒrÒrÒrÒrÒzÒ…Ò‘Ò Ò¥Ò¥Ò­ÒµÒÂÒÇÒÇÒÇÒËÒĞÒĞÒàÒåÒåÒåÒñÒøÒşÒÓ␍Ó$Ó3Ó;ÓLÓTÓwÓ}ӄӆӌӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӓӕӕӰӺÓÈÓÈÓÍÓØÓßÓûÓÔÔÔ ÔÔ5ÔCÔ7ÖAx[7Ö7ÖMÖTÖ[ÖfÖmÖ~ÖˆÖ�Ö™Ö¬Ö´Ö´ÖÏÖéÖïÖøÖÿÖ×␍××× ×%×0×:×L×R×h×o×w×�×”×”×”×¢×É×Ò×Ú×ì×ô×ô×ô×ÿ× ØØ!Ø7Ø>ØFØMØbØsØsØzØzØz؈دؼØÅØÍØߨçØçØçØõØıØıØÙ Ù%Ù1ÙvÙBx`º‡Ü‡ÜŸÜ¯Ü¶Ü½ÜÈÜÛÜŞÜæÜíÜğÜİİİ$İ'İ2İHİSİ^İiİtİ{İ�ݚݷİÀİÈİèİëİñİöİŞ ŞŞ"Ş(Ş0Ş0Ş<ŞJŞYŞaŞpŞxޛޡާީޯ޵޵޵ŞÚŞߪüŞÿŞÿŞßßß"ß<ßHßXßk߇ߜߤ߮ßÍßáßáßUàC ?Cç0ç0ñ0ù0ş0DôÑÊgZgZˆZ“Z¤Z“Z¾ZÌZÌZÜZåZìZğZùZùZ[[%[3[?[E[P[t[t[…[�[–[�[¢[¢[µ[À[Ñ[Ü[ç[î[ø[\\\\\*\/\/\@\@\S\X\i\o\x\�\¡\¡\¦\¦\´\¹\¹\¾\Å\Í\Ô\Ö\Ş\å\å\ô\ú\]]]:]:]B]Q]\]c]e]y]ˆ]�]’]’]’]¥]ª]¹]À]É]Ş]ò]ò]÷]÷]ÿ]^^.^5^:^:^F^U^g^v^‘^œ^¶^È^Ú^é^___'_;_B_I_\_^_l__�_�_�_­_´_Ë_Ò_Ş_ë_ë_ö_
`` `!`5`G`N`_`m`�`–`¢`À`À`À`È`Ó`×`ß`ã`ë`ò`a␍a+a0a9aDaMaUaZaZaiava„a�aša¨a®a´aºaÃaÉaØağağab bbb8b>bDbJbSbdb‹b“b�b«bÃbÊbÖbåbúbúbc cc$c$c$c$c.dEDTaç{ç{û{||
|-|/|G|_|g|FœfÉgRgR‰R“R»RÊRÕRîRóR÷RÿRSSS'S,SASRSqSyS{SšS¢S±S¸SÄSÉSĞSØSŞSàSñSöS TøST!T!T)T2TAT`TgTiTˆT�T�T�T¦T¯T»T¿TÍTãTØTûTUUU,UU;UAUHUPUVUXUiUnU„UpU“U™U™U¡UªUªU´U´UÌUüUVVV#V9V.VQVQVcVG ;z¿á¿áŞáçáêáüáâââ"âCâaâpâ�â¢âºâÁâçâãã1ãBãYã]ã]ãaãfãkãuãxã‚ã‡ã ã£ã£ã£ã£ã¨ã®ãÊãØãäãíãä ää.ä9äEäNäbäbäqävävä„äHPcs?@?@`@M@‚@o@‘@ @¨@³@µ@À@Ë@Ë@í@ó@IPµÅ¿ú¿úÓúØúçúçúîúû1ûûNû@ûfûnûJŒ•´?ù?ùrù�ù�ù±ùµù×ùçùìùìùóùûùúú$ú5ú:úKú_údúfúfúfú‚ú ú ú½úKP�­ = =H=J=X=^=y=ˆ=—=¦=´=¿=Â=Ò=Lè7÷.÷."/%/(/./3/J/a/x/œ/¸/»/Ú/ô/00)0:0?0J0R0R0\0\0g0l0�0‡0¦0Å0Ç0Ü0â01 1(13131=1=1O1�1¥1·1M$ ZZ:Z#ZDZLZNLx‡ÖÌÖÌèÌıÌÍ Í&Í.Í>ÍIÍZÍ`Í’ÍOTHY0e0eBeDeMeVedeiereuezeˆe’e•eŸeP¨!Gˆcˆc˜c¡c´cÁcÍcÙcåcñcddd"d+d2d;dRdidnd€d�d›d­d­d¶dÙdÙdÛdîdğd
eee0eQlõŒ p p9pDpTp�p¤p¸p¿pÇpÏpØpàpèpêpòpúpqq'q?qHqHq}q§q°qÒqìq r3r?rarcrjrqrqr”r°r×rórs6s]sys s¼sãsÿs&t&t5tBtGtGtVtcththtotztŒt¤t¼tÔtÖtÖtÖtİtİtêtïtïtïtuu!u6uruyuyuyu�u�u¬uÊuÓuÜuéu÷uv-v-v-v?vMviv‡v‡v‡v’v•vÄvÆvİvãvôvıvÿv wwww*w*wNwPwWwhwqwsw�wƒw‘w“w¡w¡wÁwÁwÁwÁwáwx;xCxGxOxSxaxoxqxyx}x�x‰x—x¥x¥x¿xÊxàxôxy-y8yByIybynyuy�y�y y¥y§y­y¾yÏyŞyåyöyÿyzzz z!z/z/z/zSzSzrzyz€zƒz�z’z z¤z²z¶zÄzÈzÈzázèzízûz{{0{P{c{r{t{ƒ{…{”{�{�{¬{µ{Ë{Ò{÷{ü{%|U|Z|h|j|x|�|›|�|Ÿ|¦|·|À|Â|Ğ|Ò|à|â|ğ|ğ|}}}}}/}/}/}:}V}{}”}™}™}™}»}À}À}À}à}å}å}å}~ ~ ~~~~~~~#~#~&~+~J~`~…~¡~µ~º~º~Õ~â~ä~ó~ü~>@@HCƒƒƒ¢¢¢ÃÈÈÈêïï€€3€8€8€S€a€c€r€{€•€—€—€œ€—€½€¿€¿€Ç€Â€���␍�␍�7�7�a�y�‘�œ�²�Æ�ß�÷�‚-‚/‚@‚]‚t‚{‚s†R„7/è/èMè[èqè‹è™è·èÂèŞèŞèŞèëèééééé0é2é2é@éMéhéhé�é‘é¥é·éSæd®Ü®ÜÈÜÑÜñÜñÜ÷ÜÿÜİİİİ*İ*İDİIİIİOİTİTİZİ_İ_İeİjİj݂ݕݛݠݠݩİÉİÉİÉİĞİÒİÒİÙİÛİÛİáİáİèİêİêİğİğİ÷İùİùİÿİÿİŞŞŞŞŞ"Ş"Ş"Ş"Ş.Ş6Ş>ŞFŞNŞVŞ^ŞdŞ|ދޕޘޘޢިޮޮ޲޺ŞÁŞÅŞÍŞÕŞÛŞãŞêŞòŞúŞşŞßßß"ß.ß4ß<ß@ßGßOßWß[ßaßißpßx߀߄ߊߕߚ߰ßÁ߯ßÉßnàTLœ«H‡H‡a‡c‡j‡€‡�‡–‡®‡Æ‡É‡Û‡#ˆUÔ*[fğfğzğ�ğ�ğ¢ğ°ğ¹ğÈğÈğ×ğâğíğøğÿğñ&ñ=ñCñHñLñ_ñ_ñuñwñ�ñ¥ñ°ñ²ñËñÏñİñâñâñéñøñòò}òV$ÏYÏYúYãYZ ZWP©¹gCgCˆCuCªC—C¹CÈCĞCÛCİCèCóCóCDDX,>×>×G×M×U×^×g×l×Y�w�w�˜�­�»�È�û���:�J�J�W�W�^�q�o���Š�”�š� �£�±�¸�Ğ�×�Ú�ï�ô�ÿ�
�$�>�O�U�[�b�y�h�‰���•���½�¥�Æ�Ì�Ò�Ú�Ú�á�ø�ç�‘‘‘‘<‘$‘E‘K‘Q‘Y‘Y‘Y‘o‘o‘o‘o‘z‘„‘�‘­‘¹‘ʑϑà‘ô‘ù‘ù‘’ ’’ ’,’@’P’e’z’—’œ’œ’§’¯’¼’Ç’×’æ’““-“8“=“=“H“^“s““�“•“¦“º“º“Å“º“İ“â“â“ñ“ö“ö“”
”
”” ” ”1”6”6”I”X”]”]”p””„”’”„”¦”«”¹”«”͔Ҕà”Ò”ô”ù”•ù”• • •=•B•d•i•w•i•‹•�•�•­•²•Ô•Ù•ç•Ù•û•–––"–D–I–W–I–k–p–p–�–’–´–¹–Ç–¹–Û–à–à–û–——— — —;—@—@—[—`—`—{—€—€—›— — —»—À—À—Û—à—à—ñ—ö—ö—˜ ˜ ˜˜#˜8˜=˜=˜I˜b˜g˜�˜”˜�˜£˜´˜¾˜Ó˜ޘã˜ô˜ÿ˜™ ™ ™™™™%™/™/™B™G™G™G™K™d™m™m™“™˜™˜™ ™´™½™×™ä™ï™ú™šš#š,š1š1š1šBš_šjštšš„š�š—šœšœš§š¯š¸šÚÓšëš››››'›:›D›O›p›|›�›’›£›§›¬›¬›¼›Ç›Ï›Ô›ß›ï›ş›œ0œEœPœUœ`œhœmœxœˆœ—œ´œÉœŞœŞœŞœŞœãœèœèœôœ��*�,�I�I�S�g�q�s��‡�¤�µ�¿�Ê�í�ş�� �+�C�S�X�X�c�h�h�p�{�€�€�ˆ�“�˜�˜� �Á�ª�¨�Ù�Ş�Ş�æ�Ÿğ�î� Ÿ$Ÿ8Ÿ$ŸPŸUŸUŸbŸgŸgŸoŸtŸtŸ†Ÿ˜Ÿ�Ÿ�Ÿ±Ÿ�ŸÉŸΟΟÖŸÛŸÛŸîŸóŸóŸ     % 5 : : T d i i ƒ “ ˜ ˜ ²  Ç Ş Ç ö û û ¡ ¡G¡5¡#¡ ¡_¡d¡ ¡�¡|¡d¡¸¡½¡½¡Ì¡Ü¡á¡á¡ğ¡¢¢¢¢"¢'¢O¢=¢'¢g¢l¢”¢‚¢l¢¬¢±¢Ù¢Ç¢±¢ñ¢ö¢ö¢£ı¢=£M£R£R£m£Y£—£§£¬£¬£¸£½£½£É£ΣΣá£ñ£ö£ö£ ¤¤¤¤1¤A¤F¤F¤Y¤i¤n¤n¤v¤{¤{¤ƒ¤ˆ¤ˆ¤�¤•¤•¤�¤¢¤¢¤µ¤º¤º¤ͤÒ¤ ¥¥ü¤ê¤Ò¤-¥2¥€¥n¥\¥J¥2¥�¥’¥’¥¡¥¼¥Á¥Á¥Ò¥í¥ò¥ò¥¦¦¦¦¦#¦#¦+¦0¦0¦8¦=¦=¦u¦c¦Q¦D¦”¦¯¦´¦´¦ì¦Ú¦Ȧ»¦ §&§+§`§N§C§+§x§}§²§ §•§}§ʧϧé§Ó§ϧ¨¨#¨␍¨¨;¨@¨@¨L¨e¨u¨†¨†¨«¨­¨èɨɨæ¨ó¨$©U©C©x©€©€©€©Œ©‘©‘©¤©¯©¹©¾©É©Ó©Ø©Ø©ò©÷©÷©ÿ©ªªª'ª2ª7ªKª7ªZªeªjªjªuª†ª‹ª‹ª–ª¡ª¦ª¦ª·ª¼ª¼ªÖªáªæªñªæª««««(«-«8«-«G«L«`«L«o«t«t«ˆ«t«—«—«—«œ«¨«œ«»«À«À«Ì«À«ß«ä«ä«ğ«ä«¬¬¬¬¬'¬,¬@¬,¬O¬[¬f¬q¬v¬Ьv¬™¬¥¬°¬»¬À¬Ô¬À¬ë¬ã¬ô¬ù¬ù¬­­­­­­­"­"­+­0­0­;­@­@­K­P­P­[­`­`­k­p­p­{­€­€­‹­�­�­›­ ­´­ ­íέÙ­ä­é­é­ó­ø­ø­®®®®®® ®%®%®-®2®2®?®D®D®Q®V®V®V®V®V®^®c®c®k®p®p®x®}®}®…®Š®Š®’®—®«®—®º®Ë®Ğ®Ğ®×®â®¯¯¯(¯A¯-¯P¯[¯f¯k¯k¯r¯}¯�¯¢¯¸¯ïܯȯë¯ö¯°°°␍°°8°=°S°^°w°c°†°‘°œ°¡°¡°¼°¨°˰ë°ğ°±±*±±M±9±\±g±l±l±‡±s±–±¶±»±ѱܱõ±á±²²'²2²7²7²R²>²a²�²†²œ²§²À²¬²ã²ϲò²ı²³³³³³%³*³*³*³0³5³5³5³?³A³A³K³R³u³w³w³�³�³�³�³�³ƒ³ƒ³š³¡³¬³¬³·³½³ijϳÚ³å³ß³´´´5´5´C´=´i´^´�´�´�´Š´‘´¤´©´·´Ê´Ê´é´ô´ µ+µ+µ+µLµ\µqµƒµ“µ“µ¸µ¿µεàµàµäµéµğµ  #:AFFJUaoœ¥Ä÷···6·B·S·X·i·ˆ··ß·â·ò·ô·ô·ø·¸"¸"¸%¸6¸g¸ЏЏ�¸²ºZ, n×n×|ׂ׆×�ט×�×[`EY‡†‡†�†«†²†¶†ņކâ†è†ş†‡‡‡N‡<‡‡m‡w‡\8
_Y_Y€YmY�YšY¥Y°Y»YÇYÍY]\’¡¡¡ ¡+¡3¡>¡I¡T¡V¡l¡l¡~¡Š¡“¡–¡Å¡^l½”_î_î„î‰î–îÂîÂîÍîÚîøîï-ï2ï[ï{ï—ï�ï¡ïÄïêïïïğ5ğ[ğrğxğ|ğ•ğ�ğ¢ğ³ğ»ğÚğàğäğığñ$ñ)ñ:ñBñañfñnñtñxñ|ñ�ñ–ñ›ñ¹ñ¾ñËñĞñĞñİñõñòò1ò1òHòMòMòdòfòfòzò|ò|ò“ò•ò•ò¬ò®ò®òÅòÅò×òÜòÜòëòëò$ó=ó=óPóUóUóUóUóxó”ó°ó°ó°ó¸ó½ó½ó½óÅóÊóÊóÒóÒóÔóşóô ô@ô@ô@ô@ô@ôZô]ôrôyô{ô„ô—ô™ô¥ô¥ô­ô¿ô¿ôËôŞôõôÿô'õ9õUõuõ–õ®õÍõóõö öEö]ölöƒöŸö¤ö¤öØöİöİöğöğöüö÷÷÷+÷J÷p÷÷�÷Â÷â÷ñ÷ ø2ø<ø^ø`ø`ø`øløløløŠøºø¼ø¼øËøËøĞøĞøĞøĞøĞøçøìøÿø>ù_\
¯N¯NÁN×NóNOO,O7OLO9O[OcOnO„OzOœO¢O`àï9ï9␍::::%:):+:2:9:=:A:T:|:—:„:¯:´:Ø:Ø:ä:ì:û:5;:;g;o;t;};‰;‘;˜;º;À;â;ä;<%<<4<:<A<A<G<J<N<_<_<‚<”<a$‡à‡à–à±à±à·àb|k†�ë�ë©ëÕëÕëôëììììì␍ìì0ìIìKìKìKìSìnìpìpìzìzì’ìc”"_5_5�5‹5—5œ5¬5²5Ç5Û5ë5ù566&606?6G6T6\6_6_6_6a6p6z6ƒ6‹6�6 6dô¦ßß6ß6777!7'7>7U7l7w7­7Í7Ò7×7â7ü78818C8Z8_8q8v8y8™8¹8Á8É8Î8î8999 9@9H9M9R9]9]9h9h9t9t9†9Æ9ß9ß9ï9ed¤¹����#�)�1�?�R�^�x�…�…�ˆ�–�¦�À�Ä�Ì�f(¸şr*r*ˆ*�*¡*Ğ*à*ç*÷*+
++8+b+s+�+�+ˆ+˜+¤+´+½+Ô+Ô+ê+ê+,,,,,,,,B,B,X,X,n,n,„,„,›,›,²,²,É,É,à,à,÷,÷,--%-%-<-D-O-`-k-|--�-˜-Ÿ-æ.g¬÷  8 > E M U X c u u Œ “ – ˜ ¤ µ µ ¸ À Ö Ù ç ê í ô ø    3 6 … h(Èη€·€Ş€Ë€í€ÿ€�i=‡Q‡QªQ¿QÄQÌQÔQÜQéQïQøQşQR"R;R@RFRHRJRWRWR\ReRmRvR~R€RˆR�R˜R¥R«R¶R½RÍRØRçRSSS#S4S8S@S@STSdSlSoSÕSj8-7*0*0>0B0G0R0]0`0d0l0kˆZøw‡w‡‘‡¬‡²‡¹‡¹‡À‡å‡ê‡õ‡ˆı‡"ˆ5ˆGˆPˆXˆbˆ€ˆ’ˆ›ˆ£ˆ­ˆȈ²ˆ׈éˆóˆûˆ‰ıˆ8‰"‰G‰Y‰c‰k‰k‰t‰|‰’‰«‰½‰̉ЉЉ׉܉ú‰ü‰Š Š"Š"Š"Š&Š2ŠSŠ]ŠgŠpБЛХЧЧŠÄŠÒŠàŠãŠüŠ‹‹ ‹>‹B‹]‹a‹a‹a‹g‹u‹‹˜‹�‹©‹µ‹·‹¿‹Å‹Ş‹é‹÷‹ŒŒŒ%Œ1Œ3Œ;Œ>ŒWŒYŒeŒgŒoŒuŒ�Œ¦Œ²ŒÇŒÌŒáŒñŒ
���&�1�I�U�j�o�„�”�­�¾�¾�Ä�Ï�×�å�ì�ş�leãnànàˆà‘à±à±à·à¿àÇàÏà×àİàêàêàøàıàıàááááááááá6áIáOáTáTá]á}á}á}á„á†á†á�á�á�á•á•áœá�á�á¤á¤á«á­á­á³á³áºáºáÂáÈáÎáÖáÖáÖáÖáâáêáòáúáâ
âââ0â?âIâLâLâVâ\âbâbâfânâuâ}â…â‰â�â—â�â¦â®â²â¸âÃâÉâÖâââèâğâôâûâã ãããã$ã,ã4ã8ã>ãIãNãdãuãzã}ã"äm`b!b!k!r!†!š!Ÿ!½!Â!à!â!"""-"6"8"L"\"�"n�2Ò8•8•N•_•p•�•’•£•¶•¾•Ì•ê•õ•û•–––0–A–G–\–w–w–ƒ–‹–“–™–®–¶–º––Ж֖ۖۖ𖗠———"—E—X—d—h—r—‹—‘—“— —¢—´—´—»—×՗՗˜˜'˜+˜5˜9˜E˜I˜U˜Y˜e˜i˜i˜˜’˜˜˜œ˜¦˜ª˜¹˜½˜Ì˜Ğ˜ã˜ç˜ç˜ç˜ç˜ş˜ ™™!™8™H™V™a™w™„™“™›™¨™Ã™Ó™ã™è™è™è™è™õ™š šš'š6šKš\šlšršršrš„šŠš–šœš©šÄšÔšàšæšóš››5›¿œoÔÃô0n0nBnSn^nin‚n”n¬n±nÀnÇnÔnÛnénğnònõnúnünoo6oLodoioxooŒo£oÁoÈoÊoÍoÒoõop pp$hm&& &4&;&U&qxKewQwQŸQ‹Q®QÉQµQØQİQäQìQóQşQ RRR$R/RER:R]ReRrJ‡otot‹t’tªtÂtÌt×t×tÜtçtótşt uu,u3u9uNucucuwuu�uœu«u¸uÉuÚuèuöuıuvv-v-vAvNv_vovxv‰v‰v�v�v®v»vËv-ws8³½7Q7Q;Q@QEQVQdQmQrQwQyQt88Br0r0†0Š0�0š0¤0§0«0³0u0ˆ�WOWOmO€O�O“O–O�OvÜt††¨³¾Ç×éïõû%25=OUZ}�”š±·ÇÍÙçìú!*:<CHPo}‰£ÂÉÓâèîôú1EQhs‚�Ÿ¬¼Êáíò.ENT_dj�Œ™  ®½¿ÍÜîîö$Xw`0D‡…‡…�…¯…¶…º…É…è…ì…ò…†%†'†'†X†F†'†w†�†xDˆÕ‡ä‡ä™ä¡ä¬ä²ä¸ä¼äÀäìäìäóäöäûä␍åå8å<åAåAåHåKåPå\åmåqå‚å”å˜åšå¬å°åÌåĞåÕåÕåéåìåúåæ æ1æ<æ@æEæ{æ”æŸæ£æ´æ¿æÃæÅæĞæÔæÔæèæìæîæîæùæıæççççç;çy¼Ö?ç?çSçiçiçiçnçnçuçzçzç�ç†ç†ç“ç˜ç˜ç¥ç¬ç®ç®ç»çÂçÄçÄçàçàçàçãçåçåçåçéçëçëçïçïçïç èèè)èz°0X¿Z¿Z×ZßZêZN[4[)[[øZT[f[V[†[†[�[‘[Ï[Ô[à[õ[â[\
\\5\$\\L\N\j\j\q\›\›\›\§\{ÈLºüü,ü7üBühühüjüwü‚üˆü™ü¨ü·üÄüÄüÊüÏüÔüêüıüı ıı+ı3ı>ı:ıUıcıcıcını‰ıtı‘ı¤ı¦ıÂı®ıÊıØıØıÚıöıöııış şşş8şLş?şTşZşcşcşcşvş{ş{şƒşƒş�ş£ş¬ş¬ş¬ş¬şÈşßşåşêşêşÿşÿ
ÿ
ÿÿ3ÿSÿXÿ]ÿ]ÿiÿ†ÿ•ÿ¤ÿ¬ÿ±ÿ·ÿ¼ÿ¼ÿÃÿÊÿíÿ
 )>>DDQZZx�™�«¿Ç×îîşşENNPW\\itzƒƒ–£µÀÎ×Ü &.AV[bovˆ�¤ª³³¼Öİâğ$$7ILL]emy–�ª¬³ÇÖÖÖ␍␍"-?LWep††Ÿ²´ÃØÚèıı   11>AL^epu}„�”©«ÅÚÚÚÜãéú '05Ybbhqq��� ©²ºÅ×İèèõø
/5@@MPYbd†™®´¿Ñ×ßßßßêc |t·ĞR4R4d4m4p4y4‚4”4”4À4Ä4É4Ì4Õ4ä4ê4í4õ4ø4ı45}`2§O§OÏO»OŞOPïOPPP&P-P8P@PKPaPVPyP�P~À-¸g¸gÖgægğgğgúgúghh#h&h(h1h>h>hLh`h`h„h‘h‘h¡h®h®hÑhŞhŞhóhi*iLiUibibi…i�i�iÂiõiûiûiûi␍jt�Z3Z3n3�3¡3µ3¼3È3â3ë3ñ34␍4␍4!4!4$4'4<4B4D4D4L4€¸ºäĞ�Ğ�è�ê�ö�ú��
�$�$�$�*�.�6�A�U�a�c�c�l�n�n�w�y�y�‚�„�„�����–�œ�Ÿ�©�º�À�Ì�Ì�4��œ&§(§(Å(Ö(î(õ())))I)5)X)i)n)�){)§)Ä)Ë)ç)Ü)ÿ) * *.*?*U*A*m*z*z*’*’*œ*‚¨¥33‹3›3¦3Ğ344"444;4B4V4]4]4l4z4‰4¡4°4½4À4Ù4Ü4á4ø4555#5Y5ƒx± (±(±>±E±L±k±z±‰±˜±§±¶±À±À±Å±Ì±ß±î±ó±²(²(²>²P²T²b²i²n²n²u²‡²�²’² ²²²²²²²Ä²Ï²á²ì²ù²ş²³³#³/³4³A³F³V³[³k³m³}³³�³‘³¢³«³«³­³½³Ä³Ô³Ô³ï³´´%´5´5´5´8´K´„\åø8�8�S�Z�_�m�‚�‰�“�¡�¤�¦�°�Â�Â�É�ÿ�…0ÎÖff~¾²ˆ†ÒÚ†`/‡„‡„�„¯„¶„À„Ï„è„ì„ò„…%…'…'…X…F…'…w…�…‡L[j÷1÷1222%272=2F2X2^2a2�2ˆ(–œ*3*383G3K3N3T3‰\k~Ÿ2Ÿ2­2¿2Å2Í2ß2å2î2333!3'3*3x3Š, ××$×+×3×8×>׋„$oo�Ÿ¦­¼Áããè
  .=?aaapŒ‚¤®Œ`B÷h÷hii#iHiViXifisiyi„i›iªiµi¹iÄiĞi×iãiúij$j;jEjSjejgjuj‡j‡j�j¡j§j·j·jÏjÏjôjôjùjùjkkk'k<kSkbkmkk‹k¢kºkÛkÛkäkékékékékùkl
lll+l;l@l@lNlNlSlSl]lhlzl€lŒlœl§l±lµl¾l×lÚlêlñlmmm'm7mGmNmTm`mhmsmzm~m‘m—m¤m¯mµmÅmÕmÕmn n,n4n?nFnQnanqnqn�n†n†n�n›n­n³nÁnÎnÛnånénòn ooo%o*o*o>o>oCoGoWo`oroxozozoˆo�o—o¨o±o½oÍoÍoÍoÒoêoêoùoüop.p9pbptpp‘p•pšp¡p³pÃpŞpåpépïp÷pqr�8ø((!(6(L(m(Z(…(�(�(§(�`j~X X x  ‡ ’ œ § ¯ ¾ È Ë ğ ò ¡¡¡�_�Ú�Ú±Ú¸Ú¿ÚÄÚÛÚíÚ÷ÚıÚÛÛ Û(Û+Û-Û7ÛAÛAÛEÛMÛUÛ]ÛgÛpÛxÛ{Û„ÛŸÛ°Û·ÛºÛ¿ÛÎÛÔÛÜÛÜÛãÛæÛëÛúÛÜÜÜÜÜÜ-Ü8Ü@Ü@ÜKÜ_ÜfÜmÜ„Ü�83=ö×ö×ÿ×ÿ×␍ØØ Ø"Ø'Ø‘8>H.Ø.Ø7Ø7ØEØIØPØSØXØ’DDQÿ0ÿ01,161=1I1a1j1n1€1†1¥1“Ä{¨77adkpvx}ƒƒ•œ²ÅÔÚÜãéóó    7IP_awŠŠœ”0RZ§1§1°1Ö1ç1í1í1õ1•„\y~ò~ò�ò¥ò¯ò¸òºòÁòÑòÜòŞòèòèòñòóóó)ó4ó6óOóVóZóió|óÏó– 
ö/ö/ÿ/0!0—húOfOfefpf{f‰f”f�f®f·fÈfÎfÚfñfñfgg!g*g;gAg�g˜„=ZOJOJJ…J�JšJ¢J©J­J¶J¶J»JÂJÚJK K-K5K7KOKgK‹KªK¼K™lò __w‰�—¹»İòß##5<^^fš y}ˆ‹ˆ‹‘‹�‹¢‹›(AVèVèxè€è†è�è�è�è¡è¡è¡è©è±èÃèÒèÃèçèéèéèééééé0é5é5é5éJéLéYé[éhéjéwéé‡é�é¢é¯é±éÂéÏéÏéÏéØéêéıéê ê␍êêê/ê/ê/ê:êDê\êaêaêaêoêuêzê‚ê�êŸêªê¯ê¯ê¶êºêÈêÌêÕêÜêúêëëë3ë8ë8ë8ë8ë@ëKëYëYëyëyëyë€ë�ë�ë°ëÃëÅëÅëÅëØëØëßëæëëëñëì␍ì)ìSìYìYìmìrì–ì�ì©ìÇìÚìåìììğìğìğìğìûìíí5í@í]ígígíuí“íÃíÖíçíşíîîîîî)î;îFîKîKîKî]î‡î�î�î�î˜î¢î®î¹î»î»î»îÀîÌîÌîïœH%Š/Š/˜/Ÿ/ª/·/Â/Ê/Ê/â/ì/ò/ø/�0 7N7N^NKNmN‰NN¡N©N�Lè÷÷&÷&'&'<']'J'u'z'¥'Æ'³'Ş'ö'ö'(Ÿğ[“¿K¿KôKıK LLL;L;LELGLbLJLqLqLL‰L�L°L²LÌLÓLÓLïLïLMM:MSMpMsM{M‚M¢M¤M¾MÅMÅMáMáMşMşM%N7N TWhÎÎäñ÷ı*<@FTWa¡0
Rgg–‹·£ÚÆéõú*5ALTYej~…‰”™¤½ÆÒ×ëòööû2GY^iqqqsŒ¡¬ÁÃÎÖÖæÛş¢àZ� e eºeÈeÍeÚeèeñe ff?fHfXfsf~f�f�f’fœf¨f¬f¹fÅf×fßf÷fûfûfûfûfgg8g8g?gBgJgVg_gµg£d'<Ÿ*Ÿ*½*Õ*æ*í* +ş*!+A+-+P+a+w+c+�+œ+œ+´+´+¾+¤ü%`¯¯ÇÙä÷ë AVC‹qeš···Éææ2&di|p¤’³ÔìÙû/>[[[mŠŠ«²ÔÔÜ¥(fåfåtå—å�å¢å¢å¨å¦(!'�×�×§×µ×»×½×Â×§D]j : :::A:J:V:k:s:y::�:�:‘:¨„½Ú¸ª¸ªëª÷ªûª« ««««"«&«.«3«7«H«Y«[«_«p«�«�«£«««¶«¶«¶«È«©€ÀœÀœÙœàœçœîœôœ���$�;�>�@�[�e�o�v���“�›�›�±�±�Ã�ª Ê gVgV�VªV²V½VÍVÖVÚVõV W$W*W2W5WJWOWaWƒW‰W‘W–WœWŸWµW¾WÀWâWêWÿWXX5X;X@X@X@XMX^XiXvX‚X•X¢X¯XÆXÛXåXçXşXYYY%YHYHYHYZY«<ÑÜ
5
555$5,545<5C5S5S5X5¬´*££3£@£E£I£R£a£m£x£ƒ£‹£–£�£¡£­£µ£Ï£õ£ï£¤¤C¤/¤S¤S¤k¤v¤’¤™¤½¤Ä¤ö¤ö¤ö¤ö¤W¥­˜‹-ş¸ş¸¹"¹*¹5¹L¹V¹V¹m¹w¹’¹¨¹¶¹º¹Ú¹î¹º º␍º&º0ºAºNºNºUº\ºaºfºkºrºyº“ºšºªº®º®º¸ºÎºÒºÒºãºöº » »»»!»)»4»;»C»N»U»U»`»~»‚»š»‹»µ»µ»»»Â»Ñ»Û»é»ğ»ô»ö»¼¼¼¼"¼H¼V¼V¼Z¼o¼w¼‡¼’¼§¼¬¼º¼É¼Ó¼á¼ì¼ğ¼õ¼ı¼½½½!½#½2½4½C½J½N½b½l½z½�½…½•½ ½¥½Ã½Í½Û½â½æ½ğ½ş½¾ ¾¾'¾/¾:¾>¾>¾>¾I¾T¾d¾p¾†¾�¾™¾¨¾°¾»¾À¾È¾Ó¾ß¾ã¾î¾ó¾¿¿¿¿¿¿7¿T¿`¿h¿x¿ˆ¿¦¿ª¿Ù¿Î¿¿¿é¿é¿ó¿ú¿ ÀÀ"À0À7À;À=ÀLÀVÀdÀkÀoÀoÀqÀƒÀƒÀ•À•À•À›À§À¹ÀÁÀÙÀÁÁÁ5Á<ÁCÁNÁdÁiÁpÁƒÁ�Á›Á¢Á¦Á¨Á»ÁÅÁÓÁÚÁŞÁŞÁŞÁŞÁìÁ÷ÁÂÂÂ)Â-Â-Â2Â:Â>ÂMÂOÂ^Â`ÂoÂq€‡‹Ÿ©·¾ÂÂÂÒÂİÂâÂÃ
Ãà Ã#Ã-Ã;ÃBÃFÃPÃdÃlÃwÃ{Ã{Ã{ÆÃ�ÛõÃÅÃĞÃåÃêÃõÃÄÄ'Ä/Ä:ÄIÄQÄ\ÄaÄiÄtĀĄÄ�ĔĨİĻĻĻĻÄÏÄßÄôÄÅÅÅ*Å?ÅLÅPÅ^ÅsŃŚųÅÌÅÎÅÙÅáÅáÅêÅÆÆ/ÆHÆVÆaÆmÆuÆwƂƊƊƊƧƵÆÃÆÚÆñÆÇ␍Ç-Ç4Ç4ÇDÇXÇrÇrÇvnjǛǶÇÁÇØÇàÇàÇÈÈÈ3È<ÈSÈmÈ|ȉȩȷÈÍÈéÈùÈÉÉ)É)É5ÉPÉhÉqÉqÉqÉ}É�ɦɯɯɶɿÉÅÉÑÉ0Ê®<ùD��%�1�<�F�L�V�\�f�t�~���š� �ª�°�º�Á�Í�Ó�Ü�‘‘‘‘%‘7‘A‘S‘]‘r‘r‘u‘‘”‘™‘©‘´‘¹‘͑ϑà‘’’␍’"’0’9’A’O’`’p’�’�’�’›’›’£’±’ø’¯$› PP+P3P>PDP°l£:_F_FxF�F FÀFÒFêFGG/G7G;G>GBGGGQGTG[GaGhGnGrGwG�G’G™G G¢G¦G¯G¹G¼GÇGÓGÖGçGòGøGÿGH!H2H;HDHLHWHbHnHH�HœHªH¬H³HºH¿HÃHĞH×HúHIII%I>IOIXIaIiIrIxI|I�I…I’I™I§I±IÆIĞIÙIòIJ JJJ&J,J0J5J;JEJOJnJ|J‚J‡J�J—JŸJ¬J´JÓJÆJèJñJ K K3K:KCKLKSK\KeKnK‡KwK—K›KõK±  €ˆ€ˆ�ˆ°ˆ¶ˆ²¸�·z'z'ˆ'�'È'Ê'ÿ'*(*(:(?(?(S(X(X(t(y(y(™(�(�(²(·(·(Ô(Ô(â(),)L)^)p)‚)’)’)’)’)™)r*³$bgÊ%Ê%Î%æ%ø%&´„¯Â¯ÂÁÂĞÂĞÂÓÂÜÂèÂèÂşÂÃ&Ã-Ã1ÃAÃaÃsÃyÈÑÕÛäúþÃÛÃùà ÄÄ Ä2Ä>Ä@ÄLÄTÄXÄ^ÄgÄgÄgÄyĄĊĠħįÄÅÄÌÄÌÄÌÄÚÄÅ
ÅÅ$Å,Å5Å@ÅFÅ\ÅcÅkÅrŇŘŘşşşŭÅÔÅáÅêÅòÅÆ ÆÆÆ Æ'Æ5Æ9ÆEÆ]ÆeÆkÆzƃƇÆ�ƘƘƦƮƴÆÑÆÚÆâÆèÆîÆîÆîÆõÆüÆ ÇÇÇ Ç Ç!Ç+ǵxwÙwمٚ١٬ÙÂÙìÙÚÚ'Ú-Ú<ÚEÚMÚUÚWÚ]ÚcÚrÚzÚ€Ú‚ÚˆÚ¼Ô¯b¯bÒbÚbêbòbc-c1c9cAcGcPc\cdcdclcœcÛc¶cşcd dd2ddKdQdZdadidqd}d…d�d d¨d­d·d×dŞdàdêdùde e"eBeIeIeIeReYerexe€e€e…e‰e•e�e§e³eÖeùeäeff1f>fRfhflf‹f™fºf¥fÓfÙfğfÛf g g g(g5gIg_gggkgvg~g�g¥g�g¾gÁgÉgÙgğgÛg hhhhh$hUh]h]h]h]hfhrhˆh¡h´h»hÇhÎhÎháhåhåhåhìhñhi iiii8i:i?iRiYieililiyiƒiƒiˆi«i«i½i·àt¨÷@÷@ A*AA_AEA9AnA}A…A�A’A�A¨A¨A­AâAçAB4B!BVBCBjBeB†B•B�B¨BªBµBÀBÀBÅBæBèB C CCC7C9C[C[C[CcC¸\æù_e_eue‡e�e˜e¦e²eÉeÉeÛeáeìeüeff"fNf¹$âç??]pw~…‰‹’™��¥¾ÈÈÜçõ 
 # ' 0 4 9 ? \ \ j � † Ÿ ° ´ ´ ´ ¹ Ä Î Õ è ì ñ  ␍    # 5 E \ ^ w Š � � � ¢ ¦ ¯ ³ ¸ ¾ Û Û é !!!/!3!E!E!E!J!Y![!}!}!Ÿ!ª!°!Æ!×!Ü!ç!û!ÿ!" """-"-";"R"T"m"~"‚"‚"‰"œ" "²"·"Ë"Ó"Ü"à"å"ì"##)#.#G#Z#^#p#p#p#p#‚#u#—#¦#¨#Ê#Õ#Û#ñ#$$$ $$5$5$5$D$D$W$n$y$Š$�$•$Ÿ$¡$­$­$´$¿$Ô$Ö$á$ö$%%%%+%2%9%C%K%O%S%U%Z%b%f%x%z%%‡%‹%�%�%–%£%¹%Ù%ó%&␍&&&'&+&+&+&2&7&Q&_&k&r&r&Œ&�&“&­&»&Ç&Î&Î&Û&å&å&÷&º¤ ¹�(J(JEJTJTJTJqJqJ‚J‚JˆJŠJŠJ�J’J’J˜JšJšJ¡J¥JªJªJªJªJªJªJ²JÊJÊJßJêJôJKKK:K<K[K`KK„KŠKŠK£K¦KÍKÚKòKLLL L>L,LDLSLXL_LhL{LƒL‹L�L�L�L™L²L¸L¸LÑLßLüLMM M%M-M2M2M8M8MAMRMTMiMkMsMyM�M†M†M†M†M”M«M­MÁMÁMÉMÏM×MÜMåMíMöMüMNNNN N NN1N5N7NCNEN`NfNnNsN|N‡N‹N‘N•N�N¡N¡N¯NÀNÂNêNO␍OOO#O(O(O-O/O7O7OROdOiOuO{O~O•O—OšOªO®OµO¾OÍOÛOáOéOîOöOûOûOPPP4P9PCPkPvP�PŒP—P¢P­P¸PÃPÎPÎPÎPÖPßPøPQ#Q<Q>QDQFQIQTQVQVQ\QbQbQjQsQyQ…Q…QŒQ�Q®Q¹QÁQÉQÎQÎQÕQÙQŞQğQõQÿQ R RR=R=RFRTReRqRxR†R•R«R±R¶R¶R»RÑRİRåRõRÿRSSS S(S(S2S@SLScSyS�S–S˜S¯S´S´SÔSÔSæSìSõSûSTTTT.T4T6TATSTiTiT}T�TŸT¤T°T¶T¹TĞTÒTÕTåTïTòTòTUU*U/U;UAUDU[U]U`UpUtU|UŠU�U”U”UšU¢U§U§U­U­U»UÁUÇUÑUÛUéUşUVV␍V␍VVVV!V&V&V,V4V9V9V>VIVNVSV^VcV‰V‹V�V•VšVŸV¤V©V®V®V³V¸VÔVŞVòVW WWW"W(W.W8WBWPWeWhWjWtWƒWˆWˆWˆW�W•W�W�W£W£W©W±W¶W¶W»WÆWËWĞWÕWäWäWõWûWûW XXX X)X7XLXOXQX[XjXoXoXoXwX|X…XŠXŠX�X˜X�X�X¢X­X²X·X¼XËXËXÜXâXâXğXöXüXYYY3Y6Y8YBYQYVYVYVY^YcYlYqYqYwYY„Y„Y‘Y—Y—Y¥Y«Y±Y»YÅYÓYèYëYíY÷YZ Z Z ZZZ!Z&Z&Z,Z4Z9Z9ZFZLZLZZZ`ZfZpZzZˆZ�Z Z¢Z¬Z»ZÀZÀZÀZÈZÍZÖZÛZÛZåZíZòZòZòZøZ[[[![!['[1[7[<[<[E[S[\[j[o[o[x[†[’[£[°[·[¿[É[×[×[Ü[Ü[ç[ç[ç[ë[ğ[ğ[÷[û[\\\\\(\0\5\;\;\C\L\Z\e\j\p\x\}\}\}\}\}\}\}\}\}\}\–\œ\¥\«\³\¸\½\Æ\Ñ\Ú\â\ç\ç\ç\í\õ\ú\ú\ş\]] ]]&]/]5]5]>]T]T]Z]c]y]y]‚]„]Š]“]©]©]²]²]²]»]À]À]È]Í]Í]ê]ø]^ ^^^!^&^&^&^:^C^I^[^e^e^m^m^u^w^w^�^š^£^¥^¥^¥^«^¯^±^±^±^±^¶^¼^Â^Æ^=b»Ì€¯¿i¿iáiìijj+jBjWjbjxjdj‡j�j�j�j�j¦j²jÈjİjìj÷j
kkkkkk)k4kNkPkUkdkok|k†k†k”k¼”+LX¥X¥p¥w¥~¥�¥Š¥�¥�¥”¥™¥»¥¨¥Ë¥Ó¥Û¥Ş¥à¥ğ¥ù¥¦¦ ¦¦:¦K¦V¦ˆ¦½à.¢oBoB�B˜B©B¬B°B¹BÀBÎBİBóBCC'C9CHCWChCwCwC…C‰C�C’C–C£CªC¸CÌCÕCÛCéCDDDDDDDDDD+D4D<DRDRDRDWDWDoD{D†D‹D‹D�D“D“D²D¾DËDÍDÍDÑDÓDÓDòDşD
E E EEEEE E E#E#E,E2E7ESESESESESESESESESESESESEUEfExE‡E–E–EšEšE¢E»E¿EÄE_F¾,îÖîÖüÖ× ××׿l3J‡P‡P�P·P£PÆPëP×PúPÿPQQ QQQQ3Q>QTQIQlQvQÀPQaâ$â$ğ$ş$%%&%+%H%N%U%\%j%v%ˆ%Ä%ÁD+®å®åÂåĞåÖåùåÿåæ*æ0æ6æ<æ<æDæÂô#œ§6§6¯6¾6Â6Ï6Ü6ğ6ÿ67)7;7]7…7“7¯7Á7Ù7ğ7û78:8I8d8o8Š8£8£8¾8ç899.9=9L9L9W9j9{9�9�9«9·9Æ9ã9ã9ë9ë9ë9ü9 ::/:8:I:M:U:`:x:�:™:©:±:¶:Ú:ê:ú:;;;&;L;N;Y;Œ;¦;¦;¾;Í;Õ;ä;í;õ;<)<1<9<D<F<V<n<†<�<¶<È<ß<è<ñ<====à ¸ˆ¸ˆÁˆàˆåˆÄ\ˆ[–͖ͰͷÍÄÍÏÍÔÍÚÍìÍòÍ
ÎÎ.ÎDÎOÎUÎwÎw·ΜÎ�ΡέενÎÅÎÓÎÙÎâÎîÎîÎğÎÏÏ␍Ï␍Ï$Ï$ÏBÏBÏUÏbÏgÏgÏ~χϖϬϷÏÅÏĞÏàÏíÏÿÏĞĞĞ(Ğ*Ğ*Ğ2Ğ7Ğ7Ğ?ĞDĞDĞLĞQĞQĞYĞ^Ğ^ĞdĞiĞiĞpĞuĞuĞ|Ğ�Ğ�ЌББМССЬббммĞ×ĞŞĞäĞçĞòĞõĞ ÑÑ%Ñ,Ñ/ÑAÑCÑIÑ]ÑjÑyÑyÑyÑyуÑ�ѲÑÄÑÕÑŞÑïÑõÑúÑÒÒ(Ò7Ò=ÒNÒYÒcÒsÒ‚ÒˆÒ“Ò™Ò®Ò´ÒÅÒĞÒÖÒæÒæÒöÒ ÓÓÓ-Ó4Ó:ÓKÓVÓ[ÓxÓ�Ó›Ó«Ó·ÓÉÓÔÓãÓåÓ÷ÓÿÓÔ ÔÔÔ'Ô-Ô7Ô=ÔHÔNÔPÔ]ÔjÔtÔ�Ô›Ô›Ô¡Ô¨ÔìÖÅD#°ø¬ø¬­9­A­A­O­b­|­­ˆ­¤­¤­¤­¬­®­®­¶­¸­¸­À­Â­Â­Ê­Ê­Ó­Ù­Ş­Ş­ç­ö­ú­ÿ­®
®
®
®
®®®!®&®&®+®8®Q®p®s®‰®¨®¨®¨®°®²®²®²®º®¼®¼®¼®Ä®Æ®Æ®Æ®Î®Ğ®Ğ®Û®Û®á®æ®æ®æ®æ®í®ø®
¯¯&¯0¯0¯0¯@¯@¯G¯K¯Q¯i¯w¯Š¯—¯À¯Ã¯Ì¯Ó¯ç¯ï¯ø¯°°°°°°° °&°;°C°I°T°k°‚°�°”°™°™° °«°«°°°Â°È°È°È°È°$±Æd$àCàCD DDDD,D.D;D=DHD\DdDtDyDD‡DŠDœDÇLWf"1"161:1?1J1J1T1Z1Z1^1f1È\CVº0º0Ğ0Ğ0Ô0Ù0ì0ï0ô0ô0ş011111É8(2Æ×Æ×Ï×Ï×İ×á×è×ë×ğ×ʨY§\§\¿\Ç\Ò\å\Ù\]{]a]V]<]%]�]–]†]¶]»]Ø]İ]ò]ß]^^^^8^c^F^z^˜^˜^˜^¤^ËlQhß,ß,ù,"--1-Q-m-c-…-�-Š-¬-Å-å-÷-...9.9.C.Ì4�¦OíOícíhíníríví•í�íÍxÏé��2� �A�K�R�h�m�r�v�x�~�„�š�‡�©�Â�Ê�Ü�ÿ�õ�‚‚Δ"ȫȫ֫è«ì«ô«ü«¬¬¬%¬0¬5¬K¬R¬Y¬d¬o¬q¬|¬‡¬‰¬•¬ ¬«¬´¬¼¬¼¬À¬÷¬Ï€ø2626P6T6X6`6n6q6t6Š6�6’6¤6¨6¬6´6¼6È6İ6î6õ6ü6ü6 77к< D DODZDDaD™DÏDÔDÔD×DáDùDE
EE4EUEgEtE�EŸE¤E¾EÈEÊEÏEæE␍F F,FGFcFYF}FƒFƒFŒF¬F¸F»F½FØFÂFçFçFùFùFGG<G2GVGVG[G^GtG€G•G¹GÃGÉGÙGHğGHH$H8HLHBHaHgHvH�H�H­H¯HÁHËHßHéHòH III)I3I3IRIXIXIXIaI�I©I˜I¸I½IÏI×IJøIJJJ=J=JOJÑÄ8¥·1·1î1õ1ı1222025282;2D2R2\2a2‰2�2›2Ç2Ì2Ù2ù2ş2␍393A3F3[3‡3�3”3”3§3º3Í3Ñ3ó34444444444444H4`4e4h4k4k4˜4�4�4ª4®4É4ä4ò4ı4555&5=5?5?5?5L5c5e5e5r5‰5‰5™5�5Á5ä5ì5ñ5␍6-6;6I6S6U6U6U6q6y6{6{6£6Ù6Ò¤8]·é·éÑéıéıéê,ê1ê1ê@êRêlêtê{ê€ê›ê£ê£ê£ê¥ê¥ê¥ê¥êÁêÁêÁêÁêØêÚêÚêÚêÚêõêë5ëÓĞê ‚ ‚5‚A‚F‚F‚R‚W‚\‚g‚l‚l‚l‚¡‚�‚°‚ׂׂğ‚ ƒ"ƒ;ƒ@ƒ@ƒYƒrƒ‹ƒ¤ƒ©ƒ©ƒƒÛƒôƒ␍„„„(„A„Z„s„s„s„…„Ô0”œïìïìıìíí&íGíGíMíÕ<:E"9"9+969D9P9\9e9n9w9}9‚9ÖluŒª&ª&¸&Â&É&à&à&å&ç&ó&ı& '('*':':'?'A'H'z'×ĞŸÏïrïrs-s"ssMssesXsªs¯sºsÈs×sæsîs tdtWtLt8tjtut¡t¦t®tÍtÕtútïtÛt␍u&uuIu5u`ugu“u“u“u“u›uØLixG.G.e.w.~. . .².¿.Ï.Å.ç.ñ.Ù$qv_N_NsN{N†NŒNÚÈg•j1j1�1’1±1Ó1ß1æ1ñ1ÿ1 2222$2<2G2W2c2j2u2†2ˆ2™2›2�2�2�2¥2¥2¯2¯2·2¿2Ç2Ï2Ó2Ş2*3Û (ˆ(ˆ6ˆMˆSˆÜ`FZ‚9‚9’9™9›9 9¯9µ9Ê9Ê9Ø9Ø9ä9í9ğ9ş9: ::İ<ùÿ�ÿ����)�4�>�\�g�w�Ş 5�g�g§g¹g¿gËgÖgägğghh"h4h:h@hFhYh_hhhnh€h†h‘h™h§h´hñhß,29w0w0…0–0¯0Ã0Æ0Ì0à4èˆèˆöˆ‰ ‰‰‰!‰!‰'‰áÄMzÿıÿı+ş.ş3ş@şEşWşYş]şaşdşwş�ş¶ş¿şÊşÑşêşÿÿ.ÿTÿYÿ`ÿyÿŸÿ¡ÿºÿàÿàÿàÿøÿ!3â ˆÇ/w/wMwPwVwjwrwƒw�w–w›w›w¨w±w·wÇwÕw×wöw
xxx-x-x;xNxYx]xnxnxnxsxsxx�x¡x§x¬xÀxÆxÎxàxæxèx÷xy
yyyy!y(y4y;y=yByJyLyQy]y_ydylynysy{y}y‚yŠyŒy‘y™y™y™y©y©y©yÀyÆyÌy×yÜyõyûyzzzz"z;zFzQzWzdziznznzƒz‹z•z�z¥zÆzÑzÜzèzâzñzúzÿz{{ {){5{;{G{K{P{U{`{k{v{x{~{‹{�{•{®{¹{Ä{Ä{Ê{×{Ù{Ş{ç{| |||)|)|-|2|2|C|E|E|X|Z|Z|m|o|o|‚|„|„|—|™|™|«|«|±|¶|¶|Í|á|Ö|î|ö|ı|} }})} }9}9};}S}V}X}g}y}‰}•}¬}Æ}Ë}ß}ï}~~~~$~6~A~I~Q~U~c~i~n~n~t~ˆ~˜~�~�~£~©~®~®~®~´~Ã~Ö~ã~ç~ì~ì~ğ~õ~õ~ú~+AMMS`bo{Š��ªº¿Ğâíõıÿ€€$€3€9€F€F€]€m€m€�€�€�€˜€¤€»€»€Á€΀Ğ€â€â€í€í€í€í€í€iƒã ŒĞ�V�V­V»VÒV×VüVWW␍WW"W1W6WBWTWTWrW}W�W—W±WÎWÚWõW␍X)X2XAXIXVX_XdXtX‚X¢X§X¯XÈXÚXêXğXûXY
YPY:Y+Y`Y›Y…YvY«Y®YÓYbZä<%0 D DÁDÇDĞDâDûDEE)Eå„ |† † ¨ ³ º Â Å Å Õ à à ã ê ñ ÷ ı !
!!!!!!#!,!8!>!c!g!j!z!‚!‡!‡!�!—!¨!®!·!Â!Ó!Ó!Ü!á!ë!ò!ù!"" ""."1"@"M"Z"Z"Z"Z"`"r"{"Œ"­"¾"Ö"İ"ç"ï"ö"ö"ÿ"##"#-#-#-#A#U#e#h##$æ„9ú7ú78%8,808F8s8‰8š8£8±8Ã8Ü8Ü8î8999 9çX{Í^^‰“¦±ÃÑ×èï÷␍(=MWYiy‚ˆ�”𠦱¼¿Æàè$'/3ET[c~›Ÿ¨¯ÁÉĞÔİßñ "///1HNN`è 
XˆXˆaˆuˆzˆé¤¢Ç  ;ASX^aeeˆ�º¦ÉâÎñ€ó€€#€)€,€0€2€K€7€Z€Z€Z€u€¤€°€ê˜Ìîââëææúõ ""11@@OO^^m�|‹‹š©¸#ëxËå/d/dMd_dedqdˆdˆdšd d«d»dÇdĞdÖdÜdçdõdeee+e+e[eìd§¼ŸíŸí£í¶í¶íĞí×íãíãíúíúíîî(î(î?î?îVîXîXî\îíÌÂñ¯¯ÑØãùù *.379?Q]rt�œ   ³ÈÈÔÚäïı.HHZîP1A0E0EFEREZE^EoE}EƒE�E—E¢E¨E«EµEï ®-×=×=ñ=ü=> >>>->>>O>a>s>‚>‘>¢>±>±>¸>¼>Å>Ò>Ù>â>é>í>␍?␍?␍?␍?␍??? ?(?6?>?K?S?[?l?w?|?|?‰?�?�?µ?·?Â?Ï?Ú?İ?ã?ß?÷?@@@ @+@1@1@9@9@K@R@h@h@h@m@m@…@“@�@£@£@¦@«@«@Ê@Ø@å@ç@ç@ë@í@í@ AA&A(A(A+A-A-A:A<A<A?A?A?A?A?AHANARA^A~A‹A™A AhBğ(rxX‹X‹f‹m‹}‹€‹†‹ñ(ntZ&Z&c&m&~&‰&‰&§&òTzKÖóÖóôóúóıóôô(ô8ôAôGôJôNôPôhôxô…ô‹ô�ô•ô—ôšô�ô�ôÁôÅôËôËôÒôùôõ!õ4õ:õAõLõVõZõ]õdõjõnõtõ…õ‹õ�õ•õ¢õ¤õ¶õ¸õ¿õÌõÎõàõàõàõàõàõööö2ö2öGöSöpö”ö®ö³öÊöÏöİöôöùöÿö÷%÷+÷;÷H÷\÷c÷o÷‡÷“÷“÷“÷™÷œ÷Ÿ÷¸÷¾÷Ò÷Ø÷İ÷è÷è÷í÷ú÷øø␍øø2ø8ø;ø>øEøNøUøUøZøgøtøtøzøˆøŸø¥ø¨ø«ø²ø²øÃøÊø×øäøäøëøõøüøù ùù(ù(ùBùGùNùVù]ùmùqùzù’ù—ù�ùÀùËùÑùÙùòùúú!ú!ú;úIúPúWúyúŒú°ú²ú¼úŞúŞúŞú÷úûû3û7û üóÀ€¬§^§^¿^Ã^È^×^â^î^_ğ^_#_#_H_y_\_O_œ_¡_Ê_Ï_Û_ü_İ_ ``)`0`S`i`i`�`�`›`ô Æ/Æ/Õ/î/ô/õ4‘šŸOŸO·OÚOçOíOóOöOPö8 ê.ê.ø.ÿ.
/// /%/%/+/÷ :>Ï0Ï0Ù0á0æ0øĞSŸuŸu½uÍuØuîu vv>vlvrvxv€v‚vŠvŸv¢v­v¹vÏvìvûv wMwSwYwawfwnwƒw†w‘w�w¢w¨w®w¶w¾wÆwÖwîwüw*x0x5x=xMxOxsx¡x§x¬x¬x½xÈxÓxğxyyy*y*y/yByYy[yxy�yœy¤y²y²y·yÊy×yáyøyz*z<zIzkz‚z›z©z«zÂzØzØzázíz{{/{:{M{Q{Q{Q{X{]{p{{{•{—{œ{¯{º{Ç{Ñ{Ñ{ã{ù€k˜:˜:®:º:º:Ğ:Û:İ:ı:ı:ı:;;;;;;";&;<;<;r;~;�; ;·;¼;¿;Ä;Ä;Ä;à;ç;ô;û;<<<$<0<8<=<=<Y<e<n<v<~<Š< <«<Î<Ò<à<è<í<í< =#=-=9=A=F=F=e=q=ƒ=ˆ=¤=°=¿=Ä=Ó=à=å=å=å=å=è=í=í=í= >>*>,>/>4>4>4>>>F>M>U>^>i>o>|>Š>Š>”>�>¥>Ú>à>ç>ö>???(?0?0?2?2?7?7?>?D?H?O?S?S?S?S?b?b?‡?�?�?”?¯Cú(°C°C¾CÇCÕCÛCû�°Ğ—k—kµk½kÉkßkôkl␍ll"l"l"l'l,l:lEl^l`lelsl~l‹l’l lü\=P¿+¿+Ù+ş+à+␍,), ,A,V,C,e,~,�,©,©,°,Ò,Ò,Ü,ı8fpßMßM÷MNN)N/N5N8NXNş0�—PŒPŒdŒpŒ~Œ�Œ™ŒœŒ¤Œÿ0S[�Ø�آتطØÁØÔØP>NЉЉ܉ğ‰ó‰ŠŠŠŠ'Š/Š2Š8ŠT¡²GPGPaPtPwP�P�P£P¥P·PÁPÕPÕPÛPŞP2Q<˜£¨Œ¨Œ¼ŒÃŒÏŒÛŒëŒğŒóŒ÷ŒÿŒ 26FæFæTæ`æH!/OZOZcZoZ…ZqZ”Z–Z�Z¨Z´Z¼ZD>‹×S×SùST TT+T2T4T4TPTVTXTcTjTjTnT}T†T�T—TŸT¦T­T±T¸TÀTÆTËTÓTêTîTUUU1U6UCUCUWUbUiUrU€U‰U¬U²U¶U»UÀUÃUÍUÒUŞUçUûUVV(V/V/V6V9V‹Vläû&ä&ä:äPä^äiämätäxä�ä�ä’ä’ä¦ä¨ä±ä·ä·ä·ä·ä¿ä´EnÀEÀEæE÷EüEF␍F␍FF(F,F1FFFHFKFOFVFjFnFvF‚F‰F�F•F—FŸF­FµF·FºFÓFÛFãFñFõFG %I¯r¯r¿rËr×rçrÿrss$s,s3sLsys“s s­s½sÃsÅsÖsøsÿsttt1t<tBtHtkt BÂjj*j-j4j?jNjPj[jjjjjwj…jˆjŠjŠj�j”j�j¨j®j·jÊjÏjäjïjùjùjkk<kFkPkgkmkrkykk†k‹k‹k‘k—kœkœk¯k½kËkÕkÛkàkêkôkşklll"l=lClHlHlslxlxl£lÊlÏlÏlÏlÒlÙlßlælëlëlñl÷lülülmm'm-m;mPmVmfmrmxm†m�m�m™m£m©m°m°m²m²m²m·m½mÂmÆmÈmËmÖmåmèmêmîmîmómómn+n
˜}Ÿ&$&$B$G$N$X$^$i$y$�$‰$�$™$£$©$´$Ä$Ì$Ü$ã$ë$ó$û$%%%!%!%7% $b—<—<¯<¶<É<ñ<ü< == =@=@=L=T=c=�=Ÿ=Ì=Ô=Ô= >!>>B>0>Q>W>f>{>}>ˆ>�>�>±>¶>¿>Ë>Ó>ñ>Ş>&? ??5?R?=?r?Š?w?¬?™?Í?»?Ü?î?ä?@@@ @.@.@:@ Ğ1ø’ø’ “ “2“2“R“V“[“[“[“g“l“|“�“�“�“†“†“Ÿ“¦“µ“Ó̓ܓå“ç“ç“ç“ç“î“õ“ü“”
””” ” ”!”!”'”,”3•␍D$rr%r/r9rIrNrWrcrerwrwryr©r
+3 -3
View File
@@ -67,10 +67,10 @@ extern I64 Cmp(U8 *filename,
U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv_let=0);
#help_index "Debugging/Unassemble"
public extern U8 *U(U8 *ip,I64 cnt=20,I64 seg_size=64);
public extern U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,
public extern U8 *U(U8 *rip,I64 cnt=20,I64 seg_size=64);
public extern U0 Ui(U8 *buf,U8 **_rip,I64 seg_size=64,
I64 *_jmp_dst=NULL,Bool just_ins=FALSE);
public extern I64 Un(U8 *ip,I64 cnt=0x80,I64 seg_size=64);
public extern I64 Un(U8 *rip,I64 cnt=0x80,I64 seg_size=64);
extern CUAsmGlbls uasm;
#help_index "Hash/System"
+14 -20
View File
@@ -39,9 +39,9 @@ CCmpCtrl *CmpCtrlNew(U8 *buf=NULL,I64 flags=0,U8 *filename=NULL)
cc->htc.define_hash_table=cc->htc.hash_table_lst=
cc->htc.glbl_hash_table=cc->htc.local_hash_table=Fs->hash_table;
if (flags&CCF_KEEP_AT_SIGN)
cc->chars_bmp_alpha_numeric=chars_bmp_alpha_numeric_no_at;
cc->char_bmp_alpha_numeric=char_bmp_alpha_numeric_no_at;
else
cc->chars_bmp_alpha_numeric=chars_bmp_alpha_numeric;
cc->char_bmp_alpha_numeric=char_bmp_alpha_numeric;
tmpf=LexFilePush(cc);
QueInit(&cc->next_stream_blk);
if (filename)
@@ -155,11 +155,6 @@ lgc_start2:
tmpf->line_num=doc_e->y+1;
cc->last_U16='\t';
goto lgc_done;
case DOCT_PAGE_BREAK:
tmpf->buf_ptr=cc->cur_buf_ptr=&lex_zeros;
tmpf->line_num=doc_e->y+2; //TODO: should be a page down
cc->last_U16=CH_FORM_FEED;
goto lgc_done;
case DOCT_INS_BIN:
tmpf->buf_ptr=cc->cur_buf_ptr=&lex_zeros;
tmpf->line_num=doc_e->y+1;
@@ -245,7 +240,6 @@ lgc_start2:
}
break;
case CH_CURSOR:
case CH_FORM_FEED:
goto lgc_start1;
case '\n':
tmpf=cc->lex_include_stk;
@@ -261,7 +255,7 @@ lgc_done:
if (cc->last_U16==CH_SHIFT_SPACE)
cc->last_U16=CH_SPACE;
if (cc->opts & OPTF_ECHO &&
cc->last_U16<256 && Bt(chars_bmp_printable,cc->last_U16))
cc->last_U16<256 && Bt(char_bmp_printable,cc->last_U16))
'' cc->last_U16;
}
return cc->last_U16;
@@ -271,7 +265,7 @@ U0 LexSkipEol(CCmpCtrl *cc)
{//$LK,"LexGetChar",A="MN:LexGetChar"$ to NULL until end-of-line.
I64 ch;
do ch=$WW,0$LexGetChar(cc);
while (Bt(chars_bmp_non_eol,ch));
while (Bt(char_bmp_non_eol,ch));
}
U8 *LexFirstRem(CCmpCtrl *cc,U8 *marker,I64 _len=NULL)
@@ -413,7 +407,7 @@ I64 LexInStr(CCmpCtrl *cc,U8 *buf,I64 size,Bool *done)
j=0;
for (k=0;k<2;k++) {
ch=ToUpper(LexGetChar(cc));
if (Bt(chars_bmp_hex_numeric,ch)) {
if (Bt(char_bmp_hex_numeric,ch)) {
if (ch<='9')
j=j<<4+ch-'0';
else
@@ -482,7 +476,7 @@ lex_ident:
LexExcept(cc,"Ident limited to STR_LEN chars at ");
else if (!(ch=LexGetChar(cc)))
break;
else if (Bt(cc->chars_bmp_alpha_numeric,ch))
else if (Bt(cc->char_bmp_alpha_numeric,ch))
buf[i++]=ch;
else if (ch==TK_SUPERSCRIPT)
buf[i++]='>';
@@ -526,7 +520,7 @@ lex_ident:
if (ch=='X') {
while (TRUE) {
ch=ToUpper(LexGetChar(cc));
if (Bt(chars_bmp_hex_numeric,ch)) {
if (Bt(char_bmp_hex_numeric,ch)) {
if (ch<='9')
i=i<<4+ch-'0';
else
@@ -554,7 +548,7 @@ lex_ident:
}
}
while (TRUE) {
if (Bt(chars_bmp_dec_numeric,ch))
if (Bt(char_bmp_dec_numeric,ch))
i=i*10+ch-'0';
else {
if (ch=='.' || ch=='e' || ch=='E') break;
@@ -576,7 +570,7 @@ lex_is_int:
lex_float_start:
k=0;
while (TRUE) {
if (Bt(chars_bmp_dec_numeric,ch)) {
if (Bt(char_bmp_dec_numeric,ch)) {
i=i*10+ch-'0';
k++;
} else {
@@ -597,7 +591,7 @@ lex_float_start:
}
j=0;
while (TRUE) {
if (Bt(chars_bmp_dec_numeric,ch))
if (Bt(char_bmp_dec_numeric,ch))
j=j*10+ch-'0';
else {
if (neg_e)
@@ -660,7 +654,7 @@ lex_float_start:
i=0;
for (l=0;l<2;l++) {
ch=ToUpper(LexGetChar(cc));
if (Bt(chars_bmp_hex_numeric,ch)) {
if (Bt(char_bmp_hex_numeric,ch)) {
if (ch<='9')
i=i<<4+ch-'0';
else
@@ -723,7 +717,7 @@ lex_float_start:
HashSrcFileSet(cc,tmph);
do ch=LexGetChar(cc); //skip space between define name and start
while (Bt(chars_bmp_non_eol_white_space,ch));
while (Bt(char_bmp_non_eol_white_space,ch));
i=j=0;
buf2=NULL;
@@ -749,7 +743,7 @@ lex_float_start:
ch=LexGetChar(cc);
if (ch=='/') {
do ch=LexGetChar(cc);
while (Bt(chars_bmp_non_eol,ch));
while (Bt(char_bmp_non_eol,ch));
break;
} else {
buf[j++]='/';
@@ -757,7 +751,7 @@ lex_float_start:
}
} else if (ch=='\\')
break;
else if (Bt(chars_bmp_non_eol,ch))
else if (Bt(char_bmp_non_eol,ch))
buf[j++]=ch;
else
break;
+74 -74
View File
@@ -18,16 +18,16 @@ U0 OptSetNOP1(CIntermediateCode *tmpi)
{
tmpi->ic_code=IC_NOP1;
tmpi->ic_flags=0;
tmpi->a1.type=MDF_NULL+tmpi->a1.type.raw_type;
tmpi->r.type =MDF_NULL+tmpi->r.type.raw_type;
tmpi->arg1.type=MDF_NULL+tmpi->arg1.type.raw_type;
tmpi->res.type =MDF_NULL+tmpi->res.type.raw_type;
}
U0 OptSetNOP2(CIntermediateCode *tmpi,I64 stk_delta=1)
{
tmpi->ic_code=IC_NOP2;
tmpi->ic_data=stk_delta;
tmpi->a1.type=MDF_NULL+tmpi->a1.type.raw_type;
tmpi->r.type =MDF_NULL+tmpi->r.type.raw_type;
tmpi->arg1.type=MDF_NULL+tmpi->arg1.type.raw_type;
tmpi->res.type =MDF_NULL+tmpi->res.type.raw_type;
}
CIntermediateCode *OptFree(CIntermediateCode *tmpi)
@@ -100,17 +100,17 @@ Bool OptFixupBinaryOp1(CIntermediateCode *tmpi,
CIntermediateCode *tmpii;
CHashClass *tmpc=tmpi->ic_class,*tmpc1,*tmpc2;
if (tmpi1->ic_flags&ICF_R_TO_INT)
if (tmpi1->ic_flags&ICF_RES_TO_INT)
tmpc1=cmp.internal_types[RT_I64];
else if (tmpi1->ic_flags&ICF_R_TO_F64)
else if (tmpi1->ic_flags&ICF_RES_TO_F64)
tmpc1=cmp.internal_types[RT_F64];
else {
tmpc1=OptClassFwd(tmpi1->ic_class);
}
if (tmpi2->ic_flags&ICF_R_TO_INT)
if (tmpi2->ic_flags&ICF_RES_TO_INT)
tmpc2=cmp.internal_types[RT_I64];
else if (tmpi2->ic_flags&ICF_R_TO_F64)
else if (tmpi2->ic_flags&ICF_RES_TO_F64)
tmpc2=cmp.internal_types[RT_F64];
else {
tmpc2=OptClassFwd(tmpi2->ic_class);
@@ -126,18 +126,18 @@ Bool OptFixupBinaryOp1(CIntermediateCode *tmpi,
tmpi1->ic_data(F64)=tmpi1->ic_data;
tmpi1->ic_class=cmp.internal_types[RT_F64];
tmpi1->ic_code=IC_IMM_F64;
tmpi1->ic_flags&=~ICF_R_TO_F64;
tmpi1->ic_flags&=~ICF_RES_TO_F64;
} else
if (tmpc1->raw_type!=RT_F64)
tmpi1->ic_flags|=ICF_R_TO_F64;
tmpi1->ic_flags|=ICF_RES_TO_F64;
if (tmpi2->ic_code==IC_IMM_I64) {
tmpi2->ic_data(F64)=tmpi2->ic_data;
tmpi2->ic_class=cmp.internal_types[RT_F64];
tmpi2->ic_code=IC_IMM_F64;
tmpi2->ic_flags&=~ICF_R_TO_F64;
tmpi2->ic_flags&=~ICF_RES_TO_F64;
} else
if (tmpc2->raw_type!=RT_F64)
tmpi2->ic_flags|=ICF_R_TO_F64;
tmpi2->ic_flags|=ICF_RES_TO_F64;
if (IC_LESS<=tmpi->ic_code<=IC_GREATER_EQU && (tmpii=OptLead1(tmpi)) &&
tmpii->ic_code!=IC_PUSH_CMP && tmpii->ic_code!=IC_AND_AND) {
//We are looking for float comparisons to zero to convert to int.
@@ -149,7 +149,7 @@ Bool OptFixupBinaryOp1(CIntermediateCode *tmpi,
tmpi1->ic_code==IC_DEREF && tmpc1==cmp.internal_types[RT_F64]) {
tmpi2->ic_code==IC_IMM_I64;
fb_here1:
tmpi1->ic_flags&=~ICF_R_TO_F64;
tmpi1->ic_flags&=~ICF_RES_TO_F64;
tmpi->ic_class=tmpi1->ic_class=tmpi2->ic_class=
cmp.internal_types[RT_I64];
*is_unsigned=FALSE;
@@ -183,9 +183,9 @@ Bool OptFixupBinaryOp2(CIntermediateCode **tmpi1,CIntermediateCode **tmpi2)
{
CIntermediateCode *tmpii1=*tmpi1,
*tmpii2=*tmpi2;
if (tmpii1->ic_code==IC_IMM_I64 && !(tmpii1->ic_flags & ICF_R_TO_F64))
if (tmpii1->ic_code==IC_IMM_I64 && !(tmpii1->ic_flags & ICF_RES_TO_F64))
return TRUE;
if (tmpii2->ic_code==IC_IMM_I64 && !(tmpii2->ic_flags & ICF_R_TO_F64)) {
if (tmpii2->ic_code==IC_IMM_I64 && !(tmpii2->ic_flags & ICF_RES_TO_F64)) {
*tmpi1=tmpii2;
*tmpi2=tmpii1;
return TRUE;
@@ -205,10 +205,10 @@ Bool OptFixupUnaryOp(CIntermediateCode *tmpi, CIntermediateCode *tmpi1,
tmpi1->ic_data(F64)=tmpi1->ic_data;
tmpi1->ic_class=cmp.internal_types[RT_F64];
tmpi1->ic_code=IC_IMM_F64;
tmpi1->ic_flags&=~ICF_R_TO_F64;
tmpi1->ic_flags&=~ICF_RES_TO_F64;
} else
if (tmpc1->raw_type!=RT_F64)
tmpi1->ic_flags|=ICF_R_TO_F64;
tmpi1->ic_flags|=ICF_RES_TO_F64;
if (tmpi1->ic_code==IC_IMM_F64) {
tmpi->ic_flags|=tmpi1->ic_flags;
OptSetNOP1(tmpi1);
@@ -236,8 +236,8 @@ CIntermediateCode *OptBrZero(CCmpCtrl *cc,CIntermediateCode *tmpi)
tmpi->ic_code=IC_BR_NOT_ZERO;
tmpi->ic_class=tmpii->ic_class;
tmpi->ic_flags|=tmpii->ic_flags;
tmpi->t.a1c=tmpii->t.a1c;
tmpi->t.a1t=tmpii->t.a1t;
tmpi->t.arg1_class=tmpii->t.arg1_class;
tmpi->t.arg1_tree=tmpii->t.arg1_tree;
OptFree(tmpii);
return OptBrNotZero(cc,tmpi);
case IC_EQU_EQU...IC_LESS_EQU:
@@ -253,7 +253,7 @@ CIntermediateCode *OptBrZero(CCmpCtrl *cc,CIntermediateCode *tmpi)
tmpi->ic_code=IC_BR_AND_ZERO;
break;
case IC_MM_:
if (cc->pass==2 && !(tmpii->ic_flags&ICF_R_TO_F64) &&
if (cc->pass==2 && !(tmpii->ic_flags&ICF_RES_TO_F64) &&
tmpii->ic_class->raw_type!=RT_F64)
tmpi->ic_code=IC_BR_MM_ZERO;
break;
@@ -293,10 +293,10 @@ CIntermediateCode *OptBrZero(CCmpCtrl *cc,CIntermediateCode *tmpi)
if (tmpi->ic_code!=IC_BR_ZERO) {
tmpi->ic_class=tmpii->ic_class;
tmpi->ic_flags|=tmpii->ic_flags;
tmpi->t.a1c=tmpii->t.a1c;
tmpi->t.a2c=tmpii->t.a2c;
tmpi->t.a1t=tmpii->t.a1t;
tmpi->t.a2t=tmpii->t.a2t;
tmpi->t.arg1_class=tmpii->t.arg1_class;
tmpi->t.arg2_class=tmpii->t.arg2_class;
tmpi->t.arg1_tree=tmpii->t.arg1_tree;
tmpi->t.arg2_tree=tmpii->t.arg2_tree;
OptFree(tmpii);
if (tmpi->ic_flags&ICF_PUSH_CMP &&
@@ -307,21 +307,21 @@ CIntermediateCode *OptBrZero(CCmpCtrl *cc,CIntermediateCode *tmpi)
tmpii=tmpi->next; //IC_PUSH_CMP inst
while (tmpii->ic_code!=IC_PUSH_CMP)
tmpii=tmpii->next;
tmpii->t.a1t=tmpi;
tmpii->t.arg1_tree=tmpi;
OptSetNOP1(tmpii);
}
lb_true=tmpi->ic_data;
if (tmpi->ic_code==IC_BR_AND_AND_ZERO) {
tmpii=tmpi->t.a1t->next;
tmpii=tmpi->t.arg1_tree->next;
tmpii->ic_data=lb_true;
tmpii->t.a1t=tmpi->t.a1t;
tmpii->t.a1c=tmpi->t.a1c;
tmpii->t.arg1_tree=tmpi->t.arg1_tree;
tmpii->t.arg1_class=tmpi->t.arg1_class;
tmpii->ic_code=IC_BR_ZERO;
OptBrZero(cc,tmpii);
tmpii=tmpi->t.a2t->next;
tmpii->t.a1t=tmpi->t.a2t;
tmpii->t.a1c=tmpi->t.a2c;
tmpii=tmpi->t.arg2_tree->next;
tmpii->t.arg1_tree=tmpi->t.arg2_tree;
tmpii->t.arg1_class=tmpi->t.arg2_class;
tmpii->ic_data=lb_true;
tmpii->ic_code=IC_BR_ZERO;
tmpii=OptBrZero(cc,tmpii);
@@ -331,22 +331,22 @@ CIntermediateCode *OptBrZero(CCmpCtrl *cc,CIntermediateCode *tmpi)
tmpi->ic_code=IC_LABEL;
tmpi->ic_flags=0;
tmpi->ic_data=lb_false;
tmpii=tmpi->t.a1t->next;
tmpii->t.a1t=tmpi->t.a1t;
tmpii->t.a1c=tmpi->t.a1c;
tmpii=tmpi->t.arg1_tree->next;
tmpii->t.arg1_tree=tmpi->t.arg1_tree;
tmpii->t.arg1_class=tmpi->t.arg1_class;
tmpii->ic_data=lb_false;
tmpii->ic_code=IC_BR_NOT_ZERO;
OptBrNotZero(cc,tmpii);
tmpii=tmpi->t.a2t->next;
tmpii->t.a1t=tmpi->t.a2t;
tmpii->t.a1c=tmpi->t.a2c;
tmpii=tmpi->t.arg2_tree->next;
tmpii->t.arg1_tree=tmpi->t.arg2_tree;
tmpii->t.arg1_class=tmpi->t.arg2_class;
tmpii->ic_data=lb_true;
tmpii->ic_code=IC_BR_ZERO;
tmpii=OptBrZero(cc,tmpii);
} else
tmpii=tmpi;
if (tmpi->ic_flags&ICF_POP_CMP && tmpi->t.a1t->ic_code==IC_NOP1) {
tmpi->t.a1t=tmpi->t.a1t->t.a1t;
if (tmpi->ic_flags&ICF_POP_CMP && tmpi->t.arg1_tree->ic_code==IC_NOP1) {
tmpi->t.arg1_tree=tmpi->t.arg1_tree->t.arg1_tree;
tmpi->ic_flags&=~ICF_POP_CMP;
}
return tmpii;
@@ -363,8 +363,8 @@ CIntermediateCode *OptBrNotZero(CCmpCtrl *cc,CIntermediateCode *tmpi)
tmpi->ic_code=IC_BR_ZERO;
tmpi->ic_class=tmpii->ic_class;
tmpi->ic_flags|=tmpii->ic_flags;
tmpi->t.a1c=tmpii->t.a1c;
tmpi->t.a1t=tmpii->t.a1t;
tmpi->t.arg1_class=tmpii->t.arg1_class;
tmpi->t.arg1_tree=tmpii->t.arg1_tree;
OptFree(tmpii);
return OptBrZero(cc,tmpi);
case IC_EQU_EQU...IC_LESS_EQU:
@@ -380,7 +380,7 @@ CIntermediateCode *OptBrNotZero(CCmpCtrl *cc,CIntermediateCode *tmpi)
tmpi->ic_code=IC_BR_AND_NOT_ZERO;
break;
case IC_MM_:
if (cc->pass==2 && !(tmpii->ic_flags&ICF_R_TO_F64) &&
if (cc->pass==2 && !(tmpii->ic_flags&ICF_RES_TO_F64) &&
tmpii->ic_class->raw_type!=RT_F64)
tmpi->ic_code=IC_BR_MM_NOT_ZERO;
break;
@@ -420,10 +420,10 @@ CIntermediateCode *OptBrNotZero(CCmpCtrl *cc,CIntermediateCode *tmpi)
if (tmpi->ic_code!=IC_BR_NOT_ZERO) {
tmpi->ic_class=tmpii->ic_class;
tmpi->ic_flags|=tmpii->ic_flags;
tmpi->t.a1c=tmpii->t.a1c;
tmpi->t.a2c=tmpii->t.a2c;
tmpi->t.a1t=tmpii->t.a1t;
tmpi->t.a2t=tmpii->t.a2t;
tmpi->t.arg1_class=tmpii->t.arg1_class;
tmpi->t.arg2_class=tmpii->t.arg2_class;
tmpi->t.arg1_tree=tmpii->t.arg1_tree;
tmpi->t.arg2_tree=tmpii->t.arg2_tree;
OptFree(tmpii);
if (tmpi->ic_flags&ICF_PUSH_CMP &&
@@ -434,21 +434,21 @@ CIntermediateCode *OptBrNotZero(CCmpCtrl *cc,CIntermediateCode *tmpi)
tmpii=tmpi->next; //IC_PUSH_CMP inst
while (tmpii->ic_code!=IC_PUSH_CMP)
tmpii=tmpii->next;
tmpii->t.a1t=tmpi;
tmpii->t.arg1_tree=tmpi;
OptSetNOP1(tmpii);
}
lb_true=tmpi->ic_data;
if (tmpi->ic_code==IC_BR_OR_OR_NOT_ZERO) {
tmpii=tmpi->t.a1t->next;
tmpii->t.a1t=tmpi->t.a1t;
tmpii->t.a1c=tmpi->t.a1c;
tmpii=tmpi->t.arg1_tree->next;
tmpii->t.arg1_tree=tmpi->t.arg1_tree;
tmpii->t.arg1_class=tmpi->t.arg1_class;
tmpii->ic_data=lb_true;
tmpii->ic_code=IC_BR_NOT_ZERO;
OptBrNotZero(cc,tmpii);
tmpii=tmpi->t.a2t->next;
tmpii->t.a1t=tmpi->t.a2t;
tmpii->t.a1c=tmpi->t.a2c;
tmpii=tmpi->t.arg2_tree->next;
tmpii->t.arg1_tree=tmpi->t.arg2_tree;
tmpii->t.arg1_class=tmpi->t.arg2_class;
tmpii->ic_data=lb_true;
tmpii->ic_code=IC_BR_NOT_ZERO;
tmpii=OptBrNotZero(cc,tmpii);
@@ -458,22 +458,22 @@ CIntermediateCode *OptBrNotZero(CCmpCtrl *cc,CIntermediateCode *tmpi)
tmpi->ic_code=IC_LABEL;
tmpi->ic_flags=0;
tmpi->ic_data=lb_false;
tmpii=tmpi->t.a1t->next;
tmpii->t.a1t=tmpi->t.a1t;
tmpii->t.a1c=tmpi->t.a1c;
tmpii=tmpi->t.arg1_tree->next;
tmpii->t.arg1_tree=tmpi->t.arg1_tree;
tmpii->t.arg1_class=tmpi->t.arg1_class;
tmpii->ic_data=lb_false;
tmpii->ic_code=IC_BR_ZERO;
OptBrZero(cc,tmpii);
tmpii=tmpi->t.a2t->next;
tmpii->t.a1t=tmpi->t.a2t;
tmpii->t.a1c=tmpi->t.a2c;
tmpii=tmpi->t.arg2_tree->next;
tmpii->t.arg1_tree=tmpi->t.arg2_tree;
tmpii->t.arg1_class=tmpi->t.arg2_class;
tmpii->ic_data=lb_true;
tmpii->ic_code=IC_BR_NOT_ZERO;
tmpii=OptBrNotZero(cc,tmpii);
} else
tmpii=tmpi;
if (tmpi->ic_flags&ICF_POP_CMP && tmpi->t.a1t->ic_code==IC_NOP1) {
tmpi->t.a1t=tmpi->t.a1t->t.a1t;
if (tmpi->ic_flags&ICF_POP_CMP && tmpi->t.arg1_tree->ic_code==IC_NOP1) {
tmpi->t.arg1_tree=tmpi->t.arg1_tree->t.arg1_tree;
tmpi->ic_flags&=~ICF_POP_CMP;
}
return tmpii;
@@ -484,21 +484,21 @@ CIntermediateCode *OptBrNotZero(CCmpCtrl *cc,CIntermediateCode *tmpi)
U0 OptFixSizeOf(CIntermediateCode *tmpi1,
CIntermediateCode *tmpi_push,CHashClass *tmpcc)
{
if (tmpi1->ic_code==IC_MUL && tmpi1->t.a2t->ic_code==IC_SIZEOF) {
tmpi1->t.a2t->ic_code=IC_IMM_I64;
tmpi1->t.a2t->ic_class=tmpcc;
if (tmpi1->ic_code==IC_MUL && tmpi1->t.arg2_tree->ic_code==IC_SIZEOF) {
tmpi1->t.arg2_tree->ic_code=IC_IMM_I64;
tmpi1->t.arg2_tree->ic_class=tmpcc;
tmpi_push->ic_class=tmpcc;
if (tmpcc->ptr_stars_cnt) {
tmpcc--;
if (tmpcc->size==1)
goto here;
tmpi1->t.a2t->ic_data=tmpcc->size;
tmpi1->t.arg2_tree->ic_data=tmpcc->size;
} else {
here:
if (tmpi_push==tmpi1)
tmpi1->t.a2t->ic_data=1;
tmpi1->t.arg2_tree->ic_data=1;
else {
OptSetNOP1(tmpi1->t.a2t);
OptSetNOP1(tmpi1->t.arg2_tree);
OptSetNOP1(tmpi1);
}
}
@@ -528,14 +528,14 @@ I64 CmpRawTypePointed(CHashClass *tmpc)
U0 CmpMinTypePointed(CIntermediateCode *tmpi,I64 pt1)
{
I64 pt;
if ((pt=tmpi->a1_type_pointed_to) && pt!=RT_F64 && 0<pt1<pt)
tmpi->a1_type_pointed_to=pt;
if ((pt=tmpi->arg1_type_pointed_to) && pt!=RT_F64 && 0<pt1<pt)
tmpi->arg1_type_pointed_to=pt;
}
U0 CmpF1PushPop(CIntermediateCode *tmpi,CIntermediateCode *tmpi2)
{
if (intermediate_code_table[tmpi2->ic_code].fpop||
tmpi2->ic_flags&ICF_R_TO_F64)
tmpi2->ic_flags&ICF_RES_TO_F64)
Bts(&tmpi->ic_flags,ICf_DONT_PUSH_FLOAT0);
}
@@ -543,13 +543,13 @@ U0 CmpF2PushPop(CIntermediateCode *tmpi,
CIntermediateCode *tmpi1,CIntermediateCode *tmpi2)
{
if ((tmpi2->ic_code==IC_MOV || tmpi2->ic_code==IC_IMM_F64) &&
!(tmpi2->ic_flags&ICF_R_TO_F64) &&
!(tmpi2->ic_flags&ICF_RES_TO_F64) &&
(intermediate_code_table[tmpi1->ic_code].fpop ||
tmpi1->ic_flags&ICF_R_TO_F64))
tmpi1->ic_flags&ICF_RES_TO_F64))
Bts(&tmpi->ic_flags,ICf_DONT_PUSH_FLOAT0);
else if ((intermediate_code_table[tmpi2->ic_code].fpop ||
tmpi2->ic_flags&ICF_R_TO_F64)&&
!(tmpi1->ic_flags&ICF_R_TO_F64))
tmpi2->ic_flags&ICF_RES_TO_F64)&&
!(tmpi1->ic_flags&ICF_RES_TO_F64))
Bts(&tmpi->ic_flags,ICf_DONT_PUSH_FLOAT0);
}
+70 -70
View File
@@ -43,8 +43,8 @@ args.
tmpc=tmpi->ic_class;
tmpi->ic_class2=tmpc;
tmpi_push=tmpi;
MemSet(&tmpi->a1,0,3*sizeof(CICArg));
tmpi->a1_type_pointed_to=0;
MemSet(&tmpi->arg1,0,3*sizeof(CICArg));
tmpi->arg1_type_pointed_to=0;
switch [intermediate_code_table[code].arg_cnt] {
case IS_V_ARG:
ps->ptr-=tmpi->ic_data>>2;
@@ -52,13 +52,13 @@ args.
case IS_2_ARG:
tmpi2=PrsPop(ps);
tmpc2=tmpi2->ic_class;
tmpi->t.a2t=tmpi2;
tmpi->t.a2c=PrsPop(ps);
tmpi->t.arg2_tree=tmpi2;
tmpi->t.arg2_class=PrsPop(ps);
case IS_1_ARG:
tmpi1=PrsPop(ps);
tmpc1=tmpi1->ic_class;
tmpi->t.a1t=tmpi1;
tmpi->t.a1c=PrsPop(ps);
tmpi->t.arg1_tree=tmpi1;
tmpi->t.arg1_class=PrsPop(ps);
break;
case IS_0_ARG: //nobound switch
break;
@@ -67,19 +67,19 @@ args.
cc->flags|=CCF_NOT_CONST;
switch [code] {
case IC_IMM_F64:
tmpi->ic_flags&=~ICF_R_TO_F64;
if (cc->pass==2 && tmpi->ic_flags&ICF_R_TO_INT) {
tmpi->ic_flags&=~ICF_RES_TO_F64;
if (cc->pass==2 && tmpi->ic_flags&ICF_RES_TO_INT) {
tmpi->ic_data=ToI64(tmpi->ic_data(F64));
tmpi->ic_flags&=~ICF_R_TO_INT;
tmpi->ic_flags&=~ICF_RES_TO_INT;
tmpi->ic_code=IC_IMM_I64;
tmpi->ic_class=cmp.internal_types[RT_I64];
}
break;
case IC_IMM_I64:
tmpi->ic_flags&=~ICF_R_TO_INT;
if (cc->pass==2 && tmpi->ic_flags&ICF_R_TO_F64) {
tmpi->ic_flags&=~ICF_RES_TO_INT;
if (cc->pass==2 && tmpi->ic_flags&ICF_RES_TO_F64) {
tmpi->ic_data(F64)=ToF64(tmpi->ic_data);
tmpi->ic_flags&=~ICF_R_TO_F64;
tmpi->ic_flags&=~ICF_RES_TO_F64;
tmpi->ic_code=IC_IMM_F64;
tmpi->ic_class=cmp.internal_types[RT_F64];
}
@@ -299,9 +299,9 @@ args.
case IC_POWER:
tmpc=tmpi->ic_class=cmp.internal_types[RT_F64];
if (tmpc1->raw_type!=RT_F64)
tmpi1->ic_flags|=ICF_R_TO_F64;
tmpi1->ic_flags|=ICF_RES_TO_F64;
if (tmpc2->raw_type!=RT_F64)
tmpi2->ic_flags|=ICF_R_TO_F64;
tmpi2->ic_flags|=ICF_RES_TO_F64;
tmpi_push->ic_class2=cmp.internal_types[RT_F64];
break;
start:
@@ -332,7 +332,7 @@ args.
default:
if (Bsf(i)==Bsr(i)) {
tmpi->ic_flags|=tmpi1->ic_flags;
tmpi->t.a1c=tmpi->t.a2c;
tmpi->t.arg1_class=tmpi->t.arg2_class;
tmpi->ic_data=Bsf(i);
tmpi->ic_code=IC_SHL_CONST;
OptSetNOP1(tmpi1);
@@ -356,16 +356,16 @@ args.
tmpi->ic_code=IC_SHL_CONST;
OptSetNOP1(tmpi2);
} else if (tmpi1->ic_code==IC_MUL && cc->pass==2) {
if (tmpi1->t.a1t->ic_code==IC_IMM_I64) {
if (tmpi1->t.arg1_tree->ic_code==IC_IMM_I64) {
tmpi1->ic_flags|=tmpi->ic_flags;
tmpi1->t.a1t->ic_data*=tmpi2->ic_data;
tmpi1->t.arg1_tree->ic_data*=tmpi2->ic_data;
tmpi1->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi1;
OptSetNOP1(tmpi2);
OptSetNOP1(tmpi);
} else if (tmpi1->t.a2t->ic_code==IC_IMM_I64) {
} else if (tmpi1->t.arg2_tree->ic_code==IC_IMM_I64) {
tmpi1->ic_flags|=tmpi->ic_flags;
tmpi1->t.a2t->ic_data*=tmpi2->ic_data;
tmpi1->t.arg2_tree->ic_data*=tmpi2->ic_data;
tmpi1->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi1;
OptSetNOP1(tmpi2);
@@ -381,16 +381,16 @@ args.
OptSetNOP1(tmpi2);
OptSetNOP1(tmpi);
} else if (tmpi1->ic_code==IC_MUL) {
if (tmpi1->t.a1t->ic_code==IC_IMM_F64) {
if (tmpi1->t.arg1_tree->ic_code==IC_IMM_F64) {
tmpi1->ic_flags|=tmpi->ic_flags|tmpi2->ic_flags;
tmpi1->t.a1t->ic_data(F64)*=tmpi2->ic_data(F64);
tmpi1->t.arg1_tree->ic_data(F64)*=tmpi2->ic_data(F64);
tmpi1->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi1;
OptSetNOP1(tmpi2);
OptSetNOP1(tmpi);
} else if (tmpi1->t.a2t->ic_code==IC_IMM_F64) {
} else if (tmpi1->t.arg2_tree->ic_code==IC_IMM_F64) {
tmpi1->ic_flags|=tmpi->ic_flags|tmpi2->ic_flags;
tmpi1->t.a2t->ic_data(F64)*=tmpi2->ic_data(F64);
tmpi1->t.arg2_tree->ic_data(F64)*=tmpi2->ic_data(F64);
tmpi1->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi1;
OptSetNOP1(tmpi2);
@@ -509,19 +509,19 @@ args.
OptSetNOP1(tmpi);
} else if (tmpi2->ic_code==IC_ADD||
tmpi2->ic_code==IC_SUB) {
if (tmpi2->t.a1t->ic_code==IC_IMM_I64) {
if (tmpi2->t.arg1_tree->ic_code==IC_IMM_I64) {
tmpi2->ic_flags|=tmpi->ic_flags;
tmpi2->t.a1t->ic_data+=tmpi1->ic_data;
tmpi2->t.arg1_tree->ic_data+=tmpi1->ic_data;
tmpi2->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi2;
OptSetNOP1(tmpi1);
OptSetNOP1(tmpi);
} else if (tmpi2->t.a2t->ic_code==IC_IMM_I64) {
} else if (tmpi2->t.arg2_tree->ic_code==IC_IMM_I64) {
tmpi2->ic_flags|=tmpi->ic_flags;
if (tmpi2->ic_code==IC_ADD)
tmpi2->t.a2t->ic_data+=tmpi1->ic_data;
tmpi2->t.arg2_tree->ic_data+=tmpi1->ic_data;
else
tmpi2->t.a2t->ic_data-=tmpi1->ic_data;
tmpi2->t.arg2_tree->ic_data-=tmpi1->ic_data;
tmpi2->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi2;
OptSetNOP1(tmpi1);
@@ -537,19 +537,19 @@ args.
OptSetNOP1(tmpi);
} else if (tmpi1->ic_code==IC_ADD ||
tmpi1->ic_code==IC_SUB) {
if (tmpi1->t.a1t->ic_code==IC_IMM_I64) {
if (tmpi1->t.arg1_tree->ic_code==IC_IMM_I64) {
tmpi1->ic_flags|=tmpi->ic_flags;
tmpi1->t.a1t->ic_data+=tmpi2->ic_data;
tmpi1->t.arg1_tree->ic_data+=tmpi2->ic_data;
tmpi1->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi1;
OptSetNOP1(tmpi2);
OptSetNOP1(tmpi);
} else if (tmpi1->t.a2t->ic_code==IC_IMM_I64) {
} else if (tmpi1->t.arg2_tree->ic_code==IC_IMM_I64) {
tmpi1->ic_flags|=tmpi->ic_flags;
if (tmpi1->ic_code==IC_ADD)
tmpi1->t.a2t->ic_data+=tmpi2->ic_data;
tmpi1->t.arg2_tree->ic_data+=tmpi2->ic_data;
else
tmpi1->t.a2t->ic_data-=tmpi2->ic_data;
tmpi1->t.arg2_tree->ic_data-=tmpi2->ic_data;
tmpi1->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi1;
OptSetNOP1(tmpi2);
@@ -565,19 +565,19 @@ args.
OptSetNOP1(tmpi);
} else if (tmpi2->ic_code==IC_ADD||
tmpi2->ic_code==IC_SUB) {
if (tmpi2->t.a1t->ic_code==IC_IMM_F64) {
if (tmpi2->t.arg1_tree->ic_code==IC_IMM_F64) {
tmpi2->ic_flags|=tmpi->ic_flags;
tmpi2->t.a1t->ic_data(F64)+=tmpi1->ic_data(F64);
tmpi2->t.arg1_tree->ic_data(F64)+=tmpi1->ic_data(F64);
tmpi2->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi2;
OptSetNOP1(tmpi1);
OptSetNOP1(tmpi);
} else if (tmpi2->t.a2t->ic_code==IC_IMM_F64) {
} else if (tmpi2->t.arg2_tree->ic_code==IC_IMM_F64) {
tmpi2->ic_flags|=tmpi->ic_flags;
if (tmpi2->ic_code==IC_ADD)
tmpi2->t.a2t->ic_data(F64)+=tmpi1->ic_data(F64);
tmpi2->t.arg2_tree->ic_data(F64)+=tmpi1->ic_data(F64);
else
tmpi2->t.a2t->ic_data(F64)-=tmpi1->ic_data(F64);
tmpi2->t.arg2_tree->ic_data(F64)-=tmpi1->ic_data(F64);
tmpi2->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi2;
OptSetNOP1(tmpi1);
@@ -593,19 +593,19 @@ args.
OptSetNOP1(tmpi);
} else if (tmpi1->ic_code==IC_ADD ||
tmpi1->ic_code==IC_SUB) {
if (tmpi1->t.a1t->ic_code==IC_IMM_F64) {
if (tmpi1->t.arg1_tree->ic_code==IC_IMM_F64) {
tmpi1->ic_flags|=tmpi->ic_flags;
tmpi1->t.a1t->ic_data(F64)+=tmpi2->ic_data(F64);
tmpi1->t.arg1_tree->ic_data(F64)+=tmpi2->ic_data(F64);
tmpi1->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi1;
OptSetNOP1(tmpi2);
OptSetNOP1(tmpi);
} else if (tmpi1->t.a2t->ic_code==IC_IMM_F64) {
} else if (tmpi1->t.arg2_tree->ic_code==IC_IMM_F64) {
tmpi1->ic_flags|=tmpi->ic_flags;
if (tmpi1->ic_code==IC_ADD)
tmpi1->t.a2t->ic_data(F64)+=tmpi2->ic_data(F64);
tmpi1->t.arg2_tree->ic_data(F64)+=tmpi2->ic_data(F64);
else
tmpi1->t.a2t->ic_data(F64)-=tmpi2->ic_data(F64);
tmpi1->t.arg2_tree->ic_data(F64)-=tmpi2->ic_data(F64);
tmpi1->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi1;
OptSetNOP1(tmpi2);
@@ -638,19 +638,19 @@ args.
} else
if (tmpi1->ic_code==IC_ADD ||
tmpi1->ic_code==IC_SUB) {
if (tmpi1->t.a1t->ic_code==IC_IMM_I64) {
if (tmpi1->t.arg1_tree->ic_code==IC_IMM_I64) {
tmpi1->ic_flags|=tmpi->ic_flags;
tmpi1->t.a1t->ic_data-=tmpi2->ic_data;
tmpi1->t.arg1_tree->ic_data-=tmpi2->ic_data;
tmpi1->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi1;
OptSetNOP1(tmpi2);
OptSetNOP1(tmpi);
} else if (tmpi1->t.a2t->ic_code==IC_IMM_I64) {
} else if (tmpi1->t.arg2_tree->ic_code==IC_IMM_I64) {
tmpi1->ic_flags|=tmpi->ic_flags;
if (tmpi1->ic_code==IC_ADD)
tmpi1->t.a2t->ic_data-=tmpi2->ic_data;
tmpi1->t.arg2_tree->ic_data-=tmpi2->ic_data;
else
tmpi1->t.a2t->ic_data+=tmpi2->ic_data;
tmpi1->t.arg2_tree->ic_data+=tmpi2->ic_data;
tmpi1->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi1;
OptSetNOP1(tmpi2);
@@ -667,19 +667,19 @@ args.
OptSetNOP1(tmpi);
} else
if (tmpi1->ic_code==IC_ADD || tmpi1->ic_code==IC_SUB) {
if (tmpi1->t.a1t->ic_code==IC_IMM_F64) {
if (tmpi1->t.arg1_tree->ic_code==IC_IMM_F64) {
tmpi1->ic_flags|=tmpi->ic_flags|tmpi2->ic_flags;
tmpi1->t.a1t->ic_data(F64)-=tmpi2->ic_data(F64);
tmpi1->t.arg1_tree->ic_data(F64)-=tmpi2->ic_data(F64);
tmpi1->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi1;
OptSetNOP1(tmpi2);
OptSetNOP1(tmpi);
} else if (tmpi1->t.a2t->ic_code==IC_IMM_F64) {
} else if (tmpi1->t.arg2_tree->ic_code==IC_IMM_F64) {
tmpi1->ic_flags|=tmpi->ic_flags|tmpi2->ic_flags;
if (tmpi1->ic_code==IC_ADD)
tmpi1->t.a2t->ic_data(F64)-=tmpi2->ic_data(F64);
tmpi1->t.arg2_tree->ic_data(F64)-=tmpi2->ic_data(F64);
else
tmpi1->t.a2t->ic_data(F64)+=tmpi2->ic_data(F64);
tmpi1->t.arg2_tree->ic_data(F64)+=tmpi2->ic_data(F64);
tmpi1->ic_class2=tmpi->ic_class2;
tmpi_push=tmpi1;
OptSetNOP1(tmpi2);
@@ -807,7 +807,7 @@ args.
}
break;
end:
tmpi->ic_flags&=~ICF_R_TO_INT;
tmpi->ic_flags&=~ICF_RES_TO_INT;
if (!tmpi_push->ic_class->ptr_stars_cnt) {
if (tmpi_push->ic_class->raw_type==RT_F64)
tmpi_push->ic_class2=cmp.internal_types[RT_F64];
@@ -860,16 +860,16 @@ args.
tmpi->ic_flags=tmpi->ic_flags|ICF_USE_F64;
if (tmpc->raw_type==RT_F64) {
if (tmpc2->raw_type!=RT_F64)
tmpi2->ic_flags|=ICF_R_TO_F64;
tmpi2->ic_flags|=ICF_RES_TO_F64;
}
break;
case IC_ASSIGN:
if (tmpc->raw_type==RT_F64) {
if (tmpc2->raw_type!=RT_F64)
tmpi2->ic_flags|=ICF_R_TO_F64;
tmpi2->ic_flags|=ICF_RES_TO_F64;
} else {
if (tmpc2->raw_type==RT_F64)
tmpi2->ic_flags|=ICF_R_TO_INT;
tmpi2->ic_flags|=ICF_RES_TO_INT;
}
if (cc->pass==2 && tmpi1->ic_class->raw_type!=RT_F64) {
if (tmpi1->ic_code==IC__PP) {
@@ -891,7 +891,7 @@ args.
case IC_OR_EQU:
case IC_XOR_EQU:
if (tmpc2->raw_type==RT_F64)
tmpi2->ic_flags|=ICF_R_TO_INT;
tmpi2->ic_flags|=ICF_RES_TO_INT;
break;
end:
break;
@@ -947,7 +947,7 @@ args.
while (tmpi2->ic_code!=IC_CALL_END)
tmpi2=tmpi2->next;
tmpi->ic_flags|=tmpi1->ic_flags&~ICF_R_TO_INT|tmpi2->ic_flags;
tmpi->ic_flags|=tmpi1->ic_flags&~ICF_RES_TO_INT|tmpi2->ic_flags;
OptSetNOP1(tmpi2);
tmpi->ic_code=IC_IMM_I64;
@@ -965,7 +965,7 @@ args.
while (tmpi2->ic_code!=IC_CALL_END)
tmpi2=tmpi2->next;
tmpi->ic_flags|=tmpi1->ic_flags&~ICF_R_TO_F64|tmpi2->ic_flags;
tmpi->ic_flags|=tmpi1->ic_flags&~ICF_RES_TO_F64|tmpi2->ic_flags;
OptSetNOP1(tmpi2);
tmpi->ic_code=IC_IMM_I64;
@@ -974,7 +974,7 @@ args.
tmpi->ic_class2=cmp.internal_types[RT_I64];
OptSetNOP1(tmpi1);
}
if (tmpi1->ic_flags&ICF_R_TO_F64) {
if (tmpi1->ic_flags&ICF_RES_TO_F64) {
i=0;
tmpi2=tmpi1->last;
while (TRUE) {
@@ -992,7 +992,7 @@ args.
tmpi2=tmpi2->next;
tmpi1->ic_flags=tmpi->ic_flags|tmpi1->ic_flags&
~(ICF_R_TO_F64|ICF_PUSH_RES)|tmpi2->ic_flags;
~(ICF_RES_TO_F64|ICF_PUSH_RES)|tmpi2->ic_flags;
OptSetNOP1(tmpi2);
tmpi1->ic_class=cmp.internal_types[RT_I64];
@@ -1012,7 +1012,7 @@ args.
while (tmpi2->ic_code!=IC_CALL_END)
tmpi2=tmpi2->next;
tmpi->ic_flags|=tmpi1->ic_flags&~ICF_R_TO_F64|tmpi2->ic_flags;
tmpi->ic_flags|=tmpi1->ic_flags&~ICF_RES_TO_F64|tmpi2->ic_flags;
OptSetNOP1(tmpi2);
tmpi->ic_code=IC_IMM_F64;
@@ -1030,7 +1030,7 @@ args.
while (tmpi2->ic_code!=IC_CALL_END)
tmpi2=tmpi2->next;
tmpi->ic_flags|=tmpi1->ic_flags&~ICF_R_TO_INT|tmpi2->ic_flags;
tmpi->ic_flags|=tmpi1->ic_flags&~ICF_RES_TO_INT|tmpi2->ic_flags;
OptSetNOP1(tmpi2);
tmpi->ic_code=IC_IMM_F64;
@@ -1039,7 +1039,7 @@ args.
tmpi->ic_class2=cmp.internal_types[RT_F64];
OptSetNOP1(tmpi1);
}
if (tmpi1->ic_flags&ICF_R_TO_INT) {
if (tmpi1->ic_flags&ICF_RES_TO_INT) {
i=0;
tmpi2=tmpi1->last;
while (TRUE) {
@@ -1057,7 +1057,7 @@ args.
tmpi2=tmpi2->next;
tmpi1->ic_flags=tmpi->ic_flags|tmpi1->ic_flags&
~(ICF_R_TO_INT|ICF_PUSH_RES)|tmpi2->ic_flags;
~(ICF_RES_TO_INT|ICF_PUSH_RES)|tmpi2->ic_flags;
OptSetNOP1(tmpi2);
tmpi1->ic_class=cmp.internal_types[RT_F64];
@@ -1077,7 +1077,7 @@ args.
while (tmpi2->ic_code!=IC_CALL_END)
tmpi2=tmpi2->next;
tmpi->ic_flags|=tmpi1->ic_flags&~ICF_R_TO_F64|tmpi2->ic_flags;
tmpi->ic_flags|=tmpi1->ic_flags&~ICF_RES_TO_F64|tmpi2->ic_flags;
OptSetNOP1(tmpi2);
tmpi->ic_code=IC_IMM_I64;
@@ -1252,7 +1252,7 @@ args.
case IC_ASM:
break;
default:
"Pass:%d Missing IC handler\n",cc->pass;
"Pass:%d Missing IC hndlr\n",cc->pass;
ICPut(cc,tmpi);
LexExcept(cc,"Compiler Optimization Error at ");
}
@@ -1270,9 +1270,9 @@ args.
}
if (tmpi->ic_class) {
if (tmpi->ic_class->raw_type==RT_F64)
tmpi->ic_flags&=~ICF_R_TO_F64;
tmpi->ic_flags&=~ICF_RES_TO_F64;
else
tmpi->ic_flags&=~ICF_R_TO_INT;
tmpi->ic_flags&=~ICF_RES_TO_INT;
if (code>IC_END_EXP)
last_with_class=tmpi;
}
+61 -61
View File
@@ -67,68 +67,68 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
break;
case IS_2_ARG:
tmpi2=PrsPop(ps);
if (tmpi2->ic_flags&ICF_R_TO_F64)
if (tmpi2->ic_flags&ICF_RES_TO_F64)
tmpc2=cmp.internal_types[RT_F64];
else if (tmpi2->ic_flags & ICF_R_TO_INT)
else if (tmpi2->ic_flags & ICF_RES_TO_INT)
tmpc2=cmp.internal_types[RT_I64];
else
tmpc2=tmpi->t.a2c;
tmpi->a2.type=MDF_STK+CmpRawType(tmpc2);
tmpi->ic_flags|=ICF_A2_WAS_STK;
tmpc2=tmpi->t.arg2_class;
tmpi->arg2.type=MDF_STK+CmpRawType(tmpc2);
tmpi->ic_flags|=ICF_ARG2_WAS_STK;
case IS_1_ARG:
tmpi1=PrsPop(ps);
if (tmpi1->ic_flags&ICF_R_TO_F64)
if (tmpi1->ic_flags&ICF_RES_TO_F64)
tmpc1=cmp.internal_types[RT_F64];
else if (tmpi1->ic_flags & ICF_R_TO_INT)
else if (tmpi1->ic_flags & ICF_RES_TO_INT)
tmpc1=cmp.internal_types[RT_I64];
else
tmpc1=tmpi->t.a1c;
tmpi->a1.type=MDF_STK+CmpRawType(tmpc1);
tmpi->a1_type_pointed_to=CmpRawTypePointed(tmpc1);
tmpi->ic_flags|=ICF_A1_WAS_STK;
tmpc1=tmpi->t.arg1_class;
tmpi->arg1.type=MDF_STK+CmpRawType(tmpc1);
tmpi->arg1_type_pointed_to=CmpRawTypePointed(tmpc1);
tmpi->ic_flags|=ICF_ARG1_WAS_STK;
break;
case IS_0_ARG: //nobound switch
break;
}
if (intermediate_code_table[code].res_cnt) {
tmpi->r.type=MDF_STK+CmpRawType(tmpc);
tmpi->ic_flags|=ICF_R_WAS_STK;
tmpi->res.type=MDF_STK+CmpRawType(tmpc);
tmpi->ic_flags|=ICF_RES_WAS_STK;
PrsPush(ps,tmpi);
}
switch [code] {
case IC_IMM_F64:
tmpi->ic_flags&=~ICF_R_TO_F64;
if (tmpi->ic_flags&ICF_R_TO_INT) {
tmpi->ic_flags&=~ICF_RES_TO_F64;
if (tmpi->ic_flags&ICF_RES_TO_INT) {
tmpi->ic_data=ToI64(tmpi->ic_data(F64));
tmpi->ic_flags&=~ICF_R_TO_INT;
tmpi->ic_flags&=~ICF_RES_TO_INT;
tmpi->ic_code=IC_IMM_I64;
}
break;
case IC_IMM_I64:
tmpi->ic_flags&=~ICF_R_TO_INT;
if (tmpi->ic_flags&ICF_R_TO_F64) {
tmpi->ic_flags&=~ICF_RES_TO_INT;
if (tmpi->ic_flags&ICF_RES_TO_F64) {
tmpi->ic_data(F64)=ToF64(tmpi->ic_data);
tmpi->ic_flags&=~ICF_R_TO_F64;
tmpi->ic_flags&=~ICF_RES_TO_F64;
tmpi->ic_code=IC_IMM_F64;
}
break;
case IC_RBP:
tmpi->ic_code=IC_REG;
tmpi->a1.reg=REG_RBP;
tmpi->arg1.reg=REG_RBP;
break;
case IC_DEREF:
tmpi->a1_type_pointed_to=tmpi->r.type.raw_type;
tmpi->arg1_type_pointed_to=tmpi->res.type.raw_type;
if (tmpi1->ic_code==IC_LEA) {
tmpi->ic_flags|=tmpi1->ic_flags;
tmpi->a1.reg=tmpi1->a1.reg;
tmpi->a1.disp=tmpi1->a1.disp;
tmpi->a1.type=MDF_DISP+tmpi->r.type.raw_type;
tmpi->a1_type_pointed_to=CmpRawTypePointed(tmpc);
tmpi->arg1.reg=tmpi1->arg1.reg;
tmpi->arg1.disp=tmpi1->arg1.disp;
tmpi->arg1.type=MDF_DISP+tmpi->res.type.raw_type;
tmpi->arg1_type_pointed_to=CmpRawTypePointed(tmpc);
tmpi->ic_code=IC_MOV;
OptFree(tmpi1);
if (tmpi->a1.reg==REG_RBP)
if (tmpi->arg1.reg==REG_RBP)
for (i=0;i<member_cnt;i++)
if (mv[i].offset_start==tmpi->a1.disp) {
if (mv[i].offset_start==tmpi->arg1.disp) {
mv[i].lea_balance--;
mv[i].score++;
break;
@@ -136,10 +136,10 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
} else if (tmpil1->ic_code==IC_ADD_CONST) {
if (tmpil2->ic_code==IC_REG) {
tmpi->ic_flags|=tmpil2->ic_flags|tmpil1->ic_flags;
tmpi->a1.reg=tmpil2->a1.reg;
tmpi->a1.disp=tmpi->ic_data;
tmpi->a1.type=MDF_DISP+tmpi->r.type.raw_type;
tmpi->a1_type_pointed_to=CmpRawTypePointed(tmpc);
tmpi->arg1.reg=tmpil2->arg1.reg;
tmpi->arg1.disp=tmpi->ic_data;
tmpi->arg1.type=MDF_DISP+tmpi->res.type.raw_type;
tmpi->arg1_type_pointed_to=CmpRawTypePointed(tmpc);
tmpi->ic_code=IC_MOV;
OptFree(tmpil2);
OptFree(tmpil1);
@@ -150,18 +150,18 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
case IC__MM:
case IC_PP_:
case IC_MM_:
CmpMinTypePointed(tmpi,CmpRawTypePointed(tmpi->t.a1c));
CmpMinTypePointed(tmpi,CmpRawTypePointed(tmpi->t.arg1_class));
case IC_DEREF_PP:
case IC_DEREF_MM:
if (tmpi1->ic_code==IC_LEA && tmpi1->a1.type&MDF_DISP &&
tmpi1->a1.reg==REG_RBP)
if (tmpi1->ic_code==IC_LEA && tmpi1->arg1.type&MDF_DISP &&
tmpi1->arg1.reg==REG_RBP)
for (i=0;i<member_cnt;i++)
if (mv[i].offset_start==tmpi1->a1.disp) {
if (mv[i].offset_start==tmpi1->arg1.disp) {
mv[i].lea_balance--;
mv[i].score++;
break;
}
tmpi->a1_type_pointed_to=tmpi->r.type.raw_type;
tmpi->arg1_type_pointed_to=tmpi->res.type.raw_type;
break;
case IC_MUL:
case IC_DIV:
@@ -177,19 +177,19 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
}
if (OptFixupBinaryOp2(&tmpi1,&tmpi2)) {
tmpi->ic_flags|=tmpi1->ic_flags;
if (tmpi->t.a1t!=tmpi2)
tmpi->t.a1c=tmpi->t.a2c;
if (tmpi->t.arg1_tree!=tmpi2)
tmpi->t.arg1_class=tmpi->t.arg2_class;
tmpi->ic_data=tmpi1->ic_data;
tmpi->ic_code=IC_ADD_CONST;
tmpi->a1_type_pointed_to=tmpi->r.type.raw_type;
tmpi->a2.type=MDF_NULL;
tmpi->arg1_type_pointed_to=tmpi->res.type.raw_type;
tmpi->arg2.type=MDF_NULL;
OptFree(tmpi1);
if (tmpil2->ic_code==IC_REG && tmpil2->a1.reg==REG_RBP) {
if (tmpil2->ic_code==IC_REG && tmpil2->arg1.reg==REG_RBP) {
tmpi->ic_flags|=tmpil2->ic_flags;
tmpi->ic_code=IC_LEA;
tmpi->a1.reg=REG_RBP;
tmpi->a1.type=MDF_DISP+tmpi->a1.type.raw_type;
tmpi->a1.disp=tmpi->ic_data;
tmpi->arg1.reg=REG_RBP;
tmpi->arg1.type=MDF_DISP+tmpi->arg1.type.raw_type;
tmpi->arg1.disp=tmpi->ic_data;
for (i=0;i<member_cnt;i++)
if (mv[i].offset_start<=tmpi->ic_data<mv[i].offset_end) {
mv[i].lea_balance++;
@@ -209,7 +209,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tmpi->ic_flags|=tmpi2->ic_flags;
tmpi->ic_data=tmpi2->ic_data;
tmpi->ic_code=IC_SUB_CONST;
tmpi->a2.type=MDF_NULL;
tmpi->arg2.type=MDF_NULL;
OptFree(tmpi2);
}
break;
@@ -235,25 +235,25 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
case IC_AND_EQU:
case IC_OR_EQU:
case IC_XOR_EQU:
if (tmpi1->ic_code==IC_LEA && tmpi1->a1.type&MDF_DISP &&
tmpi1->a1.reg==REG_RBP)
if (tmpi1->ic_code==IC_LEA && tmpi1->arg1.type&MDF_DISP &&
tmpi1->arg1.reg==REG_RBP)
for (i=0;i<member_cnt;i++)
if (mv[i].offset_start==tmpi1->a1.disp) {
if (mv[i].offset_start==tmpi1->arg1.disp) {
mv[i].lea_balance--;
mv[i].score++;
break;
}
tmpi->a1_type_pointed_to=tmpi->r.type.raw_type;
CmpMinTypePointed(tmpi,CmpRawTypePointed(tmpi->t.a1c));
tmpi->arg1_type_pointed_to=tmpi->res.type.raw_type;
CmpMinTypePointed(tmpi,CmpRawTypePointed(tmpi->t.arg1_class));
break;
case IC_RETURN_VAL:
case IC_RETURN_VAL2:
if (tmpc) {
if (tmpc->raw_type==RT_F64 && tmpil1->ic_class->raw_type!=RT_F64)
tmpil1->ic_flags|=ICF_R_TO_F64;
tmpil1->ic_flags|=ICF_RES_TO_F64;
else if (tmpc->raw_type!=RT_F64 &&
tmpil1->ic_class->raw_type==RT_F64)
tmpil1->ic_flags|=ICF_R_TO_INT;
tmpil1->ic_flags|=ICF_RES_TO_INT;
}
break;
case IC_SQR:
@@ -287,8 +287,8 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
if ((tmpi1->ic_code==IC_IMM_I64 ||
tmpi1->ic_code==IC_IMM_F64) && !tmpi1->ic_data) {
OptFree(tmpi1);
MemCpy(&tmpi->a1,&tmpi->a2,sizeof(CICArg));
tmpi->a2.type=MDF_NULL;
MemCpy(&tmpi->arg1,&tmpi->arg2,sizeof(CICArg));
tmpi->arg2.type=MDF_NULL;
if (code==IC_BR_EQU_EQU)
code=tmpi->ic_code=IC_BR_ZERO;
else
@@ -298,7 +298,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
} else if ((tmpi2->ic_code==IC_IMM_I64 ||
tmpi2->ic_code==IC_IMM_F64) && !tmpi2->ic_data) {
OptFree(tmpi2);
tmpi->a2.type=MDF_NULL;
tmpi->arg2.type=MDF_NULL;
if (code==IC_BR_EQU_EQU)
code=tmpi->ic_code=IC_BR_ZERO;
else
@@ -310,7 +310,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
if (tmpi1->ic_code==IC_IMM_I64 || tmpi1->ic_code==IC_IMM_F64) {
if (code==IC_BR_ZERO ^^ tmpi1->ic_data) {
OptFree(tmpi1);
tmpi->a1.type=MDF_NULL;
tmpi->arg1.type=MDF_NULL;
tmpi->ic_code=IC_JMP;
} else {
OptFree(tmpi1);
@@ -359,15 +359,15 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
goto here1;
case IC_BR_MM_ZERO:
case IC_BR_MM_NOT_ZERO:
if (tmpi1->ic_code==IC_LEA && tmpi1->a1.type&MDF_DISP &&
tmpi1->a1.reg==REG_RBP)
if (tmpi1->ic_code==IC_LEA && tmpi1->arg1.type&MDF_DISP &&
tmpi1->arg1.reg==REG_RBP)
for (i=0;i<member_cnt;i++)
if (mv[i].offset_start==tmpi1->a1.disp) {
if (mv[i].offset_start==tmpi1->arg1.disp) {
mv[i].lea_balance--;
mv[i].score++;
break;
}
tmpi->a1_type_pointed_to=CmpRawType(tmpc);
tmpi->arg1_type_pointed_to=CmpRawType(tmpc);
goto here1;
case IC_BR_LESS:
case IC_BR_GREATER_EQU:
@@ -504,7 +504,7 @@ here1:
case IC_LABEL:
break;
default:
"Pass:%d Missing IC handler\n",cc->pass;
"Pass:%d Missing IC hndlr\n",cc->pass;
ICPut(cc,tmpi);
LexExcept(cc,"Compiler Optimization Error at ");
}
+192 -190
View File
@@ -9,119 +9,120 @@ Bool OptIC4(CIntermediateCode *tmpi)
if (!(tmpil2=OptLag1(tmpil1)))
return FALSE;
if (tmpil2->r.type&MDF_STK && !(tmpil2->ic_flags&ICF_PUSH_RES)) {
if (tmpil1->ic_code==IC_ADD_CONST && tmpil1->a1.type&MDF_STK) {
if (tmpil2->res.type&MDF_STK && !(tmpil2->ic_flags&ICF_PUSH_RES)) {
if (tmpil1->ic_code==IC_ADD_CONST && tmpil1->arg1.type&MDF_STK) {
if ((tmpil2->ic_code==IC_REG || tmpil2->ic_code==IC_MOV) &&
tmpil2->a1.type&MDF_REG) {
tmpil2->arg1.type&MDF_REG) {
i=tmpil1->ic_data;
if (MIN_I32<=i<=MAX_I32 &&
!Bt(&cmp.non_ptr_vars_mask,tmpil2->a1.reg)) {
!Bt(&cmp.non_ptr_vars_mask,tmpil2->arg1.reg)) {
tmpil1->ic_flags|=tmpil2->ic_flags&ICG_NO_CVT_MASK;
tmpil1->ic_code=IC_LEA;
tmpil1->a1.type=MDF_DISP+tmpil1->a1.type.raw_type;
tmpil1->a1.reg=tmpil2->a1.reg;
tmpil1->a1.disp=i;
tmpil1->arg1.type=MDF_DISP+tmpil1->arg1.type.raw_type;
tmpil1->arg1.reg=tmpil2->arg1.reg;
tmpil1->arg1.disp=i;
OptFree(tmpil2);
return TRUE;
}
} else if (tmpil2->ic_code==IC_SHL_CONST && tmpil2->a1.type&MDF_REG) {
} else if (tmpil2->ic_code==IC_SHL_CONST && tmpil2->arg1.type&MDF_REG) {
i=tmpil1->ic_data;
if (MIN_I32<=i<=MAX_I32 && tmpil2->a1.reg!=REG_RSP &&
if (MIN_I32<=i<=MAX_I32 && tmpil2->arg1.reg!=REG_RSP &&
1<=tmpil2->ic_data<=3) {
tmpil1->ic_flags|=tmpil2->ic_flags&ICG_NO_CVT_MASK;
tmpil1->ic_code=IC_LEA;
tmpil1->a1.type=MDF_SIB+tmpil1->a1.type.raw_type;
tmpil1->a1.reg=tmpil2->a1.reg<<8+REG_NONE;
tmpil1->arg1.type=MDF_SIB+tmpil1->arg1.type.raw_type;
tmpil1->arg1.reg=tmpil2->arg1.reg<<8+REG_NONE;
if (tmpil2->ic_data==1)
tmpil1->a1.reg|=0x4000;
tmpil1->arg1.reg|=0x4000;
else if (tmpil2->ic_data==2)
tmpil1->a1.reg|=0x8000;
tmpil1->arg1.reg|=0x8000;
else
tmpil1->a1.reg|=0xC000;
tmpil1->a1.disp=i;
tmpil1->arg1.reg|=0xC000;
tmpil1->arg1.disp=i;
OptFree(tmpil2);
return TRUE;
}
}
}
if (tmpil2->ic_code==IC_MOV || tmpil2->ic_code==IC_REG) {
if (tmpil1->a2.type&MDF_STK) {
if (tmpil2->ic_flags & ICF_R_TO_INT) {
if (tmpil2->a1.type&MDF_IMM)
tmpil2->a1.disp=tmpil2->a1.disp(F64);
if (tmpil1->arg2.type&MDF_STK) {
if (tmpil2->ic_flags & ICF_RES_TO_INT) {
if (tmpil2->arg1.type&MDF_IMM)
tmpil2->arg1.disp=tmpil2->arg1.disp(F64);
else
tmpil1->ic_flags|=ICF_A2_TO_INT;
} else if (tmpil2->ic_flags&ICF_R_TO_F64) {
if (tmpil2->a1.type&MDF_IMM)
tmpil2->a1.disp(F64)=tmpil2->a1.disp;
tmpil1->ic_flags|=ICF_ARG2_TO_INT;
} else if (tmpil2->ic_flags&ICF_RES_TO_F64) {
if (tmpil2->arg1.type&MDF_IMM)
tmpil2->arg1.disp(F64)=tmpil2->arg1.disp;
else
tmpil1->ic_flags|=ICF_A2_TO_F64;
tmpil1->ic_flags|=ICF_ARG2_TO_F64;
}
tmpil1->a2.type=tmpil2->a1.type&MDG_MASK+
MinI64(tmpil1->a2.type.raw_type,
MinI64(tmpil2->r.type.raw_type,tmpil2->a1.type.raw_type));
tmpil1->a2.reg=tmpil2->a1.reg;
tmpil1->a2.disp=tmpil2->a1.disp;
tmpil1->arg2.type=tmpil2->arg1.type&MDG_MASK+
MinI64(tmpil1->arg2.type.raw_type,
MinI64(tmpil2->res.type.raw_type,tmpil2->arg1.type.raw_type));
tmpil1->arg2.reg=tmpil2->arg1.reg;
tmpil1->arg2.disp=tmpil2->arg1.disp;
tmpil1->ic_flags|=tmpil2->ic_flags&ICG_NO_CVT_MASK;
OptSetNOP2(tmpil2);
return TRUE;
}
if (tmpil1->a1.type&MDF_STK) {
if (tmpil2->ic_flags & ICF_R_TO_INT) {
if (tmpil2->a1.type&MDF_IMM)
tmpil2->a1.disp=tmpil2->a1.disp(F64);
if (tmpil1->arg1.type&MDF_STK) {
if (tmpil2->ic_flags & ICF_RES_TO_INT) {
if (tmpil2->arg1.type&MDF_IMM)
tmpil2->arg1.disp=tmpil2->arg1.disp(F64);
else
tmpil1->ic_flags|=ICF_A1_TO_INT;
} else if (tmpil2->ic_flags&ICF_R_TO_F64) {
if (tmpil2->a1.type&MDF_IMM) {
if (tmpil2->a1.type&RTF_UNSIGNED)
tmpil2->a1.disp(F64)=tmpil2->a1.disp(U64);
tmpil1->ic_flags|=ICF_ARG1_TO_INT;
} else if (tmpil2->ic_flags&ICF_RES_TO_F64) {
if (tmpil2->arg1.type&MDF_IMM) {
if (tmpil2->arg1.type&RTF_UNSIGNED)
tmpil2->arg1.disp(F64)=tmpil2->arg1.disp(U64);
else
tmpil2->a1.disp(F64)=tmpil2->a1.disp(I64);
tmpil2->arg1.disp(F64)=tmpil2->arg1.disp(I64);
} else
tmpil1->ic_flags|=ICF_A1_TO_F64;
tmpil1->ic_flags|=ICF_ARG1_TO_F64;
}
tmpil1->a1.type=tmpil2->a1.type&MDG_MASK+
MinI64(tmpil1->a1.type.raw_type,
MinI64(tmpil2->r.type.raw_type,tmpil2->a1.type.raw_type));
CmpMinTypePointed(tmpil1,tmpil2->a1_type_pointed_to);
tmpil1->a1.reg=tmpil2->a1.reg;
tmpil1->a1.disp=tmpil2->a1.disp;
tmpil1->arg1.type=tmpil2->arg1.type&MDG_MASK+
MinI64(tmpil1->arg1.type.raw_type,
MinI64(tmpil2->res.type.raw_type,tmpil2->arg1.type.raw_type));
CmpMinTypePointed(tmpil1,tmpil2->arg1_type_pointed_to);
tmpil1->arg1.reg=tmpil2->arg1.reg;
tmpil1->arg1.disp=tmpil2->arg1.disp;
tmpil1->ic_flags|=tmpil2->ic_flags&ICG_NO_CVT_MASK;
OptSetNOP2(tmpil2);
return TRUE;
}
}
if (tmpil1->ic_code==IC_DEREF) {
if (tmpil2->ic_code==IC_ADD_CONST && tmpil2->a1.type&MDF_REG &&
tmpil1->a1.type&MDF_STK) {
if (tmpil2->ic_code==IC_ADD_CONST && tmpil2->arg1.type&MDF_REG &&
tmpil1->arg1.type&MDF_STK) {
i=tmpil2->ic_data;
if (MIN_I32<=i<=MAX_I32 &&
!Bt(&cmp.non_ptr_vars_mask,tmpil2->a1.reg)) {
!Bt(&cmp.non_ptr_vars_mask,tmpil2->arg1.reg)) {
tmpil1->ic_flags|=tmpil2->ic_flags;
tmpil1->ic_code=IC_MOV;
tmpil1->a1.type=MDF_DISP+tmpil1->a1_type_pointed_to;
tmpil1->a1.reg=tmpil2->a1.reg;
tmpil1->a1.disp=i;
tmpil1->arg1.type=MDF_DISP+tmpil1->arg1_type_pointed_to;
tmpil1->arg1.reg=tmpil2->arg1.reg;
tmpil1->arg1.disp=i;
OptSetNOP2(tmpil2,-1);
return TRUE;
}
}
if (tmpil2->ic_code==IC_LEA && tmpil1->a1.type&MDF_STK) {
if (tmpil2->ic_code==IC_LEA && tmpil1->arg1.type&MDF_STK) {
tmpil1->ic_flags|=tmpil2->ic_flags;
tmpil1->ic_code=IC_MOV;
tmpil1->a1.type=tmpil2->a1.type&MDG_MASK+tmpil1->a1_type_pointed_to;
tmpil1->a1.reg=tmpil2->a1.reg;
tmpil1->a1.disp=tmpil2->a1.disp;
tmpil1->arg1.type=tmpil2->arg1.type&MDG_MASK+
tmpil1->arg1_type_pointed_to;
tmpil1->arg1.reg=tmpil2->arg1.reg;
tmpil1->arg1.disp=tmpil2->arg1.disp;
OptFree(tmpil2);
return TRUE;
}
}
}
if (tmpil1->ic_code==IC_DEREF) {
if (tmpil1->a1.type&MDF_REG) {
tmpil1->a1.type=MDF_DISP+tmpil1->a1_type_pointed_to;
tmpil1->a1.disp=0;
if (tmpil1->arg1.type&MDF_REG) {
tmpil1->arg1.type=MDF_DISP+tmpil1->arg1_type_pointed_to;
tmpil1->arg1.disp=0;
tmpil1->ic_code=IC_MOV;
return TRUE;
}
@@ -182,51 +183,51 @@ U0 OptPass4(CCmpCtrl *cc,COptReg *reg_offsets,I64 *_type)
switch [code] {
case IC_IMM_I64:
case IC_TYPE:
tmpi->a1.type=MDF_IMM+RT_I64;
tmpi->a1.disp=tmpi->ic_data;
tmpi->arg1.type=MDF_IMM+RT_I64;
tmpi->arg1.disp=tmpi->ic_data;
tmpi->ic_code=IC_MOV;
break;
case IC_IMM_F64:
tmpi->a1.type=MDF_IMM+RT_I64;
tmpi->a1.disp=tmpi->ic_data;
tmpi->a1_type_pointed_to=RT_F64;
tmpi->arg1.type=MDF_IMM+RT_I64;
tmpi->arg1.disp=tmpi->ic_data;
tmpi->arg1_type_pointed_to=RT_F64;
tmpi->ic_code=IC_MOV;
break;
case IC_MOV:
if (tmpi->a1.type&MDF_DISP && tmpi->a1.reg==REG_RBP) {
i=CmpOffset2Reg(tmpi->a1.disp,reg_offsets);
if (tmpi->arg1.type&MDF_DISP && tmpi->arg1.reg==REG_RBP) {
i=CmpOffset2Reg(tmpi->arg1.disp,reg_offsets);
if (i>=0) {
tmpi->a1.type=MDF_REG+tmpi->a1.type.raw_type;
tmpi->a1.reg=i;
tmpi->a1.disp=0;
tmpi->arg1.type=MDF_REG+tmpi->arg1.type.raw_type;
tmpi->arg1.reg=i;
tmpi->arg1.disp=0;
}
}
break;
case IC_DEREF:
if (tmpi1->ic_code==IC_LEA) {
if (tmpi1->a1.type&MDF_DISP && tmpi1->a1.reg==REG_RBP) {
i=CmpOffset2Reg(tmpi1->a1.disp,reg_offsets);
if (tmpi1->arg1.type&MDF_DISP && tmpi1->arg1.reg==REG_RBP) {
i=CmpOffset2Reg(tmpi1->arg1.disp,reg_offsets);
if (i>=0) {
tmpi->ic_flags|=tmpi1->ic_flags;
tmpi->ic_code=IC_REG;
tmpi->a1.type=MDF_REG+tmpi->a1.type.raw_type;
tmpi->a1.reg=i;
tmpi->a1.disp=0;
tmpi->arg1.type=MDF_REG+tmpi->arg1.type.raw_type;
tmpi->arg1.reg=i;
tmpi->arg1.disp=0;
OptFree(tmpi1);
}
}
} else if ((tmpi1->ic_code==IC_ABS_ADDR ||
tmpi1->ic_code==IC_MOV &&
tmpi1->a1.type==MDF_IMM+RT_I64 &&
0<=tmpi1->a1.disp<=MAX_I32)&& !(tmpi1->ic_flags&ICF_NO_RIP)) {
tmpi1->arg1.type==MDF_IMM+RT_I64 &&
0<=tmpi1->arg1.disp<=MAX_I32)&& !(tmpi1->ic_flags&ICF_NO_RIP)) {
if (tmpi1->ic_code==IC_ABS_ADDR)
tmpi->a1.disp=tmpi1->ic_data;
tmpi->arg1.disp=tmpi1->ic_data;
else
tmpi->a1.disp=tmpi1->a1.disp;
tmpi->arg1.disp=tmpi1->arg1.disp;
tmpi->ic_flags|=tmpi1->ic_flags;
tmpi->ic_code=IC_MOV;
tmpi->a1.type=MDF_RIP_DISP32+tmpi->a1_type_pointed_to;
tmpi->a1.reg=REG_RIP;
tmpi->arg1.type=MDF_RIP_DISP32+tmpi->arg1_type_pointed_to;
tmpi->arg1.reg=REG_RIP;
OptFree(tmpi1);
}
break;
@@ -240,13 +241,13 @@ U0 OptPass4(CCmpCtrl *cc,COptReg *reg_offsets,I64 *_type)
case IC_PP_:
case IC_MM_:
if (tmpi1->ic_code==IC_LEA) {
if (tmpi1->a1.type&MDF_DISP && tmpi1->a1.reg==REG_RBP) {
i=CmpOffset2Reg(tmpi1->a1.disp,reg_offsets);
if (tmpi1->arg1.type&MDF_DISP && tmpi1->arg1.reg==REG_RBP) {
i=CmpOffset2Reg(tmpi1->arg1.disp,reg_offsets);
if (i>=0) {
tmpi->ic_flags|=tmpi1->ic_flags;
tmpi->a1.type=MDF_REG+tmpi->a1.type.raw_type;
tmpi->a1.reg=i;
tmpi->a1.disp=0;
tmpi->arg1.type=MDF_REG+tmpi->arg1.type.raw_type;
tmpi->arg1.reg=i;
tmpi->arg1.disp=0;
tmpi->ic_flags|=ICF_BY_VAL;
OptSetNOP2(tmpi1);
} else
@@ -254,38 +255,38 @@ U0 OptPass4(CCmpCtrl *cc,COptReg *reg_offsets,I64 *_type)
} else {
p4_lea_gone:
tmpi->ic_flags|=tmpi1->ic_flags;
tmpi->a1.type=tmpi1->a1.type;
tmpi->a1.reg=tmpi1->a1.reg;
tmpi->a1.disp=tmpi1->a1.disp;
tmpi->arg1.type=tmpi1->arg1.type;
tmpi->arg1.reg=tmpi1->arg1.reg;
tmpi->arg1.disp=tmpi1->arg1.disp;
tmpi->ic_flags|=ICF_BY_VAL;
OptSetNOP2(tmpi1);
}
} else if ((tmpi1->ic_code==IC_ABS_ADDR || tmpi1->ic_code==IC_MOV &&
tmpi1->a1.type==MDF_IMM+RT_I64 &&
0<=tmpi1->a1.disp<=MAX_I32)&& !(tmpi1->ic_flags&ICF_NO_RIP)) {
tmpi1->arg1.type==MDF_IMM+RT_I64 &&
0<=tmpi1->arg1.disp<=MAX_I32)&& !(tmpi1->ic_flags&ICF_NO_RIP)) {
tmpi->ic_flags|=tmpi1->ic_flags;
if (tmpi1->ic_code==IC_ABS_ADDR)
tmpi->a1.disp=tmpi1->ic_data;
tmpi->arg1.disp=tmpi1->ic_data;
else
tmpi->a1.disp=tmpi1->a1.disp;
tmpi->a1.type=MDF_RIP_DISP32+tmpi->a1_type_pointed_to;
tmpi->a1.reg=REG_RIP;
tmpi->arg1.disp=tmpi1->arg1.disp;
tmpi->arg1.type=MDF_RIP_DISP32+tmpi->arg1_type_pointed_to;
tmpi->arg1.reg=REG_RIP;
tmpi->ic_flags|=ICF_BY_VAL;
OptFree(tmpi1);
}
break;
case IC_ADD:
if (tmpi1->ic_code==IC_MOV && tmpi1->a1.type==MDF_REG+RT_I64 ||
if (tmpi1->ic_code==IC_MOV && tmpi1->arg1.type==MDF_REG+RT_I64 ||
tmpi1->ic_code==IC_REG) {
if (tmpi2->ic_code==IC_MOV && tmpi2->a1.type==MDF_REG+RT_I64 ||
if (tmpi2->ic_code==IC_MOV && tmpi2->arg1.type==MDF_REG+RT_I64 ||
tmpi2->ic_code==IC_REG) {
if (tmpi2->a1.reg!=REG_RSP) {
tmpi->a1.disp=0;
tmpi->a1.reg=tmpi1->a1.reg+tmpi2->a1.reg<<8;
if (tmpi2->arg1.reg!=REG_RSP) {
tmpi->arg1.disp=0;
tmpi->arg1.reg=tmpi1->arg1.reg+tmpi2->arg1.reg<<8;
goto p4_sib;
} else if (tmpi1->a1.reg!=REG_RSP) {
tmpi->a1.disp=0;
tmpi->a1.reg=tmpi2->a1.reg+tmpi1->a1.reg<<8;
} else if (tmpi1->arg1.reg!=REG_RSP) {
tmpi->arg1.disp=0;
tmpi->arg1.reg=tmpi2->arg1.reg+tmpi1->arg1.reg<<8;
p4_sib:
tmpi->ic_flags|=(tmpi1->ic_flags|tmpi2->ic_flags)
&ICG_NO_CVT_MASK;
@@ -293,52 +294,52 @@ p4_sib:
OptFree(tmpi2);
tmpi->ic_code=IC_LEA;
tmpi->a1.type=MDF_SIB+RT_I64;
tmpi->a1_type_pointed_to=RT_I64;
tmpi->arg1.type=MDF_SIB+RT_I64;
tmpi->arg1_type_pointed_to=RT_I64;
tmpi->a2.type=MDF_NULL+tmpi->a2.type.raw_type;
tmpi->arg2.type=MDF_NULL+tmpi->arg2.type.raw_type;
}
} else if (tmpi2->ic_code==IC_SHL_CONST &&
tmpi2->a1.type==MDF_REG+RT_I64 && tmpi2->ic_data<=3) {
if (tmpi2->a1.reg!=REG_RSP) {
tmpi->a1.disp=0;
tmpi->a1.reg=tmpi1->a1.reg+tmpi2->a1.reg<<8;
tmpi2->arg1.type==MDF_REG+RT_I64 && tmpi2->ic_data<=3) {
if (tmpi2->arg1.reg!=REG_RSP) {
tmpi->arg1.disp=0;
tmpi->arg1.reg=tmpi1->arg1.reg+tmpi2->arg1.reg<<8;
if (tmpi2->ic_data==1)
tmpi->a1.reg|=0x4000;
tmpi->arg1.reg|=0x4000;
else if (tmpi2->ic_data==2)
tmpi->a1.reg|=0x8000;
tmpi->arg1.reg|=0x8000;
else
tmpi->a1.reg|=0xC000;
tmpi->arg1.reg|=0xC000;
goto p4_sib;
}
}
} else if (tmpi1->ic_code==IC_LEA &&
tmpi1->a1.type&MDF_DISP) {
if (tmpi1->a1.reg==REG_RBP &&
CmpOffset2Reg(tmpi1->a1.disp,reg_offsets)>=0)
tmpi1->arg1.type&MDF_DISP) {
if (tmpi1->arg1.reg==REG_RBP &&
CmpOffset2Reg(tmpi1->arg1.disp,reg_offsets)>=0)
break;
if (tmpi2->ic_code==IC_MOV && tmpi2->a1.type==MDF_REG+RT_I64 ||
if (tmpi2->ic_code==IC_MOV && tmpi2->arg1.type==MDF_REG+RT_I64 ||
tmpi2->ic_code==IC_REG) {
if (tmpi2->a1.reg!=REG_RSP) {
tmpi->a1.disp=tmpi1->a1.disp;
tmpi->a1.reg=tmpi1->a1.reg+tmpi2->a1.reg<<8;
if (tmpi2->arg1.reg!=REG_RSP) {
tmpi->arg1.disp=tmpi1->arg1.disp;
tmpi->arg1.reg=tmpi1->arg1.reg+tmpi2->arg1.reg<<8;
goto p4_sib;
} else if (tmpi1->a1.reg!=REG_RSP) {
tmpi->a1.disp=tmpi1->a1.disp;
tmpi->a1.reg=tmpi2->a1.reg+tmpi1->a1.reg<<8;
} else if (tmpi1->arg1.reg!=REG_RSP) {
tmpi->arg1.disp=tmpi1->arg1.disp;
tmpi->arg1.reg=tmpi2->arg1.reg+tmpi1->arg1.reg<<8;
goto p4_sib;
}
} else if (tmpi2->ic_code==IC_SHL_CONST &&
tmpi2->a1.type==MDF_REG+RT_I64 && tmpi2->ic_data<=3) {
if (tmpi2->a1.reg!=REG_RSP) {
tmpi->a1.disp=tmpi1->a1.disp;
tmpi->a1.reg=tmpi1->a1.reg+tmpi2->a1.reg<<8;
tmpi2->arg1.type==MDF_REG+RT_I64 && tmpi2->ic_data<=3) {
if (tmpi2->arg1.reg!=REG_RSP) {
tmpi->arg1.disp=tmpi1->arg1.disp;
tmpi->arg1.reg=tmpi1->arg1.reg+tmpi2->arg1.reg<<8;
if (tmpi2->ic_data==1)
tmpi->a1.reg|=0x4000;
tmpi->arg1.reg|=0x4000;
else if (tmpi2->ic_data==2)
tmpi->a1.reg|=0x8000;
tmpi->arg1.reg|=0x8000;
else
tmpi->a1.reg|=0xC000;
tmpi->arg1.reg|=0xC000;
goto p4_sib;
}
}
@@ -360,52 +361,53 @@ p4_sib:
case IC_ADD_EQU:
case IC_SUB_EQU:
if (tmpi1->ic_code==IC_LEA) {
if (tmpi1->a1.type&(MDF_DISP|MDF_SIB)) {
if (tmpi1->arg1.type&(MDF_DISP|MDF_SIB)) {
tmpi2=tmpi->next;
if (tmpi1->a1.type&MDF_DISP && tmpi1->a1.reg==REG_RBP) {
i=CmpOffset2Reg(tmpi1->a1.disp,reg_offsets);
if (tmpi1->arg1.type&MDF_DISP && tmpi1->arg1.reg==REG_RBP) {
i=CmpOffset2Reg(tmpi1->arg1.disp,reg_offsets);
if (i>=0) {
tmpi->ic_flags|=tmpi1->ic_flags;
tmpi->a1.type=MDF_REG+tmpi->a1.type.raw_type;
tmpi->a1.reg=i;
tmpi->a1.disp=0;
tmpi->arg1.type=MDF_REG+tmpi->arg1.type.raw_type;
tmpi->arg1.reg=i;
tmpi->arg1.disp=0;
OptSetNOP2(tmpi1);
} else {
tmpi->ic_flags|=tmpi1->ic_flags;
tmpi->a1.type=MDF_DISP+tmpi->a1.type.raw_type;
tmpi->a1.reg=REG_RBP;
tmpi->a1.disp=tmpi1->a1.disp;
tmpi->arg1.type=MDF_DISP+tmpi->arg1.type.raw_type;
tmpi->arg1.reg=REG_RBP;
tmpi->arg1.disp=tmpi1->arg1.disp;
OptSetNOP2(tmpi1);
}
} else {
tmpi->ic_flags|=tmpi1->ic_flags;
tmpi->a1.type=tmpi1->a1.type&MDG_MASK+tmpi->a1.type.raw_type;
tmpi->a1.reg=tmpi1->a1.reg;
tmpi->a1.disp=tmpi1->a1.disp;
tmpi->arg1.type=tmpi1->arg1.type&MDG_MASK+
tmpi->arg1.type.raw_type;
tmpi->arg1.reg=tmpi1->arg1.reg;
tmpi->arg1.disp=tmpi1->arg1.disp;
OptSetNOP2(tmpi1);
}
if (tmpi->r.type&MDF_STK && tmpi2->a2.type&MDF_STK &&
if (tmpi->res.type&MDF_STK && tmpi2->arg2.type&MDF_STK &&
code!=IC_ASSIGN_PP && code!=IC_ASSIGN_MM) {
tmpi->r.type=tmpi->a1.type;
tmpi->r.reg=tmpi->a1.reg;
tmpi->r.disp=tmpi->a1.disp;
tmpi2->a2.type=tmpi->a1.type;
tmpi2->a2.reg=tmpi->a1.reg;
tmpi2->a2.disp=tmpi->a1.disp;
CmpMinTypePointed(tmpi2,tmpi->a1_type_pointed_to);
tmpi->res.type=tmpi->arg1.type;
tmpi->res.reg=tmpi->arg1.reg;
tmpi->res.disp=tmpi->arg1.disp;
tmpi2->arg2.type=tmpi->arg1.type;
tmpi2->arg2.reg=tmpi->arg1.reg;
tmpi2->arg2.disp=tmpi->arg1.disp;
CmpMinTypePointed(tmpi2,tmpi->arg1_type_pointed_to);
}
tmpi->ic_flags|=ICF_BY_VAL;
}
} else if ((tmpi1->ic_code==IC_ABS_ADDR ||
tmpi1->ic_code==IC_MOV && tmpi1->a1.type==MDF_IMM+RT_I64 &&
0<=tmpi1->a1.disp<=MAX_I32)&& !(tmpi1->ic_flags&ICF_NO_RIP)) {
tmpi1->ic_code==IC_MOV && tmpi1->arg1.type==MDF_IMM+RT_I64 &&
0<=tmpi1->arg1.disp<=MAX_I32)&& !(tmpi1->ic_flags&ICF_NO_RIP)) {
tmpi->ic_flags|=tmpi1->ic_flags;
if (tmpi1->ic_code==IC_ABS_ADDR)
tmpi->a1.disp=tmpi1->ic_data;
tmpi->arg1.disp=tmpi1->ic_data;
else
tmpi->a1.disp=tmpi1->a1.disp;
tmpi->a1.type=MDF_RIP_DISP32+tmpi->a1.type.raw_type;
tmpi->a1.reg=REG_RIP;
tmpi->arg1.disp=tmpi1->arg1.disp;
tmpi->arg1.type=MDF_RIP_DISP32+tmpi->arg1.type.raw_type;
tmpi->arg1.reg=REG_RIP;
tmpi->ic_flags|=ICF_BY_VAL;
OptSetNOP2(tmpi1);
}
@@ -417,9 +419,9 @@ p4_sib:
tmpil1=tmpi;
while (tmpil1=OptLag1(tmpil1))
if (tmpil1->ic_class) {
if (tmpil1->ic_flags & ICF_R_TO_F64)
if (tmpil1->ic_flags & ICF_RES_TO_F64)
*_type=RT_F64;
else if (tmpil1->ic_flags & ICF_R_TO_INT)
else if (tmpil1->ic_flags & ICF_RES_TO_INT)
*_type=RT_I64;
else
*_type=tmpil1->ic_class->raw_type;
@@ -450,42 +452,42 @@ p4_sib:
case IC_LBTC:
if (!(tmpi->ic_flags&ICF_BY_VAL)) {
if (tmpi2->ic_code==IC_ADDR) {
if (tmpi2->a1.type&MDF_STK &&
tmpi2->r.type&MDF_STK) {
if (tmpi2->arg1.type&MDF_STK &&
tmpi2->res.type&MDF_STK) {
if (tmpil2=OptLag1(tmpi2)) {
if (tmpil2->ic_code==IC_LEA) {
if (tmpil2->a1.type&(MDF_IMM|MDG_REG_DISP_SIB_RIP)) {
if (tmpil2->arg1.type&(MDF_IMM|MDG_REG_DISP_SIB_RIP)) {
if (tmpi2) {
tmpi->ic_flags|=tmpi2->ic_flags;
OptFree(tmpi2);
}
tmpi->ic_flags|=tmpil2->ic_flags|ICF_BY_VAL;
tmpi->a2.type=tmpil2->a1.type;
tmpi->a2.reg =tmpil2->a1.reg;
tmpi->a2.disp=tmpil2->a1.disp;
tmpi->arg2.type=tmpil2->arg1.type;
tmpi->arg2.reg =tmpil2->arg1.reg;
tmpi->arg2.disp=tmpil2->arg1.disp;
OptFree(tmpil2);
}
break;
} else if (tmpil2->ic_code!=IC_ABS_ADDR &&
!(tmpil2->ic_code==IC_MOV &&
tmpil2->a1.type==MDF_IMM+RT_I64 &&
0<=tmpil2->a1.disp<=MAX_I32) ||
tmpil2->arg1.type==MDF_IMM+RT_I64 &&
0<=tmpil2->arg1.disp<=MAX_I32) ||
tmpil2->ic_flags&ICF_NO_RIP)
tmpil2=NULL;
else {
if (tmpil2->ic_code==IC_ABS_ADDR)
tmpi->a2.disp=tmpil2->ic_data;
tmpi->arg2.disp=tmpil2->ic_data;
else
tmpi->a2.disp=tmpil2->a1.disp;
tmpi->arg2.disp=tmpil2->arg1.disp;
}
}
} else {
if (tmpi2->a1.type==MDF_IMM+RT_I64 &&
0<=tmpi2->a1.disp<=MAX_I32 &&
if (tmpi2->arg1.type==MDF_IMM+RT_I64 &&
0<=tmpi2->arg1.disp<=MAX_I32 &&
!(tmpi2->ic_flags&ICF_NO_RIP)) {
tmpil2=tmpi2;
tmpi2=NULL;
tmpi->a2.disp=tmpil2->a1.disp;
tmpi->arg2.disp=tmpil2->arg1.disp;
} else
tmpil2=NULL;
}
@@ -495,18 +497,18 @@ p4_sib:
OptFree(tmpi2);
}
tmpi->ic_flags|=tmpil2->ic_flags|ICF_BY_VAL;
tmpi->a2.type=MDF_RIP_DISP32+tmpi->a2.type.raw_type;
tmpi->a2.reg=REG_RIP;
tmpi->arg2.type=MDF_RIP_DISP32+tmpi->arg2.type.raw_type;
tmpi->arg2.reg=REG_RIP;
OptFree(tmpil2);
}
} else if (tmpi2->ic_code==IC_MOV && tmpi2->r.type&MDF_STK &&
tmpi2->a1.type==MDF_IMM+RT_I64 &&
0<=tmpi2->a1.disp<=MAX_I32 &&
} else if (tmpi2->ic_code==IC_MOV && tmpi2->res.type&MDF_STK &&
tmpi2->arg1.type==MDF_IMM+RT_I64 &&
0<=tmpi2->arg1.disp<=MAX_I32 &&
!(tmpi2->ic_flags&ICF_NO_RIP)) {
tmpi->a2.disp=tmpi2->a1.disp;
tmpi->arg2.disp=tmpi2->arg1.disp;
tmpi->ic_flags|=tmpi2->ic_flags|ICF_BY_VAL;
tmpi->a2.type=MDF_RIP_DISP32+tmpi->a2.type.raw_type;
tmpi->a2.reg=REG_RIP;
tmpi->arg2.type=MDF_RIP_DISP32+tmpi->arg2.type.raw_type;
tmpi->arg2.reg=REG_RIP;
OptFree(tmpi2);
}
}
@@ -540,19 +542,19 @@ p4_sib:
if (!(tmpil1->ic_flags&ICF_PUSH_RES)) {
if (tmpi->ic_flags&ICF_RES_NOT_USED) {
tmpil1->ic_flags|=ICF_RES_NOT_USED;
tmpil1->r.type=MDF_NULL+tmpil1->r.type.raw_type;
} else if (tmpi->a1.type&MDF_STK &&
tmpil1->r.type&MDF_STK) {
tmpi->a1.type=MDF_REG+tmpi->a1.type.raw_type;
tmpi->a1.disp=0;
tmpil1->r.type=MDF_REG+tmpil1->r.type.raw_type;
tmpil1->r.disp=0;
tmpil1->res.type=MDF_NULL+tmpil1->res.type.raw_type;
} else if (tmpi->arg1.type&MDF_STK &&
tmpil1->res.type&MDF_STK) {
tmpi->arg1.type=MDF_REG+tmpi->arg1.type.raw_type;
tmpi->arg1.disp=0;
tmpil1->res.type=MDF_REG+tmpil1->res.type.raw_type;
tmpil1->res.disp=0;
if (intermediate_code_table[tmpi->ic_code].arg_cnt==IS_2_ARG) {
tmpi->a1.reg=REG_R8;
tmpil1->r.reg=REG_R8;
tmpi->arg1.reg=REG_R8;
tmpil1->res.reg=REG_R8;
} else {
tmpi->a1.reg=REG_RAX;
tmpil1->r.reg=REG_RAX;
tmpi->arg1.reg=REG_RAX;
tmpil1->res.reg=REG_RAX;
}
}
}
@@ -667,7 +669,7 @@ p4_sib:
case IC_CALL_END2:
break;
default:
"Pass:%d Missing IC handler\n",cc->pass;
"Pass:%d Missing IC hndlr\n",cc->pass;
ICPut(cc,tmpi);
LexExcept(cc,"Compiler Optimization Error at ");
}
+32 -32
View File
@@ -26,58 +26,58 @@ U0 OptPass5(CCmpCtrl *cc)
if (Bt(&tmpi->ic_data,i))
ps->ptr--;
}
if (tmpi->a2.type&MDF_STK) {
if (tmpi->arg2.type&MDF_STK) {
tmpi1=PrsPop(ps);
if (tmpi1->ic_code==IC_MOV || tmpi1->ic_code==IC_REG) {
if (tmpi1->ic_flags & ICF_R_TO_INT) {
if (tmpi1->a1.type&MDF_IMM)
tmpi1->a1.disp=tmpi1->a1.disp(F64);
if (tmpi1->ic_flags & ICF_RES_TO_INT) {
if (tmpi1->arg1.type&MDF_IMM)
tmpi1->arg1.disp=tmpi1->arg1.disp(F64);
else
tmpi->ic_flags|=ICF_A2_TO_INT;
} else if (tmpi1->ic_flags&ICF_R_TO_F64) {
if (tmpi1->a1.type&MDF_IMM)
tmpi1->a1.disp(F64)=tmpi1->a1.disp;
tmpi->ic_flags|=ICF_ARG2_TO_INT;
} else if (tmpi1->ic_flags&ICF_RES_TO_F64) {
if (tmpi1->arg1.type&MDF_IMM)
tmpi1->arg1.disp(F64)=tmpi1->arg1.disp;
else
tmpi->ic_flags|=ICF_A2_TO_F64;
tmpi->ic_flags|=ICF_ARG2_TO_F64;
}
tmpi->a2.type=tmpi1->a1.type&MDG_MASK+
MinI64(tmpi->a2.type.raw_type,
MinI64(tmpi1->r.type.raw_type,tmpi1->a1.type.raw_type));
tmpi->a2.reg=tmpi1->a1.reg;
tmpi->a2.disp=tmpi1->a1.disp;
tmpi->arg2.type=tmpi1->arg1.type&MDG_MASK+
MinI64(tmpi->arg2.type.raw_type,
MinI64(tmpi1->res.type.raw_type,tmpi1->arg1.type.raw_type));
tmpi->arg2.reg=tmpi1->arg1.reg;
tmpi->arg2.disp=tmpi1->arg1.disp;
tmpi->ic_flags|=tmpi1->ic_flags&ICG_NO_CVT_MASK;
OptSetNOP2(tmpi1);
}
}
if (tmpi->a1.type&MDF_STK) {
if (tmpi->arg1.type&MDF_STK) {
tmpi1=PrsPop(ps);
if (tmpi1->ic_code==IC_MOV || tmpi1->ic_code==IC_REG) {
if (tmpi1->ic_flags & ICF_R_TO_INT) {
if (tmpi1->a1.type&MDF_IMM)
tmpi1->a1.disp=tmpi1->a1.disp(F64);
if (tmpi1->ic_flags & ICF_RES_TO_INT) {
if (tmpi1->arg1.type&MDF_IMM)
tmpi1->arg1.disp=tmpi1->arg1.disp(F64);
else
tmpi->ic_flags|=ICF_A1_TO_INT;
} else if (tmpi1->ic_flags&ICF_R_TO_F64) {
if (tmpi1->a1.type&MDF_IMM) {
if (tmpi1->a1.type&RTF_UNSIGNED)
tmpi1->a1.disp(F64)=tmpi1->a1.disp(U64);
tmpi->ic_flags|=ICF_ARG1_TO_INT;
} else if (tmpi1->ic_flags&ICF_RES_TO_F64) {
if (tmpi1->arg1.type&MDF_IMM) {
if (tmpi1->arg1.type&RTF_UNSIGNED)
tmpi1->arg1.disp(F64)=tmpi1->arg1.disp(U64);
else
tmpi1->a1.disp(F64)=tmpi1->a1.disp(I64);
tmpi1->arg1.disp(F64)=tmpi1->arg1.disp(I64);
} else
tmpi->ic_flags|=ICF_A1_TO_F64;
tmpi->ic_flags|=ICF_ARG1_TO_F64;
}
tmpi->a1.type=tmpi1->a1.type&MDG_MASK+
MinI64(tmpi->a1.type.raw_type,
MinI64(tmpi1->r.type.raw_type,tmpi1->a1.type.raw_type));
CmpMinTypePointed(tmpi,tmpi1->a1_type_pointed_to);
tmpi->a1.reg=tmpi1->a1.reg;
tmpi->a1.disp=tmpi1->a1.disp;
tmpi->arg1.type=tmpi1->arg1.type&MDG_MASK+
MinI64(tmpi->arg1.type.raw_type,
MinI64(tmpi1->res.type.raw_type,tmpi1->arg1.type.raw_type));
CmpMinTypePointed(tmpi,tmpi1->arg1_type_pointed_to);
tmpi->arg1.reg=tmpi1->arg1.reg;
tmpi->arg1.disp=tmpi1->arg1.disp;
tmpi->ic_flags|=tmpi1->ic_flags&ICG_NO_CVT_MASK;
OptSetNOP2(tmpi1);
}
}
if (tmpi->r.type&MDF_STK &&
if (tmpi->res.type&MDF_STK &&
!(tmpi->ic_flags&ICF_RES_NOT_USED))
PrsPush(ps,tmpi);
}
+49 -48
View File
@@ -4,21 +4,21 @@ Bool OptIC6(CIntermediateCode *tmpi)
if (tmpi->ic_code<IC_IMM_I64 || !(tmpil1=OptLag1(tmpi)))
return FALSE;
if (tmpil1->ic_code==IC_ADD_CONST && tmpi->ic_code==IC_DEREF &&
tmpi->ic_flags&ICF_A1_WAS_STK && tmpi->a1.type&MDF_REG &&
tmpil1->r.type&MDF_REG && MIN_I32<=tmpil1->ic_data<=MAX_I32 &&
!Bt(&cmp.non_ptr_vars_mask,tmpil1->a1.reg)) {
if (tmpil1->a1.type&MDF_REG) {
tmpi->ic_flags=tmpi->ic_flags&~ICF_A1_WAS_STK | tmpil1->ic_flags;
tmpi->ic_flags&ICF_ARG1_WAS_STK && tmpi->arg1.type&MDF_REG &&
tmpil1->res.type&MDF_REG && MIN_I32<=tmpil1->ic_data<=MAX_I32 &&
!Bt(&cmp.non_ptr_vars_mask,tmpil1->arg1.reg)) {
if (tmpil1->arg1.type&MDF_REG) {
tmpi->ic_flags=tmpi->ic_flags&~ICF_ARG1_WAS_STK | tmpil1->ic_flags;
tmpi->ic_code=IC_MOV;
tmpi->a1.type=MDF_DISP+tmpi->a1_type_pointed_to;
tmpi->a1.reg=tmpil1->a1.reg;
tmpi->a1.disp=tmpil1->ic_data;
tmpi->arg1.type=MDF_DISP+tmpi->arg1_type_pointed_to;
tmpi->arg1.reg=tmpil1->arg1.reg;
tmpi->arg1.disp=tmpil1->ic_data;
OptSetNOP2(tmpil1,-1);
} else {
tmpil1->ic_code=IC_MOV;
tmpi->ic_code=IC_MOV;
tmpi->a1.type=MDF_DISP+tmpi->a1_type_pointed_to;
tmpi->a1.disp=tmpil1->ic_data;
tmpi->arg1.type=MDF_DISP+tmpi->arg1_type_pointed_to;
tmpi->arg1.disp=tmpil1->ic_data;
}
return TRUE;
}
@@ -61,33 +61,33 @@ U0 OptPass6Lag(CCmpCtrl *cc,CPrsStk *ps,CIntermediateCode *tmpi,
}
if (intermediate_code_table[code].arg_cnt==IS_V_ARG)
stk_ptr-=tmpi->ic_data>>3;
if (tmpi->a2.type&MDF_STK) {
if (tmpi->arg2.type&MDF_STK) {
stk_ptr--;
if (stk_ptr<reg_stk_size) {
tmpi->a2.type=MDF_REG+tmpi->a2.type.raw_type;
tmpi->a2.reg=Bsf(REGG_STK_TMP);
tmpi->a2.disp=0;
tmpi->arg2.type=MDF_REG+tmpi->arg2.type.raw_type;
tmpi->arg2.reg=Bsf(REGG_STK_TMP);
tmpi->arg2.disp=0;
}
}
if (tmpi->a1.type&MDF_STK) {
if (tmpi->arg1.type&MDF_STK) {
stk_ptr--;
if (stk_ptr<reg_stk_size) {
tmpi->a1.type=MDF_REG+tmpi->a1.type.raw_type;
tmpi->a1.reg=Bsf(REGG_STK_TMP);
tmpi->a1.disp=0;
tmpi->arg1.type=MDF_REG+tmpi->arg1.type.raw_type;
tmpi->arg1.reg=Bsf(REGG_STK_TMP);
tmpi->arg1.disp=0;
}
}
if (tmpi->r.type&MDF_STK && !(tmpi->ic_flags & ICF_PUSH_RES)) {
if (tmpi->res.type&MDF_STK && !(tmpi->ic_flags & ICF_PUSH_RES)) {
stk_ptr++;
if (stk_ptr<=reg_stk_size) {
tmpi->r.type=MDF_REG+tmpi->r.type.raw_type;
tmpi->r.reg=Bsf(REGG_STK_TMP);
tmpi->res.type=MDF_REG+tmpi->res.type.raw_type;
tmpi->res.reg=Bsf(REGG_STK_TMP);
clobbered_reg_mask|=REGG_STK_TMP;
tmpi->r.disp=0;
tmpi->res.disp=0;
}
}
while (OptIC6(tmpi));
if (tmpi->r.type.raw_type!=RT_F64 && !(tmpi->ic_flags&ICF_USE_F64))
if (tmpi->res.type.raw_type!=RT_F64 && !(tmpi->ic_flags&ICF_USE_F64))
tmpi->ic_flags|=ICF_USE_INT;
*_stk_ptr=stk_ptr;
*_clobbered_reg_mask=clobbered_reg_mask;
@@ -113,49 +113,50 @@ U0 OptPass6(CCmpCtrl *cc)
if (tmpil1->ic_code>IC_NOP2)
tmpil2=tmpil1;
tmpil1=tmpi;
if (tmpi->a2.type&MDF_STK) {
if (tmpil2->r.type&MDF_STK &&
if (tmpi->arg2.type&MDF_STK) {
if (tmpil2->res.type&MDF_STK &&
!(tmpil2->ic_flags&ICF_PUSH_RES)) {
if (tmpi->ic_code==IC_ASSIGN && tmpi->ic_flags&ICF_BY_VAL &&
tmpi->ic_flags&ICF_RES_NOT_USED &&
tmpil2->ic_code!=IC_CALL_END &&
tmpil2->ic_code!=IC_CALL_END2 &&
tmpil2->ic_code!=IC_SET_RAX &&
!(tmpi->ic_flags&(ICF_A2_TO_F64|ICF_A2_TO_INT)) &&
!(tmpil2->ic_flags&(ICF_R_TO_F64|ICF_R_TO_INT))) {
tmpil2->r.type =tmpi->a1.type&MDG_MASK+tmpi->a1_type_pointed_to;
tmpil2->r.reg =tmpi->a1.reg;
tmpil2->r.disp =tmpi->a1.disp;
!(tmpi->ic_flags&(ICF_ARG2_TO_F64|ICF_ARG2_TO_INT)) &&
!(tmpil2->ic_flags&(ICF_RES_TO_F64|ICF_RES_TO_INT))) {
tmpil2->res.type =tmpi->arg1.type&MDG_MASK+
tmpi->arg1_type_pointed_to;
tmpil2->res.reg =tmpi->arg1.reg;
tmpil2->res.disp =tmpi->arg1.disp;
tmpil2->ic_flags=tmpil2->ic_flags
&~(ICF_RES_NOT_USED|ICF_R_WAS_STK)
|tmpi->ic_flags&~(ICF_BY_VAL|ICF_A1_WAS_STK|ICF_A2_WAS_STK);
&~(ICF_RES_NOT_USED|ICF_RES_WAS_STK)
|tmpi->ic_flags&~(ICF_BY_VAL|ICF_ARG1_WAS_STK|ICF_ARG2_WAS_STK);
old_tmpil2=NULL;
OptSetNOP1(tmpi);
} else {
tmpi->a2.type=MDF_REG+tmpi->a2.type.raw_type;
tmpi->a2.reg=REG_RAX;
tmpi->a2.disp=0;
tmpil2->r.type=MDF_REG+tmpil2->r.type.raw_type;
tmpil2->r.reg=REG_RAX;
tmpil2->r.disp=0;
tmpi->arg2.type=MDF_REG+tmpi->arg2.type.raw_type;
tmpi->arg2.reg=REG_RAX;
tmpi->arg2.disp=0;
tmpil2->res.type=MDF_REG+tmpil2->res.type.raw_type;
tmpil2->res.reg=REG_RAX;
tmpil2->res.disp=0;
}
}
} else if (tmpi->a1.type&MDF_STK && tmpil2->r.type&MDF_STK &&
} else if (tmpi->arg1.type&MDF_STK && tmpil2->res.type&MDF_STK &&
!(tmpil2->ic_flags&ICF_PUSH_RES)) {
tmpi->a1.type=MDF_REG+tmpi->a1.type.raw_type;
tmpi->a1.disp=0;
tmpil2->r.type=MDF_REG+tmpil2->r.type.raw_type;
tmpil2->r.disp=0;
tmpi->arg1.type=MDF_REG+tmpi->arg1.type.raw_type;
tmpi->arg1.disp=0;
tmpil2->res.type=MDF_REG+tmpil2->res.type.raw_type;
tmpil2->res.disp=0;
if (intermediate_code_table[tmpi->ic_code].arg_cnt==IS_2_ARG) {
tmpi->a1.reg=REG_R8;
tmpil2->r.reg=REG_R8;
tmpi->arg1.reg=REG_R8;
tmpil2->res.reg=REG_R8;
} else {
tmpi->a1.reg=REG_RAX;
tmpil2->r.reg=REG_RAX;
tmpi->arg1.reg=REG_RAX;
tmpil2->res.reg=REG_RAX;
}
}
if (tmpi->ic_flags & ICF_PUSH_RES)
tmpi->r.type==MDF_STK+tmpi->r.type.raw_type;
tmpi->res.type==MDF_STK+tmpi->res.type.raw_type;
if (old_tmpil2!=tmpil2) {
if (tmpil2->ic_code>IC_NOP2)
OptPass6Lag(cc,ps,tmpil2,&stk_ptr,reg_stk_size,&clobbered_reg_mask);
+341 -341
View File
File diff suppressed because it is too large. Load diff
+12 -11
View File
@@ -466,17 +466,17 @@ I64 PrsFunCall(CCmpCtrl *cc,CPrsStk *ps,Bool indirect,CHashFun *tmpf)
throw('Compiler');
else {
COCPush(cc);
cc->pass=0; OptPass012(cc);
cc->pass=0; OptPass012(cc);
cc->pass=1; tmpi=OptPass012(cc);
COCPop(cc);
last_class=OptClassFwd(tmpi->ic_class);
tmpc2=OptClassFwd(tmpm->member_class);
if (tmpc2->raw_type==RT_F64 && !tmpm->dim.next &&
last_class->raw_type!=RT_F64)
tmpi->ic_flags|=ICF_R_TO_F64;
tmpi->ic_flags|=ICF_RES_TO_F64;
else
if (tmpc2->raw_type!=RT_F64 && last_class->raw_type==RT_F64)
tmpi->ic_flags|=ICF_R_TO_INT;
tmpi->ic_flags|=ICF_RES_TO_INT;
}
}
COCPush(cc);
@@ -703,12 +703,13 @@ I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
if (cc->flags & CCF_ASM_EXPRESSIONS) {
cc->abs_cnts.abs_addres++;
if (cc->flags&CCF_AOT_COMPILE)
ICAdd(cc,IC_ABS_ADDR,cc->aotc->ip,cmp.internal_types[RT_PTR]);
ICAdd(cc,IC_ABS_ADDR,cc->aotc->rip,cmp.internal_types[RT_PTR]);
else
ICAdd(cc,IC_IMM_I64,cc->aotc->ip,cmp.internal_types[RT_PTR]);
ICAdd(cc,IC_IMM_I64,cc->aotc->rip,cmp.internal_types[RT_PTR]);
} else {
if (cc->flags&CCF_CLASS_IP)
ICAdd(cc,IC_IMM_I64,cc->class_ip,cmp.internal_types[RT_I64]);
if (cc->flags&CCF_CLASS_DOL_OFFSET)
ICAdd(cc,IC_IMM_I64,cc->class_dol_offset,
cmp.internal_types[RT_I64]);
else
ICAdd(cc,IC_RIP,0,cmp.internal_types[RT_PTR]);
}
@@ -772,7 +773,7 @@ I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
// if (tmpg->flags&GVF_DATA_HEAP) //TODO
// ICAdd(cc,IC_HEAP_GLBL,tmpm->static_data,tmpc);
// else
ICAdd(cc,IC_ABS_ADDR,tmpm->static_data_ip,tmpc);
ICAdd(cc,IC_ABS_ADDR,tmpm->static_data_rip,tmpc);
} else
ICAdd(cc,IC_IMM_I64,tmpm->static_data,tmpc);
} else {
@@ -878,7 +879,7 @@ pu_export_sys_sym:
if (tmpg->flags&GVF_DATA_HEAP)
ICAdd(cc,IC_HEAP_GLBL,tmpg->heap_glbl,tmpc);
else
ICAdd(cc,IC_ABS_ADDR,tmpg->data_addr_ip,tmpc);
ICAdd(cc,IC_ABS_ADDR,tmpg->data_addr_rip,tmpc);
}
}
} else {
@@ -1070,7 +1071,7 @@ I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
LexExcept(cc,"Missing ']' at ");
Lex(cc); //skip ]
tmpi1=cc->coc.coc_head.last;
tmpi1->ic_flags|=ICF_R_TO_INT;
tmpi1->ic_flags|=ICF_RES_TO_INT;
ICAdd(cc,IC_MUL,0,tmpc);
ICAdd(cc,IC_ADD,0,tmpc);
cc->flags|=CCF_RAX;
@@ -1086,7 +1087,7 @@ I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
LexExcept(cc,"Missing ']' at ");
Lex(cc); //skip ]
tmpi1=cc->coc.coc_head.last;
tmpi1->ic_flags|=ICF_R_TO_INT;
tmpi1->ic_flags|=ICF_RES_TO_INT;
ICAdd(cc,IC_MUL,0,tmpc);
ICAdd(cc,IC_ADD,0,tmpc);
cc->flags&=~(CCF_RAX|CCF_ARRAY);
+15 -23
View File
@@ -99,7 +99,7 @@ CHashFun *PrsFunJoin(CCmpCtrl *cc,CHashClass *tmp_return,
tmpf->clobbered_reg_mask=REGG_CLOBBERED+REGG_STK_TMP;
tmpf->str=name;
if (cc->flags&CCF_AOT_COMPILE)
tmpf->exe_addr=aotc->ip;
tmpf->exe_addr=aotc->rip;
else
tmpf->exe_addr=&UndefinedExtern;
LBts(&tmpf->flags,Cf_EXTERN);
@@ -169,7 +169,7 @@ U0 PrsFun(CCmpCtrl *cc,CHashClass *tmp_return,U8 *name,I64 fsp_flags)
ICAdd(cc,IC_LEAVE,0,cc->htc.fun->return_class);
cc->htc.fun->size&=~7;
if (cc->flags&CCF_AOT_COMPILE) {
cc->htc.fun->exe_addr=cc->aotc->ip;
cc->htc.fun->exe_addr=cc->aotc->rip;
cc->htc.fun->type|=HTF_EXPORT|HTF_RESOLVE;
r=COCCompile(cc,&size,&cc->htc.fun->dbg_info,NULL);
if (r) {
@@ -300,7 +300,7 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tmpc,
case PRS0__EXTERN:
if (cc->flags&CCF_AOT_COMPILE) {
tmpg=CAlloc(sizeof(CHashGlblVar));
tmpg->data_addr_ip=val;
tmpg->data_addr_rip=val;
tmpg->type=HTT_GLBL_VAR | HTF_EXPORT;
} else {
tmpg=CAlloc(sizeof(CHashGlblVar),Fs->code_heap);
@@ -351,24 +351,20 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tmpc,
if (cc->token=='=')
tmpg->data_addr=CAlloc(j);
if (tmpc->size>=8) //align
while (aotc->ip&7)
while (aotc->rip&7)
AOTStoreCodeU8(cc,0);
else if (tmpc->size==4)
while (aotc->ip&3)
while (aotc->rip&3)
AOTStoreCodeU8(cc,0);
else if (tmpc->size==2)
while (aotc->ip&1)
while (aotc->rip&1)
AOTStoreCodeU8(cc,0);
tmpg->data_addr_ip=aotc->ip;
tmpg->data_addr_rip=aotc->rip;
tmpg->type=HTT_GLBL_VAR | HTF_EXPORT;
if (tmpex && tmpex->type & HTT_GLBL_VAR)
has_alias=TRUE;
if (sys_var_init_flag)
for (k=0;k<j;k++)
AOTStoreCodeU8(cc,sys_var_init_val);
else
for (k=0;k<j;k++)
AOTStoreCodeU8(cc,0);
for (k=0;k<j;k++)
AOTStoreCodeU8(cc,0); //Init AOT glbl to zero.
}
} else {
if (Bt(&cc->opts,OPTf_GLBLS_ON_DATA_HEAP)) {
@@ -423,14 +419,10 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tmpc,
tmpg->size=tmpg->dim.total_cnt*tmpc->size;
if (tmphg)
tmphg->size=tmpg->size;
if (cc->flags&CCF_AOT_COMPILE) {
if (sys_var_init_flag)
for (k=0;k<tmpg->size;k++)
AOTStoreCodeU8(cc,sys_var_init_val);
else
for (k=0;k<tmpg->size;k++)
AOTStoreCodeU8(cc,0);
} else
if (cc->flags&CCF_AOT_COMPILE)
for (k=0;k<tmpg->size;k++)
AOTStoreCodeU8(cc,0);
else
if (sys_var_init_flag)
MemSet(tmpg->data_addr,sys_var_init_val,k);
LexPopRestore(cc);
@@ -440,7 +432,7 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tmpc,
PrsGlblInit(cc,tmpg,2);
if (cc->flags&CCF_AOT_COMPILE)
for (k=0;k<tmpg->size;k++)
AOTStoreCodeU8At(cc,tmpg->data_addr_ip+k,tmpg->data_addr[k]);
AOTStoreCodeU8At(cc,tmpg->data_addr_rip+k,tmpg->data_addr[k]);
LexPopNoRestore(cc);
}
if (has_alias) {
@@ -450,7 +442,7 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tmpc,
}
tmpex(CHashGlblVar *)->flags|=GVF_ALIAS;
tmpex(CHashGlblVar *)->data_addr=tmpg->data_addr;
tmpex(CHashGlblVar *)->data_addr_ip=tmpg->data_addr_ip;
tmpex(CHashGlblVar *)->data_addr_rip=tmpg->data_addr_rip;
}
if (cc->token==',')
Lex(cc);
+31 -41
View File
@@ -1,5 +1,5 @@
U0 PrsVarInit(CCmpCtrl *cc,U8 **_dst,CHashClass *tmpc,CArrayDim *tmpad,
U8 *data_addr_ip,U8 **_base,Bool data_heap,I64 pass)
U8 *data_addr_rip,U8 **_base,Bool data_heap,I64 pass)
{
U8 *dst=*_dst,*machine_code;
I64 i,j,r,old_flags,type,size;
@@ -19,7 +19,7 @@ U0 PrsVarInit(CCmpCtrl *cc,U8 **_dst,CHashClass *tmpc,CArrayDim *tmpad,
Lex(cc);
while (tmpm) {
PrsVarInit2(cc,&dst,tmpm->member_class,&tmpm->dim,
data_addr_ip,_base,data_heap,pass);
data_addr_rip,_base,data_heap,pass);
if (cc->token==',')
Lex(cc);
tmpm=tmpm->next;
@@ -43,8 +43,8 @@ U0 PrsVarInit(CCmpCtrl *cc,U8 **_dst,CHashClass *tmpc,CArrayDim *tmpad,
tmpa->next=aotc->abss;
tmpa->type=AAT_ADD_U64;
aotc->abss=tmpa;
tmpa->ip=data_addr_ip+dst-*_base;
*dst(I64 *)=aotc->ip;
tmpa->rip=data_addr_rip+dst-*_base;
*dst(I64 *)=aotc->rip;
for (j=0;j<i;j++)
AOTStoreCodeU8(cc,machine_code[j]);
}
@@ -65,7 +65,7 @@ U0 PrsVarInit(CCmpCtrl *cc,U8 **_dst,CHashClass *tmpc,CArrayDim *tmpad,
Lex(cc);
COCPush(cc);
COCInit(cc);
ICAdd(cc,IC_ABS_ADDR,data_addr_ip,tmpc+1);
ICAdd(cc,IC_ABS_ADDR,data_addr_rip,tmpc+1);
ICAdd(cc,IC_IMM_I64,dst-*_base,tmpc+1);
ICAdd(cc,IC_ADD,0,tmpc+1);
if (!PrsExpression(cc,NULL,TRUE))
@@ -81,7 +81,7 @@ U0 PrsVarInit(CCmpCtrl *cc,U8 **_dst,CHashClass *tmpc,CArrayDim *tmpad,
if (machine_code=COCCompile(cc,&size,NULL,NULL)) {
tmpie=CAlloc(sizeof(CAOTImportExport));
tmpie->type=IET_MAIN;
tmpie->ip=cc->aotc->ip;
tmpie->rip=cc->aotc->rip;
QueIns(tmpie,cc->aot->last_ie);
for (i=0;i<size;i++)
AOTStoreCodeU8(cc,machine_code[i]);
@@ -121,7 +121,7 @@ class CVI2
};
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)
{
I64 i,j,cnt;
U8 *st,*_b;
@@ -162,7 +162,7 @@ U0 PrsVarInit2(CCmpCtrl *cc,U8 **_dst,CHashClass *tmpc,
while (cc->token!='}') {
tmpvi=MAlloc(offset(CVI2.base)+tmpad1->total_cnt*tmpc->size);
_b=&tmpvi->base;
PrsVarInit2(cc,&_b,tmpc,tmpad1,data_addr_ip,_base,data_heap,pass);
PrsVarInit2(cc,&_b,tmpc,tmpad1,data_addr_rip,_base,data_heap,pass);
QueIns(tmpvi,head.last);
if (cc->token==',')
Lex(cc);
@@ -189,7 +189,7 @@ U0 PrsVarInit2(CCmpCtrl *cc,U8 **_dst,CHashClass *tmpc,
*_dst=_b;
} else {
for (i=0;i<tmpad1->cnt;i++) {
PrsVarInit2(cc,_dst,tmpc,tmpad1,data_addr_ip,_base,data_heap,pass);
PrsVarInit2(cc,_dst,tmpc,tmpad1,data_addr_rip,_base,data_heap,pass);
if (tmpad1->cnt>1 && cc->token==',')
Lex(cc);
}
@@ -198,7 +198,7 @@ U0 PrsVarInit2(CCmpCtrl *cc,U8 **_dst,CHashClass *tmpc,
}
}
} else {
PrsVarInit(cc,_dst,tmpc,tmpad1,data_addr_ip,_base,data_heap,pass);
PrsVarInit(cc,_dst,tmpc,tmpad1,data_addr_rip,_base,data_heap,pass);
LexPush(cc);
}
}
@@ -207,7 +207,7 @@ U0 PrsGlblInit(CCmpCtrl *cc,CHashGlblVar *tmpg,I64 pass)
{
U8 *dst=tmpg->data_addr;
PrsVarInit2(cc,&dst,tmpg->var_class,&tmpg->dim,
tmpg->data_addr_ip,&tmpg->data_addr,
tmpg->data_addr_rip,&tmpg->data_addr,
Bt(&cc->opts,OPTf_GLBLS_ON_DATA_HEAP)||
Bt(&cc->flags,CCf_AOT_COMPILE),pass);
}
@@ -223,7 +223,7 @@ U0 PrsStaticInit(CCmpCtrl *cc,CMemberLst *tmpm,I64 pass)
COCPush(cc);
COCInit(cc);
}
PrsVarInit2(cc,&dst,tmpc,&tmpm->dim,tmpm->static_data_ip,
PrsVarInit2(cc,&dst,tmpc,&tmpm->dim,tmpm->static_data_rip,
&tmpm->static_data,Bt(&cc->flags,CCf_AOT_COMPILE),pass);
if (cc->flags&CCF_AOT_COMPILE && pass==2) {
if (cc->coc.coc_head.next!=&cc->coc.coc_head) {
@@ -232,7 +232,7 @@ U0 PrsStaticInit(CCmpCtrl *cc,CMemberLst *tmpm,I64 pass)
if (pass==2) {
tmpie=CAlloc(sizeof(CAOTImportExport));
tmpie->type=IET_MAIN;
tmpie->ip=cc->aotc->ip;
tmpie->rip=cc->aotc->rip;
QueIns(tmpie,cc->aot->last_ie);
for (i=0;i<size;i++)
AOTStoreCodeU8(cc,machine_code[i]);
@@ -424,28 +424,28 @@ U0 PrsVarLst(CCmpCtrl *cc,CHashClass *tmpc,I64 mode,I64 union_base=0)
Bool undef_array_size,first;
cc->flags|=CCF_DONT_MAKE_RES;
if (mode.u8[1]==PRS1B_CLASS)
cc->flags|=CCF_CLASS_IP;
cc->flags|=CCF_CLASS_DOL_OFFSET;
if ((mode.u8[1]!=PRS1B_LOCAL_VAR && mode.u8[1]!=PRS1B_STATIC_LOCAL_VAR ||
mode&PRSF_UNION) && (cc->token=='(' || cc->token=='{'))
Lex(cc);
while (TRUE) {
if (mode&PRSF_UNION)
cc->class_dol_offset=union_base;
else
cc->class_dol_offset=tmpc->size;
while (cc->token==';')
Lex(cc);
if (mode&PRSF_UNION)
cc->class_ip=union_base;
else
cc->class_ip=tmpc->size;
while (cc->token=='$$') {
if (Lex(cc)!='=') //skip $$
LexExcept(cc,"Expecting '=' at ");
Lex(cc); //skip =
cc->class_ip=LexExpression(cc);
if (-cc->class_ip>tmpc->neg_offset)
tmpc->neg_offset=-cc->class_ip;
cc->class_dol_offset=LexExpression(cc);
if (-cc->class_dol_offset>tmpc->neg_offset)
tmpc->neg_offset=-cc->class_dol_offset;
if (mode&PRSF_UNION)
union_base=cc->class_ip;
union_base=cc->class_dol_offset;
else
tmpc->size=cc->class_ip;
tmpc->size=cc->class_dol_offset;
if (cc->token!=';')
LexExcept(cc,"Missing ';' at");
Lex(cc); //skip ;
@@ -553,15 +553,10 @@ pvl_restart3:
else
tmpm->static_data=MAlloc(k,Fs->code_heap);
if (cc->flags&CCF_AOT_COMPILE) {
tmpm->static_data_ip=cc->aotc->ip;
tmpm->static_data_rip=cc->aotc->rip;
k>>=3;
if (sys_var_init_flag) {
k<<=3;
while (k--)
AOTStoreCodeU8(cc,sys_var_init_val);
} else
while (k--)
AOTStoreCodeU64(cc,0);
while (k--)
AOTStoreCodeU64(cc,0);
} else
if (sys_var_init_flag)
MemSet(tmpm->static_data,sys_var_init_val,k);
@@ -579,13 +574,8 @@ pvl_restart3:
k=(i+7)&~7;
if (cc->flags&CCF_AOT_COMPILE) {
k>>=3;
if (sys_var_init_flag) {
k<<=3;
while (k--)
AOTStoreCodeU8(cc,sys_var_init_val);
} else
while (k--)
AOTStoreCodeU64(cc,0);
while (k--)
AOTStoreCodeU64(cc,0);
} else
if (sys_var_init_flag)
MemSet(tmpm->static_data,sys_var_init_val,k);
@@ -597,7 +587,7 @@ pvl_restart3:
LexPopNoRestore(cc);
if (cc->flags&CCF_AOT_COMPILE)
for (k=0;k<i;k++)
AOTStoreCodeU8At(cc,tmpm->static_data_ip+k,
AOTStoreCodeU8At(cc,tmpm->static_data_rip+k,
tmpm->static_data[k]);
tmpm->use_cnt=0;
cc->flags|=CCF_DONT_MAKE_RES;
@@ -729,6 +719,6 @@ pvl_restart3:
}
}
pvl_done:
cc->flags=cc->flags&~(CCF_CLASS_IP|CCF_DONT_MAKE_RES)|
old_flags& (CCF_CLASS_IP|CCF_DONT_MAKE_RES);
cc->flags=cc->flags&~(CCF_CLASS_DOL_OFFSET|CCF_DONT_MAKE_RES)|
old_flags&(CCF_CLASS_DOL_OFFSET|CCF_DONT_MAKE_RES);
}
+174 -166
View File
@@ -63,9 +63,9 @@ U0 DumpUAsmTables()
}
*/
CInst *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
CInst *InstEntryFind(U8 *rip,I64 opsize,I64 seg_size)
{//Binary Search
I64 i,j,n,m,k,a1,a2,o1,o2,oc_cnt;
I64 i,j,n,m,k,arg1,arg2,o1,o2,oc_cnt;
CInst *tmpins,**table;
i=0;
if (seg_size==64) {
@@ -82,13 +82,13 @@ CInst *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
m=0;
n=0;
while (TRUE) { //ief_compare_start
a1=tmpins->arg1;
a2=tmpins->arg2;
arg1=tmpins->arg1;
arg2=tmpins->arg2;
oc_cnt=tmpins->opcode_cnt;
if (tmpins->flags&IEF_STI_LIKE)
oc_cnt--;
if (n<oc_cnt) {
o1=ip[n];
o1=rip[n];
if (n==tmpins->opcode_cnt-1 && tmpins->flags & IEF_PLUS_OPCODE)
o1&=-8;
o2=tmpins->opcode[n++];
@@ -97,9 +97,10 @@ CInst *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
} else
switch [tmpins->uasm_slash_val] {
case 0...7:
if (!(m=ip[n]>>3&7-tmpins->slash_val)) {
if ((Bt(&uasm.mem_arg_mask,a1) || Bt(&uasm.mem_arg_mask,a2)) &&
ip[n]&0xC0==0xC0) {
if (!(m=rip[n]>>3&7-tmpins->slash_val)) {
if ((Bt(&uasm.mem_arg_mask,arg1) ||
Bt(&uasm.mem_arg_mask,arg2)) &&
rip[n]&0xC0==0xC0) {
m=1;
goto ief_compare_done;
}
@@ -114,25 +115,28 @@ CInst *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
goto ief_compare_done;
}
}
if (opsize==64||a1==ARGT_M64||a2==ARGT_M64) {
if (!Bt(&uasm.ins64_arg_mask,a1)&&
!Bt(&uasm.ins64_arg_mask,a2)&&!(tmpins->flags&IEF_48_REX))
if (opsize==64||arg1==ARGT_M64||arg2==ARGT_M64) {
if (!Bt(&uasm.ins64_arg_mask,arg1)&&
!Bt(&uasm.ins64_arg_mask,arg2)&&
!(tmpins->flags&IEF_48_REX))
m=1;
} else {
if (Bt(&uasm.ins64_arg_mask,a1)||Bt(&uasm.ins64_arg_mask,a2) ||
if (Bt(&uasm.ins64_arg_mask,arg1)||
Bt(&uasm.ins64_arg_mask,arg2) ||
tmpins->flags&IEF_48_REX)
m=-1;
}
} else if ((Bt(&uasm.mem_arg_mask,a1)||Bt(&uasm.mem_arg_mask,a2)) &&
ip[n]&0xC0==0xC0)
} else if ((Bt(&uasm.mem_arg_mask,arg1)||
Bt(&uasm.mem_arg_mask,arg2)) &&
rip[n]&0xC0==0xC0)
m=1;
goto ief_compare_done;
case SV_I_REG:
m=ip[n]>>3-tmpins->opcode[tmpins->opcode_cnt-1]>>3;
m=rip[n]>>3-tmpins->opcode[tmpins->opcode_cnt-1]>>3;
goto ief_compare_done;
case SV_STI_LIKE:
if (!(m=ip[n]>>3-tmpins->opcode[tmpins->opcode_cnt-1]>>3))
m=ip[n]-tmpins->opcode[tmpins->opcode_cnt-1];
if (!(m=rip[n]>>3-tmpins->opcode[tmpins->opcode_cnt-1]>>3))
m=rip[n]-tmpins->opcode[tmpins->opcode_cnt-1];
goto ief_compare_done;
case SV_R_REG:
case SV_NONE:
@@ -148,18 +152,21 @@ CInst *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
goto ief_compare_done;
}
}
if (opsize==64 || a1==ARGT_M64 || a2==ARGT_M64) {
if (!Bt(&uasm.ins64_arg_mask,a1) &&!Bt(&uasm.ins64_arg_mask,a2) &&
!(tmpins->flags&IEF_48_REX)&& !(a2==ARGT_NONE &&
(ARGT_UIMM8<=a1<=ARGT_UIMM64 || ARGT_IMM8<=a1<=ARGT_IMM64)))
if (opsize==64 || arg1==ARGT_M64 || arg2==ARGT_M64) {
if (!Bt(&uasm.ins64_arg_mask,arg1) &&
!Bt(&uasm.ins64_arg_mask,arg2) &&
!(tmpins->flags&IEF_48_REX)&& !(arg2==ARGT_NONE &&
(ARGT_UIMM8<=arg1<=ARGT_UIMM64 ||
ARGT_IMM8<=arg1<=ARGT_IMM64)))
m=1;
else if (tmpins->arg2==ARGT_IMM64 || tmpins->arg2==ARGT_UIMM64) {
if (a2!=ARGT_IMM64&&a2!=ARGT_UIMM64)
if (arg2!=ARGT_IMM64&&arg2!=ARGT_UIMM64)
m=1;
} else if (a2==ARGT_IMM64||a2==ARGT_UIMM64)
} else if (arg2==ARGT_IMM64||arg2==ARGT_UIMM64)
m=-1;
} else {
if (Bt(&uasm.ins64_arg_mask,a1) || Bt(&uasm.ins64_arg_mask,a2) ||
if (Bt(&uasm.ins64_arg_mask,arg1) ||
Bt(&uasm.ins64_arg_mask,arg2) ||
tmpins->flags&IEF_48_REX)
m=-1;
}
@@ -235,19 +242,20 @@ U0 UAsmHashLoad()
QSortI64(uasm.table_64 ,uasm.table_64_entries ,&InstEntriesCompare);
}
U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
U0 Ui(U8 *buf,U8 **_rip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
{//Unassembles one inst
I64 i,disp,imm,opsize,opadd,
a1,a2,reloced_a1,reloced_a2,
a1_size=0,a2_size=0,reloced_a1_size,reloced_a2_size,
arg1,arg2,reloced_arg1,reloced_arg2,
arg1_size=0,arg2_size=0,reloced_arg1_size,reloced_arg2_size,
ModrM=-1,SIB=-1,scale,r1,r2,
Mod=-1,RM1=-1,RM2=-1,REX=-1,REX_r=0,REX_x=0,REX_b=0;
Bool cont;
CInst *tmpins,*tmpins2;
CHashOpcode *tmpo;
U8 *ip=*_ip,*ptr,*reloced_a1_st,*reloced_a2_st,
U8 *rip=*_rip,*ptr,*reloced_arg1_st,*reloced_arg2_st,
*bin_data_area1,*bin_data_area2,
line1[512],line2[512],buf2[512],a1_st[512],a2_st[512],seg_overrides[32];
line1[512],line2[512],buf2[512],arg1_st[512],
arg2_st[512],seg_overrides[32];
if (_jmp_dst) *_jmp_dst=-1;
if (seg_size==16) {
@@ -260,28 +268,28 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
opsize=32;
opadd=64;
}
*a1_st=0;
*a2_st=0;
if (!IsRaw && PutSrcLink(ip,1,line1))
*arg1_st=0;
*arg2_st=0;
if (!IsRaw && PutSrcLink(rip,1,line1))
CatPrint(line1,"\n");
else
*line1=0;
StrPrint(line1+StrLen(line1),"%24tp ",ip);
StrPrint(line1+StrLen(line1),"%24tp ",rip);
bin_data_area1=line1+StrLen(line1);
for (i=0;i<6;i++)
CatPrint(line1,"%02X",ip[i]);
CatPrint(line1,"%02X",rip[i]);
CatPrint(line1," ");
StrPrint(line2,"%24tp ",ip+6);
StrPrint(line2,"%24tp ",rip+6);
bin_data_area2=line2+StrLen(line2);
for (i=6;i<12;i++)
CatPrint(line2,"%02X",ip[i]);
CatPrint(line2,"%02X",rip[i]);
*seg_overrides=0;
cont=TRUE;
while (TRUE) {
switch (*ip) {
switch (*rip) {
case 0x2E: if (StrLen(seg_overrides)<24)
CatPrint(seg_overrides,"CS:"); break;
case 0x36: if (StrLen(seg_overrides)<24)
@@ -308,7 +316,7 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
break;
case 0x40...0x4F:
if (seg_size==64) {
REX=*ip;
REX=*rip;
if (REX>=0x48)
opsize=64;
REX_b=Bt(&REX,0)<<3;
@@ -320,148 +328,148 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
cont=FALSE;
}
if (cont)
ip++;
rip++;
else
break;
}
tmpins=InstEntryFind(ip,opsize,seg_size);
tmpins=InstEntryFind(rip,opsize,seg_size);
if (opsize==32 && seg_size==64) {
tmpins2=InstEntryFind(ip,64,seg_size);
tmpins2=InstEntryFind(rip,64,seg_size);
if (tmpins2!=tmpins && tmpins2->flags&IEF_REX_ONLY_R8_R15 ||
tmpins2->flags&IEF_REX_XOR_LIKE&& ip[1]>>3&7==ip[1]&7)
tmpins2->flags&IEF_REX_XOR_LIKE&& rip[1]>>3&7==rip[1]&7)
tmpins=tmpins2;
}
ip+=tmpins->opcode_cnt;
rip+=tmpins->opcode_cnt;
tmpo=tmpins(U8 *)-tmpins->ins_entry_num*sizeof(CInst)
-offset(CHashOpcode.ins);
if (just_ins)
*line1=0;
CatPrint(line1,tmpo->str);
a1=tmpins->arg1;
a2=tmpins->arg2;
arg1=tmpins->arg1;
arg2=tmpins->arg2;
if (a1_size=tmpins->size1) {
if (Bt(&uasm.signed_arg_mask,a1))
CatPrint(a1_st,"I%d ",a1_size);
if (arg1_size=tmpins->size1) {
if (Bt(&uasm.signed_arg_mask,arg1))
CatPrint(arg1_st,"I%d ",arg1_size);
else
CatPrint(a1_st,"U%d ",a1_size);
CatPrint(arg1_st,"U%d ",arg1_size);
}
if (a2_size=tmpins->size2) {
if (Bt(&uasm.signed_arg_mask,a2))
CatPrint(a2_st,"I%d ",a2_size);
if (arg2_size=tmpins->size2) {
if (Bt(&uasm.signed_arg_mask,arg2))
CatPrint(arg2_st,"I%d ",arg2_size);
else
CatPrint(a2_st,"U%d ",a2_size);
CatPrint(arg2_st,"U%d ",arg2_size);
}
if (tmpins->flags & IEF_PLUS_OPCODE) {
ip--;
RM1=*ip++ - tmpins->opcode[tmpins->opcode_cnt-1]+REX_b;
rip--;
RM1=*rip++ - tmpins->opcode[tmpins->opcode_cnt-1]+REX_b;
ptr=NULL;
if (ARGT_R8<=a1<=ARGT_R64) {
if (a1_size==8) {
if (ARGT_R8<=arg1<=ARGT_R64) {
if (arg1_size==8) {
if (REX!=-1)
ptr="ST_U8_REX_REGS";
else
ptr="ST_U8_REGS";
} else if (a1_size==16)
} else if (arg1_size==16)
ptr="ST_U16_REGS";
else if (a1_size==32)
else if (arg1_size==32)
ptr="ST_U32_REGS";
else if (a1_size==64)
else if (arg1_size==64)
ptr="ST_U64_REGS";
if (ptr)
CatPrint(a1_st,"%Z",RM1,ptr);
CatPrint(arg1_st,"%Z",RM1,ptr);
} else {
if (a2_size==8) {
if (arg2_size==8) {
if (REX!=-1)
ptr="ST_U8_REX_REGS";
else
ptr="ST_U8_REGS";
} else if (a2_size==16)
} else if (arg2_size==16)
ptr="ST_U16_REGS";
else if (a2_size==32)
else if (arg2_size==32)
ptr="ST_U32_REGS";
else if (a2_size==64)
else if (arg2_size==64)
ptr="ST_U64_REGS";
if (ptr)
CatPrint(a2_st,"%Z",RM1,ptr);
CatPrint(arg2_st,"%Z",RM1,ptr);
}
}
if (ARGT_RM8<=a1<=ARGT_RM64 || ARGT_M8<=a1<=ARGT_M64 ||
ARGT_RM8<=a2<=ARGT_RM64 || ARGT_M8<=a2<=ARGT_M64) {
if (ARGT_RM8<=a2<=ARGT_RM64 || ARGT_M8<=a2<=ARGT_M64) {
reloced_a1=a2;
reloced_a2=a1;
reloced_a1_size=a2_size;
reloced_a2_size=a1_size;
reloced_a1_st=a2_st;
reloced_a2_st=a1_st;
if (ARGT_RM8<=arg1<=ARGT_RM64 || ARGT_M8<=arg1<=ARGT_M64 ||
ARGT_RM8<=arg2<=ARGT_RM64 || ARGT_M8<=arg2<=ARGT_M64) {
if (ARGT_RM8<=arg2<=ARGT_RM64 || ARGT_M8<=arg2<=ARGT_M64) {
reloced_arg1=arg2;
reloced_arg2=arg1;
reloced_arg1_size=arg2_size;
reloced_arg2_size=arg1_size;
reloced_arg1_st=arg2_st;
reloced_arg2_st=arg1_st;
} else {
reloced_a1=a1;
reloced_a2=a2;
reloced_a1_size=a1_size;
reloced_a2_size=a2_size;
reloced_a1_st=a1_st;
reloced_a2_st=a2_st;
reloced_arg1=arg1;
reloced_arg2=arg2;
reloced_arg1_size=arg1_size;
reloced_arg2_size=arg2_size;
reloced_arg1_st=arg1_st;
reloced_arg2_st=arg2_st;
}
CatPrint(reloced_a1_st,seg_overrides);
ModrM=*ip++;
CatPrint(reloced_arg1_st,seg_overrides);
ModrM=*rip++;
Mod=ModrM>>6 & 3;
RM1=ModrM & 7+REX_b;
RM2=ModrM>>3 & 7+REX_r;
if (Mod<3 && RM1&7==4)
SIB=*ip++;
SIB=*rip++;
if (Mod==1) {
disp=*ip(U8 *)++;
CatPrint(reloced_a1_st,"%02X",disp);
disp=*rip(U8 *)++;
CatPrint(reloced_arg1_st,"%02X",disp);
} else if (Mod==2) {
disp=*ip(U32 *)++;
CatPrint(reloced_a1_st,"%08X",disp);
disp=*rip(U32 *)++;
CatPrint(reloced_arg1_st,"%08X",disp);
}
if (tmpins->slash_val<8)
RM2=-1;
else {
ptr=NULL;
if (reloced_a2==ARGT_SREG) {
if (reloced_arg2==ARGT_SREG) {
if (RM2<=5)
ptr="ST_SEG_REGS";
} else if (!(ARGT_IMM8<=reloced_a2<=ARGT_IMM64) &&
!(ARGT_UIMM8<=reloced_a2<=ARGT_UIMM64)) {
if (reloced_a2_size==8) {
} else if (!(ARGT_IMM8<=reloced_arg2<=ARGT_IMM64) &&
!(ARGT_UIMM8<=reloced_arg2<=ARGT_UIMM64)) {
if (reloced_arg2_size==8) {
if (REX!=-1)
ptr="ST_U8_REX_REGS";
else
ptr="ST_U8_REGS";
} else if (reloced_a2_size==16)
} else if (reloced_arg2_size==16)
ptr="ST_U16_REGS";
else if (reloced_a2_size==32)
else if (reloced_arg2_size==32)
ptr="ST_U32_REGS";
else if (reloced_a2_size==64)
else if (reloced_arg2_size==64)
ptr="ST_U64_REGS";
}
if (ptr)
CatPrint(reloced_a2_st,"%Z",RM2,ptr);
CatPrint(reloced_arg2_st,"%Z",RM2,ptr);
}
if (RM1&7==5 && !Mod) {
disp=*ip(I32 *)++;
disp=*rip(I32 *)++;
if (seg_size==64) {
disp+=ip;
if (reloced_a2==ARGT_IMM8 || reloced_a2==ARGT_UIMM8)
disp+=rip;
if (reloced_arg2==ARGT_IMM8 || reloced_arg2==ARGT_UIMM8)
disp++;
else if (reloced_a2==ARGT_IMM16 || reloced_a2==ARGT_UIMM16)
else if (reloced_arg2==ARGT_IMM16 || reloced_arg2==ARGT_UIMM16)
disp+=2;
else if (reloced_a2==ARGT_IMM32 || reloced_a2==ARGT_UIMM32)
else if (reloced_arg2==ARGT_IMM32 || reloced_arg2==ARGT_UIMM32)
disp+=4;
else if (reloced_a2==ARGT_IMM64 || reloced_a2==ARGT_UIMM64)
else if (reloced_arg2==ARGT_IMM64 || reloced_arg2==ARGT_UIMM64)
disp+=8;
}
CatPrint(reloced_a1_st,"[%X]",disp);
CatPrint(reloced_arg1_st,"[%X]",disp);
RM1=-1;
} else {
if (Mod<3) {
@@ -483,12 +491,12 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
else
ptr="ST_U32_REGS";
if (r1==REG_RBP && !Mod) {
disp=*ip(U32 *)++;
CatPrint(reloced_a1_st,"%08X[%Z*%d]",disp,r2,ptr,scale);
disp=*rip(U32 *)++;
CatPrint(reloced_arg1_st,"%08X[%Z*%d]",disp,r2,ptr,scale);
} else if (r2==4)
CatPrint(reloced_a1_st,"[%Z]",r1,ptr);
CatPrint(reloced_arg1_st,"[%Z]",r1,ptr);
else
CatPrint(reloced_a1_st,"[%Z+%Z*%d]",r1,ptr,r2,ptr,scale);
CatPrint(reloced_arg1_st,"[%Z+%Z*%d]",r1,ptr,r2,ptr,scale);
} else {
if (opadd==16)
ptr="ST_U16_REGS";
@@ -496,153 +504,153 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
ptr="ST_U32_REGS";
else
ptr="ST_U64_REGS";
CatPrint(reloced_a1_st,"[%Z]",RM1,ptr);
CatPrint(reloced_arg1_st,"[%Z]",RM1,ptr);
}
} else {
ptr=NULL;
if (reloced_a1_size==8) {
if (reloced_arg1_size==8) {
if (REX!=-1)
ptr="ST_U8_REX_REGS";
else
ptr="ST_U8_REGS";
} else if (reloced_a1_size==16)
} else if (reloced_arg1_size==16)
ptr="ST_U16_REGS";
else if (reloced_a1_size==32)
else if (reloced_arg1_size==32)
ptr="ST_U32_REGS";
else if (reloced_a1_size==64)
else if (reloced_arg1_size==64)
ptr="ST_U64_REGS";
if (ptr)
CatPrint(reloced_a1_st,DefineSub(RM1,ptr));
CatPrint(reloced_arg1_st,DefineSub(RM1,ptr));
}
}
}
switch (a1) {
switch (arg1) {
case ARGT_IMM8:
case ARGT_UIMM8:
imm=*ip(U8 *)++;
CatPrint(a1_st,"%02X",imm);
imm=*rip(U8 *)++;
CatPrint(arg1_st,"%02X",imm);
if (tmpins->opcode[0]==0xCD && (ptr=DefineSub(imm,"ST_INT_NAMES")))
CatPrint(a1_st," %s",ptr);
CatPrint(arg1_st," %s",ptr);
break;
case ARGT_IMM16:
case ARGT_UIMM16:
CatPrint(a1_st,"%04X",*ip(U16 *)++);
CatPrint(arg1_st,"%04X",*rip(U16 *)++);
break;
case ARGT_IMM32:
case ARGT_UIMM32:
CatPrint(a1_st,"%08X",*ip(U32 *)++);
CatPrint(arg1_st,"%08X",*rip(U32 *)++);
break;
case ARGT_IMM64:
case ARGT_UIMM64:
CatPrint(a1_st,"%016X",*ip(I64 *)++);
CatPrint(arg1_st,"%016X",*rip(I64 *)++);
break;
start:
case ARGT_REL8:
disp=*ip(I8 *)++;
disp=*rip(I8 *)++;
break;
case ARGT_REL16:
disp=*ip(I16 *)++;
disp=*rip(I16 *)++;
break;
case ARGT_REL32:
disp=*ip(I32 *)++;
disp=*rip(I32 *)++;
break;
end:
disp+=ip;
disp+=rip;
if (IsDbgMode)
CatPrint(a1_st,"%p ",disp);
CatPrint(arg1_st,"%p ",disp);
else if (PutSrcLink(disp,512,buf2))
CatPrint(a1_st,"%s ",buf2);
CatPrint(arg1_st,"%s ",buf2);
else
CatPrint(a1_st,"%P ",disp);
CatPrint(arg1_st,"%P ",disp);
if (_jmp_dst) *_jmp_dst=disp;
break;
case ARGT_MOFFS8...ARGT_MOFFS64:
CatPrint(a1_st,seg_overrides);
if (a1_size==8)
disp=*ip(U8 *)++;
CatPrint(arg1_st,seg_overrides);
if (arg1_size==8)
disp=*rip(U8 *)++;
else if (opadd==16)
disp=*ip(U16 *)++;
disp=*rip(U16 *)++;
else
disp=*ip(U32 *)++;
CatPrint(a1_st,"[%X]",disp);
disp=*rip(U32 *)++;
CatPrint(arg1_st,"[%X]",disp);
break;
case ARGT_AL ... ARGT_DX:
case ARGT_SS ... ARGT_ST0:
CatPrint(a1_st,"%z",a1-ARGT_AL,
CatPrint(arg1_st,"%z",arg1-ARGT_AL,
"AL\0AX\0EAX\0RAX\0CL\0DX\0 \0 \0SS\0DS\0ES\0FS\0GS\0CS\0ST0\0");
break;
case ARGT_STI:
ip--;
CatPrint(a1_st,"%Z",*ip++ - tmpins->opcode[tmpins->opcode_cnt-1],
rip--;
CatPrint(arg1_st,"%Z",*rip++ - tmpins->opcode[tmpins->opcode_cnt-1],
"ST_FSTK_REGS");
break;
}
switch (a2) {
switch (arg2) {
case ARGT_IMM8:
case ARGT_UIMM8:
CatPrint(a2_st,"%02X",*ip(U8 *)++);
CatPrint(arg2_st,"%02X",*rip(U8 *)++);
break;
case ARGT_IMM16:
case ARGT_UIMM16:
CatPrint(a2_st,"%04X",*ip(U16 *)++);
CatPrint(arg2_st,"%04X",*rip(U16 *)++);
break;
case ARGT_IMM32:
case ARGT_UIMM32:
CatPrint(a2_st,"%08X",*ip(U32 *)++);
CatPrint(arg2_st,"%08X",*rip(U32 *)++);
break;
case ARGT_IMM64:
case ARGT_UIMM64:
CatPrint(a2_st,"%016X",*ip(I64 *)++);
CatPrint(arg2_st,"%016X",*rip(I64 *)++);
break;
case ARGT_MOFFS8...ARGT_MOFFS64:
CatPrint(a2_st,seg_overrides);
if (a2_size==8)
disp=*ip(U8 *)++;
CatPrint(arg2_st,seg_overrides);
if (arg2_size==8)
disp=*rip(U8 *)++;
else if (opadd==16)
disp=*ip(U16 *)++;
disp=*rip(U16 *)++;
else
disp=*ip(U32 *)++;
CatPrint(a2_st,"[%X]",disp);
disp=*rip(U32 *)++;
CatPrint(arg2_st,"[%X]",disp);
break;
case ARGT_AL ... ARGT_DX:
case ARGT_SS ... ARGT_ST0:
CatPrint(a2_st,"%z",a2-ARGT_AL,
CatPrint(arg2_st,"%z",arg2-ARGT_AL,
"AL\0AX\0EAX\0RAX\0CL\0DX\0 \0 \0SS\0DS\0ES\0FS\0GS\0CS\0ST0\0");
break;
case ARGT_STI:
ip--;
CatPrint(a2_st,"%Z",*ip++ -tmpins->opcode[tmpins->opcode_cnt-1],
rip--;
CatPrint(arg2_st,"%Z",*rip++ -tmpins->opcode[tmpins->opcode_cnt-1],
"ST_FSTK_REGS");
break;
}
if (tmpins->flags&IEF_ENDING_ZERO)
ip++;
rip++;
if (*a1_st)
CatPrint(line1,"\t%s",a1_st);
if (*a2_st)
CatPrint(line1,",%s",a2_st);
if (*arg1_st)
CatPrint(line1,"\t%s",arg1_st);
if (*arg2_st)
CatPrint(line1,",%s",arg2_st);
CatPrint(line1,"\n");
CatPrint(line2,"\n");
if (!just_ins) {
for (i=ip-(*_ip)(I64);i<6;i++) {
for (i=rip-(*_rip)(I64);i<6;i++) {
bin_data_area1[i<<1]=CH_SPACE;
bin_data_area1[i<<1+1]=CH_SPACE;
}
for (i=ip-(*_ip)(I64);i<12;i++) {
for (i=rip-(*_rip)(I64);i<12;i++) {
bin_data_area2[(i-6)<<1]=CH_SPACE;
bin_data_area2[(i-6)<<1+1]=CH_SPACE;
}
}
StrCpy(buf,line1);
if (!just_ins && ip-(*_ip)(I64)>6)
if (!just_ins && rip-(*_rip)(I64)>6)
CatPrint(buf,line2);
*_ip=ip;
*_rip=rip;
}
U8 *U(U8 *ip,I64 cnt=20,I64 seg_size=64)
U8 *U(U8 *rip,I64 cnt=20,I64 seg_size=64)
{//Unassembles a num of insts.
I64 i;
U8 buf[1024];
@@ -650,22 +658,22 @@ U8 *U(U8 *ip,I64 cnt=20,I64 seg_size=64)
PrintWarn("16-bit unassembly is not well supported.\n");
"$$HL,1$$";
for (i=0;i<cnt;i++) {
Ui(buf,&ip,seg_size);
Ui(buf,&rip,seg_size);
"%s",buf;
}
"$$HL,0$$";
return ip;
return rip;
}
I64 Un(U8 *ip,I64 cnt=0x80,I64 seg_size=64)
I64 Un(U8 *rip,I64 cnt=0x80,I64 seg_size=64)
{//Unassembles a num of bytes
I64 i=0;
U8 buf[1024],*end_ip=ip(I64)+cnt;
U8 buf[1024],*end_rip=rip(I64)+cnt;
if (seg_size==16)
PrintWarn("16-bit unassembly is not well supported.\n");
"$$HL,1$$";
while (ip<end_ip) {
Ui(buf,&ip,seg_size);
while (rip<end_rip) {
Ui(buf,&rip,seg_size);
"%s",buf;
i++;
}