TempleOSCDV4.05.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:47:13 +02:00
1 parent d1856315e0
commit 6fe38d2d9d
118 files changed
+4559 -5069

No files matched your search

+37 -39
View File
@@ -1,7 +1,7 @@
Bool PrsAsmImm(CCmpCtrl *cc,CAsmArg *arg)
{
if (arg->imm_or_off_present)
LexExcept(cc,"already one immediate at ");
LexExcept(cc,"Already one immediate at ");
arg->imm_or_off_present=TRUE;
arg->num.local_asm_undef_hash=NULL;
arg->num.glbl_asm_undef_hash=NULL;
@@ -146,8 +146,8 @@ pa_asm_direct_imm:
goto pa_asm_indirect_imm;
} else if (cc->token=='*') {
Lex(cc);
if (cc->token!=TK_INTEGER)
LexExcept(cc,"expecting scale factor at ");
if (cc->token!=TK_INT)
LexExcept(cc,"Expecting scale factor at ");
arg->scale=cc->cur_i64;
Lex(cc); //skip scale
if (arg->reg2!=REG_NONE)
@@ -161,7 +161,7 @@ pa_asm_indirect_imm:
}
}
if (cc->token!=']')
LexExcept(cc,"missing ']' at ");
LexExcept(cc,"Missing ']' at ");
Lex(cc); //skip ]
return;
} else
@@ -276,7 +276,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
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))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
if (num2->imm_flag) {
if (num2->num.abs_cnts.abs_addres&1) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
@@ -303,7 +303,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
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))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
if (num2->imm_flag) {
if (num2->num.abs_cnts.abs_addres&1) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
@@ -330,7 +330,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
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))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
if (num2->imm_flag) {
if (num2->num.abs_cnts.abs_addres&1) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
@@ -387,13 +387,13 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
U8 asm_seg_prefixes[6]={0x26,0x2E,0x36,0x3E,0x64,0x65};
Bool PrsAsmInstruction(CCmpCtrl *cc,CHashOpcode *tempo,I64 argcnt)
Bool PrsAsmInst(CCmpCtrl *cc,CHashOpcode *tempo,I64 argcnt)
{
CAOTCtrl *aotc=cc->aotc;
I64 i,j,a1,a2,om,seg,arg1mask,arg2mask;
CAsmArg *tempa1,*tempa2;
Bool ModrM_complete,U8_avail=FALSE,found_second_possible=FALSE;
CInstruction *tempi;
CInst *tempi;
CAsmIns cur,best;
best.U8_cnt=255;
@@ -406,12 +406,12 @@ Bool PrsAsmInstruction(CCmpCtrl *cc,CHashOpcode *tempo,I64 argcnt)
arg2mask=AsmMakeArgMask(cc,&aotc->arg2);
else
arg2mask=1;
for (i=0;i<tempo->instruction_entry_cnt;i++) {
for (i=0;i<tempo->inst_entry_cnt;i++) {
tempi=&tempo->ins[i];
if (tempi->arg1==ARGT_REL8 || tempi->arg2==ARGT_REL8)
U8_avail=TRUE;
if (Bt(&arg1mask,tempi->arg1) && Bt(&arg2mask,tempi->arg2) &&
(!(tempi->flags&IEF_NOT_IN_64_BIT) || aotc->seg_size!=64)) {
(!(tempi->flags&IEF_NOT_IN_64_BIT) || aotc->seg_size!=64)) {
MemSet(&cur,0,sizeof(CAsmIns));
cur.tempi=tempi;
ModrM_complete=FALSE;
@@ -559,8 +559,7 @@ Bool PrsAsmInstruction(CCmpCtrl *cc,CHashOpcode *tempo,I64 argcnt)
}
}
}
} else if (ARGT_REL8<=a1<=ARGT_REL32 ||
ARGT_IMM8<=a1<=ARGT_IMM64 ||
} else if (ARGT_REL8<=a1<=ARGT_REL32 || ARGT_IMM8<=a1<=ARGT_IMM64 ||
ARGT_UIMM8<=a1<=ARGT_UIMM64) {
if (a1==ARGT_IMM64 || a2==ARGT_UIMM64)
cur.REX|=8;
@@ -596,12 +595,11 @@ Bool PrsAsmInstruction(CCmpCtrl *cc,CHashOpcode *tempo,I64 argcnt)
cur.last_opcode_U8|=tempa2->fstk;
}
}
if (a1==ARGT_RM64 || a2==ARGT_RM64 ||
a1==ARGT_M64 || a2==ARGT_M64 ||
if (a1==ARGT_RM64 || a2==ARGT_RM64 || a1==ARGT_M64 || a2==ARGT_M64 ||
a1==ARGT_R64 || a2==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) {
ARGT_M8<=a1<=ARGT_M64 || ARGT_M8<=a2<=ARGT_M64) {
if (aotc->seg_size==16)
cur.has_addr_prefix=TRUE;
cur.has_ModrM=TRUE;
@@ -801,11 +799,11 @@ Bool PrsAsmInstruction(CCmpCtrl *cc,CHashOpcode *tempo,I64 argcnt)
if (!AsmStoreNum(cc,&best.imm,1,U8_avail))
return FALSE;
}
if (tempi->flags&IEF_ENDING_ZERO) //ENTER instruction
if (tempi->flags&IEF_ENDING_ZERO) //ENTER inst
AOTStoreCodeU8(cc,0);
return TRUE;
}
LexExcept(cc,"invalid instruction at ");
LexExcept(cc,"Invalid inst at ");
}
U0 PrsAsmDefine(CCmpCtrl *cc,I64 U8_cnt)
@@ -853,11 +851,11 @@ U0 PrsAsmDefine(CCmpCtrl *cc,I64 U8_cnt)
cc->hash_entry->user_data0==AKW_DUP) {
is_dup=TRUE;
if (Lex(cc)!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
Lex(cc); //skip (
dup_val=AsmLexExpression(cc);
if (cc->token!=')')
LexExcept(cc,"expecting ')' at ");
LexExcept(cc,"Expecting ')' at ");
Lex(cc); //SKIP )
}
}
@@ -866,7 +864,7 @@ U0 PrsAsmDefine(CCmpCtrl *cc,I64 U8_cnt)
num2.num.abs_cnts=cc->abs_cnts;
if (is_dup) {
if (num2.num.local_asm_undef_hash || num2.num.glbl_asm_undef_hash)
LexExcept(cc,"undefined DUP cnt at ");
LexExcept(cc,"Undefined DUP cnt at ");
num2.num.i=dup_val;
AsmStoreNum(cc,&num2,i,FALSE);
} else {
@@ -878,7 +876,7 @@ U0 PrsAsmDefine(CCmpCtrl *cc,I64 U8_cnt)
Lex(cc);
}
if (cc->token!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc);
}
@@ -887,14 +885,14 @@ U0 PrsBinFile(CCmpCtrl *cc)
I64 i,size;
U8 *buf,*st;
if (cc->token!=TK_STR)
LexExcept(cc,"expecting string at ");
LexExcept(cc,"Expecting string at ");
st=DftExt(cc->cur_str,"BIN");
buf=FileRead(st,&size);
Free(st);
for (i=0;i<size;i++)
AOTStoreCodeU8(cc,buf[i]);
if (Lex(cc)!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc);
}
@@ -912,7 +910,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
cc->flags|=CCF_ASM_EXPRESSIONS;
if (!(cmp_flags&CMPF_ONE_ASM_INS)) {
if (cc->token!='{')
LexExcept(cc,"expecting '{' at ");
LexExcept(cc,"Expecting '{' at ");
Lex(cc);
}
while (cc->token && cc->token!='}') {
@@ -925,7 +923,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
case AKW_IMPORT:
while (cc->token && cc->token!=';') {
if (cc->token!=TK_IDENT)
LexExcept(cc,"expecting identifier at ");
LexExcept(cc,"Expecting identifier at ");
else {
tempex=NULL;
tempex=CAlloc(sizeof(CHashExport));
@@ -939,7 +937,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
}
}
if (cc->token!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc); //skip ';';
break;
case AKW_MODULE_ORG:
@@ -963,7 +961,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
if (j>aotc->max_align_bits) aotc->max_align_bits=j;
i=CeilU64(aotc->ip,i);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc);
k=AsmLexExpression(cc);
for (j=aotc->ip;j<i;j++)
@@ -1000,7 +998,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
aotc->seg_size=64;
break;
default:
LexExcept(cc,"syntax error at ");
LexExcept(cc,"Syntax error at ");
}
} else if (cc->hash_entry->type & HTT_OPCODE) {
tempo=cc->hash_entry;
@@ -1015,7 +1013,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
if (tempo->ins[0].arg2) {
argcnt++;
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
else {
Lex(cc); //skip ','
if (ARGT_REL8<=tempo->ins[0].arg2<=ARGT_REL32)
@@ -1025,13 +1023,13 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
}
}
}
PrsAsmInstruction(cc,tempo,argcnt);
PrsAsmInst(cc,tempo,argcnt);
} 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;
if (Lex(cc)!=':')
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
Lex(cc);
} else {
if (cc->hash_entry->type & HTF_IMPORT)
@@ -1040,7 +1038,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
next_last_label=cc->hash_entry->str;
Lex(cc); //Skip cur_str
if (cc->token!=':' && cc->token!=TK_DBL_COLON)
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
if (cc->token==TK_DBL_COLON) {
cc->hash_entry->type|=HTF_EXPORT;
HashSrcFileSet(cc,cc->hash_entry);
@@ -1053,12 +1051,12 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
} else if (cc->hash_entry(CHashExport *)->val==aotc->ip) {
Lex(cc); //Skip cur_str
if (cc->token!=':' && cc->token!=TK_DBL_COLON)
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
Lex(cc);
} else
LexExcept(cc,"redefinition at ");
LexExcept(cc,"Redefinition at ");
} else
LexExcept(cc,"syntax error at ");
LexExcept(cc,"Syntax error at ");
} else if (cc->token==TK_IDENT) {
tempex=CAlloc(sizeof(CHashExport));
tempex->str=cc->cur_str;
@@ -1067,11 +1065,11 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
tempex->val=aotc->ip;
Lex(cc); //Skip cur_str
if (cc->token!=':' && cc->token!=TK_DBL_COLON)
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
else {
if (*tempex->str=='@' && tempex->str[1]=='@') {
if (cc->token==TK_DBL_COLON)
LexExcept(cc,"no local glbl exports at ");
LexExcept(cc,"No local glbl exports at ");
HashAdd(tempex,cc->htc.local_hash_table);
} else
HashAdd(tempex,cc->htc.glbl_hash_table);
@@ -1099,7 +1097,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
} else if (cc->token==';')
Lex(cc);
else
LexExcept(cc,"syntax error at ");
LexExcept(cc,"Syntax error at ");
if (cmp_flags&CMPF_ONE_ASM_INS && (cc->token!=TK_IDENT ||
!(tempo=cc->hash_entry) ||
!(tempo->type&(HTT_OPCODE|HTT_ASM_KEYWORD))))
+59 -54
View File
@@ -1,4 +1,4 @@
U0 AsmPrsInsFlags(CCmpCtrl *cc,CInstruction *tempi)
U0 AsmPrsInsFlags(CCmpCtrl *cc,CInst *tempi)
{
I64 i;
while (TRUE) {
@@ -9,7 +9,7 @@ U0 AsmPrsInsFlags(CCmpCtrl *cc,CInstruction *tempi)
break;
} else
return;
case TK_INTEGER:
case TK_INT:
if (cc->cur_i64==16)
tempi->flags|=IEF_OP_SIZE16;
else if (cc->cur_i64==32)
@@ -20,7 +20,7 @@ U0 AsmPrsInsFlags(CCmpCtrl *cc,CInstruction *tempi)
case '+':
tempi->flags|=IEF_PLUS_OPCODE;
case '/':
if (Lex(cc)==TK_INTEGER && cc->cur_i64<8)
if (Lex(cc)==TK_INT && cc->cur_i64<8)
tempi->slash_val=cc->cur_i64;
else if (cc->token==TK_IDENT) {
if (!StrCmp(cc->cur_str,"R"))
@@ -49,13 +49,13 @@ U0 AsmPrsInsFlags(CCmpCtrl *cc,CInstruction *tempi)
U0 AsmHashLoad()
{//See $LK,"::/Compiler/OpCodes.TXT"$.
I64 i,j,size,size1;
I64 i,j,size,size_max;
CInternalType *tempit;
CCmpCtrl *cc;
CHashGeneric *temph;
CHashReg *tempr;
CHashOpcode *tempo,*tempo1;
CInstruction *tempi;
CHashOpcode *tempo,*tempo2,*tempo_max;
CInst *tempi;
CHashClass *tempc;
cmp.size_arg_mask[0]=0x3FF0FFFFFE;
@@ -65,42 +65,57 @@ U0 AsmHashLoad()
cmp.size_arg_mask[8]=0x0880888880;
cmp.asm_hash=HashTableNew(1024);
size1=offset(CHashOpcode.ins)+sizeof(CInstruction)<<5;
tempo=MAlloc(size1);
size_max=offset(CHashOpcode.ins)+sizeof(CInst)<<5;
tempo_max=MAlloc(size_max);
cc=CmpCtrlNew(FileRead("OpCodes.TXT"),,"OpCodes.TXT.Z");
cc->htc.hash_table_lst=NULL;
Lex(cc);
while (cc->token) {
if (cc->token!=TK_IDENT)
LexExcept(cc,"expecting identifier at ");
LexExcept(cc,"Expecting identifier at ");
i=LstMatch(cc->cur_str,"R8\0R16\0R32\0R64\0SEG\0FSTK\0"
"MM\0XMM\0OPCODE\0KEYWORD\0ASM_KEYWORD\0");
if (i<0)
LexExcept(cc,"Unknown Stmt");
Lex(cc); //skip keyword
if (cc->token!=TK_IDENT)
LexExcept(cc,"expecting identifier at ");
LexExcept(cc,"Expecting identifier at ");
switch (i) {
case 8: //OPCODE
MemSet(tempo,0,size1);
tempo->type=HTT_OPCODE;
tempo->instruction_entry_cnt=0;
tempo->str=cc->cur_str;
case REGT_R8...REGT_XMM:
tempr=CAlloc(sizeof(CHashReg));
tempr->str=cc->cur_str;
cc->cur_str=NULL;
Lex(cc); //skip keyword name
if (cc->token!=TK_INT)
LexExcept(cc,"Expecting int at ");
tempr->type=HTT_REG;
tempr->reg_type=i;
tempr->reg_num=cc->cur_i64;
HashAdd(tempr,cmp.asm_hash);
Lex(cc); //Skip INT
break;
case: //OPCODE
if (cc->token!=TK_IDENT)
LexExcept(cc,"Expecting opcode at ");
MemSet(tempo_max,0,size_max);
tempo_max->type=HTT_OPCODE;
tempo_max->inst_entry_cnt=0;
tempo_max->str=cc->cur_str;
cc->cur_str=0;
Lex(cc); //Skip OPCODE
while (cc->token && cc->token!=';') {
tempi=&tempo->ins[tempo->instruction_entry_cnt];
tempi->ins_entry_num=tempo->instruction_entry_cnt++;
while (cc->token && cc->token!=';' && cc->token!=':') {
tempi=&tempo_max->ins[tempo_max->inst_entry_cnt];
tempi->ins_entry_num=tempo_max->inst_entry_cnt++;
tempi->slash_val=SV_NONE; //Not zero!!
while (cc->token==TK_INTEGER) {
while (cc->token==TK_INT) {
tempi->opcode[tempi->opcode_cnt++]=cc->cur_i64;
Lex(cc);
}
if (cc->token==',')
Lex(cc);
else if (cc->token!=';')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
AsmPrsInsFlags(cc,tempi);
@@ -136,24 +151,34 @@ U0 AsmHashLoad()
}
}
}
size=offset(CHashOpcode.ins)+
sizeof(CInstruction)*tempo->instruction_entry_cnt;
tempo1=MAlloc(size);
MemCpy(tempo1,tempo,size);
tempo1->use_cnt=0;
if (HashFind(tempo1->str,cmp.asm_hash,HTT_OPCODE))
size=offset(CHashOpcode.ins)+sizeof(CInst)*tempo_max->inst_entry_cnt;
tempo=MAlloc(size);
MemCpy(tempo,tempo_max,size);
tempo->use_cnt=0;
if (HashFind(tempo->str,cmp.asm_hash,HTT_OPCODE))
LexExcept(cc,"Duplicate OPCODE entry ");
HashAdd(tempo1,cmp.asm_hash);
HashAdd(tempo,cmp.asm_hash);
//Parse aliases.
if (cc->token==':') {
while (Lex(cc)==TK_IDENT) {
tempo2=MAllocIdentical(tempo);
tempo2->str=cc->cur_str;
cc->cur_str=0;
tempo2->oc_flags|=OCF_ALIAS;
if (HashFind(tempo2->str,cmp.asm_hash,HTT_OPCODE))
LexExcept(cc,"Duplicate OPCODE ALIAS entry ");
HashAdd(tempo2,cmp.asm_hash);
}
}
break;
case 9: //KEYWORD
case 10: //ASM_KEYWORD
case: //KEYWORD
case: //ASM_KEYWORD
temph=CAlloc(sizeof(CHashGeneric));
temph->str=cc->cur_str;
cc->cur_str=NULL;
Lex(cc); //skip keyword name
if (cc->token!=TK_INTEGER)
LexExcept(cc,"expecting integer at ");
if (cc->token!=TK_INT)
LexExcept(cc,"Expecting int at ");
temph->user_data0=cc->cur_i64;
if (i==9)
temph->type=HTT_KEYWORD;
@@ -162,32 +187,12 @@ U0 AsmHashLoad()
HashAdd(temph,cmp.asm_hash);
Lex(cc); //Skip INT
break;
case REGT_R8:
case REGT_R16:
case REGT_R32:
case REGT_R64:
case REGT_SEG:
case REGT_FSTK:
case REGT_MM:
case REGT_XMM:
tempr=CAlloc(sizeof(CHashReg));
tempr->str=cc->cur_str;
cc->cur_str=NULL;
Lex(cc); //skip keyword name
if (cc->token!=TK_INTEGER)
LexExcept(cc,"expecting integer at ");
tempr->type=HTT_REG;
tempr->reg_type=i;
tempr->reg_num=cc->cur_i64;
HashAdd(tempr,cmp.asm_hash);
Lex(cc); //Skip INT
break;
}
if (cc->token!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc); //Skip ';'
}
Free(tempo);
Free(tempo_max);
CmpCtrlDel(cc);
for (i=0;i<NUM_INTERNAL_TYPES;i++) {
tempit=&internal_types_table[i];
+3 -5
View File
@@ -30,8 +30,7 @@ U0 AOTStoreCodeU8(CCmpCtrl *cc,U8 b)
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->ip>>AOT_BIN_BLK_BITS,j=(aotc->ip+sizeof(U32))>>AOT_BIN_BLK_BITS;
U32 *_d;
CAOTBinBlk *tempbin;
if (i!=j)
@@ -69,8 +68,7 @@ U0 AOTStoreCodeU32(CCmpCtrl *cc,U32 d)
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,
I64 i=aotc->ip>>AOT_BIN_BLK_BITS,j=(aotc->ip+sizeof(I64))>>AOT_BIN_BLK_BITS,
*_q;
CAOTBinBlk *tempbin;
if (i!=j)
@@ -139,7 +137,7 @@ I64 AsmLexExpression(CCmpCtrl *cc)
if (cc->abs_cnts.externs)
LexExcept(cc,"Extern Not Allowed at ");
if (cc->flags & CCF_UNRESOLVED)
LexExcept(cc,"undefined sym at ");
LexExcept(cc,"Undefined sym at ");
result=Call(machine_code);
Free(machine_code);
}
+6 -7
View File
@@ -16,11 +16,11 @@ U0 AsmResolve(CCmpCtrl *cc,CAsmUnresolvedRef *tempu,U8 *label,Bool undefined)
}
tempauh=tempauh->next; //Technically, more than one won't work.
}
} else if (!(tempu->type&1)) {//Rel?
} else if (!(tempu->type&IEF_IMM_NOT_REL)) {
r-=tempu->rel_ip;
if (tempu->type==IET_REL_I8 && !(MIN_I8<=r<=MAX_I8) ||
tempu->type==IET_REL_I16 && !(MIN_I16<=r<=MAX_I16)) {
PrintErr("branch out of range at line:%04d %s\n",
PrintErr("Branch out of range at line:%04d %s\n",
tempu->line_num,label);
LexExcept(cc);
}
@@ -53,7 +53,7 @@ U0 AOTLocalsResolve(CCmpCtrl *cc)
tempauh=tempu->asm_undef_hash;
while (tempauh) {
if (tempauh->hash->type & HTF_UNRESOLVED) {
PrintErr("undefined sym at line:%04d %s %s\n",
PrintErr("Undefined sym at line:%04d %s %s\n",
tempu->line_num,aotc->last_label,tempauh->hash->str);
LexExcept(cc);
}
@@ -94,8 +94,7 @@ U0 AOTGlblsResolve(CCmpCtrl *cc,CAOT *tempaot)
while (tempauh) {
if (tempauh->hash->type & HTF_UNRESOLVED) {
tempex=tempauh->hash;
if (tempex->type & HTT_EXPORT_SYS_SYM &&
tempex->type & HTF_UNRESOLVED &&
if (tempex->type & HTT_EXPORT_SYS_SYM&& tempex->type & HTF_UNRESOLVED &&
!(tempex->type & HTF_IMPORT) &&
(tempf=HashFind(tempex->str,cc->htc.hash_table_lst,HTT_FUN)) &&
!Bt(&tempf->flags,Cf_EXTERN)) {
@@ -108,7 +107,7 @@ U0 AOTGlblsResolve(CCmpCtrl *cc,CAOT *tempaot)
tempex->type|=HTF_GOTO_LABEL;
tempex->use_cnt++;
} else {
PrintErr("undefined sym at line:%04d %s\n",
PrintErr("Undefined sym at line:%04d %s\n",
tempu->line_num,tempex->str);
LexExcept(cc);
}
@@ -150,7 +149,7 @@ U0 AOTGlblsResolve(CCmpCtrl *cc,CAOT *tempaot)
}
} else if (tempex->type & (HTF_EXPORT|HTF_RESOLVE)) {
if (tempex->type & HTF_UNRESOLVED) {
PrintErr("undefined sym at %s\n",tempex->str);
PrintErr("Undefined sym at %s\n",tempex->str);
LexExcept(cc);
}
if (tempex->type & HTF_RESOLVE) {
+227 -330
View File
@@ -1,5 +1,5 @@
U0 ICAddEct(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
I64 t2,I64 r2,I64 d2,I64 t3,I64 r3,I64 d3,I64 op,I64 ip)
U0 ICAddEct(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,
CICType t2,I64 r2,I64 d2,CICType t3,I64 r3,I64 d3,I64 op,I64 ip)
{
I64 i,temp,result_reg=REG_RAX;
Bool swap=FALSE;
@@ -9,11 +9,10 @@ U0 ICAddEct(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
SwapI64(&r2,&r3);
SwapI64(&d2,&d3);
}
if (t2&RT_MASK>=RT_I64 && r2!=result_reg &&
TY_REG<=t2&TY_MASK<=TY_RIP_DISP32) {
if (t1&TY_MASK==TY_REG && !(r2==r1 && TY_REG<=t2&TY_MASK<=TY_SIB))
if (t2.raw_type>=RT_I64 && r2!=result_reg && t2&MDG_REG_DISP_SIB_RIP) {
if (t1&MDF_REG && !(r2==r1 && t2&MDG_REG_DISP_SIB))
result_reg=r1;
ICMov(tempi,TY_REG+RT_I64,result_reg,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,result_reg,0,t3,r3,d3,ip);
i=ICModr1(result_reg,t2,r2,d2);
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
@@ -21,26 +20,26 @@ U0 ICAddEct(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
ICU16(tempi,i.u8[2]<<8+op);
ICModr2(tempi,i,d2,ip+4);
} else {
if (t2&TY_MASK==TY_REG)
if (t2&MDF_REG)
temp=r2;
else
temp=REG_RCX;
if (t1&TY_MASK==TY_REG)
if (t1&MDF_REG)
result_reg=r1;
if (temp==result_reg)
result_reg=REG_RDX;
if (swap ^^ tempi->ic_flags & ICF_A1_FIRST) {
if (r3==temp && TY_REG<=t3&TY_MASK<=TY_SIB)
if (swap) {
if (r3==temp && t3&MDG_REG_DISP_SIB)
temp=REG_RCX;
ICMov(tempi,TY_REG+RT_I64,temp,0,t2,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,result_reg,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,temp,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,result_reg,0,t3,r3,d3,ip);
} else {
if (r2==result_reg && TY_REG<=t2&TY_MASK<=TY_SIB)
if (r2==result_reg && t2&MDG_REG_DISP_SIB)
result_reg=REG_RDX;
ICMov(tempi,TY_REG+RT_I64,result_reg,0,t3,r3,d3,ip);
ICMov(tempi,TY_REG+RT_I64,temp,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,result_reg,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,temp,0,t2,r2,d2,ip);
}
i=0x48;
if (result_reg>7)
@@ -51,19 +50,19 @@ U0 ICAddEct(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
ICU8(tempi,OC_LOCK_PREFIX);
ICU24(tempi,0xC00000+i+(temp&7)<<16+(result_reg&7)<<19+op<<8);
}
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,result_reg,0,ip);
}
U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
I64 t2,I64 r2,I64 d2,I64 d,I64 op,I64 ip)
U0 ICAddSubEctImm(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,
CICType t2,I64 r2,I64 d2,I64 d,I64 op,I64 ip)
{
I64 i,r;
if (op.u8[0]==0x2B) {
op=0x0003;
d=-d;
}
if (t1&TY_MASK==TY_REG) {
if (t2&TY_MASK!=TY_REG) {
if (t1&MDF_REG) {
if (!(t2&MDF_REG)) {
ICMov(tempi,t1,r1,d1,t2,r2,d2,ip);
t2=t1;
r2=r1;
@@ -95,18 +94,18 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
}
if (op.u8[0]==0x03 && MIN_I32<=d<=MAX_I32 &&
!Bt(&cmp.non_ptr_vars_mask,r2)) {
i=ICModr1(r1,TY_DISP+RT_I64,r2,d);
i=ICModr1(r1,MDF_DISP+RT_I64,r2,d);
i.u8[1]|=0x48;
ICU24(tempi,i.u8[2]<<16+0x8D00+i.u8[1]);
ICModr2(tempi,i,d,ip+4);
return;
}
}
switch (t1>>4) {
case TY_REG>>4:
case TY_DISP>>4:
case TY_SIB>>4:
case TY_RIP_DISP32>>4:
switch (Bsr(t1)) {
case MDf_REG:
case MDf_DISP:
case MDf_SIB:
case MDf_RIP_DISP32:
if (t1!=t2 || r1!=r2 || d1!=d2) {
ICMov(tempi,t1,r1,d1,t2,r2,d2,ip);
t2=t1;
@@ -114,8 +113,7 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
d2=d1;
}
if (!d &&
(op.u8[0]==0x03||op.u8[0]==0x2B||op.u8[0]==0x33||op.u8[0]==0x0B))
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
@@ -123,9 +121,9 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
if (op.u8[0]==0x03 && (d==1 || d==-1)) { //Add
i=ICModr1(r,t1,r1,d1);
if (t1!=TY_REG && tempi->ic_flags&ICF_LOCK)
if (!(t1&MDF_REG) && tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
switch (t1&RT_MASK) {
switch (t1.raw_type) {
case RT_I8:
case RT_U8:
ICRex(tempi,i.u8[1]);
@@ -143,11 +141,11 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
ICModr2(tempi,i,d1,ip+4);
return;
}
if (MIN_I8<=d<=MAX_I8 || t1&(RT_MASK-1)==RT_I8) {
if (MIN_I8<=d<=MAX_I8 || t1&(RTG_MASK-RTF_UNSIGNED)==RT_I8) {
i=ICModr1(r,t1,r1,d1);
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
switch (t1&RT_MASK) {
switch (t1.raw_type) {
case RT_I8:
case RT_U8:
ICRex(tempi,i.u8[1]);
@@ -166,11 +164,11 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
ICU8(tempi,d);
return;
}
if (MIN_I32<=d<=MAX_I32 || t1&RT_MASK<RT_I64) {
if (MIN_I32<=d<=MAX_I32 || t1.raw_type<RT_I64) {
i=ICModr1(r,t1,r1,d1);
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
switch (t1&RT_MASK) {
switch (t1.raw_type) {
case RT_I16:
case RT_U16:
ICOpSizeRex(tempi,i.u8[1]);
@@ -180,32 +178,32 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
ICRex(tempi,i.u8[1]);
ICU16(tempi,i.u8[2]<<8+0x81);
}
if (i.u8[0]!=MDR_RIP_REL)
if (i.u8[0]!=MODR_RIP_REL)
ICModr2(tempi,i,d1,);
else {
if (t1&(RT_MASK-1)==RT_I16)
if (t1&(RTG_MASK-RTF_UNSIGNED)==RT_I16)
ICU32(tempi,d1-(ip+tempi->ic_cnt+6));
else
ICU32(tempi,d1-(ip+tempi->ic_cnt+8));
tempi->ic_flags&=~ICF_CODE_FINAL;
}
if (t1&(RT_MASK-1)==RT_I16)
if (t1&(RTG_MASK-RTF_UNSIGNED)==RT_I16)
ICU16(tempi,d);
else
ICU32(tempi,d);
return;
}
break;
case TY_STK>>4:
ICAddSubEctImm(tempi,TY_REG+RT_I64,REG_RAX,0,t2,r2,d2,d,op,ip);
case MDf_STK:
ICAddSubEctImm(tempi,MDF_REG+RT_I64,REG_RAX,0,t2,r2,d2,d,op,ip);
ICPushRegs(tempi,1<<REG_RAX);
return;
}
ICAddEct(tempi,t1,r1,d1,TY_IMM+RT_I64,0,d,t2,r2,d2,op.u8[0],ip);
ICAddEct(tempi,t1,r1,d1,MDF_IMM+RT_I64,0,d,t2,r2,d2,op.u8[0],ip);
}
U0 ICSub(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
I64 t2,I64 r2,I64 d2,I64 t3,I64 r3,I64 d3,I64 ip)
U0 ICSub(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,
CICType t2,I64 r2,I64 d2,CICType t3,I64 r3,I64 d3,I64 ip)
{
I64 i=0x48,op=0x2B;
Bool swap=FALSE;
@@ -215,10 +213,9 @@ U0 ICSub(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
SwapI64(&r2,&r3);
SwapI64(&d2,&d3);
}
if (t2&RT_MASK>=RT_I64 && r2.u8[0]!=REG_RAX &&
(t2&TY_MASK!=TY_SIB || r2.u8[1]&15!=REG_RAX) &&
TY_REG<=t2&TY_MASK<=TY_RIP_DISP32) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
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(tempi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
if (!swap) {
op=0x03;
ICU24(tempi,0xD8F748);
@@ -229,44 +226,24 @@ U0 ICSub(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
ICRex(tempi,i.u8[1]);
ICU16(tempi,i.u8[2]<<8+op);
ICModr2(tempi,i,d2,ip+4);
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,REG_RAX,0,ip);
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
if (t3&TY_MASK!=TY_REG || t3&RT_MASK<RT_I64) {
if (swap) {
swap=FALSE;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
r3=REG_RCX;
r2=REG_RAX;
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
r2=REG_RCX;
r3=REG_RAX;
}
if (!(t3&MDF_REG) || t3.raw_type<RT_I64) {
if (swap) {
swap=FALSE;
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
r2=REG_RAX;
r3=REG_RCX;
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
r3=REG_RAX;
r2=REG_RCX;
}
} else {
if (t3&TY_MASK!=TY_REG || t3&RT_MASK<RT_I64) {
if (swap) {
swap=FALSE;
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
r2=REG_RAX;
r3=REG_RCX;
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
r3=REG_RAX;
r2=REG_RCX;
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
r2=REG_RCX;
}
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
r2=REG_RCX;
}
if (swap) {
op=0x03;
@@ -279,7 +256,7 @@ U0 ICSub(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
ICU24(tempi,0xC00000+i+(r3&7)<<16+(r2&7)<<19+op<<8);
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,r2,0,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,r2,0,ip);
}
}
@@ -287,23 +264,25 @@ U0 ICMul(CIntermediateCode *tempi,I64 ip)
{
I64 i,r2,r=REG_RAX,j;
CICArg *a1,*a2;
if (tempi->a1.type&TY_MASK==TY_IMM) {
Bool alt;
if (tempi->a1.type&MDF_IMM) {
a1=&tempi->a2;
a2=&tempi->a1;
tempi->ic_flags|=ICF_A1_FIRST;
alt=TRUE;
} else {
a1=&tempi->a1;
a2=&tempi->a2;
alt=FALSE;
}
i=a2->disp;
if (!(tempi->ic_class->raw_type&1) &&
a2->type&TY_MASK==TY_IMM && MIN_I32<=i<=MAX_I32) {
if (tempi->r.type==TY_REG+RT_I64) {
if (!(tempi->ic_class->raw_type&RTF_UNSIGNED) &&
a2->type&MDF_IMM && MIN_I32<=i<=MAX_I32) {
if (tempi->r.type==MDF_REG+RT_I64) {
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
a1->type,a1->reg,a1->disp,ip);
r=tempi->r.reg;
} else
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip);
if (r>7)
j=0xC0004D;
else
@@ -315,19 +294,18 @@ U0 ICMul(CIntermediateCode *tempi,I64 ip)
ICU32(tempi,i);
}
} else {
if (tempi->ic_class->raw_type&1)
if (tempi->ic_class->raw_type&RTF_UNSIGNED)
i=0xE0F748;
else
i=0xE8F748;
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
if (alt) {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
r2=REG_RCX;
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
if (a1->type&TY_MASK!=TY_REG ||
a1->type&RT_MASK<RT_I64) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,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(tempi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
r2=REG_RCX;
} else
r2=a1->reg;
@@ -338,20 +316,20 @@ U0 ICMul(CIntermediateCode *tempi,I64 ip)
}
ICU24(tempi,i+r2<<16);
}
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,TY_REG+RT_I64,r,0,ip);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,MDF_REG+RT_I64,r,0,ip);
}
U0 ICMulEqu(CIntermediateCode *tempi,I64 ip)
{
I64 i=tempi->a2.disp,r=REG_RAX,j;
if (!(tempi->ic_class->raw_type&1) &&
tempi->a2.type&TY_MASK==TY_IMM && MIN_I32<=i<=MAX_I32) {
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->a1.type==TY_REG+RT_I64)
if (!(tempi->ic_class->raw_type&RTF_UNSIGNED) &&
tempi->a2.type&MDF_IMM && MIN_I32<=i<=MAX_I32) {
if (tempi->ic_flags & ICF_BY_VAL) {
if (tempi->a1.type==MDF_REG+RT_I64)
r=tempi->a1.reg;
else
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
if (r>7)
j=0xC0004D;
@@ -363,13 +341,13 @@ U0 ICMulEqu(CIntermediateCode *tempi,I64 ip)
ICU24(tempi,0x6900+j+(r&7)<<16+(r&7)<<19);
ICU32(tempi,i);
}
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,TY_REG+RT_I64,r,0,ip);
ICMov(tempi,tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,MDF_REG+RT_I64,r,0,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,
MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
r=REG_RBX;
if (MIN_I8<=i<=MAX_I8)
ICU32(tempi,i<<24+0xDB6B48);
@@ -377,68 +355,46 @@ U0 ICMulEqu(CIntermediateCode *tempi,I64 ip)
ICU24(tempi,0xDB6948);
ICU32(tempi,i);
}
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
TY_REG+RT_I64,REG_RBX,0,ip);
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
MDF_REG+RT_I64,REG_RBX,0,ip);
}
} else {
if (tempi->ic_class->raw_type&1)
if (tempi->ic_class->raw_type&RTF_UNSIGNED)
i=0xE3F748;
else
i=0xEBF748;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
}
if (tempi->ic_flags & ICF_BY_VAL) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
ICU24(tempi,i);
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,MDF_REG+RT_I64,REG_RAX,0,ip);
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,
MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
ICU24(tempi,i);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
MDF_REG+RT_I64,REG_RAX,0,ip);
}
}
if (tempi->r.type&TY_MASK)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,TY_REG+RT_I64,r,0,ip);
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,MDF_REG+RT_I64,r,0,ip);
}
U0 ICDiv(CIntermediateCode *tempi,I64 ip)
{
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
if (tempi->ic_class->raw_type&1) {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->ic_class->raw_type&RTF_UNSIGNED) {
ICZero(tempi,REG_RDX);
ICU24(tempi,0xF1F748);
} else {
@@ -446,26 +402,18 @@ U0 ICDiv(CIntermediateCode *tempi,I64 ip)
ICU24(tempi,0xF9F748);
}
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICDivEqu(CIntermediateCode *tempi,Bool is_mod,I64 ip)
{
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
}
if (tempi->ic_class->raw_type&1) {
if (tempi->ic_flags & ICF_BY_VAL) {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->ic_class->raw_type&RTF_UNSIGNED) {
ICZero(tempi,REG_RDX);
ICU24(tempi,0xF1F748);
} else {
@@ -473,28 +421,20 @@ U0 ICDivEqu(CIntermediateCode *tempi,Bool is_mod,I64 ip)
ICU24(tempi,0xF9F748);
}
if (is_mod)
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,TY_REG+RT_I64,REG_RDX,0,ip);
ICMov(tempi,tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,MDF_REG+RT_I64,REG_RDX,0,ip);
else
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,MDF_REG+RT_I64,REG_RAX,0,ip);
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICU24(tempi,0xD98748); //xchg bx,cx
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
//dangerous might clobber RBX in Mov, but it doesn't
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,TY_DISP+tempi->a1.type_pointed_to,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+tempi->a1.type_pointed_to,
REG_RBX,0,ip);
if (tempi->ic_class->raw_type&1) {
if (tempi->ic_class->raw_type&RTF_UNSIGNED) {
ICZero(tempi,REG_RDX);
ICU24(tempi,0xF1F748);
} else {
@@ -502,36 +442,29 @@ U0 ICDivEqu(CIntermediateCode *tempi,Bool is_mod,I64 ip)
ICU24(tempi,0xF9F748);
}
if (is_mod)
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,REG_RBX,0,
TY_REG+RT_I64,REG_RDX,0,ip);
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,REG_RBX,0,
MDF_REG+RT_I64,REG_RDX,0,ip);
else
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,REG_RBX,0,
TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,REG_RBX,0,
MDF_REG+RT_I64,REG_RAX,0,ip);
}
if (tempi->r.type&TY_MASK) {
if (tempi->r.type.mode) {
if (is_mod)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RDX,0,ip);
MDF_REG+RT_I64,REG_RDX,0,ip);
else
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
}
U0 ICMod(CIntermediateCode *tempi,I64 ip)
{
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
if (tempi->ic_class->raw_type&1) {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->ic_class->raw_type&RTF_UNSIGNED) {
ICZero(tempi,REG_RDX);
ICU24(tempi,0xF1F748);
} else {
@@ -539,35 +472,33 @@ U0 ICMod(CIntermediateCode *tempi,I64 ip)
ICU24(tempi,0xF9F748);
}
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RDX,0,ip);
MDF_REG+RT_I64,REG_RDX,0,ip);
}
U0 ICAddSubEctEqu(CIntermediateCode *tempi,I64 type_pointed_to,
I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,
I64 t3,I64 r3,I64 d3,I64 op,I64 ip)
U0 ICAddSubEctEqu(CIntermediateCode *tempi,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)
{
Bool done;
I64 result_reg,temp,i;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (t3&TY_MASK==TY_IMM) {
ICAddSubEctImm(tempi,
t2&TY_MASK+type_pointed_to,r2,d2,t2&TY_MASK+
if (tempi->ic_flags & ICF_BY_VAL) {
if (t3&MDF_IMM) {
ICAddSubEctImm(tempi,t2&MDG_MASK+type_pointed_to,r2,d2,t2&MDG_MASK+
type_pointed_to,r2,d2,d3,op,ip);
if (t1&TY_MASK)
ICMov(tempi,t1,r1,d1,t2&TY_MASK+type_pointed_to,r2,d2,ip);
if (t1.mode)
ICMov(tempi,t1,r1,d1,t2&MDG_MASK+type_pointed_to,r2,d2,ip);
return;
} else {
done=FALSE;
if (type_pointed_to>=RT_I64) {
if (!(t1&TY_MASK) &&
TY_REG<=t2&TY_MASK<=TY_RIP_DISP32) {
if (t3&TY_MASK==TY_REG)
if (!t1.mode && t2&MDG_REG_DISP_SIB_RIP) {
if (t3&MDF_REG)
temp=r3;
else {
temp=REG_RCX;
ICMov(tempi,TY_REG+RT_I64,temp,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,temp,0,t3,r3,d3,ip);
}
i=ICModr1(temp,t2&TY_MASK+type_pointed_to,r2,d2);
i=ICModr1(temp,t2&MDG_MASK+type_pointed_to,r2,d2);
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
ICRex(tempi,i.u8[1]);
@@ -575,44 +506,32 @@ U0 ICAddSubEctEqu(CIntermediateCode *tempi,I64 type_pointed_to,
ICModr2(tempi,i,d2,ip+4);
return;
}
if (t3&RT_MASK>=RT_I64 &&
TY_REG<=t3&TY_MASK<=TY_RIP_DISP32) {
if (t2&TY_MASK==TY_REG)
if (t3.raw_type>=RT_I64 && t3&MDG_REG_DISP_SIB_RIP) {
if (t2&MDF_REG)
result_reg=r2;
else {
result_reg=REG_RCX;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
}
i=ICModr1(result_reg,t3&TY_MASK+type_pointed_to,r3,d3);
i=ICModr1(result_reg,t3&MDG_MASK+type_pointed_to,r3,d3);
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
ICRex(tempi,i.u8[1]);
ICU16(tempi,i.u8[2]<<8+op.u8[0]);
ICModr2(tempi,i,d3,ip+4);
ICMov(tempi,t2&TY_MASK+type_pointed_to,r2,d2,
TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,t2&MDG_MASK+type_pointed_to,r2,d2,
MDF_REG+RT_I64,result_reg,0,ip);
done=TRUE;
}
}
if (!done) {
if (tempi->ic_flags & ICF_A1_FIRST) {
if (t2&TY_MASK==TY_REG && r2!=REG_RAX)
result_reg=r2;
else {
result_reg=REG_RCX;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
t2&TY_MASK+type_pointed_to,r2,d2,ip);
}
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
if (t2&TY_MASK==TY_REG && r2!=REG_RAX)
result_reg=r2;
else {
result_reg=REG_RCX;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
t2&TY_MASK+type_pointed_to,r2,d2,ip);
}
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
if (t2&MDF_REG && r2!=REG_RAX)
result_reg=r2;
else {
result_reg=REG_RCX;
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
t2&MDG_MASK+type_pointed_to,r2,d2,ip);
}
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
@@ -621,35 +540,35 @@ U0 ICAddSubEctEqu(CIntermediateCode *tempi,I64 type_pointed_to,
else
ICU8(tempi,0x48);
ICU16(tempi,0xC000+op.u8[0]+(result_reg&7)<<11);
ICMov(tempi,t2&TY_MASK+type_pointed_to,r2,d2,
TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,t2&MDG_MASK+type_pointed_to,r2,d2,
MDF_REG+RT_I64,result_reg,0,ip);
}
}
} else {
done=FALSE;
if (t3&TY_MASK==TY_IMM && op.u8[2]) {
if (t3&MDF_IMM && op.u8[2]) {
if (!d3.u32[1]) {
if (tempi->ic_flags&ICF_NO_DEPEND_RESULT &&
t2&TY_MASK==TY_REG && d3(U64)<=MAX_I8) {
ICSlashOp(tempi,TY_DISP+type_pointed_to,r2,0,0x838000+op.u8[4],ip);
t2&MDF_REG && d3(U64)<=MAX_I8) {
ICSlashOp(tempi,MDF_DISP+type_pointed_to,r2,0,0x838000+op.u8[4],ip);
ICU8(tempi,d3);
done=TRUE;
} else if (op.u8[2]==0x24) {//AND
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_DISP+type_pointed_to,REG_RCX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
MDF_DISP+type_pointed_to,REG_RCX,0,ip);
result_reg=REG_RAX;
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
ICU16(tempi,op.u8[3]<<8+0x40);
ICU32(tempi,d3);
ICMov(tempi,TY_DISP+type_pointed_to,REG_RCX,0,
TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,MDF_DISP+type_pointed_to,REG_RCX,0,
MDF_REG+RT_I64,result_reg,0,ip);
done=TRUE;
} else if (type_pointed_to&RT_MASK<RT_I64) {//OR/XOR
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_DISP+type_pointed_to,REG_RCX,0,ip);
} else if (type_pointed_to<RT_I64) {//OR/XOR
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
MDF_DISP+type_pointed_to,REG_RCX,0,ip);
result_reg=REG_RAX;
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
@@ -663,48 +582,46 @@ U0 ICAddSubEctEqu(CIntermediateCode *tempi,I64 type_pointed_to,
ICU16(tempi,op.u8[2]<<8+0x40);
ICU8(tempi,d3);
}
ICMov(tempi,TY_DISP+type_pointed_to,REG_RCX,0,
TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,MDF_DISP+type_pointed_to,REG_RCX,0,
MDF_REG+RT_I64,result_reg,0,ip);
done=TRUE;
}
}
}
if (!done) {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
}
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,TY_DISP+type_pointed_to,REG_RCX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,
MDF_DISP+type_pointed_to,REG_RCX,0,ip);
result_reg=REG_RBX;
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
ICU8(tempi,0x48);
ICU16(tempi,0xC000+op.u8[0]+(result_reg&7)<<11);
ICMov(tempi,TY_DISP+type_pointed_to,REG_RCX,0,
TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,MDF_DISP+type_pointed_to,REG_RCX,0,
MDF_REG+RT_I64,result_reg,0,ip);
}
}
if (t1&TY_MASK)
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,result_reg,0,ip);
if (t1.mode)
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,result_reg,0,ip);
}
U0 ICShift(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
I64 t2,I64 r2,I64 d2,I64 t3,I64 r3,I64 d3,I64 us,I64 is,I64 ip)
U0 ICShift(CIntermediateCode *tempi,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 i=0x48,result_reg;
if (tempi->ic_class->raw_type&1 || tempi->ic_flags & ICF_USE_UNSIGNED)
if (tempi->ic_class->raw_type&RTF_UNSIGNED ||
tempi->ic_flags & ICF_USE_UNSIGNED)
is=us;
if (t1&TY_MASK==TY_REG) {
if (t1&MDF_REG) {
result_reg=r1;
if (result_reg>7)
i++;
} else
result_reg=REG_RAX;
if (t3&TY_MASK==TY_IMM) {
ICMov(tempi,TY_REG+RT_I64,result_reg,0,t2,r2,d2,ip);
if (t3&MDF_IMM) {
ICMov(tempi,MDF_REG+RT_I64,result_reg,0,t2,r2,d2,ip);
if (d3==1)
ICU24(tempi,i+is.u16[2]<<8+(result_reg&7)<<16);
else {
@@ -712,52 +629,37 @@ U0 ICShift(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
ICU8(tempi,d3);
}
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,result_reg,0,t2,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
ICMov(tempi,TY_REG+RT_I64,result_reg,0,t2,r2,d2,ip);
}
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,result_reg,0,t2,r2,d2,ip);
ICU24(tempi,i+is.u16[1]<<8+(result_reg&7)<<16);
}
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,result_reg,0,ip);
}
U0 ICShiftEqu(CIntermediateCode *tempi,I64 type_pointed_to,
I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 t3,I64 r3,I64 d3,
I64 us,I64 is,I64 ip)
U0 ICShiftEqu(CIntermediateCode *tempi,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)
{
I64 result_reg;
if (tempi->ic_class->raw_type&1 || tempi->ic_flags & ICF_USE_UNSIGNED)
if (tempi->ic_class->raw_type&RTF_UNSIGNED ||
tempi->ic_flags & ICF_USE_UNSIGNED)
is=us;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->ic_flags & ICF_A1_FIRST) {
if (t2&TY_MASK==TY_REG)
result_reg=r2;
else {
result_reg=REG_RAX;
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
t2&TY_MASK+type_pointed_to,r2,d2,ip);
}
if (t3&TY_MASK!=TY_IMM)
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
} else {
if (t3&TY_MASK!=TY_IMM)
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
if (t2&TY_MASK==TY_REG)
result_reg=r2;
else {
result_reg=REG_RAX;
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
t2&TY_MASK+type_pointed_to,r2,d2,ip);
}
if (tempi->ic_flags & ICF_BY_VAL) {
if (!(t3&MDF_IMM))
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
if (t2&MDF_REG)
result_reg=r2;
else {
result_reg=REG_RAX;
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
t2&MDG_MASK+type_pointed_to,r2,d2,ip);
}
if (result_reg>7)
ICU8(tempi,0x49);
else
ICU8(tempi,0x48);
if (t3&TY_MASK==TY_IMM) {
if (t3&MDF_IMM) {
if (d3==1)
ICU16(tempi,is.u16[2]+(result_reg&7)<<8);
else {
@@ -766,21 +668,16 @@ U0 ICShiftEqu(CIntermediateCode *tempi,I64 type_pointed_to,
}
} else
ICU16(tempi,is.u16[1]+(result_reg&7)<<8);
ICMov(tempi,t2&TY_MASK+type_pointed_to,r2,d2,TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,t2&MDG_MASK+type_pointed_to,r2,d2,
MDF_REG+RT_I64,result_reg,0,ip);
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,t2,r2,d2,ip);
if (t3&TY_MASK!=TY_IMM)
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
} else {
if (t3&TY_MASK!=TY_IMM)
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,t2,r2,d2,ip);
}
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,TY_DISP+type_pointed_to,REG_RDX,0,ip);
if (!(t3&MDF_IMM))
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+type_pointed_to,REG_RDX,0,ip);
result_reg=REG_RAX;
ICU8(tempi,0x48);
if (t3&TY_MASK==TY_IMM) {
if (t3&MDF_IMM) {
if (d3==1)
ICU16(tempi,is.u16[2]+(result_reg&7)<<8);
else {
@@ -790,8 +687,8 @@ U0 ICShiftEqu(CIntermediateCode *tempi,I64 type_pointed_to,
} else
ICU16(tempi,is.u16[1]+(result_reg&7)<<8);
ICMov(tempi,
TY_DISP+type_pointed_to,REG_RDX,0,TY_REG+RT_I64,result_reg,0,ip);
MDF_DISP+type_pointed_to,REG_RDX,0,MDF_REG+RT_I64,result_reg,0,ip);
}
if (t1&TY_MASK)
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,result_reg,0,ip);
if (t1.mode)
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,result_reg,0,ip);
}
+188 -291
View File
@@ -1,55 +1,43 @@
U0 ICUnaries(CIntermediateCode *tempi,I64 op,I64 ip)
{
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICSlashOp(tempi,TY_REG+RT_I64,REG_RAX,0,op,ip);
ICSlashOp(tempi,MDF_REG+RT_I64,REG_RAX,0,op,ip);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICNot(CIntermediateCode *tempi,I64 ip)
{
I64 i;
if (tempi->a1.type&RT_MASK<=RT_U8 &&
TY_DISP<=tempi->a1.type&TY_MASK<=TY_RIP_DISP32) {
if (tempi->a1.type.raw_type<=RT_U8 && tempi->a1.type&MDG_DISP_SIB_RIP) {
i=ICModr1(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp);
ICRex(tempi,i.u8[1]);
ICU16(tempi,i.u8[2]<<8+0xF6); //TEST ?,0xFF
ICModr2(tempi,i,tempi->a1.disp,ip+5);
ICU8(tempi,0xFF);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICTest(tempi,REG_RAX);
}
ICU24(tempi,0xC0940F); //SETZ AL
ICU32(tempi,0xC0B60F48); //MOVZX RAX,AL
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_U64,REG_RAX,0,ip);
MDF_REG+RT_U64,REG_RAX,0,ip);
}
U0 ICAndAnd(CIntermediateCode *tempi,I64 ip)
{
I64 r2;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.type&TY_MASK!=TY_REG || tempi->a1.reg==REG_RAX) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->a1.type&TY_MASK!=TY_REG || tempi->a1.reg==REG_RAX) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
}
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (!(tempi->a1.type&MDF_REG) || tempi->a1.reg==REG_RAX) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
ICZero(tempi,REG_RAX);
ICTest(tempi,r2);
ICU16(tempi,0x0874);
@@ -57,31 +45,20 @@ U0 ICAndAnd(CIntermediateCode *tempi,I64 ip)
ICU16(tempi,0x0374);
ICU24(tempi,0xC0FF48);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICOrOr(CIntermediateCode *tempi,I64 ip)
{
I64 i=0x48,r2;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.type&TY_MASK!=TY_REG || tempi->a1.reg==REG_RAX) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->a1.type&TY_MASK!=TY_REG || tempi->a1.reg==REG_RAX) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
}
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (!(tempi->a1.type&MDF_REG) || tempi->a1.reg==REG_RAX) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
if (r2>7) {
i++;
@@ -92,31 +69,20 @@ U0 ICOrOr(CIntermediateCode *tempi,I64 ip)
ICU16(tempi,0x0374);
ICU24(tempi,0xC0FF48);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICXorXor(CIntermediateCode *tempi,I64 ip)
{
I64 r2;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.type&TY_MASK!=TY_REG) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->a1.type&TY_MASK!=TY_REG) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
}
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (!(tempi->a1.type&MDF_REG)) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
ICZero(tempi,REG_RBX);
ICTest(tempi,r2);
ICU16(tempi,0x0374);
@@ -130,16 +96,16 @@ U0 ICXorXor(CIntermediateCode *tempi,I64 ip)
ICU24(tempi,0xC33348);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICCmp(CIntermediateCode *tempi,I64 us,I64 is,I64 ip)
{
I64 r1,d1,r2,i=0x48,j=tempi->a2.disp;
if (tempi->a2.type&TY_MASK==TY_IMM && MIN_I32<=j<=MAX_I32) {
if (tempi->a2.type&MDF_IMM && MIN_I32<=j<=MAX_I32) {
if (!(tempi->ic_flags&(ICF_POP_CMP|ICF_PUSH_CMP)) &&
tempi->a1.type&TY_MASK==TY_DISP && //TODO
tempi->a1.type&RT_MASK>=RT_I64 && tempi->a1.reg!=REG_RAX) {
tempi->a1.type&MDF_DISP && //TODO
tempi->a1.type.raw_type>=RT_I64 && tempi->a1.reg!=REG_RAX) {
r1=tempi->a1.reg;
d1=tempi->a1.disp;
ICZero(tempi,REG_RAX);
@@ -167,10 +133,10 @@ U0 ICCmp(CIntermediateCode *tempi,I64 us,I64 is,I64 ip)
ICPopRegs(tempi,1<<REG_RCX);
r1=REG_RCX;
} else {
if (tempi->a1.type&TY_MASK==TY_REG && tempi->a1.reg!=REG_RAX)
if (tempi->a1.type&MDF_REG && tempi->a1.reg!=REG_RAX)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r1=REG_RCX;
}
@@ -187,53 +153,32 @@ U0 ICCmp(CIntermediateCode *tempi,I64 us,I64 is,I64 ip)
}
}
if (tempi->ic_flags & ICF_PUSH_CMP)
ICPush(tempi,TY_IMM+RT_I64,0,j,ip);
if (tempi->ic_class->raw_type&1 || tempi->ic_flags & ICF_USE_UNSIGNED)
ICPush(tempi,MDF_IMM+RT_I64,0,j,ip);
if (tempi->ic_class->raw_type&RTF_UNSIGNED ||
tempi->ic_flags & ICF_USE_UNSIGNED)
is=us;
ICU16(tempi,0x300+is);
ICU24(tempi,0xC0FF48);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->ic_flags & ICF_POP_CMP) {
ICPopRegs(tempi,1<<REG_RCX);
r1=REG_RCX;
} else {
if (tempi->a1.type&TY_MASK==TY_REG && tempi->a1.reg!=REG_RAX)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r1=REG_RCX;
}
}
if (tempi->a2.type&TY_MASK==TY_REG && tempi->a2.reg!=REG_RAX)
r2=tempi->a2.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
r2=REG_RDX;
}
if (tempi->a2.type&MDF_REG && tempi->a2.reg!=REG_RAX)
r2=tempi->a2.reg;
else {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
r2=REG_RCX;
}
if (tempi->ic_flags & ICF_POP_CMP) {
ICPopRegs(tempi,1<<REG_RDX);
r1=REG_RDX;
} else {
if (tempi->a2.type&TY_MASK==TY_REG && tempi->a2.reg!=REG_RAX)
r2=tempi->a2.reg;
if (tempi->a1.type&MDF_REG && tempi->a1.reg!=REG_RAX)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
r2=REG_RCX;
}
if (tempi->ic_flags & ICF_POP_CMP) {
ICPopRegs(tempi,1<<REG_RDX);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r1=REG_RDX;
} else {
if (tempi->a1.type&TY_MASK==TY_REG && tempi->a1.reg!=REG_RAX)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r1=REG_RDX;
}
}
}
ICZero(tempi,REG_RAX);
@@ -244,12 +189,13 @@ U0 ICCmp(CIntermediateCode *tempi,I64 us,I64 is,I64 ip)
if (tempi->ic_flags & ICF_PUSH_CMP)
ICPushRegs(tempi,1<<r2);
ICU24(tempi,0xC03B00+i+(r2&7)<<16+(r1&7)<<19);
if (tempi->ic_class->raw_type&1 || tempi->ic_flags & ICF_USE_UNSIGNED)
if (tempi->ic_class->raw_type&RTF_UNSIGNED ||
tempi->ic_flags & ICF_USE_UNSIGNED)
is=us;
ICU16(tempi,0x300+is);
ICU24(tempi,0xC0FF48);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
}
@@ -258,85 +204,50 @@ U0 ICBitOps(CIntermediateCode *tempi,CICArg *a1,CICArg *a2,
{//TODO:not fully utilizing Modr
Bool no_depend=ToBool(tempi2->ic_flags&ICF_NO_DEPEND_RESULT);
I64 r1,t2,r2,d2,i=0x48;
if (tempi->ic_flags & ICF_NOT_ADDR) {
t2=a2->type&TY_MASK+RT_I64; //TODO: check overflow
if (tempi->ic_flags & ICF_BY_VAL) {
t2=a2->type&MDG_MASK+RT_I64; //TODO: check overflow
r2=a2->reg;
d2=a2->disp;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (a1->type&TY_MASK==TY_REG && (a1->reg!=REG_RAX||no_depend))
r1=a1->reg;
else if (a1->type&TY_MASK!=TY_IMM || a1->disp>63) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
r1=REG_RCX;
} else
r1=0;
if (!(TY_REG<=t2&TY_MASK<=TY_RIP_DISP32) ||
!(r2.u8[0]!=REG_RAX&&(t2&TY_MASK!=TY_SIB||r2.u8[1]&15!=REG_RAX)||
no_depend)) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,t2,r2,d2,ip);
t2=TY_REG+RT_I64;
r2=REG_RDX;
d2=0;
}
} else {
if (!(TY_REG<=t2&TY_MASK<=TY_RIP_DISP32) ||
!(r2.u8[0]!=REG_RAX&&(t2&TY_MASK!=TY_SIB||r2.u8[1]&15!=REG_RAX)||
no_depend)) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
t2=TY_REG+RT_I64;
r2=REG_RCX;
d2=0;
}
if (a1->type&TY_MASK==TY_REG && (a1->reg!=REG_RAX||no_depend))
r1=a1->reg;
else if (a1->type&TY_MASK!=TY_IMM || a1->disp>63) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
r1=REG_RDX;
} else
r1=0;
if (!(t2&MDG_REG_DISP_SIB_RIP) || !(r2.u8[0]!=REG_RAX&&(!(t2&MDF_SIB) ||
r2.u8[1]&15!=REG_RAX) || no_depend)) {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
t2=MDF_REG+RT_I64;
r2=REG_RCX;
d2=0;
}
if (a1->type&MDF_REG && (a1->reg!=REG_RAX||no_depend))
r1=a1->reg;
else if (!(a1->type&MDF_IMM) || a1->disp>63) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
r1=REG_RDX;
} else
r1=0;
} else {
t2=TY_DISP+RT_I64;
t2=MDF_DISP+RT_I64;
d2=0;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (a1->type&TY_MASK==TY_REG && (a1->reg!=REG_RAX||no_depend))
r1=a1->reg;
else if (a1->type&TY_MASK!=TY_IMM || a1->disp>63) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
r1=REG_RCX;
} else
r1=0;
if (a2->type&TY_MASK==TY_REG && (a2->reg!=REG_RAX||no_depend))
r2=a2->reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a2->type,a2->reg,a2->disp,ip);
r2=REG_RDX;
}
} else {
if (a2->type&TY_MASK==TY_REG && (a2->reg!=REG_RAX||no_depend))
r2=a2->reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip);
r2=REG_RCX;
}
if (a1->type&TY_MASK==TY_REG && (a1->reg!=REG_RAX||no_depend))
r1=a1->reg;
else if (a1->type&TY_MASK!=TY_IMM || a1->disp>63) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
r1=REG_RDX;
} else
r1=0;
if (a2->type&MDF_REG && (a2->reg!=REG_RAX||no_depend))
r2=a2->reg;
else {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip);
r2=REG_RCX;
}
if (a1->type&MDF_REG && (a1->reg!=REG_RAX||no_depend))
r1=a1->reg;
else if (!(a1->type&MDF_IMM) || a1->disp>63) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
r1=REG_RDX;
} else
r1=0;
}
if (!no_depend)
ICZero(tempi,REG_RAX);
if (tempi->ic_flags&ICF_LOCK && op!=0xA30F)
ICU8(tempi,OC_LOCK_PREFIX);
if (a1->type&TY_MASK==TY_IMM && a1->disp<32)
t2=t2&TY_MASK+RT_U32;
if (a1->type&MDF_IMM && a1->disp<32)
t2=t2&MDG_MASK+RT_U32;
i=ICModr1(r1,t2,r2,d2);
ICRex(tempi,i.u8[1]);
if (a1->type&TY_MASK==TY_IMM && a1->disp<64) {
if (a1->type&MDF_IMM && a1->disp<64) {
ICU24(tempi,i.u8[2]<<16+op_imm);
ICModr2(tempi,i,d2,ip+5);
ICU8(tempi,a1->disp);
@@ -346,15 +257,15 @@ U0 ICBitOps(CIntermediateCode *tempi,CICArg *a1,CICArg *a2,
}
if (!no_depend) {
ICU32(tempi,0xD08348);
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
}
U0 ICToUpper(CIntermediateCode *tempi,I64 ip)
{
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICU32(tempi,0x61F88348);
ICU16(tempi,0x0A7C);
@@ -378,10 +289,10 @@ U0 ICToF64(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip)
U0 ICToBool(CCmpCtrl *,CIntermediateCode *tempi,I64 ip)
{
I64 r;
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->a1.type&MDF_REG)
r=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RAX;
}
@@ -394,40 +305,40 @@ U0 ICPreIncDec(CIntermediateCode *tempi,I64 op,I64 ip)
{
I64 r;
CHashClass *tempc=tempi->ic_class,*tempc1=tempc-1;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->ic_flags & ICF_BY_VAL) {
if (tempc->ptr_stars_cnt && tempc1->size!=1) {
ICAddSubEctImm(tempi,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,tempc1->size,op.u16[3],ip);
} else
ICSlashOp(tempi,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,op,ip);
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
} else {
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->a1.type&MDF_REG)
r=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RCX;
}
if (tempc->ptr_stars_cnt &&
tempc1->size!=1) {
ICAddSubEctImm(tempi,TY_DISP+tempi->a1.type_pointed_to,r,0,
TY_DISP+tempi->a1.type_pointed_to,r,0,
ICAddSubEctImm(tempi,MDF_DISP+tempi->a1.type_pointed_to,r,0,
MDF_DISP+tempi->a1.type_pointed_to,r,0,
tempc1->size,op.u16[3],ip);
} else
ICSlashOp(tempi,
TY_DISP+tempi->a1.type_pointed_to,r,0,op,ip);
if (tempi->r.type&TY_MASK)
MDF_DISP+tempi->a1.type_pointed_to,r,0,op,ip);
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+tempi->a1.type_pointed_to,r,0,ip);
MDF_DISP+tempi->a1.type_pointed_to,r,0,ip);
}
}
@@ -435,82 +346,83 @@ U0 ICPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip)
{
I64 r;
CHashClass *tempc=tempi->ic_class,*tempc1=tempc-1;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->r.type&TY_MASK)
if (tempi->ic_flags & ICF_BY_VAL) {
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
if (tempc->ptr_stars_cnt && tempc1->size!=1)
ICAddSubEctImm(tempi,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,op,ip);
} else {
if (tempi->a1.type&TY_MASK==TY_REG &&
!(tempi->r.type&TY_MASK==TY_REG && tempi->r.reg==tempi->a1.reg))
if (tempi->a1.type&MDF_REG &&
!(tempi->r.type&MDF_REG && tempi->r.reg==tempi->a1.reg))
r=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RCX;
}
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+tempi->a1.type_pointed_to,r,0,ip);
MDF_DISP+tempi->a1.type_pointed_to,r,0,ip);
if (tempc->ptr_stars_cnt && tempc1->size!=1)
ICAddSubEctImm(tempi,TY_DISP+tempi->a1.type_pointed_to,r,0,
TY_DISP+tempi->a1.type_pointed_to,r,0,tempc1->size,op.u16[3],ip);
ICAddSubEctImm(tempi,MDF_DISP+tempi->a1.type_pointed_to,r,0,
MDF_DISP+tempi->a1.type_pointed_to,r,0,tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,TY_DISP+tempi->a1.type_pointed_to,r,0,op,ip);
ICSlashOp(tempi,MDF_DISP+tempi->a1.type_pointed_to,r,0,op,ip);
}
}
U0 ICDerefPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip)
{
I64 t,r;
CICType t;
I64 r;
CHashClass *tempc1=tempi->ic_class;
t=tempi->r.type&RT_MASK;
t=tempi->r.type.raw_type;
if (t>tempi->a1.type_pointed_to)
t=tempi->a1.type_pointed_to;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->ic_flags & ICF_BY_VAL) {
if (tempi->a1.type&MDF_REG)
r=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RDX;
}
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+t,r,0,ip);
MDF_DISP+t,r,0,ip);
if (tempc1->size!=1)
ICAddSubEctImm(tempi,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,
tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,op,ip);
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,op,ip);
} else {
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->a1.type&MDF_REG)
r=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RCX;
}
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_DISP+RT_I64,r,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_I64,r,0,ip);
if (tempc1->size!=1)
ICAddSubEctImm(tempi,TY_DISP+RT_I64,r,0,TY_DISP+RT_I64,r,0,
ICAddSubEctImm(tempi,MDF_DISP+RT_I64,r,0,MDF_DISP+RT_I64,r,0,
tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,TY_DISP+RT_I64,r,0,op,ip);
ICSlashOp(tempi,MDF_DISP+RT_I64,r,0,op,ip);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+t,REG_RDX,0,ip);
MDF_DISP+t,REG_RDX,0,ip);
}
}
@@ -518,70 +430,72 @@ U0 ICAssignPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip)
{
CHashClass *tempc1=tempi->ic_class2-1;
I64 r;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->ic_flags & ICF_BY_VAL) {
if (tempi->a1.type&MDF_REG)
r=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RDX;
}
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,r,0,
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,r,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempc1->size!=1 || tempi->a1.type&TY_MASK==TY_STK)
if (tempc1->size!=1 || tempi->a1.type&MDF_STK)
ICAddSubEctImm(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
TY_REG+RT_I64,r,0,tempc1->size,op.u16[3],ip);
MDF_REG+RT_I64,r,0,tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,op,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,TY_DISP+RT_I64,REG_RDX,0,ip);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_I64,REG_RDX,0,ip);
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempc1->size!=1)
ICAddSubEctImm(tempi,TY_DISP+RT_I64,REG_RDX,0,
TY_REG+RT_I64,REG_RCX,0,tempc1->size,op.u16[3],ip);
ICAddSubEctImm(tempi,MDF_DISP+RT_I64,REG_RDX,0,
MDF_REG+RT_I64,REG_RCX,0,tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,TY_DISP+RT_I64,REG_RDX,0,op,ip);
ICSlashOp(tempi,MDF_DISP+RT_I64,REG_RDX,0,op,ip);
}
}
U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip,
I64 us,I64 is,I64 not_us,I64 not_is,U8 *buf,I64 ip2)
{
I64 r1,r2,i=0x48,j,t1,t2,result_reg;
I64 r1,r2,i=0x48,j,result_reg;
CICType t1,t2;
Bool short_jmp,swap,done;
CCodeMisc *lb;
CICArg *a1=&tempi->a1,*a2=&tempi->a2;
j=a1->disp;
if (a1->type&TY_MASK==TY_IMM && MIN_I32<=j<=MAX_I32) {
if (a1->type&MDF_IMM && MIN_I32<=j<=MAX_I32) {
SwapI64(&a1,&a2);
swap=TRUE;
us=not_us;
is=not_is;
} else
swap=FALSE;
if (tempi->ic_class->raw_type&1 || tempi->ic_flags & ICF_USE_UNSIGNED)
if (tempi->ic_class->raw_type&RTF_UNSIGNED ||
tempi->ic_flags & ICF_USE_UNSIGNED)
is=us;
j=a2->disp;
if (a2->type&TY_MASK==TY_IMM && MIN_I32<=j<=MAX_I32) {
if (!has_result && TY_REG<=a1->type&TY_MASK<=TY_RIP_DISP32)
if (a2->type&MDF_IMM && MIN_I32<=j<=MAX_I32) {
if (!has_result && a1->type&MDG_REG_DISP_SIB_RIP)
ICAddSubEctImm(tempi,a1->type,a1->reg,a1->disp,
a1->type,a1->reg,a1->disp,j,0x073B,ip2);
else {
if (a1->type&TY_MASK==TY_REG)
if (a1->type&MDF_REG)
r1=a1->reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
r1=REG_RDX;
}
if (!j) {
@@ -613,7 +527,7 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip,
}
if (has_result) {
if (!swap) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,TY_IMM+RT_I64,0,j,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,MDF_IMM+RT_I64,0,j,ip2);
result_reg=REG_RCX;
} else
result_reg=r1;
@@ -624,10 +538,9 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip,
r1=a1->reg;
r2=a2->reg;
t2=a2->type;
if (t2&RT_MASK>=RT_I64 && !has_result &&
TY_DISP<=t2&TY_MASK<=TY_RIP_DISP32) {
if (t1&TY_MASK!=TY_REG || t1&RT_MASK<RT_I64) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip2);
if (t2.raw_type>=RT_I64 && !has_result && t2&MDG_DISP_SIB_RIP) {
if (!(t1&MDF_REG) || t1.raw_type<RT_I64) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip2);
r1=REG_RAX;
}
i=ICModr1(r1,t2,r2,a2->disp);
@@ -635,13 +548,13 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip,
ICU16(tempi,i.u8[2]<<8+0x3B);
ICModr2(tempi,i,a2->disp,ip2+4);
done=TRUE;
} else if (t1&RT_MASK>=RT_I64 && TY_REG<=t1&TY_MASK<=TY_RIP_DISP32) {
if (t2&TY_MASK!=TY_REG || t2&RT_MASK<RT_I64) {
if (t1&TY_MASK==TY_REG && r1==REG_RAX) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
} 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(tempi,MDF_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
r2=REG_RCX;
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
r2=REG_RAX;
}
}
@@ -654,32 +567,17 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip,
done=TRUE;
}
if (!done) {
if (tempi->ic_flags & ICF_A1_FIRST) {
if (a1->type&TY_MASK==TY_REG)
r1=a1->reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip2);
r1=REG_RAX;
}
if (a2->type&TY_MASK==TY_REG)
r2=a2->reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
r2=REG_RCX;
}
} else {
if (a2->type&TY_MASK==TY_REG)
r2=a2->reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
r2=REG_RAX;
}
if (a1->type&TY_MASK==TY_REG)
r1=a1->reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip2);
r1=REG_RCX;
}
if (a2->type&MDF_REG)
r2=a2->reg;
else {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
r2=REG_RAX;
}
if (a1->type&MDF_REG)
r1=a1->reg;
else {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip2);
r1=REG_RCX;
}
if (r2>7)
i++;
@@ -730,7 +628,7 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip,
}
if (has_result)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,result_reg,0,ip2);
MDF_REG+RT_I64,result_reg,0,ip2);
}
U0 ICTestAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
@@ -739,16 +637,15 @@ U0 ICTestAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
Bool short_jmp;
CCodeMisc *lb;
if (tempi->a1.type&TY_MASK!=TY_REG) {
if (tempi->a1.type&RT_MASK<=RT_U8 &&
TY_DISP<=tempi->a1.type&TY_MASK<=TY_RIP_DISP32) {
if (!(tempi->a1.type&MDF_REG)) {
if (tempi->a1.type.raw_type<=RT_U8 && tempi->a1.type&MDG_DISP_SIB_RIP) {
i=ICModr1(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp);
ICRex(tempi,i.u8[1]);
ICU16(tempi,i.u8[2]<<8+0xF6);
ICModr2(tempi,i,tempi->a1.disp,ip2+5);
ICU8(tempi,0xFF);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICTest(tempi,REG_RAX);
}
+235 -397
View File
@@ -6,7 +6,7 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
CCodeMisc *lb;
CICArg *a1,*a2;
if (tempi->a1.type&TY_MASK==TY_IMM) {
if (tempi->a1.type&MDF_IMM) {
swap=TRUE;
a1=&tempi->a2;
a2=&tempi->a1;
@@ -16,19 +16,19 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
a2=&tempi->a2;
}
if (a2->type&TY_MASK==TY_IMM && a2->disp>MAX_U32)
if (a2->type&MDF_IMM && a2->disp>MAX_U32)
override=TRUE;
else
override=FALSE;
if (a1->type&RT_MASK<a2->type&RT_MASK)
it=a1->type&RT_MASK;
if (a1->type.raw_type<a2->type.raw_type)
it=a1->type.raw_type;
else
it=a2->type&RT_MASK;
it=a2->type.raw_type;
i=a2->disp;
if (a2->type&TY_MASK==TY_IMM && i<=MAX_U32) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip2);
if (a2->type&MDF_IMM && i<=MAX_U32) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip2);
if (i<=MAX_U8)
ICU16(tempi,i<<8+0xA8);
else if (i<=MAX_U16)
@@ -38,51 +38,51 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
ICU32(tempi,i);
}
} else {
t1=TY_REG+it;
t1=MDF_REG+it;
d1=0;
if ((tempi->ic_flags&ICF_A1_FIRST ^^swap)&&!override) {
if (a1->type&TY_MASK==TY_REG) {
if (swap && !override) {
if (a1->type&MDF_REG) {
r1=a1->reg;
swap=TRUE;
} else {
r1=REG_RCX;
swap=FALSE;
}
if (a2->type&TY_MASK==TY_REG) {
if (a2->type&MDF_REG) {
r2=a2->reg;
swap=FALSE;
} else
r2=REG_RDX;
if (swap) {
if (a1->type&TY_MASK!=TY_REG || r1!=a1->reg)
ICMov(tempi,TY_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
if (TY_REG<=a2->type&TY_MASK<=TY_RIP_DISP32) {
t1=a2->type&TY_MASK+it;
if (!(a1->type&MDF_REG) || r1!=a1->reg)
ICMov(tempi,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;
} else
ICMov(tempi,TY_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
i=ICModr1(r1,t1,r2,d1);
} else {
if (TY_REG<=a1->type&TY_MASK<=TY_RIP_DISP32) {
t1=a1->type&TY_MASK+it;
if (a1->type&MDG_REG_DISP_SIB_RIP) {
t1=a1->type&MDG_MASK+it;
r1=a1->reg;
d1=a1->disp;
} else
ICMov(tempi,TY_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
if (a2->type&TY_MASK!=TY_REG || r2!=a2->reg)
ICMov(tempi,TY_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
if (!(a2->type&MDF_REG) || r2!=a2->reg)
ICMov(tempi,MDF_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
i=ICModr1(r2,t1,r1,d1);
}
} else {
if (a2->type&TY_MASK==TY_REG) {
if (a2->type&MDF_REG) {
r2=a2->reg;
swap=FALSE;
} else {
r2=REG_RDX;
swap=TRUE;
}
if (a1->type&TY_MASK==TY_REG) {
if (a1->type&MDF_REG) {
r1=a1->reg;
swap=TRUE;
} else
@@ -90,24 +90,24 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
if (override)
swap=FALSE;
if (swap) {
if (TY_REG<=a2->type&TY_MASK<=TY_RIP_DISP32) {
t1=a2->type&TY_MASK+it;
if (a2->type&MDG_REG_DISP_SIB_RIP) {
t1=a2->type&MDG_MASK+it;
r2=a2->reg;
d1=a2->disp;
} else
ICMov(tempi,TY_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
if (a1->type&TY_MASK!=TY_REG || r1!=a1->reg)
ICMov(tempi,TY_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
if (!(a1->type&MDF_REG) || r1!=a1->reg)
ICMov(tempi,MDF_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
i=ICModr1(r1,t1,r2,d1);
} else {
if (a2->type&TY_MASK!=TY_REG || r2!=a2->reg)
ICMov(tempi,TY_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
if (TY_REG<=a1->type&TY_MASK<=TY_RIP_DISP32) {
t1=a1->type&TY_MASK+it;
if (!(a2->type&MDF_REG) || r2!=a2->reg)
ICMov(tempi,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;
} else
ICMov(tempi,TY_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
i=ICModr1(r2,t1,r1,d1);
}
}
@@ -159,33 +159,31 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
U0 ICAssign(CIntermediateCode *tempi,I64 ip)
{
CIntermediateCode *tempi1;
if (tempi->ic_flags & ICF_NOT_ADDR) {
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
if (tempi->ic_flags & ICF_BY_VAL) {
ICMov(tempi,tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->r.type&TY_MASK) {
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->r.type.mode) {
if (tempi->a1.type&MDF_REG)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
else
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
}
} else {
if (tempi->a1.type&TY_MASK==TY_REG) {
if (!(tempi1=OptLag1(tempi)) ||
tempi1->ic_code!=IC_ADD_CONST ||
tempi1->r.type!=TY_REG+RT_I64 || tempi1->r.reg!=tempi->a1.reg ||
tempi1->a1.type!=TY_REG+RT_I64 || tempi1->a1.reg!=tempi->a1.reg ||
(tempi->a2.type&TY_MASK==TY_REG||tempi->a2.type&TY_MASK==TY_DISP) &&
if (tempi->a1.type&MDF_REG) {
if (!(tempi1=OptLag1(tempi)) || tempi1->ic_code!=IC_ADD_CONST ||
tempi1->r.type!=MDF_REG+RT_I64 || tempi1->r.reg!=tempi->a1.reg ||
tempi1->a1.type!=MDF_REG+RT_I64 || tempi1->a1.reg!=tempi->a1.reg ||
(tempi->a2.type&MDF_REG || tempi->a2.type&MDF_DISP) &&
tempi->a2.reg==tempi->a1.reg ||
tempi->r.type&TY_MASK ||
tempi1->ic_flags&~ICG_NO_CVT_MASK) {
tempi->r.type.mode || tempi1->ic_flags&~ICG_NO_CVT_MASK) {
ICMov(tempi,
TY_DISP+tempi->a1.type_pointed_to,tempi->a1.reg,tempi->a1.disp,
MDF_DISP+tempi->a1.type_pointed_to,tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
@@ -193,16 +191,16 @@ U0 ICAssign(CIntermediateCode *tempi,I64 ip)
~ICF_CODE_FINAL|ICF_DONT_RESTORE;
tempi->a1.disp=tempi1->ic_data;
OptSetNOP1(tempi1); //This better not be last pass!
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
}
@@ -217,135 +215,80 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,
Bool short_jmp;
CCodeMisc *lb;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->ic_flags & ICF_A1_FIRST) {
if (!(tempi->ic_flags&ICF_SWAP) && a1->type&TY_MASK!=TY_REG &&
(a1->type&TY_MASK!=TY_IMM || a1->disp>63) ||
tempi->ic_flags&ICF_SWAP && a1->type&TY_MASK==TY_IMM &&
a1->disp<64 || a1->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip2);
t1=TY_REG+RT_I64;
r1=REG_RCX;
d1=0;
} else {
t1=a1->type;
if (t1&TY_MASK==TY_IMM && a1->disp<64)
r1=0;
else
r1=a1->reg;
d1=a1->disp;
}
if (tempi->ic_flags&ICF_SWAP && a2->type&TY_MASK!=TY_REG &&
(a2->type&TY_MASK!=TY_IMM || a2->disp>63) ||
!(tempi->ic_flags&ICF_SWAP) && a2->type&TY_MASK==TY_IMM &&
a2->disp<64 || a2->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a2->type,a2->reg,a2->disp,ip2);
t2=TY_REG+RT_I64;
r2=REG_RDX;
d2=0;
} else {
t2=a2->type;
if (t2&TY_MASK==TY_IMM && a2->disp<64)
r2=0;
else
r2=a2->reg;
d2=a2->disp;
}
if (tempi->ic_flags & ICF_BY_VAL) {
if (tempi->ic_flags&ICF_SWAP && !(a2->type&MDF_REG) &&
(!(a2->type&MDF_IMM) ||a2->disp>63)||
!(tempi->ic_flags&ICF_SWAP) && a2->type&MDF_IMM &&
a2->disp<64 || a2->type&MDF_STK) {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
t2=MDF_REG+RT_I64;
r2=REG_RCX;
d2=0;
} else {
if (tempi->ic_flags&ICF_SWAP && a2->type&TY_MASK!=TY_REG &&
(a2->type&TY_MASK!=TY_IMM ||a2->disp>63)||
!(tempi->ic_flags&ICF_SWAP) && a2->type&TY_MASK==TY_IMM &&
a2->disp<64 || a2->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
t2=TY_REG+RT_I64;
r2=REG_RCX;
d2=0;
} else {
t2=a2->type;
if (t2&TY_MASK==TY_IMM && a2->disp<64)
r2=0;
else
r2=a2->reg;
d2=a2->disp;
}
if (!(tempi->ic_flags&ICF_SWAP) && a1->type&TY_MASK!=TY_REG &&
(a1->type&TY_MASK!=TY_IMM || a1->disp>63) ||
tempi->ic_flags&ICF_SWAP && a1->type&TY_MASK==TY_IMM &&
a1->disp<64 || a1->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
t1=TY_REG+RT_I64;
r1=REG_RDX;
d1=0;
} else {
t1=a1->type;
if (t1&TY_MASK==TY_IMM && a1->disp<64)
r1=0;
else
r1=a1->reg;
d1=a1->disp;
}
t2=a2->type;
if (t2&MDF_IMM && a2->disp<64)
r2=0;
else
r2=a2->reg;
d2=a2->disp;
}
if (!(tempi->ic_flags&ICF_SWAP) && !(a1->type&MDF_REG) &&
(!(a1->type&MDF_IMM) || a1->disp>63) ||
tempi->ic_flags&ICF_SWAP && a1->type&MDF_IMM &&
a1->disp<64 || a1->type&MDF_STK) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
t1=MDF_REG+RT_I64;
r1=REG_RDX;
d1=0;
} else {
t1=a1->type;
if (t1&MDF_IMM && a1->disp<64)
r1=0;
else
r1=a1->reg;
d1=a1->disp;
}
} else {
t1=TY_DISP+RT_I64;
t2=TY_DISP+RT_I64;
t1=MDF_DISP+RT_I64;
t2=MDF_DISP+RT_I64;
d1=0;
d2=0;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (a1->type&TY_MASK==TY_REG)
r1=a1->reg;
else if (tempi->ic_flags&ICF_SWAP || a1->type&TY_MASK!=TY_IMM ||
a1->disp>63) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip2);
r1=REG_RCX;
} else
r1=0;
if (a2->type&TY_MASK==TY_REG)
r2=a2->reg;
else if (!(tempi->ic_flags&ICF_SWAP) || a2->type&TY_MASK!=TY_IMM ||
a2->disp>63) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a2->type,a2->reg,a2->disp,ip2);
r2=REG_RDX;
} else
r2=0;
} else {
if (a2->type&TY_MASK==TY_REG)
r2=a2->reg;
else if (!(tempi->ic_flags&ICF_SWAP) || a2->type&TY_MASK!=TY_IMM ||
a2->disp>63) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
r2=REG_RCX;
} else
r2=0;
if (a1->type&TY_MASK==TY_REG)
r1=a1->reg;
else if (tempi->ic_flags&ICF_SWAP || a1->type&TY_MASK!=TY_IMM ||
a1->disp>63) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
r1=REG_RDX;
} else
r1=0;
}
if (a2->type&MDF_REG)
r2=a2->reg;
else if (!(tempi->ic_flags&ICF_SWAP) || !(a2->type&MDF_IMM) ||
a2->disp>63) {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
r2=REG_RCX;
} else
r2=0;
if (a1->type&MDF_REG)
r1=a1->reg;
else if (tempi->ic_flags&ICF_SWAP || !(a1->type&MDF_IMM) || a1->disp>63) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
r1=REG_RDX;
} else
r1=0;
}
if (tempi->ic_flags&ICF_LOCK && op!=0xA30F)
ICU8(tempi,OC_LOCK_PREFIX);
if (tempi->ic_flags&ICF_SWAP) {
if (a2->type&TY_MASK==TY_IMM && a2->disp<32) {
if (a2->type&MDF_IMM && a2->disp<32) {
if (op==0xA30F && a2->disp<8) {
t=t1&TY_MASK+RT_U8;
t=t1&MDG_MASK+RT_U8;
op_imm=0xF6; //TEST
} else
t=t1&TY_MASK+RT_U32;
t=t1&MDG_MASK+RT_U32;
} else
t=t1;
i=ICModr1(r2,t,r1,d1);
SwapI64(&a1,&a2);
} else {
if (a1->type&TY_MASK==TY_IMM && a1->disp<32) {
if (a1->type&MDF_IMM && a1->disp<32) {
if (op==0xA30F && a1->disp<8) {
t=t2&TY_MASK+RT_U8;
t=t2&MDG_MASK+RT_U8;
op_imm=0xF6; //TEST
} else
t=t2&TY_MASK+RT_U32;
t=t2&MDG_MASK+RT_U32;
} else
t=t2;
i=ICModr1(r1,t,r2,d2);
@@ -359,7 +302,7 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,
is=0x75850F;
else
is=0x74840F;
} else if (a1->type&TY_MASK==TY_IMM && a1->disp<64) {
} else if (a1->type&MDF_IMM && a1->disp<64) {
ICU24(tempi,i.u8[2]<<16+op_imm);
ICModr2(tempi,i,a2->disp,ip2+5);
ICU8(tempi,a1->disp);
@@ -398,111 +341,77 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,
U0 ICQueInit(CIntermediateCode *tempi,I64 ip2)
{
I64 r1;
if (tempi->a1.type==TY_REG+RT_I64)
if (tempi->a1.type==MDF_REG+RT_I64)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RAX;
}
ICMov(tempi,TY_DISP+RT_I64,r1,0,TY_REG+RT_I64,r1,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,r1,sizeof(U8 *),TY_REG+RT_I64,r1,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r1,0,MDF_REG+RT_I64,r1,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r1,sizeof(U8 *),MDF_REG+RT_I64,r1,0,ip2);
}
U0 ICQueIns(CIntermediateCode *tempi,I64 ip2)
{
I64 r1,r2;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.type==TY_REG+RT_I64 && tempi->a1.reg!=REG_RAX)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RDX;
}
if (tempi->a2.type==TY_REG+RT_I64)
r2=tempi->a2.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r2=REG_RAX;
}
} else {
if (tempi->a2.type==TY_REG+RT_I64 && tempi->a2.reg!=REG_RDX)
r2=tempi->a2.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r2=REG_RAX;
}
if (tempi->a1.type==TY_REG+RT_I64)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RDX;
}
if (tempi->a2.type==MDF_REG+RT_I64 && tempi->a2.reg!=REG_RDX)
r2=tempi->a2.reg;
else {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r2=REG_RAX;
}
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,TY_DISP+RT_I64,r1,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,r1,0,TY_REG+RT_I64,r2,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,r2,0,TY_REG+RT_I64,REG_RBX,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,r2,sizeof(U8 *),TY_REG+RT_I64,r1,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,REG_RBX,sizeof(U8 *),TY_REG+RT_I64,r2,0,ip2);
if (tempi->a1.type==MDF_REG+RT_I64)
r1=tempi->a1.reg;
else {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RDX;
}
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,MDF_DISP+RT_I64,r1,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r1,0,MDF_REG+RT_I64,r2,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r2,0,MDF_REG+RT_I64,REG_RBX,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r2,sizeof(U8 *),MDF_REG+RT_I64,r1,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,REG_RBX,sizeof(U8 *),MDF_REG+RT_I64,r2,0,ip2);
}
U0 ICQueInsRev(CIntermediateCode *tempi,I64 ip2)
{
I64 r1,r2;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.type==TY_REG+RT_I64 && tempi->a1.reg!=REG_RAX)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RDX;
}
if (tempi->a2.type==TY_REG+RT_I64)
r2=tempi->a2.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r2=REG_RAX;
}
} else {
if (tempi->a2.type==TY_REG+RT_I64 && tempi->a2.reg!=REG_RDX)
r2=tempi->a2.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r2=REG_RAX;
}
if (tempi->a1.type==TY_REG+RT_I64)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RDX;
}
if (tempi->a2.type==MDF_REG+RT_I64 && tempi->a2.reg!=REG_RDX)
r2=tempi->a2.reg;
else {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r2=REG_RAX;
}
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,TY_DISP+RT_I64,r1,sizeof(U8 *),ip2);
ICMov(tempi,TY_DISP+RT_I64,REG_RBX,0,TY_REG+RT_I64,r2,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,r2,0,TY_REG+RT_I64,r1,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,r2,sizeof(U8 *),TY_REG+RT_I64,REG_RBX,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,r1,sizeof(U8 *),TY_REG+RT_I64,r2,0,ip2);
if (tempi->a1.type==MDF_REG+RT_I64)
r1=tempi->a1.reg;
else {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RDX;
}
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,MDF_DISP+RT_I64,r1,sizeof(U8 *),ip2);
ICMov(tempi,MDF_DISP+RT_I64,REG_RBX,0,MDF_REG+RT_I64,r2,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r2,0,MDF_REG+RT_I64,r1,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r2,sizeof(U8 *),MDF_REG+RT_I64,REG_RBX,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r1,sizeof(U8 *),MDF_REG+RT_I64,r2,0,ip2);
}
U0 ICQueRem(CIntermediateCode *tempi,I64 ip2)
{
I64 r1;
if (tempi->a1.type==TY_REG+RT_I64)
if (tempi->a1.type==MDF_REG+RT_I64)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RAX;
}
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,TY_DISP+RT_I64,r1,0,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_DISP+RT_I64,r1,sizeof(U8 *),ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,MDF_DISP+RT_I64,r1,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_I64,r1,sizeof(U8 *),ip2);
ICU24(tempi,0x1A8948);
ICU32(tempi,sizeof(U8 *)<<24+0x538948);
}
@@ -510,68 +419,34 @@ U0 ICQueRem(CIntermediateCode *tempi,I64 ip2)
U0 ICMinMax(CIntermediateCode *tempi,I64 op,I64 ip2)
{
I64 r1,i1=0x48;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.type==TY_REG+RT_I64 && tempi->a1.reg!=REG_RAX) {
r1=tempi->a1.reg;
if (r1>7) {
i1++;
r1&=7;
}
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
if (tempi->a2.reg==REG_RAX && TY_REG<=tempi->a2.type&TY_MASK<=TY_SIB) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RDX;
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
if (tempi->a2.type==TY_REG+RT_I64) {
r1=tempi->a2.reg;
if (r1>7) {
i1++;
r1&=7;
}
} else {
r1=REG_RDX;
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
}
}
if (tempi->a2.type==MDF_REG+RT_I64 && tempi->a2.reg!=REG_RAX) {
r1=tempi->a2.reg;
if (r1>7) {
i1++;
r1&=7;
}
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
} else {
if (tempi->a2.type==TY_REG+RT_I64 && tempi->a2.reg!=REG_RAX) {
r1=tempi->a2.reg;
if (r1>7) {
i1++;
r1&=7;
}
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
if (tempi->a1.reg==REG_RAX && tempi->a1.type&MDG_REG_DISP_SIB) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r1=REG_RDX;
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
} else {
if (tempi->a1.reg==REG_RAX && TY_REG<=tempi->a1.type&TY_MASK<=TY_SIB) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r1=REG_RDX;
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
if (tempi->a1.type==TY_REG+RT_I64) {
r1=tempi->a1.reg;
if (r1>7) {
i1++;
r1&=7;
}
} else {
r1=REG_RDX;
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
if (tempi->a1.type==MDF_REG+RT_I64) {
r1=tempi->a1.reg;
if (r1>7) {
i1++;
r1&=7;
}
} else {
r1=REG_RDX;
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
}
}
@@ -581,113 +456,83 @@ U0 ICMinMax(CIntermediateCode *tempi,I64 op,I64 ip2)
U0 ICSqr(CIntermediateCode *tempi,I64 op,I64 ip2)
{
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICSlashOp(tempi,TY_REG+RT_I64,REG_RAX,0,op,ip2);
ICSlashOp(tempi,MDF_REG+RT_I64,REG_RAX,0,op,ip2);
}
U0 ICModU64(CIntermediateCode *tempi,I64 ip2)
{
I64 t1,r1,d1;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.reg!=REG_RAX && tempi->a1.reg!=REG_RDX &&
TY_REG<=tempi->a1.type&TY_MASK<=TY_SIB &&
tempi->a1.type&RT_MASK>=RT_I64) {
t1=tempi->a1.type;
r1=tempi->a1.reg;
d1=tempi->a1.disp;
} else {
t1=TY_REG+RT_I64;
r1=REG_RBX;
d1=0;
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
CICType t1;
I64 r1,d1;
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
if (tempi->a1.reg!=REG_RAX && tempi->a1.reg!=REG_RDX &&
tempi->a1.type&MDG_REG_DISP_SIB &&
tempi->a1.type.raw_type>=RT_I64) {
t1=tempi->a1.type;
r1=tempi->a1.reg;
d1=tempi->a1.disp;
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
if (tempi->a1.reg!=REG_RAX && tempi->a1.reg!=REG_RDX &&
TY_REG<=tempi->a1.type&TY_MASK<=TY_SIB &&
tempi->a1.type&RT_MASK>=RT_I64) {
t1=tempi->a1.type;
r1=tempi->a1.reg;
d1=tempi->a1.disp;
} else {
t1=TY_REG+RT_I64;
r1=REG_RBX;
d1=0;
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
t1=MDF_REG+RT_I64;
r1=REG_RBX;
d1=0;
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,TY_DISP+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+RT_I64,REG_RCX,0,ip2);
ICZero(tempi,REG_RDX);
ICSlashOp(tempi,t1,r1,d1,SLASH_OP_DIV,ip2);
ICMov(tempi,TY_DISP+RT_I64,REG_RCX,0,TY_REG+RT_I64,REG_RAX,0,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_REG+RT_I64,REG_RDX,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,REG_RCX,0,MDF_REG+RT_I64,REG_RAX,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
MDF_REG+RT_I64,REG_RDX,0,ip2);
}
U0 ICSwap(CIntermediateCode *tempi,I64 ip2)
{
I64 r1,r2;
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->a1.type&MDF_REG)
r1=tempi->a1.reg;
else
r1=REG_RAX;
if (tempi->a2.type&TY_MASK==TY_REG)
if (tempi->a2.type&MDF_REG)
r2=tempi->a2.reg;
else
r2=REG_RAX;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (r1==r2) {
if (r2==REG_RAX)
r2=REG_RBX;
else
r1=REG_RAX;
}
ICMov(tempi,TY_REG+RT_I64,r1,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,r2,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
if (r1==r2) {
if (r1==REG_RAX)
r1=REG_RBX;
else
r2=REG_RAX;
}
ICMov(tempi,TY_REG+RT_I64,r2,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,r1,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
if (r1==r2) {
if (r1==REG_RAX)
r1=REG_RBX;
else
r2=REG_RAX;
}
ICMov(tempi,MDF_REG+RT_I64,r2,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,r1,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
switch (tempi->ic_code) {
case IC_SWAP_U8:
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,TY_DISP+RT_U8,r1,0,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_DISP+RT_U8,r2,0,ip2);
ICMov(tempi,TY_DISP+RT_U8,r2,0,TY_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,TY_DISP+RT_U8,r1,0,TY_REG+RT_I64,REG_RDX,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_U8,r1,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U8,r2,0,ip2);
ICMov(tempi,MDF_DISP+RT_U8,r2,0,MDF_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,MDF_DISP+RT_U8,r1,0,MDF_REG+RT_I64,REG_RDX,0,ip2);
break;
case IC_SWAP_U16:
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,TY_DISP+RT_U16,r1,0,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_DISP+RT_U16,r2,0,ip2);
ICMov(tempi,TY_DISP+RT_U16,r2,0,TY_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,TY_DISP+RT_U16,r1,0,TY_REG+RT_I64,REG_RDX,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_U16,r1,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U16,r2,0,ip2);
ICMov(tempi,MDF_DISP+RT_U16,r2,0,MDF_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,MDF_DISP+RT_U16,r1,0,MDF_REG+RT_I64,REG_RDX,0,ip2);
break;
case IC_SWAP_U32:
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,TY_DISP+RT_U32,r1,0,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_DISP+RT_U32,r2,0,ip2);
ICMov(tempi,TY_DISP+RT_U32,r2,0,TY_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,TY_DISP+RT_U32,r1,0,TY_REG+RT_I64,REG_RDX,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_U32,r1,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U32,r2,0,ip2);
ICMov(tempi,MDF_DISP+RT_U32,r2,0,MDF_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,MDF_DISP+RT_U32,r1,0,MDF_REG+RT_I64,REG_RDX,0,ip2);
break;
case IC_SWAP_I64:
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,TY_DISP+RT_U64,r1,0,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_DISP+RT_U64,r2,0,ip2);
ICMov(tempi,TY_DISP+RT_U64,r2,0,TY_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,TY_DISP+RT_U64,r1,0,TY_REG+RT_I64,REG_RDX,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_U64,r1,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U64,r2,0,ip2);
ICMov(tempi,MDF_DISP+RT_U64,r2,0,MDF_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,MDF_DISP+RT_U64,r1,0,MDF_REG+RT_I64,REG_RDX,0,ip2);
break;
}
}
@@ -695,14 +540,14 @@ U0 ICSwap(CIntermediateCode *tempi,I64 ip2)
U0 ICAndEqu(CIntermediateCode *tempi,I64 ip2)
{
I64 i,bit;
if (tempi->a2.type&TY_MASK==TY_IMM && tempi->a1.type&TY_MASK!=TY_STK &&
if (tempi->a2.type&MDF_IMM && !(tempi->a1.type&MDF_STK) &&
tempi->ic_flags&ICF_NO_DEPEND_RESULT) {
i=~tempi->a2.disp;
bit=Bsf(i);
if (0<=bit==Bsr(i)) {
tempi->a2.disp=bit;
tempi->a2.reg=0;
tempi->a1.type=tempi->a1.type&TY_MASK+RT_I64;
tempi->a1.type=tempi->a1.type&MDG_MASK+RT_I64;
ICBitOps(tempi,&tempi->a2,&tempi->a1,tempi,0xB30F,0x30BA0F,ip2);
return;
}
@@ -716,14 +561,14 @@ U0 ICAndEqu(CIntermediateCode *tempi,I64 ip2)
U0 ICOrEqu(CIntermediateCode *tempi,I64 ip2)
{
I64 i,bit;
if (tempi->a2.type&TY_MASK==TY_IMM && tempi->a1.type&TY_MASK!=TY_STK &&
if (tempi->a2.type&MDF_IMM && !(tempi->a1.type&MDF_STK) &&
tempi->ic_flags&ICF_NO_DEPEND_RESULT) {
i=tempi->a2.disp;
bit=Bsf(i);
if (0<=bit==Bsr(i) && i>MAX_I8) {
tempi->a2.disp=bit;
tempi->a2.reg=0;
tempi->a1.type=tempi->a1.type&TY_MASK+RT_I64;
tempi->a1.type=tempi->a1.type&MDG_MASK+RT_I64;
ICBitOps(tempi,&tempi->a2,&tempi->a1,tempi,0xAB0F,0x28BA0F,ip2);
return;
}
@@ -737,14 +582,14 @@ U0 ICOrEqu(CIntermediateCode *tempi,I64 ip2)
U0 ICXorEqu(CIntermediateCode *tempi,I64 ip2)
{
I64 i,bit;
if (tempi->a2.type&TY_MASK==TY_IMM && tempi->a1.type&TY_MASK!=TY_STK &&
if (tempi->a2.type&MDF_IMM && !(tempi->a1.type&MDF_STK) &&
tempi->ic_flags&ICF_NO_DEPEND_RESULT) {
i=tempi->a2.disp;
bit=Bsf(i);
if (0<=bit==Bsr(i)) {
tempi->a2.disp=bit;
tempi->a2.reg=0;
tempi->a1.type=tempi->a1.type&TY_MASK+RT_I64;
tempi->a1.type=tempi->a1.type&MDG_MASK+RT_I64;
ICBitOps(tempi,&tempi->a2,&tempi->a1,tempi,0xBB0F,0x38BA0F,ip2);
return;
}
@@ -762,17 +607,17 @@ U0 ICSwitch(CIntermediateCode *tempi,I64 ip,
CCodeMisc *lb;
Bool short_jmp;
CAOTAbsAddr *tempa;
if (tempi->a1.type&TY_MASK!=TY_REG || tempi->a1.reg&7==REG_RSP)
if (!(tempi->a1.type&MDF_REG) || tempi->a1.reg&7==REG_RSP)
r=REG_RDX;
else
r=tempi->a1.reg;
if (nobound)
ICMov(tempi,TY_REG+RT_I64,r,0,
ICMov(tempi,MDF_REG+RT_I64,r,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
else {
if (tempi->a2.type&TY_MASK==TY_IMM) {
if (tempi->a2.type&MDF_IMM) {
j=tempi->a2.disp;
ICMov(tempi,TY_REG+RT_I64,r,0,
ICMov(tempi,MDF_REG+RT_I64,r,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
if (MIN_I8<=j<=MAX_I8) {
i=0xF88348+(r&7)<<16;
@@ -785,24 +630,17 @@ U0 ICSwitch(CIntermediateCode *tempi,I64 ip,
ICU24(tempi,i);
ICU32(tempi,j);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
i=0xC13B48+(r&7)<<19;
if (r>7) i+=4;
ICU24(tempi,i);
}
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,r,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,r,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,r,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
i=0xC13B48+(r&7)<<19;
if (r>7) i+=4;
ICU24(tempi,i);
+112 -169
View File
@@ -21,17 +21,19 @@ U0 CmpNoteFloatOp(CCmpCtrl *cc,CIntermediateCode *tempi,
case CN_MAIN:
if (cc->last_float_op_ic!=tempi) {
if (cc->dont_push_float) {
if (!(tempi->ic_flags & ICF_A1_FIRST))
tempi->ic_flags|=ICF_ALTERNATE_TEMPLATE;
if (intermediate_code_table[tempi->ic_code].arg_cnt==IS_2_ARG &&
cc->last_float_op_ic->r.reg!=REG_R8)
tempi->ic_flags|=ICF_ALT_TEMPLATE;
else
tempi->ic_flags&=~ICF_ALTERNATE_TEMPLATE;
tempi->ic_flags&=~ICF_ALT_TEMPLATE;
link=TRUE;
}
} else {
if (cc->last_float_op_pos==CN_A1 ^^ !(tempi->ic_flags & ICF_A1_FIRST))
tempi->ic_flags|=ICF_ALTERNATE_TEMPLATE;
if (intermediate_code_table[tempi->ic_code].arg_cnt==IS_2_ARG &&
cc->last_float_op_pos!=CN_A1)
tempi->ic_flags|=ICF_ALT_TEMPLATE;
else
tempi->ic_flags&=~ICF_ALTERNATE_TEMPLATE;
tempi->ic_flags&=~ICF_ALT_TEMPLATE;
link=TRUE;
}
break;
@@ -79,7 +81,7 @@ U0 ICCopyTemplate(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,
U8 *ptr;
I64 i=0;
if (!off_the_record) {
if (tempi->ic_flags&ICF_ALTERNATE_TEMPLATE)
if (tempi->ic_flags&ICF_ALT_TEMPLATE)
alt=TRUE;
else
alt=FALSE;
@@ -118,8 +120,8 @@ U0 ICCopyTemplate(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,
tempi->ic_cnt+=i;
}
U0 ICFCvt(CCmpCtrl *cc,CIntermediateCode *tempi,
I64 r1,I64 t2,I64 r2,I64 d2,Bool to_int,I64 pos,I64 ip)
U0 ICFCvt(CCmpCtrl *cc,CIntermediateCode *tempi,I64 r1,
CICType t2,I64 r2,I64 d2,Bool to_int,I64 pos,I64 ip)
{
I64 rsp_size=0,op1,op2;
Bool dont_push_float,dont_pop_float;
@@ -134,12 +136,9 @@ U0 ICFCvt(CCmpCtrl *cc,CIntermediateCode *tempi,
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (!dont_push_float) {
if (!(t2&RT_MASK>=RT_I64 &&
(t2&TY_MASK==TY_DISP ||
t2&TY_MASK==TY_RIP_DISP32 ||
t2&TY_MASK==TY_SIB))) {
if (!(t2.raw_type>=RT_I64 && t2&MDG_DISP_SIB_RIP)) {
ICPush(tempi,t2,r2,d2,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size=8;
} else {
if (!dont_pop_float) {
@@ -162,13 +161,13 @@ U0 ICFCvt(CCmpCtrl *cc,CIntermediateCode *tempi,
if (rsp_size)
ICAddRSP(tempi,rsp_size);
} else {
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,op2,ip);
ICPop(tempi,TY_REG+RT_I64,r1,0,ip);
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,op2,ip);
ICPop(tempi,MDF_REG+RT_I64,r1,0,ip);
}
}
U0 ICFCvt2(CCmpCtrl *cc,CIntermediateCode *tempi,
I64 r1,I64 t2,I64 r2,I64 d2,Bool to_int,I64 ip)
U0 ICFCvt2(CCmpCtrl *cc,CIntermediateCode *tempi,I64 r1,
CICType t2,I64 r2,I64 d2,Bool to_int,I64 ip)
{
I64 rsp_size=0,op1,op2;
if (to_int) {
@@ -178,20 +177,17 @@ U0 ICFCvt2(CCmpCtrl *cc,CIntermediateCode *tempi,
op1=SLASH_OP_FILD;
op2=SLASH_OP_FSTP;
}
if (!(t2&RT_MASK>=RT_I64 &&
(t2&TY_MASK==TY_DISP ||
t2&TY_MASK==TY_RIP_DISP32 ||
t2&TY_MASK==TY_SIB))) {
if (!(t2.raw_type>=RT_I64 && t2&MDG_DISP_SIB_RIP)) {
ICPush(tempi,t2,r2,d2,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size=8;
} else {
rsp_size=8;
ICAddRSP(tempi,-8);
}
ICSlashOp(tempi,t2,r2,d2,op1,ip);
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,op2,ip);
ICPop(tempi,TY_REG+RT_I64,r1,0,ip);
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,op2,ip);
ICPop(tempi,MDF_REG+RT_I64,r1,0,ip);
cc->last_dont_pushable=cc->last_dont_popable=FALSE; //TODO: improve this
}
@@ -206,23 +202,20 @@ U0 ICFUnaryMinus(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf2,I64 ip)
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (!dont_push_float) {
if (a1->type&RT_MASK>=RT_I64 &&
(a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 ||
a1->type&TY_MASK==TY_SIB)) {
if (a1->type.raw_type>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
t1=a1->type;
r1=a1->reg;
d1=a1->disp;
} else {
if (a1->type&TY_MASK==TY_IMM) {
if (a1->type&MDF_IMM) {
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
t1=MDF_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
}
}
@@ -241,7 +234,7 @@ U0 ICFUnaryMinus(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf2,I64 ip)
if (rsp_size)
ICAddRSP(tempi,rsp_size);
} else {
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,ip);
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,ip);
ICPop(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,ip);
}
}
@@ -251,30 +244,23 @@ U0 ICFMod(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip)
Bool dont_push_float,dont_pop_float;
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (dont_push_float) {
if (tempi->ic_flags&ICF_ALTERNATE_TEMPLATE)
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
if (tempi->ic_flags&ICF_ALT_TEMPLATE)
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
else
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
//TODO: unpushable,unpop? Not sure
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_MAIN);
if (!dont_pop_float)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICFPow(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
@@ -284,17 +270,10 @@ U0 ICFPow(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
CHashExport *tempex=HashFind("SYS_POW",
cc->htc.hash_table_lst,HTT_EXPORT_SYS_SYM);
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
if (cc->flags&CCF_AOT_COMPILE) {
if (!tempex) {
tempex=CAlloc(sizeof(CHashExport));
@@ -354,17 +333,16 @@ U0 ICFPow(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
}
tempi->ic_flags&=~ICF_CODE_FINAL;
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICFOp(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
{//for ADD,SUB,DIV,MUL
CICArg *a1,*a2;
Bool dont_push_float,dont_pop_float,alt;
I64 rsp_size=0,builtin1=0,builtin2=0,
t1,r1,d1,t2,r2,d2;
I64 rsp_size=0,builtin1=0,builtin2=0,t1,r1,d1,t2,r2,d2;
if (tempi->ic_flags&ICF_ALTERNATE_TEMPLATE) {
if (tempi->ic_flags&ICF_ALT_TEMPLATE) {
a1=&tempi->a2;
a2=&tempi->a1;
alt=TRUE;
@@ -379,122 +357,115 @@ U0 ICFOp(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (dont_push_float) {
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
}
}
} else {
if (tempi->ic_flags & ICF_A1_FIRST^^alt) {
if (a2->type&TY_MASK!=TY_STK) {
if (a1->type&RT_MASK>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
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;
} else {
if (a1->type&TY_MASK==TY_IMM) {
if (a1->type&MDF_IMM) {
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
t1=MDF_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
}
}
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
if (r1==REG_RSP+REG_RSP<<8)
d1+=8;
}
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
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&TY_MASK!=TY_STK) {
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
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;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
}
}
if (a1->type&RT_MASK>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
if (a1->type.raw_type>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
t1=a1->type;
r1=a1->reg;
d1=a1->disp;
} else {
if (a1->type&TY_MASK==TY_IMM) {
if (a1->type&MDF_IMM) {
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
t1=MDF_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
if (r2==REG_RSP+REG_RSP<<8)
d2+=8;
}
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
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;
}
}
}
@@ -531,10 +502,9 @@ U0 ICFOp(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
ICAddRSP(tempi,rsp_size);
} else {
if (rsp_size==8)
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,
SLASH_OP_FSTP,ip);
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,ip);
else if (rsp_size>8) {
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
SLASH_OP_FSTP,ip);
ICAddRSP(tempi,rsp_size-8);
}
@@ -547,114 +517,87 @@ U0 ICFCmp(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,I64 ip)
Bool dont_push_float,dont_pop_float;
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (dont_push_float) {
if (tempi->ic_flags&ICF_ALTERNATE_TEMPLATE) {
if (tempi->ic_flags&ICF_ALT_TEMPLATE) {
if (tempi->ic_flags&ICF_POP_CMP)
ICPopRegs(tempi,1<<REG_RAX);
else
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
} else
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->ic_flags&ICF_POP_CMP)
ICPopRegs(tempi,1<<REG_RDX);
else
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->ic_flags&ICF_POP_CMP)
ICPopRegs(tempi,1<<REG_RDX);
else
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->ic_flags&ICF_POP_CMP)
ICPopRegs(tempi,1<<REG_RDX);
else
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
if (tempi->ic_flags&ICF_PUSH_CMP)
ICPushRegs(tempi,1<<REG_RAX);
ICCopyTemplate(cc,tempi,op,FALSE,TRUE,FALSE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICFModEqu(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip)
{
Bool dont_push_float,dont_pop_float;
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->ic_flags & ICF_BY_VAL) {
if (dont_push_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,FALSE,ip);
} else if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICFCvt2(cc,tempi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,ip);
}
//TODO: unpushable,unpop? Not sure
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_MAIN);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,TY_REG+RT_I64,REG_RAX,0,ip);
if (tempi->r.type&TY_MASK)
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,MDF_REG+RT_I64,REG_RAX,0,ip);
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
} else {
if (dont_push_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,tempi->a1.type,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,tempi->a1.type,
tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,FALSE,ip);
} else if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,tempi->a1.type,
tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,tempi->a1.type,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,tempi->a1.type,
tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICFCvt2(cc,tempi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,ip);
}
//TODO: unpushable,unpop? Not sure
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_MAIN);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
TY_REG+RT_I64,REG_RAX,0,ip);
if (tempi->r.type&TY_MASK)
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
MDF_REG+RT_I64,REG_RAX,0,ip);
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
}
+139 -239
View File
@@ -13,117 +13,67 @@ U0 ICFOpEqu(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
if (dont_pop_float)
throw('Compiler');
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->ic_flags & ICF_BY_VAL) {
p1_mem=FALSE;
if (dont_push_float) {
if (a1->type_pointed_to!=RT_F64) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
a1->type&TY_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,FALSE,ip);
ICPush(tempi,TY_REG+RT_I64,REG_RAX,0,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
a1->type&MDG_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,ip);
ICPush(tempi,MDF_REG+RT_I64,REG_RAX,0,ip);
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
} else {
if (a1->type_pointed_to>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
t1=a1->type_pointed_to+a1->type&TY_MASK;
if (a1->type_pointed_to>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
t1=a1->type&MDG_MASK+a1->type_pointed_to;
r1=a1->reg;
d1=a1->disp;
p1_mem=TRUE;
} else {
ICPush(tempi,
a1->type_pointed_to+a1->type&TY_MASK,a1->reg,a1->disp,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
a1->type&MDG_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
}
}
} else if (tempi->ic_flags & ICF_A1_FIRST) {
if (a1->type_pointed_to!=RT_F64 || a2->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
a1->type&TY_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
if (a1->type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
a2->type,a2->reg,a2->disp,ip);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
} else {
if (a1->type_pointed_to>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
t1=a1->type_pointed_to+a1->type&TY_MASK;
r1=a1->reg;
d1=a1->disp;
p1_mem=TRUE;
} else {
ICPush(tempi,
a1->type_pointed_to+a1->type&TY_MASK,a1->reg,a1->disp,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
}
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
if (r1==REG_RSP+REG_RSP<<8)
d1+=8;
}
}
}
} else {
if (a1->type_pointed_to!=RT_F64 || a1->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
a1->type&TY_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
if (a1->type_pointed_to!=RT_F64 || a1->type&MDF_STK) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
a1->type&MDG_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
if (a1->type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICFCvt2(cc,tempi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
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&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
}
}
if (a1->type_pointed_to>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
t1=a1->type_pointed_to+a1->type&TY_MASK;
if (a1->type_pointed_to>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
t1=a1->type&MDG_MASK+a1->type_pointed_to;
r1=a1->reg;
d1=a1->disp;
p1_mem=TRUE;
} else {
ICPush(tempi,
a1->type_pointed_to+a1->type&TY_MASK,a1->reg,a1->disp,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
a1->type&MDG_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
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;
@@ -152,112 +102,72 @@ U0 ICFOpEqu(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
ICAddRSP(tempi,rsp_size);
} else {
if (rsp_size==8)
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,
SLASH_OP_FSTP,ip);
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,ip);
else if (rsp_size>8) {
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
SLASH_OP_FSTP,ip);
ICAddRSP(tempi,rsp_size-8);
}
if (a1->type_pointed_to!=RT_F64) {
ICPop(tempi,TY_REG+RT_I64,REG_RAX,0,ip);
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,a1->type&TY_MASK+a1->type_pointed_to,a1->reg,a1->disp,
TY_REG+RT_I64,REG_RAX,0,ip);
ICPop(tempi,MDF_REG+RT_I64,REG_RAX,0,ip);
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,a1->type&MDG_MASK+a1->type_pointed_to,a1->reg,a1->disp,
MDF_REG+RT_I64,REG_RAX,0,ip);
} else
ICPop(tempi,a1->type_pointed_to+a1->type&TY_MASK,a1->reg,a1->disp,ip);
ICPop(tempi,a1->type&MDG_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
}
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
a1->type&TY_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
a1->type&MDG_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
} else {
if (a1->type_pointed_to>=RT_I64)
p1_mem=TRUE;
else
p1_mem=FALSE;
if (dont_push_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
if (a1->type_pointed_to!=RT_F64) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_DISP+a1->type_pointed_to,REG_RCX,0,ip);
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,FALSE,ip);
ICPush(tempi,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
MDF_DISP+a1->type_pointed_to,REG_RCX,0,ip);
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,ip);
ICPush(tempi,MDF_REG+RT_I64,REG_RAX,0,ip);
} else
ICPush(tempi,a1->type_pointed_to+TY_DISP,REG_RCX,0,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
ICPush(tempi,MDF_DISP+a1->type_pointed_to,REG_RCX,0,ip);
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
} else if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
if (a1->type_pointed_to!=RT_F64 || a2->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
TY_DISP+a1->type_pointed_to,REG_RCX,0,ip);
if (a1->type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
} else {
ICPush(tempi,TY_DISP+a1->type_pointed_to,REG_RCX,0,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
if (r1==REG_RSP+REG_RSP<<8)
d1+=8;
}
}
}
} else {
if (a1->type_pointed_to!=RT_F64 || a1->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
TY_DISP+a1->type_pointed_to,REG_RCX,0,ip);
if (a1->type_pointed_to!=RT_F64 || a1->type&MDF_STK) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
MDF_DISP+a1->type_pointed_to,REG_RCX,0,ip);
if (a1->type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICFCvt2(cc,tempi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
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&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
}
}
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
ICPush(tempi,TY_DISP+a1->type_pointed_to,REG_RCX,0,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
ICPush(tempi,MDF_DISP+a1->type_pointed_to,REG_RCX,0,ip);
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;
@@ -281,28 +191,26 @@ U0 ICFOpEqu(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
ICSlashOp(tempi,t1,r1,d1,op,ip);
CmpNoteFloatOp(cc,tempi,TRUE,FALSE,CN_MAIN);
if (p1_mem && a1->type_pointed_to==RT_F64) {
ICSlashOp(tempi,TY_DISP+a1->type_pointed_to,REG_RCX,0,
SLASH_OP_FSTP,ip);
ICSlashOp(tempi,MDF_DISP+a1->type_pointed_to,REG_RCX,0,SLASH_OP_FSTP,ip);
if (rsp_size)
ICAddRSP(tempi,rsp_size);
} else {
if (rsp_size==8)
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,
SLASH_OP_FSTP,ip);
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,ip);
else if (rsp_size>8) {
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
SLASH_OP_FSTP,ip);
ICAddRSP(tempi,rsp_size-8);
}
ICPop(tempi,TY_REG+RT_I64,REG_RAX,0,ip);
ICPop(tempi,MDF_REG+RT_I64,REG_RAX,0,ip);
if (a1->type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,TY_DISP+a1->type_pointed_to,REG_RCX,0,
TY_REG+RT_I64,REG_RAX,0,ip);
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,MDF_DISP+a1->type_pointed_to,REG_RCX,0,
MDF_REG+RT_I64,REG_RAX,0,ip);
}
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
}
@@ -315,7 +223,7 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip,
CCodeMisc *lb;
U8 *buf2;
if (tempi->ic_flags&ICF_ALTERNATE_TEMPLATE) {
if (tempi->ic_flags&ICF_ALT_TEMPLATE) {
a1=&tempi->a2;
a2=&tempi->a1;
alt=TRUE;
@@ -333,71 +241,68 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip,
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (dont_push_float) {
if (tempi->ic_flags&ICF_POP_CMP && alt) {
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
} else {
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64))) ||
tempi->ic_flags&ICF_PUSH_CMP) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip2);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
}
}
}
} else {
if (tempi->ic_flags & ICF_A1_FIRST^^alt) {
if (a2->type&TY_MASK!=TY_STK) {
if (alt) {
if (!(a2->type&MDF_STK)) {
if (tempi->ic_flags&ICF_POP_CMP) {
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
} else {
if (a1->type&RT_MASK>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
if (a1->type.raw_type>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
t1=a1->type;
r1=a1->reg;
d1=a1->disp;
} else {
if (a1->type&TY_MASK==TY_IMM) {
if (a1->type&MDF_IMM) {
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
t1=MDF_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip2);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
}
}
}
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64))) ||
tempi->ic_flags&ICF_PUSH_CMP) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip2);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
if (r1==REG_RSP+REG_RSP<<8)
d1+=8;
@@ -407,55 +312,53 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip,
if (tempi->ic_flags&ICF_POP_CMP)
ICPopRegs(tempi,1<<REG_RDX);
else
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
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&TY_MASK!=TY_STK) {
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
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;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64))) ||
tempi->ic_flags&ICF_PUSH_CMP) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip2);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
}
}
if (tempi->ic_flags&ICF_POP_CMP) {
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
if (r2==REG_RSP+REG_RSP<<8)
d1+=8;
} else {
if (a1->type&RT_MASK>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
if (a1->type.raw_type>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
t1=a1->type;
r1=a1->reg;
d1=a1->disp;
} else {
if (a1->type&TY_MASK==TY_IMM) {
if (a1->type&MDF_IMM) {
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
t1=MDF_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip2);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
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;
@@ -463,15 +366,15 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip,
}
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
if (tempi->ic_flags&ICF_POP_CMP)
ICPopRegs(tempi,1<<REG_RDX);
else
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
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;
}
}
}
@@ -488,7 +391,7 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip,
else
ICSlashOp(tempi,t2,r2,d2,SLASH_OP_FLD,ip2);
if (tempi->ic_flags&ICF_PUSH_CMP) {
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
if (!rsp_size) {
rsp_size=8;
ICAddRSP(tempi,-8);
@@ -571,15 +474,13 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip,
U0 ICFMul(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
{
if (tempi->a1.type&TY_MASK==TY_IMM &&
tempi->a1.type_pointed_to&RT_MASK==RT_F64 &&
if (tempi->a1.type&MDF_IMM && tempi->a1.type_pointed_to==RT_F64 &&
tempi->a1.disp(F64)==1.0) {
CmpNoteFloatOp(cc,tempi,FALSE,FALSE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else if (tempi->a2.type&TY_MASK==TY_IMM &&
tempi->a2.type_pointed_to&RT_MASK==RT_F64 &&
tempi->a2.disp(F64)==1.0) {
} else if (tempi->a2.type&MDF_IMM &&
tempi->a2.type_pointed_to==RT_F64&& tempi->a2.disp(F64)==1.0) {
CmpNoteFloatOp(cc,tempi,FALSE,FALSE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
@@ -589,8 +490,7 @@ U0 ICFMul(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
U0 ICFDiv(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
{
if (tempi->a2.type&TY_MASK==TY_IMM &&
tempi->a2.type_pointed_to&RT_MASK==RT_F64 &&
if (tempi->a2.type&MDF_IMM && tempi->a2.type_pointed_to==RT_F64 &&
tempi->a2.disp(F64)==1.0) {
CmpNoteFloatOp(cc,tempi,FALSE,FALSE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
@@ -603,13 +503,13 @@ U0 ICFAdd(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
{
Bool dont_push_float,dont_pop_float;
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (tempi->a1.type&TY_MASK==TY_IMM && !tempi->a1.disp) {
if (tempi->a1.type&MDF_IMM && !tempi->a1.disp) {
if (dont_push_float) {
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FSTP,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
} else if (dont_pop_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
} else {
@@ -617,13 +517,13 @@ U0 ICFAdd(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
}
} else if (tempi->a2.type&TY_MASK==TY_IMM && !tempi->a2.disp) {
} else if (tempi->a2.type&MDF_IMM && !tempi->a2.disp) {
if (dont_push_float) {
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FSTP,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
} else if (dont_pop_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
} else {
@@ -638,14 +538,14 @@ U0 ICFAdd(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
U0 ICFSub(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
{
Bool dont_push_float,dont_pop_float;
if (tempi->a2.type&TY_MASK==TY_IMM && !tempi->a2.disp) {
if (tempi->a2.type&MDF_IMM && !tempi->a2.disp) {
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (dont_push_float) {
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FSTP,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
} else if (dont_pop_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
} else {
@@ -659,46 +559,46 @@ U0 ICFSub(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
U0 ICFPreIncDec(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,I64 ip)
{
if (tempi->ic_flags & ICF_NOT_ADDR) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->ic_flags & ICF_BY_VAL) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
ICCopyTemplate(cc,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,TY_DISP+RT_I64,REG_RCX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+RT_I64,REG_RCX,0,ip);
ICCopyTemplate(cc,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,TY_DISP+RT_I64,REG_RCX,0,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,MDF_DISP+RT_I64,REG_RCX,0,MDF_REG+RT_I64,REG_RAX,0,ip);
}
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICFPostIncDec(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,I64 ip)
{
if (tempi->ic_flags & ICF_NOT_ADDR) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->r.type&TY_MASK)
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_REG+RT_I64,REG_RAX,0,ip);
if (tempi->ic_flags & ICF_BY_VAL) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->r.type.mode)
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_REG+RT_I64,REG_RAX,0,ip);
ICCopyTemplate(cc,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,TY_DISP+RT_I64,REG_RCX,0,ip);
if (tempi->r.type&TY_MASK)
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+RT_I64,REG_RCX,0,ip);
if (tempi->r.type.mode)
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_REG+RT_I64,REG_RAX,0,ip);
ICCopyTemplate(cc,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,TY_DISP+RT_I64,REG_RCX,0,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,MDF_DISP+RT_I64,REG_RCX,0,MDF_REG+RT_I64,REG_RAX,0,ip);
}
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RDX,0,ip);
MDF_REG+RT_I64,REG_RDX,0,ip);
}
U0 ICFTemplateFun(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,I64 ip)
@@ -707,12 +607,12 @@ U0 ICFTemplateFun(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,I64 ip)
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (!dont_push_float)
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICCopyTemplate(cc,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
if (tempi->r.type&TY_MASK && !(tempi->ic_flags & ICF_R_TO_F64) &&
if (tempi->r.type.mode && !(tempi->ic_flags & ICF_R_TO_F64) &&
!(tempi->ic_flags & ICF_R_TO_INT))
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
+111 -113
View File
@@ -72,8 +72,7 @@ U0 ICAddRSP(CIntermediateCode *tempi,I64 i,Bool optimize=TRUE)
CIntermediateCode *tempil1;
if (optimize && (tempil1=ICLastIns(tempi))) {
j=tempil1->ic_cnt;
if (tempil1->ic_last_cnt==j-4 &&
tempil1->ic_body[j-3]==0x83 &&
if (tempil1->ic_last_cnt==j-4 && tempil1->ic_body[j-3]==0x83 &&
tempil1->ic_body[j-4]==0x48) {
if (tempil1->ic_body[j-2]==0xEC)
j=-tempil1->ic_body[j-1](I8);
@@ -81,8 +80,7 @@ U0 ICAddRSP(CIntermediateCode *tempi,I64 i,Bool optimize=TRUE)
j=tempil1->ic_body[j-1](I8);
else
j=0;
} else if (tempil1->ic_last_cnt==j-7 &&
tempil1->ic_body[j-6]==0x81 &&
} else if (tempil1->ic_last_cnt==j-7 && tempil1->ic_body[j-6]==0x81 &&
tempil1->ic_body[j-7]==0x48) {
if (tempil1->ic_body[j-5]==0xEC)
j=-tempil1->ic_body[j-4](I32);
@@ -127,28 +125,24 @@ U0 ICAddRSP(CIntermediateCode *tempi,I64 i,Bool optimize=TRUE)
}
extern U0 ICMov(CIntermediateCode *tempi,
I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 ip);
CICType t1,I64 r1,I64 d1,CICType t2,I64 r2,I64 d2,I64 ip);
#define MDR_REG 0
#define MDR_INDIRECT_REG 1
#define MDR_D8_INDIRECT_REG 2
#define MDR_D32_INDIRECT_REG 3
#define MDR_SIB_INDIRECT_REG 4
#define MDR_SIB_D8_INDIRECT_REG 5
#define MDR_SIB_D32_INDIRECT_REG 6
#define MDR_RIP_REL 7
#define MODR_REG 0
#define MODR_INDIRECT_REG 1
#define MODR_D8_INDIRECT_REG 2
#define MODR_D32_INDIRECT_REG 3
#define MODR_SIB_INDIRECT_REG 4
#define MODR_SIB_D8_INDIRECT_REG 5
#define MODR_SIB_D32_INDIRECT_REG 6
#define MODR_RIP_REL 7
I64 ICModr1(I64 r,I64 t2,I64 r2,I64 d2)
I64 ICModr1(I64 r,CICType t2,I64 r2,I64 d2)
{//result.u8[0] is type
//result.u8[1] is REX
//result.u8[2] is ModR
//result.u8[3] is SIB
I64 result=0;
if (t2&TY_MASK>TY_RIP_DISP32) {
"Callers:%P;%P\n",Caller,Caller(2);
throw('Compiler');
}
if (t2&RT_MASK<RT_I64)
if (t2.raw_type<RT_I64)
result.u8[1]=0x40;
else
result.u8[1]=0x48;
@@ -156,36 +150,36 @@ I64 ICModr1(I64 r,I64 t2,I64 r2,I64 d2)
result.u8[1]+=4;
r&=7;
}
switch (t2>>4) {
case TY_REG>>4:
switch (Bsr(t2)) {
case MDf_REG:
if (r2>7) {
result.u8[1]++;
r2&=7;
}
result.u8[2]=0xC0+r<<3+r2;
result.u8[0]=MDR_REG;
if (result.u8[1]==0x40 && (t2&RT_MASK>=RT_I16 || r<4 && r2<4))
result.u8[0]=MODR_REG;
if (result.u8[1]==0x40 && (t2.raw_type>=RT_I16 || r<4 && r2<4))
result.u8[1]=0;
break;
case TY_DISP>>4:
case MDf_DISP:
if (r2>7) {
result.u8[1]++;
r2&=7;
}
if (!d2 && r2!=REG_RBP) {
result.u8[2]=r<<3+r2;
result.u8[0]=MDR_INDIRECT_REG;
result.u8[0]=MODR_INDIRECT_REG;
} else if (MIN_I8<=d2<=MAX_I8) {
result.u8[2]=0x40+r<<3+r2;
result.u8[0]=MDR_D8_INDIRECT_REG;
result.u8[0]=MODR_D8_INDIRECT_REG;
} else {
result.u8[2]=0x80+r<<3+r2;
result.u8[0]=MDR_D32_INDIRECT_REG;
result.u8[0]=MODR_D32_INDIRECT_REG;
}
if (result.u8[1]==0x40 && (t2&RT_MASK>=RT_I16 || r<4))
if (result.u8[1]==0x40 && (t2.raw_type>=RT_I16 || r<4))
result.u8[1]=0;
break;
case TY_SIB>>4:
case MDf_SIB:
if (7<r2.u8[0]<REG_NONE)
result.u8[1]++;
if (r2.u8[1]&15>7)
@@ -193,27 +187,27 @@ I64 ICModr1(I64 r,I64 t2,I64 r2,I64 d2)
if (r2.u8[0]==REG_NONE) {
result.u8[3]=5+(r2.u8[1]&7)<<3+r2.u8[1]&0xC0;
result.u8[2]=4+r<<3;
result.u8[0]=MDR_SIB_D32_INDIRECT_REG;
result.u8[0]=MODR_SIB_D32_INDIRECT_REG;
} else {
result.u8[3]=r2.u8[0]&7+(r2.u8[1]&7)<<3+r2.u8[1]&0xC0;
if (!d2 && r2.u8[0]&7!=REG_RBP) {
result.u8[2]=4+r<<3;
result.u8[0]=MDR_SIB_INDIRECT_REG;
result.u8[0]=MODR_SIB_INDIRECT_REG;
} else if (MIN_I8<=d2<=MAX_I8) {
result.u8[2]=0x44+r<<3;
result.u8[0]=MDR_SIB_D8_INDIRECT_REG;
result.u8[0]=MODR_SIB_D8_INDIRECT_REG;
} else {
result.u8[2]=0x84+r<<3;
result.u8[0]=MDR_SIB_D32_INDIRECT_REG;
result.u8[0]=MODR_SIB_D32_INDIRECT_REG;
}
}
if (result.u8[1]==0x40 && (t2&RT_MASK>=RT_I16 || r<4))
if (result.u8[1]==0x40 && (t2.raw_type>=RT_I16 || r<4))
result.u8[1]=0;
break;
case TY_RIP_DISP32>>4:
case MDf_RIP_DISP32:
result.u8[2]=0x05+r<<3;
result.u8[0]=MDR_RIP_REL;
if (result.u8[1]==0x40 && (t2&RT_MASK>=RT_I16 || r<4))
result.u8[0]=MODR_RIP_REL;
if (result.u8[1]==0x40 && (t2.raw_type>=RT_I16 || r<4))
result.u8[1]=0;
break;
}
@@ -223,28 +217,28 @@ I64 ICModr1(I64 r,I64 t2,I64 r2,I64 d2)
U0 ICModr2(CIntermediateCode *tempi,I64 i,I64 d,I64 ip=0)
{//t=0 means no SIB
switch [i.u8[0]] {
case MDR_REG:
case MODR_REG:
break;
case MDR_INDIRECT_REG:
case MODR_INDIRECT_REG:
break;
case MDR_D8_INDIRECT_REG:
case MODR_D8_INDIRECT_REG:
ICU8(tempi,d);
break;
case MDR_D32_INDIRECT_REG:
case MODR_D32_INDIRECT_REG:
ICU32(tempi,d);
break;
case MDR_SIB_INDIRECT_REG:
case MODR_SIB_INDIRECT_REG:
ICU8(tempi,i.u8[3]);
break;
case MDR_SIB_D8_INDIRECT_REG:
case MODR_SIB_D8_INDIRECT_REG:
ICU8(tempi,i.u8[3]);
ICU8(tempi,d);
break;
case MDR_SIB_D32_INDIRECT_REG:
case MODR_SIB_D32_INDIRECT_REG:
ICU8(tempi,i.u8[3]);
ICU32(tempi,d);
break;
case MDR_RIP_REL:
case MODR_RIP_REL:
ICU32(tempi,d-(ip+tempi->ic_cnt));
tempi->ic_flags&=~ICF_CODE_FINAL;
break;
@@ -272,16 +266,16 @@ U0 ICModr2(CIntermediateCode *tempi,I64 i,I64 d,I64 ip=0)
#define SLASH_OP_FISTTP 0x0000000001DDDD01
#define SLASH_OP_FILD 0x0000000001DFDF05
U0 ICSlashOp(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 op,I64 ip)
U0 ICSlashOp(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,I64 op,I64 ip)
{
I64 i;
if (t1&TY_MASK==TY_REG && !op.u8[3])
t1=t1&(TY_MASK|1)+RT_I64; //Set to 64 bit, preserving signed/unsigned
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 (tempi->ic_flags&ICF_LOCK && op!=SLASH_OP_MOV && t1&TY_MASK!=TY_REG)
if (tempi->ic_flags&ICF_LOCK && op!=SLASH_OP_MOV && !(t1&MDF_REG))
ICU8(tempi,OC_LOCK_PREFIX);
switch (t1&RT_MASK) {
switch (t1.raw_type) {
case RT_I8:
case RT_U8:
ICRex(tempi,i.u8[1]);
@@ -300,32 +294,32 @@ U0 ICSlashOp(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 op,I64 ip)
ICModr2(tempi,i,d1,ip+4);
}
U0 ICPush(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 ip)
U0 ICPush(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,I64 ip)
{
switch (t1>>4) {
case TY_REG>>4:
switch (Bsr(t1)) {
case MDf_REG:
if (r1>7)
ICU16(tempi,0x5049+(r1&7)<<8);
else
ICU8(tempi,0x50+r1);
return;
case TY_IMM>>4:
case MDf_IMM:
if (MIN_I8<=d1<=MAX_I8)
ICU16(tempi,0x6A+d1<<8);
else if (MIN_I32<=d1<=MAX_I32) {
ICU8(tempi,0x68);
ICU32(tempi,d1);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,t1,r1,d1,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,t1,r1,d1,ip);
ICU8(tempi,0x50+REG_RBX);
}
return;
case TY_STK>>4:
case MDf_STK:
return;
case TY_DISP>>4:
case TY_SIB>>4:
case TY_RIP_DISP32>>4:
switch (t1&RT_MASK) {
case MDf_DISP:
case MDf_SIB:
case MDf_RIP_DISP32:
switch (t1.raw_type) {
case RT_I64:
case RT_U64:
case RT_F64:
@@ -334,7 +328,7 @@ U0 ICPush(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 ip)
}
break;
}
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,t1,r1,d1,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,t1,r1,d1,ip);
ICU16(tempi,0x5048+REG_RBX<<8);
}
@@ -351,30 +345,31 @@ U0 ICPushRegs(CIntermediateCode *tempi,I64 mask)
}
}
U0 ICPop(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 ip)
U0 ICPop(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,I64 ip)
{
switch (t1>>4) {
case TY_NULL>>4:
ICAddRSP(tempi,8);
break;
case TY_REG>>4:
switch (Bsr(t1)) {
case MDf_REG:
if (r1>7)
ICU16(tempi,0x5849+(r1&7)<<8);
else
ICU8(tempi,0x58+r1);
break;
case TY_DISP>>4:
case TY_RIP_DISP32>>4:
case TY_SIB>>4:
if (t1&RT_MASK<RT_I64) {
case MDf_DISP:
case MDf_RIP_DISP32:
case MDf_SIB:
if (t1.raw_type<RT_I64) {
ICU8(tempi,0x58+REG_RBX);
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,REG_RBX,0,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,REG_RBX,0,ip);
} else
ICSlashOp(tempi,t1,r1,d1,SLASH_OP_POP,ip);
break;
default:
case MDf_STK:
case MDf_IMM:
ICU8(tempi,0x58+REG_RBX);
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,REG_RBX,0,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,REG_RBX,0,ip);
break;
default:
ICAddRSP(tempi,8);
}
}
@@ -433,14 +428,14 @@ I64 ICBuiltInFloatConst(F64 d)
}
U0 ICMov(CIntermediateCode *tempi,
I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 ip)
CICType t1,I64 r1,I64 d1,CICType t2,I64 r2,I64 d2,I64 ip)
{
I64 i,j,last_cnt=tempi->ic_cnt;
CIntermediateCode *tempil1;
Bool old_lock=Btr(&tempi->ic_flags,ICf_LOCK);
switch (t1>>4) {
case TY_REG>>4:
if (t2&TY_MASK==TY_IMM) {
switch (Bsr(t1)) {
case MDf_REG:
if (t2&MDF_IMM) {
if (!d2)
ICZero(tempi,r1);
else if (0<=d2<=MAX_U8) {
@@ -492,13 +487,13 @@ U0 ICMov(CIntermediateCode *tempi,
ICU16(tempi,i+r1<<8);
ICU64(tempi,d2);
}
} else if (t2&TY_MASK==TY_STK)
} else if (t2&MDF_STK)
ICPop(tempi,t1,r1,d1,ip);
else {
if (r1==r2 && t2&TY_MASK==TY_REG)
if (r1==r2 && t2&MDF_REG)
goto move_done;
if (t2&TY_MASK==TY_REG) {
t2=TY_REG+RT_I64;
if (t2&MDF_REG) {
t2=MDF_REG+RT_I64;
if (tempil1=ICLastIns(tempi)) {
i=tempil1->ic_cnt;
j=0x48+(r1>7);
@@ -511,10 +506,10 @@ U0 ICMov(CIntermediateCode *tempi,
}
}
i=ICModr1(r1,t2,r2,d2);
if (t2&RT_MASK!=RT_U32)
if (t2.raw_type!=RT_U32)
i|=0x4800;
ICRex(tempi,i.u8[1]);
switch (t2&RT_MASK) {
switch (t2.raw_type) {
case RT_I8:
ICU24(tempi,i.u8[2]<<16+0xBE0F);
break;
@@ -537,19 +532,22 @@ U0 ICMov(CIntermediateCode *tempi,
ICModr2(tempi,i,d2,ip+4);
}
break;
case TY_STK>>4:
if (t1&RT_MASK<t2&RT_MASK)
ICPush(tempi,t2&TY_MASK+t1&RT_MASK,r2,d2,ip);
case MDf_STK:
if (tempi->ic_flags&ICF_PUSH_CMP)
ICPopRegs(tempi,1<<REG_RBX);
if (t1.raw_type<t2.raw_type)
ICPush(tempi,t2&MDG_MASK+t1.raw_type,r2,d2,ip);
else
ICPush(tempi,t2,r2,d2,ip);
if (tempi->ic_flags&ICF_PUSH_CMP)
ICPushRegs(tempi,1<<REG_RBX);
break;
case TY_DISP>>4:
case TY_RIP_DISP32>>4:
case TY_SIB>>4:
if (t2&TY_MASK==TY_IMM && (t1&RT_MASK<RT_I64 ||
(MIN_I32<=d2<=MAX_I32))) {
case MDf_DISP:
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&RT_MASK) {
switch (t1.raw_type) {
case RT_I8:
case RT_U8:
ICRex(tempi,i.u8[1]);
@@ -564,11 +562,11 @@ U0 ICMov(CIntermediateCode *tempi,
ICRex(tempi,i.u8[1]);
ICU16(tempi,i.u8[2]<<8+0xC7);
}
if (i.u8[0]!=MDR_RIP_REL)
if (i.u8[0]!=MODR_RIP_REL)
ICModr2(tempi,i,d1,);
else {
i=d1-(ip+tempi->ic_cnt+4);
switch (t1&RT_MASK) {
switch (t1.raw_type) {
case RT_I8:
case RT_U8:
i--;
@@ -584,7 +582,7 @@ U0 ICMov(CIntermediateCode *tempi,
tempi->ic_flags&=~ICF_CODE_FINAL;
}
switch (t1&RT_MASK) {
switch (t1.raw_type) {
case RT_I8:
case RT_U8:
ICU8(tempi,d2);
@@ -597,11 +595,11 @@ U0 ICMov(CIntermediateCode *tempi,
ICU32(tempi,d2);
}
} else {
if (t2&TY_MASK==TY_REG)
if (t2&MDF_REG)
ICSlashOp(tempi,t1,r1,d1,r2+SLASH_OP_MOV,ip);
else {
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,t2,r2,d2,ip);
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,REG_RBX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,t2,r2,d2,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,REG_RBX,0,ip);
}
}
break;
@@ -612,20 +610,20 @@ move_done:
tempi->ic_last_cnt=last_cnt;
}
U0 ICLea(CIntermediateCode *tempi,
I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,CCmpCtrl *cc,U8 *buf,I64 ip)
U0 ICLea(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,
CICType t2,I64 r2,I64 d2,CCmpCtrl *cc,U8 *buf,I64 ip)
{
I64 i;
CAOTAbsAddr *tempa;
switch (t1>>4) {
case TY_REG>>4:
switch (Bsr(t1)) {
case MDf_REG:
i=ICModr1(r1,t2,r2,d2);
i.u8[1]|=0x48;
ICU24(tempi,i.u8[2]<<16+0x8D00+i.u8[1]);
ICModr2(tempi,i,d2,ip+4);
break;
case TY_STK>>4:
if (t2&TY_MASK==TY_RIP_DISP32) {
case MDf_STK:
if (t2&MDF_RIP_DISP32) {
ICU8(tempi,0x68);
ICU32(tempi,d2);
if (cc->flags&CCF_AOT_COMPILE && buf && !(cc->flags&CCF_NO_ABSS)) {
@@ -639,24 +637,24 @@ U0 ICLea(CIntermediateCode *tempi,
break;
} // Fall thru
default:
ICLea(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,cc,buf,ip);
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,REG_RCX,0,ip);
ICLea(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,cc,buf,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,REG_RCX,0,ip);
}
}
U0 ICDeref(CIntermediateCode *tempi,I64 ip)
{
I64 t;
t=tempi->r.type&RT_MASK;
CICType t;
t=tempi->r.type.raw_type;
if (t>tempi->a1.type_pointed_to)
t=tempi->a1.type_pointed_to;
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->a1.type&MDF_REG)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+t,tempi->a1.reg,tempi->a1.disp,ip);
MDF_DISP+t,tempi->a1.reg,tempi->a1.disp,ip);
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+t,REG_RCX,0,ip);
MDF_DISP+t,REG_RCX,0,ip);
}
}
+21 -23
View File
@@ -3,7 +3,7 @@ U0 LexPutToken(CCmpCtrl *cc)
'"';
if (cc->token==TK_IDENT || cc->token==TK_STR)
"%s",cc->cur_str;
else if (cc->token==TK_INTEGER)
else if (cc->token==TK_INT)
"INT:%X",cc->cur_i64;
else if (cc->token==TK_CHAR_CONST)
"U8:%X",cc->cur_i64;
@@ -141,31 +141,29 @@ U0 ICClassPut(CHashClass *c)
U0 ICArgPut(CICArg *a)
{
if (a->type_pointed_to)
"%Z %Z %Z ",
a->type&RT_MASK,"ST_RAW_TYPES",
a->type_pointed_to&RT_MASK,"ST_RAW_TYPES",
a->type>>4,"ST_TY_TYPES";
"%Z %Z %Z ",a->type.raw_type,"ST_RAW_TYPES",
a->type_pointed_to,"ST_RAW_TYPES",
Bsr(a->type>>8)+1,"ST_TY_TYPES";
else
"%Z %Z ",
a->type&RT_MASK,"ST_RAW_TYPES",
a->type>>4,"ST_TY_TYPES";
switch (a->type>>4) {
case TY_STK>>4:
"%Z %Z ",a->type.raw_type,"ST_RAW_TYPES",
Bsr(a->type>>8)+1,"ST_TY_TYPES";
switch (Bsr(a->type)) {
case MDf_STK:
"STK";
break;
case TY_IMM>>4:
case MDf_IMM:
"#%X",a->disp;
break;
case TY_REG>>4:
case MDf_REG:
"%Z",a->reg,"ST_U64_REGS";
break;
case TY_DISP>>4:
case MDf_DISP:
"%X[%Z]",a->disp,a->reg,"ST_U64_REGS";
break;
case TY_RIP_DISP32>>4:
case MDf_RIP_DISP32:
"[%X]",a->disp;
break;
case TY_SIB>>4:
case MDf_SIB:
if (a->disp)
"%X",a->disp;
if (a->reg==REG_RIP)
@@ -189,14 +187,14 @@ U0 ICPut(CCmpCtrl *cc,CIntermediateCode *tempi)
if (opcode>=IC_END_EXP && opcode!=IC_NOP2) {
"%15ts %016X ",intermediate_code_table[opcode].name,tempi->ic_data;
if (cc->pass) {
if (tempi->r.type&TY_MASK) {
if (tempi->r.type.mode) {
ICArgPut(&tempi->r);
"<-";
}
if (tempi->a1.type&TY_MASK)
if (tempi->a1.type.mode)
ICArgPut(&tempi->a1);
',';
if (tempi->a2.type&TY_MASK)
if (tempi->a2.type.mode)
ICArgPut(&tempi->a2);
'' CH_SPACE;
}
@@ -225,8 +223,8 @@ U0 ICPut(CCmpCtrl *cc,CIntermediateCode *tempi)
"-DEP ";
if (tempi->ic_flags & ICF_DEPEND_RESULT)
"+DEP ";
if (tempi->ic_flags & ICF_NOT_ADDR)
"NOT_ADDR ";
if (tempi->ic_flags & ICF_BY_VAL)
"BY_VAL ";
if (tempi->ic_flags & ICF_PUSH_RESULT)
"PUSH ";
if (tempi->ic_flags & ICF_PUSH_CMP)
@@ -234,16 +232,16 @@ U0 ICPut(CCmpCtrl *cc,CIntermediateCode *tempi)
if (tempi->ic_flags & ICF_POP_CMP)
"POP_CMP ";
if (tempi->ic_flags & ICF_DEL_PREVIOUS_INS)
"DELPREV ";
"DEL_PREV ";
if (tempi->ic_flags & ICF_PREVIOUS_DELETED)
"PREVDEL ";
"PREV_DEL ";
for (i=0;i<3;i++) {
if (Bt(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0+i))
"DONT_PUSH#%d ",i;
if (Bt(&tempi->ic_flags,ICf_DONT_POP_FLOAT0+i))
"DONT_POP#%d ",i;
}
if (tempi->ic_flags & ICF_ALTERNATE_TEMPLATE)
if (tempi->ic_flags & ICF_ALT_TEMPLATE)
"ALT_TEMP ";
'\n';
}
+4 -49
View File
@@ -211,7 +211,7 @@ U0 CmpLoadDefines()
"I8\0U8\0I16\0U16\0I32\0U32\0I64\0U64\0F64\0String\0");
DefineLstLoad("ST_INT_SIZE_TYPES",
"I8\0U8\0I16\0U16\0I32\0U32\0I64\0U64\0");
DefineLstLoad("ST_TY_TYPES","NULL\0IMM\0REG\0DISP\0SIB\0RIP\0STK\0");
DefineLstLoad("ST_TY_TYPES","NULL\0STK\0IMM\0REG\0DISP\0SIB\0RIP\0");
DefineLstLoad("ST_U8_REGS","AL\0CL\0DL\0BL\0AH\0CH\0DH\0BH\0"
"R8u8\0R9u8\0R10u8\0R11u8\0R12u8\0R13u8\0R14u8\0R15u8\0");
DefineLstLoad("ST_U8_REX_REGS","AL\0CL\0DL\0BL\0RSPu8\0RBPu8\0RSIu8\0RDIu8\0"
@@ -239,68 +239,23 @@ U0 CmpLoadDefines()
U0 CmpFillTables()
{
I64 i,k;
I64 i;
U32 *d;
cmp.to_reg_vars_map=CAlloc(NUM_REGS*sizeof(U8));
cmp.num_reg_vars=0;
cmp.reg_vars_mask=REGG_C_LOCAL_VARS;
cmp.reg_vars_mask=REGG_LOCAL_VARS;
for (i=0;i<NUM_REGS;i++)
if (Bt(&cmp.reg_vars_mask,i))
cmp.to_reg_vars_map[cmp.num_reg_vars++]=i;
cmp.non_ptr_vars_map=CAlloc(NUM_REGS*sizeof(U8));
cmp.num_non_ptr_vars=0;
cmp.non_ptr_vars_mask=REGG_C_LOCAL_NON_PTR_VARS;
cmp.non_ptr_vars_mask=REGG_LOCAL_NON_PTR_VARS;
for (i=0;i<NUM_REGS;i++)
if (Bt(&cmp.non_ptr_vars_mask,i))
cmp.non_ptr_vars_map[cmp.num_non_ptr_vars++]=i;
/* STK TEMP ALLOCATION: See $LK,"::/Compiler/OptPass6.CPP"$.
Expressions are evaluated with a stack machine.
1+(2+3)*4
STK[2]: 1 1 1 1 1 1 21
STK[1]: 2 2 5 5 20
STK[0]: 3 4
The top of the stack is stored in RAX.
STK[2]: RAX 1 1 1 1 1 RAX
STK[1]: RAX 2 RAX 5 RAX
STK[0]: RAX RAX
Two regs are alloced for stk temps.
STK[0]:
R9 : RAX R9 R9 R9 R9 R9 RAX
R8 : RAX R8 RAX R8 RAX
: RAX RAX
Every other funtion, the regs are reversed. This is to reduce
pushes before function calls. R8 is used in even numbered functions
while R9 is used in odd, so maybe we can avoid pushes if only one
stk temp reg is used.
STK[0]:
R9 : RAX R8 R8 R8 R8 R8 RAX
R8 : RAX R9 RAX R9 RAX
: RAX RAX
*/
cmp.to_stk_temps_map_odd =CAlloc(NUM_REGS*sizeof(U8));
cmp.to_stk_temps_map_even=CAlloc(NUM_REGS*sizeof(U8));
cmp.num_stk_temps=0;
cmp.stk_temps_mask=REGG_C_TEMP_CLOBBERED;
for (i=0;i<NUM_REGS;i++)
if (Bt(&cmp.stk_temps_mask,i))
cmp.to_stk_temps_map_even[cmp.num_stk_temps++]=i;
k=cmp.num_stk_temps;
for (i=0;i<NUM_REGS;i++)
if (Bt(&cmp.stk_temps_mask,i))
cmp.to_stk_temps_map_odd[--k]=i;
cmp.dual_U16_tokens1=d=CAlloc(sizeof(U32)*TK_NUM_TK);
d['!']=TK_NOT_EQU<<16+'=';
d['&']=TK_AND_AND<<16+'&';
+9 -10
View File
@@ -256,7 +256,7 @@ U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tempaot)
break;
case IET_REL_I8:
if (!(MIN_I8<=i-ptr-1<=MAX_I8))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
*ptr(U8 *) =i-ptr-1;
break;
case IET_IMM_U8:
@@ -264,7 +264,7 @@ U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tempaot)
break;
case IET_REL_I16:
if (!(MIN_I16<=i-ptr-2<=MAX_I16))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
*ptr(U16 *)=i-ptr-2;
break;
case IET_IMM_U16:
@@ -272,7 +272,7 @@ U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tempaot)
break;
case IET_REL_I32:
if (!(MIN_I32<=i-ptr-4<=MAX_I32))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
*ptr(U32 *)=i-ptr-4;
break;
case IET_IMM_U32:
@@ -356,7 +356,7 @@ U0 CmpFixUpAOTAsm(CCmpCtrl *cc,CAOT *tempaot)
break;
case IET_REL_I8:
if (!(MIN_I8<=i-ptr-1<=MAX_I8))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
*ptr(U8 *) =i-ptr-1;
break;
case IET_IMM_U8:
@@ -364,7 +364,7 @@ U0 CmpFixUpAOTAsm(CCmpCtrl *cc,CAOT *tempaot)
break;
case IET_REL_I16:
if (!(MIN_I16<=i-ptr-2<=MAX_I16))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
*ptr(U16 *)=i-ptr-2;
break;
case IET_IMM_U16:
@@ -372,7 +372,7 @@ U0 CmpFixUpAOTAsm(CCmpCtrl *cc,CAOT *tempaot)
break;
case IET_REL_I32:
if (!(MIN_I32<=i-ptr-4<=MAX_I32))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
*ptr(U32 *)=i-ptr-4;
break;
case IET_IMM_U32:
@@ -440,7 +440,7 @@ I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv_let=0)
cnt=0;
tempa=tempaot->abss;
while (tempa) {
if (!(tempa->type&1))
if (!(tempa->type&IEF_IMM_NOT_REL))
cnt++;
tempa=tempa->next;
}
@@ -451,7 +451,7 @@ I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv_let=0)
tempa=tempaot->abss;
while (tempa) {
tempa1=tempa->next;
if (!(tempa->type&1))
if (!(tempa->type&IEF_IMM_NOT_REL))
*ptr(U32 *)++ =tempa->ip;
Free(tempa);
tempa=tempa1;
@@ -655,8 +655,7 @@ I64 ExePrint2(U8 *fmt,...)
I64 ExeFile2(U8 *name,Bool just_load=FALSE)
{//throws exceptions
I64 result;
U8 *name2=DftExt(name,"CPP.Z"),
*st=MStrPrint("#include \"%s\";",name2);
U8 *name2=DftExt(name,"CPP.Z"),*st=MStrPrint("#include \"%s\";",name2);
result=ExePutS2(st,name,just_load);
Free(st);
Free(name2);
+8 -8
View File
@@ -16,7 +16,7 @@ I64 PassTrace(I64 i=0b10001111101)
return old;
}
Bool Trace(Bool val)
Bool Trace(Bool val=ON)
{//Displays assembly code output from compiler.
return Option(OPTf_TRACE,val);
}
@@ -52,15 +52,15 @@ U0 StreamDir()
CD2I32 *LexD2I32(CCmpCtrl *cc,CD2I32 *p)
{//Not HolyC. Sprite-like lex 2D point.
if (cc->token!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
Lex(cc); //Skip (
p->x=LexExpressionI64(cc);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc); //Skip ,
p->y=LexExpressionI64(cc);
if (cc->token!=')')
LexExcept(cc,"expecting ')' at ");
LexExcept(cc,"Expecting ')' at ");
Lex(cc); //Skip )
return p;
}
@@ -68,19 +68,19 @@ CD2I32 *LexD2I32(CCmpCtrl *cc,CD2I32 *p)
CD3I32 *LexD3I32(CCmpCtrl *cc,CD3I32 *p)
{//Not HolyC. Sprite-like lex 3D point.
if (cc->token!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
Lex(cc); //Skip (
p->x=LexExpressionI64(cc);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc); //Skip ,
p->y=LexExpressionI64(cc);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc); //Skip ,
p->z=LexExpressionI64(cc);
if (cc->token!=')')
LexExcept(cc,"expecting ')' at ");
LexExcept(cc,"Expecting ')' at ");
Lex(cc); //Skip )
return p;
}
Binary file not shown.
+289 -257
View File
@@ -1,31 +1,29 @@
$LK,"LexPutPos",A="FL:::/Compiler/CExcept.CPP.Z,50",BI=1$
$LK,"ICAssignPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,517",BI=2$
$LK,"CmpSetFloatOpPushPop",A="FL:::/Compiler/BackFA.CPP.Z,60",BI=3$
$LK,"ICFCvt2",A="FL:::/Compiler/BackFA.CPP.Z,170",BI=4$
$LK,"CmpRawTypePointed",A="FL:::/Compiler/OptLib.CPP.Z,518",BI=5$
$LK,"ICAssignPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,429",BI=2$
$LK,"CmpSetFloatOpPushPop",A="FL:::/Compiler/BackFA.CPP.Z,62",BI=3$
$LK,"ICFCvt2",A="FL:::/Compiler/BackFA.CPP.Z,169",BI=4$
$LK,"CmpRawTypePointed",A="FL:::/Compiler/OptLib.CPP.Z,517",BI=5$
$LK,"OptFixupBinaryOp1",A="FL:::/Compiler/OptLib.CPP.Z,96",BI=6$
$LK,"OptFixupBinaryOp2",A="FL:::/Compiler/OptLib.CPP.Z,182",BI=7$
$LK,"COCInit",A="FL:::/Compiler/PrsLib.CPP.Z,99",BI=8$
$LK,"IsLexExpression2Bin",A="FL:::/Compiler/PrsExp.CPP.Z,1130",BI=9$
$LK,"CSubSwitch",A="FL:::/Compiler/PrsStmt.CPP.Z,563"$
$LK,"IsLexExpression2Bin",A="FL:::/Compiler/PrsExp.CPP.Z,1128",BI=9$
$LK,"CSubSwitch",A="FL:::/Compiler/PrsStmt.CPP.Z,562"$
$LK,"LexFilePop",A="FL:::/Compiler/Lex.CPP.Z,11",BI=10$
$LK,"ExePutS",A="FL:::/Compiler/CMain.CPP.Z,571",BI=11$
$LK,"PrsStaticInit",A="FL:::/Compiler/PrsVar.CPP.Z,215",BI=12$
$LK,"LexPutLine",A="FL:::/Compiler/CExcept.CPP.Z,22",BI=13$
$LK,"PrsKeyWord",A="FL:::/Compiler/PrsLib.CPP.Z,31",BI=14$
$LK,"AsmLineLst",A="FL:::/Compiler/AsmLib.CPP.Z,149",BI=15$
$LK,"AsmLineLst",A="FL:::/Compiler/AsmLib.CPP.Z,147",BI=15$
$LK,"ICOpSizeRex",A="FL:::/Compiler/BackLib.CPP.Z,28",BI=16$
$LK,"CVI2",A="FL:::/Compiler/PrsVar.CPP.Z,117"$
$LK,"ICU8",A="FL:::/Compiler/BackLib.CPP.Z,17",BI=17$
$LK,"AsmStoreNum",A="FL:::/Compiler/Asm.CPP.Z,263",BI=18$
$LK,"MDR_SIB_D8_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,137"$
$LK,"OptPass012",A="FL:::/Compiler/OptPass012.CPP.Z,23",BI=19$
$LK,"MemberLstSize",A="FL:::/Compiler/LexLib.CPP.Z,191",BI=20$
$LK,"ICQueIns",A="FL:::/Compiler/BackC.CPP.Z,412",BI=21$
$LK,"ICQueIns",A="FL:::/Compiler/BackC.CPP.Z,355",BI=21$
$LK,"ICAndBranch",A="FL:::/Compiler/BackC.CPP.Z,1",BI=22$
$LK,"MDR_D8_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,134"$
$LK,"U",A="FL:::/Compiler/UAsm.CPP.Z,649",BI=23$
$LK,"ICQueRem",A="FL:::/Compiler/BackC.CPP.Z,494",BI=24$
$LK,"U",A="FL:::/Compiler/UAsm.CPP.Z,645",BI=23$
$LK,"ICQueRem",A="FL:::/Compiler/BackC.CPP.Z,403",BI=24$
$LK,"CN_R",A="FL:::/Compiler/BackFA.CPP.Z,4"$
$LK,"OptLead1",A="FL:::/Compiler/OptLib.CPP.Z,73",BI=25$
$LK,"CmpNoteFloatOp",A="FL:::/Compiler/BackFA.CPP.Z,6",BI=26$
@@ -33,24 +31,25 @@ $LK,"AOTGlblsResolve",A="FL:::/Compiler/AsmResolve.CPP.Z,76",BI=27$
$LK,"ExePutS2",A="FL:::/Compiler/CMain.CPP.Z,627",BI=28$
$LK,"HashEntrySize",A="FL:::/Compiler/CHash.CPP.Z,1",BI=29$
$LK,"COCPush",A="FL:::/Compiler/PrsLib.CPP.Z,107",BI=30$
$LK,"SLASH_OP_DEC",A="FL:::/Compiler/BackLib.CPP.Z,255"$
$LK,"ICPushRegs",A="FL:::/Compiler/BackLib.CPP.Z,341",BI=31$
$LK,"SLASH_OP_DEC",A="FL:::/Compiler/BackLib.CPP.Z,249"$
$LK,"MODR_SIB_D32_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,136"$
$LK,"ICPushRegs",A="FL:::/Compiler/BackLib.CPP.Z,335",BI=31$
$LK,"PE_POP_HIGHER",A="FL:::/Compiler/PrsExp.CPP.Z,10"$
$LK,"SLASH_OP_FLD",A="FL:::/Compiler/BackLib.CPP.Z,270"$
$LK,"SLASH_OP_FLD",A="FL:::/Compiler/BackLib.CPP.Z,264"$
$LK,"ICU32",A="FL:::/Compiler/BackLib.CPP.Z,47",BI=32$
$LK,"ICU24",A="FL:::/Compiler/BackLib.CPP.Z,41",BI=33$
$LK,"ICU16",A="FL:::/Compiler/BackLib.CPP.Z,35",BI=34$
$LK,"SLASH_OP_DIV",A="FL:::/Compiler/BackLib.CPP.Z,260"$
$LK,"SLASH_OP_DIV",A="FL:::/Compiler/BackLib.CPP.Z,254"$
$LK,"CmpFillTables",A="FL:::/Compiler/CInit.CPP.Z,240",BI=35$
$LK,"AOTStoreCodeU32",A="FL:::/Compiler/AsmLib.CPP.Z,30",BI=36$
$LK,"ICU64",A="FL:::/Compiler/BackLib.CPP.Z,53",BI=37$
$LK,"SLASH_OP_INC",A="FL:::/Compiler/BackLib.CPP.Z,254"$
$LK,"AOTStoreCodeU64",A="FL:::/Compiler/AsmLib.CPP.Z,69",BI=38$
$LK,"SLASH_OP_INC",A="FL:::/Compiler/BackLib.CPP.Z,248"$
$LK,"AOTStoreCodeU64",A="FL:::/Compiler/AsmLib.CPP.Z,68",BI=38$
$LK,"LexPopNoRestore",A="FL:::/Compiler/LexLib.CPP.Z,38",BI=39$
$LK,"ExePrint",A="FL:::/Compiler/CMain.CPP.Z,607",BI=40$
$LK,"SLASH_OP_NEG",A="FL:::/Compiler/BackLib.CPP.Z,257"$
$LK,"SLASH_OP_NEG",A="FL:::/Compiler/BackLib.CPP.Z,251"$
$LK,"PrsVarLst",A="FL:::/Compiler/PrsVar.CPP.Z,416",BI=41$
$LK,"PrsAsmDefine",A="FL:::/Compiler/Asm.CPP.Z,811",BI=42$
$LK,"PrsAsmDefine",A="FL:::/Compiler/Asm.CPP.Z,809",BI=42$
$LK,"PrsAddOp",A="FL:::/Compiler/PrsExp.CPP.Z,15",BI=43$
$LK,"LexWarn",A="FL:::/Compiler/CExcept.CPP.Z,65",BI=44$
$LK,"PE_POP_ALL1",A="FL:::/Compiler/PrsExp.CPP.Z,12"$
@@ -58,163 +57,162 @@ $LK,"PE_POP_ALL2",A="FL:::/Compiler/PrsExp.CPP.Z,13"$
$LK,"COCAppend",A="FL:::/Compiler/PrsLib.CPP.Z,126",BI=45$
$LK,"LexFilePush",A="FL:::/Compiler/Lex.CPP.Z,1",BI=46$
$LK,"CN_MAIN",A="FL:::/Compiler/BackFA.CPP.Z,3"$
$LK,"PrsUnaryModifier",A="FL:::/Compiler/PrsExp.CPP.Z,956",BI=47$
$LK,"PrsUnaryModifier",A="FL:::/Compiler/PrsExp.CPP.Z,954",BI=47$
$LK,"OptFixupUnaryOp",A="FL:::/Compiler/OptLib.CPP.Z,196",BI=48$
$LK,"LexPush",A="FL:::/Compiler/LexLib.CPP.Z,12",BI=49$
$LK,"SLASH_OP_MOV",A="FL:::/Compiler/BackLib.CPP.Z,261"$
$LK,"ICPopRegs",A="FL:::/Compiler/BackLib.CPP.Z,381",BI=50$
$LK,"SLASH_OP_MUL",A="FL:::/Compiler/BackLib.CPP.Z,258"$
$LK,"SLASH_OP_NOT",A="FL:::/Compiler/BackLib.CPP.Z,256"$
$LK,"SLASH_OP_MOV",A="FL:::/Compiler/BackLib.CPP.Z,255"$
$LK,"ICPopRegs",A="FL:::/Compiler/BackLib.CPP.Z,376",BI=50$
$LK,"SLASH_OP_MUL",A="FL:::/Compiler/BackLib.CPP.Z,252"$
$LK,"SLASH_OP_NOT",A="FL:::/Compiler/BackLib.CPP.Z,250"$
$LK,"NUM_INTERNAL_TYPES",A="FL:::/Compiler/CInit.CPP.Z,1"$
$LK,"SLASH_OP_POP",A="FL:::/Compiler/BackLib.CPP.Z,263"$
$LK,"ICFOp",A="FL:::/Compiler/BackFA.CPP.Z,360",BI=51$
$LK,"SLASH_OP_POP",A="FL:::/Compiler/BackLib.CPP.Z,257"$
$LK,"ICFOp",A="FL:::/Compiler/BackFA.CPP.Z,339",BI=51$
$LK,"CN_A1",A="FL:::/Compiler/BackFA.CPP.Z,2"$
$LK,"CN_A2",A="FL:::/Compiler/BackFA.CPP.Z,1"$
$LK,"LexExpressionF64",A="FL:::/Compiler/PrsExp.CPP.Z,1149",BI=52$
$LK,"LexExpressionF64",A="FL:::/Compiler/PrsExp.CPP.Z,1147",BI=52$
$LK,"ICAdd",A="FL:::/Compiler/PrsLib.CPP.Z,79",BI=53$
$LK,"CmpRawType",A="FL:::/Compiler/OptLib.CPP.Z,509",BI=54$
$LK,"CmpRawType",A="FL:::/Compiler/OptLib.CPP.Z,508",BI=54$
$LK,"ICFOpEqu",A="FL:::/Compiler/BackFB.CPP.Z,1",BI=55$
$LK,"LexExpressionI64",A="FL:::/Compiler/PrsExp.CPP.Z,1135",BI=56$
$LK,"ICQueInsRev",A="FL:::/Compiler/BackC.CPP.Z,453",BI=57$
$LK,"LexExpression",A="FL:::/Compiler/PrsExp.CPP.Z,1163",BI=58$
$LK,"LexExpressionI64",A="FL:::/Compiler/PrsExp.CPP.Z,1133",BI=56$
$LK,"ICQueInsRev",A="FL:::/Compiler/BackC.CPP.Z,379",BI=57$
$LK,"LexExpression",A="FL:::/Compiler/PrsExp.CPP.Z,1161",BI=58$
$LK,"PrsExpression",A="FL:::/Compiler/PrsExp.CPP.Z,264",BI=59$
$LK,"PrsClassNew",A="FL:::/Compiler/PrsLib.CPP.Z,40",BI=60$
$LK,"LexInStr",A="FL:::/Compiler/Lex.CPP.Z,372",BI=61$
$LK,"LexInStr",A="FL:::/Compiler/Lex.CPP.Z,373",BI=61$
$LK,"internal_types_table",A="FL:::/Compiler/CInit.CPP.Z,6"$
$LK,"OptPass3",A="FL:::/Compiler/OptPass3.CPP.Z,1",BI=62$
$LK,"OptPass4",A="FL:::/Compiler/OptPass4.CPP.Z,171",BI=63$
$LK,"OptPass4",A="FL:::/Compiler/OptPass4.CPP.Z,163",BI=63$
$LK,"OptPass5",A="FL:::/Compiler/OptPass5.CPP.Z,1",BI=64$
$LK,"OptPass6",A="FL:::/Compiler/OptPass6.CPP.Z,111",BI=65$
$LK,"OptPass6",A="FL:::/Compiler/OptPass6.CPP.Z,96",BI=65$
$LK,"MODR_REG",A="FL:::/Compiler/BackLib.CPP.Z,130"$
$LK,"Echo",A="FL:::/Compiler/CMisc.CPP.Z,24",BI=66$
$LK,"PrsGlblVarLst",A="FL:::/Compiler/PrsStmt.CPP.Z,201",BI=67$
$LK,"ICQueInit",A="FL:::/Compiler/BackC.CPP.Z,398",BI=68$
$LK,"ICCmp",A="FL:::/Compiler/BackB.CPP.Z,136",BI=69$
$LK,"ICQueInit",A="FL:::/Compiler/BackC.CPP.Z,341",BI=68$
$LK,"ICCmp",A="FL:::/Compiler/BackB.CPP.Z,102",BI=69$
$LK,"ICAddRSP",A="FL:::/Compiler/BackLib.CPP.Z,69",BI=70$
$LK,"ICDiv",A="FL:::/Compiler/BackA.CPP.Z,428",BI=71$
$LK,"ICDeref",A="FL:::/Compiler/BackLib.CPP.Z,647",BI=72$
$LK,"ICLea",A="FL:::/Compiler/BackLib.CPP.Z,615",BI=73$
$LK,"ICDiv",A="FL:::/Compiler/BackA.CPP.Z,391",BI=71$
$LK,"ICDeref",A="FL:::/Compiler/BackLib.CPP.Z,645",BI=72$
$LK,"ICLea",A="FL:::/Compiler/BackLib.CPP.Z,613",BI=73$
$LK,"CmpBuf",A="FL:::/Compiler/CMain.CPP.Z,157",BI=74$
$LK,"CMP_TEMPLATES_DONT_PUSH_POP",A="FL:::/Compiler/Templates.CPP.Z,394"$
$LK,"ICAddEct",A="FL:::/Compiler/BackA.CPP.Z,1",BI=75$
$LK,"ICToF64",A="FL:::/Compiler/BackB.CPP.Z,372",BI=76$
$LK,"PrsBinFile",A="FL:::/Compiler/Asm.CPP.Z,885",BI=77$
$LK,"ICToF64",A="FL:::/Compiler/BackB.CPP.Z,283",BI=76$
$LK,"PrsBinFile",A="FL:::/Compiler/Asm.CPP.Z,883",BI=77$
$LK,"HashTableSize2",A="FL:::/Compiler/CHash.CPP.Z,72",BI=78$
$LK,"HashEntrySize2",A="FL:::/Compiler/CHash.CPP.Z,33",BI=79$
$LK,"Ui",A="FL:::/Compiler/UAsm.CPP.Z,238",BI=80$
$LK,"ICSlashOp",A="FL:::/Compiler/BackLib.CPP.Z,275",BI=81$
$LK,"OptBrZero",A="FL:::/Compiler/OptLib.CPP.Z,231",BI=82$
$LK,"Un",A="FL:::/Compiler/UAsm.CPP.Z,664",BI=83$
$LK,"ICSlashOp",A="FL:::/Compiler/BackLib.CPP.Z,269",BI=81$
$LK,"OptBrZero",A="FL:::/Compiler/OptLib.CPP.Z,230",BI=82$
$LK,"Un",A="FL:::/Compiler/UAsm.CPP.Z,660",BI=83$
$LK,"PrsSizeOf",A="FL:::/Compiler/PrsExp.CPP.Z,298",BI=84$
$LK,"ICToI64",A="FL:::/Compiler/BackB.CPP.Z,366",BI=85$
$LK,"ICMod",A="FL:::/Compiler/BackA.CPP.Z,521",BI=86$
$LK,"ICToI64",A="FL:::/Compiler/BackB.CPP.Z,277",BI=85$
$LK,"ICMod",A="FL:::/Compiler/BackA.CPP.Z,461",BI=86$
$LK,"OptSetNOP1",A="FL:::/Compiler/OptLib.CPP.Z,17",BI=87$
$LK,"OptPass789A",A="FL:::/Compiler/OptPass789A.CPP.Z,1",BI=88$
$LK,"OptSetNOP2",A="FL:::/Compiler/OptLib.CPP.Z,25",BI=89$
$LK,"FBO1_F64",A="FL:::/Compiler/OptLib.CPP.Z,94"$
$LK,"ICXorEqu",A="FL:::/Compiler/BackC.CPP.Z,737",BI=90$
$LK,"ICToUpper",A="FL:::/Compiler/BackB.CPP.Z,355",BI=91$
$LK,"AsmLexExpression",A="FL:::/Compiler/AsmLib.CPP.Z,129",BI=92$
$LK,"ICMov",A="FL:::/Compiler/BackLib.CPP.Z,435",BI=93$
$LK,"ICXorEqu",A="FL:::/Compiler/BackC.CPP.Z,582",BI=90$
$LK,"ICToUpper",A="FL:::/Compiler/BackB.CPP.Z,266",BI=91$
$LK,"AsmLexExpression",A="FL:::/Compiler/AsmLib.CPP.Z,127",BI=92$
$LK,"ICMov",A="FL:::/Compiler/BackLib.CPP.Z,430",BI=93$
$LK,"ICNot",A="FL:::/Compiler/BackB.CPP.Z,10",BI=94$
$LK,"ICMul",A="FL:::/Compiler/BackA.CPP.Z,286",BI=95$
$LK,"ICMul",A="FL:::/Compiler/BackA.CPP.Z,263",BI=95$
$LK,"ICRex",A="FL:::/Compiler/BackLib.CPP.Z,22",BI=96$
$LK,"ICPop",A="FL:::/Compiler/BackLib.CPP.Z,354",BI=97$
$LK,"MDR_RIP_REL",A="FL:::/Compiler/BackLib.CPP.Z,139"$
$LK,"SLASH_OP_FADD",A="FL:::/Compiler/BackLib.CPP.Z,264"$
$LK,"ICPop",A="FL:::/Compiler/BackLib.CPP.Z,348",BI=97$
$LK,"SLASH_OP_FADD",A="FL:::/Compiler/BackLib.CPP.Z,258"$
$LK,"MODR_RIP_REL",A="FL:::/Compiler/BackLib.CPP.Z,137"$
$LK,"LexStmt2Bin",A="FL:::/Compiler/CMain.CPP.Z,1",BI=98$
$LK,"ICSub",A="FL:::/Compiler/BackA.CPP.Z,207",BI=99$
$LK,"ICSub",A="FL:::/Compiler/BackA.CPP.Z,205",BI=99$
$LK,"COCFloatConstFind",A="FL:::/Compiler/PrsLib.CPP.Z,164",BI=100$
$LK,"ICPut",A="FL:::/Compiler/CExcept.CPP.Z,186",BI=101$
$LK,"ICPut",A="FL:::/Compiler/CExcept.CPP.Z,184",BI=101$
$LK,"PrsArrayDims",A="FL:::/Compiler/PrsVar.CPP.Z,247",BI=102$
$LK,"ICSqr",A="FL:::/Compiler/BackC.CPP.Z,582",BI=103$
$LK,"ICSqr",A="FL:::/Compiler/BackC.CPP.Z,457",BI=103$
$LK,"FBO1_NOT_CONST",A="FL:::/Compiler/OptLib.CPP.Z,92"$
$LK,"CMP_TEMPLATES_DONT_POP",A="FL:::/Compiler/Templates.CPP.Z,178"$
$LK,"PrsClass",A="FL:::/Compiler/PrsStmt.CPP.Z,1",BI=104$
$LK,"MemberMetaData",A="FL:::/Compiler/LexLib.CPP.Z,45",BI=105$
$LK,"ICSwitch",A="FL:::/Compiler/BackC.CPP.Z,758",BI=106$
$LK,"OptBrNotZero",A="FL:::/Compiler/OptLib.CPP.Z,358",BI=107$
$LK,"ICSwitch",A="FL:::/Compiler/BackC.CPP.Z,603",BI=106$
$LK,"OptBrNotZero",A="FL:::/Compiler/OptLib.CPP.Z,357",BI=107$
$LK,"LexPutToken",A="FL:::/Compiler/CExcept.CPP.Z,1",BI=108$
$LK,"SLASH_OP_FDIV",A="FL:::/Compiler/BackLib.CPP.Z,268"$
$LK,"SLASH_OP_FDIV",A="FL:::/Compiler/BackLib.CPP.Z,262"$
$LK,"AsmHashLoad",A="FL:::/Compiler/AsmInit.CPP.Z,50",BI=109$
$LK,"UAsmHashLoad",A="FL:::/Compiler/UAsm.CPP.Z,188",BI=110$
$LK,"UnusedExternWarning",A="FL:::/Compiler/CExcept.CPP.Z,104",BI=111$
$LK,"SLASH_OP_FILD",A="FL:::/Compiler/BackLib.CPP.Z,273"$
$LK,"ICXorXor",A="FL:::/Compiler/BackB.CPP.Z,98",BI=112$
$LK,"SLASH_OP_FILD",A="FL:::/Compiler/BackLib.CPP.Z,267"$
$LK,"ICXorXor",A="FL:::/Compiler/BackB.CPP.Z,75",BI=112$
$LK,"PrsTryBlk",A="FL:::/Compiler/PrsStmt.CPP.Z,838",BI=113$
$LK,"CInit",A="FL:::/Compiler/CMain.CPP.Z,684",BI=114$
$LK,"CInit",A="FL:::/Compiler/CMain.CPP.Z,683",BI=114$
$LK,"MemberMetaFind",A="FL:::/Compiler/LexLib.CPP.Z,56",BI=115$
$LK,"ExePrint2",A="FL:::/Compiler/CMain.CPP.Z,646",BI=116$
$LK,"FBO1_INT",A="FL:::/Compiler/OptLib.CPP.Z,93"$
$LK,"PE_DO_UNARY_OP",A="FL:::/Compiler/PrsExp.CPP.Z,8"$
$LK,"PrsVarInit",A="FL:::/Compiler/PrsVar.CPP.Z,1",BI=117$
$LK,"ICOrEqu",A="FL:::/Compiler/BackC.CPP.Z,716",BI=118$
$LK,"ICModr1",A="FL:::/Compiler/BackLib.CPP.Z,141",BI=119$
$LK,"ICModr2",A="FL:::/Compiler/BackLib.CPP.Z,223",BI=120$
$LK,"SLASH_OP_FMUL",A="FL:::/Compiler/BackLib.CPP.Z,267"$
$LK,"ICPreIncDec",A="FL:::/Compiler/BackB.CPP.Z,393",BI=121$
$LK,"PrsAsmInstruction",A="FL:::/Compiler/Asm.CPP.Z,390",BI=122$
$LK,"PrsUnaryTerm",A="FL:::/Compiler/PrsExp.CPP.Z,588",BI=123$
$LK,"MemberLstDel",A="FL:::/Compiler/LexLib.CPP.Z,157",BI=124$
$LK,"SLASH_OP_FSUB",A="FL:::/Compiler/BackLib.CPP.Z,265"$
$LK,"ICAndAnd",A="FL:::/Compiler/BackB.CPP.Z,31",BI=125$
$LK,"InstEntriesCompare",A="FL:::/Compiler/UAsm.CPP.Z,1",BI=126$
$LK,"SLASH_OP_IMUL",A="FL:::/Compiler/BackLib.CPP.Z,259"$
$LK,"SLASH_OP_FSTP",A="FL:::/Compiler/BackLib.CPP.Z,271"$
$LK,"COCDel",A="FL:::/Compiler/PrsLib.CPP.Z,186",BI=127$
$LK,"ICOrEqu",A="FL:::/Compiler/BackC.CPP.Z,561",BI=118$
$LK,"ICModr1",A="FL:::/Compiler/BackLib.CPP.Z,139",BI=119$
$LK,"ICModr2",A="FL:::/Compiler/BackLib.CPP.Z,217",BI=120$
$LK,"SLASH_OP_FMUL",A="FL:::/Compiler/BackLib.CPP.Z,261"$
$LK,"ICPreIncDec",A="FL:::/Compiler/BackB.CPP.Z,304",BI=121$
$LK,"PrsUnaryTerm",A="FL:::/Compiler/PrsExp.CPP.Z,588",BI=122$
$LK,"MemberLstDel",A="FL:::/Compiler/LexLib.CPP.Z,157",BI=123$
$LK,"SLASH_OP_FSUB",A="FL:::/Compiler/BackLib.CPP.Z,259"$
$LK,"ICAndAnd",A="FL:::/Compiler/BackB.CPP.Z,30",BI=124$
$LK,"InstEntriesCompare",A="FL:::/Compiler/UAsm.CPP.Z,1",BI=125$
$LK,"SLASH_OP_IMUL",A="FL:::/Compiler/BackLib.CPP.Z,253"$
$LK,"SLASH_OP_FSTP",A="FL:::/Compiler/BackLib.CPP.Z,265"$
$LK,"COCDel",A="FL:::/Compiler/PrsLib.CPP.Z,186",BI=126$
$LK,"PE_UNARY_TERM1",A="FL:::/Compiler/PrsExp.CPP.Z,1"$
$LK,"ICFAdd",A="FL:::/Compiler/BackFB.CPP.Z,602",BI=128$
$LK,"ICFAdd",A="FL:::/Compiler/BackFB.CPP.Z,502",BI=127$
$LK,"PE_UNARY_TERM2",A="FL:::/Compiler/PrsExp.CPP.Z,2"$
$LK,"CmdLinePmt",A="FL:::/Compiler/CMisc.CPP.Z,88",BI=129$
$LK,"AsmMakeArgMask",A="FL:::/Compiler/Asm.CPP.Z,172",BI=130$
$LK,"COCHeaderPut",A="FL:::/Compiler/PrsLib.CPP.Z,229",BI=131$
$LK,"PrsGlblInit",A="FL:::/Compiler/PrsVar.CPP.Z,206",BI=132$
$LK,"ICAndEqu",A="FL:::/Compiler/BackC.CPP.Z,695",BI=133$
$LK,"LexD2I32",A="FL:::/Compiler/CMisc.CPP.Z,52",BI=134$
$LK,"MemberLstNew",A="FL:::/Compiler/LexLib.CPP.Z,150",BI=135$
$LK,"LexD3I32",A="FL:::/Compiler/CMisc.CPP.Z,68",BI=136$
$LK,"OptClassFwd",A="FL:::/Compiler/OptLib.CPP.Z,9",BI=137$
$LK,"ICFCmp",A="FL:::/Compiler/BackFA.CPP.Z,545",BI=138$
$LK,"PrsSwitch",A="FL:::/Compiler/PrsStmt.CPP.Z,575",BI=139$
$LK,"ICFDiv",A="FL:::/Compiler/BackFB.CPP.Z,590",BI=140$
$LK,"AOTStoreCodeU8At",A="FL:::/Compiler/AsmLib.CPP.Z,108",BI=141$
$LK,"CmdLinePmt",A="FL:::/Compiler/CMisc.CPP.Z,88",BI=128$
$LK,"AsmMakeArgMask",A="FL:::/Compiler/Asm.CPP.Z,172",BI=129$
$LK,"COCHeaderPut",A="FL:::/Compiler/PrsLib.CPP.Z,229",BI=130$
$LK,"PrsGlblInit",A="FL:::/Compiler/PrsVar.CPP.Z,206",BI=131$
$LK,"ICAndEqu",A="FL:::/Compiler/BackC.CPP.Z,540",BI=132$
$LK,"LexD2I32",A="FL:::/Compiler/CMisc.CPP.Z,52",BI=133$
$LK,"MemberLstNew",A="FL:::/Compiler/LexLib.CPP.Z,150",BI=134$
$LK,"LexD3I32",A="FL:::/Compiler/CMisc.CPP.Z,68",BI=135$
$LK,"OptClassFwd",A="FL:::/Compiler/OptLib.CPP.Z,9",BI=136$
$LK,"ICFCmp",A="FL:::/Compiler/BackFA.CPP.Z,515",BI=137$
$LK,"PrsSwitch",A="FL:::/Compiler/PrsStmt.CPP.Z,574",BI=138$
$LK,"ICFDiv",A="FL:::/Compiler/BackFB.CPP.Z,491",BI=139$
$LK,"AOTStoreCodeU8At",A="FL:::/Compiler/AsmLib.CPP.Z,106",BI=140$
$LK,"PE_PUSH_LOWER",A="FL:::/Compiler/PrsExp.CPP.Z,11"$
$LK,"OptPass6Lag",A="FL:::/Compiler/OptPass6.CPP.Z,28",BI=142$
$LK,"OptLag1",A="FL:::/Compiler/OptLib.CPP.Z,51",BI=143$
$LK,"OptLag2",A="FL:::/Compiler/OptLib.CPP.Z,62",BI=144$
$LK,"StreamPrint",A="FL:::/Compiler/CMisc.CPP.Z,29",BI=145$
$LK,"ICFCvt",A="FL:::/Compiler/BackFA.CPP.Z,121",BI=146$
$LK,"StreamDir",A="FL:::/Compiler/CMisc.CPP.Z,43",BI=147$
$LK,"PrsOffsetOf",A="FL:::/Compiler/PrsExp.CPP.Z,348",BI=148$
$LK,"MDR_REG",A="FL:::/Compiler/BackLib.CPP.Z,132"$
$LK,"GetOption",A="FL:::/Compiler/CMisc.CPP.Z,6",BI=149$
$LK,"PrsDoWhile",A="FL:::/Compiler/PrsStmt.CPP.Z,503",BI=150$
$LK,"ICShift",A="FL:::/Compiler/BackA.CPP.Z,694",BI=151$
$LK,"ICFMod",A="FL:::/Compiler/BackFA.CPP.Z,249",BI=152$
$LK,"COCPop",A="FL:::/Compiler/PrsLib.CPP.Z,121",BI=153$
$LK,"PrsExpression2",A="FL:::/Compiler/PrsExp.CPP.Z,65",BI=154$
$LK,"SLASH_OP_PUSH",A="FL:::/Compiler/BackLib.CPP.Z,262"$
$LK,"OptPass6Lag",A="FL:::/Compiler/OptPass6.CPP.Z,28",BI=141$
$LK,"OptLag1",A="FL:::/Compiler/OptLib.CPP.Z,51",BI=142$
$LK,"OptLag2",A="FL:::/Compiler/OptLib.CPP.Z,62",BI=143$
$LK,"StreamPrint",A="FL:::/Compiler/CMisc.CPP.Z,29",BI=144$
$LK,"ICFCvt",A="FL:::/Compiler/BackFA.CPP.Z,123",BI=145$
$LK,"StreamDir",A="FL:::/Compiler/CMisc.CPP.Z,43",BI=146$
$LK,"PrsOffsetOf",A="FL:::/Compiler/PrsExp.CPP.Z,348",BI=147$
$LK,"GetOption",A="FL:::/Compiler/CMisc.CPP.Z,6",BI=148$
$LK,"PrsDoWhile",A="FL:::/Compiler/PrsStmt.CPP.Z,502",BI=149$
$LK,"ICShift",A="FL:::/Compiler/BackA.CPP.Z,609",BI=150$
$LK,"ICFMod",A="FL:::/Compiler/BackFA.CPP.Z,242",BI=151$
$LK,"COCPop",A="FL:::/Compiler/PrsLib.CPP.Z,121",BI=152$
$LK,"PrsExpression2",A="FL:::/Compiler/PrsExp.CPP.Z,65",BI=153$
$LK,"SLASH_OP_PUSH",A="FL:::/Compiler/BackLib.CPP.Z,256"$
$LK,"PE_DEREFERENCE",A="FL:::/Compiler/PrsExp.CPP.Z,5"$
$LK,"LexPopRestore",A="FL:::/Compiler/LexLib.CPP.Z,23",BI=155$
$LK,"ICUnaries",A="FL:::/Compiler/BackB.CPP.Z,1",BI=156$
$LK,"ICFMul",A="FL:::/Compiler/BackFB.CPP.Z,572",BI=157$
$LK,"ICShiftEqu",A="FL:::/Compiler/BackA.CPP.Z,727",BI=158$
$LK,"LexExpression2Bin",A="FL:::/Compiler/PrsExp.CPP.Z,1112",BI=159$
$LK,"ICFPow",A="FL:::/Compiler/BackFA.CPP.Z,280",BI=160$
$LK,"MapFileWrite",A="FL:::/Compiler/CHash.CPP.Z,90",BI=161$
$LK,"ICFSub",A="FL:::/Compiler/BackFB.CPP.Z,638",BI=162$
$LK,"ICFModEqu",A="FL:::/Compiler/BackFA.CPP.Z,585",BI=163$
$LK,"CmpF1PushPop",A="FL:::/Compiler/OptLib.CPP.Z,529",BI=164$
$LK,"OptFree",A="FL:::/Compiler/OptLib.CPP.Z,33",BI=165$
$LK,"LexPopRestore",A="FL:::/Compiler/LexLib.CPP.Z,23",BI=154$
$LK,"ICUnaries",A="FL:::/Compiler/BackB.CPP.Z,1",BI=155$
$LK,"ICFMul",A="FL:::/Compiler/BackFB.CPP.Z,475",BI=156$
$LK,"ICShiftEqu",A="FL:::/Compiler/BackA.CPP.Z,639",BI=157$
$LK,"LexExpression2Bin",A="FL:::/Compiler/PrsExp.CPP.Z,1110",BI=158$
$LK,"ICFPow",A="FL:::/Compiler/BackFA.CPP.Z,266",BI=159$
$LK,"MapFileWrite",A="FL:::/Compiler/CHash.CPP.Z,90",BI=160$
$LK,"ICFSub",A="FL:::/Compiler/BackFB.CPP.Z,538",BI=161$
$LK,"ICFModEqu",A="FL:::/Compiler/BackFA.CPP.Z,545",BI=162$
$LK,"CmpF1PushPop",A="FL:::/Compiler/OptLib.CPP.Z,528",BI=163$
$LK,"OptFree",A="FL:::/Compiler/OptLib.CPP.Z,33",BI=164$
$LK,"CMP_TEMPLATES_DONT_PUSH2",A="FL:::/Compiler/Templates.CPP.Z,458"$
$LK,"CInternalType",A="FL:::/Compiler/CInit.CPP.Z,3"$
$LK,"LexDollar",A="FL:::/Compiler/Lex.CPP.Z,93",BI=166$
$LK,"AsmUnresolvedAdd",A="FL:::/Compiler/AsmResolve.CPP.Z,189",BI=167$
$LK,"AOTStoreCodeU8",A="FL:::/Compiler/AsmLib.CPP.Z,1",BI=168$
$LK,"MDR_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,133"$
$LK,"ICBitOps",A="FL:::/Compiler/BackB.CPP.Z,256",BI=169$
$LK,"LexDollar",A="FL:::/Compiler/Lex.CPP.Z,93",BI=165$
$LK,"AsmUnresolvedAdd",A="FL:::/Compiler/AsmResolve.CPP.Z,188",BI=166$
$LK,"AOTStoreCodeU8",A="FL:::/Compiler/AsmLib.CPP.Z,1",BI=167$
$LK,"ICBitOps",A="FL:::/Compiler/BackB.CPP.Z,202",BI=168$
$LK,"lex_zeros",A="FL:::/Compiler/Lex.CPP.Z,91"$
$LK,"CSwitchCase",A="FL:::/Compiler/PrsStmt.CPP.Z,568"$
$LK,"AsmResolve",A="FL:::/Compiler/AsmResolve.CPP.Z,1",BI=170$
$LK,"CSwitchCase",A="FL:::/Compiler/PrsStmt.CPP.Z,567"$
$LK,"AsmResolve",A="FL:::/Compiler/AsmResolve.CPP.Z,1",BI=169$
$LK,"PrsAsmInst",A="FL:::/Compiler/Asm.CPP.Z,390",BI=170$
$LK,"COCCompile",A="FL:::/Compiler/PrsLib.CPP.Z,249",BI=171$
$LK,"Cmp",A="FL:::/Compiler/CMain.CPP.Z,419",BI=172$
$LK,"PrsPush2",A="FL:::/Compiler/PrsLib.CPP.Z,11",BI=173$
@@ -222,164 +220,188 @@ $LK,"ICArgPut",A="FL:::/Compiler/CExcept.CPP.Z,141",BI=174$
$LK,"UndefinedExtern",A="FL:::/Compiler/CExcept.CPP.Z,98",BI=175$
$LK,"OptIC4",A="FL:::/Compiler/OptPass4.CPP.Z,1",BI=176$
$LK,"OptIC6",A="FL:::/Compiler/OptPass6.CPP.Z,1",BI=177$
$LK,"ICCmpAndBranch",A="FL:::/Compiler/BackB.CPP.Z,556",BI=178$
$LK,"ICDivEqu",A="FL:::/Compiler/BackA.CPP.Z,452",BI=179$
$LK,"PrsWhile",A="FL:::/Compiler/PrsStmt.CPP.Z,483",BI=180$
$LK,"ICFCmpAndBranch",A="FL:::/Compiler/BackFB.CPP.Z,309",BI=181$
$LK,"Lex",A="FL:::/Compiler/Lex.CPP.Z,442",BI=182$
$LK,"ICTestAndBranch",A="FL:::/Compiler/BackB.CPP.Z,736",BI=183$
$LK,"ICCmpAndBranch",A="FL:::/Compiler/BackB.CPP.Z,468",BI=178$
$LK,"ICDivEqu",A="FL:::/Compiler/BackA.CPP.Z,408",BI=179$
$LK,"PrsWhile",A="FL:::/Compiler/PrsStmt.CPP.Z,482",BI=180$
$LK,"ICFCmpAndBranch",A="FL:::/Compiler/BackFB.CPP.Z,217",BI=181$
$LK,"Lex",A="FL:::/Compiler/Lex.CPP.Z,443",BI=182$
$LK,"ICTestAndBranch",A="FL:::/Compiler/BackB.CPP.Z,634",BI=183$
$LK,"uasm",A="FL:::/Compiler/Compiler.PRJ.Z,21"$
$LK,"MDR_SIB_D32_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,138"$
$LK,"MODR_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,131"$
$LK,"PE_MAYBE_MODIFIERS",A="FL:::/Compiler/PrsExp.CPP.Z,3"$
$LK,"PE_UNARY_MODIFIERS",A="FL:::/Compiler/PrsExp.CPP.Z,4"$
$LK,"AOTLocalsResolve",A="FL:::/Compiler/AsmResolve.CPP.Z,42",BI=184$
$LK,"PE_DO_BINARY_OP",A="FL:::/Compiler/PrsExp.CPP.Z,9"$
$LK,"CmpFixUpAOTAsm",A="FL:::/Compiler/CMain.CPP.Z,302",BI=185$
$LK,"OptLabelFwd",A="FL:::/Compiler/OptLib.CPP.Z,1",BI=186$
$LK,"ICOrOr",A="FL:::/Compiler/BackB.CPP.Z,63",BI=187$
$LK,"ICOrOr",A="FL:::/Compiler/BackB.CPP.Z,51",BI=187$
$LK,"LexExcept",A="FL:::/Compiler/CExcept.CPP.Z,81",BI=188$
$LK,"cmp_templates",A="FL:::/Compiler/CExts.CPP.Z,42"$
$LK,"CmpF2PushPop",A="FL:::/Compiler/OptLib.CPP.Z,536",BI=189$
$LK,"MDR_D32_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,135"$
$LK,"CmpF2PushPop",A="FL:::/Compiler/OptLib.CPP.Z,535",BI=189$
$LK,"CmpJoin",A="FL:::/Compiler/CMain.CPP.Z,35",BI=190$
$LK,"MDR_SIB_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,136"$
$LK,"PrsPop2",A="FL:::/Compiler/PrsLib.CPP.Z,16",BI=191$
$LK,"CMP_TEMPLATES",A="FL:::/Compiler/Templates.CPP.Z,4"$
$LK,"PrsAsmBlk",A="FL:::/Compiler/Asm.CPP.Z,901",BI=192$
$LK,"MODR_D8_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,132"$
$LK,"PrsAsmBlk",A="FL:::/Compiler/Asm.CPP.Z,899",BI=192$
$LK,"PrsAsmArg",A="FL:::/Compiler/Asm.CPP.Z,35",BI=193$
$LK,"LexFirstRem",A="FL:::/Compiler/Lex.CPP.Z,276",BI=194$
$LK,"LexFirstRem",A="FL:::/Compiler/Lex.CPP.Z,277",BI=194$
$LK,"MemberClassBaseFind",A="FL:::/Compiler/LexLib.CPP.Z,87",BI=195$
$LK,"MemberFind",A="FL:::/Compiler/LexLib.CPP.Z,67",BI=196$
$LK,"cmp",A="FL:::/Compiler/Compiler.PRJ.Z,16"$
$LK,"OptLag",A="FL:::/Compiler/OptLib.CPP.Z,40",BI=197$
$LK,"ICPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,434",BI=198$
$LK,"ICFPostIncDec",A="FL:::/Compiler/BackFB.CPP.Z,680",BI=199$
$LK,"ICTest",A="FL:::/Compiler/BackLib.CPP.Z,403",BI=200$
$LK,"ICModU64",A="FL:::/Compiler/BackC.CPP.Z,589",BI=201$
$LK,"ICPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,345",BI=198$
$LK,"ICFPostIncDec",A="FL:::/Compiler/BackFB.CPP.Z,580",BI=199$
$LK,"ICTest",A="FL:::/Compiler/BackLib.CPP.Z,398",BI=200$
$LK,"ICModU64",A="FL:::/Compiler/BackC.CPP.Z,464",BI=201$
$LK,"ICLastIns",A="FL:::/Compiler/BackLib.CPP.Z,59",BI=202$
$LK,"PrsAsmImm",A="FL:::/Compiler/Asm.CPP.Z,1",BI=203$
$LK,"LexExtStr",A="FL:::/Compiler/LexLib.CPP.Z,218",BI=204$
$LK,"ICAddSubEctEqu",A="FL:::/Compiler/BackA.CPP.Z,545",BI=205$
$LK,"ICAddSubEctImm",A="FL:::/Compiler/BackA.CPP.Z,57",BI=206$
$LK,"ICPush",A="FL:::/Compiler/BackLib.CPP.Z,303",BI=207$
$LK,"ICSwap",A="FL:::/Compiler/BackC.CPP.Z,633",BI=208$
$LK,"ICAddSubEctEqu",A="FL:::/Compiler/BackA.CPP.Z,478",BI=205$
$LK,"ICAddSubEctImm",A="FL:::/Compiler/BackA.CPP.Z,56",BI=206$
$LK,"ICPush",A="FL:::/Compiler/BackLib.CPP.Z,297",BI=207$
$LK,"ICSwap",A="FL:::/Compiler/BackC.CPP.Z,491",BI=208$
$LK,"CMP_TEMPLATES_DONT_PUSH",A="FL:::/Compiler/Templates.CPP.Z,267"$
$LK,"intermediate_code_table",A="FL:::/Compiler/CInit.CPP.Z,16"$
$LK,"ICZero",A="FL:::/Compiler/BackLib.CPP.Z,394",BI=209$
$LK,"ICZero",A="FL:::/Compiler/BackLib.CPP.Z,389",BI=209$
$LK,"CmpCtrlDel",A="FL:::/Compiler/Lex.CPP.Z,58",BI=210$
$LK,"ICClassPut",A="FL:::/Compiler/CExcept.CPP.Z,117",BI=211$
$LK,"ICAssign",A="FL:::/Compiler/BackC.CPP.Z,159",BI=212$
$LK,"ICFTemplateFun",A="FL:::/Compiler/BackFB.CPP.Z,704",BI=213$
$LK,"ICFTemplateFun",A="FL:::/Compiler/BackFB.CPP.Z,604",BI=213$
$LK,"MemberAdd",A="FL:::/Compiler/LexLib.CPP.Z,103",BI=214$
$LK,"PrsPush",A="FL:::/Compiler/PrsLib.CPP.Z,1",BI=215$
$LK,"SLASH_OP_FDIVR",A="FL:::/Compiler/BackLib.CPP.Z,269"$
$LK,"SLASH_OP_FISTTP",A="FL:::/Compiler/BackLib.CPP.Z,272"$
$LK,"SLASH_OP_FDIVR",A="FL:::/Compiler/BackLib.CPP.Z,263"$
$LK,"SLASH_OP_FISTTP",A="FL:::/Compiler/BackLib.CPP.Z,266"$
$LK,"CmpCtrlSize",A="FL:::/Compiler/Lex.CPP.Z,70",BI=216$
$LK,"ICLocalVarInit",A="FL:::/Compiler/BackC.CPP.Z,924",BI=217$
$LK,"PrsFor",A="FL:::/Compiler/PrsStmt.CPP.Z,526",BI=218$
$LK,"ICLocalVarInit",A="FL:::/Compiler/BackC.CPP.Z,762",BI=217$
$LK,"PrsFor",A="FL:::/Compiler/PrsStmt.CPP.Z,525",BI=218$
$LK,"PassTrace",A="FL:::/Compiler/CMisc.CPP.Z,11",BI=219$
$LK,"PrsPopDeref",A="FL:::/Compiler/PrsLib.CPP.Z,21",BI=220$
$LK,"ICCopyTemplate",A="FL:::/Compiler/BackFA.CPP.Z,75",BI=221$
$LK,"ICCopyTemplate",A="FL:::/Compiler/BackFA.CPP.Z,77",BI=221$
$LK,"PrsStmt",A="FL:::/Compiler/PrsStmt.CPP.Z,900",BI=222$
$LK,"PrsFun",A="FL:::/Compiler/PrsStmt.CPP.Z,132",BI=223$
$LK,"LexIncludeStr",A="FL:::/Compiler/Lex.CPP.Z,298",BI=224$
$LK,"LexIncludeStr",A="FL:::/Compiler/Lex.CPP.Z,299",BI=224$
$LK,"PrsType",A="FL:::/Compiler/PrsVar.CPP.Z,287",BI=225$
$LK,"CmpCtrlNew",A="FL:::/Compiler/Lex.CPP.Z,28",BI=226$
$LK,"cmp_type_flags_src_code",A="FL:::/Compiler/Lex.CPP.Z,327"$
$LK,"MODR_SIB_D8_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,135"$
$LK,"cmp_type_flags_src_code",A="FL:::/Compiler/Lex.CPP.Z,328"$
$LK,"PrsVarInit2",A="FL:::/Compiler/PrsVar.CPP.Z,123",BI=227$
$LK,"PrsPop",A="FL:::/Compiler/PrsLib.CPP.Z,6",BI=228$
$LK,"asm_seg_prefixes",A="FL:::/Compiler/Asm.CPP.Z,388"$
$LK,"ICMinMax",A="FL:::/Compiler/BackC.CPP.Z,510",BI=229$
$LK,"ICMinMax",A="FL:::/Compiler/BackC.CPP.Z,419",BI=229$
$LK,"CmpLoadDefines",A="FL:::/Compiler/CInit.CPP.Z,205",BI=230$
$LK,"PrsIf",A="FL:::/Compiler/PrsStmt.CPP.Z,456",BI=231$
$LK,"ICBuiltInFloatConst",A="FL:::/Compiler/BackLib.CPP.Z,413",BI=232$
$LK,"ICFUnaryMinus",A="FL:::/Compiler/BackFA.CPP.Z,198",BI=233$
$LK,"LexDocRead",A="FL:::/Compiler/Lex.CPP.Z,310",BI=234$
$LK,"PrsIf",A="FL:::/Compiler/PrsStmt.CPP.Z,455",BI=231$
$LK,"ICBuiltInFloatConst",A="FL:::/Compiler/BackLib.CPP.Z,408",BI=232$
$LK,"ICFUnaryMinus",A="FL:::/Compiler/BackFA.CPP.Z,194",BI=233$
$LK,"LexDocRead",A="FL:::/Compiler/Lex.CPP.Z,311",BI=234$
$LK,"CmpFixUpJITAsm",A="FL:::/Compiler/CMain.CPP.Z,174",BI=235$
$LK,"COCPopNoFree",A="FL:::/Compiler/PrsLib.CPP.Z,114",BI=236$
$LK,"ParenWarning",A="FL:::/Compiler/CExcept.CPP.Z,110",BI=237$
$LK,"PrsFunCall",A="FL:::/Compiler/PrsExp.CPP.Z,378",BI=238$
$LK,"ICDerefPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,473",BI=239$
$LK,"ICDerefPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,384",BI=239$
$LK,"Option",A="FL:::/Compiler/CMisc.CPP.Z,1",BI=240$
$LK,"ExeFile2",A="FL:::/Compiler/CMain.CPP.Z,655",BI=241$
$LK,"COptMemberVar",A="FL:::/Compiler/OptLib.CPP.Z,550"$
$LK,"COptMemberVar",A="FL:::/Compiler/OptLib.CPP.Z,549"$
$LK,"PE_CHECK_BINARY_OPS1",A="FL:::/Compiler/PrsExp.CPP.Z,6"$
$LK,"PE_CHECK_BINARY_OPS2",A="FL:::/Compiler/PrsExp.CPP.Z,7"$
$LK,"LexBackupLastChar",A="FL:::/Compiler/LexLib.CPP.Z,1",BI=242$
$LK,"Trace",A="FL:::/Compiler/CMisc.CPP.Z,19",BI=243$
$LK,"ICBrBitOps",A="FL:::/Compiler/BackC.CPP.Z,212",BI=244$
$LK,"ICBrBitOps",A="FL:::/Compiler/BackC.CPP.Z,210",BI=244$
$LK,"MODR_D32_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,133"$
$LK,"LexGetChar",A="FL:::/Compiler/Lex.CPP.Z,107",BI=245$
$LK,"LexSkipEol",A="FL:::/Compiler/Lex.CPP.Z,269",BI=246$
$LK,"ICFlagBranch",A="FL:::/Compiler/BackB.CPP.Z,785",BI=247$
$LK,"SLASH_OP_FSUBR",A="FL:::/Compiler/BackLib.CPP.Z,266"$
$LK,"ICFPreIncDec",A="FL:::/Compiler/BackFB.CPP.Z,660",BI=248$
$LK,"LexSkipEol",A="FL:::/Compiler/Lex.CPP.Z,270",BI=246$
$LK,"ICFlagBranch",A="FL:::/Compiler/BackB.CPP.Z,682",BI=247$
$LK,"SLASH_OP_FSUBR",A="FL:::/Compiler/BackLib.CPP.Z,260"$
$LK,"ICFPreIncDec",A="FL:::/Compiler/BackFB.CPP.Z,560",BI=248$
$LK,"MODR_SIB_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,134"$
$LK,"ExeFile",A="FL:::/Compiler/CMain.CPP.Z,616",BI=249$
$LK,"COCMiscNew",A="FL:::/Compiler/PrsLib.CPP.Z,143",BI=250$
$LK,"cmp_templates_dont_pop",A="FL:::/Compiler/CExts.CPP.Z,43"$
$LK,"CmpOffset2Reg",A="FL:::/Compiler/OptLib.CPP.Z,83",BI=251$
$LK,"PrsFunNew",A="FL:::/Compiler/PrsLib.CPP.Z,62",BI=252$
$LK,"StreamExePrint",A="FL:::/Compiler/CMain.CPP.Z,666",BI=253$
$LK,"StreamExePrint",A="FL:::/Compiler/CMain.CPP.Z,665",BI=253$
$LK,"COCGoToLabelFind",A="FL:::/Compiler/PrsLib.CPP.Z,152",BI=254$
$LK,"OptMVCompare",A="FL:::/Compiler/OptLib.CPP.Z,556",BI=255$
$LK,"ICToBool",A="FL:::/Compiler/BackB.CPP.Z,378",BI=256$
$LK,"OptMVCompare",A="FL:::/Compiler/OptLib.CPP.Z,555",BI=255$
$LK,"ICToBool",A="FL:::/Compiler/BackB.CPP.Z,289",BI=256$
$LK,"PrsFunJoin",A="FL:::/Compiler/PrsStmt.CPP.Z,68",BI=257$
$LK,"PrsNoUnusedWarn",A="FL:::/Compiler/PrsStmt.CPP.Z,787",BI=258$
$LK,"OptFixSizeOf",A="FL:::/Compiler/OptLib.CPP.Z,485",BI=259$
$LK,"OptFixSizeOf",A="FL:::/Compiler/OptLib.CPP.Z,484",BI=259$
$LK,"cmp_templates_dont_push",A="FL:::/Compiler/CExts.CPP.Z,45"$
$LK,"cmp_templates_dont_push_pop",A="FL:::/Compiler/CExts.CPP.Z,46"$
$LK,"LexAttachDoc",A="FL:::/Compiler/Lex.CPP.Z,330",BI=260$
$LK,"LexAttachDoc",A="FL:::/Compiler/Lex.CPP.Z,331",BI=260$
$LK,"PrsStreamBlk",A="FL:::/Compiler/PrsStmt.CPP.Z,801",BI=261$
$LK,"cmp_templates_dont_push2",A="FL:::/Compiler/CExts.CPP.Z,44"$
$LK,"InstEntryFind",A="FL:::/Compiler/UAsm.CPP.Z,66",BI=262$
$LK,"PrsDotDotDot",A="FL:::/Compiler/PrsVar.CPP.Z,381",BI=263$
$LK,"ICMulEqu",A="FL:::/Compiler/BackA.CPP.Z,344",BI=264$
$LK,"ICMulEqu",A="FL:::/Compiler/BackA.CPP.Z,322",BI=264$
$LK,"AsmPrsInsFlags",A="FL:::/Compiler/AsmInit.CPP.Z,1",BI=265$
H2@÷#÷#$$!$&$Q$S$†$p$–$�$®$Á$¨+>k>kTk\kgksk~k�k€k©k¯k¯kÖkãkl'l'lQlsl‹lxl—l½lªlÑlŞl m mm.mAmAmAmKmH<Jöö0ö:ö>öBöGöIöeö�ö�ö‹ö|ªÅ.ú.úXúZúaúgúmúoúuú{ú‚ú�úœú¯ú½úÌúÑúÓúØúâúòúûû3ûEû8şßşßà àà à'à)à.àd`µîÓîÓ ÔÔÔ Ô,Ô.Ô:Ô:ÔGÔIÔVÔXÔdÔdÔzÔƒÔƒÔ�Ô•Ô¤Ô¯ÔµÔºÔ¼ÔÈÔÏÔŞÔéÔïÔôÔöÔÕ2ÕXÕhÕxÕˆÕŠÕšÕªÕºÕºÕ¿ÕÙÕàÕçÕçÕçÕçÕîÕÖÖÖÖ"Ö&Ö&Ö&ÖSÖZÖpÖ|Ö‚ÖˆÖ�Ö�Ö�Ö�ÖDÃ�Ö�Ö´Ö·ÖºÖÇÖÍÖÚÖİÖàÖæÖèÖòÖ,cj¨‡¨‡¶‡À‡Ë‡Ö‡Ü‡â‡ jnÖÖäùÿ
P o6o6}6Œ6¤6ª6¼6¼6Ç6Ğ6Ö6İ6ã6 œ;^öEöEşEFF.FAF^FFˆF™FÀF×F×FùFGGG%GWGdGhGpGpGƒG“G—G›G Œ×öFFfnr€†ŒŒ¹Ïãñ -LUegnntt„␍|1W#W#m#v#�#š#š#�#¬#²#»#½#Ã#Ì#Î#Ô#Ş#å#è#è#ò#0 'ğ…ğ…ş…†$†*†*†0†„•²@�@�T�[�b�f�Š���¤�µ�Ú�å�ğ�ò�ı�"�-�8�:�A�J�L�W�^�ˆ�("ÆÜÆÜÕÜèÜİİİ nÜnÜ}Ü�ܖ܃�¯�¯µ¯¼¯Ó¯ß¯ê¯ü¯␍°ş¯ü¯-°H°T°[°a°m°w°~°…°‰°‹°‘°�°§°®°µ°¹°¹°Ã°È°Ó°å°ö°ç°å°±7±C±J±P±\±f±m±t±x±z±€±Œ±–±�±¤±¨±¨±µ±Ã±Ó±å±ö±ç±å±²7²C²J²P²\²f²m²t²x²z²€²Œ²–²�²¤²¨²¨²²²Â²Ô²å²Ö²Ô²³ ³³³(³/³6³:³<³B³N³X³_³f³j³j³t³‚³‹³¤³°³´³´³·³À³6´ìÆ{Æ{ã{�¡ë{ı{|$|6|=|N|V|^|a|o|›|›|°|²|²|¾|Æ|Ê|×|×|ã|ë|ï|ü|ü|ü|}#}4}4}9}Q}`}e}k}v}{}{}€}˜}§}¬}²}½}Â}Â}Ğ}Ù}å}í}õ}ı}~~ ~~&~/~@~P~P~U~]~e~h~n~n~s~s~s~y~|~ƒ~�~£~È~ß~ì~ô~ü~!*.1=CJOO]mmzz‚Š“¢§§®¹¿ÇÍØİİì÷ €€€€"€-€?€E€M€S€X€X€l€r€}€ƒ€…€•€›€›€½€ä€é€é€ı€��*�0�5�N�T�d�l�t�z���“�™�¯�À�Æ�Ë�ä�ê�ú�‚
‚‚‚‚+‚1‚G‚X‚^‚c‚r‚x‚‰‚‘‚™‚Ÿ‚¦‚«‚«‚Á‚ǂ݂î‚ô‚ö‚ƒ ƒƒƒ%ƒ+ƒ2ƒ2ƒ2ƒDƒMƒ^ƒnƒnƒsƒsƒ�ƒ‰ƒšƒ­ƒ´ƒºƒƒȃ؃ރæƒìƒìƒìƒñƒñƒñƒñƒñƒ„„!„!„7„@„K„T„_„j„o„o„…„‹„¡„²„¸„½„τՄڄ󄅅……"…*…-…3…9…>…>…b…j…r…‚…ˆ…�…�…Ÿ…½…½…Â…Â…Î…Ö…Ù…à…æ…ë…ë… ††#†)†0†N†]†e†}†…†ˆ†�†•†­†µ†͆Õ†؆߆å†å†å†‡‡ ‡(‡+‡2‡8‡H‡W‡c‡~‡†‡‰‡�‡–‡®‡º‡Õ‡݇à‡ç‡í‡í‡í‡í‡ò‡ò‡û‡ ˆ!ˆ'ˆ?ˆRˆXˆ]ˆoˆuˆzˆ–ˆœˆ¨ˆ°ˆ³ˆºˆÀˆéˆñˆ‰‰‰‰‰‰‰‰4‰J‰P‰h‰{‰�‰†‰±‰·‰ʉŠŠ/Š7Š=ŠBŠBŠ\ŠhŠtŠŠŠ„Š„Š�ŠªŠ¶ŠÁŠÁŠÆŠÆŠàŠìŠøŠ‹‹‹‹‹$‹0‹6‹;‹M‹S‹X‹g‹s‹‹…‹‹‹’‹¥‹°‹¹‹Å‹Í‹Ğ‹Ö‹Ü‹á‹õ‹Œ Œ$Œ,Œ/Œ5Œ;ŒSŒ[Œ{Œ•Œ�Œ Œ¦Œ¬Œ¬Œ½ŒÆŒÒŒÚŒİŒäŒêŒïŒ���0�8�;�B�H�`�h�‡�¡�©�¬�³�¹�¹�É�Ò�Ş�æ�é�ï�õ�ú���%�?�G�J�P�V�n�v�˜�´�¼�¿�Å�Ë�Ë�Ü�å�ñ�ù�ü�� �� �/�7�R�Z�]�d�j�‚�Š�¬�É�Ñ�Ô�Û�á�á�á�á�á�æ�æ�ü�����+�1�6�D�P�Y�e�m�p�w�}�‚�”�£�«�Ã�Ë�Î�Õ�Û�ó�û�‘4‘<‘?‘F‘L‘L‘L‘]‘f‘r‘z‘}‘„‘Š‘�‘¡‘°‘¼‘בß‘â‘é‘ï‘’’5’R’Z’]’d’j’j’j’j’j’o’o’‚’�’£’®’³’³’Æ’Ü’â’í’ï’ï’“%“+“6“6“H“Q“b“g“y“‰“‰“�“�“¡“·“½“˓ړߓߓò“”””+”0”0”F”L”i”�”�”«”±”¶””˔ڔڔߔߔõ”û”•0•0•Z•`•e•q•z•‰•‰•�•�•¤•ª•Ǖߕߕ ––– –)–8–8–=–=–S–Y–v–�–�–¸–¾–À–Ì–Õ–à–à–à–à–å–ó–ü–␍——!—.—.—.—>—N—S—w—ƒ—„—‰—�—»—Ë—ï—ÿ—˜˜˜
˜˜$˜7˜u˜…˜‹˜�˜’˜£˜²˜ä˜ì˜ò˜ô˜ù˜™™ ™™.™7™F™F™K™P™_™h™s™u™~™‰™‰™ª™±™·™¿™Ê™Ğ™à™æ™î™ù™ÿ™ÿ™š šššš%š.š=š=š=šBšBšBšTšYšYškšvš~š†šŒšŒšŒš‘š‘šœš­š°š¼šÅšÑšØšŞšãšãšîšÿš›››#›*›0›5›5›5›5›:›?›?›F›J›J›V›_›b›b›m›o›�›ˆ›�›�›¨›³›¹››Æ›Æ›Ò›Û›Ş›Ş›é›ë›ı›œ
œœœ(œ.œ8œ;œ?œ?œGœNœQœSœ^œbœkœnœnœyœ{œ“œšœ¥œ°œ³œ¹œ¾œ¾œÅœÉœÉœÕœŞœáœáœìœîœ��␍��'�2�8�A�E�E�Q�Z�]�]�h�j�|�ƒ�‰�‘�œ�§�­�·�º�¾�¾�Æ�Í�Ğ�Ò�İ�á�ê�í�í�ø�ú���$�/�2�8�=�=�O�S�S�_�h�k�k�v�x�Š�‘�—�©�´�¿�Å�Ê�Ê�Õ�Ú�Ú�å�ê�ê�õ�ø�ü�ŸŸ␍ŸŸŸ&Ÿ+Ÿ+Ÿ8Ÿ<ŸMŸUŸYŸmŸtŸxŸxŸ…Ÿ‘Ÿ™ŸŸŸ¯Ÿ³ŸÄŸÖŸáŸåŸåŸòŸúŸ      
H2@_#_#h#n#‰#�#¹#»#î#Ø#ş#$$)$¨­Ó¾\¾\Ô\Ü\ç\ó\]õ\"](](]R]Y]„]’]’]¿]á]ù]æ]^4^!^K^R^}^}^„^¨^¾^¾^¾^È^H>L6ø6øPøZø^øbøgøiø‚ø›ø›ø¥øp©ÁFüFüpürüyüü…ü‡ü�ü“ü©ü¼üËüĞüÒü×üáüöü ı ı/ıAı8ãããã'ã0ã7ã9ã>ãd`µVÖVÖtÖxÖ…Ö‡Ö”Ö–Ö¢Ö¢Ö¯Ö±Ö¾ÖÀÖÌÖÌÖâÖëÖëÖöÖıÖ ×××"×$×0×7×F×Q×W×\×^×jך×À×Ğ×à×ğ×òרØ"Ø"Ø'ØAØHØOØOØOØOØVØlØxØ~؄؊Ø�Ø�Ø�Ø»ØÂØØØäØêØğØöØøØøØÙDÃÙÙÙ Ù"Ù/Ù5ÙBÙEÙHÙNÙPÙZÙ,cjЈЈވèˆóˆşˆ‰
‰ hl&&4IO
P ï5ï5ı5 6$6*6<6<6G6P6V6]6c6 œ;^®I®I¶IºIÓIæIùIJ7J@JQJuJŒJŒJ«JºJÃJĞJ×J KKK&K&K9KIKMKQK Œ×ö––¾ÂĞÖÜÜ  3AX^jo}™¢²´»»ÁÁÑ␍|1¿"¿"Õ"Ş"é"#####$#&#,#5#7#=#G#N#Q#Q#[#0 '‡‡&‡F‡L‡R‡R‡X‡„“°pŸpŸ„Ÿ‹Ÿ’Ÿ–ŸºŸÍŸÔŸåŸ
    " - R ] h j q z | ‡ � ¸ ("�Ş�Ş­ŞÄŞߪߪåŞ >Ş>ŞMŞcŞiރббõ±ü±² ²*²<²M²>²<²m²ˆ²”²›²¡²­²·²¾²Å²É²Ë²Ñ²İ²ç²î²õ²ù²ù²³³³%³6³'³%³V³w³ƒ³Š³�³œ³¦³­³´³¸³º³À³Ì³Ö³İ³ä³è³è³õ³´´%´6´'´%´V´w´ƒ´Š´�´œ´¦´­´´´¸´º´À´Ì´Ö´İ´ä´è´è´ò´µµ%µµµEµLµRµ^µhµoµvµzµ|µ‚µ�µ˜µŸµ¦µªµªµ´µÂµËµäµğµôµôµ÷µv¶Ôîî €T¦€%€A€L€^€e€v€~€†€‰€—€ÀÀØ€Ú€Ú€æ€î€õ€�����*�*�*�F�Q�b�b�g����“�™�¤�©�©�®�Æ�Õ�Ú�à�ë�ğ�ğ�ş�‚‚‚#‚+‚.‚4‚9‚B‚T‚]‚n‚~‚~‚ƒ‚‹‚“‚–‚œ‚œ‚¡‚¡‚¡‚§‚ª‚±‚¼‚Ñ‚ö‚␍ƒƒ"ƒ*ƒ6ƒBƒHƒOƒXƒ\ƒ_ƒkƒqƒxƒ}ƒ}ƒ‹ƒ›ƒ›ƒ¨ƒ¨ƒ°ƒ¸ƒÁƒЃÕƒÕƒ܃çƒíƒõƒûƒ„ „ „„%„7„=„E„K„P„[„m„s„{„�„†„†„š„ „«„±„³„ÄɄɄ…….…4…J…[…a…f…………•…�…¥…«…°…°…Ä…Ê…à…ñ…÷…ü…††+†3†;†A†F†F†\†b†x†‰†�†”†£†©†º††ʆІ׆܆܆ò†ø†‡ ‡%‡'‡6‡<‡F‡N‡V‡\‡c‡c‡c‡u‡~‡�‡Ÿ‡Ÿ‡¤‡¤‡²‡º‡ˇއå‡ë‡ó‡ù‡ ˆˆˆˆˆˆ"ˆ"ˆ"ˆ"ˆ"ˆAˆMˆRˆRˆhˆqˆ|ˆ…ˆ�ˆ›ˆ ˆ ˆ¶ˆ¼ˆÒˆãˆéˆîˆ‰‰ ‰$‰B‰B‰G‰G‰S‰[‰^‰d‰j‰o‰o‰“‰›‰£‰³‰¹‰¿‰¿‰Љî‰î‰ó‰ó‰ÿ‰Š
ŠŠŠŠŠ<ŠDŠTŠZŠaŠŠ‘Š™Š´Š¼Š¿ŠÆŠÌŠçŠïŠ
‹‹‹‹"‹"‹"‹A‹Q‹]‹e‹h‹o‹u‹…‹—‹£‹Á‹É‹Ì‹Ó‹Ù‹ô‹ŒŒ&Œ)Œ0Œ6Œ6Œ6Œ6Œ;Œ;ŒDŒTŒjŒpŒˆŒ›Œ¡Œ¦Œ¸Œ¾ŒÃŒߌåŒñŒùŒüŒ� �2�:�J�P�W�W�W�\�\�e�}�“�™�±�Ä�Ê�Ï�ú���J�\�y���‡�Œ�Œ�¦�²�¾�É�É�Î�Î�è�ô�� � ���*�6�B�M�M�R�R�h�n�z�€�…�—���¢�±�½�É�Ï�Õ�Ü�ï�ú����� �&�+�?�Q�Y�t�|��…�‹�¦�®�Ñ�î�ö�ù�ÿ�‘‘‘ ‘+‘3‘6‘=‘C‘H‘Z‘l‘t‘�‘—‘š‘¡‘§‘‘Ê‘ì‘ ’’’’!’!’1’:’F’N’Q’W’]’b’v’ˆ’�’­’µ’¸’¾’Ä’ß’ç’ “+“3“6“<“B“B“S“\“h“p“s“z“€“…“—“©“±“Ï“דÚ“á“ç“”
”/”O”W”Z”a”g”g”g”g”g”l”l”‚”ˆ”””š”Ÿ”±”·”¼”ʔ֔ߔë”ó”ö”ı”•••,•4•O•W•Z•a•g•‚•Š•¬•ɕѕԕەá•á•á•ò•û•–––– –6–H–T–r–z–}–„–Š–¥–±–Ö–ö–ş–—————————&—A—G—R—W—W—j—€—†—‘—“—“—¦—É—Ï—Ú—Ú—ì—õ—˜ ˜˜-˜-˜2˜2˜E˜[˜a˜o˜~˜ƒ˜ƒ˜–˜¬˜²˜À˜ϘÔ˜Ô˜ê˜ğ˜␍™%™%™O™U™Z™f™o™~™~™ƒ™ƒ™™™Ÿ™¼™Ô™Ô™ş™š ššš-š-š2š2šHšNškšƒšƒš­š³š¸šÄšÍšÜšÜšášáš÷šıš›2›2›\›b›d›p›y›„›„›„›„›‰›—› ›±›³›Å›Ò›Ò›Ò›â›ò›÷›œ'œ(œ-œBœ_œoœ“œ£œ©œ©œ©œ®œ³œÈœÛœ�)�/�1�6�G�V�ˆ���–�˜���¤�¤�­�¿�Ò�Û�ê�ê�ï�ô�� ���"�-�-�N�U�[�c�n�t�„�Š�’���£�£�¨�­�´�»�Â�É�Ò�á�á�á�æ�æ�æ�ø�ı�ı�ŸŸ"Ÿ*Ÿ0Ÿ0Ÿ0Ÿ5Ÿ5Ÿ@ŸQŸTŸ`ŸiŸuŸ|Ÿ‚Ÿ‡Ÿ‡Ÿ’Ÿ£Ÿ¦Ÿ²Ÿ»ŸÇŸΟԟٟٟٟٟޟãŸãŸîŸòŸòŸşŸ 
 
    , 8 F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F H H _ g s s ” ¢ º ¼ È Õ Õ ø ¡¡¡"¡-¡4¡4¡>¡>¡A¡S¡q¡}¡}¡¬£x¿Ù_4_4q4s4w4€4Œ4˜4­4­4Ù4İ4â4î45 5555$5.5°œÄ¾Œ¾ŒÔŒÛŒìŒñŒ�óŒ���$�<�)�H�K�M�[�`�u�b���„�„���¥�’�±�·�·�Ê�İ�ğ��� �„�^x^x|x�x”x›x¢x¤x§x®xµxµxÑxÕxÛxÛxóxyyy yDydy…yŠy«y°y¼yÇyÌyÙyÜyz$z)z/z1z7z:zKzPzSz[zdzzŸz¶zÉzÎzÒzôz{ {#{6{;{?{a{|{œ{¯{´{Å{Ê{Í{Ï{Õ{Û{ì{ñ{÷{ÿ{ÿ{ ||)|<|A|E|g|‚|¢|µ|º|Õ|õ| } }$}(}J}]}]}x}x}x}†}�} } } }®}Æ}È}È}Ö}î}î}~~ ~~,~L~f~m~w~Š~�~�~�~•~›~µ~¼~Æ~Ş~à~æ~ **DH‰—HƒHƒ_ƒuƒ…ƒŒƒ£ƒ¾ƒĞƒÔƒ„Lîı����¢�®�Ä�°�Ğ�Ò�å�ø����4IRvÓvÓÓÓ‚Ó�Ó�Ó¡Ó¦Óä;ôô.ô1ôOôfôwôwô’ô˜ô�ô�ô¸ô¾ôÃôÃôÌôÚôæôíôóôøô;õEõLõRõTõTõgõmõmõmõ}õrõ�õ�õ¯õ´õ´õ´õ»õÂõÉõŞõåõöööĞL¼ø¡ø¡¢¢(¢1¢9¢<¢C¢G¢P¢a¢e¢k¢y¢–¢£¢²¢·¢Ã¢È¢Ï¢Û¢à¢ã¢í¢å¢ı¢£££ £%£.£4£4£B£E£Y£b£k£r£v£{£’£ª£³£Á£İ£é£é£¤¤¤¤5¤A¤I¤\¤c¤w¤€¤‡¤‹¤–¤›¤¢¤¿¤ì¤ó¤÷¤ù¤¥¥¥)¥+¥<¥F¥Q¥[¥j¥y¥•¥•¥˜¥ ¥¥¥'¦Xs…nHnH‹HœH©H³HÊHçHI II"I(I+I7IŒ Ø_Ø_è_ ` ````` ` `'`A`R`Z`Z`e`e`s`ƒ`ƒ`‘`—`—`¯`¯`µ`Û`(kqè‡è‡ö‡ˆˆˆ ˆ @UaŞæŞæìæôæûæç'ç'ç*ç,ç2ç $/4^İ^İkİyİ~İ„İ!$).6İ6İCİQİVİ\İ"$#(İİİ$İ)İ/İ#4ğy__k{‘™£»ÀĞæîø  % 5 K S ] u � ‰ “ £ ¨ ¾ È Ò Ü æ ğ ú    " , 6 @ V ` j t ~ ˆ ’ œ ¦ ¼ Æ Ğ æ ğ ú !!!"!,!6!@!J!T!^!h!r!|!†!�!š!¤!®!¸!Â!Ì!Ö!à!ê!ô!ş!""""$¨D@™@™V™]™d™r™ƒ™•™—™�™¤™´™¿™É™Ô™ë™î™ğ™ššš"š,š3š>šSš[š[šqšqšqš…š%$5:†İ†İ”ݣݨݮİ&¨Ekˆšˆš�š¥š¬šºšËšİšßšæšìšüš›››3›6›8›J›Q›a›k›u›|›‡›››£›£›¹›¹›¹›Î›'(&,0000&0,020(0_g�G�G´GÇGÖGÜGßGçG)  ß– – ¸ À Æ Ó Ú ö ü ü ü     ' 3 > D N U f f q { { � “ £ © ® µ µ Ö Ü ë ş !! ! !!!!!!!.!8!=!=!R!\!\!p!y!!…!›! !§!º!¾!¾!Æ!Ì!Ò!Ü!ã!ê!ó!""*"."4":"I"\"b"f"l"r"x"x"z"~"„"Š"�"•"•"•"•"À"Ñ"Ñ"è"õ"ù"##6#6#<#?#C#I#I#[#l#�#•#�#®#²#Ã#Ç#Í#æ#è#î#û#ı# $'$-$8$[$f$l$r$x$�$‡$œ$ª$²$¶$Ç$Ë$Ñ$ê$ì$ò$ÿ$% %+%1%7%=%F%L%i%\%ƒ%Line truncated
''''+'F'V'c'r'�'�'¬'¬'³'È'Í'Ö'ã'è'î'ó'ó'ú'ş'((((!(%(/(;(B(F(N(V(^(m({(€(Œ(Œ(”(”(·(·(Å(Ë(Ğ(Ô(Ù(Ù(Ù(Ù(ß(á(á()
)))-)/)/)/):):):)?)h**4+t>Å>ÅXÅ\ÅtÅ|Å„Å�ŒřşųŻÅÀÅÃÅÎÅÙÅáÅìÅ÷ÅùÅÆÆÆ(Æ3Æ5Æ@ÆKÆMÆYÆbÆbÆxƂƙƟƥƶƼÆÅÆ×ÆİÆİÆåÆéÆôÆùÆ ÇÇÇ(Ç*Ç.Ç=Ç=Ç=ÇNÇNÇSÇeÇkÇÙÇ+Ô@.á.áDáKáNárárá�á¢áµáÈáÍáÍáëáùá â â'â'â)â)â)â<â>â>â>âEâXâkâkâkâ~â‰âœâ²â·â»âÂâ×âêâñâñâôâã,LAPÇ$Ç$Õ$æ$ò$␍%%2%4%O%j%j%r%y% %-P~�pˆpˆ~ˆ‹ˆ™ˆ«ˆ¶ˆÄˆÑˆßˆñˆüˆ
‰‰‰.4
66%616B6T6]6g6m6/|¼Wææ)OOXZZaˆ���­ÉÔÔàç÷ı&(AGRbt}ˆ�“š¿ÄÒÛÛâñ18?DOU]ƒŒ“˜£¯¾Ò×ßëıı  # 3 E K T T c i } † – ¥ · À Ğ ã ë ÿ 
7
;
G
^
z
Œ
’
�
©
¹
É
Î
×
×
é
í
ù
 , > D O [ k { � “ “ ˜ š š Ÿ Ÿ ® ´ º º ¾ 70�ÄäöÖöÖ××"×&×-×4×C×N×T×Y×[×g×n×v×|ׂ׆׆ולפתװײײ׾×18 ?/?/M/S/_/j/{/…/Œ/’/2@}‰&è&è4è?èFèeèrèrèuèwè}è3ğh ffŒŸ§®µ»½ÄËÎÎààóşBJS[`q‡—©®Èàääé*Fnv‡Œ�¯¿ÑÓí  %MU^fk|’¢´¹Óëï:'GSYq‰�£¿çïø(8JLf~‚‚�ÆÎ×ßäõ -2Ldh{{{€ ÀÌÒê *<Lcz‘¨¨¼ØØØù    + 9 T c j z | ‚ ™ ¨ ¡ ¾ Ï ê ê 
4D}Š^^n‚‹‘££§ª²5\Ob‡‡ ‡/‡8‡A‡E‡I‡U‡Z‡_‡_‡p‡t‡{‡“‡–‡¢‡60ıÖßÖßßßäßíßôßößûß7Ü4nnŒ“𥭯ÆÚóóş␍5AWe{„–¾ÕÚâæ ë(,,<yX…¢¢ÁÌÒèùş8OT\`ƒb‰Ÿ£¿çïôøı$2FKduy‹‹‹‹�¬ìËø &<MRn–�£§¬½Ïİñó !!3[rwƒ¦…¬ÂÆÓÓÓÓæìöı''CSaaw‡•¬¿ÄÊàïè)G?l•••¢Ûàëñü2">Tbz�”¤Ãïßû7BH^otŠ ¤Àèğõùş%3GLevzŒŒŒŒ‘­Ìûë$/5K\a}¥­²»ÌŞì,00Oe{ŒŒŒŸ¥¯Éàààü 0@UNi|�‡�¬¥ÁÑßüü%EEEe8Do|*39KKORZ9°Åí&�&�<�C�T�Y�n�[�z�€�€�Œ�¤�‘�°�³�µ�Ã�È�İ�Ê�é�ì�ì�ø�␍�ú�� � �2�E�X�k�~�ˆ�:<‹–Æ×àæêõ;”)ŞéŞéæéêéöéê êê$ê6êAêLê[êlêsêŒê�ê�ê�ê§ê®êÁêÊêØêìêë␍ë*ë<d(=0†0†<†P†S†g†o†s†}†‡†�†’†˜†=$t¹ÀEÀEäEçEëEøEF FF F*FRFRF^F`F`FlFqFqF}F‚F‚F�F“F“FŸF¤F¤F°FµFµFÁFÆFÆFÒF×F×F×FÚFÚFóFGG%G%G'G'G3G9G>G>GDGPGPG[GgGtG‰G‘G—G—G¨G¨G±G´GH>è w®£®£Ë£Ó£Ö£ä£ò£¤¤(¤>¤P¤[¤l¤p¤‚¤…¤�¤™¤¥¤¸¤é¤ޤĤù¤␍¥¥*¥8¥V¥h¥Œ¥�¥Ÿ¥À¥¦¥Û¥Û¥Ş¥ã¥æ¥æ¥í¥¦ ¦¦¦,¦9¦L¦L¦`¦d¦‘¦‘¦©¦®¦®¦¾¦ƦÖ¦à¦ğ¦ú¦
§§§§+§3§C§M§]§g§w§ƒ§ˆ§ˆ§ˆ§ª§¸§§ǧÔ§é§é§î§ø§¨ ¨¨¨¨¨&¨5¨:¨@¨E¨E¨K¨Q¨V¨V¨e¨x¨„¨‘¨�¨°¨¸¨¾¨Ǩިò¨©©©-©@©W©d©l©©‡©�©–©Ÿ©Ÿ©¤©¤©¤©¤©¤©°©°©°©¹©Ò©ç©ï©
ªª(ª*ª>ªCªCªCªNª\ªaªaªhªvª{ª“ªŸª±ª½ªêÒªÖªߪ誫«««0«8«@«m«~«‹«�«›«›« « «§«µ«º«Í«Ù«å«ë«ï«ø«ı«ı«ı«ı«ı«¬¬¬¬¬¬+¬+¬+¬+¬+¬+¬+¬+¬+¬+¬4¬M¬b¬j¬…¬–¬£¬¥¬¹¬ŬʬʬʬÓ¬í¬ù¬ş¬ ­,­,­1­1­1­1­1­1­1­1­F­K­K­K­\­g­l­l­w­‰­¡­³­Ô­ô­ÿ­®®®®®@®I®Z®^®v®†®�®–®¡®Ë®Ô®Ø®ğ®¯¯¯¯¯"¯[¯d¯h¯n¯s¯|¯…¯НННН™¯­¯˯Ö¯Û¯á¯æ¯æ¯ù¯␍°3°>°F°L°L°Q°Q°`°t°’°�°¢°¨°­°­°À°Ô°ú°±␍±±±±±±!±:±O±W±r±ƒ±�±’±¡±£±£±£±£±£±·±·±·±·±·±·±·±·±·±·±·±·±·±·±·±·±ƱÕ±à±â±â±ë±í±í±²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²"².².²2²7²G²b²w²†²’²¨²²ŲϲÛ²³!³A³e³g³z³¨³€³óóƳÖ³޳ù³
´␍´'´5´A´Y´Y´„´‡´–´ª´Ë´Ü´ø´ä´µ&µDµwµuµjµ_µPµ…µ…µ…µˆµ�µ�µªµ¸µæµ3¶6¶E¶Y¶z¶‹¶§¶“¶ööá¶···ü¶í¶"·"·"·%·*·*·1·A·b·n·ú?°«Ó–À–À¬À°À»ÀÂÀÍÀáÀáÀìÀıÀÁÁÁ*Á2ÁCÁCÁLÁQÁYÁiÁwÁ†Á‘Á¤Á¤Á·Á·ÁÍÁùÁùÁ␍ÂÂÂÂ!Â!Â+Â3Â3Â3ÂDÂDÂDÂHÂPÂVÂ[Â[Â_ÂgÂkÂqÂvÂv‚—§±ÂÄÂÉÂÑÂÑÂÖÂÖÂİÂéÂşÂÃà Ã&Ã9Ã>ÃFÃLÃLÃQÃXÃcËÖåï÷ýÃÏÃÕÃÚÃÚÃÚÃÚÃÚÃÚÃÚÃÚÃÚÃåÃñÃşÃÄÄÄ/Ä4Ä<ÄAÄIÄNÄNÄNÄVÄ^ÄgÄoÄtÄ|Ä�ÄˆÄ“Ä»ÄÆÄÎÄİÄçÄùÄşÄÅ Å ÅÅ"Å*Å=ÅEÅMÅbÅdÅoÅwŌŌŔŨŰŷŽÅÁÅÅÅÔÅÙÅåÅûÅÆÆ$Æ0Æ5ÆAÆLÆQÆQÆQÆrƌƑƙƨưƸÆÍÆÒÆİÆåÆúÆÿÆÿÆ Ç!Ç-Ç5ÇJÇVÇ[ÇgÇrÇwÇwÇwÇwÇwÇwǂǂǂǂǂǂǂǂǂǂǂǂÇ�Ç­ÇÊÇÚÇàÇèÇûÇÈÈÈÈÈ-È3È;ÈCÈEÈeÈmÈvÈ~ȆȋÈ�È—È¢ÈÊÈÕÈİÈìÈöÈÉÉÉ!É!É!É*É3É6É@ÉNÉ`ÉbÉtɆɆɆɑɖɳɸɸÉÁÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÑÉİÉéÉ ÊÊ$ÊDÊIÊQÊXÊeÊmÊvÊ~ʅʊʊʒʚʶʾÊÁÊÃÊÓÊİÊİÊİÊßÊòÊËË ËËËË Ë$Ë,Ë3Ë@ËYË`ËeË}ˇˢ˻ËÃËĞËéËğËğËõËõËõËõËõËõËõËıËÌÌ"Ì'Ì'Ì/Ì7ÌDÌIÌIÌIÌMÌRÌRÌbÌgÌgÌgÌsÌzÌ€Ì�̡̽ÌĞÌÖÌŞÌóÌúÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Í)Í7Í7Í<ÍGÍNÍjÍwÍwÍwÍ{͆ͤͲͪÏ@ü|®Ï®ÏÄÏÏÏÖÏáÏìÏĞĞĞ%Ğ8ĞBĞBĞ^ĞxĞЈĞ�Ğ’Ğ�ЧЮбжĞÌĞÖĞèĞîĞúĞÑÑÑ*Ñ?ÑFÑFÑFÑTÑbÑlÑoÑ}чъќѡѦѶѹѾÑÎÑÑÑÕÑŞÑæÑøÑÒÒÒÒ Ò2Ò8ÒDÒYÒ`ÒhÒzÒ€Ò�Ò Ò Ò§Ò§Ò§ÒµÒÃÒÍÒĞÒŞÒèÒëÒıÒÓÓÓÓ Ó/Ó2Ó6Ó?ÓGÓYÓaÓaÓmÓzÓ‚Ó‚Ó…Ó�Ó®Ó¼ÓÔAhoÅfØf؀ؚؓءجؿØÂØËØÒØÕØåØóØşØ Ù Ù"Ù.ÙCÙNÙYÙdÙoÙzÙ‘Ù�ٴټÙÅÙÍÙÚÙõÙøÙşÙÚÚÚ$Ú7Ú=ÚEÚEÚSÚeÚrÚ…Ú‹Ú“Ú¦Ú¬Ú´Ú´ÚİÚâÚÛÛÛ ÛÛÛ'ÛAÛMÛ]Û}Û™Û­ÛµÛ¿ÛŞÛòÛòÛhÜB 6+6+@+H+M+CÉÇfSfSƒS�S¡S�S»SÉSÉSÙSâSéSíSöSöSşST T,T8T>TITkTkT~T‰T�T–T›T›T®T¹TÄTËTÓTàTàTòT÷T÷TU U U U U$U7U=UDUYUmUmUrUrU‚U‡U‡UŒU“U›U¢U¤U¬U³U³UÂUÈUÕUÜUßUVV VV#V*V,V@VOVTVYVYVYVlVqV€V‡V�V£V·V·V¼V¼VÄVÚVßVóVúVÿVÿV WW,W;WNWRWaWoW}WŒW©W´W¹WÈWÜWãWêWúWüW
XXX*X7XGXNXcXjXvX‡X�X X¬X·X¹X¹XÄXØXåXíXïXYYY,Y8YYY`YlYŠYŠYŠY’Y�Y¡Y©Y­YµY¼YÌY×YñYöYıYZZZZZ-Z:ZHZSZ^ZlZrZxZ~Z‡Z�ZœZ©Z±Z½ZËZâZäZíZøZúZ[$[*[0[6[?[P[w[[‰[–[®[µ[Á[Ğ[å[å[ò[÷[ \\\\\Ë\DD�›NŒNŒbŒnŒ„ŒpŒ�Œ’Œ¤Œ¶Œ¾ŒEìˆÿ&Z&ZHZRZ…Z”ZªZÎZÓZ×ZßZèZ÷ZşZ[ [![2[Q[Y[[[z[‚[‘[˜[¤[©[°[¸[¾[À[Ü[á[÷[ã[\ \ \\\)\H\O\Q\p\w\w\w\‹\Ÿ\£\±\Ä\¼\Ü\á\ì\ó\û\]] ]$]:]&]F]L]L]h]m]†]r]’]˜]�]¹]¾]Ô]À]à]æ]í]õ]û]ı]^^4^ ^@^F^F^F^N^W^W^a^a^y^©^½^Á^Ï^â^Ú^ú^ú^ _FüE€îİîİ␍Ş)Ş.ŞOŞmŞ|ŞšŞ®ŞÆŞÍŞÒŞóŞß ß=ßNßeßißißmßrßwß�ß„ß�ߔ߱ߴߴߴ߹߿ßÛßéßõßşßàà#à?àJàVà_àsàsà‚à‡à‡à•àGl¬Ã¦D¦D´DÎD»DíDÚDùDEûD-EE9EGEOEZE\EgErErE‘E—EHP‡—FóFóZógóvó‚óˆó²óÈó´óßóÔó÷óÿóIŒg†ÖñÖñò+ò+ò>òBòaòuòzòzò‡ò�ò—ò¬ò¸òÉòÎòßòóòøòúòúòúòó+ó+óEóJP�­.7.7W7Y7g7m7‹7š7©7¸7Æ7Ñ7Ô7ä7Kì8n0n0˜0›0�0¤0©0À0×0î01&1M1P1i1€1’1Ÿ1²1Å1Ê1Ò1Ü1ä1ä1ë1ô1ô1ÿ1'2A2G2`2y2{2•2›2´2Í2Õ2à2à2ê2ê2ü2:3O3a3L$ty¶d¶dádÊdëdódMLu„ŞÇŞÇğÇÈÈ'È.È6ÈFÈNÈ_ÈeÈ—ÈNTHYˆbˆbšbœb¥b®b¼bÁbÊbÍbÒbàbêbíb÷bO¨!Gà`à`ğ`ù` aa%a1a=aIa`a`aoazaƒaŠa“aªa½aÂaÔaãaïabb
b*b*b,b?bAb[bgbjb�bPxîˆ(m(mAmLm\m¥m¬mÀmÇmÏm×màmèmğmòmúmn nn/nGnPnPn…n¯n¸nÚnôno;oGoiokoroyoyoœoµoÜoõop5p\pupœpµpÜpõpqq+q8q=q=qLqYq^q^qeqpq‚q›q´qÍqÏqÏqÏqÖqÖqãqèqèqèqùqrr/rirprprprxr•r£rÁrÊrÓràrîrs$s$s$s7sEsassssŠs�sºs¼sÓsÙsêsósõstttt t tDtFtMt^tgtitwtyt‡t‰t—t—t·t·t·t·tÄt×têt uu1u9u=uEuIuWueuguousuwuu�u›u›uµuÀuÖuèuv v*v4v;vTv`vgv€v€v’v—v™vŸv°vÁvĞv×vèvñvóvwwww!w!w!wEwEwbwiwpwsww‚w�w”w¢w¦w´w¸w¸wÑwØwİwëwüwxx9xLx[x]xlxnx}x‡x‡x•x�x´x»xàxåxy>yCyQySyayjy„y†yˆy�y y©y«y¹y»yÉyËyÙyÙyùyùyùyùyùyzzz#z?zdz}z‚z‚z‚z¤z©z©z©zÉzÎzÎzÎzízòzòzùzûzûz{{{ { {{{3{I{n{Š{�{£{£{¾{Ë{Í{Ü{å{ÿ{||||'|)|)|1|,|j|j|j|‰|‰|‰|ª|¯|¯|¯|Ñ|Ö|Ö|Ö|ö|û|û|û|} } }:}H}J}Y}b}|}~}~}ƒ}~}¤}¦}¦}®}©}ç}ç}ç}ò}ò}~~F~^~v~�~—~§~¼~Ô~è~/FMEƒQ|.>ä>äbävä�ä–ä´ä¿äİäİäİäêäååååå)å+å+å9åFå^å^åoåƒåRçe¾×¾×Ø×á×ØØØØØ Ø'Ø-Ø:Ø:ØWØ\Ø\ØbØgØgØmØrØrØxØ}Ø}ؕبخسسؼØÜØÜØÜØãØåØåØìØîØîØôØôØûØıØıØÙÙ
Ù Ù ÙÙÙÙÙ!Ù'Ù-Ù5Ù5Ù5Ù5ÙAÙIÙQÙYÙaÙiÙqÙwÙ�Ù�٨٫٫ٵٻÙÁÙÁÙÅÙÍÙÔÙØÙàÙèÙîÙöÙıÙÚ␍ÚÚÚ"Ú(Ú5ÚAÚGÚOÚSÚZÚbÚjÚnÚtÚ|ÚƒÚ‹Ú“Ú—Ú�Ú¨Ú­ÚÃÚÔÚÙÚÜÚ‚ÛSL˜§„„1„3„:„P„`„f„~„–„™„«„ó„TÔ*[.ë.ëBëWëfëjëxë~ë�ë�ëœë§ë²ë½ëÄëÔëëëşëì ì␍ììì3ì5ì?ì`ìkìmì†ìŠì˜ì�ì�ì¤ì°ì¸ìËì5íU$nsvdvd¡dŠd«d³dVl  ~H~HŒH¦H“HÅH²HÑHæHÓHIòHI I'I2I4I?IJIJIiIoIW,6Ò6Ò?ÒEÒMÒ\ÒkÒpÒXTÒΡΡï¡¢ ¢¢7¢A¢O¢i¢v¢v¢€¢€¢‡¢š¢˜¢¨¢¨¢³¢½¢âɢ̢ڢá¢ù¢££££%£0£J£e£y£–£¸£½£ãÉ£Ô£á£ÿ£ç£¤ ¤¤¤ ¤?¤'¤H¤L¤R¤Z¤_¤_¤l¤r¤�¤y¤™¤�¤£¤«¤°¤°¤ѤÕ¤Û¤ã¤ò¤␍¥ù¤¥¥#¥+¥0¥0¥Q¥U¥[¥c¥c¥h¥u¥“¥{¥œ¥ ¥¦¥®¥Î¥¶¥×¥Û¥á¥é¥é¥ö¥¦ü¥¦!¦'¦/¦O¦7¦X¦\¦b¦j¦j¦j¦€¦€¦€¦€¦‹¦•¦�¦¾¦ʦئݦë¦ÿ¦§§§§ §(§4§H§U§d§s§�§’§’§�§¥§²§½§ʧէ裡¨¨#¨#¨.¨D¨Q¨Y¨e¨s¨x¨†¨š¨š¨¢¨š¨º¨¿¨¿¨ΨÓ¨Ó¨â¨ç¨ç¨ø¨ı¨ı¨©©©&©5©:©:©M©\©a©o©a©ƒ©ˆ©–©ˆ©ª©¯©½©¯©Ñ©Ö©ä©Ö©ø©ı©ı©ª ªAªFªTªFªhªmªmªŠª�ª±ª¶ªĪ¶ªتݪݪúªÿª!«&«4«&«H«M«M«j«o«‘«–«¤«–«¸«½«½«Ø«İ«İ«ø«ı«ı«¬¬¬8¬=¬=¬X¬]¬]¬x¬}¬}¬˜¬�¬�¬¸¬½¬½¬άÓ¬Ó¬ä¬é¬é¬õ¬­­­­&­?­D­g­n­x­}­�­˜­­­¸­½­έÙ­á­æ­æ­ê­î­õ­ÿ­ ® ®®!®!®!®%®;®D®D®g®l®l®t®ˆ®‘®«®¸®îήÙ®ë®÷®¯¯¯¯¯3¯>¯H¯S¯X¯c¯k¯p¯p¯{¯ƒ¯Œ¯—¯§¯¿¯ׯë¯ğ¯ğ¯û¯°°#°D°P°^°c°q°u°z°z°а•°�°¢°­°º°Űß°ñ°±±±±&±+±6±C±N±h±z±Œ±Œ±Œ±Œ±‘±–±–±¢±³±³±Ù±Û±÷±÷±²² ²!²-²5²R²c²m²x²›²¬²½²βÙ²ñ²³³³³³³³)³.³.³6³A³F³F³N³l³V³„³‰³‰³‘³¯³™³dz̳à³̳ø³ı³ı³
´´´´´´(´9´K´P´P´d´P´|´�´�´‰´�´�´¡´¦´¦´¹´¾´¾´Ø´è´í´í´µµµµ6µFµKµKµeµuµzµ‘µzµ©µ®µ®µ¹µ¾µúµèµÖµ¾µS¶A¶/¶k¶p¶p¶�”¶”¶£¶³¶¸¶¸¶ǶÕ¶Ú¶·ğ¶Ú¶· ·G·5· ·_·d·Œ·z·d·¤·©·©·Æ·°·ğ·¸¸¸ ¸ ¸J¸Z¸_¸_¸k¸p¸p¸|¸�¸�¸”¸¤¸©¸©¸¼¸̸ѸѸä¸ô¸ù¸ù¸ ¹¹!¹!¹)¹.¹.¹6¹;¹;¹C¹H¹H¹P¹U¹U¹h¹m¹m¹€¹…¹Ó¹Á¹¯¹�¹…¹à¹å¹3º!ººı¹å¹@ºEºEºTºoºtºtº…º º¥º¥º¶ºĺɺɺѺÖºÖº޺ãºãºëºğºğº(»»»÷ºG»b»g»g»Ÿ»�»{»n»¾»Ù»Ş»¼ş»ö»Ş»(¼-¼_¼M¼E¼-¼w¼|¼–¼€¼|¼®¼³¼мº¼³¼è¼í¼í¼ù¼½"½3½3½Y½[½q½w½w½“½ ½ѽ¾¾ğ½ ¾'¾'¾'¾3¾8¾8¾K¾V¾`¾e¾p¾z¾¾¾™¾�¾�¾¦¾«¾¿¾«¾˾Ö¾Û¾ï¾Û¾û¾¿ ¿ ¿¿$¿)¿)¿4¿?¿D¿D¿U¿Z¿Z¿k¿p¿p¿Š¿•¿š¿¢¿š¿®¿³¿Ç¿³¿Ó¿Ø¿à¿Ø¿ì¿ñ¿Àñ¿ÀÀÀ*ÀÀ6À6À6À;ÀGÀ;ÀZÀ_À_ÀkÀ_À~ÀƒÀƒÀ�ÀƒÀ¢À§À§À³À§ÀÆÀËÀßÀËÀëÀ÷ÀÁ␍ÁÁ&ÁÁ2Á>ÁIÁTÁYÁmÁYÁ�ÁyÁŠÁ�Á�Á—ÁœÁœÁ¥ÁªÁªÁ³Á¸Á¸ÁÁÁÆÁÆÁÑÁÖÁÖÁáÁæÁæÁñÁöÁöÁÂÂÂÂÂÂ!Â&Â&Â1Â6ÂJÂ6ÂVÂaÂlÂwÂ|Â|†‹‹•šš¤©©³¸¸ÂÀÂÅÂÅÂÒÂ×Â×ÂäÂéÂéÂéÂéÂéÂñÂöÂöÂşÂÃà ÃÃÃÃÃÃ%Ã*Ã>Ã*ÃJÃ[Ã`Ã`ÃrÃ}Ã�âøÃÃÃÜÃÈÃèÃóÃşÃÄÄÄ Ä@ÄEÄ[ÄfÄÄkċĖġĦĦĸÄÃÄãÄèÄşÄ Å"ÅÅ.Å9ÅDÅIÅIÅoÅ[Å{śŠŶÅÁÅÆÅáÅÍÅÆíÅ␍Æ#ÆÆCÆ/ÆOÆZÆ_Æ_Æ…ÆqƑƱƶÆÌÆׯÜÆ÷ÆãÆÇÇ#Ç9Ç%ÇYÇEÇeÇpÇuÇuǛLJǧÇÇÇÌÇâÇíÇòÇ␍ÈùÇ-ÈÈ9ÈOÈ;ÈoÈ[È{ȆȋȋȚȟȟȮȳȳȳȹȾȾȾÈÈÈÊÈÊÈÔÈáÈÉÉÉ␍É␍É␍É␍É␍ÉÉÉ&É-É8É8ÉEÉKÉRÉ]ÉhÉsÉ~ɉɃɬɤÉÄÉÒÉÌÉõÉíÉ␍Ê␍Ê␍ÊÊÊ1Ê7ÊEÊXÊXÊpÊzÊ�ʨʨʨÊÉÊÙÊîÊËËË8Ë?ËNË`Ë`ËdËiËpˀ˟˟ˣ˺ËÁËÆËÆËÊËÕËáËïËÌ%Ì6ÌDÌw̃̈Ì�̲̾ÌÌÌÑÌßÌûÌ&ÍLÍOÍ_ÍaÍaÍeÍ„Í�Í�Í’Í ÍËÍëÍëÍëÍîÍĞY, vÒvÒ„ÒŠÒ�Ò�Ò¬Ò²ÒZ`áõ^™^™t™–™£™§™¶™Ï™Ó™Ù™ì™ š š š<š*š š[šeš[8cmdd'dd3d>dIdTd_dkdqd\\�”ˆœˆœ–œ˜œ£œ«œ¶œÁœÌœÎœäœäœöœ� ��=�]ܳfîéîé ê)ê7êYêYêjêwê•ê�êÊêÏêøêë1ë7ë;ë^ë„ë‰ë²ëÌëòë ììì,ì4ì9ìJìRìqìwì{ì”ìœì»ìÀìÑìÙìøìıìí ííí%í-í9íOíTífíkí|í�í“íœí°í»íàíî5î:î:î:îJîQî_îlî�î�î¥îªîªîÁîÃîÃî×îÙîÙîğîòîòî ï ï ï"ï"ï3ï8ï8ïHïmïï„ï„ï„ï„ïœï¿ïÒïğïğïğïıïğğğğ#ğ:ğ<ğ<ğIğ`ğ`ğwğyğ“ğ±ğ±ğ±ğµğ·ğ·ğ·ğ¼ğ¾ğ¾ğÃğÃğÍğÒğÒğğğğğğğøğúğúğúğñññ ñ ñññ3ñ5ñHñ^ñ^ñ^ñ^ñ^ñqñ‰ñ‘ñ‘ñÔñ^`
UU(U4URUnU{U’U¥U°UÅU²UÑUÙUäU÷UğUVV_ôWæ=æ=>>> >'>,>.>5><>@>R>„>�>‹>¶>»>Ü>Ü>è>ğ>ÿ>9?>?k?s?x?�?Œ?”?›?º?À?ß?á?@ @"@A@G@N@N@T@W@[@l@Œ@�@`$–ܖܥܽܽÜÃÜaxb|6ç6çVçxçxç‚ç‡ç‡ç¦ç³çµçµçµçµçÂçÊçİçñçóçóçûçèè èb”"~/~/ /ª/¶/»/Ë/Ñ/æ/ú/ 00%0<0D0N0]0e0r0z0}0}0}00�0˜0¡0©0¬0¾0cHÏî9î9:#:&:/:5:L:c:z:Œ:º:Ö:ğ:õ:ú:;;.;;;N;d;x;};ˆ;¨;­;°;Ê;ä;ì;ô;ù;<-<5<=<B<\<d<i<‰<�<‘<«<Å<Í<Õ<×<ñ< ====7=?=?=D=I=T=T=_=_=k=k=}=½=Ó=Ó=ã=dd¤¹È‰È‰Ø‰ß‰ë‰ñ‰ù‰ŠŠ&Š=ŠJŠJŠMŠ[ŠkЂІŠ�Šeºû++-+2+F+u+�+�+˜+¨+¨+¿+Æ+İ+ä+í+,,,,0,0,F,F,\,\,r,r,ˆ,ˆ,�,�,´,´,Ë,Ë,â,â,ù,ù,--'-'->->-U-U-m-m-…-�-˜-©-´-Å-È-Ê-á-è-ô.f¬÷†† ¦­µ½ÀËİİñøûı"8;ILOVZbp‚’•äg(FLÆ’Æ’í’Ú’ù’““hCFKFKiK~KƒK‹K“K›K¨K®K·K½KÂKÊKæKìKîKğKıKıK
LÿKL!L#L%L2L2L2L7L@LHLQLYL[LcLkLsL€L†L‘L˜L¨L³L¿LİLäLïLõLM
MMM&M6M>MAM§Mi8-77070K0O0T0_0j0m0q0y0j¤ö›fšfš„š¨š®šµšµš¼šÜšáš÷š›ÿš ›2›D›M›U›_›}›�›˜› ›ª›Û¯›Ï›á›ë›ó›ø›œÿ›3œ œ?œUœAœuœaœ�œ“œ�œ¥œ¥œ®œ¶œÌœåœ÷œ�
�
���4�6�;�F�\�\�\�`�l���›�¥�²�Ó�á�ë�í�í���(�+�K�O�n�r�•�™�¸�¼�¼�¼�Â�Ğ�Ú�ó�ù�ŸŸŸŸ Ÿ9ŸDŸRŸ\ŸuŸxŸ€ŸŒŸ�Ÿ–Ÿ™Ÿ²Ÿ´ŸÀŸŸÊŸĞŸéŸ ␍ " ' 9 H a r r } ˆ   ¬ Á Æ Ø ç ¡¡¡¡"¡*¡8¡?¡Q¡kfä†Û†Û Û©ÛÉÛÉÛÏÛ×ÛßÛçÛïÛõÛÜÜÜÜÜÜ Ü Ü&Ü+Ü+Ü1Ü6Ü6ÜNÜaÜgÜlÜlÜuܕܕܕܜÜ�Ü�ܥܧܧܭܭܴܼܼܶܶÜÃÜÅÜÅÜËÜËÜÒÜÒÜÚÜàÜæÜîÜîÜîÜîÜúÜİ
İİİ"İ*İ0İHİWİaİdİdİnİtİzİzİ~݆İ�İ•İ�İ¡İ§İ¯İ¶İ¾İÆİÊİĞİÛİáİîİúİŞŞ ŞŞŞ#Ş'Ş-Ş5Ş<ŞDŞLŞPŞVŞaŞfŞ|Ş�Ş’Ş•Ş;ßl`'"'"0"7"K"_"d"‚"‡"¥"§"Å"Ç"Ş"ò"û"ı"#!#R#m|2ÍББæ‘÷‘’’*’;’N’V’d’‚’�’“’ ’µ’µ’È’Ù’ß’ô’““$“)“1“9“?“W“j“u“y“ƒ“˜“�“ “­“¯“Á“Á“ȓГâ“â“ñ“ÿ“”” ”$”0”4”@”D”P”T”T”g”z”€”„”�”’”¡”¥”´”¸”˔ϔϔϔϔԔæ”õ”••-•=•M•R•R•R•^•f•n•t•‰•‘•Ÿ•©•·•½•¿•¿•¿•¿•¿•¿•¿•¿•¿•˕ӕەá•ö•ş•–
–––––0–6–B–H–U–p–€–Œ–’–Ÿ–±–¿–Ş–8˜nÔ¼íHkHkZkkkvk�k—k©kÁkÆkÏkÖkãkêkøkÿkll l ll+lEl[lslxl�lˆl•l©lÄlËlÍlĞlÕlølm"mo$hm×&×&å&ù&''p¤b‡ÎXÎXâXéXYûXY Y'Y'YGY]YIYiY�Y{Y›Y Y§Y§Y¯Y¶YÁYÌYÔYÜYçYòYZıYZ%ZqFƒælælm m!m9mCmNmNmSm^mjmumƒm“m£mªm°mÅmÚmÚmîmömnn"n/n@nQn_nmntnzn�n¤n¤n¸nÅnÖnænìnınınoo"o/o?o¡or8¬öJöJúJÿJKK#K,K1K6K8Ks88B00“0—0œ0§0±0´0¸0À0t0†�>I>ITIgItIzI}I…IuÜtöö#.7GY_ek�p•¢¥­¿ÅÊí
!'7=IW\jƒ‘šª¬³¸Àßíù29CRX^dj€¡µÁØãòÿ+9P\ao� ·ÀÆÑÖÜóş  /1?N``h‹–Êv`ÌàN˜N˜d˜†˜“˜—˜¦˜ŘɘϘâ˜ÿ˜™™2™ ™™Q™[™wT�Ş–à–à®à¶àÃàãàõàüàá áááá<á<áCáFáKáZá^á‹á�á”á”á›á�á£á¯á½áÁáÒáááåáçáöáúáâ â%â%â9â<âHâRâYââŠâ�â“âÉâàâëâïâã ãããã ã ã:ã>ã@ã@ãKãOãiãmãmãmãqã”ãxˆßı–ã–ãªãÀãÀãÀãÂãÂãÉãËãËãÒãÔãÔãáãããããğã÷ãùãùãä␍äää'ä,ä,ä<äy°‰±nene†e�e™eóeŞeÓe¾e§eùe fûe&f&f?f3flfqf}fˆf�fŠf©f¯f¶f×fÉf½fëfífggg:g:g:gFgz †*>´>´[´b´j´u´Œ´–´–´­´·´Ò´è´ö´ú´µ.µBµIµMµfµpµ�µ�µ�µ•µœµ¡µ¦µ«µ²µ¹µÓµÚµêµîµîµøµ#¶6¶I¶I¶O¶Z¶a¶i¶t¶{¶ƒ¶�•¶•¶ ¶¾¶Â¶Ú¶Ë¶õ¶õ¶û¶···'·.·2·4·F·F·F·X·`·†·”·”·˜·­·µ·Å·Ğ·å·ê·ø·¸¸¸(¸,¸1¸9¸=¸L¸N¸]¸_¸n¸p¸¸†¸Š¸�¸¦¸´¸»¸¿¸Ï¸Ú¸ß¸ı¸¹¹¹¹&¹4¹;¹?¹G¹[¹c¹n¹r¹r¹r¹}¹ˆ¹˜¹¤¹º¹Â¹Í¹Ü¹ä¹ï¹ô¹ü¹ººº"º'º9ºAºLºLºLºLºZºiº†º’ºšºªºººØºÜº »»ñº»»%»,»;»J»R»`»g»k»m»|»„»’»™»�»�»Ÿ»±»±»Ã»Ã»Ã»É»Õ»ç»ï»¼3¼A¼E¼c¼j¼q¼|¼’¼”¼›¼®¼¶¼Ä¼Ë¼Ï¼Ñ¼ä¼ì¼ú¼½½½½½½½-½5½C½N½R½R½W½_½c½r½t½ƒ½…½”½–½¥½¬½°½Ä½Ì½Ú½á½å½õ½¾¾#¾+¾9¾@¾D¾L¾Z¾a¾e¾m¾�¾‰¾”¾˜¾˜¾˜¾£¾ª¾¸¾Ò¾â¾í¾¿¿¿"¿.¿D¿L¿W¿f¿n¿y¿~¿†¿‘¿�¿¡¿¬¿±¿Ã¿Ë¿Ö¿Ö¿Ö¿Ö¿ê¿ú¿ÀÀ À4ÀEÀZÀgÀkÀyÀ�À�ÀµÀÎÀçÀéÀôÀüÀüÀÁ"Á3ÁJÁcÁqÁ|ÁˆÁ�Á’Á�Á¥Á¥Á¥Á¿ÁÍÁÛÁğÁÂÂ#ÂAÂHÂHÂXÂl††Š ¯ÂÊÂÕÂìÂôÂôÂÃÃ)ÃDÃMÃbÃ|ËØöÃÄÃÚÃóÃÄÄÄ3Ä3Ä?ÄWÄoÄxÄxÄxĄĕĭĶĶĽįÄÌÄØÄ>Å{ÌL»®ö®öÌö×öâö÷÷
÷÷"÷(÷9÷H÷W÷d÷d÷j÷o÷t÷‡÷š÷¥÷©÷»÷È÷Ğ÷Û÷×÷ò÷øøø ø&øø7ø.øAøCø_øKøgøuøuøwø“ø“øšø ø©ø°ø³øÕøéøÜøñø÷øùùùùùù ù ù+ù@ùIùIùIùIùeù|ù‚ù‡ù‡ùœù¢ù§ù§ù³ùĞùğùõùúùúùú#ú2úAúIúNúTúYúYú`úgúŠú§ú©úÆúÛúÛúáúáúîú÷ú÷úû$û/û4ûAûLûTû\ûlûƒûƒû“û“û¥û«ûÓûÜûÜûŞûåûêûêû÷ûüüüü$ü1üCüNü\üeüjü‘üšü¥üªü±ü¹üÌüáüæüíüúüıı(ı/ı5ı>ı>ıGıaıhımı{ı‹ı™ı™ıŸı¦ı¯ı¯ıÂıÔı×ı×ıèığıøış!ş(ş5ş7ş>şRşaşaşaşˆşˆşˆş•ş•şªşµşÇşÔşßşíşøşÿÿÿ(ÿ;ÿ=ÿLÿaÿcÿqÿ†ÿ†ÿŒÿ•ÿ•ÿ¢ÿ¨ÿºÿºÿÇÿÊÿÕÿçÿîÿùÿşÿ␍24Ncccelrƒ‘££©°¹¾ßèèî÷÷#&,5=HZ`kkx{�Š’�¯µÀÀÍĞÖßá+1<NT\\\\gà|”�¾g3g3{33ˆ3‹3”3�3¯3¯3Ø3Ü3á3ä3í3ı34444 4'4/474>4N4N4Z4}Œ >VV*V1VaVMVmVrVyVyV™V¯V›V»VëV×V÷VüVWW WWW%W0WCW;W[WcW~À-ee.e>eHeHeReRe\ene{e~e€e‰e–e–e¤e¸e¸eÜeéeéeùeff)f6f6fLfof…f¨f±f¾f¾fáfëfëfgQgWgWgWgig¸ºä�Š�Š¨ŠªŠ¶ŠºŠÇŠÊŠäŠäŠäŠêŠîŠöŠ‹‹!‹#‹#‹,‹.‹.‹7‹9‹9‹B‹D‹D‹M‹M‹V‹\‹_‹i‹z‹€‹Œ‹Œ‹ô‹€œZ}.*.*L*]*€*‡* *˜*¸*Ø*Ä*ä*õ*ú*++3+[+b+{+s+“+³+Ÿ+¿+Ğ+æ+Ò+ş+ , ,#,#,-,�œX{Î-Î-Ú-ê-õ- .O.\.m..†.�.¡.¨.¶.Î.İ.ê.í./ //%/1/=/A/H/~/‚x¬h¬h¬~¬…¬Œ¬«¬º¬É¬Ø¬ç¬ö¬­­­ ­ ­.­3­N­h­h­~­�­”­¢­©­®­®­µ­Ç­Ğ­Ò­à­ò­ò­ò­®®!®,®9®>®N®S®c®o®t®�®†®–®›®«®­®½®¿®Ï®Ñ®â®ë®ë®í®ı®¯¯¯/¯A¯S¯e¯u¯u¯u¯x¯‹¯ƒ\åøø‹ø‹ŒŒ Œ-ŒBŒIŒSŒaŒdŒfŒpŒ‚Œ‚Œ‰Œ¿Œ„0ÎÖÎÎæ(ğî<D…`·Ë>—>—T—v—ƒ—�—œ—µ—¹—¿—Ò—ï—ñ—ñ—"˜˜ñ—A˜K˜†L4CF,F,T,f,l,t,†,Œ,•,§,­,°,ì,‡(–œ7373E3T3X3[3a3ˆ\DWî,î,ü,---.-4-=-O-U-^-p-v-y-Ç-‰, ÒÒÒ#Ò+Ò0Ò6ÒŠ¬!H
   - 4 : I T _ e q u u � Š � � ˜ š ° · ½ Å Ğ Û á ë î ò ò ú ¡¡¡¡¡¡!¡!¡,¡.¡L¡S¡^¡i¡l¡r¡w¡w¡‚¡†¡†¡’¡›¡�¡�¡©¡«¡Á¡È¡Ρİ¡è¡ó¡ù¡¢ ¢ ¢¢¢!¢!¢,¢.¢D¢K¢Q¢Y¢d¢o¢u¢¢‚¢†¢†¢�¢•¢˜¢š¢¥¢©¢²¢µ¢µ¢À¢¢à¢ç¢ò¢ı¢££ £ ££!£!£-£6£9£9£D£F£\£c£i£{£†£‘£—£œ£œ£§£¬£¬£·£¼£¼£Ç£Ê£ΣÕ£Ú£ߣä£ä£ø£ı£ı£
¤¤ ¤'¤+¤?¤F¤J¤J¤W¤c¤k¤q¤�¤…¤–¤¨¤³¤·¤·¤Ĥ̤Ô¤Ú¤Ú¤Ú¤Ú¤Ú¤ܤܤê¤ñ¤ş¤
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥1¥9¥E¥E¥f¥u¥�¥�¥›¥¨¥¨¥Ë¥Ø¥ã¥ì¥õ¥¦¦¦¦¦¦&¦D¦P¦P¦¨x¿ÙÏ3Ï3á3ã3ç3ğ3ü3444L4P4U4a4t4~4�4Œ4�4—4¡4lcz¶x¶xÌxÛxàxõxâxyyyy)yy8y>yWypy‰y¢y»yÅy„�ÎhÎhìhôhúhii
i␍iiii,i0i6i6iKiUiUi]ivi™iºi¿iàiåiñiüijjj(j.j3j9j;jAjDjJjOjRjZjcjsj–j¤j¼jÁjÅjêjıjkk(k-k1kVkfk‰kœk¡k§k¬k¯k±k·k½kÃkÈkÎkÖkÖkàkék÷klll=lMlplƒlˆl˜l»lÉlálælêlm"m"m=m=m=mKmcmemememsm‹m�m�m›m³m³mÅmÅmÎmÛmñmn+n3n>nQnUnUnUn\nbn|n„n�nªn¬n²nÌnÔnßnínønønoH…“h„h„„•„¥„¬„Äބğ„ô„7…L“¢ÖzÖzêz÷z␍{ùz{{7{P{[{f{n{4IRŞÕŞÕçÕçÕêÕøÕÖ ÖÖì=öö>öAö_övö‡ö‡ö¢ö¨ö­ö­öÈöÎöÓöÓöÜöêö÷ ÷$÷+÷1÷3÷P÷`÷e÷l÷r÷t÷t÷‡÷�÷�÷�÷�÷’÷®÷¾÷Ğ÷Õ÷Õ÷Õ÷Ü÷ã÷ê÷ÿ÷ø"ø"ø4øÌL»0¤0¤J¤U¤`¤i¤q¤t¤{¤¤ˆ¤›¤Ÿ¤¥¤³¤Ğ¤İ¤ì¤ñ¤ı¤¥ ¥¥¥¥'¥ ¥7¥@¥Q¥O¥G¥_¥h¥n¥n¥|¥¥“¥œ¥¥¥¬¥°¥µ¥Ì¥ä¥í¥û¥¦#¦#¦;¦L¦L¦S¦l¦x¦€¦“¦š¦®¦·¦¾¦Â¦Í¦Ò¦Ù¦ö¦#§*§.§0§;§G§K§`§b§s§}§ˆ§’§¡§°§É§É§Ì§Ô§Ù§[¨Xs…&L&LCLTLaLkL‚LŸLºLÀLÉL×LİLàLìLŒ ````p`”`”`¢`¢`¢`¢`«`«`²`Í`â`ê`ê`õ`õ`aaa!a'a'a?a?aEaka(kq‰‰‰*‰:‰A‰G‰ @O[¶è¶èÄèÌèÓèòèÿèÿèéé
é $/4FßFßSßhßmßsß!$).ßß#ß8ß=ßCß"$#(æŞæŞõŞ ßßß#€ğLWWaq‡�™´¹Éßçñ  ' 1 ; E O Y c m w � ‹ • Ÿ © ¿ É Ó İ ç ñ û  % / 9 O Y c m w � ‹ • Ÿ © ³ ½ Ç Ñ Û å ï ù !␍!!!!+!5!?!I!S!]!g!q!{!‰!$¤Cp›p›†›�›¢›³›Å›Ç›Î›Ô›ä›ï›ù›œœœ œ2œ8œHœRœ\œcœnœƒœ‹œ‹œ¡œ¡œ¡œµœ%$5:vßv߄ߙß�ߤß&¤Di¸œ¸œÎœÕœêœûœ␍����,�7�A�L�c�f�h�z���‘�›�¥�¬�·�Ë�Ó�Ó�é�é�é�ş�'(&,w/w/…/Œ/–/œ/¢/(0_gVKVKlKK�K”K—KŸK)  ßö"ö"# #&#3#:#V#\#\#\#i#k#v#€#‡#–#¡#§#±#»#Ì#Ì#×#á#á#ó#ù# $$$$$<$B$T$g$m$p$v$v$x$~$„$†$†$†$—$¡$¦$¦$»$Å$Å$Ù$â$è$î$% %%'%+%+%3%9%?%I%P%W%`%r%r%—%›%¡%§%¹%Ì%Ò%Ö%Ü%â%è%è%ê%î%ô%ú%&&&&&0&A&A&X&e&i&q&ƒ&£&£&©&¬&°&¶&¶&È&Ù&î&'
'' '0'4':'S'U'['h'j'v'”'š'¥'È'Ó'Ù'ß'å'î'ô'(( (#(4(8(>(W(Y(_(l(n(z(˜(�(¤(ª(³(¹(Ö(É(ğ(ù(ÿ(ÿ())) )*)?)D)D)D)a)c)€)‚)Ÿ)¥)­)±)¸)Û)á)ç)ó)
***"*'*'*.*2*<*J*L*T*Y*a*l*r*�*†*Œ*‘*™*�*­*È*Ø*å*ô*++.+.+5+J+O+X+e+j+p+u+u+|+€+Š+˜+š+¢+¦+ª+´+À+Ç+Ë+Ó+Û+ã+õ+,,,,,,?,?,M,S,X,\,a,a,a,a,g,i,i,Œ,’,˜,Ÿ,µ,·,·,·,Â,Â,Â,Ç,ğ-*4)r¶Ç¶ÇĞÇÔÇìÇôÇüÇÈ
ÈÈÈ+È3È8È;ÈFÈQÈYÈdÈoÈqȇÈ�ȕȠȫȭȸÈÃÈÅÈÑÈÚÈÚÈğÈûÈÉÉ"É3É9ÉBÉTÉZÉZÉbÉfÉqÉvɈɓɗɥɧɫɺɺɺÉËÉËÉĞÉâÉèÉVÊ+Ô@>ä>äTä[ä^ä‚ä‚äŸä²äÅäØäİäİäûä åå/å7å7å9å9å9åLåNåNåNåUåhå{å{å{å�å™å¬åÂåÇåËåÒåçåúåæææ)æ,LAP/$/$=$N$Z$u$z$š$œ$·$Ò$Ò$Ú$á$%-P~�˜‰˜‰¦‰³‰Á‰Ó‰Ş‰ì‰ù‰ŠŠ$Š2Š8Š>Š.4
—5—5¥5±5Â5Ô5İ5ç5í5/|ºU. . P W f q — —   ¢ ¢ © Ğ × × æ õ 


(
0
A
J
h
s
u
�
”
Ÿ
¯
Á
Ê
Õ
Ú
à
ç
  " + + 2 A X X g p „ ‹ ’ — ¢ ¨ ° Ö ß æ ë ö   % * 2 > P P g n v † ˜ � § §  ¼ Ğ Ù é ø 
␍␍#␍6␍>␍R␍p␍‡␍‹␍—␍®␍Ê␍Ü␍â␍í␍ù␍ ''9=I`|�”Ÿ«»Ëİããèêêïïş

‡0ŒÄã^Ù^ÙzنيÙ�ٕٜ٫ٶټÙÁÙÃÙÏÙÖÙŞÙäÙêÙîÙîÙıÙÚ ÚÚÚÚÚ&Ú18 ¯.¯.½.Ã.Ï.Ú.ë.õ.ü./2@x„êê$ê/ê6êUêbêbêeêgêmê3ÌSÜïöı
 //AL`hqy~„šª¿Äİõùùş%-6>CJ\l�ƒœ´¸¸ÌÔİåêğ+0Iaexxx}ŸÁÌÒê&.7?AGYi~€™±µµÉÑÚâçî).G_cvvv{�¿ÊĞè '9I`w�¥¥¸ÓÓÓô    % 2 L Z a t v • ¤ � ¼ Ì æ æ ÿ 4D{ˆ®®¾ÒÛáóó÷ú5\Ob(ˆ(ˆHˆWˆ`ˆiˆmˆqˆ}ˆ‚ˆ‡ˆ‡ˆ˜ˆœˆ¤ˆ¼ˆ¿ˆËˆ60üæâæâïâôâıâãã ã7lØvv˜Ÿ¦±ÇÇÙòòı 9H_p„ˆ�¢º¿ÇËöĞü*rL�Ÿª°ÄÜáõı,<RTm…‰‰�»ÃÇïÉõ ␍/5?FYtt� ®®ÂĞŞó *92Qahy›�Åóóóş<ALR]™†¨¿Ğëÿ;p]�¨®ÂÚßóû *:PRkƒ‡‡©ÂÖÚéééü &AAA]m{{��«ÉÜá'7Hffˆˆ�²²²Ò8DmzVVfzƒ‰››Ÿ¢ª9l{’ÆyÆyÜyëyğyzòyzzz$z9z&zHzNzgz€z™z²zËzÕz:<‰”'06:E;”)îìîìöìúìííí)í4íFíQí\íkí|íƒíœí í±í±í»íÂíÕíŞíìíîî!î>î<d(=X‡X‡d‡x‡{‡�‡—‡›‡¥‡¯‡·‡º‡À‡=$uºHEHElEoEsE€E‰E”E¤E¬E¶EŞEŞEîEóEóEFFFFFF-F2F2FBFGFGFWF\F\FlFqFqF�F†F†F†F‰F‰F¢F°FÇFÚFÚFÜFÜFëFñFöFöFüF G GG'G4GLGTGZGZGnGnGwGzG8H>Ğ q†¨†¨£¨«¨®¨¼¨ʨߨ訩©.©9©J©N©`©c©n©w©ƒ©–©Ç©¼©¢©שªª=ªRªvªŠªŒª­ª“ªȪ˪ЪÓªÓªÚªñªøª«
««&«9«9«M«Q«~«~«–«›«›«««³«Ä«Ϋß«é«ü«¬␍¬␍¬¬%¬6¬@¬Q¬[¬n¬z¬¬¬¬¡¬²¬¼¬Á¬άã¬ã¬è¬ò¬­­ ­­­­ ­/­4­:­?­?­E­K­P­P­X­k­w­„­�­Ÿ­§­­­¶­Í­á­ò­ÿ­®®/®F®S®[®j®r®x®�®Š®Š®�®�®�®�®�®›®›®›®³®É®Ñ®ì®ı®
¯ ¯¯¯¯¯)¯7¯<¯<¯C¯Q¯V¯n¯z¯�¯›¯¡¯©¯¯¯¸¯ޯê¯ğ¯ö¯°␍°°B°S°`°b°p°p°u°u°|°а�°¢°®°º°À°ưϰÔ°Ô°Ô°Ô°Ô°ì°ñ°ñ°ñ°ñ°ñ°±±±±±±±±±±±0±8±S±d±q±s±€±Œ±‘±‘±‘±š±´±À±űç±ó±ó±ø±ø±ø±ø±ø±ø±ø±ø±␍²²²²#².²3²3²>²P²h²}²�²¿²ʲÛ²à²à²à²é² ³³%³+³C³S³[³c³n³˜³¡³§³¿³ϳϳϳϳϳñ³*´3´9´?´D´M´V´[´[´[´[´j´~´œ´¬´²´·´·´Ê´Ş´µµµµ"µ"µ1µEµcµsµyµ~µ~µ‘µ¥µ˵޵äµäµéµéµéµ:¶K¶X¶Z¶i¶k¶k¶k¶k¶k¶��¨¶ª¶ª¶³¶µ¶µ¶ɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶɶ˶˶â¶ê¶ö¶ö¶ú¶ÿ¶·+·C·R·^·t·�·‘·›·§·Í·í·␍¸1¸3¸F¸t¸L¸�¸�¸’¸¢¸ª¸ŸÖ¸Ù¸ó¸¹␍¹%¹%¹P¹S¹b¹v¹—¹«¹ǹ³¹ã¹ø¹ºKºIº>º3º$ºYºYºYº\ºaºdº~ºŒºººܺܺ»
»»-»N»b»~»j»š»š»¸»í»ë»à»Õ»Æ»û»û»û»ş»¼¼
¼¼;¼G¼ ¿?”£Ä¶Ä¶ÄÌÄĞÄÛÄâÄíÄÅÅ ÅÅ$Å1Å=ÅJÅRÅcÅcÅlÅqÅyʼnŗŦűÅÄÅÄÅ×Å×ÅíÅÆÆ-Æ/Æ/Æ9ÆAÆAÆKÆSÆSÆSÆdÆdÆdÆjÆrÆxÆ}Æ}ƃƋÆ�ƕƚƚưÆÀÆÊÆÙÆŞÆæÆæÆëÆëÆòÆÇÇ"Ç*Ç0Ç?ÇDÇLÇRÇRÇ^ÇiÇ�ǬǶǾÇÄÇÙÇßÇäÇäÇäÇäÇäÇäÇäÇäÇäÇïÇıÇ␍ÈÈÈ*È/È<ÈDÈIÈIÈIÈQÈZÈcÈpÈxÈ„È�ÈÃÈËÈÚÈäÈşÈÉ É ÉÉ#É+É@ÉHÉPÉeÉgÉrÉzÉ�É�ɗɨɰɷɽÉÃÉÇÉĞÉÕÉùÉÊ␍Ê"Ê.Ê3Ê?ÊJÊOÊOÊOÊeʂʇÊ�ʠʨʰÊÅÊÊÊÕÊİÊòÊ÷Ê÷ÊË'Ë/ËDËPËUËaËlËqËqËqËqËqËqË|Ë|Ë|Ë|Ë|Ë|Ë|Ë|Ë|Ë|Ë|Ë|ˇ˖ˤ˴˺ËÂËÑËÖËŞËæËèËğËÿËÌ␍ÌÌÌ4Ì<ÌEÌMÌUÌZÌ_ÌqÌ¥Ì­Ì¼ÌÆÌàÌèÌíÌíÌíÌöÌÿÌÍ ÍÍ,Í.Í@ÍRÍRÍRÍ]ÍbÍ̈́̈́Í�Í’Í’Í’Í’Í’Í’Í’Í’Í’Í’Í’Í’Í’Í’Í’Í’Í�Í©ÍÁÍÔÍÜÍëÍğÍøÍÿÍ ÎÎÎ&Î-Î2Î2Î:ÎBÎ`ÎhÎkÎmÎ}···ΉÎ�ίβενÎÂÎÂÎËÎĞÎØÎßÎìÎÏÏÏ%ÏBÏ[ÏpυόόϑϑϑϑϑϑϑϙϤϰϿÏÄÏÄÏÌÏÔÏáÏæÏæÏæÏêÏïÏïÏÿÏĞĞĞĞĞĞ'Ğ,ĞCĞRĞZĞkĞsЖМУХЫвввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввддĞÏĞÙĞçĞçĞìĞ÷ĞşĞÑ'Ñ'Ñ'Ñ+Ñ6ÑTÑbÑZÓ@ôz^Ó^ÓtÓӆӑӜӳӾÓÅÓÕÓèÓòÓòÓÔ(Ô/Ô8Ô?ÔBÔNÔWÔ^ÔaÔfÔqÔ{Ô�Ô“Ô©Ô°Ô¸ÔÎÔÕÔÕÔÕÔÚÔßÔéÔìÔñÔûÔşÔÕÕ Õ0Õ3Õ8ÕHÕKÕOÕXÕ`ÕrÕzÕzÕzÕ…Õ�Õ¡Õ§Õ½ÕÄÕÌÕÓÕèÕùÕùÕÖÖÖÖ
ÖÖÖÖ&Ö)ÖAÖFÖKÖ[Ö^ÖcÖsÖvÖzÖƒÖ‹Ö�Ö¥Ö¥Ö¥Ö³Ö»Ö»Ö¾ÖÉÖçÖõÖ>×A|`»NÚNÚfÚvÚ}Ú„Ú�Ú¢Ú¥Ú­Ú´Ú·ÚÇÚÕÚàÚëÚîÚùÚÛÛ%Û0Û;ÛFÛ]ÛiÛ†Û�Û—ÛŸÛ¬ÛÊÛÍÛÓÛØÛçÛíÛõÛÜ
ÜÜÜÜ,Ü;ÜCÜRÜZÜ}܃܉܋ܑܗܗܗܼÜÁÜŞÜáÜáÜèÜõÜùÜİİ*İ:İMİiİ~݆İ�ݯİÃİÃİ7ŞB Æ.Æ.Ğ.Ø.İ.CÉÆ&W&WCWNWaWNW{W‰W‰W™W¢W©W­W¶W¶W¾WÂWâWğWüWX␍X1X1XDXOXUX\XaXaXtXXŠX‘X›X¨X¨XºX¿X¿XÏXÔXÔXÔXçXìXÿXYY#Y7Y7Y<Y<YLYQYQYVY]YeYlYnYvY}Y}YŒY’YŸY¦Y©YÍYÍYÕYäYïYöYøY ZZ Z%Z%Z%Z8Z=ZLZSZ\ZqZ…Z…ZŠZŠZ’Z¨Z­ZÁZÈZÍZÍZÙZèZúZ [[ [/[=[K[Z[y[„[‰[˜[¬[³[º[Í[Ï[İ[ğ[ò[\\\%\<\C\O\`\w\y\…\�\’\’\�\±\¾\Æ\È\Ü\î\õ\]]6]=]I]g]g]g]o]z]~]†]Š]’]™]©]´]Ò]×]à]ë]ô]ü]^^^^+^6^A^O^U^[^a^j^p^^Œ^”^ ^®^Å^Ç^Ğ^Û^İ^é^_␍___"_3_Z_b_l_z_’_™_¥_´_É_É_Ö_Û_í_ó_ó_ó_ó_µ`DDUb6x6xJxWxmxYx|x~x–x®x¶xEœfɆN†N¨N²NÚNéNôN␍OOOO'O6O=OFOKO`OqO�O˜OšO¹OÁOĞO×OãOèOïO÷OıOÿOPP+PP:P@P@PHPQP`PP†PˆP§P®P®P®PÅPÎPÚPŞPìPQ÷PQ Q0Q5QKQ7QZQ`QgQoQuQwQˆQ�Q£Q�Q²Q¸Q¸QÀQÉQÉQÓQÓQëQR$R0R4RBRXRMRpRpR‚RFôE~æßæßà!à&àGàeàtà’à¦à¾àÅàëà áá5áFá]áaáaáeájáoáyá|á†á‹á©á¬á¬á¬á±á·áÓáááíáöá
âââ7âBâNâWâkâkâzâââ�âGP‡—V<V<w<d<™<†<¨<·<¿<Ê<Ì<×<â<â<=
=HP…•fõfõzõõ�õ�õ•õÂõØõÄõõõçõ␍ööIŒe„ŞóŞóô=ô=ôPôTôvôŠô�ô�ô–ô�ô¦ô»ôÇôØôİôîôõõ õ õ õ%õCõCõ`õJP�­Ö:Ö:ÿ:;;;0;?;N;];k;v;y;‰;Kè7f)f)‘)”)—)�)¢)¹)Ğ)ç) *'***I*c*u*‚*˜*«*°*»*Ã*Ã*Í*Í*Ø*İ*ò*ø*+6+8+M+S+r+‘+™+¤+¤+®+®+À+ş+,(,L$ .V.VYVBVcVkVMLs‚VÊVÊhÊ}Ê�ʟʦʮʾÊÉÊÚÊàÊËNTHYcc*c,c5c>cLcQcZc]cbcpczc}c‡cO¨!Gpapa€a‰aœa©aµaÁaÍaÙağağaÿa
bbb#b:bQbVbhbwbƒb•b•b�bÁbÁbÃbÖbØbòbşbccPhî„nn)n4nDn�n”n¨n¯n·n¿nÈnĞnØnÚnânênñnøno/o8o8omo—o oÂoÜoùo#p/pQpSpZpapap„p pÇpãp
q&qMqiq�q¬qÓqïqrr%r2r7r7rFrSrXrXr_rjr|r•r®rÇrÉrÉrÉrĞrĞrİrârârârórss)seslslslsts‘sŸs½sÆsÏsÜsêst t t t3tAt]t{t{t{t†t‰t¸tºtÑt×tètñtótuuuuuuBuDuKu\ueuguuuwu…u‡u•u•uµuµuµuµuÕu v/v7v;vCvGvUvcvevmvqvuv}v‹v™v™v³v¾vÔvèvw!w,w6w=wVwbwiw‚w‚w”w™w›w¡w²wÃwÒwÙwêwówõwxxxx#x#x#xGxGxfxmxtxwxƒx†x”x˜x¦xªx¸x¼x¼xÕxÜxáxïxy y$yDyWyfyhywyyyˆy’y’y y©y¿yÆyëyğyzIzNz\z^zlzuz�z‘z“zšz«z´z¶zÄzÆzÔzÖzäzäz{{{{{#{#{#{.{J{o{ˆ{�{�{�{¯{´{´{´{Ô{Ù{Ù{Ù{ø{ı{ı{||||||||| |>|T|y|•|©|®|®|É|Ö|Ø|ç|ğ|
} } }} }2}4}4}<}7}w}w}w}–}–}–}·}¼}¼}¼}Ş}ã}ã}ã}~~~~'~,~,~G~U~W~f~o~‰~‹~‹~�~‹~±~³~³~»~¶~ö~ö~ö~++Um…�¦ºÓë€!€#€4€Q€h€o€g„Q|␍(îåîå ææ0æJæbæmæ‰æ‰æ‰æ–æ±æ³æ³æ³æÀæÛæİæİæëæøæçç#ç5çRæd&Ú&Ú@ÚIÚiÚiÚoÚwÚÚ‡Ú•Ú›Ú¨Ú¨ÚÂÚÇÚÇÚÍÚÒÚÒÚØÚİÚİÚãÚèÚèÚÛÛÛÛÛ'ÛGÛGÛGÛNÛPÛPÛWÛYÛYÛ_Û_ÛfÛhÛhÛnÛnÛuÛwÛwÛ}Û}ۄۄیےۘ۠۠۠۠۬۴ۼÛÄÛÌÛÚÛèÛîÛÜÜ Ü"Ü"Ü,Ü5Ü;Ü;Ü?ÜGÜQÜUÜcÜkÜqÜy܃ܑܙÜ�ܣܮܴÜÅÜÑÜ×ÜßÜãÜíÜûÜİİ␍İİ İ-İ5İ9İ?İJİOİh݂݇݊İ0ŞSL”£8…8…Q…S…Z…p…€…†…�…¶…¹…Ë…†TÔ*[>î>îRîgîvîzîˆî‘î î î¯îºîÅîĞî×îçîşîïï ï$ï7ï7ïMïOïYï}ïˆïŠï£ï§ïµïºïºïÁïĞïØïëïUğU$îUîUVV#V+VVPÍİ~?~?Ÿ?Œ?Á?®?Ğ?ß?ç?ò?ô?ÿ?
@
@,@2@W,¾Ô¾ÔÇÔÍÔÕÔŞÔçÔìÔX …ÆŠÆŠçŠüŠ‹‹2‹<‹K‹e‹r‹r‹|‹|‹ƒ‹–‹”‹¤‹¤‹¯‹¹‹¿‹Å‹È‹Ö‹İ‹õ‹ü‹ÿ‹ŒŒ!Œ,ŒFŒaŒuŒ{Œ�ŒˆŒ¦Œ�Œ¯ŒµŒ»ŒÃŒãŒËŒìŒòŒøŒ���%�␍�.�4�:�B�b�J�k�q�w���•�•�•�•� �ª�³�Ó�ß�í�ò�����$�,�4�=�I�]�j�y�ˆ�¢�§�§�²�º�Ç�Ò�ß�ë���)�4�9�9�D�Z�o�{�‰���œ�°�°�»�°�Ó�Ø�Ø�ç�ì�ì�û������'�,�,�?�N�S�S�f�u�z�ˆ�z�œ�¡�¯�¡�Ã�È�Ö�È�ê�ï�ı�ï�‘‘‘3‘8‘Z‘_‘m‘_‘�‘†‘†‘£‘¨‘ʑϑݑϑñ‘ö‘ö‘’’:’?’M’?’a’f’f’ƒ’ˆ’ª’¯’½’¯’Ñ’Ö’Ö’ñ’ö’ö’“““1“6“6“Q“V“V“q“v“v“‘“–“–“±“¶“¶“ѓ֓֓ç“ì“ì“ı“””””.”3”3”?”X”]”ƒ”Š”””™”ª”´”ɔԔٔê”õ”ı”•••
•••%•%•8•=•=•=•A•W•`•`•†•‹•‹•“•§•°•Ê•וâ•í•ø•
–– –$–$–$–5–R–]–g–r–w–‚–Š–�–�–š–¢–«–¶–Æ–Ş–ö–
————-—7—B—c—o—}—‚—�—”—™—™—©—´—¼—Á—Ì—Ù—å—ÿ—˜#˜.˜3˜>˜F˜K˜V˜c˜o˜‰˜›˜­˜­˜­˜­˜²˜·˜·˜ØÔ˜Ô˜ù˜û˜™™"™6™@™B™N™V™s™„™�™™™¼™Í™Ş™ï™ú™š"š'š'š2š7š7š?šJšOšOšWšbšgšgšoš�šyšwš¨š­š­šµšÖš¿š½šîšóš›óš ›$›$›1›6›6›>›C›C›U›g›l›l›€›l›˜›�›�›¥›ª›ª›½›››Õ›Ú›Ú›ô›œ œ œ#œ3œ8œ8œRœbœgœgœ�œ‘œ–œ­œ–œÅœÊœÊœÕœÚœ��òœÚœ.�3�o�]�K�3�‡�Œ�Œ�›�«�°�°�¿�Ï�Ô�Ô�ã�ñ�ö�� �ö�6�;�c�Q�;�{�€�¨�–�€�À�Å�Å�â�Ì� ŸŸ!Ÿ!Ÿ<Ÿ(ŸfŸvŸ{Ÿ{Ÿ‡ŸŒŸŒŸ˜Ÿ�Ÿ�Ÿ°ŸÀŸÅŸÅŸØŸèŸíŸíŸ    ( 8 = = E J J R W W _ d d l q q „ ‰ ‰ œ ¡ ï İ Ë ¹ ¡ ü ¡O¡=¡+¡¡¡\¡a¡a¡p¡‹¡�¡�¡¡¡¼¡Á¡Á¡Ò¡à¡å¡å¡í¡ò¡ò¡ú¡ÿ¡ÿ¡¢ ¢ ¢D¢2¢ ¢¢c¢~¢ƒ¢ƒ¢»¢©¢—¢Š¢Ú¢õ¢ú¢/£££ú¢G£L£�£o£d£L£™£�£¸£¢£�£Ğ£Õ£ò£Ü£Õ£
¤¤¤¤4¤D¤U¤U¤z¤|¤’¤˜¤˜¤µ¤¤ó¤$¥¥G¥O¥O¥O¥[¥`¥`¥s¥~¥ˆ¥�¥˜¥¢¥§¥§¥Á¥Æ¥Æ¥Î¥Ó¥ç¥Ó¥ö¥¦¦¦¦)¦4¦9¦9¦D¦U¦Z¦Z¦e¦p¦u¦u¦†¦‹¦‹¦œ¦¡¦¡¦»¦Ʀ˦Ö¦˦å¦ê¦ş¦ê¦␍§§§§,§1§E§1§T§Y§Y§m§Y§|§|§|§�§�§�§ §¥§¥§±§¥§ħɧɧÕ§ɧè§í§í§ù§í§ ¨¨%¨¨4¨@¨K¨V¨[¨o¨[¨~¨Ѝ•¨ ¨¥¨¹¨¥¨ШȨÙ¨ިިæ¨ë¨ë¨ô¨ù¨ù¨©©©©©© ©%©%©0©5©5©@©E©E©P©U©U©`©e©e©p©u©u©€©…©™©…©¨©³©¾©É©ΩΩØ©İ©İ©ç©ì©ì©ö©û©û©ª
ª
ªªªª$ª)ª)ª6ª;ª;ª;ª;ª;ªCªHªHªPªUªUª]ªbªbªjªoªoªwª|ª�ª|ªŸª°ªµªµª¼ªǪçªìª«␍«&««5«@«K«P«P«W«b«‚«‡«�«¨«Á«­«Ğ«Û«æ«ë«ë«ò«ı«¬"¬8¬C¬\¬H¬k¬v¬�¬†¬†¬¡¬�¬°¬ЬÕ¬ë¬ö¬­û¬2­­A­L­Q­Q­l­X­{­›­ ­¶­Á­Ú­Æ­ı­é­ ®®®®7®#®F®f®k®�®Œ®¥®‘®È®´®×®â®ç®ç®ö®û®û®
¯¯¯¯¯¯¯¯$¯&¯&¯0¯7¯Z¯\¯\¯f¯f¯f¯f¯f¯h¯h¯¯†¯‘¯‘¯œ¯¢¯©¯´¯¿¯ʯį寰÷¯°°(°"°N°C°f°f°f°o°v°‰°�°œ°¯°¯°˰Ö°ê°±±±(±8±M±_±o±o±—±�±­±¿±¿±ñȱϱß±ş±ş±²² ²%²%²)²4²@²N²{²„²•²£²Ö²â²ç²ı²³³+³0³>³Z³…³®³±³Á³óódzæ³ñ³ñ³ô³´-´M´M´M´P´y¶Y, îÔîÔüÔÕÕÕÕÕZ`FZÖ‚Ö‚ì‚ú‚ƒƒƒ-ƒ1ƒ7ƒMƒjƒlƒlƒ�ƒ‹ƒlƒ¼ƒƃ[8
~U~UŸUŒU®U¹UÄUÏUÚUæUìU\\’¸�¸�Æ�È�Ó�Û�æ�ñ�ü�ş�ŸŸ&Ÿ2Ÿ;Ÿ>ŸmŸ]è®dŞëŞë ìì ìKìKìVìcì�ì‰ì¶ì»ìäìí í&í*íMísíxí¡í¾íäíûíîîî&î+î<îDîcîiîmî†î�î­î²îÃîËîêîïî÷îıîïïï ï$ï=ïBïNïSï^ïdïvïï“ï�ïÃïôïğ"ğ"ğ"ğ8ğGğTğtğtğ‹ğ�ğ�ğ§ğ©ğ©ğ½ğ¿ğ¿ğÖğØğØğïğñğñğñññññ-ñ-ñañuñuñˆñ�ñ�ñ�ñ�ñ¼ñÒñîñîñîñûñòòòò!ò8ò:ò:òGò^ò^òsòuò�òªòªòªò®ò°ò°ò°òµò·ò·ò¼ò¼òÆòËòËòçòçòçòïòñòñòñòùòûòûòóóó&ó(óCó^ó^ó^ó^ó^óqóˆó�ó�óÜó^\
ÎJÎJàJöJK K6KIKTKiKVKxK€K‹K¡K—K¹K¿K_øA66$6'6.656<6@6B6I6P6T6X6k6“6®6›6Æ6Ë6ï6ï6û677L7Q7~7†7‹7”7 7¨7¯7Ñ7×7ù7û78)8K8Q8X8X8^8a8e8v8™8«8`$nŞnŞ}ޘޘŞ�Şa|\wéé(éTéTéséƒé…é…é…é…éŒé”é¯éÈéÊéÊéÊéÒéíéïéïéùéùéêb”"33@3J3V3[3k3q3†3š3ª3¸3Æ3İ3å3ï3ş3444444 4/494B4J4M4_4côÍî2î23$3'30363M3d3{3†3¼3Ü3á3æ3ñ3 44*4@4V4m4r4„4‰4Œ4¬4Ì4Ô4Ü4á45!5)51535S5[5`5e5p5p5{5{5‡5‡5™5Ù5ò5ò56dd¤¹ğŠğŠ‹‹‹‹!‹/‹B‹N‹h‹u‹u‹x‹†‹–‹°‹´‹¼‹e¸ù—*—*­*²*Æ*õ*+++"+"+3+:+K+R+[+r+r+ˆ+ˆ+�+�+´+´+Ê+Ê+à+à+ö+ö+ , ,",",9,9,P,P,g,g,~,~,•,•,¬,¬,Ã,Ã,Ú,Ú,ò,ú,--!-2-5-7-N-U-a.f¬÷ÖÖğöı␍--DKNP\mmpx�‘Ÿ¢¥¬°¸ÆØëî=g(ÉÏ}}-}}<}N}V}hCöNöNO.O3O;OCOKOXO^OgOmOrOzO–OœO�O O­O­OºO¯OËOÑOÓOÕOâOâOâOçOğOøOP P PPP#P0P6PAPHPXPcPrP“PšP¥P®P¿PÃPËPËPßPïP÷PúP`Qi8-7§/§/»/¿/Ä/Ï/Ú/İ/á/é/jˆ[ùƃƃàƒûƒ„„„„4„9„D„b„L„q„„„–„Ÿ„§„±„Ï„á„ê„ò„ü„……&…8…B…J…b…L…‡…q…–…¨…²…º…º…Ã…Ë…á…ú… †† † †&†+†I†K†P†[†q†q†q†u†�†¢†¬†¶†¿†à†ê†ô†ö†ö†‡!‡/‡2‡K‡O‡j‡n‡�‡‘‡¬‡°‡°‡°‡¶‡ć·ç‡í‡ø‡ˆˆˆˆ-ˆ8ˆFˆPˆiˆlˆtˆ€ˆ‚ˆŠˆ�ˆ¦ˆ¨ˆ´ˆ¶ˆ¾ˆĈ݈õˆ‰‰‰0‰@‰Y‰j‰j‰u‰€‰˜‰¤‰¹‰¾‰Ó‰ã‰ü‰␍Š␍ŠŠŠ&Š4Š;ŠMŠkeã6Ş6ŞPŞYŞyŞyŞއŞ�Ş—Ş¥Ş«Ş¸Ş¸ŞÆŞËŞËŞÑŞÖŞÖŞÜŞáŞáŞçŞìŞìŞßßß"ß"ß+ßKßKßKßRßTßTß[ß]ß]ßcßcßjßlßlßrßrßyß{ß{ß�ß�߈߈ß�ߖߜߤߤߤߤ߰߸ßÀßÈßĞߪßìßòß
àà#à&à&à0à9à?à?àCàKàUàcàkàoàuà}à‡à•à�à¡à§à²à¸àÉàÕàÛàãàçàñàÿàá ááá#á1á9á=áCáNáSálá†á‹á�á4âl`�!�!˜!Ÿ!³!Ç!Ì!ê!ï!␍""-"/"F"Z"c"e"y"‰"º"m�2Ò“““/“@“Q“b“s“†“�“œ“º“œ˓ؓí“í“”””,”G”G”S”[”c”i”~”†”Š”’” ”¦”«”«”À”Քܔä”ì”ò”•(•4•8•B•[•a•c•p•r•„•„•‹•“•¥•¥•´••Օٕã•ç•ó•÷•–––––-–@–F–J–T–X–g–k–z–~–‘–•–•–•–•–¬–º–Ç–Ï–æ–ö–——%—2—A—I—V—q—�—‘—–—–—–—–—£—²—º—À—Õ—ä—ù—
˜˜ ˜ ˜ ˜2˜8˜D˜J˜W˜r˜‚˜�˜”˜¡˜³˜Á˜ã˜hšnÔ¼í l l2lClNlYlol�l™l�l­l´lÁlÈlÖlİlßlâlçlélïl m#m9mQmVmemlmym�m®mµm·mºm¿mâmn no$hm?&?&M&a&h&‚&pxKe–M–M¾MªMÍMèMÔM÷MüMN NNN(N0N8NCNNNdNYN|N„NqFƒşpşpq!q9qQq[qfqfqkqvq‚q�q›q«q»qÂqÈqİqòqòqrrr+r:rGrXrirwr…rŒr’r§r¼r¼rĞrİrîrşrssss,s=sJsZs¼sr8«µ¦N¦NªN¯N´NÅNÓNÜNáNæNèNs88Bï/ï/00 00!0$0(000t0†�îLîLMM$M*M-M5MuÜtFFhs~‡—©¯µ»ÑÀåòõı=PTZqw‡�™§¬ºÓáêúü/=Ic‚‰“¢¨®´ºĞñ(3BP_l|Š¡­²ÀÜî $*ALY``n}�œ®®Ùäv`1EÖ�Ö�ì�ş�‚ ‚‚7‚;‚A‚W‚t‚v‚v‚§‚•‚v‚ƂЂwD‹Ø�â�â â¨â³â¹â¿âÃâÇâóâóâúâıâããã?ãCãHãHãOãRãWãcãtãxã‰ã›ãŸã¡ã³ã·ãÓã×ãÜãÜãğãóãä ää8äCäGäLä‚ä›ä¦äªä»äÆäÊäÌä×äÛäÛäïäóäõäõäåååååå åBåxˆÙ÷FåFåZåpåpåpåråråyå{å{å‚å„å„å‘å“å“å å§å©å©å¶å½å¿å¿å×åÜåÜåìåy°0XŞVŞVöVşV WmWSWHW.WWsW…WuW¥W¥W¼W°WîWóWÿWXX#X)X0XTXCX7XkXmX‰X‰X�XºXºXºXÆXzÄL¹ŞùŞùüùúú8ú8ú:úGúRúXúiúxú‡ú”ú”úšúŸú¤úºúÍúØúÜúîúûúûû
û%û3û3û3û>ûYûDûaûtûvû’û~ûšû¨û¨ûªûÆûÆûÍûÓûÜûãûæûüüü$ü*ü3ü3ü3üFüKüKüSüSü^üsü|ü|ü|ü|ü˜ü¯üµüºüºüÏüÕüÚüÚüæüı#ı(ı-ı-ı9ıVıeıtı|ı�ı‡ıŒıŒı“ıšı½ıÚıÜıùışşşş!ş*ş*şHş^şişnş{ş†ş�ş—ş§ş¾ş¾şÎşÎşàşæşÿÿÿÿ!ÿ&ÿ&ÿ3ÿ>ÿDÿMÿMÿ`ÿmÿÿŠÿ˜ÿ¡ÿ¦ÿĞÿÙÿäÿéÿğÿøÿ  %,9@Rgnt}}† §¬ºÊØØŞåîî'/7C`gtv}‘   ÊÊÊ××ì÷ !/:IPPi|~�¢¤²ÇÇÍÖÖãéûû (/:?GNY^su�¤¤¤¦­³ÄÒääêñúÿ#,,2;;ZZgjs|„�¡§²²¿ÂËÔÜçùÿ

#,.Pcx~‰›¡©©©©´- {”�¾×2×2ë2ï2ø2û23␍3 3 3K3O3T3W3`3p3w3z3‚3…3’3š3¢3ª3±3Á3Á3Í3|`2ÆKÆKîKÚKıK"LL1L6L=LELLLWL_LjL€LuL˜L L}À- e e¾eÎeØeØeâeâeìeşe ffff&f&f4fHfHflfyfyf‰f–f–f¹fÆfÆfÜfÿfg8gAgNgNgqg{g{g®gágçgçgçgùg~¸ºäÀ‹À‹Ø‹Ú‹æ‹ê‹÷‹ú‹ŒŒŒŒŒ&Œ1ŒEŒQŒSŒSŒ\Œ^Œ^ŒgŒiŒiŒrŒtŒtŒ}Œ}Œ†ŒŒŒ�Œ™ŒªŒ°Œ¼Œ¼Œ$�œö##4#E#]#d#€#u#˜#¸#¤#Ç#Ø#İ#ş#ê#$3$:$V$K$n$�$z$�$®$Ä$°$Ü$é$é$%% %€œX{^1^1j1z1…1¯1ß1ğ1222!252<2J2b2q2~2�2š2�2¢2¹2É2Ù2İ2ä23�x¬¨®¨®¾®Å®Ì®ë®ú® ¯¯'¯6¯@¯@¯E¯L¯_¯n¯s¯�¯¨¯¨¯¾¯Ğ¯Ô¯â¯é¯î¯î¯õ¯°°° °2°2°2°D°O°a°l°y°~°�°“°£°¯°´°Á°Æ°Ö°Û°ë°í°ı°ÿ°±±"±+±+±-±=±D±T±T±o±�±“±¥±µ±µ±µ±¸±Ë±‚\åø(�(�C�J�O�]�r�y�ƒ�‘�”�–� �²�²�¹�ï�ƒ0ÎÖ6xl@>Œ”„`0Ö€Ö€ì€ş€���7�;�A�W�t�v�v�§�•�v�Æ�Ğ�…L4CÖ/Ö/ä/ö/ü/000%070=0@0|0†(–œ§2§2µ2Ä2È2Ë2Ñ2‡\DW~0~0Œ0�0¤0¬0¾0Ä0Í0ß0å0î011 1W1ˆ, –Ô–Ô¤Ô«Ô³Ô¸Ô¾Ô‰„ 

$
6
@@ -387,42 +409,52 @@ M�����M�M�����&M�6M�����>M�����AM�
D
S
X
w
w
|
›
 
§

¸
×
×
ö
 ø
 & ( G G G G V o h ‡ ‘ ‹\?�a�a«a³aºaßaíaïaıa
bbb2bAbLbPb[bgbrb~b•b¬b¿bÖbàbîbccc"c"c(c9c?cOcOcgcgcŒcŒc‘c‘c—c£c°c¼cÑcèc÷cdd d7dOdpdpdyd~d~d~d~d�d—dŸd¤d²dÀdĞdÕdÕdãdãdèdèdòdıdee!e1e<eFeJeSeleoee†e¤e­e­e¼eÌeÜeãeéeõeıefff&f,f9fDfJfZfjfjf—f¹fÅfÍfØfßfêfìf÷f÷fg g gg!g3g9gGgTgagkgogxg‘g”g¤g«g°g°gÄgÄgÉgÍgİgægøgşghhhhh+h1h=hMhMhMhRhjhjhyh|h�h®h¹hâhôhÿhiii!i3iCi[ibifilitii™jŒ<NY~)~)˜)¤)¶)Ì)í)Ú)***'*�`l€Ğ›Ğ›ğ›÷›ÿ›
œœ œ'œ6œ@œCœgœiœyœyœ‡œ�Xn.Õ.ÕTÕfÕkÕ‚Õ”Õ�Õ¨Õ¶Õ¾ÕÍÕãÕåÕîÕÖÖÖ"Ö$Ö/Ö:Ö:ÖBÖJÖTÖ\ÖfÖoÖwÖzÖƒÖ�Ö¯ÖÁÖÄÖÉÖÜÖôÖ×××"×%×*×=×U×i×q×qגוך׭׳×Èת×à×õ× ØØØØ=ØDØOØfØ�83=ÓÓÓÓ%Ó)Ó7Ó:Ó?Ó�8>HFÓFÓOÓOÓ]ÓaÓhÓkÓpÓ‘D*N+N+h+{+…+Œ+˜+°+¹+½+Ï+Õ+ô+’Ğy©®ø®øØøÛøâøèøîøğøöøüøüøùù ù-ù:ùMù\ùpùvùxùù…ù�ù�ù ù¢ù©ù¯ù¹ù¹ù¹ùĞùâùéùøùúù úúú-ú“0+3ö+ö+ÿ+%,6,<,<,D,”„\y6í6íHí]ígípíríyí‰í”í–í í í¦í·íºíºíÛíæíèíîî îî+î~î• 
�*�*§*Å*Ê*–h÷␍î^î^___(_3_9_J_P_a_g_s_Š_Š_œ_­_º_À_Ñ_×_%`—�ÖîOîOP!P5P=PKPOPXPXP]PjP€PªP¯PÓPÛPàPçPıPQQ+QAQeQQ‘Q˜ˆù&ı&ı>ıPıWı^ı}ı‚ı¡ı¦ıÀı­ıßıÌıëışíı ş ş+ş+ş+ş=şDşcşcşkş™ y}PˆPˆYˆeˆjˆš(Aãã@ãHãNãVãXãXãiãiãiãqãyã‹ãšã‹ã¯ã±ã±ãËãÍãÍãØãİã÷ãüãüãüãää ä"ä/ä1ä>äFäNäUädäqäsä„ä‘ä‘ä‘äšä¬ä¿äÅäÍäÏäÜäÜäñäñäñäüäåå#å#å#å1å7å<åDåOåaålåqåqåxå|åŠå�å—å�å¼åÉåĞåÙåõåúåúåúåúåæ␍æææ;æ;æ;æBæPæ_æræ…æ‡æ‡æ‡æšæšæ¡æ¨æ­æ³æÅæÏæêæççç-ç2çVç]çiç‡çšç¥ç¬ç°ç°ç°ç°ç»çÅçÓçõçèè'è'è5èSèƒè–è§è¾èÑèÖèÖèÖèŞèéèûèé é é ééJéPéPéPé[éeéqé|é~é~é~éƒé�é�éÙé›H%—/—/¥/¬/·/Å/Ğ/Ø/Ø/ğ/ú/00œ0 ¦T¦TÍTºTÙTïTèTUU�T<M^(^(x(„(–(¬(Í(º(å(ö())?),)W)o)o)y)�,×–Q–QÈQÜQäQïQöQıQRRR R)R0RKRMRTRoRvRR�R–R„R¢R¢R¢R°RºRÇRçRéRS S S'SESJSQSeSlS‡S‰S�S«S¿SÚSİSåSòSTT.T6T6TRTRTmTmT“T¥TŸTXi>>Tbhn�›­±·ÅÈÒ Lgnşnş�ş’şªşÅş±şåşÑşñşÿóş'ÿÿ3ÿ?ÿDÿPÿ`ÿgÿtÿÿ‹ÿ–ÿ�ÿ£ÿ¯ÿ´ÿÈÿÏÿÓÿŞÿãÿîÿ!5<@@E^c|‘£¨³»»»½Öëö ␍  -%Ee¡àZ�øbøbc c%c2c@cIcdcrc”c�c­cÇcÒcâcäcæcğcücd␍dd+d3dKdOdOdOdOdTdrdŒdŒd“d–d�dªd³d e¢d~“.,.,L,o,€,‡, ,˜,¸,Ø,Ä,ä,õ, -÷,#-0-0-H-H-R-£@I•– – ® À Ë ó Ş Ò ÿ  J 5 ) V p p � ¤ ‘ Ñ ¼ ° İ ÷ ÷ ÷  ␍#␍#␍P␍i␍]␍–␍›␍®␍¢␍Ğ␍Á␍Ü␍ú␍8%SD_}’ª�̽Øòòò9Feem¤(.à.à<à_àeàjàjàpà¥(!'¶Ò¶Ò¿ÒÍÒÓÒÕÒÚÒ¦D]j999%9.9:9O9W9]9c9e9e9t9§„½Ú(¦(¦[¦g¦k¦s¦{¦¦Š¦�¦’¦–¦�¦£¦§¦¸¦É¦Ë¦Ï¦à¦ñ¦ş¦§§"§"§"§4§¨€8˜8˜Q˜X˜_˜f˜l˜|˜‡˜‘˜œ˜³˜¶˜¸˜Ó˜İ˜ç˜î˜ù˜ ™™™)™)™;™©˜b__4_T_\_g_v__ƒ_�_®_³_Í_ì_ò_÷_
`7`@`V`\`d`g`l``¤`©`¿`Å`Í`Ğ`ğ`õ`a1a7a?a?aDaJaMaXaxa}a—a¶a¼aÁaáaêaïabbb;bDbFbebmb�b’b¬bËbÑbÖbÖbÖbÖbãbôbÿbc"c5cBcZcncc‰c‹cŸc°cµcÀcÍcícícícÿcª°)ˆ�ˆ�«�¸�½�Á�Ê�×�ã�î�ù�Ÿ ŸŸŸ#Ÿ+ŸEŸkŸeŸ{Ÿ„Ÿ¹Ÿ¥ŸÉŸÉŸáŸìŸ  3 l l l l Í «0ùAÀŒÀŒåŒñŒüŒ� ���&�4�>�P�Z�`�j�p�z�����“�œ�Ç�Ö�Ù�Û�å�÷����2�2�5�?�T�Y�i�t�y��� �ª�¿�Í�Ö�Ş�ì�ı�␍��+�+�8�8�@�N�•�¬l£:f@f@@—@§@Ç@Ù@ñ@ A A6A>ABAEAIANAXA[AbAhAoAuAyA~AˆA™A A§A©A­A¶AÀAÃAÎAÚAİAîAùAÿABB(B9BBBKBSB^BiBuB†B—B£B±B³BºBÁBÆBÊB×BŞBCCC#C,CECVC_ChCpCyCCƒCˆCŒC™C C®C¸CÍC×CàCùC
DDD$D-D3D7D<DBDLDVDrD€D†D‹D“D›D£D°D¸D×DÊDéDòD␍E!E4E;EDEMETE]EfEoEˆExE˜EœEöE­  H…H…V…u…{…®À�¹?(?(H(o(](O(�( (’(Á(ä(ä(ô(ù(ù(␍))).)3)3)S)X)X)l)q)q)�)�)œ)À)æ)****<*L*L*L*L*L*+¯$bg�&�&“&«&½&×&°´ªÆºƺàºïºïºòºûº»»»(»I»[»m»q»�»¡»³»¹»Ì»Õ»Ù»ß»è»è» ¼␍¼¼*¼H¼Z¼`¼s¼…¼‘¼“¼Ÿ¼§¼«¼±¼º¼º¼º¼º¼̼â¼è¼ô¼ ½½½$½9½@½@½@½N½\½f½i½w½�½„½–½›½ ½°½³½¸½Ƚ˽Ͻؽà½ò½ú½¾¾ ¾+¾@¾G¾O¾a¾g¾v¾‡¾‡¾�¾�¾�¾œ¾ª¾´¾·¾žϾÒ¾ä¾é¾î¾ş¾¿¿¿¿¿&¿.¿@¿H¿Q¿Q¿\¿s¿‹¿�¿›¿³¿»¿Á¿Í¿Ö¿Ú¿â¿ë¿ë¿ë¿À ÀÀ)À2À:À@ÀFÀFÀFÀMÀ_ÀkÀsÀyÀÀÀ�À“À±xÔÔÔ)Ô0Ô;Ô]Ô‘Ô­Ô¿ÔÓÔÙÔåÔîÔöÔşÔÕÕ ÕÕ Õ&Õ(Õ.Õ²Ü,ßNmNmlmtm„mŒm¹mĞmÔmÜmämêmşmnnnGn‘nln´n¹nËnÚnÜno ooo$o,o8o@oHo[ocohoro’ošoœo¦oµoÕoİoßoÿoppppp,p4p=p=pBpFpNpWp`php„pŸp¹pãpæpıp
qq5q9qjq„q–qÀqÆqÈqòqõqõq rr-rDrOrSr^rir{rŠrŒr¶r¹rËrÚrßr sss&s5s7sasdsvs…s‡s±s·s·s·sÁsÁsÌsıstttttt3tLt_tftrtytytŒt�t�t�t—tœt¯t¶tÂtÉtÉtàtâtçtútu␍uuu!u+u+u2uSuSueu³ Ä�E�E³E¾EæEÑEÅEFòEF&FFSF>F2F_FmFuF€F‚F�F˜F˜F�FÊFÏFüFGGG:G'GFGQGfGSG…GrG‘G–G‘G¬GºGÂGÍGÏGÚGåGåGêGHH"H"H/H4HSHUHtHtHtH|H´\ãöş]ş]^&^,^7^E^Q^h^h^z^€^‹^›^¦^´^Á^í^µ(5;ff„—�¥¬°²¹ÀÄÄÌåïï   - 1 6 R z ~ ‡ ‹ � ¡ ¾ ¾ Ì à å ş      F [ b u y ~ š  Ê Ó × Ü í ÿ !#!%!>!Q!U!U!U!q!™!�!¦!ª!¯!À!İ!İ!ë!ÿ!""."2"D"D"D"I"X"y"˜"£"©"¿"Ğ"Õ"ê"#.#2#;#?#D#U#n#n#|#�#’#«#¼#À#À#Ç#Ú#Ş#ğ#õ#$9$A$J$N$S$d$z$Š$�$£$¼$Ï$Ó$å$å$å$å$ê$ %%9%D%J%`%q%q%q%x%‹%¤%¤%¤%³%³%Æ%İ%è%ù%ş%&&&&&#&.&C&E&P&e&q&s&~&Š&š&¡&¨&²&º&¾&Â&Ä&É&Ñ&Õ&ç&é&î&ö&ú&ü&ü&''('H'b'n'z'�'�'”'˜'˜'˜'Ÿ'¤'¾'Ê'Ö'İ'İ'ô'ö'û'(!(-(4(4(A(K(K(](˜ ºœ H H=HLHLHLHfHfHuHuH{H}H}HƒH…H…H‹H�H�H”H˜H�H�H�H�H�H�H¥HºHºHÏHÚHäHñHII#I%I@IEI`IeIkIkI€IƒIªI·IÏIïIïIøIıIJ J!J0J5J<JEJXJ`JhJmJmJmJvJ�J•J•J®J¼JÖJìJîJöJüJK K KKKK)K+K@KBKJKPKXK]K]K]K]KkKK�K•K•K�K£K«K°K¹KÁKÊKĞKÖKØKØKØKàKàKîKLLLLL1L7L?LDLMLXL[LaLgLpLsLsL�L�L‘L´LÑL×LßLäLíLïLïLôLöLşLşLM+M0M<MBMEM\M^MaMqMuM|M…M”M¢M¨M°MµM½MÂMÂMÊM×MïMôMşM&N1N<NGNRN]NhNsN~N~N~N†N†NŸN­NÇNİNİNßNßNèNîNğNğNöNüNüNO␍OO O O&O)OHOSO[OcOhOhOoOsOxO‡OŒO–O O O­OÔOÔOÚOèOùOP PP)P?PEPJPJPOPbPnPvP†P�P™P§P®P°P¹P¹P¿PÍPÙPìPÿPQQQ.Q3Q3QPQPQbQhQqQwQ€Q�Q“Q“Q¦Q¬Q®Q¹QËQŞQŞQòQşQRR!R'R*RARCRFRVR`RcRcRrR…R—RœR¨R®R±RÈRÊRÍRİRáRéR÷RüRSSSSSSSS(S.S4S>SHSVSkSnSpSzSzS|S„S‰S�S“S“S™S¡S¦S¦S«S¶S»SÀSËSĞSöSøSıSTT TTTTT T%TATKT_TsTyT�T�T�T•T›T¥T¯T½TÒTÕT×TáTğTõTõTõTıTU U UUUUU#U#U(U3U8U=UBUQUQUbUhUhUvU|U‚UŒU–U¤U¹U¼U¾UÈU×UÜUÜUÜUäUéUòU÷U÷UıUV
V
VVV V$V)V8V8VIVOVOV]VcViVsV}V‹V V£V¥V¯V¾VÃVÃVÃVËVĞVÙVŞVŞVäVìVñVñVşVWWWWW(W2W@WUWXWZWdWsWxWxWxW€W…W�W“W“W™W¡W¦W¦W³W¹W¹WÇWÍWÓWİWçWõW
X␍XXX(X-X-X-X5X:XCXHXHXRXZX_X_X_XeXoXuX‰X�X�X”X�X¤X©X©X¯X½XÆXÔXÙXÙXßXíXùX
YYY&Y0Y>Y>YCYCYNYNYNYRYWYWY]YaYfYnYtYvYY�Y–Y›Y¡Y¡Y©Y¯Y½YÈYÍYÓYÛYàYàYàYàYàYàYàYàYàYàYùYÿYZZZZ Z)Z4Z=ZEZJZJZJZPZXZ]Z]ZaZfZfZoZ}Z‰Z–ZœZœZ¥Z¹Z¹Z¿ZÈZÜZÜZåZçZíZöZ
[
[[[[[[[%[*[*[G[U[a[j[p[z[‚[‡[‡[‡[›[¤[ª[¼[Æ[Æ[Î[Î[Ö[Ø[Ø[ñ[û[\\\\ \\\\\\\\#\'\ _·Ğàfufuˆu�uªuÈuäuñuvv&v<v(vHvPvPv_v_vgvsv‰v�v­v¸vËvÑvÑvÑvÖvÛvêvõv www"w-w:wDwDwRw¸”*KĞ Ğ è ï ö ù ¡¡¡ ¡¡1¡¡A¡I¡Q¡T¡V¡f¡o¡x¡~¡�¡’¡©¡º¡Å¡÷¡¹à.¢v<v<”<Ÿ<°<³<·<À<Ç<Õ<ä<ú< ==.=@=O=^=o=~=~=Œ=�=”=™=�=ª=±=¿=Ó=Ü=â=ğ= > >>>>>>>#>#>2>;>C>Y>Y>Y>^>^>s>>Š>�>�>’>—>—>³>¿>Ì>Î>Î>Ò>Ô>Ô>ğ>ü>?
?
?␍??????!?!?*?0?5?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?S?d?v?…?”?”?˜?˜? ?¼?À?Å?`@º,æÑæÑôÑûÑÒÒÒ»˜?afWfW|W‚W‰W¹W¥WÅWÊWÑWÑWñWXóWXCX/XOXTX[X[X[XaXdXhXpXˆX“X¦X�X¾XÈX¼PQa§%§%µ%Ã%Ê%Ú%ë%ğ%␍&&&!&/&;&M&‰&½D%vàvàŠà˜à�àÁàÇàÍàòàøàşàáá á¾ô#œ¾0¾0Æ0Õ0Ù0æ0ó01161C1U1w1—1¥1Á1Ó1ë12␍2.2L2[2v2�2œ2µ2µ2Ğ2ù23.3@3O3^3^3i3|3�3 3°3½3È3×3÷3÷34444!4(4G4P4]4a4i4t4Œ4¤4­4½4Å4Ê4î4ş455-525:5`5b5m5 5º5º5Ò5á5é5ø56 66:6B6J6U6W6g66—6¯6Ç6Ù6ğ6ù677"7&7*7¿ €…€…‰…¨…­…À\…X�È�ȸȿÈÌÈ×ÈÜÈâÈôÈúÈÉÉ6ÉJÉUÉ[É}É}É�ɢɤɧɳɻÉÃÉËÉÙÉßÉåÉñÉñÉóÉÊ ÊÊÊ'Ê'ÊEÊEÊXÊeÊjÊjÊ�ʊʙʯʺÊÈÊÓÊãÊğÊËËËË+Ë-Ë-Ë5Ë:Ë:ËBËGËGËOËTËTË\ËaËaËgËlËlËsËxËxË˄˄Ë�Ë”Ë”ËŸË¤Ë¤Ë¯Ë´Ë´Ë¿Ë¿ËØËßËåËèËóËöË
ÌÌ&Ì-Ì0ÌBÌDÌJÌ^ÌkÌzÌzÌzÌz̜̱̄ÌÁÌÒÌØÌéÌïÌôÌşÌÍ Í/Í5ÍFÍQÍ[ÍjÍyÍÍŠÍ�ͥͫͼÍÇÍÍÍİÍİÍíÍÎ ÎÎ$Î+Î1ÎBÎMÎRÎo΄Β΢ήÎÀÎËÎÚÎÜÎîÎöÎûÎÏÏÏÏ$Ï.Ï4Ï?ÏEÏGÏTÏaÏkτϒϒϘϟÏßÑÁ0#«h¨h¨‡¨±¨¹¨¹¨Ç¨Ú¨ó¨ö¨©©©©©©$©&©&©.©0©0©8©8©A©G©L©L©U©a©e©j©p©u©u©}©†©Œ©‘©‘©–©¢©º©Ù©Ü©ñ©ªªªªªªª"ª$ª$ª$ª,ª.ª.ª.ª6ª8ª8ªCªCªIªNªNªNªNªUª`ªrª€ª�ª˜ª˜ª˜ª¨ª¨ª¯ª³ª¹ªÑªßªòªşª'«*«1«C«K«T«_«_«j«p«u«u«u«|«‚«—«Ÿ«¥«Ç«Ó«Ù«Ş«Ş«å«ğ«ğ«õ«¬␍¬␍¬␍¬␍¬f¬Âd)¤B¤BÆBĞBÓBÓBİBğBòBÿBC C C(C8C=CCCKCNC`CÃLWf/1/1C1G1L1W1W1a1g1g1k1s1Ä\CVÇ0Ç0İ0İ0á0æ0ù0ü011 111 1!1+1Å8(2ŞÒŞÒçÒçÒõÒùÒÓÓÓÆ¨²ØFgFg^gfgqgŠg~g·ghügñgÜgÅgh,hhGhLhXhh„h™h†h¥h«h«h¸hßhiíhi6i6i6iBiÇl¨¿f.f.€.¨.‹.´.Ô.í.æ.//
/)/</\/n/�/�/�/­/­/·/È4“œŞèŞèòè÷èıèéé$é,éɼMx““.“9“C“\“t“y“~“‚“„“Š“�“¦“““²“²“Ñ“é“Ö“õ“ÿ“”0”5”:”>”@”F”L”b”O”n”n”�”‰”›”µ”®”Á”Í”Ê4;D®İ®İ·İÃİâİçİéİéİîİË”"8§8§F§X§\§d§l§w§‚§Š§•§ §¥§»§Â§É§Ô§ß§á§ì§÷§ù§¨¨¨$¨,¨,¨0¨g¨Ì€Úö/5/5M5Q5U5]5k5n5q5„5Š5Œ5›5Ÿ5£5«5³5¿5Ô5å5ì5ó5ó566Í`!µvIvI¨I³IèIÙIÀIîIJ"J"J&J0J<JWJ^JlJnJvJ�J¬J¾JËJãJ÷JüJK(K/K8K:K?KSKpK‚K�K§KÄK½KÙKİKİKèKïKLLLL L(L@LBLZLlLoLqL‡LvL“L“L“L¥L¥L³L½LåLŞLúLúLÿLM M+MFMdMnMrM‚M¡M–M­M¯MÁMÕMæMßMõMùMN.N#N:N<NNNXNlNvNN–N N¢N¶NÀNÀNÖNÚNÚNÚNåNìNOOO2OFO]ObOtO|O¤O�O³O³O³OØOØOêOÎd9Îf3f3œ3£3«3´3Å3Ò3ç3ê3í3ñ3ú3444?4D4Q4}4‚4�4¯4´4Ã4ï4÷4ü45=5E5J5J5]5p5€5„5£5´5¹5¹5Û5Û5Û5Û5Û5ë5666
6
6676<6E6R6Z6u6‡6”6Ÿ6½6½6½6Ê6á6ã6ã6ã6ğ67 7 77-7-7>7C7c7u7‡7¥7¥7¥7²7É7Ë7Ë7Ë7Ø7ï7ñ7ñ7ş788&8.838Y8k8}8›8›8›8¨8¿8Á8Á8Î8å8å8ú8ü89%9C9H9O9]9g9i9i9i9…9�9�9�9±9ë9Ϥ/T†å†å¦åÈåÈåçå÷åüåüå ææ7æ?æFæHæ[æcæcæcæeæeæeæeæƒæƒæƒæƒæ•æ—æ—æ—æ—æªæµæØæĞyΔΔä”ğ”û”• •••#•(•3•8•8•8•j•W•v•x•}•ˆ•�•�•�•¿•¬•Ë•ò•ò•––+–>–C–C–V–i–|–�–”–”–§–º–Í–à–â–â–õ–——.—.—.—<—Ñ0Š’~è~èŒè’è–èµèÖèÖèÜèÒ<:E8888)858A8J8S8\8b8g8ÓluŒo'o'}'‡'�'¥'¥'ª'¬'¸'Â'Ğ'í'ï'ÿ'ÿ'((␍(?(ÔàŸÓFFZ„yeŸ¬¸Ë¾øı)€)€.€D€V€l€‚€µ€Ä€�ü€è€�$�P�U�]�|�„�©���Š�¹�Ò�¾�ò�Ş�‚‚?‚?‚?‚?‚G‚ÕLÀϾ/¾/Ü/î/õ/00&090F0?0^0h0ÖÈg•w1w1›1Ÿ1¾1à1ì1ó1ş1 22 2 2$2.2F2Q2a2m2t22�2’2£2¥2§2§2§2¯2¯2¹2¹2Á2É2Ñ2Ù2İ2ç233× ø„ø„…… …Ø`FZg8g8w8~8€8…8”8š8¯8¯8½8½8É8Ò8Õ8ã8í8ğ8ø8Ù<œ§V¡V¡_¡j¡u¡€¡‹¡•¡³¡¾¡ΡÚ 2&`&`>`P`V`b`m`{`‡`�`©`¹`Ë`Ñ`×`İ`ğ`ö`ÿ`aaa(a0a>aKaˆaÛ, Î*Î*Ü*í*++++Ü4°…°…¾…È…Ñ…Ø…ß…é…é…ï…İÄKx�ö�öºö½öÂöÏöÔöæöèöìöğöóö÷ ÷A÷J÷U÷\÷u÷—÷œ÷µ÷×÷Ü÷ã÷ü÷ø ø9ø[ø[ø[øpøŠø™ø«øŞ„¦o¦oÄoÇoÍoáoéoúop␍ppp p(p.p>pLpNpmp~p…p‘p¡p¡p¯pÂpÍpÑpâpâpâpçpçpópqqq q4q:qBqTqZq\qkqxq~q„q‰q�q•qœq¨q¯q±q¶q¾qÀqÅqÑqÓqØqàqâqçqïqñqöqşqrr␍r␍r␍rrrr4r:r@rKrPrXrqrwr‚r†rŒr—r°r»rÆrÌrÙrŞrãrãrørss&s1s<sHsBsQsZs_sdsys€s‰s•s›s§s«s°sµsÀsËsÖsØsŞsësğsõstt$t$t*t7t9t>tGt`tktvt|t‰t‰t�t’t’t£t¥t¥t¸tºtºtÍtÏtÏtâtätät÷tùtùt u uuuu-uAu6uNuVu]ucuku~u‰u€u™u™u›u³u¶u¸uÄuÖuæuòu v#v(v<vLv_vdvdvjv~v�v›v£v«v¯v½vÃvÈvÈvÎvâvòv÷v÷vıvwwwwww0w=wAwFwFwJwOwOwTw_wkw…w›w§w§w­wºw¼wÉwÕwäw÷w÷wxxxxxxx*x<xGxOxWxYxkxpx~xŠx�x�x�x´xÄxÄxØxäxæxïxûxyyy%y'y9y9yDyDyDyDyDyÀ{ß „È–O–O´OÂOÕOÚOøOşOP PPP-P2P>PPPPPnPyPŒP“P­PÊPÖPñP Q%Q.Q=QEQRQ[Q`QqQQŸQ¤Q¬QÅQ×QçQíQøQRRMR7R(R]R˜R‚RsR¨R«RËR_Sà<*5dCdC…C‹C”C¦C¿CÇCİCéCá„ |ææ"%%5@@CJQW]cjp��ƒŒ˜�ÄÈËÛãèèïõ ..7<FMT\bdr‰Œ›§´´´´ºÌÒã-4>FMMV]iy„„„˜¬¼¿zâ„9ç6ç677737Y7o7€7‰7—7©7Â7Â7Ô7ê7ò7õ78ãX{ÍÎÎù!3AGX_g}…˜­½ÇÉÙéòøı
!,/6PXr‡”—Ÿ£µÄÏ×î -5<@IK]t‚ˆŒ�›››�´ººÌä 
… …)…=…B…å,şE��2�8�C�T�Y�_�b�f�f�†�‹�Á�­�Í�æ�Ò�ò� ‘÷�‘‘#‘-‘0‘4‘9‘R‘>‘^‘^‘^‘c‘t‘y‘‘‚‘†‘†‘¦‘«‘á‘͑푒ò‘’(’’4’;’@’F’I’M’O’h’T’t’t’t’t’Œ’µ’Á’æ˜Íï  (##72FAP__nn}}ŒŒ››ª¾¹ÈÈ׿õ^çxÈâÎ\Î\ì\ş\]]']']9]?]J]Z]f]o]u]{]†]”]¡]­]»]Ê]Ê]ú]èd�².é.é2éEéEé_éféréré‰é‰é é é·é·éÎéÎéåéçéçéëé騯øFûFûhûoûzû�û�û¢û­û¸ûÉûÚûñûõûúûşûüü#ü/üAüCü\üküoüoüoü‚ü—ü—ü£ü©ü³ü¾üÌüÓüâüäüúüıı&ıêP6FìCìCDDDD+D9D?DKDSD^DdDgDqDë ®-æ7æ78 888 8&8<8M8^8p8‚8‘8 8±8À8À8Ç8Ë8Ô8á8è8ñ8ø8ü899999(9,9/979E9M9Z9b9j9{9†9‹9‹9˜9�9­9Ä9Æ9Ñ9Ş9í9ğ9ö9ò9
:!:#:1:3:>:D:D:L:L:^:e:{:{:{:€:€:•:£:®:³:³:¶:»:»:×:å:ò:ô:ô:ø:ú:ú:;$;0;2;2;5;7;7;D;F;F;I;I;I;I;I;R;X;\;h;ˆ;•;£;ª;r<ì(rx ˆ ˆ.ˆ5ˆEˆHˆNˆí(nt ' '('2'B'M'M'k'îTzK~î~îœî¢î¥î®î¸îĞîàîéîïîòîöîøîï ï-ï3ï7ï=ï?ïBïFïFïiïmïsïsïzïœï±ïÄï×ïİïäïïïùïıïğğ␍ğğğ(ğ.ğ3ğ8ğEğGğYğ[ğbğoğqğƒğƒğƒğƒğƒğ§ğ²ğ¾ğÕğÕğêğöğñ7ñQñVñmñrñ€ñ—ñœñ¢ñ³ñÈñÎñŞñëñò
òò.ò:ò:ò:ò@òCòFò_òeòyòò„ò�ò�ò”ò¡ò®ò®ò´òÂòÙòßòâòåòìòõòüòüòóóóó!ó/óFóLóOóRóYóYójóqó~ó‹ó‹ó’óœó£ó©ó°ó»óÏóÏóéóîóõóıóôôô ô8ô=ôDôfôqôwôô˜ô¬ô¬ôÇôÇôáôïôöôıô õ2õVõXõbõ„õ„õ„õ�õ©õºõÒõÖõ«öï¼ÙFiFi^ibipiiŠi–i¡iÁi£iÍiÒiÒiôi$jjûiFjKjsjxj„j�j¯j‘j»jÀjÓjÚj÷j
k
k-k-k9kğ n*n*}*–*œ*ñ8�™†I†IŸI®IÂIÏIÕIÛIŞIÿIò8 ÷.÷./ // /&/,/2/2/8/ó ++(+0+5+ôôÔ�N‚N‚l‚|‚‡‚’‚«‚ׂğ‚ƒFƒLƒRƒZƒ\ƒdƒƒ‚ƒ�ƒ™ƒ²ƒރ÷ƒ#„M„S„Y„a„f„n„‰„Œ„—„£„¨„Á„í„…2…\…b…h…p…r…z…•…˜…£…¯…È…ô…␍†9†c†i†o†w†|†„†Ÿ†¢†­†¹†¹†¾†ĆʆÒ†Ú†å†÷†‡!‡5‡_‡e‡j‡|‡‹‡©‡½‡ç‡í‡õ‡ú‡ ˆˆ6ˆJˆtˆzˆˆ‘ˆ ˆ»ˆψùˆÿˆ‰‰‰‰ ‰+‰Q‰i‰t‰|‰‰‰‰‰�‰¡‰¸‰½‰ã‰û‰ŠŠŠŠ Š3Š@ŠJŠ^ŠuŠ�Š Š­ŠØŠìŠ‹‹‹'‹>‹>‹G‹S‹i‹‚‹•‹¡‹´‹¸‹¸‹¸‹¿‹Ä‹׋ã‹ú‹ü‹ŒŒ Œ-Œ7Œ7ŒIŒõ”k t9t9Š9–9–9¬9·9¹9Õ9Õ9Õ9Ü9æ9ê9î9ñ9ñ9ú9ş9::J:V:a:q:�:†:‰:�:�:�:£:ª:·:¾:Æ:Ë:Ë:à:ì:ô:ù:ù:;;#;(;(;=;I;R;Z;b;n;„;�;²;¶;Ä;Ì;Ñ;Ñ;æ;<
<<<#<#<B<N<Y<^<s<<�<“<¢<¯<´<´<´<·<¼<¼<¼<Û<ç<ò<ô<÷<ü<ü<ü<====&=1=7=E=S=S=]=f=n=£=©=°=¿=Õ=Ú=Ú=í=õ=õ=÷=÷=÷=ü=ü=> >␍>>>>>>'>'>L>U>U>Y>tBö(␍tBtB‚B‹B™BŸB÷�1VwVwtw|wˆw�w³wÁwÌwÛwáwáwáwæwëwùwxxx!x/x:xGxNx\xø\”§V-V-p-”-w- -¹-²-Ñ-æ-Ó-ò-..*.*.7.V.V.`.ù8hrîGîGHH*H9H?HEHHHiHú0�—‰‰,‰8‰F‰I‰a‰d‰l‰û0S[¦Ó¦ÓºÓÂÓÏÓÙÓìÓüP>N˜†˜†¤†¸†»†Ï†×†Û†å†ï†÷†ú†‡ıTš«JJ J3J6J@JMJbJdJvJ€J”J”JšJ�JñJş<˜£p‰p‰„‰‹‰—‰£‰³‰¸‰»‰¿‰Ç‰ÿ ,0ááá(áHzˆödöd
ee!e7e#eCeEeLeWeceke Dƒ®M®MÒMÙMŞMæMN N NNNN4N:N<N>NKNKNKNKNON^NgNoNxN€N‡N�N�N«N¯NÁNÔNÚNîNóNOOOO"O+O9OBObOhOlOqOvOyOƒO†O–OD �j�j¬j¶jÀjĞjÕjÛjçjéjûjûjıj-klåü>ß>ßRßhßu߀߄ߋß�ߘߧߩߩ߽߿ßÈßÎßÎßÎßÎßÖß´Js€D€D¦D·D¼DÃDÍDÍDÕDèDìDñDEE EEE*E.E6EBEIEMEUEWE_EmEuEwEzE�E—EŸE­E±E¿E !E.k.k>kJkVkfk~k„k’k£k«k²kÈkîkll"l2l8l:lKlmltlzlˆl�l¦l±l·l½làlôB»pgpgŠg�g”gŸg®g°g»gÊgÊg×gågègêgêgïgôgıghhh*h/hDhOhYhYhohohœh°hÅhËhĞh×hİhähéhéhïhõhúhúh␍ii3i9i>iRi\icicicihihi‘i–i–i¿iæiëiëiëiîiõiûijjj␍jjjj/j9jCjIjljrj‚j�j”j¢j©j«j¿jÅjÌjÌjÎjÎjÎjÓjÙjŞjâjäjçjòjşjkkkk k kkDk˜}Ÿ~~šŸ¦°ÁÑÙáæñû   $ 4 ; C K S [ ` k y y � \X«�@�@¶@½@Ï@A␍AA'AAHAHATA\AkA¥A§AÔAÜAÜA B!BB<B-BHBNB]BrBtBB‡B‡B¢B§B°B»BÃBÎBöBáBÕBCC!C6C#CcCNCBCoC‰CwC¤C©CÃC°CâCÏCîCDğC"DD.D.DIDXDQDlDlDlD˜D˜D¤D Ğ1˜�˜�¬�¬�Ò�Ò�ï�ó�ø�ø�ø�� �����#�#�9�@�O�]�f�v����������ˆ���–���¤�«�²�¹�¹�»�»�Á�Æ�Í‘
z
z

¡

£
Å
Ô
Ö
ø
ø
ø
 #  ; E Š`>~e~e›e£eªeÏeİeßeíeúef f"f1f<f@fKfWfbfnf…fœf¯fÆfĞfŞfğfòfgggg,g2gBgBgZgZggg„g„g�g™g¦g²gÇgŞgígøg
hh-hEhfhfhohthththth„h�h•hšh¨h¶hÆhËhËhÙhÙhŞhŞhèhóhi ii'i2i<i@iIibieiui|iši£i£i²iÂiÒiÙißiëióişij jj"j/j:j@jPj`j`j�j«j·j¿jÊjÑjÜjìjüjüj kkkk&k8k>kLkYkfkpktk}k–k™k©k°kµkµkÉkÉkÎkÒkâkëkıklllll"l3l<lHlXlXlXl]lulul„l‡l›l¹lÄlílÿl
mm m%m,m>mNmimpmtmzm‚m�m§n‹8ëõ~"~"˜"Ÿ"¶"×"Ä"ï"###Œ`j~�� �'�/�:�D�O�W�f�p�s�˜�š�ª�ª�¸��_VØVØxØØ†Ø‹Ø¢Ø´Ø¾ØÄØÖØÛØçØïØòØôØşØÙÙ ÙÙÙ$Ù.Ù7Ù?ÙBÙKÙfÙwÙ~Ù�نٕٛ٣٣٪٭ٲÙÁÙÇÙÏÙÏÙİÙàÙåÙôÙÿÙÚÚÚ&Ú-Ú4ÚKÚ�83=vÕvÕÕÕ�Õ‘ÕŸÕ¢Õ§Õ�8>H®Õ®Õ·Õ·ÕÅÕÉÕĞÕÓÕØÕ�D*Ş.Ş.ø. ///(/@/I/M/_/e/„/‘Ä{¨ŞúŞúû ûûûû û$û*û*û<ûCûYûlû{û�ûƒûŠû�ûšûšû®û°û·û½ûÇûÇûÇûŞûğû÷ûüüü1ü1üCü’0+3†/†/�/µ/Æ/Ì/Ì/Ô/“„\yVğVğhğ}ğ‡ğ�ğ’ğ™ğ©ğ´ğ¶ğÀğÀğÉğÚğİğİğñ ññ'ñ.ñ2ñAñTñ§ñ” 
&.&./.M.R.•hö ÖbÖbìb÷bccc$c5c>cOcUcacxcxcŠc›c¨c±cÂcÈcd–„a~nFnF�F¤F­F¹FÁFÈFÌFÕFÕFÚFáFùF#G(GLGTGVGnG†GªGÉGÛG—lò öşöşÿ ÿ'ÿ.ÿPÿRÿtÿ‰ÿvÿ«ÿ˜ÿºÿºÿÌÿÓÿõÿõÿıÿ˜ y}x‰x‰�‰�‰’‰™(A.æ.æPæXæ^æfæhæhæyæyæyæ�æ‰æ›æªæ›æ¿æÁæÁæÛæİæİæèæíæç ç ç ç!ç#ç0ç2ç?çAçNçVç^çeçtç�çƒç”ç¡ç¡ç¡çªç¼çÏçÕçİçßçìçìçèèè èè.è3è3è3èAèGèLèTè_èqè|è�è�èˆèŒèšè�è§è®èÌèÙèàèéèé
é
é
é
ééé+é+éKéKéKéRé`éoé‚é•é—é—é—éªéªé±é¸é½éÃéÕéßéûé%ê+ê+ê?êDêhêoê{ê™ê¬ê·ê¾êÂêÂêÂêÂêÍê×êåêëë/ë9ë9ëGëeë•ë¨ë¹ëĞëãëèëèëèëğëûë␍ììììì/ìYì_ì_ì_ìjìtì€ì‹ì�ì�ì�ì’ì�ì�ìèìšH%////'/5/@/H/H/`/j/p/v/›0 VJVJ}JjJŒJ¨J�JÀJÈJœLÛê�!�!¨!¯!Æ!ç!Ô!ÿ!" "@"-"X"p"p"z"�ğ·ŞGŞGHH(H0H;HZHZHdHfH�HiH�H�H�H¨H¯HÏHÑHëHòHòHII5I:IYIrI�I’IšI¡IÁIÃIİIäIäIJJJJDJVJ�TVg��¤²¸¾Ïİëı"Ÿ0
Rşÿşÿ-"N:q]€Œ‘�­´ÁÌØãëğü +0;T]in‚‰��’«°ÉŞğõ
#8CMXZemm}r•µ àZ�ˆcˆc¢c°cµcÂcĞcÙcôcd'd0d@d[dfdvdxdzd„d�d”d¡d­d¿dÇdßdãdãdãdãdède e e'e*e2e>eGe�e¡d/%%,%D%U%\%x%m%�%°%œ%¿%Ğ%æ%Ò%ş% & &#&#&-&¢ü!\F F ^ p { ¨ � ‚ · Ø í Ú "  ü 1 N N N ` } } ² É ½ û ␍␍␍;␍)␍J␍k␍ƒ␍p␍�␍’␍Æ␍´␍Õ␍ò␍ò␍ò␍!!BIkks£(>ã>ãLãoãuãzãzã€ã¤(!'ÕÕ'Õ5Õ;Õ=ÕBÕ¥D]j„8„8�8¥8®8º8Ï8×8İ8ã8å8å8ô8¦„¼Ù`¨`¨“¨Ÿ¨£¨«¨³¨·¨Â¨Æ¨Ê¨Î¨Ö¨Û¨ß¨ğ¨©©©©)©8©K©S©^©^©^©p©§€hšhš�šˆš�š–šœš¬š·šÁšÌšãšæšèš›␍›››)›;›C›C›Y›Y›k›¨ Ê †R†R¬RÉRÑRÜRìRõRùRS*SCSISQSTSiSnS€S¢S¨S°SµS»S¾SÔSİSßST TT#T2TTTZT_T_T_TlT}TˆT•T¡T´TÁTÎTåTùTUUU0U5U@UGUjUjUjU|U©°)¸ ¸ Û è í ñ ú  ¡¡ ¡+¡3¡>¡F¡I¡U¡]¡w¡�¡—¡­¡¶¡ë¡×¡û¡û¡¢¢:¢A¢e¢�¢�¢�¢�¢ÿ¢ª˜†(~¶~¶›¶¢¶ª¶µ¶Ì¶Ö¶Ö¶í¶÷¶·(·6·:·Z·n·‚·‰·�·¦·°·Á·Î·Î·Õ·Ü·á·æ·ë·ò·ù·¸¸*¸.¸.¸8¸N¸R¸R¸c¸v¸‰¸‰¸�¸š¸¡¸©¸´¸»¸Ã¸Î¸Õ¸Õ¸à¸ş¸¹¹ ¹5¹5¹;¹B¹Q¹[¹i¹p¹t¹v¹ˆ¹ˆ¹ˆ¹š¹¢¹È¹Ö¹Ö¹Ú¹ï¹÷¹ºº'º,º:ºIºSºaºlºpºuº}º�º�º’º¡º£º²º´ºÃºÊºÎºâºìºúº»»» »%»C»M»[»b»f»p»~»…»‰»“»§»¯»º»¾»¾»¾»É»Ô»ä»ğ»¼¼¼(¼0¼;¼@¼H¼S¼_¼c¼n¼s¼‡¼�¼š¼š¼š¼š¼·¼Ô¼à¼è¼ø¼½&½*½Y½N½?½i½i½s½z½‰½˜½¢½°½·½»½½½Ì½Ö½ä½ë½ï½ï½ñ½¾¾¾¾¾'¾9¾A¾Y¾…¾“¾—¾µ¾¼¾Ã¾Î¾ä¾é¾ğ¾¿␍¿¿"¿&¿(¿;¿E¿S¿Z¿^¿^¿^¿^¿l¿w¿†¿�¿�¿©¿­¿­¿²¿º¿¾¿Í¿Ï¿Ş¿à¿ï¿ñ¿ÀÀ À À)À7À>ÀBÀRÀ]ÀbÀ€ÀŠÀ˜ÀŸÀ£À­À»ÀÂÀÆÀĞÀäÀìÀ÷ÀûÀûÀûÀÁ␍ÁÁ5ÁEÁPÁeÁjÁuÁ…Á‘Á§Á¯ÁºÁÉÁÑÁÜÁáÁéÁôÁÂÂÂÂ(Â0Â;Â;Â;Â;ÂOÂ_ÂtÂ�…™ª¿ÂÌÂĞÂŞÂóÂÃÃ3ÃLÃNÃYÃaÃaÃjÇØïÃÈÃÖÃáÃíÃõÃ÷ÃÄ
Ä
Ä
Ä'Ä5ÄCÄZÄqÄ€Ä�Ä­Ä´Ä´ÄÄÄØÄòÄòÄöÄ ÅÅ6ÅAÅXÅ`Å`ŅŅŘųżÅÓÅíÅüÅ Æ)Æ7ÆMÆiÆyƑƑƩƩƵÆĞÆèÆñÆñÆñÆıÆÇ&Ç/Ç/Ç6Ç?ÇEÇQǰǫ0ùAğ�ğ��!�,�6�<�F�L�V�d�n�€�Š���š� �ª�±�½�Ã�Ì�÷�� � ��'�1�C�M�b�b�e�o�„�‰�™�¤�©�½�Ğ�Ú�ï�ı����-�=�N�[�[�h�h�p�~�Å�¬l£:DD/DGDWDwD‰D¡D¼D¼DæDîDòDõDùDşDE EEE E%E)E.E8EIEPEWEYE]EfEpEsE~EŠE�E�E©E¯E¶E¿EØEéEòEûEFFF%F6FGFSFaFcFjFqFvFzF‡F�F±F¿FÉFÓFÜFõFGGG G)G/G3G8G<GIGPG^GhG}G‡G�G©GºGÃGÌGÔGİGãGçGìGòGüGH%H3H9H>HFHNHVHcHkHŠH}HŸH¨HÃH×HêHñHúHI
III%I>I.INIRI¬I­  p†p†~† †¦†®¸�·§'§'°'Ñ'·'ø'ú'/(Z(Z(j(o(o(ƒ(ˆ(ˆ(¤(©(©(É(Î(Î(â(ç(ç()))6)\)|)�) )²)Â)Â)Â)Â)Â)—*¯$bg÷%÷%û%&%&?&°”¢¦¿¦¿À¿Ï¿Ï¿Ò¿Û¿ç¿ç¿ı¿À%À,À0À@À`ÀrÀxÀ‡À�À”ÀšÀ£À¹À½ÀÚÀøÀ
ÁÁ Á1Á=Á?ÁKÁSÁWÁ]ÁfÁfÁfÁxÁƒÁ‰ÁŸÁ¦Á®ÁÄÁËÁËÁËÁĞÁÕÁßÁâÁçÁñÁôÁ ÂÂÂ&Â)Â.Â>ÂAÂEÂNÂVÂhÂpÂy„Š §¯¶ÂËÂÜÂÜÂãÂãÂãÂèÂíÂ÷ÂúÂÿ à Ã$Ã)Ã.Ã>ÃAÃFÃVÃYÃ]ÃfÃnÀÈÑÑÜãñõÃÁÃÙÃáÃçÃöÃÿÃÄ ÄÄÄ"Ä*Ä0ÄMÄVÄ^ÄdÄjÄjÄjÄqÄxćÄ�ĕěěÄ�įıx>×>×L×a×h×s׉׳×Ï×Ö×î×ôר ØØØØ$Ø*Ø9ØAØGØIØOز¤ÔyÎ^Î^ñ^ù^ __5_L_P_X_`_f_o_{_ƒ_ƒ_‹_»_ú_Õ_`"`*`:`<`j`p`y`€`ˆ`�`œ`¤`¬`¿`Ç`Ì`Ö`ö`ı`ÿ` aa8a?aAaaahahahaqaxa‘a—aŸaŸa¤a¨a´a½aÆaÒaõab1b4bPb]bqb‹b�b®b¼bÈböbübşb,c/c/cKcXclc†c�c’c�c¥cµc·cåcècğcdd0d6d6d@d@dKd|d„d„d„d„d�d™d¯dÈdÛdâdîdõdõde e e eee+e2e>eEeEe_eaefeye€eŒe“e“e eªeªe¯eÒeÒeäe³à˜Ì==#=A=.=v=\=P=…=”=œ=§=©=´=¿=¿=Ä=ù=ş=3>K>8>m>Z>�>|>�>¬>´>¿>Á>Ì>×>×>Ü>ı>ÿ> ? ?'?,?N?P?r?r?r?z?´\âõæaæaüabb b-b9bPbPbbbhbsbƒb�bœb©bÕbµÙÚÖÖô ")044<U__s~Œ�¡¦º¾ÇËĞÖóó6GKKKP[elƒˆœ¤­±³ºÌÜóõ!%%%9=FJOUrr€—œµÆÊÜÜÜáğ6AG]ns~’–Ÿ£¥«ÄÄÒéë 37INbjsw|ƒ™©ÀÅŞñõ .=alrˆ™™™ ³ÌÌÌÛÛî  ! & , 6 8 D D K V k m x � ™ › ¦ ²  É Ğ Ú â æ ê ì ñ ù ı     " $ $ - : P p Š ˜ ¤ « « ¾    É Î è ö ! ! !#!%!*!D!R!^!e!e!r!|!|!�!˜ »�8H8HUHdHdHdH�H�H�H�H–H˜H˜H�H H H¦H¨H¨H¯H³H¸H¸H¸H¸H¸H¸HÀHØHØHíHøHII'I)IHIJIiInI�I’I˜I˜I±I´IÛIèIJ J J)J.JLJ:JRJaJfJmJvJ‰J‘J™J�J�J�J§JÀJÆJÆJßJíJ
K#K%K-K3K;K@K@KFKFKOK`KbKwKyK�K‡K�K”K”K”K”K¢K¹K»KÏKÏK×KİKåKêKóKûKL
LLLLLLL(L?LCLELQLSLnLtL|L�LŠL•L˜L�L¤L­L°L°L¾LÏLÑL÷LMM"M'M0M5M5M:M<MDMDM_MqMvM‚MˆM‹M¢M¤M§M·M»MÂMËMÚMèMîMöMûMNNNNN5N:NDNlNwN‚N�N˜N£N®N¹NÄNÄNÄNÌNÌNåNóNO)O)O+O+O4O:O<O<OBOHOHOPOYO_OkOkOrOuO”OŸO§O¯O´O´O»O¿OÄOÖOÛOåOïOïOüO#P#P,P:PKPWP^PlP{P‘P—PœPœP¡P·PÃPËPÛPåPîPüPQQQQQ&Q2QIQ_QvQ|Q~Q•QšQšQºQºQÌQÒQÛQáQêQøQıQıQRRR'R9RORORcRsR…RŠR–RœRŸR¶R¸R»RËRÕRØRØRçRşRSS!S'S*SASCSFSVSZSbSpSuSzSzS€SˆS�S�S“S“S¡S§S­S·SÁSÏSäSçSéSóSóSõSıSTT T TTT T T$T/T4T9TDTIToTqTvT{T€T…TŠT�T”T”T™T�TºTÄTØTìTòTúTúTUUUU(U6UKUNUPUZUiUnUnUnUvU{U„U„U‰U‰U�U—UœUœU¡U¬U±U¶U»UÊUÊUÛUáUáUïUõUûUVVV2V5V7VAVPVUVUVUV]VbVkVpVpVvV~VƒVƒVˆV“V˜V�V¢V±V±VÂVÈVÈVÖVÜVâVìVöVWWWW(W7W<W<W<WDWIWRWWWWW]WeWjWjWwW}W}W‹W‘W—W¡W«W¹WÎWÑWÓWİWìWñWñWñWùWşWX X XXX X X,X2X2X@XFXLXVX`XnXƒX†XˆX’X¡X¦X¦X¦X®X³X¼XÁXÁXËXÓXØXØXØXŞXèXîXYYY␍YYY"Y"Y+Y9YBYPYUYUY^YlYxY‰Y–Y�Y¥Y¯Y½Y½YÂYÂYÍYÍYÍYÑYÖYÖYÜYàYåYíYóYõYşY␍ZZZ Z Z(Z1Z?ZJZOZUZ]ZbZbZbZbZbZbZbZbZbZbZ{Z�ZŠZ�Z˜Z�Z¢Z«Z¶Z¿ZÇZÌZÌZÌZÒZÚZßZßZãZèZèZñZÿZ [[[['[;[;[A[J[^[^[g[i[o[x[Œ[Œ[•[•[•[š[Ÿ[Ÿ[§[¬[¬[É[×[ã[ì[ò[ü[\ \ \ \\&\,\>\H\H\P\P\X\Z\Z\s\}\†\ˆ\ˆ\ˆ\�\’\”\”\”\”\™\Ÿ\¥\©\"`·Ìz©æeæeff)fEfRfif|f‡f�f‰f¬f´f´fÃfÃfËf×fífggg/g5g5g5g:g?gNgYgsgugzg‰g”g¡g«g«g¹g¸”*K£££ £&£)£2£5£8£<£A£c£P£s£{£ƒ£†£ˆ£˜£¡£ª£°£³£Ä£Û£ì£÷£)¤¹à.¢&@&@D@O@`@c@g@p@w@…@”@ª@»@Ì@Ş@ğ@ÿ@A A.A.A<A@ADAIAMAZAaAoAƒAŒA’A A¹A»A¿AÉAÉAÎAÎAÎAÓAÓAâAëAóA B B BBB&B2B=BBBBBEBJBJBiBuB‚B„B„BˆBŠBŠB©BµBÁBÃBÃBÆBÈBÈBÕB×B×BÚBÚBãBéBîB
C
C
C
C
C
C
C
C
C
C
C
C CC/C>CMCMCQCQCYCrCvC{CDº,nÔnÔ|ÔƒÔ‹Ô�Ô–Ô»l3J¦L¦L¼LÖLÂLåL
MöLMM%M%M+M.M2M:MRM]MsMhM‹M•M¼PQa%%%+%2%B%S%X%u%{%‚%‰%—%£%µ%ñ%½D$†ã†ãšã¨ã®ãÑã×ãİãääääää¾ô#œf4f4n4}4�4�4›4¯4¾4Û4è4ú45<5J5f5x5�5§5²5Ó5ñ566&6A6Z6Z6u6�6¸6Ó6å6ô6777!727E7U7b7n7}7š7š7¢7¢7¢7³7À7Ç7æ7ï788 88/8G8P8`8h8m8‘8¡8±8¼8Ğ8Õ8İ8999C9]9]9u9„9Œ9›9¤9¬9¾9à9è9ğ9û9ı9 :%:=:U:m::–:Ÿ:¨:º:È:Ì:Ğ:¿ ¨†¨†±†Ğ†Õ†À\ƒVËË0Ë7ËDËOËTËZËlËrËŠË�Ë®ËÄËÏËÕË÷Ë÷ËÌÌÌ!Ì-Ì5Ì=ÌEÌSÌYÌbÌnÌnÌp̂̈Ì�Ì�̤̤ÌÂÌÂÌÕÌâÌçÌçÌşÌÍÍ,Í7ÍEÍPÍ`ÍmÍÍ…Í�͛ͨͪͪͲͷͷͿÍÄÍÄÍÌÍÑÍÑÍÙÍŞÍŞÍäÍéÍéÍğÍõÍõÍüÍÎÎ ÎÎÎÎ!Î!Î,Î1Î1Î<Î<ÎWÎ^ÎdÎgÎrÎuΉΖΥάίÎÁÎÃÎÉÎİÎêÎùÎùÎùÎùÎÏÏ2ÏDÏUÏ^ÏoÏuÏzυϗϨϷϽÏÎÏÙÏãÏóÏĞĞĞĞ.Ğ4ĞEĞPĞVĞfĞfĞvЉЕĞ�ЭдкĞËĞÖĞÛĞøĞ ÑÑ+Ñ7ÑIÑTÑcÑeÑwÑфыÑ�Ñ�ѧѭѷѽÑÈÑÎÑĞÑİÑêÑôÑ ÒÒÒ!Ò(ÒlÔÁ0#« ª ª¿ªéªñªñªÿª«,«/«K«K«K«S«U«U«]«_«_«g«i«i«q«q«z«€«…«…«�«�«¡«¦«¬«±«±«¹«Â«È«Í«Í«Ò«ß«ø«¬¬0¬O¬O¬O¬W¬Y¬Y¬Y¬a¬c¬c¬c¬k¬m¬m¬m¬u¬w¬w¬‚¬‚¬ˆ¬�¬�¬�¬�¬”¬Ÿ¬±¬¿¬Í¬×¬×¬×¬ç¬ç¬î¬ò¬ø¬­­1­>­g­j­q­…­�­–­¡­¡­¬­²­·­·­·­¾­Ä­Ù­á­ç­ ®®® ® ®'®2®2®7®I®O®O®O®O®¨®Âd*,B,BNBXB[B[BeBxBzB‡B‰B”B¨B°BÀBÅBËBÓBÖBèBÃLWfŸ0Ÿ0³0·0¼0Ç0Ç0Ñ0×0×0Û0ã0Ä\CV7070M0M0Q0V0i0l0q0q0{0�0�0�0‘0›0Å8(2FÕFÕOÕOÕ]ÕaÕhÕkÕpÕÆ¨YÆXÆXŞXæXñXYøX6YšY€YuY[YDY YµY¥YÕYÚY÷YüYZşY Z&Z&Z-ZWZ‚ZeZ™Z·Z·Z·ZÃZÇlD[N'N'h'‘'s' 'À'Ü'Ò'ô' (ù'(4(T(f(((†(¨(¨(²(È4�—ÎêÎêâêçêíêñêõêëëÉxĞêV}V}�}n}�}š}¡}·}¼}Á}Å}Ç}Í}Ó}é}Ö}ø}~~+~N~D~]~i~Ê4;D¦ß¦ß¯ß»ßÚßßßáßáßæßË”"p©p©~©�©”©œ©¤©¯©º©Â©Í©Ø©İ©ó©ú©ª ªªª$ª/ª1ª=ªHªSª\ªdªdªhªŸªÌ€Úö§4§4Å4É4Í4Õ4ã4æ4é4ÿ45555!5)515=5R5c5j5q5q5~5“5ÍŞ`6@6@f@q@–@x@°@æ@ë@ë@î@ø@A A!A)AKAlA~A‹A¦AºA¿AÙAãAåAêAB(B:BGBbB‚BxBœB¢B¢B«BËB×BÚBÜB÷BáBCCCC&C0C[CQCuCuCzC}C“CŸC´CØCâCèCøC DD/D1DCDWDkDaD€D†D•D½D¬DÌDÎDàDêDşDEE(E2E4EHEREREqEwEwEwE€E EÈE·E×EÜEîEöE!FF6F6F6F\F\FnFÎ`8Ì.,.,e,l,t,},ˆ,�,§,¬,¯,²,»,É,Ó,Ø,--->-C-P-p-u-„-°-¸-½-Ò-ş-. . ..1.E.I.k.|.�.�.­.­.­.­.­.Á.Ù.Ş.á.ä.ä.// /,/4/O/f/t//›/›/›/¨/¿/Á/Á/Á/Î/å/ç/ç/ô/ 0 00 0G0^0p0Œ0Œ0Œ0™0°0²0²0²0¿0Ö0Ø0Ø0å0ü0ü0 11191P1b1~1~1~1‹1¢1¤1¤1±1È1È1Ü1Ş1ì12,212?2M2W2Y2Y2Y2v2~2€2€2¨2î2Ϥ)N6ç6çPç|ç|ç›ç«ç°ç°ç¿çÑçëçóçúçÿçè"è"è"è$è$è$è$è@è@è@è@èWèYèYèYèYètèè´èĞĞën~n~„~�~•~•~¡~¦~«~¶~»~»~»~Line truncated
v vvvv v(v(v(v8v8v8vOvUv[vfvkvsvŒv’v�v¡v§v²vËvÖvávçvôvùvşvşvww#wDwOwZwfw`wowxw}w‚w—w�w§w³w¹wÅwÉwÎwÓwŞwéwôwöwüw xxx,x7xBxBxHxUxWx\xex~x‰x”xšx§x§x«x°x°xÁxÃxÃxÖxØxØxëxíxíxyyyyyy)y)y/y4y4yKy_yTylyty{y�y‰yœy§y�y·y·y¹yÑyÔyÖyåy÷yzz*zDzIz]zmz€z…z…z�z¢z´z¿zÇzÏzÓzázçzìzìzòz{{{{!{'{,{,{,{2{A{T{a{e{j{j{n{s{s{x{ƒ{�{©{¿{Ë{Ë{Ñ{Ş{à{í{ù{|||(|4|4|4|4|8|=|N|`|k|s|{|}|�|”|¢|±|·|Ä|Ä|Û|ë|ë|ÿ| }␍}}"}9}9}?}L}N}`}`}k}k}k}k}k}çß „ÈVSVStS‚S•SšS¸S¾SÃSÉS×SŞSíSòSşSTT.T9TLTSTmTŠT–T±TÉTåTîTıTUUU U1U?U_UdUlU…U—U§U­U¸UÁUÇU␍V÷UèUVXVBV3VhVkV‹V Wà<+6ìBìB␍CCC.CGCOCeCqCá„ |>>`krz}}�˜˜›¢©¯µ»ÂÈÙÙÛäğö  " 2 : ? ? F O ` f o z ‹ ‹ ” ™ £ ª ± ¹ ¿ Á Ï æ é ø       * 3 D e v � • Ÿ § ® ® · ¾ Ê Ú å å å ù ␍!! !Û!â„9g6g6ƒ6’6™6³6Ù6ï67 77)7B7B7T7j7r7u7�7ãX{ÍISfqƒ‘—¨¯·ÍÕèı␍)9BHMTZ`fq|† ¨Â×äçïó '>W[dk}…Œ�™›­ÄÒØÜŞëëëí

ä 
H†H†Q†e†j†å¤£Èn{n{Š{�{¢{§{­{°{´{´{×{Ü{ |õ{|1||@|V|B|e|m|r|x|{||�|š|†|©|©|©|Ä|ó|ÿ|æ˜Íï /*>9HWWffuu„„““¢±ÀÀÏŞíVçxÇá¶`¶`Ô`æ`ì`ø`aa!a'a2aBaNaWa]acana|a‰a•a£a²a²aâaèd˜­ëë"ë5ë5ëOëVëbëbëyëyë�ë�ë§ë§ë¾ë¾ëÕë×ë×ëÛëéÌÂñFıFıhıoızı�ı�ı¢ı­ıÁıÅıÊıÎıĞıÖıèıôı ş ş$ş3ş7ş7ş7şJş_ş_şkşqş{ş†ş”ş›şªş¬şÅşßşßşñşêP7GtCtCŠC–C�C¢C³CÁCÇCÓCÛCæCìCïCùCë ®-�;�;¨;³;·;À;Ç;Î;ä;õ;<<*<9<H<Y<h<h<o<s<|<‰<�<™< <¤<Ä<Ä<Ä<Ä<Ä<Ğ<Ô<×<ß<í<õ<=
==#=.=3=3=@=F=U=l=n=y=†=•=˜=�=š=²=É=Ë=Ù=Û=æ=ì=ì=ô=ô=>␍>#>#>#>(>(>@>N>Y>^>^>a>f>f>…>“> >¢>¢>¦>¨>¨>Ç>Õ>á>ã>ã>æ>è>è>õ>÷>÷>ú>ú>ú>ú>ú>? ?␍??9?F?T?[?#@ì(rxH‰H‰V‰]‰m‰p‰v‰í(nt‡&‡&�&š&«&¶&¶&Ô&îTzK®ñ®ñÌñÒñÕñŞñèñòòò ò"ò&ò(ò@òPò]òcògòmòoòròvòvò™ò�ò£ò£òªòÌòáòôòó␍óó ó)ó-ó0ó7ó=óAóGóXó^ócóhóuówó‰ó‹ó’óŸó¡ó³ó³ó³ó³ó³ó×óâóîóôôô&ôCôgô�ô†ô�ô¢ô°ôÇôÌôÒôãôøôşôõõ3õ:õFõ^õjõjõjõpõsõvõ�õ•õ©õ¯õ´õ¿õ¿õÄõÑõŞõŞõäõòõ ööööö%ö,ö,ö1ö>öKöKöQö_övö|öö‚ö‰ö‰öšö¡ö®ö»ö»öÂöÌöÓöÙöàöëöÿöÿö÷÷%÷-÷4÷D÷H÷Q÷i÷n÷u÷—÷¢÷¨÷°÷É÷İ÷İ÷ø÷ø÷ø ø'ø.øPøcø‡ø‰ø“øµøµøµøÎøÚøëøùùİùïÀ€¬ÆZÆZŞZâZçZöZ[␍[.[[=[B[B[g[˜[{[n[»[À[é[î[ú[\ü[*\/\H\O\r\ˆ\ˆ\®\®\º\ğ ö-ö-..$.ñ4�˜6M6MOMrMM…M‹M�M¯Mò8 g.g.u.|.‡.�.–.œ.¢.¢.¨.ó ®.®.¸.À.Å.ôÒTîqîq rr'r=rZrir�r»rÁrÇrÏrÑrÙrîrñrürss;sJsnsœs¢s¨s°sµs½sÒsÕsàsìsñs÷sıst␍tt%t=tKtytt„tŒtœtÂtğtötûtût uu"u?uWucukuyuyu~u‘u¨uªuÇußuëuóuvvvv&v0vGv^vwv‰v–v¸vÏvævôvöv␍w$w$w-w9wOwhw{w†w™w�w�w�w¤w©w¼wÇwáwãwèwûwxxxx/xõ˜k␍ô8ô8
999,97999X9X9X9_9i9m9q9t9t9}9�9—9—9Í9Ù9ä9ô9: : ::::&:-:::A:I:N:N:c:o:w:|:|:‘:�:¦:«:«:À:Ì:Õ:İ:å:ñ:;;5;9;G;O;T;T;i;ƒ;�;™;¡;¦;¦;Å;Ñ;Ü;á;ö;<<<%<2<7<7<7<7<:<?<?<?<^<j<u<w<z<<<<‰<‘<˜< <©<´<º<È<Ö<Ö<à<é<ñ<&=,=3=B=X=]=]=p=x=x=z=z=z===†=Œ=�=—=›=›=›=›=ª=ª=Ï=Ø=Ø=Ü=÷Aö(üAüA
BB!B'B÷�ªÊ¾g¾gÜgägğghh)h4hChIhIhIhNhShahlh…h‡hŒhšh¥h²h¹hÇhø\0C.&.&H&m&O&|&˜&�&°&Å&²&Ô&í&ÿ&'' 'A'A'K'ù8hr¦K¦K¿KÎKâKñK÷KıKL!Lú0�—@Š@ŠTŠ`ŠnŠqŠ‰ŠŒŠ”Šû0S[ÖÖ"Ö*Ö7ÖAÖTÖüP>NÀ‡À‡Ì‡à‡ã‡÷‡ÿ‡ˆ␍ˆˆ ˆ"ˆ(ˆıT™ª¶M¶MĞMãMæMğMıMNN&N0NDNDNJNMN¡Nş<˜£˜Š˜Š¬Š³Š¿ŠËŠÛŠàŠãŠçŠïŠÿ +/ää,ä8äH!/nVnV‚V�V¤V�V³VµV¼VÇVÓVÛV DƒfQfQŠQ‘Q–Q�Q¸QÁQÃQĞQĞQÒQìQòQôQöQRRRRRR R'R0R8R?RERGRcRgRyRŒR’R¦R«R¸R¸RÌRÓRÚRãRñRúRS#S'S,S1S4S>SASQSD ®n®n¼nÆnĞnànånînúnünooo@oläû6â6âJâgâxâ†âŠâ‘â•â�â°â²â²âÉâËâ×âİâİâİâİâåâ´KtDD.D?DDDKDUDUD]DpDtDyD�D�D“D—D�D²D¶D¾DÊDÑDÕDİDßDçDõDıDÿDEE E'E5E9EGE !EFoFoVobono~o–oœoªo»oÃoÊoàop p-p:pJpPpRpcp…pŒp’p p¨p¾pÉpÏpÕpøpôB»hhhh$h/h>h@hKhZhZhghuhxhzhzhh„h�h˜h�h§hºh¿hÔhßhéhéhÿhÿh,i@iWi]ibiiioivi{i{i�i‡iŒiŒiŸi­iÅiËiĞiäiîiõiõij-j3j8j8jcjhjhj“jºj¿j¿j¿jÂjÉjÏjÖjÛjÛjájçjìjìjkkk@kFkVkbkhkvk}kk“k™k k k¢k¢k¢k§k­k²k¶k¸k»kÆkÕkØkÚkŞkŞkãkãkñkl˜}ŸŞ!Ş!ú!ÿ!"""!"1"9"A"F"Q"["a"l"|"„"”"›"£"«"³"»"À"Ë"Ù"Ù"ï" B†®8®8Æ8Í8à899 9.9"9W9W9c9k9z9´9¶9ã9ë9ë9 :8:%:Y:G:h:n:}:’:”:Ÿ:§:§:È:Í:Ö:â:ê:;õ:=;#;;L;i;T;‰;¡;�;Ã;°;ä;Ò;ó;<û;<<<E<E<Q< Ğ1È�È�Ü�Ü�‘‘"‘&‘+‘+‘+‘7‘<‘L‘Q‘Q‘Q‘V‘V‘o‘v‘…‘“‘œ‘¬‘µ‘·‘·‘·‘·‘¾‘ő̑ӑڑá‘è‘ï‘ï‘ñ‘ñ‘÷‘ü‘“
+1 -1
View File
@@ -17,7 +17,7 @@ public extern I64 PassTrace(I64 i=0b1001111101);
extern U0 StreamDir();
public extern I64 StreamExePrint(U8 *fmt,...);
public extern U0 StreamPrint(U8 *fmt,...);
public extern Bool Trace(Bool val);
public extern Bool Trace(Bool val=ON);
#help_index "Compiler/Lex"
#help_file "::/Doc/Lex"
+4 -3
View File
@@ -200,6 +200,7 @@ lgc_start2:
goto lgc_done;
}
break;
case DOCT_MARKER:
case DOCT_CURSOR:
doc_e=doc_e->next;
goto lgc_start2;
@@ -529,7 +530,7 @@ lex_ident:
} else {
cc->cur_i64=i;
cc->flags|=CCF_USE_LAST_U16;
cc->token=TK_INTEGER;
cc->token=TK_INT;
goto lex_end;
}
}
@@ -543,7 +544,7 @@ lex_ident:
else {
cc->cur_i64=i;
cc->flags|=CCF_USE_LAST_U16;
cc->token=TK_INTEGER;
cc->token=TK_INT;
goto lex_end;
}
}
@@ -556,7 +557,7 @@ lex_ident:
lex_is_int:
cc->cur_i64=i;
cc->flags|=CCF_USE_LAST_U16;
cc->token=TK_INTEGER;
cc->token=TK_INT;
goto lex_end;
}
ch=LexGetChar(cc);
+209 -359
View File
@@ -19,6 +19,8 @@ forms. Get an Intel datasheet and learn
which forms are valid.
{Lock|Rep}{Seg|2E=NotBr|3E=Br}{OP}{ADD}{REX}
':' is start of alias list. Marked with OCF_ALIAS.
*/
R8 AL 0;
@@ -222,7 +224,7 @@ OPCODE PUSH
0x68, 32 !ID IMM32
0x50,+R 16 % R16
0x50,+R 32 R32
0x50,+R 32 ` R64
0x50,+R 32 `R64
0xFF,/6 16 % RM16
0xFF,/6 32 RM32
0xFF,/6 32 RM64;
@@ -238,7 +240,7 @@ OPCODE POP
0x0F 0xA9, GS
0x58,+R 16 R16
0x58,+R 32 R32
0x58,+R 32 ` R64
0x58,+R 32 `R64
0x8F,/0 16 RM16
0x8F,/0 32 RM32
0x8F,/0 32 RM64;
@@ -269,7 +271,7 @@ OPCODE MOV
0xB8,+R 16 R16 IMM16
0xB8,+R 32 &R32 UIMM32
0xB8,+R 32 R32 IMM32
0xB8,+R 32 ` R64 UIMM32
0xB8,+R 32 `R64 UIMM32
0xB8,+R 32 &R64 UIMM64
0xB8,+R 32 R64 IMM64
0xC6, &RM8 UIMM8
@@ -278,7 +280,7 @@ OPCODE MOV
0xC7, 16 RM16 IMM16
0xC7, 32 &RM32 UIMM32
0xC7, 32 RM32 IMM32
0xC7, 32 ` RM64 UIMM32
0xC7, 32 `RM64 UIMM32
0xC7, 32 RM64 IMM32;
OPCODE ADC
@@ -498,133 +500,77 @@ OPCODE XOR
0x31,/R 32 RM32 R32
0x31,/R 32 ^ RM64 R64;
OPCODE CMOVA
0x0F 0x47,/R 16 R16 RM16
0x0F 0x47,/R 32 R32 RM32
0x0F 0x47,/R 32 R64 RM64;
OPCODE CMOVAE
0x0F 0x43,/R 16 R16 RM16
0x0F 0x43,/R 32 R32 RM32
0x0F 0x43,/R 32 R64 RM64;
OPCODE CMOVB
0x0F 0x42,/R 16 R16 RM16
0x0F 0x42,/R 32 R32 RM32
0x0F 0x42,/R 32 R64 RM64;
OPCODE CMOVBE
0x0F 0x46,/R 16 R16 RM16
0x0F 0x46,/R 32 R32 RM32
0x0F 0x46,/R 32 R64 RM64;
OPCODE CMOVC
0x0F 0x42,/R 16 R16 RM16
0x0F 0x42,/R 32 R32 RM32
0x0F 0x42,/R 32 R64 RM64;
OPCODE CMOVE
0x0F 0x44,/R 16 R16 RM16
0x0F 0x44,/R 32 R32 RM32
0x0F 0x44,/R 32 R64 RM64;
OPCODE CMOVG
0x0F 0x4F,/R 16 R16 RM16
0x0F 0x4F,/R 32 R32 RM32
0x0F 0x4F,/R 32 R64 RM64;
OPCODE CMOVGE
0x0F 0x4D,/R 16 R16 RM16
0x0F 0x4D,/R 32 R32 RM32
0x0F 0x4D,/R 32 R64 RM64;
OPCODE CMOVL
0x0F 0x4C,/R 16 R16 RM16
0x0F 0x4C,/R 32 R32 RM32
0x0F 0x4C,/R 32 R64 RM64;
OPCODE CMOVLE
0x0F 0x4E,/R 16 R16 RM16
0x0F 0x4E,/R 32 R32 RM32
0x0F 0x4E,/R 32 R64 RM64;
OPCODE CMOVNA
0x0F 0x46,/R 16 R16 RM16
0x0F 0x46,/R 32 R32 RM32
0x0F 0x46,/R 32 R64 RM64;
OPCODE CMOVNAE
0x0F 0x42,/R 16 R16 RM16
0x0F 0x42,/R 32 R32 RM32
0x0F 0x42,/R 32 R64 RM64;
OPCODE CMOVNB
0x0F 0x43,/R 16 R16 RM16
0x0F 0x43,/R 32 R32 RM32
0x0F 0x43,/R 32 R64 RM64;
OPCODE CMOVNBE
0x0F 0x47,/R 16 R16 RM16
0x0F 0x47,/R 32 R32 RM32
0x0F 0x47,/R 32 R64 RM64;
OPCODE CMOVNC
0x0F 0x43,/R 16 R16 RM16
0x0F 0x43,/R 32 R32 RM32
0x0F 0x43,/R 32 R64 RM64;
OPCODE CMOVNE
0x0F 0x45,/R 16 R16 RM16
0x0F 0x45,/R 32 R32 RM32
0x0F 0x45,/R 32 R64 RM64;
OPCODE CMOVNG
0x0F 0x4E,/R 16 R16 RM16
0x0F 0x4E,/R 32 R32 RM32
0x0F 0x4E,/R 32 R64 RM64;
OPCODE CMOVNGE
0x0F 0x4C,/R 16 R16 RM16
0x0F 0x4C,/R 32 R32 RM32
0x0F 0x4C,/R 32 R64 RM64;
OPCODE CMOVNL
0x0F 0x4D,/R 16 R16 RM16
0x0F 0x4D,/R 32 R32 RM32
0x0F 0x4D,/R 32 R64 RM64;
OPCODE CMOVNLE
0x0F 0x4F,/R 16 R16 RM16
0x0F 0x4F,/R 32 R32 RM32
0x0F 0x4F,/R 32 R64 RM64;
OPCODE CMOVNO
0x0F 0x41,/R 16 R16 RM16
0x0F 0x41,/R 32 R32 RM32
0x0F 0x41,/R 32 R64 RM64;
OPCODE CMOVNP
0x0F 0x4B,/R 16 R16 RM16
0x0F 0x4B,/R 32 R32 RM32
0x0F 0x4B,/R 32 R64 RM64;
OPCODE CMOVNS
0x0F 0x49,/R 16 R16 RM16
0x0F 0x49,/R 32 R32 RM32
0x0F 0x49,/R 32 R64 RM64;
OPCODE CMOVNZ
0x0F 0x45,/R 16 R16 RM16
0x0F 0x45,/R 32 R32 RM32
0x0F 0x45,/R 32 R64 RM64;
OPCODE CMOVO
0x0F 0x40,/R 16 R16 RM16
0x0F 0x40,/R 32 R32 RM32
0x0F 0x40,/R 32 R64 RM64;
OPCODE CMOVP
0x0F 0x4A,/R 16 R16 RM16
0x0F 0x4A,/R 32 R32 RM32
0x0F 0x4A,/R 32 R64 RM64;
OPCODE CMOVPE
0x0F 0x4A,/R 16 R16 RM16
0x0F 0x4A,/R 32 R32 RM32
0x0F 0x4A,/R 32 R64 RM64;
OPCODE CMOVPO
0x0F 0x4B,/R 16 R16 RM16
0x0F 0x4B,/R 32 R32 RM32
0x0F 0x4B,/R 32 R64 RM64;
OPCODE CMOVNO
0x0F 0x41,/R 16 R16 RM16
0x0F 0x41,/R 32 R32 RM32
0x0F 0x41,/R 32 R64 RM64;
OPCODE CMOVB
0x0F 0x42,/R 16 R16 RM16
0x0F 0x42,/R 32 R32 RM32
0x0F 0x42,/R 32 R64 RM64 :CMOVC CMOVNAE;
OPCODE CMOVAE
0x0F 0x43,/R 16 R16 RM16
0x0F 0x43,/R 32 R32 RM32
0x0F 0x43,/R 32 R64 RM64 :CMOVNB CMOVNC;
OPCODE CMOVE
0x0F 0x44,/R 16 R16 RM16
0x0F 0x44,/R 32 R32 RM32
0x0F 0x44,/R 32 R64 RM64 :CMOVZ;
OPCODE CMOVNE
0x0F 0x45,/R 16 R16 RM16
0x0F 0x45,/R 32 R32 RM32
0x0F 0x45,/R 32 R64 RM64 :CMOVNZ;
OPCODE CMOVBE
0x0F 0x46,/R 16 R16 RM16
0x0F 0x46,/R 32 R32 RM32
0x0F 0x46,/R 32 R64 RM64 :CMOVNA;
OPCODE CMOVA
0x0F 0x47,/R 16 R16 RM16
0x0F 0x47,/R 32 R32 RM32
0x0F 0x47,/R 32 R64 RM64 :CMOVNBE;
OPCODE CMOVS
0x0F 0x48,/R 16 R16 RM16
0x0F 0x48,/R 32 R32 RM32
0x0F 0x48,/R 32 R64 RM64;
OPCODE CMOVZ
0x0F 0x44,/R 16 R16 RM16
0x0F 0x44,/R 32 R32 RM32
0x0F 0x44,/R 32 R64 RM64;
OPCODE CMOVNS
0x0F 0x49,/R 16 R16 RM16
0x0F 0x49,/R 32 R32 RM32
0x0F 0x49,/R 32 R64 RM64;
OPCODE CMOVP
0x0F 0x4A,/R 16 R16 RM16
0x0F 0x4A,/R 32 R32 RM32
0x0F 0x4A,/R 32 R64 RM64 :CMOVPE;
OPCODE CMOVNP
0x0F 0x4B,/R 16 R16 RM16
0x0F 0x4B,/R 32 R32 RM32
0x0F 0x4B,/R 32 R64 RM64 :CMOVPO;
OPCODE CMOVL
0x0F 0x4C,/R 16 R16 RM16
0x0F 0x4C,/R 32 R32 RM32
0x0F 0x4C,/R 32 R64 RM64 :CMOVNGE;
OPCODE CMOVGE
0x0F 0x4D,/R 16 R16 RM16
0x0F 0x4D,/R 32 R32 RM32
0x0F 0x4D,/R 32 R64 RM64 :CMOVNL;
OPCODE CMOVLE
0x0F 0x4E,/R 16 R16 RM16
0x0F 0x4E,/R 32 R32 RM32
0x0F 0x4E,/R 32 R64 RM64 :CMOVNG;
OPCODE CMOVG
0x0F 0x4F,/R 16 R16 RM16
0x0F 0x4F,/R 32 R32 RM32
0x0F 0x4F,/R 32 R64 RM64 :CMOVNLE;
OPCODE CALL
0xE8, 16 !&CW REL16
0xFF,/2 16 ! RM16
0xE8, 32 !&CD REL32
0xFF,/2 32 ! RM32
0xFF,/2 32 !` RM64
0xFF,/2 32 !`RM64
// 0x9A, CD PTR1616
// 0xFF,/3 16 M1616
// 0x9A, 16 CP PTR1632
@@ -639,132 +585,74 @@ OPCODE JMP
0xFF,/4 16 ! RM16
0xFF,/4 32 ! RM32
0xFF,/4 32 ! RM64;
OPCODE JA
0x77, &CB REL8
0x0F 0x87, 16 !CW REL16
0x0F 0x87, 32 !CD REL32;
OPCODE JAE
0x73, &CB REL8
0x0F 0x83, 16 !CW REL16
0x0F 0x83, 32 !CD REL32;
OPCODE JB
0x72, &CB REL8
0x0F 0x82, 16 !CW REL16
0x0F 0x82, 32 !CD REL32;
OPCODE JBE
0x76, &CB REL8
0x0F 0x86, 16 !CW REL16
0x0F 0x86, 32 !CD REL32;
OPCODE JC
0x72, &CB REL8
0x0F 0x82, 16 !CW REL16
0x0F 0x82, 32 !CD REL32;
OPCODE JCXZ
0xE3, CB REL8;
OPCODE JECXZ
0xE3, CB REL8;
OPCODE JRCXZ
0xE3, CB REL8;
OPCODE JE
0x74, &CB REL8
0x0F 0x84, 16 !CW REL16
0x0F 0x84, 32 !CD REL32;
OPCODE JG
0x7F, &CB REL8
0x0F 0x8F, 16 !CW REL16
0x0F 0x8F, 32 !CD REL32;
OPCODE JGE
0x7D, &CB REL8
0x0F 0x8D, 16 !CW REL16
0x0F 0x8D, 32 !CD REL32;
OPCODE JL
0x7C, &CB REL8
0x0F 0x8C, 16 !CW REL16
0x0F 0x8C, 32 !CD REL32;
OPCODE JLE
0x7E, &CB REL8
0x0F 0x8E, 16 !CW REL16
0x0F 0x8E, 32 !CD REL32;
OPCODE JNA
0x76, &CB REL8
0x0F 0x86, 16 !CW REL16
0x0F 0x86, 32 !CD REL32;
OPCODE JNAE
0x72, &CB REL8
0x0F 0x82, 16 !CW REL16
0x0F 0x82, 32 !CD REL32;
OPCODE JNB
0x73, &CB REL8
0x0F 0x83, 16 !CW REL16
0x0F 0x83, 32 !CD REL32;
OPCODE JNBE
0x77, &CB REL8
0x0F 0x87, 16 !CW REL16
0x0F 0x87, 32 !CD REL32;
OPCODE JNC
0x73, &CB REL8
0x0F 0x83, 16 !CW REL16
0x0F 0x83, 32 !CD REL32;
OPCODE JNE
0x75, &CB REL8
0x0F 0x85, 16 !CW REL16
0x0F 0x85, 32 !CD REL32;
OPCODE JNG
0x7E, &CB REL8
0x0F 0x8E, 16 !CW REL16
0x0F 0x8E, 32 !CD REL32;
OPCODE JNGE
0x7C, &CB REL8
0x0F 0x8C, 16 !CW REL16
0x0F 0x8C, 32 !CD REL32;
OPCODE JNL
0x7D, &CB REL8
0x0F 0x8D, 16 !CW REL16
0x0F 0x8D, 32 !CD REL32;
OPCODE JNLE
0x7F, &CB REL8
0x0F 0x8F, 16 !CW REL16
0x0F 0x8F, 32 !CD REL32;
OPCODE JNO
0x71, &CB REL8
0x0F 0x81, 16 !CW REL16
0x0F 0x81, 32 !CD REL32;
OPCODE JNP
0x7B, &CB REL8
0x0F 0x8B, 16 !CW REL16
0x0F 0x8B, 32 !CD REL32;
OPCODE JNS
0x79, &CB REL8
0x0F 0x89, 16 !CW REL16
0x0F 0x89, 32 !CD REL32;
OPCODE JNZ
0x75, &CB REL8
0x0F 0x85, 16 !CW REL16
0x0F 0x85, 32 !CD REL32;
OPCODE JO
0x70, &CB REL8
0x0F 0x80, 16 !CW REL16
0x0F 0x80, 32 !CD REL32;
OPCODE JP
0x7A, &CB REL8
0x0F 0x8A, 16 !CW REL16
0x0F 0x8A, 32 !CD REL32;
OPCODE JPE
0x7A, &CB REL8
0x0F 0x8A, 16 !CW REL16
0x0F 0x8A, 32 !CD REL32;
OPCODE JPO
0x7B, &CB REL8
0x0F 0x8B, 16 !CW REL16
0x0F 0x8B, 32 !CD REL32;
OPCODE JNO
0x71, &CB REL8
0x0F 0x81, 16 !CW REL16
0x0F 0x81, 32 !CD REL32;
OPCODE JB
0x72, &CB REL8
0x0F 0x82, 16 !CW REL16
0x0F 0x82, 32 !CD REL32 :JC JNAE;
OPCODE JAE
0x73, &CB REL8
0x0F 0x83, 16 !CW REL16
0x0F 0x83, 32 !CD REL32 :JNB JNC;
OPCODE JE
0x74, &CB REL8
0x0F 0x84, 16 !CW REL16
0x0F 0x84, 32 !CD REL32 :JZ;
OPCODE JNE
0x75, &CB REL8
0x0F 0x85, 16 !CW REL16
0x0F 0x85, 32 !CD REL32 :JNZ;
OPCODE JBE
0x76, &CB REL8
0x0F 0x86, 16 !CW REL16
0x0F 0x86, 32 !CD REL32 :JNA;
OPCODE JA
0x77, &CB REL8
0x0F 0x87, 16 !CW REL16
0x0F 0x87, 32 !CD REL32 :JNBE;
OPCODE JS
0x78, &CB REL8
0x0F 0x88, 16 !CW REL16
0x0F 0x88, 32 !CD REL32;
OPCODE JZ
0x74, &CB REL8
0x0F 0x84, 16 !CW REL16
0x0F 0x84, 32 !CD REL32;
OPCODE JNS
0x79, &CB REL8
0x0F 0x89, 16 !CW REL16
0x0F 0x89, 32 !CD REL32;
OPCODE JP
0x7A, &CB REL8
0x0F 0x8A, 16 !CW REL16
0x0F 0x8A, 32 !CD REL32 :JPE;
OPCODE JNP
0x7B, &CB REL8
0x0F 0x8B, 16 !CW REL16
0x0F 0x8B, 32 !CD REL32 :JPO;
OPCODE JL
0x7C, &CB REL8
0x0F 0x8C, 16 !CW REL16
0x0F 0x8C, 32 !CD REL32 :JNGE;
OPCODE JGE
0x7D, &CB REL8
0x0F 0x8D, 16 !CW REL16
0x0F 0x8D, 32 !CD REL32 :JNL;
OPCODE JLE
0x7E, &CB REL8
0x0F 0x8E, 16 !CW REL16
0x0F 0x8E, 32 !CD REL32 :JNG;
OPCODE JG
0x7F, &CB REL8
0x0F 0x8F, 16 !CW REL16
0x0F 0x8F, 32 !CD REL32 :JNLE;
OPCODE JCXZ
0xE3, CB REL8 :JECXZ JRCXZ;
OPCODE INC
0x40,+R 16 % R16
@@ -979,10 +867,8 @@ OPCODE LODSW 0xAD, 16;
OPCODE LODSD 0xAD, 32;
OPCODE LODSQ 0xAD, 32=;
OPCODE LOOP 0xE2, CB REL8;
OPCODE LOOPE 0xE1, CB REL8;
OPCODE LOOPZ 0xE1, CB REL8;
OPCODE LOOPNE 0xE0, CB REL8;
OPCODE LOOPNZ 0xE0, CB REL8;
OPCODE LOOPE 0xE1, CB REL8 :LOOPZ;
OPCODE LOOPNE 0xE0, CB REL8 :LOOPNZ;
OPCODE LSL
0x0F 0x03,/R 16 R16 RM16
0x0F 0x03,/R 32 R32 RM32
@@ -1072,36 +958,22 @@ OPCODE SEGDS 0x3E;
OPCODE SEGES 0x26;
OPCODE SEGFS 0x64;
OPCODE SEGGS 0x65;
OPCODE SETA 0x0F 0x97, RM8;
OPCODE SETAE 0x0F 0x93, RM8;
OPCODE SETB 0x0F 0x92, RM8;
OPCODE SETBE 0x0F 0x96, RM8;
OPCODE SETC 0x0F 0x92, RM8;
OPCODE SETE 0x0F 0x94, RM8;
OPCODE SETG 0x0F 0x9F, RM8;
OPCODE SETGE 0x0F 0x9D, RM8;
OPCODE SETL 0x0F 0x9C, RM8;
OPCODE SETLE 0x0F 0x9E, RM8;
OPCODE SETNA 0x0F 0x96, RM8;
OPCODE SETNAE 0x0F 0x92, RM8;
OPCODE SETNB 0x0F 0x93, RM8;
OPCODE SETNBE 0x0F 0x97, RM8;
OPCODE SETNC 0x0F 0x93, RM8;
OPCODE SETNE 0x0F 0x95, RM8;
OPCODE SETNG 0x0F 0x9E, RM8;
OPCODE SETNGE 0x0F 0x9C, RM8;
OPCODE SETNL 0x0F 0x9D, RM8;
OPCODE SETNLE 0x0F 0x9F, RM8;
OPCODE SETO 0x0F 0x90, RM8;
OPCODE SETNO 0x0F 0x91, RM8;
OPCODE SETNP 0x0F 0x9B, RM8;
OPCODE SETB 0x0F 0x92, RM8 :SETC SETNAE;
OPCODE SETAE 0x0F 0x93, RM8 :SETNC SETNB;
OPCODE SETE 0x0F 0x94, RM8 :SETZ;
OPCODE SETNE 0x0F 0x95, RM8 :SETNZ;
OPCODE SETBE 0x0F 0x96, RM8 :SETNA;
OPCODE SETA 0x0F 0x97, RM8 :SETNBE;
OPCODE SETS 0x0F 0x98, RM8;
OPCODE SETNS 0x0F 0x99, RM8;
OPCODE SETNZ 0x0F 0x95, RM8;
OPCODE SETO 0x0F 0x90, RM8;
OPCODE SETP 0x0F 0x9A, RM8;
OPCODE SETPE 0x0F 0x9A, RM8;
OPCODE SETPO 0x0F 0x9B, RM8;
OPCODE SETS 0x0F 0x98, RM8;
OPCODE SETZ 0x0F 0x94, RM8;
OPCODE SETP 0x0F 0x9A, RM8 :SETPE;
OPCODE SETNP 0x0F 0x9B, RM8 :SETPO;
OPCODE SETL 0x0F 0x9C, RM8 :SETNGE;
OPCODE SETGE 0x0F 0x9D, RM8 :SETNL;
OPCODE SETLE 0x0F 0x9E, RM8 :SETNG;
OPCODE SETG 0x0F 0x9F, RM8 :SETNLE;
OPCODE SHLD
0x0F 0xA5,/R 16 RM16 R16
0x0F 0xA5,/R 32 RM32 R32
@@ -1138,42 +1010,6 @@ OPCODE XADD
0x0F 0xC1,/R 32 RM64 R64;
OPCODE XLATB 0xD7;
OPCODE RCL
0xD2,/2 RM8 CL
0xD3,/2 16 RM16 CL
0xD3,/2 32 RM32 CL
0xD3,/2 32 RM64 CL
0xC0,/2 IB &RM8 UIMM8
0xC0,/2 IB RM8 IMM8
0xC1,/2 16 IB &RM16 UIMM8
0xC1,/2 16 IB RM16 IMM8
0xC1,/2 32 IB &RM32 UIMM8
0xC1,/2 32 IB RM32 IMM8
0xC1,/2 32 IB &RM64 UIMM8
0xC1,/2 32 IB RM64 IMM8;
OPCODE RCL1
0xD0,/2 RM8
0xD1,/2 16 RM16
0xD1,/2 32 RM32
0xD1,/2 32 RM64;
OPCODE RCR
0xD2,/3 RM8 CL
0xD3,/3 16 RM16 CL
0xD3,/3 32 RM32 CL
0xD3,/3 32 RM64 CL
0xC0,/3 IB &RM8 UIMM8
0xC0,/3 IB RM8 IMM8
0xC1,/3 16 IB &RM16 UIMM8
0xC1,/3 16 IB RM16 IMM8
0xC1,/3 32 IB &RM32 UIMM8
0xC1,/3 32 IB RM32 IMM8
0xC1,/3 32 IB &RM64 UIMM8
0xC1,/3 32 IB RM64 IMM8;
OPCODE RCR1
0xD0,/3 RM8
0xD1,/3 16 RM16
0xD1,/3 32 RM32
0xD1,/3 32 RM64;
OPCODE ROL
0xD2,/0 RM8 CL
0xD3,/0 16 RM16 CL
@@ -1210,8 +1046,43 @@ OPCODE ROR1
0xD1,/1 16 RM16
0xD1,/1 32 RM32
0xD1,/1 32 RM64;
OPCODE SAL
OPCODE RCL
0xD2,/2 RM8 CL
0xD3,/2 16 RM16 CL
0xD3,/2 32 RM32 CL
0xD3,/2 32 RM64 CL
0xC0,/2 IB &RM8 UIMM8
0xC0,/2 IB RM8 IMM8
0xC1,/2 16 IB &RM16 UIMM8
0xC1,/2 16 IB RM16 IMM8
0xC1,/2 32 IB &RM32 UIMM8
0xC1,/2 32 IB RM32 IMM8
0xC1,/2 32 IB &RM64 UIMM8
0xC1,/2 32 IB RM64 IMM8;
OPCODE RCL1
0xD0,/2 RM8
0xD1,/2 16 RM16
0xD1,/2 32 RM32
0xD1,/2 32 RM64;
OPCODE RCR
0xD2,/3 RM8 CL
0xD3,/3 16 RM16 CL
0xD3,/3 32 RM32 CL
0xD3,/3 32 RM64 CL
0xC0,/3 IB &RM8 UIMM8
0xC0,/3 IB RM8 IMM8
0xC1,/3 16 IB &RM16 UIMM8
0xC1,/3 16 IB RM16 IMM8
0xC1,/3 32 IB &RM32 UIMM8
0xC1,/3 32 IB RM32 IMM8
0xC1,/3 32 IB &RM64 UIMM8
0xC1,/3 32 IB RM64 IMM8;
OPCODE RCR1
0xD0,/3 RM8
0xD1,/3 16 RM16
0xD1,/3 32 RM32
0xD1,/3 32 RM64;
OPCODE SHL
0xD2,/4 RM8 CL
0xD3,/4 16 RM16 CL
0xD3,/4 32 RM32 CL
@@ -1223,13 +1094,30 @@ OPCODE SAL
0xC1,/4 32 IB &RM32 UIMM8
0xC1,/4 32 IB RM32 IMM8
0xC1,/4 32 IB &RM64 UIMM8
0xC1,/4 32 IB RM64 IMM8;
OPCODE SAL1
0xC1,/4 32 IB RM64 IMM8 :SAL;
OPCODE SHL1
0xD0,/4 RM8
0xD1,/4 16 RM16
0xD1,/4 32 RM32
0xD1,/4 32 RM64;
0xD1,/4 32 RM64 :SAL1;
OPCODE SHR
0xD2,/5 RM8 CL
0xD3,/5 16 RM16 CL
0xD3,/5 32 RM32 CL
0xD3,/5 32 RM64 CL
0xC0,/5 IB &RM8 UIMM8
0xC0,/5 IB RM8 IMM8
0xC1,/5 16 IB &RM16 UIMM8
0xC1,/5 16 IB RM16 IMM8
0xC1,/5 32 IB &RM32 UIMM8
0xC1,/5 32 IB RM32 IMM8
0xC1,/5 32 IB &RM64 UIMM8
0xC1,/5 32 IB RM64 IMM8;
OPCODE SHR1
0xD0,/5 RM8
0xD1,/5 16 RM16
0xD1,/5 32 RM32
0xD1,/5 32 RM64;
OPCODE SAR
0xD2,/7 RM8 CL
0xD3,/7 16 RM16 CL
@@ -1249,63 +1137,25 @@ OPCODE SAR1
0xD1,/7 32 RM32
0xD1,/7 32 RM64;
OPCODE SHL
0xD2,/4 RM8 CL
0xD3,/4 16 RM16 CL
0xD3,/4 32 RM32 CL
0xD3,/4 32 RM64 CL
0xC0,/4 IB &RM8 UIMM8
0xC0,/4 IB RM8 IMM8
0xC1,/4 16 IB &RM16 UIMM8
0xC1,/4 16 IB RM16 IMM8
0xC1,/4 32 IB &RM32 UIMM8
0xC1,/4 32 IB RM32 IMM8
0xC1,/4 32 IB &RM64 UIMM8
0xC1,/4 32 IB RM64 IMM8;
OPCODE SHL1
0xD0,/4 RM8
0xD1,/4 16 RM16
0xD1,/4 32 RM32
0xD1,/4 32 RM64;
OPCODE SHR
0xD2,/5 RM8 CL
0xD3,/5 16 RM16 CL
0xD3,/5 32 RM32 CL
0xD3,/5 32 RM64 CL
0xC0,/5 IB &RM8 UIMM8
0xC0,/5 IB RM8 IMM8
0xC1,/5 16 IB &RM16 UIMM8
0xC1,/5 16 IB RM16 IMM8
0xC1,/5 32 IB &RM32 UIMM8
0xC1,/5 32 IB RM32 IMM8
0xC1,/5 32 IB &RM64 UIMM8
0xC1,/5 32 IB RM64 IMM8;
OPCODE SHR1
0xD0,/5 RM8
0xD1,/5 16 RM16
0xD1,/5 32 RM32
0xD1,/5 32 RM64;
OPCODE FILD
0xDF,/0 M16 //Load I16
0xDB,/0 M32 //Load I32
0xDF,/5 ` M64; //Load I64
0xDF,/5 `M64; //Load I64
OPCODE FISTP
0xDF,/7 ` M64; //Store I64
0xDF,/7 `M64; //Store I64
OPCODE FISTTP
0xDD,/1 ` M64; //Store I64
0xDD,/1 `M64; //Store I64
OPCODE FLD
0xD9,/0 M32 //Load F32
0xDD,/0 ` M64 //Load F64
0xDD,/0 `M64 //Load F64
0xD9 0xC0,+I* STI;
OPCODE FSTP
0xD9,/3 M32 //Store F32
0xDD,/3 ` M64 //Store F64
0xDD,/3 `M64 //Store F64
0xDD 0xD8,+I* STI;
OPCODE FST
0xD9,/2 M32 //Store F32
0xDD,/2 ` M64 //Store F64
0xDD,/2 `M64 //Store F64
0xDD 0xD0,+I* STI;
OPCODE FRSTOR
0xDD,/4 M32
@@ -1327,7 +1177,7 @@ OPCODE FSQRT 0xD9 0xFA,*;
OPCODE FMULP 0xDE 0xC8,+I* STI ST0;
OPCODE FMUL
0xD8,/1 ST0 M32
0xDC,/1 ` ST0 M64
0xDC,/1 `ST0 M64
0xD8 0xC8,+I* ST0 STI
0xDC 0xC8,+I* STI ST0;
OPCODE FIMUL
@@ -1336,32 +1186,32 @@ OPCODE FIMUL
OPCODE FDIVP 0xDE 0xF8,+I* STI ST0;
OPCODE FDIV
0xD8,/6 ST0 M32
0xDC,/6 ` ST0 M64
0xDC,/6 `ST0 M64
0xD8 0xF0,+I* ST0 STI
0xDC 0xF8,+I* STI ST0;
OPCODE FDIVRP 0xDE 0xF0,+I* STI ST0;
OPCODE FDIVR
0xD8,/7 ST0 M32
0xDC,/7 ` ST0 M64
0xDC,/7 `ST0 M64
0xD8 0xF8,+I* ST0 STI
0xDC 0xF0,+I* STI ST0;
OPCODE FPREM 0xD9 0xF8,*;
OPCODE FADDP 0xDE 0xC0,+I* STI ST0;
OPCODE FADD
0xD8,/0 ST0 M32
0xDC,/0 ` ST0 M64
0xDC,/0 `ST0 M64
0xD8 0xC0,+I* ST0 STI
0xDC 0xC0,+I* STI ST0;
OPCODE FSUBP 0xDE 0xE8,+I* STI ST0;
OPCODE FSUB
0xD8,/4 ST0 M32
0xDC,/4 ` ST0 M64
0xDC,/4 `ST0 M64
0xD8 0xE0,+I* ST0 STI
0xDC 0xE8,+I* STI ST0;
OPCODE FSUBRP 0xDE 0xE0,+I* STI ST0;
OPCODE FSUBR
0xD8,/5 ST0 M32
0xDC,/5 ` ST0 M64
0xDC,/5 `ST0 M64
0xD8 0xE8,+I* ST0 STI
0xDC 0xE0,+I* STI ST0;
OPCODE FCOMIP 0xDF 0xF0,+I* ST0 STI;
+9 -10
View File
@@ -18,16 +18,16 @@ U0 OptSetNOP1(CIntermediateCode *tempi)
{
tempi->ic_code=IC_NOP1;
tempi->ic_flags=0;
tempi->a1.type=TY_NULL+tempi->a1.type&RT_MASK;
tempi->r.type =TY_NULL+tempi->r.type &RT_MASK;
tempi->a1.type=MDF_NULL+tempi->a1.type.raw_type;
tempi->r.type =MDF_NULL+tempi->r.type.raw_type;
}
U0 OptSetNOP2(CIntermediateCode *tempi,I64 stk_delta=1)
{
tempi->ic_code=IC_NOP2;
tempi->ic_data=stk_delta;
tempi->a1.type=TY_NULL+tempi->a1.type&RT_MASK;
tempi->r.type =TY_NULL+tempi->r.type &RT_MASK;
tempi->a1.type=MDF_NULL+tempi->a1.type.raw_type;
tempi->r.type =MDF_NULL+tempi->r.type.raw_type;
}
CIntermediateCode *OptFree(CIntermediateCode *tempi)
@@ -168,7 +168,7 @@ fb_here2:
return FBO1_NOT_CONST;
}
}
*is_unsigned=tempc1->raw_type&1 || tempc2->raw_type&1;
*is_unsigned=tempc1->raw_type&RTF_UNSIGNED || tempc2->raw_type&RTF_UNSIGNED;
if (tempi1->ic_code==IC_IMM_I64 && tempi2->ic_code==IC_IMM_I64 &&
!(tempi->ic_flags&(ICF_PUSH_CMP|ICF_POP_CMP))) {
tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags;
@@ -193,8 +193,7 @@ Bool OptFixupBinaryOp2(CIntermediateCode **tempi1,CIntermediateCode **tempi2)
return FALSE;
}
Bool OptFixupUnaryOp(CIntermediateCode *tempi,
CIntermediateCode *tempi1,
Bool OptFixupUnaryOp(CIntermediateCode *tempi, CIntermediateCode *tempi1,
Bool *is_unsigned)
{
CHashClass *tempc,*tempc1;
@@ -217,7 +216,7 @@ Bool OptFixupUnaryOp(CIntermediateCode *tempi,
} else
return FBO1_NOT_CONST;
}
*is_unsigned=tempc1->raw_type&1;
*is_unsigned=tempc1->raw_type&RTF_UNSIGNED;
if (tempi1->ic_code==IC_IMM_I64) {
tempi->ic_flags|=tempi1->ic_flags;
OptSetNOP1(tempi1);
@@ -305,7 +304,7 @@ CIntermediateCode *OptBrZero(CCmpCtrl *cc,CIntermediateCode *tempi)
!(tempi->ic_flags&ICF_USE_F64)) {
tempi->ic_code+=IC_BR_EQU_EQU2-IC_BR_EQU_EQU;
tempi->ic_flags&=~ICF_PUSH_CMP;
tempii=tempi->next; //IC_PUSH_CMP instruction
tempii=tempi->next; //IC_PUSH_CMP inst
while (tempii->ic_code!=IC_PUSH_CMP)
tempii=tempii->next;
tempii->t.a1t=tempi;
@@ -432,7 +431,7 @@ CIntermediateCode *OptBrNotZero(CCmpCtrl *cc,CIntermediateCode *tempi)
!(tempi->ic_flags&ICF_USE_F64)) {
tempi->ic_code+=IC_BR_EQU_EQU2-IC_BR_EQU_EQU;
tempi->ic_flags&=~ICF_PUSH_CMP;
tempii=tempi->next; //IC_PUSH_CMP instruction
tempii=tempi->next; //IC_PUSH_CMP inst
while (tempii->ic_code!=IC_PUSH_CMP)
tempii=tempii->next;
tempii->t.a1t=tempi;
+7 -13
View File
@@ -186,7 +186,7 @@ args.
tempi->ic_code=IC_IMM_F64;
}
}
if (tempc1->type&HTT_INTERNAL_TYPE && tempc1->raw_type& 1)
if (tempc1->type&HTT_INTERNAL_TYPE && tempc1->raw_type&RTF_UNSIGNED)
tempi->ic_class=cmp.internal_types[tempc1->raw_type-1];
break;
case IC_SHL_CONST:
@@ -449,7 +449,7 @@ args.
} else if (cc->pass==2 && tempi2->ic_code==IC_IMM_I64 &&
(i=tempi2->ic_data) && Bsf(i)==Bsr(i) &&
tempi_push->ic_class->raw_type!=RT_F64 &&
tempi_push->ic_class->raw_type&1) {//do only unsigned
tempi_push->ic_class->raw_type&RTF_UNSIGNED) {//do only unsigned
tempi2->ic_data=i-1;
tempi->ic_code=IC_AND;
}
@@ -665,8 +665,7 @@ args.
OptSetNOP1(tempi2);
OptSetNOP1(tempi);
} else
if (tempi1->ic_code==IC_ADD ||
tempi1->ic_code==IC_SUB) {
if (tempi1->ic_code==IC_ADD || tempi1->ic_code==IC_SUB) {
if (tempi1->t.a1t->ic_code==IC_IMM_F64) {
tempi1->ic_flags|=tempi->ic_flags|tempi2->ic_flags;
tempi1->t.a1t->ic_data(F64)-=tempi2->ic_data(F64);
@@ -826,8 +825,7 @@ args.
LexWarn(cc,"Assign U0 ");
sub_switch_start:
case IC_MUL_EQU:
if (tempi2->ic_code==IC_IMM_I64 &&
tempc->raw_type!=RT_F64 &&
if (tempi2->ic_code==IC_IMM_I64 && tempc->raw_type!=RT_F64 &&
tempc2->raw_type!=RT_F64) {
if (i=tempi2->ic_data) {
if (Bsf(i)==Bsr(i)) {
@@ -838,8 +836,7 @@ args.
}
break;
case IC_DIV_EQU:
if (tempi2->ic_code==IC_IMM_I64 &&
tempc->raw_type!=RT_F64 &&
if (tempi2->ic_code==IC_IMM_I64 && tempc->raw_type!=RT_F64 &&
tempc2->raw_type!=RT_F64 &&
(i=tempi2->ic_data) && Bsf(i)==Bsr(i)) {
tempi2->ic_data=Bsf(i);
@@ -847,8 +844,7 @@ args.
}
break;
case IC_MOD_EQU:
if (tempi2->ic_code==IC_IMM_I64 &&
tempc->raw_type!=RT_F64 &&
if (tempi2->ic_code==IC_IMM_I64 && tempc->raw_type!=RT_F64 &&
tempc2->raw_type!=RT_F64 &&
(i=tempi2->ic_data) && Bsf(i)==Bsr(i)) {
tempi2->ic_data=i-1;
@@ -1286,9 +1282,7 @@ args.
"Pass:%d Stk:%08X\n",cc->pass,ps->ptr;
LexExcept(cc,"Compiler Optimization Error at ");
}
/*This is for determining type conversions
for passing args to funs.
*/
//This is for determining type conversions for passing args to funs.
return last_with_class;
}
+28 -34
View File
@@ -40,12 +40,10 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
mv[member_cnt].offset_start=tempm->offset;
mv[member_cnt].offset_end=tempm->offset+MaxI64(1,tempm->size);
mv[member_cnt++].m=tempm;
} else {
if (tempm->reg==REG_ALLOC)
PrintWarn("Can't reg var\n $$LK,\"FL:%s,%d\"$$ '%s' in '%s'\n",
cc->lex_include_stk->full_name,
cc->lex_include_stk->line_num,tempm->str,cc->htc.fun->str);
}
} else if (tempm->reg==REG_ALLOC)
PrintWarn("Can't reg var\n $$LK,\"FL:%s,%d\"$$ '%s' in '%s'\n",
cc->lex_include_stk->full_name,
cc->lex_include_stk->line_num,tempm->str,cc->htc.fun->str);
tempm=tempm->next;
}
} else
@@ -75,7 +73,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempc2=cmp.internal_types[RT_I64];
else
tempc2=tempi->t.a2c;
tempi->a2.type=TY_STK+CmpRawType(tempc2);
tempi->a2.type=MDF_STK+CmpRawType(tempc2);
tempi->a2.type_pointed_to=CmpRawTypePointed(tempc2);
tempi->ic_flags|=ICF_A2_WAS_STK;
case IS_1_ARG:
@@ -86,7 +84,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempc1=cmp.internal_types[RT_I64];
else
tempc1=tempi->t.a1c;
tempi->a1.type=TY_STK+CmpRawType(tempc1);
tempi->a1.type=MDF_STK+CmpRawType(tempc1);
tempi->a1.type_pointed_to=CmpRawTypePointed(tempc1);
tempi->ic_flags|=ICF_A1_WAS_STK;
break;
@@ -94,7 +92,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
break;
}
if (intermediate_code_table[code].result_cnt) {
tempi->r.type=TY_STK+CmpRawType(tempc);
tempi->r.type=MDF_STK+CmpRawType(tempc);
tempi->r.type_pointed_to=CmpRawTypePointed(tempc);
tempi->ic_flags|=ICF_R_WAS_STK;
PrsPush(ps,tempi);
@@ -121,12 +119,12 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempi->a1.reg=REG_RBP;
break;
case IC_DEREF:
tempi->a1.type_pointed_to=tempi->r.type&RT_MASK;
tempi->a1.type_pointed_to=tempi->r.type.raw_type;
if (tempi1->ic_code==IC_LEA) {
tempi->ic_flags|=tempi1->ic_flags;
tempi->a1.reg=tempi1->a1.reg;
tempi->a1.disp=tempi1->a1.disp;
tempi->a1.type=TY_DISP+tempi->r.type&RT_MASK;
tempi->a1.type=MDF_DISP+tempi->r.type.raw_type;
tempi->a1.type_pointed_to=tempi->r.type_pointed_to;
tempi->ic_code=IC_MOV;
OptFree(tempi1);
@@ -142,7 +140,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempi->ic_flags|=tempil2->ic_flags|tempil1->ic_flags;
tempi->a1.reg=tempil2->a1.reg;
tempi->a1.disp=tempi->ic_data;
tempi->a1.type=TY_DISP+tempi->r.type&RT_MASK;
tempi->a1.type=MDF_DISP+tempi->r.type.raw_type;
tempi->a1.type_pointed_to=tempi->r.type_pointed_to;
tempi->ic_code=IC_MOV;
OptFree(tempil2);
@@ -157,8 +155,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempi->r.type_pointed_to=CmpRawTypePointed(tempi->t.a1c);
case IC_DEREF_PP:
case IC_DEREF_MM:
if (tempi1->ic_code==IC_LEA &&
tempi1->a1.type&TY_MASK==TY_DISP &&
if (tempi1->ic_code==IC_LEA && tempi1->a1.type&MDF_DISP &&
tempi1->a1.reg==REG_RBP)
for (i=0;i<member_cnt;i++)
if (mv[i].offset_start==tempi1->a1.disp) {
@@ -166,7 +163,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
mv[i].score++;
break;
}
tempi->a1.type_pointed_to=tempi->r.type&RT_MASK;
tempi->a1.type_pointed_to=tempi->r.type.raw_type;
break;
case IC_MUL:
case IC_DIV:
@@ -186,15 +183,14 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempi->t.a1c=tempi->t.a2c;
tempi->ic_data=tempi1->ic_data;
tempi->ic_code=IC_ADD_CONST;
tempi->a1.type_pointed_to=tempi->r.type&RT_MASK;
tempi->a2.type=TY_NULL;
tempi->a1.type_pointed_to=tempi->r.type.raw_type;
tempi->a2.type=MDF_NULL;
OptFree(tempi1);
if (tempil2->ic_code==IC_REG &&
tempil2->a1.reg==REG_RBP) {
if (tempil2->ic_code==IC_REG && tempil2->a1.reg==REG_RBP) {
tempi->ic_flags|=tempil2->ic_flags;
tempi->ic_code=IC_LEA;
tempi->a1.reg=REG_RBP;
tempi->a1.type=TY_DISP+tempi->a1.type&RT_MASK;
tempi->a1.type=MDF_DISP+tempi->a1.type.raw_type;
tempi->a1.disp=tempi->ic_data;
for (i=0;i<member_cnt;i++)
if (mv[i].offset_start<=tempi->ic_data<mv[i].offset_end) {
@@ -215,7 +211,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempi->ic_flags|=tempi2->ic_flags;
tempi->ic_data=tempi2->ic_data;
tempi->ic_code=IC_SUB_CONST;
tempi->a2.type=TY_NULL;
tempi->a2.type=MDF_NULL;
OptFree(tempi2);
}
break;
@@ -241,8 +237,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
case IC_AND_EQU:
case IC_OR_EQU:
case IC_XOR_EQU:
if (tempi1->ic_code==IC_LEA &&
tempi1->a1.type&TY_MASK==TY_DISP &&
if (tempi1->ic_code==IC_LEA && tempi1->a1.type&MDF_DISP &&
tempi1->a1.reg==REG_RBP)
for (i=0;i<member_cnt;i++)
if (mv[i].offset_start==tempi1->a1.disp) {
@@ -250,7 +245,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
mv[i].score++;
break;
}
tempi->a1.type_pointed_to=tempi->r.type&RT_MASK;
tempi->a1.type_pointed_to=tempi->r.type.raw_type;
tempi->r.type_pointed_to=CmpRawTypePointed(tempi->t.a1c);
break;
case IC_RETURN_VAL:
@@ -295,7 +290,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempi1->ic_code==IC_IMM_F64) && !tempi1->ic_data) {
OptFree(tempi1);
MemCpy(&tempi->a1,&tempi->a2,sizeof(CICArg));
tempi->a2.type=TY_NULL;
tempi->a2.type=MDF_NULL;
if (code==IC_BR_EQU_EQU)
code=tempi->ic_code=IC_BR_ZERO;
else
@@ -305,7 +300,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
} else if ((tempi2->ic_code==IC_IMM_I64 ||
tempi2->ic_code==IC_IMM_F64) && !tempi2->ic_data) {
OptFree(tempi2);
tempi->a2.type=TY_NULL;
tempi->a2.type=MDF_NULL;
if (code==IC_BR_EQU_EQU)
code=tempi->ic_code=IC_BR_ZERO;
else
@@ -317,7 +312,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
if (tempi1->ic_code==IC_IMM_I64 || tempi1->ic_code==IC_IMM_F64) {
if (code==IC_BR_ZERO ^^ tempi1->ic_data) {
OptFree(tempi1);
tempi->a1.type=TY_NULL;
tempi->a1.type=MDF_NULL;
tempi->ic_code=IC_JMP;
} else {
OptFree(tempi1);
@@ -331,7 +326,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
i=Bsr(tempi1->ic_data);
if (0<=i==Bsf(tempi1->ic_data)) {
tempi1->ic_data=i;
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_flags|=ICF_BY_VAL;
tempi->ic_code=IC_BR_NOT_BT;
goto here1;
}
@@ -340,7 +335,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
i=Bsr(tempi2->ic_data);
if (0<=i==Bsf(tempi2->ic_data)) {
tempi2->ic_data=i;
tempi->ic_flags|=ICF_SWAP|ICF_NOT_ADDR;
tempi->ic_flags|=ICF_SWAP|ICF_BY_VAL;
tempi->ic_code=IC_BR_NOT_BT;
}
}
@@ -350,7 +345,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
i=Bsr(tempi1->ic_data);
if (0<=i==Bsf(tempi1->ic_data)) {
tempi1->ic_data=i;
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_flags|=ICF_BY_VAL;
tempi->ic_code=IC_BR_BT;
goto here1;
}
@@ -359,15 +354,14 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
i=Bsr(tempi2->ic_data);
if (0<=i==Bsf(tempi2->ic_data)) {
tempi2->ic_data=i;
tempi->ic_flags|=ICF_SWAP|ICF_NOT_ADDR;
tempi->ic_flags|=ICF_SWAP|ICF_BY_VAL;
tempi->ic_code=IC_BR_BT;
}
}
goto here1;
case IC_BR_MM_ZERO:
case IC_BR_MM_NOT_ZERO:
if (tempi1->ic_code==IC_LEA &&
tempi1->a1.type&TY_MASK==TY_DISP &&
if (tempi1->ic_code==IC_LEA && tempi1->a1.type&MDF_DISP &&
tempi1->a1.reg==REG_RBP)
for (i=0;i<member_cnt;i++)
if (mv[i].offset_start==tempi1->a1.disp) {
@@ -541,7 +535,7 @@ R12 and R13 as non-pointer register variables, such as index variables i,j,k.
*/
if (cc->htc.fun) {
cc->htc.fun->used_reg_mask=cc->htc.fun->used_reg_mask&
~(REGG_C_LOCAL_VARS|REGG_C_LOCAL_NON_PTR_VARS)|used_reg_mask;
~(REGG_LOCAL_VARS|REGG_LOCAL_NON_PTR_VARS)|used_reg_mask;
if (!Bt(&cc->opts,OPTf_NO_REG_VAR) &&
!(cc->flags & CCF_NO_REG_OPT)) {
QSort(mv,member_cnt,sizeof(COptMemberVar),&OptMVCompare);
+93 -108
View File
@@ -9,33 +9,28 @@ Bool OptIC4(CIntermediateCode *tempi)
if (!(tempil2=OptLag1(tempil1)))
return FALSE;
if (tempil2->r.type&TY_MASK==TY_STK &&
!(tempil2->ic_flags&ICF_PUSH_RESULT)) {
if (tempil1->ic_code==IC_ADD_CONST &&
tempil1->a1.type&TY_MASK==TY_STK) {
if ((tempil2->ic_code==IC_REG ||
tempil2->ic_code==IC_MOV) &&
tempil2->a1.type&TY_MASK==TY_REG) {
if (tempil2->r.type&MDF_STK && !(tempil2->ic_flags&ICF_PUSH_RESULT)) {
if (tempil1->ic_code==IC_ADD_CONST && tempil1->a1.type&MDF_STK) {
if ((tempil2->ic_code==IC_REG || tempil2->ic_code==IC_MOV) &&
tempil2->a1.type&MDF_REG) {
i=tempil1->ic_data;
if (MIN_I32<=i<=MAX_I32 &&
!Bt(&cmp.non_ptr_vars_mask,tempil2->a1.reg)) {
tempil1->ic_flags|=tempil2->ic_flags&ICG_NO_CVT_MASK;
tempil1->ic_code=IC_LEA;
tempil1->a1.type=TY_DISP+tempil1->a1.type&RT_MASK;
tempil1->a1.type=MDF_DISP+tempil1->a1.type.raw_type;
tempil1->a1.reg=tempil2->a1.reg;
tempil1->a1.disp=i;
OptFree(tempil2);
return TRUE;
}
} else if (tempil2->ic_code==IC_SHL_CONST &&
tempil2->a1.type&TY_MASK==TY_REG) {
} else if (tempil2->ic_code==IC_SHL_CONST && tempil2->a1.type&MDF_REG) {
i=tempil1->ic_data;
if (MIN_I32<=i<=MAX_I32 &&
tempil2->a1.reg!=REG_RSP &&
if (MIN_I32<=i<=MAX_I32 && tempil2->a1.reg!=REG_RSP &&
1<=tempil2->ic_data<=3) {
tempil1->ic_flags|=tempil2->ic_flags&ICG_NO_CVT_MASK;
tempil1->ic_code=IC_LEA;
tempil1->a1.type=TY_SIB+tempil1->a1.type&RT_MASK;
tempil1->a1.type=MDF_SIB+tempil1->a1.type.raw_type;
tempil1->a1.reg=tempil2->a1.reg<<8+REG_NONE;
if (tempil2->ic_data==1)
tempil1->a1.reg|=0x4000;
@@ -49,29 +44,28 @@ Bool OptIC4(CIntermediateCode *tempi)
}
}
}
if (tempil2->ic_code==IC_MOV ||
tempil2->ic_code==IC_REG) {
if (tempil1->a2.type&TY_MASK==TY_STK) {
if (tempil2->ic_code==IC_MOV || tempil2->ic_code==IC_REG) {
if (tempil1->a2.type&MDF_STK) {
if (tempil2->ic_flags & ICF_R_TO_INT) {
if (tempil2->a1.type&TY_MASK==TY_IMM)
if (tempil2->a1.type&MDF_IMM)
tempil2->a1.disp=tempil2->a1.disp(F64);
else
tempil1->ic_flags|=ICF_A2_TO_INT;
} else if (tempil2->ic_flags&ICF_R_TO_F64) {
if (tempil2->a1.type&TY_MASK==TY_IMM)
if (tempil2->a1.type&MDF_IMM)
tempil2->a1.disp(F64)=tempil2->a1.disp;
else
tempil1->ic_flags|=ICF_A2_TO_F64;
}
ty=tempil1->a2.type&RT_MASK;
ty1=tempil2->a1.type&RT_MASK;
ty=tempil1->a2.type.raw_type;
ty1=tempil2->a1.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
ty1=tempil2->r.type&RT_MASK;
ty1=tempil2->r.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
tempil1->a2.type=tempil2->a1.type&TY_MASK+ty;
tempil1->a2.type=tempil2->a1.type&MDG_MASK+ty;
pt=tempil1->a2.type_pointed_to;
pt1=tempil2->a1.type_pointed_to;
@@ -88,15 +82,15 @@ Bool OptIC4(CIntermediateCode *tempi)
OptSetNOP2(tempil2);
return TRUE;
}
if (tempil1->a1.type&TY_MASK==TY_STK) {
if (tempil1->a1.type&MDF_STK) {
if (tempil2->ic_flags & ICF_R_TO_INT) {
if (tempil2->a1.type&TY_MASK==TY_IMM)
if (tempil2->a1.type&MDF_IMM)
tempil2->a1.disp=tempil2->a1.disp(F64);
else
tempil1->ic_flags|=ICF_A1_TO_INT;
} else if (tempil2->ic_flags&ICF_R_TO_F64) {
if (tempil2->a1.type&TY_MASK==TY_IMM) {
if (tempil2->a1.type&1) //signed/unsigned
if (tempil2->a1.type&MDF_IMM) {
if (tempil2->a1.type&RTF_UNSIGNED)
tempil2->a1.disp(F64)=tempil2->a1.disp(U64);
else
tempil2->a1.disp(F64)=tempil2->a1.disp(I64);
@@ -104,14 +98,14 @@ Bool OptIC4(CIntermediateCode *tempi)
tempil1->ic_flags|=ICF_A1_TO_F64;
}
ty=tempil1->a1.type&RT_MASK;
ty1=tempil2->a1.type&RT_MASK;
ty=tempil1->a1.type.raw_type;
ty1=tempil2->a1.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
ty1=tempil2->r.type&RT_MASK;
ty1=tempil2->r.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
tempil1->a1.type=tempil2->a1.type&TY_MASK+ty;
tempil1->a1.type=tempil2->a1.type&MDG_MASK+ty;
pt=tempil1->a1.type_pointed_to;
pt1=tempil2->a1.type_pointed_to;
@@ -130,26 +124,24 @@ Bool OptIC4(CIntermediateCode *tempi)
}
}
if (tempil1->ic_code==IC_DEREF) {
if (tempil2->ic_code==IC_ADD_CONST &&
tempil2->a1.type&TY_MASK==TY_REG &&
tempil1->a1.type&TY_MASK==TY_STK) {
if (tempil2->ic_code==IC_ADD_CONST && tempil2->a1.type&MDF_REG &&
tempil1->a1.type&MDF_STK) {
i=tempil2->ic_data;
if (MIN_I32<=i<=MAX_I32 &&
!Bt(&cmp.non_ptr_vars_mask,tempil2->a1.reg)) {
tempil1->ic_flags|=tempil2->ic_flags;
tempil1->ic_code=IC_MOV;
tempil1->a1.type=TY_DISP+tempil1->a1.type_pointed_to;
tempil1->a1.type=MDF_DISP+tempil1->a1.type_pointed_to;
tempil1->a1.reg=tempil2->a1.reg;
tempil1->a1.disp=i;
OptSetNOP2(tempil2,-1);
return TRUE;
}
}
if (tempil2->ic_code==IC_LEA &&
tempil1->a1.type&TY_MASK==TY_STK) {
if (tempil2->ic_code==IC_LEA && tempil1->a1.type&MDF_STK) {
tempil1->ic_flags|=tempil2->ic_flags;
tempil1->ic_code=IC_MOV;
tempil1->a1.type=tempil2->a1.type&TY_MASK+tempil1->a1.type_pointed_to;
tempil1->a1.type=tempil2->a1.type&MDG_MASK+tempil1->a1.type_pointed_to;
tempil1->a1.reg=tempil2->a1.reg;
tempil1->a1.disp=tempil2->a1.disp;
OptFree(tempil2);
@@ -158,8 +150,8 @@ Bool OptIC4(CIntermediateCode *tempi)
}
}
if (tempil1->ic_code==IC_DEREF) {
if (tempil1->a1.type&TY_MASK==TY_REG) {
tempil1->a1.type=TY_DISP+tempil1->a1.type_pointed_to;
if (tempil1->a1.type&MDF_REG) {
tempil1->a1.type=MDF_DISP+tempil1->a1.type_pointed_to;
tempil1->a1.disp=0;
tempil1->ic_code=IC_MOV;
return TRUE;
@@ -221,22 +213,21 @@ U0 OptPass4(CCmpCtrl *cc,COptReg *reg_offsets,I64 *_type)
switch [code] {
case IC_IMM_I64:
case IC_TYPE:
tempi->a1.type=TY_IMM+RT_I64;
tempi->a1.type=MDF_IMM+RT_I64;
tempi->a1.disp=tempi->ic_data;
tempi->ic_code=IC_MOV;
break;
case IC_IMM_F64:
tempi->a1.type=TY_IMM+RT_I64;
tempi->a1.type=MDF_IMM+RT_I64;
tempi->a1.disp=tempi->ic_data;
tempi->a1.type_pointed_to=RT_F64;
tempi->ic_code=IC_MOV;
break;
case IC_MOV:
if (tempi->a1.type&TY_MASK==TY_DISP &&
tempi->a1.reg==REG_RBP) {
if (tempi->a1.type&MDF_DISP && tempi->a1.reg==REG_RBP) {
i=CmpOffset2Reg(tempi->a1.disp,reg_offsets);
if (i>=0) {
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
tempi->a1.type=MDF_REG+tempi->a1.type.raw_type;
tempi->a1.reg=i;
tempi->a1.disp=0;
}
@@ -244,30 +235,27 @@ U0 OptPass4(CCmpCtrl *cc,COptReg *reg_offsets,I64 *_type)
break;
case IC_DEREF:
if (tempi1->ic_code==IC_LEA) {
if (tempi1->a1.type&TY_MASK==TY_DISP &&
tempi1->a1.reg==REG_RBP) {
if (tempi1->a1.type&MDF_DISP && tempi1->a1.reg==REG_RBP) {
i=CmpOffset2Reg(tempi1->a1.disp,reg_offsets);
if (i>=0) {
tempi->ic_flags|=tempi1->ic_flags;
tempi->ic_code=IC_REG;
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
tempi->a1.type=MDF_REG+tempi->a1.type.raw_type;
tempi->a1.reg=i;
tempi->a1.disp=0;
OptFree(tempi1);
}
}
} else if ((tempi1->ic_code==IC_ABS_ADDR ||
tempi1->ic_code==IC_MOV &&
tempi1->a1.type==TY_IMM+RT_I64 &&
0<=tempi1->a1.disp<=MAX_I32) &&
!(tempi1->ic_flags&ICF_NO_RIP)) {
} else if ((tempi1->ic_code==IC_ABS_ADDR || tempi1->ic_code==IC_MOV &&
tempi1->a1.type==MDF_IMM+RT_I64 &&
0<=tempi1->a1.disp<=MAX_I32)&& !(tempi1->ic_flags&ICF_NO_RIP)) {
if (tempi1->ic_code==IC_ABS_ADDR)
tempi->a1.disp=tempi1->ic_data;
else
tempi->a1.disp=tempi1->a1.disp;
tempi->ic_flags|=tempi1->ic_flags;
tempi->ic_code=IC_MOV;
tempi->a1.type=TY_RIP_DISP32+tempi->a1.type_pointed_to;
tempi->a1.type=MDF_RIP_DISP32+tempi->a1.type_pointed_to;
tempi->a1.reg=REG_RIP;
OptFree(tempi1);
}
@@ -282,15 +270,14 @@ U0 OptPass4(CCmpCtrl *cc,COptReg *reg_offsets,I64 *_type)
case IC_PP_:
case IC_MM_:
if (tempi1->ic_code==IC_LEA) {
if (tempi1->a1.type&TY_MASK==TY_DISP &&
tempi1->a1.reg==REG_RBP) {
if (tempi1->a1.type&MDF_DISP && tempi1->a1.reg==REG_RBP) {
i=CmpOffset2Reg(tempi1->a1.disp,reg_offsets);
if (i>=0) {
tempi->ic_flags|=tempi1->ic_flags;
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
tempi->a1.type=MDF_REG+tempi->a1.type.raw_type;
tempi->a1.reg=i;
tempi->a1.disp=0;
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_flags|=ICF_BY_VAL;
OptSetNOP2(tempi1);
} else
goto p4_lea_gone;
@@ -300,29 +287,27 @@ p4_lea_gone:
tempi->a1.type=tempi1->a1.type;
tempi->a1.reg=tempi1->a1.reg;
tempi->a1.disp=tempi1->a1.disp;
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_flags|=ICF_BY_VAL;
OptSetNOP2(tempi1);
}
} else if ((tempi1->ic_code==IC_ABS_ADDR ||
tempi1->ic_code==IC_MOV &&
tempi1->a1.type==TY_IMM+RT_I64 &&
0<=tempi1->a1.disp<=MAX_I32) &&
!(tempi1->ic_flags&ICF_NO_RIP)) {
} else if ((tempi1->ic_code==IC_ABS_ADDR || tempi1->ic_code==IC_MOV &&
tempi1->a1.type==MDF_IMM+RT_I64 &&
0<=tempi1->a1.disp<=MAX_I32)&& !(tempi1->ic_flags&ICF_NO_RIP)) {
tempi->ic_flags|=tempi1->ic_flags;
if (tempi1->ic_code==IC_ABS_ADDR)
tempi->a1.disp=tempi1->ic_data;
else
tempi->a1.disp=tempi1->a1.disp;
tempi->a1.type=TY_RIP_DISP32+tempi->a1.type_pointed_to;
tempi->a1.type=MDF_RIP_DISP32+tempi->a1.type_pointed_to;
tempi->a1.reg=REG_RIP;
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_flags|=ICF_BY_VAL;
OptFree(tempi1);
}
break;
case IC_ADD:
if (tempi1->ic_code==IC_MOV && tempi1->a1.type==TY_REG+RT_I64 ||
if (tempi1->ic_code==IC_MOV && tempi1->a1.type==MDF_REG+RT_I64 ||
tempi1->ic_code==IC_REG) {
if (tempi2->ic_code==IC_MOV && tempi2->a1.type==TY_REG+RT_I64 ||
if (tempi2->ic_code==IC_MOV && tempi2->a1.type==MDF_REG+RT_I64 ||
tempi2->ic_code==IC_REG) {
if (tempi2->a1.reg!=REG_RSP) {
tempi->a1.disp=0;
@@ -338,14 +323,13 @@ p4_sib:
OptFree(tempi2);
tempi->ic_code=IC_LEA;
tempi->a1.type=TY_SIB+RT_I64;
tempi->a1.type=MDF_SIB+RT_I64;
tempi->a1.type_pointed_to=RT_I64;
tempi->a2.type=TY_NULL+tempi->a2.type&RT_MASK;
tempi->a2.type=MDF_NULL+tempi->a2.type.raw_type;
}
} else if (tempi2->ic_code==IC_SHL_CONST &&
tempi2->a1.type==TY_REG+RT_I64 &&
tempi2->ic_data<=3) {
tempi2->a1.type==MDF_REG+RT_I64 && tempi2->ic_data<=3) {
if (tempi2->a1.reg!=REG_RSP) {
tempi->a1.disp=0;
tempi->a1.reg=tempi1->a1.reg+tempi2->a1.reg<<8;
@@ -359,11 +343,11 @@ p4_sib:
}
}
} else if (tempi1->ic_code==IC_LEA &&
tempi1->a1.type&TY_MASK==TY_DISP) {
tempi1->a1.type&MDF_DISP) {
if (tempi1->a1.reg==REG_RBP &&
CmpOffset2Reg(tempi1->a1.disp,reg_offsets)>=0)
break;
if (tempi2->ic_code==IC_MOV && tempi2->a1.type==TY_REG+RT_I64 ||
if (tempi2->ic_code==IC_MOV && tempi2->a1.type==MDF_REG+RT_I64 ||
tempi2->ic_code==IC_REG) {
if (tempi2->a1.reg!=REG_RSP) {
tempi->a1.disp=tempi1->a1.disp;
@@ -375,8 +359,7 @@ p4_sib:
goto p4_sib;
}
} else if (tempi2->ic_code==IC_SHL_CONST &&
tempi2->a1.type==TY_REG+RT_I64 &&
tempi2->ic_data<=3) {
tempi2->a1.type==MDF_REG+RT_I64 && tempi2->ic_data<=3) {
if (tempi2->a1.reg!=REG_RSP) {
tempi->a1.disp=tempi1->a1.disp;
tempi->a1.reg=tempi1->a1.reg+tempi2->a1.reg<<8;
@@ -407,44 +390,42 @@ p4_sib:
case IC_ADD_EQU:
case IC_SUB_EQU:
if (tempi1->ic_code==IC_LEA) {
if (TY_DISP<=tempi1->a1.type&TY_MASK<=TY_SIB) {
if (tempi1->a1.type&TY_MASK==TY_DISP && tempi1->a1.reg==REG_RBP) {
if (tempi1->a1.type&(MDF_DISP|MDF_SIB)) {
if (tempi1->a1.type&MDF_DISP && tempi1->a1.reg==REG_RBP) {
i=CmpOffset2Reg(tempi1->a1.disp,reg_offsets);
if (i>=0) {
tempi->ic_flags|=tempi1->ic_flags;
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
tempi->a1.type=MDF_REG+tempi->a1.type.raw_type;
tempi->a1.reg=i;
tempi->a1.disp=0;
OptSetNOP2(tempi1);
} else {
tempi->ic_flags|=tempi1->ic_flags;
tempi->a1.type=TY_DISP+tempi->a1.type&RT_MASK;
tempi->a1.type=MDF_DISP+tempi->a1.type.raw_type;
tempi->a1.reg=REG_RBP;
tempi->a1.disp=tempi1->a1.disp;
OptSetNOP2(tempi1);
}
} else {
tempi->a1.type=tempi1->a1.type&TY_MASK+tempi->a1.type&RT_MASK;
tempi->a1.type=tempi1->a1.type&MDG_MASK+tempi->a1.type.raw_type;
tempi->ic_flags|=tempi1->ic_flags;
tempi->a1.reg=tempi1->a1.reg;
tempi->a1.disp=tempi1->a1.disp;
OptSetNOP2(tempi1);
}
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_flags|=ICF_BY_VAL;
}
} else if ((tempi1->ic_code==IC_ABS_ADDR ||
tempi1->ic_code==IC_MOV &&
tempi1->a1.type==TY_IMM+RT_I64 &&
0<=tempi1->a1.disp<=MAX_I32) &&
!(tempi1->ic_flags&ICF_NO_RIP)) {
tempi1->ic_code==IC_MOV && tempi1->a1.type==MDF_IMM+RT_I64 &&
0<=tempi1->a1.disp<=MAX_I32)&& !(tempi1->ic_flags&ICF_NO_RIP)) {
tempi->ic_flags|=tempi1->ic_flags;
if (tempi1->ic_code==IC_ABS_ADDR)
tempi->a1.disp=tempi1->ic_data;
else
tempi->a1.disp=tempi1->a1.disp;
tempi->a1.type=TY_RIP_DISP32+tempi->a1.type&RT_MASK;
tempi->a1.type=MDF_RIP_DISP32+tempi->a1.type.raw_type;
tempi->a1.reg=REG_RIP;
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_flags|=ICF_BY_VAL;
OptSetNOP2(tempi1);
}
break;
@@ -486,18 +467,18 @@ p4_sib:
case IC_LBTS:
case IC_LBTR:
case IC_LBTC:
if (!(tempi->ic_flags&ICF_NOT_ADDR)) {
if (!(tempi->ic_flags&ICF_BY_VAL)) {
if (tempi2->ic_code==IC_ADDR) {
if (tempi2->a1.type&TY_MASK==TY_STK &&
tempi2->r.type&TY_MASK==TY_STK) {
if (tempi2->a1.type&MDF_STK &&
tempi2->r.type&MDF_STK) {
if (tempil2=OptLag1(tempi2)) {
if (tempil2->ic_code==IC_LEA) {
if (TY_IMM<=tempil2->a1.type&TY_MASK<TY_STK) {
if (tempil2->a1.type&(MDF_IMM|MDG_REG_DISP_SIB_RIP)) {
if (tempi2) {
tempi->ic_flags|=tempi2->ic_flags;
OptFree(tempi2);
}
tempi->ic_flags|=tempil2->ic_flags|ICF_NOT_ADDR;
tempi->ic_flags|=tempil2->ic_flags|ICF_BY_VAL;
tempi->a2.type=tempil2->a1.type;
tempi->a2.reg =tempil2->a1.reg;
tempi->a2.disp=tempil2->a1.disp;
@@ -506,7 +487,7 @@ p4_sib:
break;
} else if (tempil2->ic_code!=IC_ABS_ADDR &&
!(tempil2->ic_code==IC_MOV &&
tempil2->a1.type==TY_IMM+RT_I64 &&
tempil2->a1.type==MDF_IMM+RT_I64 &&
0<=tempil2->a1.disp<=MAX_I32) ||
tempil2->ic_flags&ICF_NO_RIP)
tempil2=NULL;
@@ -518,7 +499,7 @@ p4_sib:
}
}
} else {
if (tempi2->a1.type==TY_IMM+RT_I64 &&
if (tempi2->a1.type==MDF_IMM+RT_I64 &&
0<=tempi2->a1.disp<=MAX_I32 &&
!(tempi2->ic_flags&ICF_NO_RIP)) {
tempil2=tempi2;
@@ -532,19 +513,18 @@ p4_sib:
tempi->ic_flags|=tempi2->ic_flags;
OptFree(tempi2);
}
tempi->ic_flags|=tempil2->ic_flags|ICF_NOT_ADDR;
tempi->a2.type=TY_RIP_DISP32+tempi->a2.type&RT_MASK;
tempi->ic_flags|=tempil2->ic_flags|ICF_BY_VAL;
tempi->a2.type=MDF_RIP_DISP32+tempi->a2.type.raw_type;
tempi->a2.reg=REG_RIP;
OptFree(tempil2);
}
} else if (tempi2->ic_code==IC_MOV &&
tempi2->r.type&TY_MASK==TY_STK &&
tempi2->a1.type==TY_IMM+RT_I64 &&
} else if (tempi2->ic_code==IC_MOV && tempi2->r.type&MDF_STK &&
tempi2->a1.type==MDF_IMM+RT_I64 &&
0<=tempi2->a1.disp<=MAX_I32 &&
!(tempi2->ic_flags&ICF_NO_RIP)) {
tempi->a2.disp=tempi2->a1.disp;
tempi->ic_flags|=tempi2->ic_flags|ICF_NOT_ADDR;
tempi->a2.type=TY_RIP_DISP32+tempi->a2.type&RT_MASK;
tempi->ic_flags|=tempi2->ic_flags|ICF_BY_VAL;
tempi->a2.type=MDF_RIP_DISP32+tempi->a2.type.raw_type;
tempi->a2.reg=REG_RIP;
OptFree(tempi2);
}
@@ -579,15 +559,20 @@ p4_sib:
if (!(tempil1->ic_flags&ICF_PUSH_RESULT)) {
if (tempi->ic_flags&ICF_NO_DEPEND_RESULT) {
tempil1->ic_flags|=ICF_NO_DEPEND_RESULT;
tempil1->r.type=TY_NULL+tempil1->r.type&RT_MASK;
} else if (tempi->a1.type&TY_MASK==TY_STK &&
tempil1->r.type&TY_MASK==TY_STK) {
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
tempi->a1.reg=REG_RAX;
tempil1->r.type=MDF_NULL+tempil1->r.type.raw_type;
} else if (tempi->a1.type&MDF_STK &&
tempil1->r.type&MDF_STK) {
tempi->a1.type=MDF_REG+tempi->a1.type.raw_type;
tempi->a1.disp=0;
tempil1->r.type=TY_REG+tempil1->r.type&RT_MASK;
tempil1->r.reg=REG_RAX;
tempil1->r.type=MDF_REG+tempil1->r.type.raw_type;
tempil1->r.disp=0;
if (intermediate_code_table[tempi->ic_code].arg_cnt==IS_2_ARG) {
tempi->a1.reg=REG_R8;
tempil1->r.reg=REG_R8;
} else {
tempi->a1.reg=REG_RAX;
tempil1->r.reg=REG_RAX;
}
}
}
break;
+18 -20
View File
@@ -26,30 +26,29 @@ U0 OptPass5(CCmpCtrl *cc)
if (Bt(&tempi->ic_data,i))
ps->ptr--;
}
if (tempi->a2.type&TY_MASK==TY_STK) {
if (tempi->a2.type&MDF_STK) {
tempi1=PrsPop(ps);
if (tempi1->ic_code==IC_MOV ||
tempi1->ic_code==IC_REG) {
if (tempi1->ic_code==IC_MOV || tempi1->ic_code==IC_REG) {
if (tempi1->ic_flags & ICF_R_TO_INT) {
if (tempi1->a1.type&TY_MASK==TY_IMM)
if (tempi1->a1.type&MDF_IMM)
tempi1->a1.disp=tempi1->a1.disp(F64);
else
tempi->ic_flags|=ICF_A2_TO_INT;
} else if (tempi1->ic_flags&ICF_R_TO_F64) {
if (tempi1->a1.type&TY_MASK==TY_IMM)
if (tempi1->a1.type&MDF_IMM)
tempi1->a1.disp(F64)=tempi1->a1.disp;
else
tempi->ic_flags|=ICF_A2_TO_F64;
}
ty=tempi->a2.type&RT_MASK;
ty1=tempi1->a1.type&RT_MASK;
ty=tempi->a2.type.raw_type;
ty1=tempi1->a1.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
ty1=tempi1->r.type&RT_MASK;
ty1=tempi1->r.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
tempi->a2.type=tempi1->a1.type&TY_MASK+ty;
tempi->a2.type=tempi1->a1.type&MDG_MASK+ty;
pt=tempi->a2.type_pointed_to;
pt1=tempi1->a1.type_pointed_to;
@@ -67,18 +66,17 @@ U0 OptPass5(CCmpCtrl *cc)
}
}
if (tempi->a1.type&TY_MASK==TY_STK) {
if (tempi->a1.type&MDF_STK) {
tempi1=PrsPop(ps);
if (tempi1->ic_code==IC_MOV ||
tempi1->ic_code==IC_REG) {
if (tempi1->ic_code==IC_MOV || tempi1->ic_code==IC_REG) {
if (tempi1->ic_flags & ICF_R_TO_INT) {
if (tempi1->a1.type&TY_MASK==TY_IMM)
if (tempi1->a1.type&MDF_IMM)
tempi1->a1.disp=tempi1->a1.disp(F64);
else
tempi->ic_flags|=ICF_A1_TO_INT;
} else if (tempi1->ic_flags&ICF_R_TO_F64) {
if (tempi1->a1.type&TY_MASK==TY_IMM) {
if (tempi1->a1.type & 1) //signed/unsigned
if (tempi1->a1.type&MDF_IMM) {
if (tempi1->a1.type&RTF_UNSIGNED)
tempi1->a1.disp(F64)=tempi1->a1.disp(U64);
else
tempi1->a1.disp(F64)=tempi1->a1.disp(I64);
@@ -86,14 +84,14 @@ U0 OptPass5(CCmpCtrl *cc)
tempi->ic_flags|=ICF_A1_TO_F64;
}
ty=tempi->a1.type&RT_MASK;
ty1=tempi1->a1.type&RT_MASK;
ty=tempi->a1.type.raw_type;
ty1=tempi1->a1.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
ty1=tempi1->r.type&RT_MASK;
ty1=tempi1->r.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
tempi->a1.type=tempi1->a1.type&TY_MASK+ty;
tempi->a1.type=tempi1->a1.type&MDG_MASK+ty;
pt=tempi->a1.type_pointed_to;
pt1=tempi1->a1.type_pointed_to;
@@ -110,7 +108,7 @@ U0 OptPass5(CCmpCtrl *cc)
OptSetNOP2(tempi1);
}
}
if (tempi->r.type&TY_MASK==TY_STK &&
if (tempi->r.type&MDF_STK &&
!(tempi->ic_flags&ICF_NO_DEPEND_RESULT))
PrsPush(ps,tempi);
}
+63 -73
View File
@@ -4,20 +4,20 @@ Bool OptIC6(CIntermediateCode *tempi)
if (tempi->ic_code<IC_IMM_I64 || !(tempil1=OptLag1(tempi)))
return FALSE;
if (tempil1->ic_code==IC_ADD_CONST && tempi->ic_code==IC_DEREF &&
tempi->ic_flags&ICF_A1_WAS_STK && tempi->a1.type&TY_MASK==TY_REG &&
tempil1->r.type&TY_MASK==TY_REG && MIN_I32<=tempil1->ic_data<=MAX_I32 &&
tempi->ic_flags&ICF_A1_WAS_STK && tempi->a1.type&MDF_REG &&
tempil1->r.type&MDF_REG && MIN_I32<=tempil1->ic_data<=MAX_I32 &&
!Bt(&cmp.non_ptr_vars_mask,tempil1->a1.reg)) {
if (tempil1->a1.type&TY_MASK==TY_REG) {
if (tempil1->a1.type&MDF_REG) {
tempi->ic_flags=tempi->ic_flags&~ICF_A1_WAS_STK | tempil1->ic_flags;
tempi->ic_code=IC_MOV;
tempi->a1.type=TY_DISP+tempi->a1.type_pointed_to;
tempi->a1.type=MDF_DISP+tempi->a1.type_pointed_to;
tempi->a1.reg=tempil1->a1.reg;
tempi->a1.disp=tempil1->ic_data;
OptSetNOP2(tempil1,-1);
} else {
tempil1->ic_code=IC_MOV;
tempi->ic_code=IC_MOV;
tempi->a1.type=TY_DISP+tempi->a1.type_pointed_to;
tempi->a1.type=MDF_DISP+tempi->a1.type_pointed_to;
tempi->a1.disp=tempil1->ic_data;
}
return TRUE;
@@ -26,99 +26,85 @@ Bool OptIC6(CIntermediateCode *tempi)
}
U0 OptPass6Lag(CCmpCtrl *cc,CPrsStk *ps,CIntermediateCode *tempi,
I64 *i_,I64 num_stk,I64 *_clobbered_reg_mask,I64 fun_num)
I64 *_stk_ptr,I64 reg_stk_size,I64 *_clobbered_reg_mask)
{
I64 i=*i_,j,k,l,code,clobbered_reg_mask=*_clobbered_reg_mask;
I64 stk_ptr=*_stk_ptr,code,
clobbered_stk_temp_mask,clobbered_reg_mask=*_clobbered_reg_mask;
CHashFun *tempf;
code=tempi->ic_code;
if (tempi->ic_flags&ICF_PASS_TRACE && Bt(&cc->saved_pass_trace,6)) {
"%2d:",i;
"%2d:",stk_ptr;
ICPut(cc,tempi);
}
if (code==IC_CALL_START) {
k=MinI64(i,num_stk);
j=0;
//See $LK,"STK TEMP ALLOCATION",A="FF:::/Compiler/CInit.CPP,STK TEMP ALLOCATION"$
if (fun_num&1)
for (l=0;l<k;l++)
Bts(&j,cmp.to_stk_temps_map_odd[l]);
if (reg_stk_size==1 && stk_ptr>0)
clobbered_stk_temp_mask=REGG_STK_TEMP;
else
for (l=0;l<k;l++)
Bts(&j,cmp.to_stk_temps_map_even[l]);
clobbered_stk_temp_mask=0;
if (tempf=tempi->ic_data) {
if (Bt(&tempf->flags,Ff_INTERNAL))
j=0;
clobbered_stk_temp_mask=0;
else {
j&=tempf->clobbered_reg_mask;
clobbered_stk_temp_mask&=tempf->clobbered_reg_mask;
clobbered_reg_mask|=tempf->clobbered_reg_mask;
}
}
tempi->ic_data=j;
PrsPush(ps,i);
PrsPush(ps,j);
tempi->ic_data=clobbered_stk_temp_mask;
PrsPush(ps,stk_ptr);
PrsPush(ps,clobbered_stk_temp_mask);
} else if (code==IC_CALL_END) {
tempi->ic_data=PrsPop(ps);
i=PrsPop(ps);
stk_ptr=PrsPop(ps);
} else if (code==IC_CALL_END2) {
ps->ptr--;
i=PrsPop(ps);
stk_ptr=PrsPop(ps);
}
if (intermediate_code_table[code].arg_cnt==IS_V_ARG)
i-=tempi->ic_data>>3;
if (tempi->a2.type&TY_MASK==TY_STK) {
i--;
if (i<num_stk) {
tempi->a2.type=TY_REG+tempi->a2.type&RT_MASK;
if (fun_num&1)
tempi->a2.reg=cmp.to_stk_temps_map_odd[i];
else
tempi->a2.reg=cmp.to_stk_temps_map_even[i];
stk_ptr-=tempi->ic_data>>3;
if (tempi->a2.type&MDF_STK) {
stk_ptr--;
if (stk_ptr<reg_stk_size) {
tempi->a2.type=MDF_REG+tempi->a2.type.raw_type;
tempi->a2.reg=Bsf(REGG_STK_TEMP);
tempi->a2.disp=0;
}
}
if (tempi->a1.type&TY_MASK==TY_STK) {
i--;
if (i<num_stk) {
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
if (fun_num&1)
tempi->a1.reg=cmp.to_stk_temps_map_odd[i];
else
tempi->a1.reg=cmp.to_stk_temps_map_even[i];
if (tempi->a1.type&MDF_STK) {
stk_ptr--;
if (stk_ptr<reg_stk_size) {
tempi->a1.type=MDF_REG+tempi->a1.type.raw_type;
tempi->a1.reg=Bsf(REGG_STK_TEMP);
tempi->a1.disp=0;
}
}
if (tempi->r.type&TY_MASK==TY_STK && !(tempi->ic_flags & ICF_PUSH_RESULT)) {
i++;
if (i<=num_stk) {
tempi->r.type=TY_REG+tempi->r.type&RT_MASK;
if (fun_num&1) {
tempi->r.reg=cmp.to_stk_temps_map_odd[i-1];
Bts(&clobbered_reg_mask,cmp.to_stk_temps_map_odd[i-1]);
} else {
tempi->r.reg=cmp.to_stk_temps_map_even[i-1];
Bts(&clobbered_reg_mask,cmp.to_stk_temps_map_even[i-1]);
}
if (tempi->r.type&MDF_STK && !(tempi->ic_flags & ICF_PUSH_RESULT)) {
stk_ptr++;
if (stk_ptr<=reg_stk_size) {
tempi->r.type=MDF_REG+tempi->r.type.raw_type;
tempi->r.reg=Bsf(REGG_STK_TEMP);
clobbered_reg_mask|=REGG_STK_TEMP;
tempi->r.disp=0;
}
}
while (OptIC6(tempi));
if (tempi->r.type&RT_MASK!=RT_F64 && !(tempi->ic_flags&ICF_USE_F64))
if (tempi->r.type.raw_type!=RT_F64 && !(tempi->ic_flags&ICF_USE_F64))
tempi->ic_flags|=ICF_USE_INT;
*i_=i;
*_stk_ptr=stk_ptr;
*_clobbered_reg_mask=clobbered_reg_mask;
}
U0 OptPass6(CCmpCtrl *cc)
{
CIntermediateCode *tempi,*tempi_next,*tempil1,*tempil2,*old_tempil2;
I64 i=0,num_stk,clobbered_reg_mask=REGG_C_CLOBBERED,fun_num=0;
I64 stk_ptr=0,reg_stk_size,clobbered_reg_mask=REGG_CLOBBERED;
CPrsStk *ps=cc->ps;
ps->ptr=0;
ps->ptr2=0;
if (Bt(&cc->opts,OPTf_NO_REG_VAR) || cc->flags&CCF_NO_REG_OPT)
num_stk=0;
reg_stk_size=0;
else
num_stk=cmp.num_stk_temps;
reg_stk_size=1;
#assert REGG_STK_TEMP==1<<9
tempi=cc->coc.coc_root.next;
old_tempil2=NULL;
tempil1=tempil2=&cmp.ic_nop;
@@ -127,50 +113,54 @@ U0 OptPass6(CCmpCtrl *cc)
if (tempil1->ic_code>IC_NOP2)
tempil2=tempil1;
tempil1=tempi;
if (tempi->a2.type&TY_MASK==TY_STK) {
if (tempil2->r.type&TY_MASK==TY_STK &&
if (tempi->a2.type&MDF_STK) {
if (tempil2->r.type&MDF_STK &&
!(tempil2->ic_flags&ICF_PUSH_RESULT)) {
if (tempi->ic_code==IC_ASSIGN && tempi->ic_flags&ICF_NOT_ADDR &&
if (tempi->ic_code==IC_ASSIGN && tempi->ic_flags&ICF_BY_VAL &&
tempi->ic_flags&ICF_NO_DEPEND_RESULT &&
tempil2->ic_code!=IC_CALL_END &&
tempil2->ic_code!=IC_CALL_END2 &&
tempil2->ic_code!=IC_SET_RAX &&
tempil2->ic_code!=IC_SET_RAX &&
!(tempi->ic_flags&(ICF_A2_TO_F64|ICF_A2_TO_INT)) &&
!(tempil2->ic_flags&(ICF_R_TO_F64|ICF_R_TO_INT))) {
tempil2->r.type =tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to;
tempil2->r.type =tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to;
tempil2->r.type_pointed_to=tempi->a1.type_pointed_to;
tempil2->r.reg =tempi->a1.reg;
tempil2->r.disp =tempi->a1.disp;
tempil2->ic_flags=tempil2->ic_flags
&~(ICF_NO_DEPEND_RESULT|ICF_R_WAS_STK)
|tempi->ic_flags&~(ICF_NOT_ADDR|ICF_A1_WAS_STK|ICF_A2_WAS_STK)
|tempi->ic_flags&~(ICF_BY_VAL|ICF_A1_WAS_STK|ICF_A2_WAS_STK)
|ICF_DEPEND_RESULT;
old_tempil2=NULL;
OptSetNOP1(tempi);
} else {
tempi->a2.type=TY_REG+tempi->a2.type&RT_MASK;
tempi->a2.type=MDF_REG+tempi->a2.type.raw_type;
tempi->a2.reg=REG_RAX;
tempi->a2.disp=0;
tempil2->r.type=TY_REG+tempil2->r.type&RT_MASK;
tempil2->r.type=MDF_REG+tempil2->r.type.raw_type;
tempil2->r.reg=REG_RAX;
tempil2->r.disp=0;
}
}
} else if (tempi->a1.type&TY_MASK==TY_STK &&
tempil2->r.type&TY_MASK==TY_STK &&
} else if (tempi->a1.type&MDF_STK && tempil2->r.type&MDF_STK &&
!(tempil2->ic_flags&ICF_PUSH_RESULT)) {
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
tempi->a1.reg=REG_RAX;
tempi->a1.type=MDF_REG+tempi->a1.type.raw_type;
tempi->a1.disp=0;
tempil2->r.type=TY_REG+tempil2->r.type&RT_MASK;
tempil2->r.reg=REG_RAX;
tempil2->r.type=MDF_REG+tempil2->r.type.raw_type;
tempil2->r.disp=0;
if (intermediate_code_table[tempi->ic_code].arg_cnt==IS_2_ARG) {
tempi->a1.reg=REG_R8;
tempil2->r.reg=REG_R8;
} else {
tempi->a1.reg=REG_RAX;
tempil2->r.reg=REG_RAX;
}
}
if (tempi->ic_flags & ICF_PUSH_RESULT)
tempi->r.type==TY_STK+tempi->r.type&RT_MASK;
tempi->r.type==MDF_STK+tempi->r.type.raw_type;
if (old_tempil2!=tempil2) {
if (tempil2->ic_code>IC_NOP2)
OptPass6Lag(cc,ps,tempil2,&i,num_stk,&clobbered_reg_mask,fun_num);
OptPass6Lag(cc,ps,tempil2,&stk_ptr,reg_stk_size,&clobbered_reg_mask);
old_tempil2=tempil2;
}
}
@@ -184,7 +174,7 @@ U0 OptPass6(CCmpCtrl *cc)
LexExcept(cc,"Compiler Optimization Error at ");
}
if (cc->htc.fun) {
cc->htc.fun->used_reg_mask&=~REGG_C_TEMP_CLOBBERED;
cc->htc.fun->used_reg_mask&=~REGG_STK_TEMP;
cc->htc.fun->used_reg_mask|=clobbered_reg_mask;
cc->htc.fun->clobbered_reg_mask=clobbered_reg_mask;
if (Bt(&cc->flags,CCf_PASS_TRACE_PRESENT) &&
+94 -171
View File
@@ -61,90 +61,36 @@ cc->pass==10 is final pass, code is placed into buf.
if (cc->pass==7)
cc->dont_push_float=Btr(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0);
MemCpy(saved_p123,&tempi->a1,3*sizeof(CICArg));
if (intermediate_code_table[tempi->ic_code].arg_cnt==IS_2_ARG &&
tempi->a1.type&TY_MASK==TY_REG && tempi->a1.reg==REG_RAX)
tempi->ic_flags|=ICF_A1_FIRST;
tempi->ic_cnt=0;
tempi->ic_last_cnt=-1;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.type&TY_MASK) {
if (tempi->ic_flags & ICF_A1_TO_F64) {
ICFCvt(cc,tempi,REG_RDX,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,FALSE,CN_A1,ip2);
tempi->a1.type=TY_REG+RT_I64;
tempi->a1.reg=REG_RDX;
tempi->a1.disp=0;
tempi->ic_flags&=~ICF_A1_FIRST;
} else if (tempi->ic_flags & ICF_A1_TO_INT) {
ICFCvt(cc,tempi,REG_RDX,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,TRUE,CN_A1,ip2);
tempi->a1.type=TY_REG+RT_I64;
tempi->a1.reg=REG_RDX;
tempi->a1.disp=0;
tempi->ic_flags&=~ICF_A1_FIRST;
}
if (tempi->a2.type.mode) {
if (tempi->ic_flags & ICF_A2_TO_F64) {
ICFCvt(cc,tempi,REG_RAX,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,FALSE,CN_A2,ip2);
tempi->a2.type=MDF_REG+RT_I64;
tempi->a2.reg=REG_RAX;
tempi->a2.disp=0;
} else if (tempi->ic_flags & ICF_A2_TO_INT) {
ICFCvt(cc,tempi,REG_RAX,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,TRUE,CN_A2,ip2);
tempi->a2.type=MDF_REG+RT_I64;
tempi->a2.reg=REG_RAX;
tempi->a2.disp=0;
}
if (tempi->a2.type&TY_MASK) {
if (tempi->ic_flags & ICF_A2_TO_F64) {
if (tempi->ic_flags&ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
tempi->a1.type=TY_REG+RT_I64;
tempi->a1.reg=REG_RDX;
tempi->a1.disp=0;
tempi->ic_flags&=~ICF_A1_FIRST;
}
ICFCvt(cc,tempi,REG_RAX,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,FALSE,CN_A2,ip2);
tempi->a2.type=TY_REG+RT_I64;
tempi->a2.reg=REG_RAX;
tempi->a2.disp=0;
} else if (tempi->ic_flags & ICF_A2_TO_INT) {
if (tempi->ic_flags&ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
tempi->a1.type=TY_REG+RT_I64;
tempi->a1.reg=REG_RDX;
tempi->a1.disp=0;
tempi->ic_flags&=~ICF_A1_FIRST;
}
ICFCvt(cc,tempi,REG_RAX,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,TRUE,CN_A2,ip2);
tempi->a2.type=TY_REG+RT_I64;
tempi->a2.reg=REG_RAX;
tempi->a2.disp=0;
}
}
} else {
if (tempi->a2.type&TY_MASK) {
if (tempi->ic_flags & ICF_A2_TO_F64) {
ICFCvt(cc,tempi,REG_RAX,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,FALSE,CN_A2,ip2);
tempi->a2.type=TY_REG+RT_I64;
tempi->a2.reg=REG_RAX;
tempi->a2.disp=0;
} else if (tempi->ic_flags & ICF_A2_TO_INT) {
ICFCvt(cc,tempi,REG_RAX,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,TRUE,CN_A2,ip2);
tempi->a2.type=TY_REG+RT_I64;
tempi->a2.reg=REG_RAX;
tempi->a2.disp=0;
}
}
if (tempi->a1.type&TY_MASK) {
if (tempi->ic_flags & ICF_A1_TO_F64) {
ICFCvt(cc,tempi,REG_RDX,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,FALSE,CN_A1,ip2);
tempi->a1.type=TY_REG+RT_I64;
tempi->a1.reg=REG_RDX;
tempi->a1.disp=0;
} else if (tempi->ic_flags & ICF_A1_TO_INT) {
ICFCvt(cc,tempi,REG_RDX,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,TRUE,CN_A1,ip2);
tempi->a1.type=TY_REG+RT_I64;
tempi->a1.reg=REG_RDX;
tempi->a1.disp=0;
}
}
if (tempi->a1.type.mode) {
if (tempi->ic_flags & ICF_A1_TO_F64) {
ICFCvt(cc,tempi,REG_RDX,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,FALSE,CN_A1,ip2);
tempi->a1.type=MDF_REG+RT_I64;
tempi->a1.reg=REG_RDX;
tempi->a1.disp=0;
} else if (tempi->ic_flags & ICF_A1_TO_INT) {
ICFCvt(cc,tempi,REG_RDX,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,TRUE,CN_A1,ip2);
tempi->a1.type=MDF_REG+RT_I64;
tempi->a1.reg=REG_RDX;
tempi->a1.disp=0;
}
}
switch [tempi->ic_code] {
@@ -191,8 +137,7 @@ cc->pass==10 is final pass, code is placed into buf.
case IC_RIP:
ICU16(tempi,0xB848);
ICU64(tempi,ip2+tempi->ic_cnt-2);
if (cc->flags&CCF_AOT_COMPILE && buf &&
!(cc->flags&CCF_NO_ABSS)) {
if (cc->flags&CCF_AOT_COMPILE && buf &&!(cc->flags&CCF_NO_ABSS)) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
tempa->next=aotc->abss;
tempa->type=AAT_ADD_U64;
@@ -202,7 +147,7 @@ cc->pass==10 is final pass, code is placed into buf.
break;
sub_switch_end:
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip2);
MDF_REG+RT_I64,REG_RAX,0,ip2);
break;
case IC_BR_CARRY:
ICFlagBranch(tempi,ip,0x72820F,buf);
@@ -356,7 +301,7 @@ cc->pass==10 is final pass, code is placed into buf.
else
i=lb->addr+buf;
ICLea(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_RIP_DISP32+RT_PTR,0,i,cc,buf,ip2);
MDF_RIP_DISP32+RT_PTR,0,i,cc,buf,ip2);
break;
case IC_ASM:
tempaot=tempi->ic_data;
@@ -442,12 +387,11 @@ cc->pass==10 is final pass, code is placed into buf.
case IC_LEAVE:
if (cc->htc.fun) {
if (Bt(&cc->htc.fun->flags,Ff_INTERRUPT))
ICPopRegs(tempi,REGG_C_CLOBBERED|cc->htc.fun->used_reg_mask&
(REGG_C_LOCAL_VARS|REGG_C_LOCAL_NON_PTR_VARS|
REGG_C_TEMP_CLOBBERED));
ICPopRegs(tempi,REGG_CLOBBERED|cc->htc.fun->used_reg_mask&
(REGG_LOCAL_VARS|REGG_LOCAL_NON_PTR_VARS|REGG_STK_TEMP));
else
ICPopRegs(tempi,cc->htc.fun->used_reg_mask&
(REGG_C_LOCAL_VARS|REGG_C_LOCAL_NON_PTR_VARS));
(REGG_LOCAL_VARS|REGG_LOCAL_NON_PTR_VARS));
}
if (tempi->ic_data<=MAX_I16) {
if (tempi->ic_data)
@@ -487,14 +431,16 @@ cc->pass==10 is final pass, code is placed into buf.
ICU8(tempi,0x64);
//It's ugly to use ic_class here
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+CmpRawType(tempi->ic_class),REG_RAX,tempi->ic_data,ip2);
MDF_DISP+CmpRawType(tempi->ic_class),REG_RAX,tempi->ic_data,
ip2);
break;
case IC_MOV_GS:
ICZero(tempi,REG_RAX);
ICU8(tempi,0x65);
//It's ugly to use ic_class here
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+CmpRawType(tempi->ic_class),REG_RAX,tempi->ic_data,ip2);
MDF_DISP+CmpRawType(tempi->ic_class),REG_RAX,tempi->ic_data,
ip2);
break;
case IC_HOLYC_TYPECAST:
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
@@ -507,7 +453,7 @@ cc->pass==10 is final pass, code is placed into buf.
ICNot(tempi,ip2);
break;
case IC_UNARY_MINUS:
if (tempi->r.type&RT_MASK==RT_F64)
if (tempi->r.type.raw_type==RT_F64)
ICFUnaryMinus(cc,tempi,buf,ip2);
else
ICUnaries(tempi,SLASH_OP_NEG,ip2);
@@ -730,13 +676,13 @@ cc->pass==10 is final pass, code is placed into buf.
case IC_SHL_CONST:
ICShift(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
TY_IMM+RT_I64,0,tempi->ic_data,
MDF_IMM+RT_I64,0,tempi->ic_data,
0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2);
break;
case IC_SHR_CONST:
ICShift(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
TY_IMM+RT_I64,0,tempi->ic_data,
MDF_IMM+RT_I64,0,tempi->ic_data,
0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2);
break;
case IC_ADD_CONST:
@@ -755,20 +701,18 @@ cc->pass==10 is final pass, code is placed into buf.
ICAddRSP(tempi,-tempi->ic_data,FALSE);
if (cc->htc.fun) {
if (Bt(&cc->htc.fun->flags,Ff_INTERRUPT))
ICPushRegs(tempi,REGG_C_CLOBBERED|cc->htc.fun->used_reg_mask&
(REGG_C_LOCAL_VARS|REGG_C_LOCAL_NON_PTR_VARS|
REGG_C_TEMP_CLOBBERED));
ICPushRegs(tempi,REGG_CLOBBERED|cc->htc.fun->used_reg_mask&
(REGG_LOCAL_VARS|REGG_LOCAL_NON_PTR_VARS|REGG_STK_TEMP));
else {
if (sys_var_init_flag&1 && i)
if (sys_var_init_flag && i)
ICLocalVarInit(tempi);
ICPushRegs(tempi,cc->htc.fun->used_reg_mask
&(REGG_C_LOCAL_VARS|REGG_C_LOCAL_NON_PTR_VARS));
&(REGG_LOCAL_VARS|REGG_LOCAL_NON_PTR_VARS));
}
for (i=0;i<NUM_REGS;i++)
if (reg_offsets[i]>0 && reg_offsets[i].offset!=MAX_I64) {
tempc=OptClassFwd(reg_offsets[i].m->member_class);
ICMov(tempi,TY_REG+RT_I64,i,0,
TY_DISP+tempc->raw_type,
ICMov(tempi,MDF_REG+RT_I64,i,0,MDF_DISP+tempc->raw_type,
REG_RBP,reg_offsets[i].offset,ip2);
}
}
@@ -792,18 +736,18 @@ cc->pass==10 is final pass, code is placed into buf.
ICU8(tempi,0x58);
break;
case IC_INVLPG:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU24(tempi,0x38010F);
break;
case IC_CLFLUSH:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU24(tempi,0x38AE0F);
break;
case IC_GET_RFLAGS:
ICU8(tempi,0x9C);
ICPop(tempi,TY_REG+RT_I64,REG_RAX,0,ip2);
ICPop(tempi,MDF_REG+RT_I64,REG_RAX,0,ip2);
break;
case IC_CARRY:
ICU24(tempi,0xC0920F); //SETC AL
@@ -820,24 +764,24 @@ cc->pass==10 is final pass, code is placed into buf.
ICU8(tempi,0x9D);
break;
case IC_GET_RBP:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_REG+RT_I64,REG_RBP,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
MDF_REG+RT_I64,REG_RBP,0,ip2);
break;
case IC_SET_RBP:
ICMov(tempi,TY_REG+RT_I64,REG_RBP,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RBP,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
break;
case IC_GET_RSP:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_REG+RT_I64,REG_RSP,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
MDF_REG+RT_I64,REG_RSP,0,ip2);
break;
case IC_SET_RSP:
ICMov(tempi,TY_REG+RT_I64,REG_RSP,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RSP,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
break;
case IC_RETURN_VAL:
case IC_SET_RAX:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
break;
case IC_RETURN_VAL2:
@@ -863,21 +807,21 @@ cc->pass==10 is final pass, code is placed into buf.
0xBB0F,0x38BA0F,ip2);
break;
case IC_BSF:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU32(tempi,0xC0BC0F48);
ICU16(tempi,0x0375);
ICU24(tempi,0xD0F748);
break;
case IC_BSR:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU32(tempi,0xC0BD0F48);
ICU16(tempi,0x0375);
ICU24(tempi,0xD0F748);
break;
case IC_SIGN_I64:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_SIGN_I64,
TRUE,FALSE,FALSE,CN_MAIN);
@@ -916,7 +860,7 @@ cc->pass==10 is final pass, code is placed into buf.
ICFTemplateFun(cc,tempi,CMP_TEMPLATE_ATAN,ip2);
break;
case IC_ABS_I64:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU24(tempi,0xC08548);
ICU16(tempi,0x0379);
@@ -962,12 +906,12 @@ cc->pass==10 is final pass, code is placed into buf.
ICQueRem(tempi,ip2);
break;
case IC_STRLEN:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_STRLEN,TRUE,FALSE,FALSE,CN_MAIN);
break;
case IC_IN_U32:
if (tempi->a1.type&TY_MASK==TY_IMM) {
if (tempi->a1.type&MDF_IMM) {
ICU16(tempi,0xC033);
if (tempi->a1.disp<=MAX_U8)
ICU16(tempi,0xE5+tempi->a1.disp<<8);
@@ -976,14 +920,14 @@ cc->pass==10 is final pass, code is placed into buf.
ICU8(tempi,0xED);
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU16(tempi,0xC033);
ICU8(tempi,0xED);
}
break;
case IC_IN_U16:
if (tempi->a1.type&TY_MASK==TY_IMM) {
if (tempi->a1.type&MDF_IMM) {
ICU16(tempi,0xC033);
if (tempi->a1.disp<=MAX_U8)
ICU24(tempi,0xE500+OC_OP_SIZE_PREFIX+tempi->a1.disp<<16);
@@ -992,14 +936,14 @@ cc->pass==10 is final pass, code is placed into buf.
ICU16(tempi,0xED00+OC_OP_SIZE_PREFIX);
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU16(tempi,0xC033);
ICU16(tempi,0xED00+OC_OP_SIZE_PREFIX);
}
break;
case IC_IN_U8:
if (tempi->a1.type&TY_MASK==TY_IMM) {
if (tempi->a1.type&MDF_IMM) {
ICU16(tempi,0xC033);
if (tempi->a1.disp<=MAX_U8)
ICU16(tempi,0xE4+tempi->a1.disp<<8);
@@ -1008,15 +952,15 @@ cc->pass==10 is final pass, code is placed into buf.
ICU8(tempi,0xEC);
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU16(tempi,0xC033);
ICU8(tempi,0xEC);
}
break;
case IC_OUT_U32:
if (tempi->a2.type&TY_MASK==TY_IMM) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
if (tempi->a2.type&MDF_IMM) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
if (tempi->a2.disp<=MAX_U8)
ICU16(tempi,0xE7+tempi->a2.disp<<8);
@@ -1025,23 +969,16 @@ cc->pass==10 is final pass, code is placed into buf.
ICU8(tempi,0xEF);
}
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU8(tempi,0xEF);
}
break;
case IC_OUT_U16:
if (tempi->a2.type&TY_MASK==TY_IMM) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
if (tempi->a2.type&MDF_IMM) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
if (tempi->a2.disp<=MAX_U8)
ICU24(tempi,0xE700+OC_OP_SIZE_PREFIX+tempi->a2.disp<<16);
@@ -1050,23 +987,16 @@ cc->pass==10 is final pass, code is placed into buf.
ICU16(tempi,0xEF00+OC_OP_SIZE_PREFIX);
}
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU16(tempi,0xEF00+OC_OP_SIZE_PREFIX);
}
break;
case IC_OUT_U8:
if (tempi->a2.type&TY_MASK==TY_IMM) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
if (tempi->a2.type&MDF_IMM) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
if (tempi->a2.disp<=MAX_U8)
ICU16(tempi,0xE6+tempi->a2.disp<<8);
@@ -1075,17 +1005,10 @@ cc->pass==10 is final pass, code is placed into buf.
ICU8(tempi,0xEE);
}
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU8(tempi,0xEE);
}
break;
@@ -1105,9 +1028,9 @@ cc->pass==10 is final pass, code is placed into buf.
break;
case IC_CALL_END:
ICPopRegs(tempi,tempi->ic_data);
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip2);
MDF_REG+RT_I64,REG_RAX,0,ip2);
break;
case IC_POP_REGS:
ICPopRegs(tempi,tempi->ic_data);
@@ -1122,24 +1045,24 @@ cc->pass==10 is final pass, code is placed into buf.
ICPut(cc,tempi);
LexExcept(cc,"Compiler Optimization Error at ");
}
if (tempi->r.type&TY_MASK) {
if (tempi->r.type.mode) {
if (tempi->ic_flags & ICF_R_TO_F64) {
if (tempi->ic_code==IC_PUSH_CMP) {
ICU24(tempi,0xDC8B48);
ICU24(tempi,0x2BDF48);
ICU24(tempi,0x1BDD48);
ICU8(tempi,0x9B);
ICU24(tempi,0x242CDF); //FILD U64 [RSP]
ICU24(tempi,0x241CDD); //FSTP U64 [RSP]
} else {
ICFCvt(cc,tempi,REG_RAX,tempi->r.type,tempi->r.reg,tempi->r.disp,
FALSE,CN_R,ip2);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip2);
if (!Bt(&tempi->ic_flags,ICf_DONT_POP_FLOAT0+
cc->cur_ic_float_op_num-1))
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
MDF_REG+RT_I64,REG_RAX,0,ip2);
}
} else if (tempi->ic_flags & ICF_R_TO_INT) {
ICFCvt(cc,tempi,REG_RAX,tempi->r.type,tempi->r.reg,tempi->r.disp,
TRUE,CN_R,ip2);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip2);
MDF_REG+RT_I64,REG_RAX,0,ip2);
}
}
}
+32 -34
View File
@@ -203,7 +203,7 @@ pe_do_binary_op:
tempc=OptClassFwd(tempi->ic_class);
if (intermediate_code_table[tempi->ic_code].type!=IST_DEREF ||
!tempc->ptr_stars_cnt && !Bt(&tempc->flags,Cf_INTERNAL_TYPE))
LexExcept(cc,"invalid lval at ");
LexExcept(cc,"Invalid lval at ");
tempi->ic_code=IC_NOP1; //Important for setting class (pretty sure)
cur_op.u8[2]=PREC_ASSIGN|ASSOCF_RIGHT;
}
@@ -302,7 +302,7 @@ U0 PrsSizeOf(CCmpCtrl *cc)
CDbgInfo *dbg_info;
I64 i;
if (cc->token!=TK_IDENT)
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
if (tempm=cc->local_var_entry) {
tempc=tempm->member_class;
i=tempc->size*tempm->dim.total_cnt;
@@ -312,7 +312,7 @@ U0 PrsSizeOf(CCmpCtrl *cc)
if (!(tempc=cc->hash_entry) || !(tempc->type &
(HTT_CLASS|HTT_INTERNAL_TYPE|HTT_GLBL_VAR|
HTT_FUN|HTT_EXPORT_SYS_SYM)))
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
if (tempc->type&(HTT_FUN|HTT_EXPORT_SYS_SYM)) {
if (!(dbg_info=tempc(CHashFun *)->dbg_info))
LexExcept(cc,"Size not defined at ");
@@ -324,11 +324,11 @@ U0 PrsSizeOf(CCmpCtrl *cc)
while (Lex(cc)=='.') {
pu_sizeof_member:
if (!(tempc->type & (HTT_CLASS|HTT_GLBL_VAR)))
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
else if (tempc->type & HTT_GLBL_VAR)
tempc=tempc(CHashGlblVar *)->var_class;
if (Lex(cc)!=TK_IDENT || !(tempm=MemberFind(cc->cur_str,tempc)))
LexExcept(cc,"invalid member at ");
LexExcept(cc,"Invalid member at ");
else if (cc->local_var_entry)
cc->local_var_entry->use_cnt--;
tempc=tempm->member_class;
@@ -351,22 +351,22 @@ U0 PrsOffsetOf(CCmpCtrl *cc)
CMemberLst *tempm;
I64 i;
if (cc->token!=TK_IDENT)
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
if (tempm=cc->local_var_entry)
tempc=tempm->member_class;
else {
tempc=cc->hash_entry;
if (!tempc || !(tempc->type & (HTT_CLASS|HTT_GLBL_VAR)))
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
else if (tempc->type & HTT_GLBL_VAR)
tempc=tempc(CHashGlblVar *)->var_class;
}
if (Lex(cc)!='.')
LexExcept(cc,"expecting '.' at ");
LexExcept(cc,"Expecting '.' at ");
i=0;
do {
if (Lex(cc)!=TK_IDENT || !(tempm=MemberFind(cc->cur_str,tempc)))
LexExcept(cc,"invalid member at ");
LexExcept(cc,"Invalid member at ");
else if (cc->local_var_entry)
cc->local_var_entry->use_cnt--;
i+=tempm->offset;
@@ -437,13 +437,13 @@ I64 PrsFunCall(CCmpCtrl *cc,CPrsStk *ps,Bool indirect,CHashFun *tempf)
if (cc->token==',')
Lex(cc);
else if (cc->token!=';')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
} else {
if (needs_right_paren) {
if (cc->token==',')
Lex(cc);
else if (cc->token!=')')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
}
}
}
@@ -494,7 +494,7 @@ I64 PrsFunCall(CCmpCtrl *cc,CPrsStk *ps,Bool indirect,CHashFun *tempf)
if (cc->token==',')
Lex(cc);
else
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
}
COCInit(cc);
if (!PrsExpression(cc,NULL,FALSE,ps))
@@ -511,7 +511,7 @@ I64 PrsFunCall(CCmpCtrl *cc,CPrsStk *ps,Bool indirect,CHashFun *tempf)
if (cc->token==',')
Lex(cc);
else
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
}
COCInit(cc);
if (!PrsExpression(cc,NULL,FALSE,ps))
@@ -528,7 +528,7 @@ I64 PrsFunCall(CCmpCtrl *cc,CPrsStk *ps,Bool indirect,CHashFun *tempf)
if (cc->token==')')
Lex(cc);
else
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
}
tempcbh1=tempcbh->coc_next;
tempcbh->coc_next=cc->coc.coc_next;
@@ -622,8 +622,7 @@ I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
if (Bt(&tempf->flags,Cf_EXTERN)) {
if (cc->flags&CCF_AOT_COMPILE) {
if (cc->flags&CCF_ASM_EXPRESSIONS) {
if (tempex=HashFind(
tempf->str,cc->htc.hash_table_lst,
if (tempex=HashFind(tempf->str,cc->htc.hash_table_lst,
HTT_EXPORT_SYS_SYM))
goto pu_export_sys_sym;
else
@@ -634,8 +633,7 @@ I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
cc->abs_cnts.externs++;
ICAdd(cc,IC_IMM_I64,
&tempf->executable_addr,cmp.internal_types[RT_PTR]);
ICAdd(cc,IC_DEREF,0,
cmp.internal_types[RT_PTR]);
ICAdd(cc,IC_DEREF,0,cmp.internal_types[RT_PTR]);
} else {
if (cc->flags&CCF_AOT_COMPILE) {
ICAdd(cc,IC_ABS_ADDR,
@@ -673,7 +671,7 @@ I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
return PE_UNARY_TERM2;
sub_switch_start:
case TK_INTEGER:
case TK_INT:
case TK_CHAR_CONST:
case TK_INS_BIN_SIZE:
if (cc->cur_i64<0)
@@ -737,7 +735,7 @@ I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
if (!paren_warn)
*paren_prec=PREC_NULL;
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc); //skip )
cc->flags= cc->flags & ~CCF_ARRAY | CCF_RAX | CCF_PAREN;
return PE_UNARY_MODIFIERS;
@@ -782,7 +780,7 @@ I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
i=PrsPop(ps);
ps->ptr--;
if (i.u16[0]!=IC_ADDR)
LexExcept(cc,"expecting '&' at ");
LexExcept(cc,"Expecting '&' at ");
ICAdd(cc,IC_IMM_I64,tempm->offset,cmp.internal_types[RT_PTR]);
*_local_var=tempm;
Lex(cc);
@@ -805,7 +803,7 @@ I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
pu_ident_but_not_local_var:
if (!(tempex=cc->hash_entry)) {
if (!(cc->flags & CCF_ASM_EXPRESSIONS))
LexExcept(cc,"invalid lval at ");
LexExcept(cc,"Invalid lval at ");
tempc=NULL;
pu_new_sys_sym:
tempex=CAlloc(sizeof(CHashExport),Fs->code_heap);
@@ -912,7 +910,7 @@ pu_export_sys_sym:
PrsSizeOf(cc);
while (j--) {
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc);
}
return PE_MAYBE_MODIFIERS;
@@ -925,7 +923,7 @@ pu_export_sys_sym:
PrsOffsetOf(cc);
while (j--) {
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc);
}
return PE_MAYBE_MODIFIERS;
@@ -943,14 +941,14 @@ pu_export_sys_sym:
Lex(cc);
while (j--) {
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc);
}
return PE_MAYBE_MODIFIERS;
}
}
}
LexExcept(cc,"missing expression at ");
LexExcept(cc,"Missing expression at ");
}
I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
@@ -987,10 +985,10 @@ I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
if (!(cc->flags & CCF_RAX))
tempc--;
if (!(tempc->type & HTT_CLASS))
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
if (Lex(cc)!=TK_IDENT ||
!(tempm=MemberFind(cc->cur_str,tempc)))
LexExcept(cc,"invalid member at ");
LexExcept(cc,"Invalid member at ");
else if (cc->local_var_entry)
cc->local_var_entry->use_cnt--;
Lex(cc); //skip member name
@@ -1017,7 +1015,7 @@ I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
if (!*unary_post_prec)
*unary_post_prec=PREC_TERM;
if (Lex(cc)!=TK_IDENT)
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
if (Btr(&cc->flags,CCf_FUN_EXP))
ps->ptr2--;
cc->flags&=~CCF_ARRAY;
@@ -1044,7 +1042,7 @@ I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
tempi->ic_class=tempc;
ICAdd(cc,IC_HOLYC_TYPECAST,was_paren,tempc);
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc);
return PE_UNARY_MODIFIERS;
case '[':
@@ -1053,11 +1051,11 @@ I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
Lex(cc);
tempc=OptClassFwd(cc->coc.coc_root.last->ic_class);
if (!tempc->ptr_stars_cnt)
LexExcept(cc,"not array or ptr ");
LexExcept(cc,"Not array or ptr ");
if (!(cc->flags & (CCF_ARRAY | CCF_RAX))) {
tempc=OptClassFwd(tempc-1);
if (!tempc->ptr_stars_cnt)
LexExcept(cc,"not array or ptr ");
LexExcept(cc,"Not array or ptr ");
ICAdd(cc,IC_DEREF+PREC_UNARY_PRE<<16,0,tempc);
}
tempc1=tempc-1;
@@ -1069,7 +1067,7 @@ I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
throw('Compiler');
cc->flags=cc->flags&~CCF_FUN_EXP|old_flags&CCF_FUN_EXP;
if (cc->token!=']')
LexExcept(cc,"missing ']' at ");
LexExcept(cc,"Missing ']' at ");
Lex(cc); //skip ]
tempi1=cc->coc.coc_root.last;
tempi1->ic_flags|=ICF_R_TO_INT;
@@ -1085,7 +1083,7 @@ I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
throw('Compiler');
cc->flags=cc->flags&~CCF_FUN_EXP|old_flags&CCF_FUN_EXP;
if (cc->token!=']')
LexExcept(cc,"missing ']' at ");
LexExcept(cc,"Missing ']' at ");
Lex(cc); //skip ]
tempi1=cc->coc.coc_root.last;
tempi1->ic_flags|=ICF_R_TO_INT;
+50 -50
View File
@@ -2,7 +2,7 @@ CHashClass *PrsClass(CCmpCtrl *cc,I64 keyword,I64 fsp_flags,Bool is_extern)
{
CHashClass *tempc,*base_class;
if (cc->token!=TK_IDENT)
LexExcept(cc,"expecting identifier at ");
LexExcept(cc,"Expecting identifier at ");
if (is_extern) {
tempc=PrsClassNew;
tempc->str=cc->cur_str;
@@ -50,7 +50,7 @@ CHashClass *PrsClass(CCmpCtrl *cc,I64 keyword,I64 fsp_flags,Bool is_extern)
if (Lex(cc)==':') {
if (Lex(cc)!=TK_IDENT || !(base_class=cc->hash_entry) ||
!(base_class->type&HTT_CLASS))
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
if (Lex(cc)==',')
LexExcept(cc,"Only one base class allowed at this time at ");
tempc->base_class=base_class;
@@ -91,7 +91,7 @@ CHashFun *PrsFunJoin(CCmpCtrl *cc,
} else
tempf=NULL;
if (tempf) {
tempf->used_reg_mask=REGG_C_CLOBBERED+REGG_SAVED+REGG_C_TEMP_CLOBBERED;
tempf->used_reg_mask=REGG_CLOBBERED+REGG_SAVED+REGG_STK_TEMP;
Free(tempf->src_link);
tempf->src_link=NULL;
Free(tempf->index);
@@ -100,8 +100,8 @@ CHashFun *PrsFunJoin(CCmpCtrl *cc,
MemberLstDel(tempf);
} else {
tempf=PrsFunNew;
tempf->used_reg_mask=REGG_C_CLOBBERED+REGG_SAVED+REGG_C_TEMP_CLOBBERED;
tempf->clobbered_reg_mask=REGG_C_CLOBBERED+REGG_C_TEMP_CLOBBERED;
tempf->used_reg_mask=REGG_CLOBBERED+REGG_SAVED+REGG_STK_TEMP;
tempf->clobbered_reg_mask=REGG_CLOBBERED+REGG_STK_TEMP;
tempf->str=name;
if (cc->flags&CCF_AOT_COMPILE)
tempf->executable_addr=aotc->ip;
@@ -214,9 +214,8 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tempc,
while (TRUE) {
tempc=PrsType(cc,&saved_tempc,&saved_mode,NULL,&st,
&tempf_fun_ptr,&tempex,&tempad,fsp_flags);
if (!st)
return;
if (!st) return;
if (tempad.next)
is_array=TRUE;
else if (tempad.total_cnt<0) {
@@ -228,7 +227,7 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tempc,
val=saved_val;
mode=saved_mode;
if (tempex && mode&255==PRS0_EXTERN && !(cc->flags&CCF_AOT_COMPILE) &&
tempex->type & HTT_EXPORT_SYS_SYM) {
tempex->type&HTT_EXPORT_SYS_SYM) {
val=tempex->val;
mode=PRS0__EXTERN|PRS1_NULL;
}
@@ -352,7 +351,7 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tempc,
tempg->type=HTT_GLBL_VAR | HTF_EXPORT;
if (tempex && tempex->type & HTT_GLBL_VAR)
has_alias=TRUE;
if (sys_var_init_flag&1)
if (sys_var_init_flag)
for (k=0;k<j;k++)
AOTStoreCodeU8(cc,sys_var_init_val);
else
@@ -373,7 +372,7 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tempc,
tempex->type&HTF_UNRESOLVED &&
MHeapCtrl(tempex)==MHeapCtrl(tempg))
has_alias=TRUE;
if (sys_var_init_flag&1)
if (sys_var_init_flag)
MemSet(tempg->data_addr,sys_var_init_val,j);
}
}
@@ -413,14 +412,14 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tempc,
if (temphg)
temphg->size=tempg->size;
if (cc->flags&CCF_AOT_COMPILE) {
if (sys_var_init_flag&1)
if (sys_var_init_flag)
for (k=0;k<tempg->size;k++)
AOTStoreCodeU8(cc,sys_var_init_val);
else
for (k=0;k<tempg->size;k++)
AOTStoreCodeU8(cc,0);
} else
if (sys_var_init_flag&1)
if (sys_var_init_flag)
MemSet(tempg->data_addr,sys_var_init_val,k);
LexPopRestore(cc);
}
@@ -445,7 +444,7 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tempc,
Lex(cc);
else {
if (cc->token!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc);
return;
}
@@ -458,12 +457,12 @@ U0 PrsIf(CCmpCtrl *cc,I64 try_cnt,CCodeMisc *lb_break)
CCodeMisc *lb,*lb1;
I64 k;
if (cc->token!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
Lex(cc);
if (!PrsExpression(cc,NULL,FALSE))
throw('Compiler');
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc);
lb=COCMiscNew(cc,CMT_LABEL);
ICAdd(cc,IC_BR_ZERO,lb,0);
@@ -484,14 +483,14 @@ U0 PrsWhile(CCmpCtrl *cc,I64 try_cnt)
{
CCodeMisc *lb,*lb_done;
if (cc->token!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
Lex(cc);
lb=COCMiscNew(cc,CMT_LABEL);
ICAdd(cc,IC_LABEL,lb,0);
if (!PrsExpression(cc,NULL,FALSE))
throw('Compiler');
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc);
lb_done=COCMiscNew(cc,CMT_LABEL);
ICAdd(cc,IC_BR_ZERO,lb_done,0);
@@ -508,18 +507,18 @@ U0 PrsDoWhile(CCmpCtrl *cc,I64 try_cnt)
ICAdd(cc,IC_LABEL,lb,0);
PrsStmt(cc,try_cnt,lb_done);
if (PrsKeyWord(cc)!=KW_WHILE)
LexExcept(cc,"missing 'while' at");
LexExcept(cc,"Missing 'while' at");
if (Lex(cc)!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
Lex(cc);
if (!PrsExpression(cc,NULL,FALSE))
throw('Compiler');
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
ICAdd(cc,IC_BR_NOT_ZERO,lb,0);
ICAdd(cc,IC_LABEL,lb_done,0);
if (Lex(cc)!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc);
}
@@ -529,7 +528,7 @@ U0 PrsFor(CCmpCtrl *cc,I64 try_cnt)
CCodeMisc *lb,*lb_done;
if (cc->token!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
Lex(cc);
PrsStmt(cc,try_cnt);
@@ -540,7 +539,7 @@ U0 PrsFor(CCmpCtrl *cc,I64 try_cnt)
lb_done=COCMiscNew(cc,CMT_LABEL);
ICAdd(cc,IC_BR_ZERO,lb_done,0);
if (cc->token!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc);
COCPush(cc);
@@ -551,7 +550,7 @@ U0 PrsFor(CCmpCtrl *cc,I64 try_cnt)
tempcbh=COCPopNoFree(cc);
COCPop(cc);
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc);
PrsStmt(cc,try_cnt,lb_done);
@@ -586,7 +585,7 @@ U0 PrsSwitch(CCmpCtrl *cc,I64 try_cnt)
else if (cc->token=='[')
nobound=TRUE;
else
LexExcept(cc,"expecting '(' or '[' at ");
LexExcept(cc,"Expecting '(' or '[' at ");
Lex(cc);
QueInit(&root);
@@ -605,14 +604,14 @@ U0 PrsSwitch(CCmpCtrl *cc,I64 try_cnt)
if (nobound) {
ICAdd(cc,IC_NOBOUND_SWITCH,mc_jt,0);
if (cc->token!=']')
LexExcept(cc,"missing ']' at ");
LexExcept(cc,"Missing ']' at ");
} else {
ICAdd(cc,IC_SWITCH,mc_jt,0);
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
}
if (Lex(cc)!='{')
LexExcept(cc,"expecting '{' at ");
LexExcept(cc,"Expecting '{' at ");
Lex(cc);
ICAdd(cc,IC_LABEL,mc_jt->begin,0);
while (TRUE) {
@@ -625,7 +624,7 @@ sw_cont:
if (Lex(cc)==':')
Lex(cc);
else
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
tempss=MAlloc(sizeof(CSubSwitch));
QueIns(tempss,root.last);
root.last->lb_break=COCMiscNew(cc,CMT_LABEL);
@@ -707,10 +706,11 @@ sw_cont:
temps->next=header;
header=temps;
}
k_start=k_end;
} else
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
} else
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
break;
case KW_DFT:
if (root.next!=&root) {
@@ -722,7 +722,7 @@ sw_cont:
if (cc->token==':')
Lex(cc);
else
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
if (root.next!=&root) {
tempss=root.next;
while (tempss!=&root) {
@@ -743,18 +743,18 @@ sw_sub_end:
ICAdd(cc,IC_LABEL,tempss->lb_break,0);
if (tempss==&root) {
if (cc->token!='}')
LexExcept(cc,"missing '}' at ");
LexExcept(cc,"Missing '}' at ");
Lex(cc);
break;
} else {
QueRem(tempss);
Free(tempss);
if (PrsKeyWord(cc)!=KW_SUB_SWITCH_END)
LexExcept(cc,"missing 'sub_switch_end' at ");
LexExcept(cc,"Missing 'sub_switch_end' at ");
if (Lex(cc)==':')
Lex(cc);
else
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
}
}
if (!dft_found)
@@ -789,12 +789,12 @@ U0 PrsNoUnusedWarn(CCmpCtrl *cc)
CMemberLst *tempm;
while (cc->token==TK_IDENT) {
if (!(tempm=cc->local_var_entry))
LexExcept(cc,"expecting local var at ");
LexExcept(cc,"Expecting local var at ");
tempm->flags|=MLF_NO_UNUSED_WARN;
if (Lex(cc)==',')
Lex(cc);
else if (cc->token!=';')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
}
}
@@ -817,7 +817,7 @@ U0 PrsStreamBlk(CCmpCtrl *cc)
if (cc->token=='{')
Lex(cc);
else
LexExcept(cc,"missing '}' at ");
LexExcept(cc,"Missing '}' at ");
while (cc->token && cc->token!='}')
ExeCmdLine(cc);
@@ -888,7 +888,7 @@ U0 PrsTryBlk(CCmpCtrl *cc,I64 try_cnt)
ICAdd(cc,IC_JMP,lb_done,0);
if (PrsKeyWord(cc)!=KW_CATCH)
LexExcept(cc,"missing 'catch' at");
LexExcept(cc,"Missing 'catch' at");
Lex(cc);
ICAdd(cc,IC_LABEL,lb_catch,0);
@@ -995,26 +995,26 @@ Bool PrsStmt(CCmpCtrl *cc,I64 try_cnt=0,
if (cc->flags&CCF_AOT_COMPILE) {
if (cc->token!=TK_IDENT || !(tempex=cc->hash_entry) ||
!(tempex->type & HTT_EXPORT_SYS_SYM))
LexExcept(cc,"expecting System sym at ");
LexExcept(cc,"Expecting System sym at ");
i=tempex->val;
Lex(cc);
} else
i=LexExpressionI64(cc);
if (cc->token!=TK_IDENT || !(tempex=cc->hash_entry) ||
!(tempex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
Lex(cc);
PrsGlblVarLst(cc,PRS0__EXTERN|PRS1_NULL,tempex,i,fsp_flags);
break;
case KW__IMPORT:
sm_underscore_import:
if (cc->token!=TK_IDENT)
LexExcept(cc,"expecting System sym at ");
LexExcept(cc,"Expecting System sym at ");
import_name=cc->cur_str;
cc->cur_str=0;
if (Lex(cc)!=TK_IDENT || !(tempex=cc->hash_entry) ||
!(tempex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
Lex(cc);
PrsGlblVarLst(cc,PRS0__IMPORT|PRS1_NULL,tempex,
import_name,FALSE);
@@ -1022,7 +1022,7 @@ sm_underscore_import:
break;
case KW_EXTERN:
if (cc->token!=TK_IDENT)
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
tempex=cc->hash_entry;
i=PrsKeyWord(cc);
if (i==KW_CLASS||i==KW_UNION) {
@@ -1033,7 +1033,7 @@ sm_underscore_import:
}
if (!tempex ||
!(tempex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
if (Bt(&cc->opts,OPTf_EXTERNS_TO_IMPORTS))
goto sm_import;
Lex(cc);
@@ -1042,7 +1042,7 @@ sm_underscore_import:
case KW_IMPORT:
if (cc->token!=TK_IDENT || !(tempex=cc->hash_entry) ||
!(tempex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
sm_import:
Lex(cc);
PrsGlblVarLst(cc,PRS0_IMPORT|PRS1_NULL,tempex,0,FALSE);
@@ -1051,7 +1051,7 @@ sm_import:
i=LexExpressionI64(cc);
if (cc->token!=TK_IDENT || !(tempex=cc->hash_entry) ||
!(tempex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
Lex(cc);
PrsGlblVarLst(cc,PRS0__INTERN|PRS1_NULL,tempex,i,fsp_flags);
break;
@@ -1115,7 +1115,7 @@ sm_import:
goto sm_semicolon;
case KW_GOTO:
if (Lex(cc)!=TK_IDENT)
LexExcept(cc,"expecting identifier at ");
LexExcept(cc,"Expecting identifier at ");
if (!(g_lb=COCGoToLabelFind(cc,cc->cur_str))) {
g_lb=COCMiscNew(cc,CMT_GOTO_LABEL);
g_lb->str=cc->cur_str;
@@ -1188,7 +1188,7 @@ sm_not_keyword_afterall:
if (Lex(cc)==':') //skip cur_str
Lex(cc); //skip colon
else
LexExcept(cc,"undefined identifier at ");
LexExcept(cc,"Undefined identifier at ");
if (!cc->htc.fun)
LexExcept(cc,"No global labels at ");
if (cc->token!=',') goto sm_done;
@@ -1205,7 +1205,7 @@ sm_semicolon:
if (cc->token==';')
Lex(cc);
else if (cc->token!=',')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
}
if (cc->token!=',') goto sm_done;
} else
+17 -17
View File
@@ -13,7 +13,7 @@ U0 PrsVarInit(CCmpCtrl *cc,U8 **_dst,CHashClass *tempc,CArrayDim *tempad,
tempc=OptClassFwd(tempc);
if (tempm=tempc->member_lst_and_root) {
if (cc->token!='{')
LexExcept(cc,"expecting '{' at ");
LexExcept(cc,"Expecting '{' at ");
LexPopNoRestore(cc);
LexPush(cc);
Lex(cc);
@@ -26,7 +26,7 @@ U0 PrsVarInit(CCmpCtrl *cc,U8 **_dst,CHashClass *tempc,CArrayDim *tempad,
}
LexPopNoRestore(cc);
if (cc->token!='}')
LexExcept(cc,"missing '}' at ");
LexExcept(cc,"Missing '}' at ");
Lex(cc);
} else {
if (tempc->ptr_stars_cnt==1 &&
@@ -278,7 +278,7 @@ Bool PrsArrayDims(CCmpCtrl *cc,I64 mode,CArrayDim *dim)
tempad->total_cnt=1;
dim->total_cnt*=j;
if (cc->token!=']')
LexExcept(cc,"missing ']' at ");
LexExcept(cc,"Missing ']' at ");
} while (Lex(cc)=='[');
}
return result;
@@ -296,7 +296,7 @@ CHashClass *PrsType(CCmpCtrl *cc,CHashClass **_tempc1,
pt_start:
if (!tempc1 || !(tempc1->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
ptr_stars_cnt=0;
while (cc->token=='*') {
@@ -323,7 +323,7 @@ CHashClass *PrsType(CCmpCtrl *cc,CHashClass **_tempc1,
if (cc->token=='(') {
if (Lex(cc)!='*')
LexExcept(cc,"expecting '*' at ");
LexExcept(cc,"Expecting '*' at ");
ptr_stars_cnt=1; //fun_ptr
while (Lex(cc)=='*')
ptr_stars_cnt++; //fun_ptr
@@ -346,15 +346,15 @@ CHashClass *PrsType(CCmpCtrl *cc,CHashClass **_tempc1,
*_ident=StrNew("_anon_");
tempm->flags|=MLF_NO_UNUSED_WARN;
} else
LexExcept(cc,"expecting identifier at ");
LexExcept(cc,"Expecting identifier at ");
}
}
if (ptr_stars_cnt>=0) { //fun_ptr
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
if (Lex(cc)!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
fun_ptr=PrsFunJoin(cc,tempc1,NULL,fsp_flags)+ptr_stars_cnt;
tempc1=cmp.internal_types[RT_PTR]+ptr_stars_cnt;
}
@@ -437,7 +437,7 @@ U0 PrsVarLst(CCmpCtrl *cc,CHashClass *tempc,I64 mode,I64 union_base=0)
cc->class_ip=tempc->size;
while (cc->token=='$$') {
if (Lex(cc)!='=') //skip $$
LexExcept(cc,"expecting '=' at ");
LexExcept(cc,"Expecting '=' at ");
Lex(cc); //skip =
cc->class_ip=LexExpression(cc);
if (-cc->class_ip>tempc->neg_offset)
@@ -447,7 +447,7 @@ U0 PrsVarLst(CCmpCtrl *cc,CHashClass *tempc,I64 mode,I64 union_base=0)
else
tempc->size=cc->class_ip;
if (cc->token!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc); //skip ;
}
if (cc->token==')' || cc->token=='}') {
@@ -482,14 +482,14 @@ pvl_restart1:
else
temph=NULL;
if (!temph)
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
k=PrsKeyWord(cc);
if (k==KW_UNION) {
Lex(cc);
PrsVarLst(cc,tempc,mode|PRSF_UNION,tempc->size);
} else {
if (!(temph->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
first=TRUE;
pvl_restart2:
tempc1=temph;
@@ -555,7 +555,7 @@ pvl_restart3:
if (cc->flags&CCF_AOT_COMPILE) {
tempm->static_data_ip=cc->aotc->ip;
k>>=3;
if (sys_var_init_flag&1) {
if (sys_var_init_flag) {
k<<=3;
while (k--)
AOTStoreCodeU8(cc,sys_var_init_val);
@@ -563,7 +563,7 @@ pvl_restart3:
while (k--)
AOTStoreCodeU64(cc,0);
} else
if (sys_var_init_flag&1)
if (sys_var_init_flag)
MemSet(tempm->static_data,sys_var_init_val,k);
LexPopNoRestore(cc);
if (cc->token=='=') {
@@ -579,7 +579,7 @@ pvl_restart3:
k=(i+7)&~7;
if (cc->flags&CCF_AOT_COMPILE) {
k>>=3;
if (sys_var_init_flag&1) {
if (sys_var_init_flag) {
k<<=3;
while (k--)
AOTStoreCodeU8(cc,sys_var_init_val);
@@ -587,7 +587,7 @@ pvl_restart3:
while (k--)
AOTStoreCodeU64(cc,0);
} else
if (sys_var_init_flag&1)
if (sys_var_init_flag)
MemSet(tempm->static_data,sys_var_init_val,k);
LexPopRestore(cc);
}
@@ -724,7 +724,7 @@ pvl_restart3:
goto pvl_done;
break;
default:
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
}
}
}
+23 -27
View File
@@ -1,4 +1,4 @@
I64 InstEntriesCompare(CInstruction *tempi1,CInstruction *tempi2)
I64 InstEntriesCompare(CInst *tempi1,CInst *tempi2)
{
I64 i1,i2,j=0,result=0,oc_cnt1=tempi1->opcode_cnt,oc_cnt2=tempi2->opcode_cnt;
if (tempi1->flags&IEF_STI_LIKE)
@@ -44,9 +44,9 @@ I64 InstEntriesCompare(CInstruction *tempi1,CInstruction *tempi2)
}
/*
U0 DumpUAsmIns(CInstruction *tempi)
U0 DumpUAsmIns(CInst *tempi)
{
CHashOpcode *tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInstruction)
CHashOpcode *tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInst)
-offset(CHashOpcode.ins);
"%10s:%02d,%02d SV:%02d\n",tempo->str,
tempi->arg1,tempi->arg2,tempi->slash_val;
@@ -63,10 +63,10 @@ U0 DumpUAsmTables()
}
*/
CInstruction *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
CInst *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
{//Binary Search
I64 i,j,n,m,k,a1,a2,o1,o2,oc_cnt;
CInstruction *tempi,**table;
CInst *tempi,**table;
i=0;
if (seg_size==64) {
table=uasm.table_64;
@@ -123,7 +123,9 @@ CInstruction *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
tempi->flags&IEF_48_REX)
m=-1;
}
}
} else if ((Bt(&uasm.mem_arg_mask,a1)||Bt(&uasm.mem_arg_mask,a2)) &&
ip[n]&0xC0==0xC0)
m=1;
goto ief_compare_done;
case SV_I_REG:
m=ip[n]>>3-tempi->opcode[tempi->opcode_cnt-1]>>3;
@@ -147,10 +149,8 @@ CInstruction *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
}
}
if (opsize==64 || a1==ARGT_M64 || a2==ARGT_M64) {
if (!Bt(&uasm.ins64_arg_mask,a1) &&
!Bt(&uasm.ins64_arg_mask,a2) &&
!(tempi->flags&IEF_48_REX)&&
!(a2==ARGT_NO &&
if (!Bt(&uasm.ins64_arg_mask,a1) &&!Bt(&uasm.ins64_arg_mask,a2) &&
!(tempi->flags&IEF_48_REX)&& !(a2==ARGT_NO &&
(ARGT_UIMM8<=a1<=ARGT_UIMM64 || ARGT_IMM8<=a1<=ARGT_IMM64)))
m=1;
else if (tempi->arg2==ARGT_IMM64 || tempi->arg2==ARGT_UIMM64) {
@@ -188,7 +188,7 @@ ief_compare_done:
U0 UAsmHashLoad()
{
CHashOpcode *temph;
CInstruction *tempi;
CInst *tempi;
I64 i,j1,j2,k;
uasm.ins64_arg_mask=0x0880888880+1<<ARGT_ST0+1<<ARGT_STI;
@@ -200,9 +200,9 @@ U0 UAsmHashLoad()
for (i=0;i<=cmp.asm_hash->mask;i++) {
temph=cmp.asm_hash->body[i];
while (temph) {
if (temph->type==HTT_OPCODE) {
if (temph->type==HTT_OPCODE && !(temph->oc_flags&OCF_ALIAS)) {
tempi=&temph->ins;
for (k=0;k<temph->instruction_entry_cnt;k++) {
for (k=0;k<temph->inst_entry_cnt;k++) {
uasm.table_16_32_entries++;
if (!(tempi->flags&IEF_NOT_IN_64_BIT))
uasm.table_64_entries++;
@@ -219,9 +219,9 @@ U0 UAsmHashLoad()
for (i=0;i<=cmp.asm_hash->mask;i++) {
temph=cmp.asm_hash->body[i];
while (temph) {
if (temph->type==HTT_OPCODE) {
if (temph->type==HTT_OPCODE && !(temph->oc_flags&OCF_ALIAS)) {
tempi=&temph->ins;
for (k=0;k<temph->instruction_entry_cnt;k++) {
for (k=0;k<temph->inst_entry_cnt;k++) {
uasm.table_16_32[j1++]=tempi;
if (!(tempi->flags&IEF_NOT_IN_64_BIT))
uasm.table_64[j2++]=tempi;
@@ -236,14 +236,14 @@ U0 UAsmHashLoad()
}
U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
{//Unassembles one instruction
{//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,
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;
CInstruction *tempi,*tempi2;
CInst *tempi,*tempi2;
CHashOpcode *tempo;
U8 *ip=*_ip,*ptr,*reloced_a1_st,*reloced_a2_st,
*bin_data_area1,*bin_data_area2,
@@ -328,14 +328,13 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
tempi=InstEntryFind(ip,opsize,seg_size);
if (opsize==32 && seg_size==64) {
tempi2=InstEntryFind(ip,64,seg_size);
if (tempi2!=tempi &&
tempi2->flags&IEF_REX_ONLY_R8_R15 ||
if (tempi2!=tempi && tempi2->flags&IEF_REX_ONLY_R8_R15 ||
tempi2->flags&IEF_REX_XOR_LIKE&& ip[1]>>3&7==ip[1]&7)
tempi=tempi2;
}
ip+=tempi->opcode_cnt;
tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInstruction)
tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInst)
-offset(CHashOpcode.ins);
if (just_ins)
*line1=0;
@@ -393,12 +392,9 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
}
}
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) {
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;
@@ -647,7 +643,7 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
}
U8 *U(U8 *ip,I64 cnt=20,I64 seg_size=64)
{//Unassembles a num of instructions.
{//Unassembles a num of insts.
I64 i;
U8 buf[1024];
if (seg_size==16)