TempleOSCD_150720.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:46:22 +02:00
1 parent 401601816c
commit f8c05f98f4
554 files changed
+26046 -24853

No files matched your search

+453 -831
View File
File diff suppressed because it is too large. Load diff
+200
View File
@@ -0,0 +1,200 @@
U0 AsmPrsInsFlags(CCmpCtrl *cc,CInstruction *tempi)
{
I64 i;
while (TRUE) {
switch (cc->token) {
case TK_IDENT:
if ((i=DefineMatch(cc->cur_str,"ST_OPCODE_MODIFIERS"))>=0) {
tempi->opcode_modifier=i;
break;
} else
return;
case TK_INTEGER:
if (cc->cur_i64==16)
tempi->flags|=IEF_OP_SIZE16;
else if (cc->cur_i64==32)
tempi->flags|=IEF_OP_SIZE32;
else
return;
break;
case '+':
tempi->flags|=IEF_PLUS_OPCODE;
case '/':
if (Lex(cc)==TK_INTEGER && cc->cur_i64<8)
tempi->slash_val=cc->cur_i64;
else if (cc->token==TK_IDENT) {
if (!StrCmp(cc->cur_str,"R"))
tempi->slash_val=SV_R_REG;
else if (!StrCmp(cc->cur_str,"I"))
tempi->slash_val=SV_I_REG;
else
return;
} else
return;
break;
case '!': tempi->flags|=IEF_DONT_SWITCH_MODES; break;
case '&': tempi->flags|=IEF_DFT; break;
case '%': tempi->flags|=IEF_NOT_IN_64_BIT; break;
case '=': tempi->flags|=IEF_48_REX; break;
case '`': tempi->flags|=IEF_REX_ONLY_R8_R15; break;
case '^': tempi->flags|=IEF_REX_XOR_LIKE; break;
case ':': tempi->flags|=IEF_STI; break;
case '$$': tempi->flags|=IEF_ENDING_ZERO; break;
default:
return;
}
Lex(cc);
}
}
U0 AsmHashLoad()
{//See $LK,"::/Compiler/OpCodes.TXT.Z"$.
I64 i,j,size,size1;
CInternalType *tempit;
CCmpCtrl *cc;
CHashGeneric *temph;
CHashReg *tempr;
CHashOpcode *tempo,*tempo1;
CInstruction *tempi;
CHashClass *tempc;
cmp.size_arg_mask[0]=0x3FF0FFFFFE;
cmp.size_arg_mask[1]=0x1110111112;
cmp.size_arg_mask[2]=0x2220222224;
cmp.size_arg_mask[4]=0x0440444448;
cmp.size_arg_mask[8]=0x0880888880;
cmp.asm_hash=HashTableNew(1024);
size1=offset(CHashOpcode.ins)+sizeof(CInstruction)<<5;
tempo=MAlloc(size1);
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 ");
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 Statement");
Lex(cc); //skip keyword
if (cc->token!=TK_IDENT)
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;
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++;
tempi->slash_val=SV_NONE; //Not zero!!
while (cc->token==TK_INTEGER) {
tempi->opcode[tempi->opcode_cnt++]=cc->cur_i64;
Lex(cc);
}
if (cc->token==',')
Lex(cc);
else if (cc->token!=';')
LexExcept(cc,"expecting ',' at ");
AsmPrsInsFlags(cc,tempi);
tempi->arg1=tempi->arg2=tempi->size1=tempi->size2=0;
if (cc->token==TK_IDENT) {
j=DefineMatch(cc->cur_str,"ST_ARG_TYPES");
tempi->arg1=j;
if (Bt(&cmp.size_arg_mask[1],j))
tempi->size1=8;
else if (Bt(&cmp.size_arg_mask[2],j))
tempi->size1=16;
else if (Bt(&cmp.size_arg_mask[4],j))
tempi->size1=32;
else if (Bt(&cmp.size_arg_mask[8],j))
tempi->size1=64;
if (Lex(cc)==TK_IDENT) {
j=DefineMatch(cc->cur_str,"ST_ARG_TYPES");
Lex(cc);
tempi->arg2=j;
if (Bt(&cmp.size_arg_mask[1],j))
tempi->size2=8;
else if (Bt(&cmp.size_arg_mask[2],j))
tempi->size2=16;
else if (Bt(&cmp.size_arg_mask[4],j))
tempi->size2=32;
else if (Bt(&cmp.size_arg_mask[8],j))
tempi->size2=64;
}
}
}
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))
LexExcept(cc,"Duplicate OPCODE entry ");
HashAdd(tempo1,cmp.asm_hash);
break;
case 9: //KEYWORD
case 10: //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 ");
temph->user_data0=cc->cur_i64;
if (i==9)
temph->type=HTT_KEYWORD;
else
temph->type=HTT_ASM_KEYWORD;
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");
Lex(cc); //Skip ';'
}
Free(tempo);
CmpCtrlDel(cc);
for (i=0;i<NUM_INTERNAL_TYPES;i++) {
tempit=&internal_types_table[i];
tempc=PrsClassNew;
tempc->type=HTT_INTERNAL_TYPE;
tempc->raw_type=tempit->type;
Bts(&tempc->flags,Cf_INTERNAL_TYPE);
tempc->size=tempit->size;
tempc->str=AStrNew(tempit->name);
HashAdd(tempc,cmp.asm_hash);
cmp.internal_types[tempc->raw_type]=tempc;
}
adam_task->hash_table->next=cmp.asm_hash;
}
+177
View File
@@ -0,0 +1,177 @@
U0 AOTStoreCodeU8(CCmpCtrl *cc,U8 b)
{
CAOTCtrl *aotc=cc->aotc;
I64 i=aotc->ip>>AOT_BIN_BLK_BITS;
CAOTBinBlk *tempbin=aotc->bin;
while (i--)
if (!(tempbin=tempbin->next)) {
i=aotc->ip>>AOT_BIN_BLK_BITS+1;
tempbin=&aotc->bin;
while (i--) {
if (!tempbin->next)
tempbin->next=CAlloc(sizeof(CAOTBinBlk));
tempbin=tempbin->next;
}
break;
}
tempbin->body[aotc->ip++ & (AOT_BIN_BLK_SIZE-1)]=b;
if (aotc->lst) {
if (aotc->lst_col>=24) {
'\n';
aotc->lst_col=0;
}
"%02X ",b;
aotc->lst_col+=3;
}
if (aotc->ip>aotc->num_bin_U8s)
aotc->num_bin_U8s=aotc->ip;
}
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;
U32 *_d;
CAOTBinBlk *tempbin;
if (i!=j)
for (i=0;i<sizeof(U32);i++)
AOTStoreCodeU8(cc,d.u8[i]);
else {
tempbin=aotc->bin;
while (i--)
if (!(tempbin=tempbin->next)) {
i=aotc->ip>>AOT_BIN_BLK_BITS+1;
tempbin=&aotc->bin;
while (i--) {
if (!tempbin->next)
tempbin->next=CAlloc(sizeof(CAOTBinBlk));
tempbin=tempbin->next;
}
break;
}
_d=tempbin->body+ aotc->ip&(AOT_BIN_BLK_SIZE-1);
*_d=d;
aotc->ip+=sizeof(U32);
if (aotc->lst) {
if (aotc->lst_col>=24) {
'\n';
aotc->lst_col=0;
}
"%08X ",d;
aotc->lst_col+=9;
}
if (aotc->ip>aotc->num_bin_U8s)
aotc->num_bin_U8s=aotc->ip;
}
}
U0 AOTStoreCodeU64(CCmpCtrl *cc,U64 q)
{
CAOTCtrl *aotc=cc->aotc;
I64 i=aotc->ip>>AOT_BIN_BLK_BITS,
j=(aotc->ip+sizeof(I64))>>AOT_BIN_BLK_BITS,
*_q;
CAOTBinBlk *tempbin;
if (i!=j)
for (i=0;i<sizeof(I64);i++)
AOTStoreCodeU8(cc,q.u8[i]);
else {
tempbin=aotc->bin;
while (i--)
if (!(tempbin=tempbin->next)) {
i=aotc->ip>>AOT_BIN_BLK_BITS+1;
tempbin=&aotc->bin;
while (i--) {
if (!tempbin->next)
tempbin->next=CAlloc(sizeof(CAOTBinBlk));
tempbin=tempbin->next;
}
break;
}
_q=tempbin->body+ aotc->ip&(AOT_BIN_BLK_SIZE-1);
*_q=q;
aotc->ip+=sizeof(I64);
if (aotc->lst) {
if (aotc->lst_col>=24) {
'\n';
aotc->lst_col=0;
}
"%016X ",q;
aotc->lst_col+=17;
}
if (aotc->ip>aotc->num_bin_U8s)
aotc->num_bin_U8s=aotc->ip;
}
}
U0 AOTStoreCodeU8At(CCmpCtrl *cc,I64 ip,...)
{
CAOTCtrl *aotc=cc->aotc;
CAOTBinBlk *tempbin;
I64 i,j;
for (j=0;j<argc;j++) {
i=ip>>AOT_BIN_BLK_BITS+1;
tempbin=&aotc->bin;
while (i--) {
if (!tempbin->next) {
tempbin->next=CAlloc(sizeof(CAOTBinBlk));
tempbin->next->next=NULL;
}
tempbin=tempbin->next;
}
tempbin->body[ip++ & (AOT_BIN_BLK_SIZE-1)]=argv[j];
}
if (ip>aotc->num_bin_U8s)
aotc->num_bin_U8s=ip;
}
I64 AsmLexExpression(CCmpCtrl *cc)
{
U8 *machine_code;
I64 result=0;
cc->asm_undef_hash=NULL;
cc->flags&=~(CCF_UNRESOLVED+CCF_LOCAL);
cc->abs_cnts=0;
if (!IsLexExpression2Bin(cc,&machine_code))
LexSkipEol(cc);
else {
if (cc->abs_cnts.externs)
LexExcept(cc,"Extern Not Allowed at ");
if (cc->flags & CCF_UNRESOLVED)
LexExcept(cc,"undefined sym at ");
result=Call(machine_code);
Free(machine_code);
}
return result;
}
U0 AsmLineLst(CCmpCtrl *cc)
{
CAOTCtrl *aotc=cc->aotc;
CLexFile *tempf=cc->lex_include_stk;
CDocEntry *doc_e=tempf->line_start,*doc_e2;
if (aotc->lst && aotc->lst_last_lfn==tempf && doc_e) {
if (doc_e2=aotc->lst_last_line) {
if (tempf->flags& LFSF_DOC) {
while (doc_e2->y<doc_e->y) {
"%h*c%08X ",24-aotc->lst_col,CH_SPACE,aotc->lst_last_ip;
aotc->lst_col=0;
doc_e2=LexPutLine(cc,doc_e2);
}
} else {
while (*doc_e2(U8 *) && doc_e2!=doc_e) {
"%h*c%08X ",24-aotc->lst_col,CH_SPACE,aotc->lst_last_ip;
aotc->lst_col=0;
doc_e2=LexPutLine(cc,doc_e2);
}
}
aotc->lst_last_line=doc_e2;
} else
aotc->lst_last_line=doc_e;
} else {
aotc->lst_last_line=NULL;
aotc->lst_last_lfn=tempf;
}
aotc->lst_last_ip=aotc->ip;
}
+217
View File
@@ -0,0 +1,217 @@
U0 AsmResolve(CCmpCtrl *cc,CAsmUnresolvedRef *tempu,U8 *label,Bool undefined)
{
CAOTImportExport *tempie;
CAsmUndefHash *tempauh;
I64 r=Call(tempu->machine_code);
if (undefined) {
tempauh=tempu->asm_undef_hash;
while (tempauh) {
if (tempauh->hash->type & HTF_UNRESOLVED) {
tempie=CAlloc(sizeof(CAOTImportExport));
tempie->next=tempauh->hash->ie_lst;
tempauh->hash->ie_lst=tempie;
tempie->ip=tempu->ip;
tempie->aot=cc->aot;
tempie->type=tempu->type;
}
tempauh=tempauh->next; //Technically, more than one won't work.
}
} else if (!(tempu->type&1)) {//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",
tempu->line_num,label);
LexExcept(cc);
}
if (tempu->U8_avail && tempu->type>IET_IMM_U8 && -124<=r<=123)
PrintWarn("could use I8 displacement at line:%04d %s %s\n",
tempu->line_num,cc->aotc->last_label,label);
}
AOTStoreCodeU8At(cc,tempu->ip,r.u8[0]);
if (tempu->type>=IET_REL_I16) {
AOTStoreCodeU8At(cc,tempu->ip+1,r.u8[1]);
if (tempu->type>=IET_REL_I32) {
AOTStoreCodeU8At(cc,tempu->ip+2,r.u8[2],r.u8[3]);
if (tempu->type>=IET_REL_I64)
AOTStoreCodeU8At(cc,tempu->ip+4,r.u8[4],r.u8[5],r.u8[6],r.u8[7]);
}
}
}
U0 AOTLocalsResolve(CCmpCtrl *cc)
{
CAOTCtrl *aotc=cc->aotc;
CAsmUnresolvedRef *tempu=aotc->local_unresolved,*tempu1;
CAsmUndefHash *tempauh;
Bool undefined;
U8 *label=NULL;
while (tempu) {
undefined=FALSE;
tempu1=tempu->next;
tempauh=tempu->asm_undef_hash;
while (tempauh) {
if (tempauh->hash->type & HTF_UNRESOLVED) {
PrintErr("undefined sym at line:%04d %s %s\n",
tempu->line_num,aotc->last_label,tempauh->hash->str);
LexExcept(cc);
}
label=tempauh->hash->str;
tempauh=tempauh->next;
}
if (!undefined)
AsmResolve(cc,tempu,label,FALSE);
Free(tempu->machine_code);
LinkedLstDel(tempu->asm_undef_hash);
Free(tempu);
tempu=tempu1;
}
HashTableDel(cc->htc.local_hash_table);
cc->htc.hash_table_lst=cc->htc.local_hash_table=HashTableNew(16);
cc->htc.local_hash_table->next=cc->htc.glbl_hash_table;
aotc->local_unresolved=NULL;
}
U0 AOTGlblsResolve(CCmpCtrl *cc,CAOT *tempaot)
{
CAOTCtrl *aotc=cc->aotc;
CHashFun *tempf;
CAsmUnresolvedRef *tempu=aotc->glbl_unresolved,*tempu1;
I64 i,j;
CAOTImportExport *tempie,*tempie1;
CAsmUndefHash *tempauh;
CHashExport *tempex;
U8 *label;
Bool undefined;
CExternUsage *tempeu,*tempeu8;
while (tempu) {
label=NULL;
undefined=FALSE;
tempu1=tempu->next;
tempauh=tempu->asm_undef_hash;
while (tempauh) {
if (tempauh->hash->type & HTF_UNRESOLVED) {
tempex=tempauh->hash;
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)) {
tempex->val=tempf->executable_addr;
tempex->type&=~HTF_UNRESOLVED;
label=tempauh->hash->str;
} else {
if (!(tempex->type & HTF_IMPORT)) {
if (cc->htc.local_var_lst) {
tempex->type|=HTF_GOTO_LABEL;
tempex->use_cnt++;
} else {
PrintErr("undefined sym at line:%04d %s\n",
tempu->line_num,tempex->str);
LexExcept(cc);
}
} else if (undefined) {
PrintErr("Two imports in same expression "
"not allowed at line:%04d %s\n",
tempu->line_num,tempex->str);
LexExcept(cc);
}
undefined=TRUE;
}
} else
label=tempauh->hash->str;
tempauh=tempauh->next;
}
AsmResolve(cc,tempu,label,undefined);
Free(tempu->machine_code);
LinkedLstDel(tempu->asm_undef_hash);
Free(tempu);
tempu=tempu1;
}
for (i=0;i<=cc->htc.glbl_hash_table->mask;i++) {
tempex=cc->htc.glbl_hash_table->body[i];
while (tempex) {
if (tempex->type & (HTF_IMPORT|HTF_GOTO_LABEL)) {
if (tempex->use_cnt && (tempie=tempex->ie_lst)) {
if (tempex->type&HTF_GOTO_LABEL)
tempie->flags|=IEF_GOTO_LABEL;
if (tempex->import_name)
tempie->str=StrNew(tempex->import_name);
else
tempie->str=StrNew(tempex->str);
do {
tempie1=tempie->next;
QueIns(tempie,tempaot->last_ie);
} while (tempie=tempie1);
tempex->ie_lst=NULL;
}
} else if (tempex->type & (HTF_EXPORT|HTF_RESOLVE)) {
if (tempex->type & HTF_UNRESOLVED) {
PrintErr("undefined sym at %s\n",tempex->str);
LexExcept(cc);
}
if (tempex->type & HTF_RESOLVE) {
tempf=tempex;
tempeu=tempf->ext_lst;
while (tempeu) {
tempeu8=tempeu->next;
j=tempf->executable_addr-(tempeu->ip+4);
AOTStoreCodeU8At(cc,tempeu->ip,j.u8[0],j.u8[1],j.u8[2],j.u8[3]);
Free(tempeu);
tempeu=tempeu8;
}
}
if (tempex->type & HTF_EXPORT) {
tempie=CAlloc(sizeof(CAOTImportExport));
tempie->type=IET_REL32_EXPORT;
if (tempex->type & HTT_FUN)
tempie->ip=tempf->executable_addr;
else if (tempex->type & HTT_GLBL_VAR)
tempie->ip=tempex(CHashGlblVar *)->data_addr_ip;
else
tempie->ip=tempex->val;
tempie->aot=cc->aot;
if (tempex->type & HTF_IMM)
tempie->type++;
tempie->str=StrNew(tempex->str);
tempie->src_link=StrNew(tempex->src_link);
QueIns(tempie,tempaot->last_ie);
}
}
tempex=tempex->next;
}
}
}
U0 AsmUnresolvedAdd(CCmpCtrl *cc,U8 *machine_code,I64 type,I64 ip,I64 rel_ip,
CAsmUndefHash *local_asm_undef_hash,CAsmUndefHash *glbl_asm_undef_hash,
I64 line_num,Bool U8_avail)
{
CAsmUnresolvedRef *tempu=MAlloc(sizeof(CAsmUnresolvedRef));
tempu->machine_code=machine_code;
tempu->type=type;
tempu->ip=ip;
tempu->rel_ip=rel_ip;
tempu->aot=cc->aot;
tempu->imm_flag=FALSE;
tempu->line_num=line_num;
tempu->U8_avail=U8_avail;
tempu->str=NULL;
if (local_asm_undef_hash) {
tempu->asm_undef_hash=local_asm_undef_hash;
tempu->next=cc->aotc->local_unresolved;
cc->aotc->local_unresolved=tempu;
} else {
tempu->asm_undef_hash=glbl_asm_undef_hash;
tempu->next=cc->aotc->glbl_unresolved;
cc->aotc->glbl_unresolved=tempu;
if (glbl_asm_undef_hash->hash->type & HTF_IMPORT) {
tempu->str=StrNew(glbl_asm_undef_hash->hash->str);
if (glbl_asm_undef_hash->hash->type & HTF_IMM)
tempu->imm_flag=TRUE;
}
}
}
+125 -71
View File
@@ -10,7 +10,7 @@ U0 ICAddEct(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
SwapI64(&d2,&d3);
}
if (t2&RT_MASK>=RT_I64 && r2!=result_reg &&
TY_REG<=t2&TY_MASK<=TY_RIP_DISP32) {
TY_REG<=t2&TY_MASK<=TY_RIP_DISP32) {
if (t1&TY_MASK==TY_REG && !(r2==r1 && TY_REG<=t2&TY_MASK<=TY_SIB))
result_reg=r1;
ICMov(tempi,TY_REG+RT_I64,result_reg,0,t3,r3,d3,ip);
@@ -75,7 +75,7 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
else
i=0x48;
if (!d &&
(op.u8[0]==0x03||op.u8[0]==0x2B||op.u8[0]==0x33||op.u8[0]==0x0B))
(op.u8[0]==0x03||op.u8[0]==0x2B||op.u8[0]==0x33||op.u8[0]==0x0B))
return;
else if (d==1 && op.u8[0]==0x03) {
ICU24(tempi,0xC0FF00+op.u8[1]<<19+i+(r1&7)<<16);
@@ -94,7 +94,7 @@ 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)) {
!Bt(&cmp.non_ptr_vars_mask,r2)) {
i=ICModr1(r1,TY_DISP+RT_I64,r2,d);
i.u8[1]|=0x48;
ICU24(tempi,i.u8[2]<<16+0x8D00+i.u8[1]);
@@ -115,7 +115,7 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
}
if (!d &&
(op.u8[0]==0x03||op.u8[0]==0x2B||op.u8[0]==0x33||op.u8[0]==0x0B))
(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
@@ -215,8 +215,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) {
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 (!swap) {
op=0x03;
@@ -296,9 +297,10 @@ U0 ICMul(CIntermediateCode *tempi,I64 ip)
}
i=a2->disp;
if (!(tempi->ic_class->raw_type&1) &&
a2->type&TY_MASK==TY_IMM && MIN_I32<=i<=MAX_I32) {
a2->type&TY_MASK==TY_IMM && MIN_I32<=i<=MAX_I32) {
if (tempi->r.type==TY_REG+RT_I64) {
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,a1->type,a1->reg,a1->disp,ip);
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);
@@ -324,7 +326,7 @@ U0 ICMul(CIntermediateCode *tempi,I64 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) {
a1->type&RT_MASK<RT_I64) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
r2=REG_RCX;
} else
@@ -343,12 +345,14 @@ U0 ICMulEqual(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) {
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)
r=tempi->a1.reg;
else
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,ip);
if (r>7)
j=0xC0004D;
else
@@ -359,11 +363,13 @@ U0 ICMulEqual(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,tempi->a1.reg,tempi->a1.disp,
TY_REG+RT_I64,r,0,ip);
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,TY_REG+RT_I64,r,0,ip);
} else {
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,REG_RCX,0,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,REG_RCX,0,ip);
r=REG_RBX;
if (MIN_I8<=i<=MAX_I8)
ICU32(tempi,i<<24+0xDB6B48);
@@ -371,7 +377,8 @@ U0 ICMulEqual(CIntermediateCode *tempi,I64 ip)
ICU24(tempi,0xDB6948);
ICU32(tempi,i);
}
ICMov(tempi,TY_DISP+tempi->a1.type_pointed,REG_RCX,0,TY_REG+RT_I64,REG_RBX,0,ip);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed,REG_RCX,0,
TY_REG+RT_I64,REG_RBX,0,ip);
}
} else {
if (tempi->ic_class->raw_type&1)
@@ -380,26 +387,38 @@ U0 ICMulEqual(CIntermediateCode *tempi,I64 ip)
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,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);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
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,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_RBX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,ip);
}
ICU24(tempi,i);
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,TY_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);
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_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,REG_RCX,0,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
TY_DISP+tempi->a1.type_pointed,REG_RCX,0,ip);
ICU24(tempi,i);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed,REG_RCX,0,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed,REG_RCX,0,
TY_REG+RT_I64,REG_RAX,0,ip);
}
}
if (tempi->r.type&TY_MASK)
@@ -409,11 +428,15 @@ U0 ICMulEqual(CIntermediateCode *tempi,I64 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);
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);
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) {
ICZero(tempi,REG_RDX);
@@ -422,18 +445,25 @@ U0 ICDiv(CIntermediateCode *tempi,I64 ip)
ICU16(tempi,0x9948);
ICU24(tempi,0xF9F748);
}
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICDivEqual(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,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);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
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,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);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,ip);
}
if (tempi->ic_class->raw_type&1) {
ICZero(tempi,REG_RDX);
@@ -443,22 +473,27 @@ U0 ICDivEqual(CIntermediateCode *tempi,Bool is_mod,I64 ip)
ICU24(tempi,0xF9F748);
}
if (is_mod)
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,
TY_REG+RT_I64,REG_RDX,0,ip);
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,TY_REG+RT_I64,REG_RDX,0,ip);
else
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,TY_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);
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,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);
}
//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,REG_RBX,0,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,
REG_RBX,0,ip);
if (tempi->ic_class->raw_type&1) {
ICZero(tempi,REG_RDX);
ICU24(tempi,0xF1F748);
@@ -467,26 +502,34 @@ U0 ICDivEqual(CIntermediateCode *tempi,Bool is_mod,I64 ip)
ICU24(tempi,0xF9F748);
}
if (is_mod)
ICMov(tempi,TY_DISP+tempi->a1.type_pointed,REG_RBX,0,TY_REG+RT_I64,REG_RDX,0,ip);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed,REG_RBX,0,
TY_REG+RT_I64,REG_RDX,0,ip);
else
ICMov(tempi,TY_DISP+tempi->a1.type_pointed,REG_RBX,0,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed,REG_RBX,0,
TY_REG+RT_I64,REG_RAX,0,ip);
}
if (tempi->r.type&TY_MASK) {
if (is_mod)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,TY_REG+RT_I64,REG_RDX,0,ip);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_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);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_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);
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);
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) {
ICZero(tempi,REG_RDX);
@@ -495,18 +538,21 @@ U0 ICMod(CIntermediateCode *tempi,I64 ip)
ICU16(tempi,0x9948);
ICU24(tempi,0xF9F748);
}
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,TY_REG+RT_I64,REG_RDX,0,ip);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RDX,0,ip);
}
U0 ICAddSubEctEqual(CIntermediateCode *tempi,I64 type_pointed,I64 t1,I64 r1,I64 d1,
I64 t2,I64 r2,I64 d2,I64 t3,I64 r3,I64 d3,I64 op,I64 ip)
U0 ICAddSubEctEqual(CIntermediateCode *tempi,I64 type_pointed,
I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,
I64 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,r2,d2,t2&TY_MASK+type_pointed,r2,d2,d3,op,ip);
t2&TY_MASK+type_pointed,r2,d2,t2&TY_MASK+
type_pointed,r2,d2,d3,op,ip);
if (t1&TY_MASK)
ICMov(tempi,t1,r1,d1,t2&TY_MASK+type_pointed,r2,d2,ip);
return;
@@ -514,7 +560,7 @@ U0 ICAddSubEctEqual(CIntermediateCode *tempi,I64 type_pointed,I64 t1,I64 r1,I64
done=FALSE;
if (type_pointed>=RT_I64) {
if (!(t1&TY_MASK) &&
TY_REG<=t2&TY_MASK<=TY_RIP_DISP32) {
TY_REG<=t2&TY_MASK<=TY_RIP_DISP32) {
if (t3&TY_MASK==TY_REG)
temp=r3;
else {
@@ -530,7 +576,7 @@ U0 ICAddSubEctEqual(CIntermediateCode *tempi,I64 type_pointed,I64 t1,I64 r1,I64
return;
}
if (t3&RT_MASK>=RT_I64 &&
TY_REG<=t3&TY_MASK<=TY_RIP_DISP32) {
TY_REG<=t3&TY_MASK<=TY_RIP_DISP32) {
if (t2&TY_MASK==TY_REG)
result_reg=r2;
else {
@@ -543,7 +589,8 @@ U0 ICAddSubEctEqual(CIntermediateCode *tempi,I64 type_pointed,I64 t1,I64 r1,I64
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,r2,d2,TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,t2&TY_MASK+type_pointed,r2,d2,
TY_REG+RT_I64,result_reg,0,ip);
done=TRUE;
}
}
@@ -553,7 +600,8 @@ U0 ICAddSubEctEqual(CIntermediateCode *tempi,I64 type_pointed,I64 t1,I64 r1,I64
result_reg=r2;
else {
result_reg=REG_RCX;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2&TY_MASK+type_pointed,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
t2&TY_MASK+type_pointed,r2,d2,ip);
}
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
} else {
@@ -562,7 +610,8 @@ U0 ICAddSubEctEqual(CIntermediateCode *tempi,I64 type_pointed,I64 t1,I64 r1,I64
result_reg=r2;
else {
result_reg=REG_RCX;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2&TY_MASK+type_pointed,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
t2&TY_MASK+type_pointed,r2,d2,ip);
}
}
if (tempi->ic_flags&ICF_LOCK)
@@ -572,7 +621,8 @@ U0 ICAddSubEctEqual(CIntermediateCode *tempi,I64 type_pointed,I64 t1,I64 r1,I64
else
ICU8(tempi,0x48);
ICU16(tempi,0xC000+op.u8[0]+(result_reg&7)<<11);
ICMov(tempi,t2&TY_MASK+type_pointed,r2,d2,TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,t2&TY_MASK+type_pointed,r2,d2,
TY_REG+RT_I64,result_reg,0,ip);
}
}
} else {
@@ -580,23 +630,26 @@ U0 ICAddSubEctEqual(CIntermediateCode *tempi,I64 type_pointed,I64 t1,I64 r1,I64
if (t3&TY_MASK==TY_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) {
t2&TY_MASK==TY_REG && d3(U64)<=MAX_I8) {
ICSlashOp(tempi,TY_DISP+type_pointed,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,REG_RCX,0,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_DISP+type_pointed,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,REG_RCX,0,TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,TY_DISP+type_pointed,REG_RCX,0,
TY_REG+RT_I64,result_reg,0,ip);
done=TRUE;
} else if (type_pointed&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,REG_RCX,0,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_DISP+type_pointed,REG_RCX,0,ip);
result_reg=REG_RAX;
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
@@ -610,7 +663,8 @@ U0 ICAddSubEctEqual(CIntermediateCode *tempi,I64 type_pointed,I64 t1,I64 r1,I64
ICU16(tempi,op.u8[2]<<8+0x40);
ICU8(tempi,d3);
}
ICMov(tempi,TY_DISP+type_pointed,REG_RCX,0,TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,TY_DISP+type_pointed,REG_RCX,0,
TY_REG+RT_I64,result_reg,0,ip);
done=TRUE;
}
}
@@ -670,7 +724,7 @@ U0 ICShift(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
}
U0 ICShiftEqual(CIntermediateCode *tempi,I64 type_pointed,I64 t1,I64 r1,I64 d1,
I64 t2,I64 r2,I64 d2,I64 t3,I64 r3,I64 d3,I64 us,I64 is,I64 ip)
I64 t2,I64 r2,I64 d2,I64 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)
+165 -152
View File
@@ -1,48 +1,51 @@
U0 ICUnaries(CIntermediateCode *tempi,I64 op,I64 ip)
{
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICSlashOp(tempi,TY_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);
TY_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) {
TY_DISP<=tempi->a1.type&TY_MASK<=TY_RIP_DISP32) {
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,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_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);
TY_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);
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);
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);
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;
@@ -53,30 +56,33 @@ U0 ICAndAnd(CIntermediateCode *tempi,I64 ip)
ICTest(tempi,REG_RCX);
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);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_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);
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);
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);
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;
}
if (r2>7) {
i++;
r2&=7;
@@ -85,7 +91,8 @@ U0 ICOrOr(CIntermediateCode *tempi,I64 ip)
ICU24(tempi,0xC80B00+i+r2<<16);
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);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICXorXor(CIntermediateCode *tempi,I64 ip)
@@ -93,15 +100,19 @@ 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);
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);
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_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);
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;
@@ -115,10 +126,11 @@ U0 ICXorXor(CIntermediateCode *tempi,I64 ip)
ICTest(tempi,REG_RCX);
ICU16(tempi,0x0374);
ICU24(tempi,0xC0FF48);
ICU24(tempi,0xC33348);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICCmp(CIntermediateCode *tempi,I64 us,I64 is,I64 ip)
@@ -126,8 +138,8 @@ 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->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&TY_MASK==TY_DISP && //TODO
tempi->a1.type&RT_MASK>=RT_I64 && tempi->a1.reg!=REG_RAX) {
r1=tempi->a1.reg;
d1=tempi->a1.disp;
ICZero(tempi,REG_RAX);
@@ -155,11 +167,11 @@ 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&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);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r1=REG_RCX;
}
}
@@ -181,45 +193,45 @@ U0 ICCmp(CIntermediateCode *tempi,I64 us,I64 is,I64 ip)
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);
TY_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)
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);
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)
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);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
r2=REG_RDX;
}
} else {
if (tempi->a2.type&TY_MASK==TY_REG &&
tempi->a2.reg!=REG_RAX)
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_RCX,0,tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
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);
r1=REG_RDX;
} else {
if (tempi->a1.type&TY_MASK==TY_REG &&
tempi->a1.reg!=REG_RAX)
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);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r1=REG_RDX;
}
}
@@ -237,12 +249,12 @@ U0 ICCmp(CIntermediateCode *tempi,I64 us,I64 is,I64 ip)
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);
TY_REG+RT_I64,REG_RAX,0,ip);
}
}
U0 ICBitOps(CIntermediateCode *tempi,CICArg *a1,CICArg *a2,CIntermediateCode *tempi2,
I64 op,I64 op_imm,I64 ip)
U0 ICBitOps(CIntermediateCode *tempi,CICArg *a1,CICArg *a2,
CIntermediateCode *tempi2,I64 op,I64 op_imm,I64 ip)
{//TODO:not fully utilizing Modr
Bool no_depend=ToBool(tempi2->ic_flags&ICF_NO_DEPEND_RESULT);
I64 r1,t2,r2,d2,i=0x48;
@@ -251,8 +263,7 @@ U0 ICBitOps(CIntermediateCode *tempi,CICArg *a1,CICArg *a2,CIntermediateCode *te
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))
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);
@@ -260,7 +271,8 @@ U0 ICBitOps(CIntermediateCode *tempi,CICArg *a1,CICArg *a2,CIntermediateCode *te
} 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)) {
!(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;
@@ -268,14 +280,14 @@ U0 ICBitOps(CIntermediateCode *tempi,CICArg *a1,CICArg *a2,CIntermediateCode *te
}
} 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)) {
!(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))
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);
@@ -287,31 +299,27 @@ U0 ICBitOps(CIntermediateCode *tempi,CICArg *a1,CICArg *a2,CIntermediateCode *te
t2=TY_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))
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))
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))
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))
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);
@@ -322,10 +330,8 @@ U0 ICBitOps(CIntermediateCode *tempi,CICArg *a1,CICArg *a2,CIntermediateCode *te
}
if (!no_depend)
ICZero(tempi,REG_RAX);
if (tempi->ic_flags&ICF_LOCK) {
if (op!=0xA30F)
ICU8(tempi,OC_LOCK_PREFIX);
}
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;
i=ICModr1(r1,t2,r2,d2);
@@ -341,7 +347,8 @@ U0 ICBitOps(CIntermediateCode *tempi,CICArg *a1,CICArg *a2,CIntermediateCode *te
if (!no_depend) {
ICU32(tempi,0xD08348);
if (tempi->r.type&TY_MASK)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
}
}
@@ -359,7 +366,8 @@ U0 ICPreempt(CIntermediateCode *tempi,I64 ip)
ICU24(tempi,0x73BA0F);
ICU16(tempi,CTask.task_flags+TASKf_PREEMPT<<8);
} else {
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_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
if (!(tempi2->ic_flags&ICF_NO_DEPEND_RESULT))
ICZero(tempi,REG_RAX);
ICZero(tempi,REG_RBX);
@@ -379,7 +387,7 @@ U0 ICPreempt(CIntermediateCode *tempi,I64 ip)
U0 ICToUpper(CIntermediateCode *tempi,I64 ip)
{
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICU32(tempi,0x61F88348);
ICU16(tempi,0x0A7C);
ICU32(tempi,0x7AF88348);
@@ -387,24 +395,26 @@ U0 ICToUpper(CIntermediateCode *tempi,I64 ip)
ICU32(tempi,0xE0C08348);
}
U0 ICToI64(CLex *lx,CIntermediateCode *tempi,I64 ip)
U0 ICToI64(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip)
{
ICFCvt(lx,tempi,REG_RAX,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,TRUE,CN_MAIN,ip);
ICFCvt(cc,tempi,REG_RAX,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,TRUE,CN_MAIN,ip);
}
U0 ICToF64(CLex *lx,CIntermediateCode *tempi,I64 ip)
U0 ICToF64(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip)
{
ICFCvt(lx,tempi,REG_RAX,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,FALSE,CN_MAIN,ip);
ICFCvt(cc,tempi,REG_RAX,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,FALSE,CN_MAIN,ip);
}
U0 ICToBool(CLex *,CIntermediateCode *tempi,I64 ip)
U0 ICToBool(CCmpCtrl *,CIntermediateCode *tempi,I64 ip)
{
I64 r;
if (tempi->a1.type&TY_MASK==TY_REG)
r=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RAX;
}
ICTest(tempi,r);
@@ -418,33 +428,38 @@ U0 ICPreIncDec(CIntermediateCode *tempi,I64 op,I64 ip)
CHashClass *tempc=tempi->ic_class,*tempc1=tempc-1;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempc->ptr_stars_cnt && tempc1->size!=1) {
ICAddSubEctImm(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,
tempc1->size,op.u16[3],ip);
ICAddSubEctImm(tempi,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,tempc1->size,op.u16[3],ip);
} else
ICSlashOp(tempi,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,op,ip);
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,op,ip);
if (tempi->r.type&TY_MASK)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,ip);
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,ip);
} else {
if (tempi->a1.type&TY_MASK==TY_REG)
r=tempi->a1.reg;
else {
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_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RCX;
}
if (tempc->ptr_stars_cnt &&
tempc1->size!=1) {
tempc1->size!=1) {
ICAddSubEctImm(tempi,TY_DISP+tempi->a1.type_pointed,r,0,
TY_DISP+tempi->a1.type_pointed,r,0,
tempc1->size,op.u16[3],ip);
TY_DISP+tempi->a1.type_pointed,r,0,
tempc1->size,op.u16[3],ip);
} else
ICSlashOp(tempi,
TY_DISP+tempi->a1.type_pointed,r,0,op,ip);
TY_DISP+tempi->a1.type_pointed,r,0,op,ip);
if (tempi->r.type&TY_MASK)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+tempi->a1.type_pointed,r,0,ip);
TY_DISP+tempi->a1.type_pointed,r,0,ip);
}
}
@@ -453,38 +468,37 @@ 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->r.type&TY_MASK)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,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,tempi->a1.reg,tempi->a1.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,
tempc1->size,op.u16[3],ip);
} else
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
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,
tempi->a1.reg,tempi->a1.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,op,ip);
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
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))
!(tempi->r.type&TY_MASK==TY_REG && tempi->r.reg==tempi->a1.reg))
r=tempi->a1.reg;
else {
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_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&TY_MASK)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+tempi->a1.type_pointed,r,0,ip);
}
if (tempc->ptr_stars_cnt &&
tempc1->size!=1) {
TY_DISP+tempi->a1.type_pointed,r,0,ip);
if (tempc->ptr_stars_cnt && tempc1->size!=1)
ICAddSubEctImm(tempi,TY_DISP+tempi->a1.type_pointed,r,0,
TY_DISP+tempi->a1.type_pointed,r,0,
tempc1->size,op.u16[3],ip);
} else
ICSlashOp(tempi,
TY_DISP+tempi->a1.type_pointed,r,0,op,ip);
TY_DISP+tempi->a1.type_pointed,r,0,tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,TY_DISP+tempi->a1.type_pointed,r,0,op,ip);
}
}
@@ -499,35 +513,36 @@ U0 ICDerefPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip)
if (tempi->a1.type&TY_MASK==TY_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,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type&TY_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);
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,
tempc1->size,op.u16[3],ip);
} else
TY_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,
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&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,op,ip);
} else {
if (tempi->a1.type&TY_MASK==TY_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,TY_REG+RT_I64,REG_RCX,0,
tempi->a1.type&TY_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);
if (tempc1->size!=1) {
ICAddSubEctImm(tempi,TY_DISP+RT_I64,r,0,
TY_DISP+RT_I64,r,0,
tempc1->size,op.u16[3],ip);
} else
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_DISP+RT_I64,r,0,ip);
if (tempc1->size!=1)
ICAddSubEctImm(tempi,TY_DISP+RT_I64,r,0,TY_DISP+RT_I64,r,0,
tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,TY_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);
TY_DISP+t,REG_RDX,0,ip);
}
}
@@ -539,46 +554,43 @@ U0 ICAssignPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip)
if (tempi->a1.type&TY_MASK==TY_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,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RDX;
}
ICMov(tempi,TY_DISP+tempi->a1.type_pointed,r,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->r.type&TY_MASK)
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) {
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempc1->size!=1 || tempi->a1.type&TY_MASK==TY_STK)
ICAddSubEctImm(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
TY_REG+RT_I64,r,0,
tempc1->size,op.u16[3],ip);
} else
TY_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,
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_REG+RT_I64,REG_RCX,0,TY_DISP+RT_I64,REG_RDX,0,ip);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->r.type&TY_MASK)
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->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);
} else
TY_REG+RT_I64,REG_RCX,0,tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,TY_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 us,I64 is,I64 not_us,I64 not_is,U8 *buf,I64 ip2)
{
I64 r1,r2,i=0x48,j,t1,t2,result_reg;
Bool short_jmp,swap,done;
CLexCodeMisc *lb;
CCodeMisc *lb;
CICArg *a1=&tempi->a1,*a2=&tempi->a2;
j=a1->disp;
@@ -596,7 +608,7 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip,
if (a2->type&TY_MASK==TY_IMM && MIN_I32<=j<=MAX_I32) {
if (!has_result && TY_REG<=a1->type&TY_MASK<=TY_RIP_DISP32)
ICAddSubEctImm(tempi,a1->type,a1->reg,a1->disp,
a1->type,a1->reg,a1->disp,j,0x073B,ip2);
a1->type,a1->reg,a1->disp,j,0x073B,ip2);
else {
if (a1->type&TY_MASK==TY_REG)
r1=a1->reg;
@@ -655,8 +667,7 @@ 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) {
} 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);
@@ -750,14 +761,15 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip,
ICU32(tempi,i);
}
if (has_result)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,TY_REG+RT_I64,result_reg,0,ip2);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,result_reg,0,ip2);
}
U0 ICTestAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
{
I64 i;
Bool short_jmp;
CLexCodeMisc *lb;
CCodeMisc *lb;
if (tempi->a1.type&TY_MASK!=TY_REG) {
if (tempi->a1.type&RT_MASK<=RT_U8 &&
@@ -768,7 +780,8 @@ U0 ICTestAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
ICModr2(tempi,i,tempi->a1.disp,ip2+5);
ICU8(tempi,0xFF);
} else {
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_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICTest(tempi,REG_RAX);
}
} else
@@ -805,7 +818,7 @@ U0 ICFlagBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf)
{
I64 i;
Bool short_jmp;
CLexCodeMisc *lb;
CCodeMisc *lb;
ip+=tempi->ic_cnt;
lb=OptLabelFwd(tempi->ic_data);
+113 -98
View File
@@ -3,7 +3,7 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
U64 i;
I64 it,t1,r1,d1,r2;
Bool short_jmp,swap,override;
CLexCodeMisc *lb;
CCodeMisc *lb;
CICArg *a1,*a2;
if (tempi->a1.type&TY_MASK==TY_IMM) {
@@ -160,36 +160,40 @@ 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,tempi->a1.reg,tempi->a1.disp,
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
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)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,ip);
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
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);
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) &&
tempi->a2.reg==tempi->a1.reg ||
tempi->r.type&TY_MASK ||
tempi1->ic_flags&~ICG_NO_CVT_MASK) {
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) &&
tempi->a2.reg==tempi->a1.reg ||
tempi->r.type&TY_MASK ||
tempi1->ic_flags&~ICG_NO_CVT_MASK) {
ICMov(tempi,TY_DISP+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->r.type&TY_MASK)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
tempi->ic_flags=(tempi->ic_flags|tempi1->ic_flags)&~ICF_CODE_FINAL|ICF_DONT_RESTORE;
tempi->ic_flags=(tempi->ic_flags|tempi1->ic_flags)&
~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,tempi->a1.reg,tempi->a1.disp,
ICMov(tempi,TY_DISP+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
}
} else {
@@ -199,23 +203,25 @@ U0 ICAssign(CIntermediateCode *tempi,I64 ip)
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->r.type&TY_MASK)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
}
}
}
U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,I64 op,I64 op_imm,I64 is,U8 *buf,I64 ip2)
U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,
I64 op,I64 op_imm,I64 is,U8 *buf,I64 ip2)
{
I64 i,t,r1,r2,d1,d2,t1,t2;
CICArg *a1=&tempi->a1,*a2=&tempi->a2;
Bool short_jmp;
CLexCodeMisc *lb;
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) {
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;
@@ -228,9 +234,10 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,I64 op,I64 op_imm,I64 is,U8 *buf,I
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) {
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;
@@ -244,9 +251,10 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,I64 op,I64 op_imm,I64 is,U8 *buf,I
d2=a2->disp;
}
} 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) {
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;
@@ -259,9 +267,10 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,I64 op,I64 op_imm,I64 is,U8 *buf,I
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) {
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;
@@ -283,14 +292,16 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,I64 op,I64 op_imm,I64 is,U8 *buf,I
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) {
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) {
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
@@ -298,14 +309,16 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,I64 op,I64 op_imm,I64 is,U8 *buf,I
} 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) {
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) {
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
@@ -388,7 +401,7 @@ U0 ICQueInit(CIntermediateCode *tempi,I64 ip2)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
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);
@@ -403,14 +416,14 @@ U0 ICQueIns(CIntermediateCode *tempi,I64 ip2)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
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);
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r2=REG_RAX;
}
} else {
@@ -418,14 +431,14 @@ U0 ICQueIns(CIntermediateCode *tempi,I64 ip2)
r2=tempi->a2.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
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);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RDX;
}
}
@@ -444,14 +457,14 @@ U0 ICQueInsRev(CIntermediateCode *tempi,I64 ip2)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
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);
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r2=REG_RAX;
}
} else {
@@ -459,14 +472,14 @@ U0 ICQueInsRev(CIntermediateCode *tempi,I64 ip2)
r2=tempi->a2.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
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);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RDX;
}
}
@@ -484,7 +497,7 @@ U0 ICQueRem(CIntermediateCode *tempi,I64 ip2)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
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);
@@ -504,17 +517,17 @@ U0 ICMinMax(CIntermediateCode *tempi,I64 op,I64 ip2)
r1&=7;
}
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
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);
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);
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);
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) {
@@ -524,7 +537,7 @@ U0 ICMinMax(CIntermediateCode *tempi,I64 op,I64 ip2)
} else {
r1=REG_RDX;
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
}
}
}
@@ -536,17 +549,17 @@ U0 ICMinMax(CIntermediateCode *tempi,I64 op,I64 ip2)
r1&=7;
}
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
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);
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);
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);
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) {
@@ -556,7 +569,7 @@ U0 ICMinMax(CIntermediateCode *tempi,I64 op,I64 ip2)
} else {
r1=REG_RDX;
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
}
}
@@ -576,8 +589,9 @@ 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) {
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;
@@ -586,15 +600,16 @@ U0 ICModU64(CIntermediateCode *tempi,I64 ip2)
r1=REG_RBX;
d1=0;
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
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);
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);
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) {
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;
@@ -603,7 +618,7 @@ U0 ICModU64(CIntermediateCode *tempi,I64 ip2)
r1=REG_RBX;
d1=0;
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
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);
@@ -611,7 +626,7 @@ U0 ICModU64(CIntermediateCode *tempi,I64 ip2)
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);
TY_REG+RT_I64,REG_RDX,0,ip2);
}
U0 ICSwap(CIntermediateCode *tempi,I64 ip2)
@@ -632,8 +647,10 @@ U0 ICSwap(CIntermediateCode *tempi,I64 ip2)
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);
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)
@@ -641,8 +658,10 @@ U0 ICSwap(CIntermediateCode *tempi,I64 ip2)
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);
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);
}
switch (tempi->ic_code) {
case IC_SWAP_U8:
@@ -675,17 +694,15 @@ U0 ICSwap(CIntermediateCode *tempi,I64 ip2)
U0 ICAndEqual(CIntermediateCode *tempi,I64 ip2)
{
I64 i,bit;
if (tempi->a2.type&TY_MASK==TY_IMM &&
tempi->a1.type&TY_MASK!=TY_STK &&
tempi->ic_flags&ICF_NO_DEPEND_RESULT) {
if (tempi->a2.type&TY_MASK==TY_IMM && tempi->a1.type&TY_MASK!=TY_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;
ICBitOps(tempi,&tempi->a2,&tempi->a1,tempi,
0xB30F,0x30BA0F,ip2);
ICBitOps(tempi,&tempi->a2,&tempi->a1,tempi,0xB30F,0x30BA0F,ip2);
return;
}
}
@@ -698,17 +715,15 @@ U0 ICAndEqual(CIntermediateCode *tempi,I64 ip2)
U0 ICOrEqual(CIntermediateCode *tempi,I64 ip2)
{
I64 i,bit;
if (tempi->a2.type&TY_MASK==TY_IMM &&
tempi->a1.type&TY_MASK!=TY_STK &&
tempi->ic_flags&ICF_NO_DEPEND_RESULT) {
if (tempi->a2.type&TY_MASK==TY_IMM && tempi->a1.type&TY_MASK!=TY_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;
ICBitOps(tempi,&tempi->a2,&tempi->a1,tempi,
0xAB0F,0x28BA0F,ip2);
ICBitOps(tempi,&tempi->a2,&tempi->a1,tempi,0xAB0F,0x28BA0F,ip2);
return;
}
}
@@ -721,17 +736,15 @@ U0 ICOrEqual(CIntermediateCode *tempi,I64 ip2)
U0 ICXorEqual(CIntermediateCode *tempi,I64 ip2)
{
I64 i,bit;
if (tempi->a2.type&TY_MASK==TY_IMM &&
tempi->a1.type&TY_MASK!=TY_STK &&
tempi->ic_flags&ICF_NO_DEPEND_RESULT) {
if (tempi->a2.type&TY_MASK==TY_IMM && tempi->a1.type&TY_MASK!=TY_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;
ICBitOps(tempi,&tempi->a2,&tempi->a1,tempi,
0xBB0F,0x38BA0F,ip2);
ICBitOps(tempi,&tempi->a2,&tempi->a1,tempi,0xBB0F,0x38BA0F,ip2);
return;
}
}
@@ -741,12 +754,13 @@ U0 ICXorEqual(CIntermediateCode *tempi,I64 ip2)
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,0x310635340633,ip2);
}
U0 ICSwitch(CIntermediateCode *tempi,I64 ip,Bool nobound,CLex *lx,U8 *buf,I64 ip2)
U0 ICSwitch(CIntermediateCode *tempi,I64 ip,
Bool nobound,CCmpCtrl *cc,U8 *buf,I64 ip2)
{
I64 i,j,cnt,min,max,begin,r;
CLexCodeMisc *lb;
CCodeMisc *lb;
Bool short_jmp;
CExeAbsAddr *tempa;
CAOTAbsAddr *tempa;
if (tempi->a1.type&TY_MASK!=TY_REG || tempi->a1.reg&7==REG_RSP)
r=REG_RDX;
else
@@ -794,7 +808,7 @@ U0 ICSwitch(CIntermediateCode *tempi,I64 ip,Bool nobound,CLex *lx,U8 *buf,I64 ip
}
ip+=tempi->ic_cnt;
lb=tempi->ic_data(CLexCodeMisc *)->dft;
lb=tempi->ic_data(CCodeMisc *)->dft;
short_jmp=ToBool(tempi->ic_flags&ICF_SHORT_JMP);
if (!buf && lb->addr!=INVALID_PTR) {
i=lb->addr-(ip+2);
@@ -876,25 +890,26 @@ U0 ICSwitch(CIntermediateCode *tempi,I64 ip,Bool nobound,CLex *lx,U8 *buf,I64 ip
}
ICU24(tempi,0x851C8B+(r&7)<<19);
}
if (buf && lx->flags&LF_AOT_COMPILE) {
tempa=CAlloc(sizeof(CExeAbsAddr));
tempa->next=lx->a->abss;
tempa->type=EAT_ADD_U32;
lx->a->abss=tempa;
if (buf && cc->flags&CCF_AOT_COMPILE) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
tempa->next=cc->aotc->abss;
tempa->type=AAT_ADD_U32;
cc->aotc->abss=tempa;
tempa->ip=ip2+tempi->ic_cnt;
ICU32(tempi,lb->addr+lx->a->ip);
ICU32(tempi,lb->addr+cc->aotc->ip);
} else
ICU32(tempi,lb->addr+buf);
if (lb->flags&(CMF_I8_JMP_TABLE|CMF_U8_JMP_TABLE|CMF_I16_JMP_TABLE|CMF_U16_JMP_TABLE)) {
if (lb->flags&(CMF_I8_JMP_TABLE|CMF_U8_JMP_TABLE|
CMF_I16_JMP_TABLE|CMF_U16_JMP_TABLE)) {
ICU16(tempi,0xC381); //ADD EBX,0x12345678
if (buf && lx->flags&LF_AOT_COMPILE) {
tempa=CAlloc(sizeof(CExeAbsAddr));
tempa->next=lx->a->abss;
tempa->type=EAT_ADD_U32;
lx->a->abss=tempa;
if (buf && cc->flags&CCF_AOT_COMPILE) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
tempa->next=cc->aotc->abss;
tempa->type=AAT_ADD_U32;
cc->aotc->abss=tempa;
tempa->ip=ip2+tempi->ic_cnt;
ICU32(tempi,begin+lx->a->ip);
ICU32(tempi,begin+cc->aotc->ip);
} else
ICU32(tempi,begin+buf);
} else
+168 -162
View File
@@ -3,22 +3,24 @@
#define CN_MAIN 2
#define CN_R 3
U0 CmpNoteFloatOp(CLex *lx,CIntermediateCode *tempi,Bool dont_pushable,Bool dont_popable,I64 pos)
U0 CmpNoteFloatOp(CCmpCtrl *cc,CIntermediateCode *tempi,
Bool dont_pushable,Bool dont_popable,I64 pos)
{
Bool link=FALSE;
if (lx->pass==7 && lx->last_float_op_ic && lx->last_dont_popable && dont_pushable) {
if (cc->pass==7 && cc->last_float_op_ic &&
cc->last_dont_popable && dont_pushable) {
nobound_switch (pos) {
case CN_A2:
if (lx->last_float_op_ic!=tempi && lx->dont_push_float)
if (cc->last_float_op_ic!=tempi && cc->dont_push_float)
link=TRUE;
break;
case CN_A1:
if (lx->last_float_op_ic!=tempi && lx->dont_push_float)
if (cc->last_float_op_ic!=tempi && cc->dont_push_float)
link=TRUE;
break;
case CN_MAIN:
if (lx->last_float_op_ic!=tempi) {
if (lx->dont_push_float) {
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;
else
@@ -26,7 +28,7 @@ U0 CmpNoteFloatOp(CLex *lx,CIntermediateCode *tempi,Bool dont_pushable,Bool dont
link=TRUE;
}
} else {
if (lx->last_float_op_pos==CN_A1 ^^ !(tempi->ic_flags & ICF_A1_FIRST))
if (cc->last_float_op_pos==CN_A1 ^^ !(tempi->ic_flags & ICF_A1_FIRST))
tempi->ic_flags|=ICF_ALTERNATE_TEMPLATE;
else
tempi->ic_flags&=~ICF_ALTERNATE_TEMPLATE;
@@ -34,39 +36,43 @@ U0 CmpNoteFloatOp(CLex *lx,CIntermediateCode *tempi,Bool dont_pushable,Bool dont
}
break;
case CN_R:
if (lx->last_float_op_ic==tempi && lx->last_float_op_pos==CN_MAIN)
if (cc->last_float_op_ic==tempi && cc->last_float_op_pos==CN_MAIN)
link=TRUE;
break;
}
if (link) {
if (!Bts(&lx->last_float_op_ic->ic_flags,ICf_DONT_POP_FLOAT0+lx->last_ic_float_op_num))
lx->last_float_op_ic->ic_flags&=~ICF_CODE_FINAL;
if (!Bts(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0+lx->cur_ic_float_op_num))
if (!Bts(&cc->last_float_op_ic->ic_flags,
ICf_DONT_POP_FLOAT0+cc->last_ic_float_op_num))
cc->last_float_op_ic->ic_flags&=~ICF_CODE_FINAL;
if (!Bts(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0+cc->cur_ic_float_op_num))
tempi->ic_flags&=~ICF_CODE_FINAL;
}
}
lx->last_float_op_ic=tempi;
lx->last_dont_pushable=dont_pushable;
lx->last_dont_popable=dont_popable;
lx->last_ic_float_op_num=lx->cur_ic_float_op_num++;
lx->last_float_op_pos=pos;
if (lx->cur_ic_float_op_num>4)
cc->last_float_op_ic=tempi;
cc->last_dont_pushable=dont_pushable;
cc->last_dont_popable=dont_popable;
cc->last_ic_float_op_num=cc->cur_ic_float_op_num++;
cc->last_float_op_pos=pos;
if (cc->cur_ic_float_op_num>4)
throw('Compiler');
}
U0 CmpSetFloatOpPushPop(CLex *lx,CIntermediateCode *tempi,Bool *dont_push_float,Bool *dont_pop_float)
U0 CmpSetFloatOpPushPop(CCmpCtrl *cc,CIntermediateCode *tempi,
Bool *dont_push_float,Bool *dont_pop_float)
{
if (lx->pass==7) {
if (cc->pass==7) {
*dont_push_float=FALSE;
*dont_pop_float =FALSE;
tempi->ic_flags&=~ICF_CODE_FINAL;
} else {
*dont_push_float=Bt(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0+lx->cur_ic_float_op_num);
*dont_pop_float=Bt(&tempi->ic_flags,ICf_DONT_POP_FLOAT0+lx->cur_ic_float_op_num);
*dont_push_float=Bt(&tempi->ic_flags,
ICf_DONT_PUSH_FLOAT0+cc->cur_ic_float_op_num);
*dont_pop_float=Bt(&tempi->ic_flags,
ICf_DONT_POP_FLOAT0+cc->cur_ic_float_op_num);
}
}
U0 ICCopyTemplate(CLex *lx,CIntermediateCode *tempi,I64 op,
U0 ICCopyTemplate(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,
Bool off_the_record,Bool dont_pushable,Bool dont_popable,I64 pos)
{
Bool dont_push_float,dont_pop_float,alt;
@@ -77,7 +83,7 @@ U0 ICCopyTemplate(CLex *lx,CIntermediateCode *tempi,I64 op,
alt=TRUE;
else
alt=FALSE;
CmpSetFloatOpPushPop(lx,tempi,&dont_push_float,&dont_pop_float);
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
} else {
dont_push_float=FALSE;
dont_pop_float=FALSE;
@@ -108,11 +114,12 @@ U0 ICCopyTemplate(CLex *lx,CIntermediateCode *tempi,I64 op,
}
MemCpy(&tempi->ic_body[tempi->ic_cnt],ptr,i);
if (!off_the_record)
CmpNoteFloatOp(lx,tempi,dont_pushable,dont_popable,pos);
CmpNoteFloatOp(cc,tempi,dont_pushable,dont_popable,pos);
tempi->ic_cnt+=i;
}
U0 ICFCvt(CLex *lx,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,I64 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;
@@ -125,12 +132,12 @@ U0 ICFCvt(CLex *lx,CIntermediateCode *tempi,I64 r1,I64 t2,I64 r2,I64 d2,Bool to_
op2=SLASH_OP_FSTP;
}
CmpSetFloatOpPushPop(lx,tempi,&dont_push_float,&dont_pop_float);
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))) {
(t2&TY_MASK==TY_DISP ||
t2&TY_MASK==TY_RIP_DISP32 ||
t2&TY_MASK==TY_SIB))) {
ICPush(tempi,t2,r2,d2,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size=8;
@@ -148,9 +155,9 @@ U0 ICFCvt(CLex *lx,CIntermediateCode *tempi,I64 r1,I64 t2,I64 r2,I64 d2,Bool to_
}
}
if (to_int)
CmpNoteFloatOp(lx,tempi,TRUE,FALSE,pos);
CmpNoteFloatOp(cc,tempi,TRUE,FALSE,pos);
else
CmpNoteFloatOp(lx,tempi,FALSE,TRUE,pos);
CmpNoteFloatOp(cc,tempi,FALSE,TRUE,pos);
if (dont_pop_float) {
if (rsp_size)
ICAddRSP(tempi,rsp_size);
@@ -160,7 +167,8 @@ U0 ICFCvt(CLex *lx,CIntermediateCode *tempi,I64 r1,I64 t2,I64 r2,I64 d2,Bool to_
}
}
U0 ICFCvt2(CLex *lx,CIntermediateCode *tempi,I64 r1,I64 t2,I64 r2,I64 d2,Bool to_int,I64 ip)
U0 ICFCvt2(CCmpCtrl *cc,CIntermediateCode *tempi,
I64 r1,I64 t2,I64 r2,I64 d2,Bool to_int,I64 ip)
{
I64 rsp_size=0,op1,op2;
if (to_int) {
@@ -171,9 +179,9 @@ U0 ICFCvt2(CLex *lx,CIntermediateCode *tempi,I64 r1,I64 t2,I64 r2,I64 d2,Bool to
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))) {
(t2&TY_MASK==TY_DISP ||
t2&TY_MASK==TY_RIP_DISP32 ||
t2&TY_MASK==TY_SIB))) {
ICPush(tempi,t2,r2,d2,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size=8;
@@ -184,24 +192,24 @@ U0 ICFCvt2(CLex *lx,CIntermediateCode *tempi,I64 r1,I64 t2,I64 r2,I64 d2,Bool to
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);
lx->last_dont_pushable=lx->last_dont_popable=FALSE; //TODO: might improve this
cc->last_dont_pushable=cc->last_dont_popable=FALSE; //TODO: improve this
}
U0 ICFUnaryMinus(CLex *lx,CIntermediateCode *tempi,U8 *buf2,I64 ip)
U0 ICFUnaryMinus(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf2,I64 ip)
{
CICArg *a1=&tempi->a1;
I64 rsp_size=0,builtin1=0,t1,r1,d1;
Bool dont_push_float,dont_pop_float;
if (lx->flags&LF_AOT_COMPILE)
buf2=lx->a->ip;
if (cc->flags&CCF_AOT_COMPILE)
buf2=cc->aotc->ip;
CmpSetFloatOpPushPop(lx,tempi,&dont_push_float,&dont_pop_float);
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)) {
(a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 ||
a1->type&TY_MASK==TY_SIB)) {
t1=a1->type;
r1=a1->reg;
d1=a1->disp;
@@ -210,7 +218,7 @@ U0 ICFUnaryMinus(CLex *lx,CIntermediateCode *tempi,U8 *buf2,I64 ip)
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=LCCFloatConstFind(lx,a1->disp(F64))+buf2;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip);
@@ -228,7 +236,7 @@ U0 ICFUnaryMinus(CLex *lx,CIntermediateCode *tempi,U8 *buf2,I64 ip)
ICAddRSP(tempi,-8);
}
ICU16(tempi,0xE0D9); //FCHS
CmpNoteFloatOp(lx,tempi,TRUE,TRUE,CN_MAIN);
CmpNoteFloatOp(cc,tempi,TRUE,TRUE,CN_MAIN);
if (dont_pop_float) {
if (rsp_size)
ICAddRSP(tempi,rsp_size);
@@ -238,81 +246,83 @@ U0 ICFUnaryMinus(CLex *lx,CIntermediateCode *tempi,U8 *buf2,I64 ip)
}
}
U0 ICFMod(CLex *lx,CIntermediateCode *tempi,I64 ip)
U0 ICFMod(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip)
{//for MOD
Bool dont_push_float,dont_pop_float;
CmpSetFloatOpPushPop(lx,tempi,&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,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
else
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
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);
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);
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);
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);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
}
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_MAIN); //TODO: unpushable,unpop? Not sure
//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);
TY_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICFPow(CLex *lx,CIntermediateCode *tempi,U8 *buf,I64 ip)
U0 ICFPow(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
{//for POW
I64 i;
CExeImportExport *tempe;
CHashExport *tempex=HashFind("SYS_POW",lx->htc.hash_table_lst,HTT_EXPORT_SYS_SYM);
CAOTImportExport *tempie;
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);
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);
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);
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);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
if (lx->flags&LF_AOT_COMPILE) {
if (cc->flags&CCF_AOT_COMPILE) {
if (!tempex) {
tempex=CAlloc(sizeof(CHashExport));
tempex->str=StrNew("SYS_POW");
tempex->type=HTT_EXPORT_SYS_SYM|HTF_UNRESOLVED|HTF_IMPORT;
HashAdd(tempex,lx->htc.glbl_hash_table);
HashAdd(tempex,cc->htc.glbl_hash_table);
}
if (tempex->type&HTF_IMPORT) {
if (GetOpt(OPTf_USE_IMM64)) {
ICU16(tempi,0xBB48);
ICU64(tempi,0);
if (buf) {
tempe=CAlloc(sizeof(CExeImportExport));
tempe->type=EIT_IMM_I64;
tempe->ip=ip+tempi->ic_cnt-8;
tempe->next=tempex->ie_lst;
tempex->ie_lst=tempe;
tempie=CAlloc(sizeof(CAOTImportExport));
tempie->type=IET_IMM_I64;
tempie->ip=ip+tempi->ic_cnt-8;
tempie->next=tempex->ie_lst;
tempex->ie_lst=tempie;
}
ICU16(tempi,0xD3FF);
} else {
ICU8(tempi,0xE8);
ICU32(tempi,-(ip+tempi->ic_cnt+4));
if (buf) {
tempe=CAlloc(sizeof(CExeImportExport));
tempe->type=EIT_REL_I32;
tempe->ip=ip+tempi->ic_cnt-4;
tempe->next=tempex->ie_lst;
tempex->ie_lst=tempe;
tempie=CAlloc(sizeof(CAOTImportExport));
tempie->type=IET_REL_I32;
tempie->ip=ip+tempi->ic_cnt-4;
tempie->next=tempex->ie_lst;
tempex->ie_lst=tempie;
}
}
} else {//Kernel
@@ -323,8 +333,8 @@ U0 ICFPow(CLex *lx,CIntermediateCode *tempi,U8 *buf,I64 ip)
if (!(MIN_I32<=i<=MAX_I32)) {
throw('Compiler');
// ICU16(tempi,0xBB48);
// ICU64(tempi,tempex->val);
// ICU16(tempi,0xD3FF);
// ICU64(tempi,tempex->val);
// ICU16(tempi,0xD3FF);
} else {
ICU8(tempi,0xE8);
ICU32(tempi,i);
@@ -344,15 +354,15 @@ U0 ICFPow(CLex *lx,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);
TY_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICFOp(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 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;
t1,r1,d1,t2,r2,d2;
if (tempi->ic_flags&ICF_ALTERNATE_TEMPLATE) {
a1=&tempi->a2;
@@ -364,15 +374,13 @@ U0 ICFOp(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
alt=FALSE;
}
if (lx->flags&LF_AOT_COMPILE)
buf2=lx->a->ip;
if (cc->flags&CCF_AOT_COMPILE)
buf2=cc->aotc->ip;
CmpSetFloatOpPushPop(lx,tempi,&dont_push_float,&dont_pop_float);
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&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;
@@ -381,7 +389,7 @@ U0 ICFOp(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=LCCFloatConstFind(lx,a2->disp(F64))+buf2;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
@@ -392,10 +400,8 @@ U0 ICFOp(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
} 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 (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)) {
t1=a1->type;
r1=a1->reg;
d1=a1->disp;
@@ -404,7 +410,7 @@ U0 ICFOp(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=LCCFloatConstFind(lx,a1->disp(F64))+buf2;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip);
@@ -412,10 +418,8 @@ U0 ICFOp(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
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&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;
@@ -424,7 +428,7 @@ U0 ICFOp(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=LCCFloatConstFind(lx,a2->disp(F64))+buf2;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
@@ -436,9 +440,9 @@ U0 ICFOp(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
a1->type,a1->reg,a1->disp,ip);
a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
a2->type,a2->reg,a2->disp,ip);
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;
@@ -446,10 +450,8 @@ U0 ICFOp(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
}
} 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 (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;
@@ -458,7 +460,7 @@ U0 ICFOp(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=LCCFloatConstFind(lx,a2->disp(F64))+buf2;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
@@ -466,10 +468,8 @@ U0 ICFOp(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
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&RT_MASK>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
t1=a1->type;
r1=a1->reg;
d1=a1->disp;
@@ -478,7 +478,7 @@ U0 ICFOp(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=LCCFloatConstFind(lx,a1->disp(F64))+buf2;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip);
@@ -489,10 +489,8 @@ U0 ICFOp(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
}
}
} 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,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);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
@@ -519,136 +517,144 @@ U0 ICFOp(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
}
if (alt)
switch (op.u8[0]) {
case 4: //FSUB
op=SLASH_OP_FSUBR;
break;
case 6: //FDIV
op=SLASH_OP_FDIVR;
break;
case 4: op=SLASH_OP_FSUBR; break;
case 6: op=SLASH_OP_FDIVR; break;
}
if (builtin2) {
ICU16(tempi,builtin2);
ICU16(tempi,op.u16[2]);
} else
ICSlashOp(tempi,t2,r2,d2,op,ip);
CmpNoteFloatOp(lx,tempi,TRUE,TRUE,CN_MAIN);
CmpNoteFloatOp(cc,tempi,TRUE,TRUE,CN_MAIN);
if (dont_pop_float) {
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,TY_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,SLASH_OP_FSTP,ip);
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
SLASH_OP_FSTP,ip);
ICAddRSP(tempi,rsp_size-8);
}
ICPop(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,ip);
}
}
U0 ICFCmp(CLex *lx,CIntermediateCode *tempi,I64 op,I64 ip)
U0 ICFCmp(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,I64 ip)
{
Bool dont_push_float,dont_pop_float;
CmpSetFloatOpPushPop(lx,tempi,&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_POP_CMP)
ICPopRegs(tempi,1<<REG_RAX);
else
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
} else
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
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);
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);
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);
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);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
}
if (tempi->ic_flags&ICF_PUSH_CMP)
ICPushRegs(tempi,1<<REG_RAX);
ICCopyTemplate(lx,tempi,op,FALSE,TRUE,FALSE,CN_MAIN);
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);
TY_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICFModEqual(CLex *lx,CIntermediateCode *tempi,I64 ip)
U0 ICFModEqual(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip)
{
Bool dont_push_float,dont_pop_float;
CmpSetFloatOpPushPop(lx,tempi,&dont_push_float,&dont_pop_float);
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (dont_push_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,ip);
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->a1.type_pointed!=RT_F64)
ICFCvt2(lx,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,FALSE,ip);
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,tempi->a1.reg,tempi->a1.disp,ip);
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->a1.type_pointed!=RT_F64)
ICFCvt2(lx,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
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);
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);
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,tempi->a1.reg,tempi->a1.disp,ip);
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->a1.type_pointed!=RT_F64)
ICFCvt2(lx,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
}
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_MAIN); //TODO: unpushable,unpop? Not sure
//TODO: unpushable,unpop? Not sure
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_MAIN);
if (tempi->a1.type_pointed!=RT_F64)
ICFCvt2(lx,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
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,
tempi->a1.reg,tempi->a1.disp,TY_REG+RT_I64,REG_RAX,0,ip);
if (tempi->r.type&TY_MASK)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,ip);
tempi->a1.type&TY_MASK+tempi->a1.type_pointed,
tempi->a1.reg,tempi->a1.disp,ip);
} else {
if (dont_push_float) {
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_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,REG_RCX,0,ip);
TY_DISP+tempi->a1.type_pointed,REG_RCX,0,ip);
if (tempi->a1.type_pointed!=RT_F64)
ICFCvt2(lx,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,FALSE,ip);
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_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);
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,REG_RCX,0,ip);
TY_DISP+tempi->a1.type_pointed,REG_RCX,0,ip);
if (tempi->a1.type_pointed!=RT_F64)
ICFCvt2(lx,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,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);
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_RDX,0,
TY_DISP+tempi->a1.type_pointed,REG_RCX,0,ip);
TY_DISP+tempi->a1.type_pointed,REG_RCX,0,ip);
if (tempi->a1.type_pointed!=RT_F64)
ICFCvt2(lx,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
}
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_MAIN); //TODO: unpushable,unpop? Not sure
//TODO: unpushable,unpop? Not sure
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_MAIN);
if (tempi->a1.type_pointed!=RT_F64)
ICFCvt2(lx,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed,REG_RCX,0,TY_REG+RT_I64,REG_RAX,0,ip);
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed,REG_RCX,0,
TY_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,REG_RAX,0,ip);
TY_REG+RT_I64,REG_RAX,0,ip);
}
}
+157 -200
View File
@@ -1,15 +1,15 @@
U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
U0 ICFOpEqual(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
{//for ADD,SUB,DIV,MUL
CICArg *a1=&tempi->a1,
*a2=&tempi->a2;
*a2=&tempi->a2;
Bool dont_push_float,dont_pop_float,p1_mem;
I64 rsp_size=0,builtin2=0,
t1,r1,d1,t2,r2,d2;
t1,r1,d1,t2,r2,d2;
if (lx->flags&LF_AOT_COMPILE)
buf2=lx->a->ip;
if (cc->flags&CCF_AOT_COMPILE)
buf2=cc->aotc->ip;
CmpSetFloatOpPushPop(lx,tempi,&dont_push_float,&dont_pop_float);
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (dont_pop_float)
throw('Compiler');
@@ -18,16 +18,14 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
if (dont_push_float) {
if (a1->type_pointed!=RT_F64) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
a1->type&TY_MASK+a1->type_pointed,a1->reg,a1->disp,ip);
ICFCvt2(lx,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,FALSE,ip);
a1->type&TY_MASK+a1->type_pointed,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;
rsp_size+=8;
} else {
if (a1->type_pointed>=RT_I64 &&
(a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 ||
a1->type&TY_MASK==TY_SIB)) {
if (a1->type_pointed>=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+a1->type&TY_MASK;
r1=a1->reg;
d1=a1->disp;
@@ -41,21 +39,19 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
} else if (tempi->ic_flags & ICF_A1_FIRST) {
if (a1->type_pointed!=RT_F64 || a2->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
a1->type&TY_MASK+a1->type_pointed,a1->reg,a1->disp,ip);
a1->type&TY_MASK+a1->type_pointed,a1->reg,a1->disp,ip);
if (a1->type_pointed!=RT_F64)
ICFCvt2(lx,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
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);
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>=RT_I64 &&
(a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 ||
a1->type&TY_MASK==TY_SIB)) {
if (a1->type_pointed>=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+a1->type&TY_MASK;
r1=a1->reg;
d1=a1->disp;
@@ -65,10 +61,8 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 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)) {
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;
@@ -77,7 +71,7 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=LCCFloatConstFind(lx,a2->disp(F64))+buf2;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
@@ -90,21 +84,18 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
}
} else {
if (a1->type_pointed!=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_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,a1->reg,a1->disp,ip);
a1->type&TY_MASK+a1->type_pointed,a1->reg,a1->disp,ip);
if (a1->type_pointed!=RT_F64)
ICFCvt2(lx,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICFCvt2(cc,tempi,REG_RDX,TY_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;
} 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&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;
@@ -113,7 +104,7 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=LCCFloatConstFind(lx,a2->disp(F64))+buf2;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
@@ -121,10 +112,8 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
rsp_size+=8;
}
}
if (a1->type_pointed>=RT_I64 &&
(a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 ||
a1->type&TY_MASK==TY_SIB)) {
if (a1->type_pointed>=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+a1->type&TY_MASK;
r1=a1->reg;
d1=a1->disp;
@@ -149,37 +138,35 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
ICSlashOp(tempi,t2,r2,d2,SLASH_OP_FLD,ip);
}
switch (op.u8[0]) {
case 4: //FSUB
op=SLASH_OP_FSUBR;
break;
case 6: //FDIV
op=SLASH_OP_FDIVR;
break;
case 4: op=SLASH_OP_FSUBR; break;
case 6: op=SLASH_OP_FDIVR; break;
}
ICSlashOp(tempi,t1,r1,d1,op,ip);
CmpNoteFloatOp(lx,tempi,TRUE,FALSE,CN_MAIN);
CmpNoteFloatOp(cc,tempi,TRUE,FALSE,CN_MAIN);
if (p1_mem && a1->type_pointed==RT_F64) {
ICSlashOp(tempi,t1,r1,d1,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,TY_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,SLASH_OP_FSTP,ip);
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
SLASH_OP_FSTP,ip);
ICAddRSP(tempi,rsp_size-8);
}
if (a1->type_pointed!=RT_F64) {
ICPop(tempi,TY_REG+RT_I64,REG_RAX,0,ip);
ICFCvt2(lx,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,a1->type&TY_MASK+a1->type_pointed,a1->reg,a1->disp,
TY_REG+RT_I64,REG_RAX,0,ip);
TY_REG+RT_I64,REG_RAX,0,ip);
} else
ICPop(tempi,a1->type_pointed+a1->type&TY_MASK,a1->reg,a1->disp,ip);
}
if (tempi->r.type&TY_MASK)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
a1->type&TY_MASK+a1->type_pointed,a1->reg,a1->disp,ip);
a1->type&TY_MASK+a1->type_pointed,a1->reg,a1->disp,ip);
} else {
if (a1->type_pointed>=RT_I64)
p1_mem=TRUE;
@@ -189,8 +176,8 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
if (a1->type_pointed!=RT_F64) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_DISP+a1->type_pointed,REG_RCX,0,ip);
ICFCvt2(lx,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,FALSE,ip);
TY_DISP+a1->type_pointed,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);
} else
ICPush(tempi,a1->type_pointed+TY_DISP,REG_RCX,0,ip);
@@ -200,11 +187,10 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
if (a1->type_pointed!=RT_F64 || a2->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
TY_DISP+a1->type_pointed,REG_RCX,0,ip);
TY_DISP+a1->type_pointed,REG_RCX,0,ip);
if (a1->type_pointed!=RT_F64)
ICFCvt2(lx,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);
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;
@@ -214,10 +200,8 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
ICPush(tempi,TY_DISP+a1->type_pointed,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)) {
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;
@@ -226,7 +210,7 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=LCCFloatConstFind(lx,a2->disp(F64))+buf2;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
@@ -239,22 +223,19 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
}
} else {
if (a1->type_pointed!=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_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,REG_RCX,0,ip);
TY_DISP+a1->type_pointed,REG_RCX,0,ip);
if (a1->type_pointed!=RT_F64)
ICFCvt2(lx,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICFCvt2(cc,tempi,REG_RDX,TY_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;
} 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&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;
@@ -263,7 +244,7 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=LCCFloatConstFind(lx,a2->disp(F64))+buf2;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
@@ -291,45 +272,44 @@ U0 ICFOpEqual(CLex *lx,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
}
switch (op.u8[0]) {
case 4: //FSUB
op=SLASH_OP_FSUBR;
break;
case 6: //FDIV
op=SLASH_OP_FDIVR;
break;
case 4: op=SLASH_OP_FSUBR; break;
case 6: op=SLASH_OP_FDIVR; break;
}
ICSlashOp(tempi,t1,r1,d1,op,ip);
CmpNoteFloatOp(lx,tempi,TRUE,FALSE,CN_MAIN);
CmpNoteFloatOp(cc,tempi,TRUE,FALSE,CN_MAIN);
if (p1_mem && a1->type_pointed==RT_F64) {
ICSlashOp(tempi,TY_DISP+a1->type_pointed,REG_RCX,0,SLASH_OP_FSTP,ip);
ICSlashOp(tempi,TY_DISP+a1->type_pointed,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,TY_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,SLASH_OP_FSTP,ip);
ICSlashOp(tempi,TY_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);
if (a1->type_pointed!=RT_F64)
ICFCvt2(lx,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,TY_DISP+a1->type_pointed,REG_RCX,0,TY_REG+RT_I64,REG_RAX,0,ip);
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,TY_DISP+a1->type_pointed,REG_RCX,0,
TY_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,REG_RAX,0,ip);
TY_REG+RT_I64,REG_RAX,0,ip);
}
}
U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip,
U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip,
I64 us,I64 not_us,U8 *buf,I64 ip2)
{
CICArg *a1,*a2;
Bool dont_push_float,dont_pop_float,alt,short_jmp;
I64 i,rsp_size=0,builtin1=0,builtin2=0,
t1,r1,d1,t2,r2,d2;
CLexCodeMisc *lb;
I64 i,rsp_size=0,builtin1=0,builtin2=0,t1,r1,d1,t2,r2,d2;
CCodeMisc *lb;
U8 *buf2;
if (tempi->ic_flags&ICF_ALTERNATE_TEMPLATE) {
@@ -342,21 +322,19 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip,
alt=FALSE;
}
if (lx->flags&LF_AOT_COMPILE)
buf2=lx->a->ip;
if (cc->flags&CCF_AOT_COMPILE)
buf2=cc->aotc->ip;
else
buf2=buf;
CmpSetFloatOpPushPop(lx,tempi,&dont_push_float,&dont_pop_float);
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;
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&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;
@@ -366,7 +344,7 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip,
tempi->ic_flags&ICF_PUSH_CMP) {
t2=TY_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=LCCFloatConstFind(lx,a2->disp(F64))+buf2;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip2);
@@ -382,10 +360,8 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip,
t1=TY_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&RT_MASK>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
t1=a1->type;
r1=a1->reg;
d1=a1->disp;
@@ -394,7 +370,7 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip,
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=LCCFloatConstFind(lx,a1->disp(F64))+buf2;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip2);
@@ -403,10 +379,8 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip,
}
}
}
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&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;
@@ -416,7 +390,7 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip,
tempi->ic_flags&ICF_PUSH_CMP) {
t2=TY_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=LCCFloatConstFind(lx,a2->disp(F64))+buf2;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip2);
@@ -430,10 +404,8 @@ U0 ICFCmpAndBranch(CLex *lx,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,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);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
@@ -441,10 +413,8 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip,
}
} 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 (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;
@@ -454,7 +424,7 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip,
tempi->ic_flags&ICF_PUSH_CMP) {
t2=TY_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=LCCFloatConstFind(lx,a2->disp(F64))+buf2;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip2);
@@ -468,10 +438,8 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip,
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&RT_MASK>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
t1=a1->type;
r1=a1->reg;
d1=a1->disp;
@@ -480,7 +448,7 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip,
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=LCCFloatConstFind(lx,a1->disp(F64))+buf2;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip2);
@@ -492,13 +460,11 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip,
}
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
a2->type,a2->reg,a2->disp,ip2);
ICMov(tempi,TY_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,TY_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;
@@ -538,7 +504,7 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip,
ICU16(tempi,0xF1DF); //FCOMIP
ICU32(tempi,0xF7D9C0DD); //FFREE,FINCSTP
}
CmpNoteFloatOp(lx,tempi,TRUE,FALSE,CN_MAIN);
CmpNoteFloatOp(cc,tempi,TRUE,FALSE,CN_MAIN);
if (tempi->ic_flags&ICF_PUSH_CMP) {
if (r2.u8[0]==REG_RSP) {
@@ -600,159 +566,150 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip,
}
}
U0 ICFMul(CLex *lx,CIntermediateCode *tempi,U8 *buf,I64 ip)
U0 ICFMul(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
{
if (tempi->a1.type&TY_MASK==TY_IMM &&
tempi->a1.type_pointed&RT_MASK==RT_F64 &&
tempi->a1.disp(F64)==1.0) {
CmpNoteFloatOp(lx,tempi,FALSE,FALSE,CN_MAIN);
tempi->a1.type_pointed&RT_MASK==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&RT_MASK==RT_F64 &&
tempi->a2.disp(F64)==1.0) {
CmpNoteFloatOp(lx,tempi,FALSE,FALSE,CN_MAIN);
tempi->a2.type_pointed&RT_MASK==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);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
} else
ICFOp(lx,tempi,SLASH_OP_FMUL,buf,ip);
ICFOp(cc,tempi,SLASH_OP_FMUL,buf,ip);
}
U0 ICFDiv(CLex *lx,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&RT_MASK==RT_F64 &&
tempi->a2.disp(F64)==1.0) {
CmpNoteFloatOp(lx,tempi,FALSE,FALSE,CN_MAIN);
tempi->a2.type_pointed&RT_MASK==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);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
} else
ICFOp(lx,tempi,SLASH_OP_FDIV,buf,ip);
ICFOp(cc,tempi,SLASH_OP_FDIV,buf,ip);
}
U0 ICFAdd(CLex *lx,CIntermediateCode *tempi,U8 *buf,I64 ip)
U0 ICFAdd(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
{
Bool dont_push_float,dont_pop_float;
CmpSetFloatOpPushPop(lx,tempi,&dont_push_float,&dont_pop_float);
if (tempi->a1.type&TY_MASK==TY_IMM &&
!tempi->a1.disp) {
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (tempi->a1.type&TY_MASK==TY_IMM && !tempi->a1.disp) {
if (dont_push_float) {
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_FSTP,FALSE,TRUE,TRUE,CN_MAIN);
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);
TY_REG+RT_I64,REG_RAX,0,ip);
} else if (dont_pop_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
} else {
CmpNoteFloatOp(lx,tempi,TRUE,TRUE,CN_MAIN);
CmpNoteFloatOp(cc,tempi,TRUE,TRUE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
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&TY_MASK==TY_IMM && !tempi->a2.disp) {
if (dont_push_float) {
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_FSTP,FALSE,TRUE,TRUE,CN_MAIN);
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);
TY_REG+RT_I64,REG_RAX,0,ip);
} else if (dont_pop_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
} else {
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
CmpNoteFloatOp(lx,tempi,TRUE,TRUE,CN_MAIN);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
CmpNoteFloatOp(cc,tempi,TRUE,TRUE,CN_MAIN);
}
} else
ICFOp(lx,tempi,SLASH_OP_FADD,buf,ip);
ICFOp(cc,tempi,SLASH_OP_FADD,buf,ip);
}
U0 ICFSub(CLex *lx,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) {
CmpSetFloatOpPushPop(lx,tempi,&dont_push_float,&dont_pop_float);
if (tempi->a2.type&TY_MASK==TY_IMM && !tempi->a2.disp) {
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (dont_push_float) {
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_FSTP,FALSE,TRUE,TRUE,CN_MAIN);
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);
TY_REG+RT_I64,REG_RAX,0,ip);
} else if (dont_pop_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
} else {
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
CmpNoteFloatOp(lx,tempi,TRUE,TRUE,CN_MAIN);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
CmpNoteFloatOp(cc,tempi,TRUE,TRUE,CN_MAIN);
}
} else
ICFOp(lx,tempi,SLASH_OP_FSUB,buf,ip);
ICFOp(cc,tempi,SLASH_OP_FSUB,buf,ip);
}
U0 ICFPreIncDec(CLex *lx,CIntermediateCode *tempi,I64 op,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);
ICCopyTemplate(lx,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
tempi->a1.type&TY_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);
TY_REG+RT_I64,REG_RAX,0,ip);
} else {
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,
TY_DISP+RT_I64,REG_RCX,0,ip);
ICCopyTemplate(lx,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,TY_DISP+RT_I64,REG_RCX,0,
TY_REG+RT_I64,REG_RAX,0,ip);
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);
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);
}
if (tempi->r.type&TY_MASK)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
TY_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICFPostIncDec(CLex *lx,CIntermediateCode *tempi,I64 op,I64 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);
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);
ICCopyTemplate(lx,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_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);
TY_REG+RT_I64,REG_RAX,0,ip);
} else {
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,
TY_DISP+RT_I64,REG_RCX,0,ip);
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);
ICCopyTemplate(lx,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,TY_REG+RT_I64,REG_RDX,0,TY_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);
}
if (tempi->r.type&TY_MASK)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RDX,0,ip);
TY_REG+RT_I64,REG_RDX,0,ip);
}
U0 ICFTemplateFun(CLex *lx,CIntermediateCode *tempi,I64 op,I64 ip)
U0 ICFTemplateFun(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,I64 ip)
{
Bool dont_push_float,dont_pop_float;
CmpSetFloatOpPushPop(lx,tempi,&dont_push_float,&dont_pop_float);
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (!dont_push_float)
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICCopyTemplate(lx,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
ICCopyTemplate(cc,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
if (tempi->r.type&TY_MASK && !(tempi->ic_flags & ICF_R_TO_F64) &&
!(tempi->ic_flags & ICF_R_TO_INT))
!(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);
TY_REG+RT_I64,REG_RAX,0,ip);
}
+32 -42
View File
@@ -73,8 +73,8 @@ U0 ICAddRSP(CIntermediateCode *tempi,I64 i,Bool optimize=TRUE)
if (optimize && (tempil1=ICLastIns(tempi))) {
j=tempil1->ic_cnt;
if (tempil1->ic_last_cnt==j-4 &&
tempil1->ic_body[j-3]==0x83 &&
tempil1->ic_body[j-4]==0x48) {
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);
else if (tempil1->ic_body[j-2]==0xC4)
@@ -82,8 +82,8 @@ U0 ICAddRSP(CIntermediateCode *tempi,I64 i,Bool optimize=TRUE)
else
j=0;
} else if (tempil1->ic_last_cnt==j-7 &&
tempil1->ic_body[j-6]==0x81 &&
tempil1->ic_body[j-7]==0x48) {
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);
else if (tempil1->ic_body[j-5]==0xC4)
@@ -126,7 +126,8 @@ U0 ICAddRSP(CIntermediateCode *tempi,I64 i,Bool optimize=TRUE)
tempi->ic_last_cnt=last_cnt;
}
extern U0 ICMov(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 ip);
extern U0 ICMov(CIntermediateCode *tempi,
I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 ip);
#define MDR_REG 0
#define MDR_INDIRECT_REG 1
@@ -139,9 +140,9 @@ extern U0 ICMov(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64
I64 ICModr1(I64 r,I64 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
//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);
@@ -163,9 +164,7 @@ I64 ICModr1(I64 r,I64 t2,I64 r2,I64 d2)
}
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))
if (result.u8[1]==0x40 && (t2&RT_MASK>=RT_I16 || r<4 && r2<4))
result.u8[1]=0;
break;
case TY_DISP>>4:
@@ -183,9 +182,7 @@ I64 ICModr1(I64 r,I64 t2,I64 r2,I64 d2)
result.u8[2]=0x80+r<<3+r2;
result.u8[0]=MDR_D32_INDIRECT_REG;
}
if (result.u8[1]==0x40 &&
(t2&RT_MASK>=RT_I16 ||
r<4))
if (result.u8[1]==0x40 && (t2&RT_MASK>=RT_I16 || r<4))
result.u8[1]=0;
break;
case TY_SIB>>4:
@@ -210,17 +207,13 @@ I64 ICModr1(I64 r,I64 t2,I64 r2,I64 d2)
result.u8[0]=MDR_SIB_D32_INDIRECT_REG;
}
}
if (result.u8[1]==0x40 &&
(t2&RT_MASK>=RT_I16 ||
r<4))
if (result.u8[1]==0x40 && (t2&RT_MASK>=RT_I16 || r<4))
result.u8[1]=0;
break;
case TY_RIP_DISP32>>4:
result.u8[2]=0x05+r<<3;
result.u8[0]=MDR_RIP_REL;
if (result.u8[1]==0x40 &&
(t2&RT_MASK>=RT_I16 ||
r<4))
if (result.u8[1]==0x40 && (t2&RT_MASK>=RT_I16 || r<4))
result.u8[1]=0;
break;
}
@@ -439,7 +432,8 @@ I64 ICBuiltInFloatConst(F64 d)
return 0;
}
U0 ICMov(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 ip)
U0 ICMov(CIntermediateCode *tempi,
I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 ip)
{
I64 i,j,last_cnt=tempi->ic_cnt;
CIntermediateCode *tempil1;
@@ -509,10 +503,9 @@ U0 ICMov(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64
i=tempil1->ic_cnt;
j=0x48+(r1>7);
if (r2>7) j+=4;
if (tempil1->ic_last_cnt==i-3 &&
tempil1->ic_body[i-2]==0x8B &&
tempil1->ic_body[i-1]==0xC0+r1&7+(r2&7)<<3 &&
tempil1->ic_body[i-3]==j ) {
if (tempil1->ic_last_cnt==i-3 && tempil1->ic_body[i-2]==0x8B &&
tempil1->ic_body[i-1]==0xC0+r1&7+(r2&7)<<3 &&
tempil1->ic_body[i-3]==j) {
goto move_done;
}
}
@@ -553,8 +546,8 @@ U0 ICMov(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64
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))) {
if (t2&TY_MASK==TY_IMM && (t1&RT_MASK<RT_I64 ||
(MIN_I32<=d2<=MAX_I32))) {
i=ICModr1(0,t1,r1,d1);
switch (t1&RT_MASK) {
case RT_I8:
@@ -619,10 +612,11 @@ move_done:
tempi->ic_last_cnt=last_cnt;
}
U0 ICLea(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,CLex *lx,U8 *buf,I64 ip)
U0 ICLea(CIntermediateCode *tempi,
I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,CCmpCtrl *cc,U8 *buf,I64 ip)
{
I64 i;
CExeAbsAddr *tempa;
CAOTAbsAddr *tempa;
switch (t1>>4) {
case TY_REG>>4:
i=ICModr1(r1,t2,r2,d2);
@@ -634,21 +628,18 @@ U0 ICLea(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,CLex
if (t2&TY_MASK==TY_RIP_DISP32) {
ICU8(tempi,0x68);
ICU32(tempi,d2);
if (lx->flags&LF_AOT_COMPILE && buf && !(lx->flags&LF_NO_ABSS)) {
tempa=CAlloc(sizeof(CExeAbsAddr));
tempa->next=lx->a->abss;
tempa->type=EAT_ADD_U32;
lx->a->abss=tempa;
if (cc->flags&CCF_AOT_COMPILE && buf && !(cc->flags&CCF_NO_ABSS)) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
tempa->next=cc->aotc->abss;
tempa->type=AAT_ADD_U32;
cc->aotc->abss=tempa;
tempa->ip=ip+tempi->ic_cnt-4;
}
tempi->ic_flags&=~ICF_CODE_FINAL;
} else {
ICLea(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,lx,buf,ip);
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,REG_RCX,0,ip);
}
break;
break;
} // Fall thru
default:
ICLea(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,lx,buf,ip);
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);
}
}
@@ -659,13 +650,12 @@ U0 ICDeref(CIntermediateCode *tempi,I64 ip)
t=tempi->r.type&RT_MASK;
if (t>tempi->a1.type_pointed)
t=tempi->a1.type_pointed;
if (tempi->a1.type&TY_MASK==TY_REG)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+t,tempi->a1.reg,tempi->a1.disp,ip);
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
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);
}
+251
View File
@@ -0,0 +1,251 @@
U0 LexPutToken(CCmpCtrl *cc)
{//Print cur token to StdOut. (Crude)
'"';
if (cc->token==TK_IDENT || cc->token==TK_STR)
"%s",cc->cur_str;
else if (cc->token==TK_INTEGER)
"INT:%X",cc->cur_i64;
else if (cc->token==TK_CHAR_CONST)
"U8:%X",cc->cur_i64;
else if (cc->token==TK_F64)
"FLOAT:%e",cc->cur_f64;
else if (cc->token=='\n')
"<NEW_LINE>";
else if (Bt(chars_bmp_displayable,cc->token))
'' cc->token;
else {
"T:%X",cc->token;
}
"\" ";
}
U8 *LexPutLine(CCmpCtrl *cc,U8 *start)
{//Print cur pos to end of line to StdOut.
I64 ch;
U8 *ptr;
if (!start) return NULL;
if (cc->lex_include_stk->flags&LFSF_DOC)
return DocPutLine(cc->lex_include_stk->doc,start);
else {
ptr=start;
while (ch=*ptr++) {
if (ch=='\n') {
if (*ptr=='\r')
ptr++;
break;
} else if (ch=='\r') {
if (*ptr=='\n')
ptr++;
break;
}
'' ch;
}
if (!ch) ptr--;
'\n';
return ptr;
}
return NULL;
}
U0 LexPutPos(CCmpCtrl *cc)
{//Print token, line link and, then, $LK,"LexPutLine",A="MN:LexPutLine"$().
LexPutToken(cc);
FixSet(cc->lex_include_stk->full_name,cc->lex_include_stk->line_num);
if (IsRaw)
"%s,%d ",cc->lex_include_stk->full_name,cc->lex_include_stk->line_num;
else {
PutFileLink(cc->lex_include_stk->full_name,cc->lex_include_stk->line_num);
AdamErr("%s,%d\n",
cc->lex_include_stk->full_name,cc->lex_include_stk->line_num);
'' CH_SPACE;
}
LexPutLine(cc,cc->lex_include_stk->line_start);
}
U0 LexWarn(CCmpCtrl *cc,U8 *str=NULL)
{//Print warn msg, then, $LK,"LexPutPos",A="MN:LexPutPos"$().
if (str) PrintWarn(str);
if (cc->htc.fun) {
"in fun '%s'.\n",cc->htc.fun->str;
if (IsRaw)
"%s\n",cc->htc.fun->src_link;
else {
"$$LK,\"%s\"$$\n",cc->htc.fun->src_link;
AdamErr("%s\n",cc->htc.fun->src_link);
}
} else
LexPutPos(cc);
cc->warning_cnt++;
}
U0 LexExcept(CCmpCtrl *cc,U8 *str=NULL)
{//Print err msg, $LK,"LexPutPos",A="MN:LexPutPos"$() and throw exception.
if (!Bt(&sys_run_level,RLf_ADAM_SERVER)) {
Preempt;
Raw(ON);
"Note: Still in boot phase.\n";
}
if (str) PrintErr(str);
if (!IsRaw)
AdamErr("Task:%08X %s\n",Fs,str);
LexPutPos(cc);
cc->error_cnt++;
FlushMsgs;
if (!Bt(&sys_run_level,RLf_ADAM_SERVER))
Dbg("Type \"Fix;\"");
throw('Compiler');
}
U0 UndefinedExtern()
{
PrintErr("Undefined Extern\nat %P\n",Caller);
throw('UndefExt');
}
U0 UnusedExternWarning(CCmpCtrl *cc,CHashClass *tempc)
{
PrintWarn("Unused extern '%s'\n",tempc->str);
cc->warning_cnt++;
}
U0 ParenWarning(CCmpCtrl *cc)
{
if (Bt(&cc->opts,OPTf_WARN_PAREN) &&
!(cc->lex_include_stk->flags&LFSF_DEFINE))
LexWarn(cc,"Unnecessary parenthesis ");
}
U0 ICClassPut(CHashClass *c)
{
I64 i;
if (!c) return;
if (c->ptr_stars_cnt>4) {
PrintErr("put_class ptrcnt=%d\n",c->ptr_stars_cnt);
while (TRUE)
//TODO:
Yield;
}
for (i=0;i<c->ptr_stars_cnt;i++)
'*';
c-=c->ptr_stars_cnt;
if (c->str)
"%s",c->str;
else {
PrintErr("put_class str=NULL\n");
while (TRUE)
//TODO:
Yield;
}
'' CH_SPACE;
}
U0 ICArgPut(CICArg *a)
{
if (a->type_pointed)
"%Z %Z %Z ",
a->type&RT_MASK,"ST_RAW_TYPES",
a->type_pointed&RT_MASK,"ST_RAW_TYPES",
a->type>>4,"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:
"STK";
break;
case TY_IMM>>4:
"#%X",a->disp;
break;
case TY_REG>>4:
"%Z",a->reg,"ST_U64_REGS";
break;
case TY_DISP>>4:
"%X[%Z]",a->disp,a->reg,"ST_U64_REGS";
break;
case TY_RIP_DISP32>>4:
"[%X]",a->disp;
break;
case TY_SIB>>4:
if (a->disp)
"%X",a->disp;
if (a->reg==REG_RIP)
'[';
else
"[%Z+",a->reg&15,"ST_U64_REGS";
"%Z",a->reg>>8&15,"ST_U64_REGS";
switch (a->reg>>14) {
case 0: "]"; break;
case 1: "*2]"; break;
case 2: "*4]"; break;
case 3: "*8]"; break;
}
break;
}
}
U0 ICPut(CCmpCtrl *cc,CIntermediateCode *tempi)
{
I64 opcode=tempi->ic_code,i;
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) {
ICArgPut(&tempi->r);
"<-";
}
if (tempi->a1.type&TY_MASK)
ICArgPut(&tempi->a1);
',';
if (tempi->a2.type&TY_MASK)
ICArgPut(&tempi->a2);
'' CH_SPACE;
}
ICClassPut(tempi->ic_class);
if (tempi->ic_flags & ICF_LOCK)
"$$BROWN$$lock$$FG$$ ";
if (tempi->ic_flags & ICF_A2_TO_F64)
"$$LTBLUE$$a2d$$FG$$ ";
if (tempi->ic_flags & ICF_A2_TO_INT)
"$$GREEN$$a2i$$FG$$ ";
if (tempi->ic_flags & ICF_A1_TO_F64)
"$$LTBLUE$$a1d$$FG$$ ";
if (tempi->ic_flags & ICF_A1_TO_INT)
"$$GREEN$$a1i$$FG$$ ";
if (tempi->ic_flags & ICF_R_TO_F64)
"$$LTBLUE$$rd$$FG$$ ";
if (tempi->ic_flags & ICF_R_TO_INT)
"$$GREEN$$ri$$FG$$ ";
if (tempi->ic_flags & ICF_USE_F64)
"[F64] ";
if (tempi->ic_flags & ICF_USE_UNSIGNED)
"[unsigned] ";
if (tempi->ic_flags & ICF_USE_INT)
"[int] ";
if (tempi->ic_flags & ICF_NO_DEPEND_RESULT)
"-DEP ";
if (tempi->ic_flags & ICF_DEPEND_RESULT)
"+DEP ";
if (tempi->ic_flags & ICF_NOT_ADDR)
"NOT_ADDR ";
if (tempi->ic_flags & ICF_PUSH_RESULT)
"PUSH ";
if (tempi->ic_flags & ICF_PUSH_CMP)
"PUSH_CMP ";
if (tempi->ic_flags & ICF_POP_CMP)
"POP_CMP ";
if (tempi->ic_flags & ICF_DEL_PREVIOUS_INS)
"DELPREV ";
if (tempi->ic_flags & ICF_PREVIOUS_DELETED)
"PREVDEL ";
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)
"ALT_TEMP ";
'\n';
}
}
+35 -27
View File
@@ -1,40 +1,48 @@
import U8 *Doc2PlainText(CDoc *doc,CDocEntry *doc_e);
import U0 DocBinsValidate(CDoc *doc);
import U0 DocDel(CDoc *doc);
import U0 DocLoad(CDoc *doc,U8 *src2,I64 size);
import CDoc *DocNew(U8 *filename=NULL,CTask *task=NULL);
import CDocEntry *DocPrint(CDoc *doc,U8 *fmt,...);
import CDocEntry *DocPutLine(CDoc *doc,CDocEntry *doc_e);
import I64 DocSize(CDoc *doc);
import U0 Who(U8 *flags=NULL,CHashTable *h=NULL,
U8 *outname=NULL,U8 mapfile_drv=0,U8 *index=NULL,CDoc *_doc=NULL);
extern U0 CmpFixUpAOTAsm(CLex *lx,CExe *tempx);
extern U0 CmpFixUpJITAsm(CLex *lx,CExe *tempx);
extern CExe *CmpJoin(CLex *lx,I64 cmp_flags,U8 *map_name=NULL,U8 mapfile_drv=0);
import Bool DocWrite(CDoc *doc,Bool prompt=FALSE);
extern U8 *CmdLinePmt();
extern U0 CmpFixUpAOTAsm(CCmpCtrl *cc,CAOT *tempaot);
extern U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tempaot);
extern CAOT *CmpJoin(
CCmpCtrl *cc,I64 cmp_flags,U8 *map_name=NULL,U8 mapfile_drv_let=0);
extern I64 HashEntrySize2(CHashSrcSym *temph);
extern Bool IsLexExpression2Bin(CLex *lx,U8 **_ex);
extern U0 LexExcept(CLex *lx,U8 *str=NULL);
extern I64 LexExpression(CLex *lx);
extern U0 LexWarn(CLex *lx,U8 *str=NULL);
extern CLexCodeMisc *OptLabelFwd(CLexCodeMisc *lb);
extern CIntermediateCode *OptPass012(CLex *lx);
extern U0 OptPass3(CLex *lx,COptReg *reg_offsets);
extern U0 OptPass4(CLex *lx,COptReg *reg_offsets,I64 *_type);
extern U0 OptPass5(CLex *lx);
extern U0 OptPass6(CLex *lx);
extern I64 OptPass789A(CLex *lx,COptReg *reg_offsets,U8 *buf,CDbgInfo **_dbg);
extern CHashClass *PrsClass(CLex *lx,I64 keyword,I64 fsp_flags,Bool is_extern);
extern CHashFun *PrsFunJoin(CLex *lx,CHashClass *temp_return,U8 *name,I64 fsp_flags);
extern I64 PrsKeyWord(CLex *lx);
extern Bool PrsStatement(CLex *lx,I64 try_cnt=0,
CLexCodeMisc *lb_break=NULL,I64 cmp_flags=CMPF_PRS_SEMICOLON);
extern U0 PrsStreamBlk(CLex *lx);
extern CHashClass *PrsType(CLex *lx,CHashClass **tempc1,
extern Bool IsLexExpression2Bin(CCmpCtrl *cc,U8 **_machine_code);
extern I64 Lex(CCmpCtrl *cc);
extern I64 LexExpression(CCmpCtrl *cc);
extern I64 LexGetChar(CCmpCtrl *cc);
extern CCodeMisc *OptLabelFwd(CCodeMisc *lb);
extern CIntermediateCode *OptPass012(CCmpCtrl *cc);
extern U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets);
extern U0 OptPass4(CCmpCtrl *cc,COptReg *reg_offsets,I64 *_type);
extern U0 OptPass5(CCmpCtrl *cc);
extern U0 OptPass6(CCmpCtrl *cc);
extern I64 OptPass789A(
CCmpCtrl *cc,COptReg *reg_offsets,U8 *buf,CDbgInfo **_dbg);
extern CHashClass *PrsClass(
CCmpCtrl *cc,I64 keyword,I64 fsp_flags,Bool is_extern);
extern CHashFun *PrsFunJoin(
CCmpCtrl *cc,CHashClass *temp_return,U8 *name,I64 fsp_flags);
extern I64 PrsKeyWord(CCmpCtrl *cc);
extern Bool PrsStatement(CCmpCtrl *cc,I64 try_cnt=0,
CCodeMisc *lb_break=NULL,I64 cmp_flags=CMPF_PRS_SEMICOLON);
extern U0 PrsStreamBlk(CCmpCtrl *cc);
extern CHashClass *PrsType(CCmpCtrl *cc,CHashClass **tempc1,
I64 *_mode,CMemberLst *tempm,U8 **_ident,CHashFun **_fun_ptr,
CHashExport **_tempex,CArrayDim *tempad,I64 fsp_flags);
extern I64 PrsUnaryModifier(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempad,I64 *unary_post_prec);
extern I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempad,
extern I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,
CMemberLst **_local_var,CArrayDim **_tempad,I64 *unary_post_prec);
extern I64 PrsUnaryTerm(
CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempad,
I64 *max_prec,I64 *unary_pre_prec,I64 *paren_prec);
extern U0 PrsVarInit2(CLex *lx,U8 **_dst,CHashClass *tempc,CArrayDim *tempad,U8 *data_addr_ip,U8 **_base,Bool data_heap,I64 pass);
extern U0 StreamPrint(U8 *fmt,...);
extern U0 PrsVarInit2(CCmpCtrl *cc,U8 **_dst,CHashClass *tempc,
CArrayDim *tempad,U8 *data_addr_ip,U8 **_base,Bool data_heap,I64 pass);
_extern CMP_TEMPLATES U32 cmp_templates[1];
_extern CMP_TEMPLATES_DONT_POP U32 cmp_templates_dont_pop[1];
_extern CMP_TEMPLATES_DONT_PUSH2 U32 cmp_templates_dont_push2[1];
+61 -5
View File
@@ -11,7 +11,8 @@ I64 HashEntrySize(CHashSrcSym *temph)
return temph(CHashClass *)->size;
case HTt_FUN:
if (dbg_info=temph->dbg_info)
return dbg_info->body[dbg_info->max_line+1-dbg_info->min_line]-dbg_info->body[0];
return dbg_info->body[dbg_info->max_line+1-dbg_info->min_line]
-dbg_info->body[0];
else
return -1;
case HTt_FILE:
@@ -47,8 +48,9 @@ I64 HashEntrySize2(CHashSrcSym *temph)
else if (temph->type & HTT_FUN) {
result+=MemberLstSize(temph);
if (dbg_info=temph->dbg_info)
//This should be $LK,"MSize",A="MN:MSize"$() but it would crash on AOT .BIN.Z file funs.
result+=dbg_info->body[dbg_info->max_line+1-dbg_info->min_line]-dbg_info->body[0];
//This should be $LK,"MSize",A="MN:MSize"$() but it would crash on AOT .BIN.Z file funs.
result+=dbg_info->body[dbg_info->max_line+1-dbg_info->min_line]
-dbg_info->body[0];
} else if (temph->type&HTT_DEFINE_STR)
result+=MSize2(temph(CHashDefineStr *)->data);
else if (temph->type & HTT_GLBL_VAR) {
@@ -56,12 +58,13 @@ I64 HashEntrySize2(CHashSrcSym *temph)
if (!(temph(CHashGlblVar *)->flags&GVF_ALIAS))
result+=MSize2(temph(CHashGlblVar *)->data_addr);
if (temph(CHashGlblVar *)->fun_ptr)
result+=HashEntrySize2(temph(CHashGlblVar *)->fun_ptr-temph(CHashGlblVar *)->fun_ptr->ptr_stars_cnt);
result+=HashEntrySize2(temph(CHashGlblVar *)->fun_ptr
-temph(CHashGlblVar *)->fun_ptr->ptr_stars_cnt);
}
} else if (temph->type & HTT_FILE)
result+=MSize2(temph(CHashGeneric *)->user_data0);
else if (temph->type & HTT_MODULE &&
StrCmp(temph->str,KERNEL_MODULE_NAME))
StrCmp(temph->str,KERNEL_MODULE_NAME))
result+=MSize2(temph(CHashGeneric *)->user_data0);
return result;
}
@@ -83,3 +86,56 @@ I64 HashTableSize2(CHashTable *table)
result+=MSize2(table);
return result;
}
U0 MapFileWrite(CHashTable *h,U8 *map_name,U8 drv_let)
{
CHashSrcSym *temph;
I64 i,size;
U8 *src_link;
CDoc *doc;
CDocBin *tempb;
CDbgInfo *dbg_info;
doc=DocNew(map_name);
doc->flags|=DOCF_NO_CURSOR;
for (i=0;i<=h->mask;i++) {
temph=h->body[i];
while (temph) {
if (temph->src_link && !(temph->type & (HTF_IMPORT | HTF_PRIVATE))) {
src_link=StrNew(temph->src_link);
if (drv_let && StrLen(src_link)>=4)
src_link[3]=drv_let;
if (dbg_info=temph->dbg_info) {
size=offset(CDbgInfo.body)+
sizeof(U32)*(dbg_info->max_line+2-dbg_info->min_line);
if (size>MSize(dbg_info)) {
"Corrupt Map Entry\n";
dbg_info=NULL;
} else {
if (dbg_info->min_line<=dbg_info->max_line) {
tempb=CAlloc(sizeof(CDocBin));
tempb->size=size;
tempb->data=MAlloc(size);
MemCpy(tempb->data,dbg_info,size);
tempb->num=doc->cur_bin_num++;
tempb->use_cnt=1;
QueIns(tempb,doc->bin_root.last);
} else
dbg_info=NULL;
}
}
if (dbg_info)
DocPrint(doc,"$$LK,\"%s\",A=\"%s\",BI=%d$$\n",
temph->str,src_link,tempb->num);
else
DocPrint(doc,"$$LK,\"%s\",A=\"%s\"$$\n",temph->str,src_link);
Free(src_link);
}
temph=temph->next;
}
}
DocBinsValidate(doc);
DocWrite(doc);
DocDel(doc);
}
+220 -217
View File
@@ -3,204 +3,206 @@
class CInternalType
{
U8 type,size,name[8];
} internal_types_table[NUM_INTERNAL_TYPES]={
{RT_I0,0,"I0i"},{RT_I0,0,"I0"},{RT_U0,0,"U0i"},{RT_U0,0,"U0"},
{RT_I8,1,"I8i"},{RT_I8,1,"I8"},{RT_I8,1,"Bool"},
{RT_U8,1,"U8i"},{RT_U8,1,"U8"},
{RT_I16,2,"I16i"},{RT_U16,2,"U16i"},
{RT_I32,4,"I32i"},{RT_U32,4,"U32i"},
{RT_I64,8,"I64i"},{RT_U64,8,"U64i"},
{RT_F64,8,"F64i"},{RT_F64,8,"F64"},
};
CInternalType internal_types_table[NUM_INTERNAL_TYPES]={
{RT_I0,0,"I0i"},{RT_I0,0,"I0"},{RT_U0,0,"U0i"},{RT_U0,0,"U0"},
{RT_I8,1,"I8i"},{RT_I8,1,"I8"},{RT_I8,1,"Bool"},
{RT_U8,1,"U8i"},{RT_U8,1,"U8"},
{RT_I16,2,"I16i"},{RT_U16,2,"U16i"},
{RT_I32,4,"I32i"},{RT_U32,4,"U32i"},
{RT_I64,8,"I64i"},{RT_U64,8,"U64i"},
{RT_F64,8,"F64i"},{RT_F64,8,"F64"},
CIntermediateStruct intermediate_code_table[IC_NUM_ENTRIES]={
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"END"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"NOP1"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"END_EXP"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"NOP2"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"LABEL"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"CALL_START"},
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"CALL_END"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"CALL_END2"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"RETURN_VAL"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"RETURN_VAL2"},
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"IMM_I64"},
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"IMM_F64"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"STR_CONST"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"ABS_ADDR"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"ADDR_IMPORT"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"HEAP_GLBL"},
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"SIZEOF"},
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"TYPE"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"GET_LABEL"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"RBP"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"REG"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"FS"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"MOV_FS"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GS"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"MOV_GS"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"LEA"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"MOV"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TO_I64"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TO_F64"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TO_BOOL"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TOUPPER"},
{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"HOLYC_TYPECAST"},
{IS_1_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"ADDR"},
{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"COM"},
{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"NOT"},
{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"UNARY_MINUS"},
{IS_1_ARG,1,IST_DEREF,FALSE,TRUE,0,0,0,"DEREF"},
{IS_1_ARG,1,IST_DEREF,FALSE,TRUE,0,0,0,"DEREF_PP"},
{IS_1_ARG,1,IST_DEREF,FALSE,TRUE,0,0,0,"DEREF_MM"},
{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"_PP"},
{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"_MM"},
{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"PP_"},
{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"MM_"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"SHL"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"SHR"},
{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"SHL_CONST"},
{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"SHR_CONST"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"POWER"},
{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"MUL"},
{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"DIV"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"MOD"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"AND"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"OR"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"XOR"},
{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"ADD"},
{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SUB"},
{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"ADD_CONST"},
{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"SUB_CONST"},
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"EQUAL_EQUAL"},
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"NOT_EQUAL"},
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"LESS"},
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"GREATER_EQUAL"},
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"GREATER"},
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"LESS_EQUAL"},
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"PUSH_CMP"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"AND_AND"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"OR_OR"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"XOR_XOR"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ASSIGN"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ASSIGN_PP"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ASSIGN_MM"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"SHL_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"SHR_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"MUL_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"DIV_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"MOD_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"AND_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"OR_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"XOR_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ADD_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"SUB_EQUAL"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"JMP"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SUB_CALL"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SWITCH"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"NOBOUND_SWITCH"},
{IS_V_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ADD_RSP"},
{IS_V_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ADD_RSP1"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ENTER"},
{IS_0_ARG,0,IST_ASSIGN,FALSE,FALSE,0,0,0,"PUSH_REGS"},
{IS_0_ARG,0,IST_ASSIGN,FALSE,FALSE,0,0,0,"POP_REGS"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"LEAVE"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"RET"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_INDIRECT"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_INDIRECT2"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_IMPORT"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_EXTERN"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"ASM"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"PREEMPT"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"PUSH"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"POP"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CLFLUSH"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"INVLPG"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"IN_U8"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"IN_U16"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"IN_U32"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"OUT_U8"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"OUT_U16"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"OUT_U32"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RFLAGS"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CARRY"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RFLAGS"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RAX"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RAX"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RBP"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RBP"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RSP"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RSP"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"RIP"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"RDTSC"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"HPET"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BT"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BTS"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BTR"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BTC"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"LBTS"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"LBTR"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"LBTC"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BSF"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BSR"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_INIT"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_INS"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_INS_REV"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_REM"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"STRLEN"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_ZERO"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_NOT_ZERO"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_CARRY"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_NOT_CARRY"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_EQUAL_EQUAL"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_NOT_EQUAL"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_LESS"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_GREATER_EQUAL"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_GREATER"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_LESS_EQUAL"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2EQUAL_EQUAL"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2NOT_EQUAL"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2LESS"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2GREATER_EQUAL"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2GREATER"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2LESS_EQUAL"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_ZERO"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_NOT_ZERO"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_MM_ZERO"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_MM_NOT_ZERO"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_AND_ZERO"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_AND_NOT_ZERO"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_OR_OR_ZERO"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_OR_OR_NOT_ZERO"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BT"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BTS"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BTR"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BTC"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BT"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BTS"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BTR"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BTC"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U8"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U16"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U32"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U64"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ABS_I64"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SIGN_I64"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MIN_I64"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MIN_U64"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MAX_I64"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MAX_U64"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MOD_U64"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SQRI64"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SQRU64"},
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SQR"},
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"ABS"},
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SQRT"},
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SIN"},
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"COS"},
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"TAN"},
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"ATAN"},
};
U0 AsmPrsInsFlags(CLex *lx,CInstruction *tempi)
{
I64 i;
while (TRUE) {
switch (lx->token) {
case TK_IDENT:
if ((i=DefineMatch(lx->cur_str,"ST_OPCODE_MODIFIERS"))>=0) {
tempi->opcode_modifier=i;
break;
} else
return;
case TK_INTEGER:
if (lx->cur_i64==16)
tempi->flags|=IEF_OP_SIZE16;
else if (lx->cur_i64==32)
tempi->flags|=IEF_OP_SIZE32;
else
return;
break;
case '+':
tempi->flags|=IEF_PLUS_OPCODE;
case '/':
if (Lex(lx)==TK_INTEGER && lx->cur_i64<8)
tempi->slash_val=lx->cur_i64;
else if (lx->token==TK_IDENT) {
if (!StrCmp(lx->cur_str,"R"))
tempi->slash_val=SV_R_REG;
else if (!StrCmp(lx->cur_str,"I"))
tempi->slash_val=SV_I_REG;
else
return;
} else
return;
break;
case '!': tempi->flags|=IEF_DONT_SWITCH_MODES; break;
case '&': tempi->flags|=IEF_DFT; break;
case ':': tempi->flags|=IEF_STI; break;
case '-': tempi->flags|=IEF_NO_REX; break;
case '~': tempi->flags|=IEF_40_REX; break;
case '=': tempi->flags|=IEF_48_REX; break;
case '`': tempi->flags|=IEF_REX_ONLY_R8_R15; break;
case '^': tempi->flags|=IEF_REX_XOR_LIKE; break;
case '$$': tempi->flags|=IEF_ENDING_ZERO; break;
default:
return;
}
Lex(lx);
}
}
U0 AsmHashLoad()
{
I64 i,j,size,size1;
CInternalType *tempit;
CLex *lx;
CHashGeneric *temph;
CHashReg *tempr;
CHashOpcode *tempo,*tempo1;
CInstruction *tempi;
CHashClass *tempc;
cmp.asm_hash=HashTableNew(1024);
size1=offset(CHashOpcode.ins)+sizeof(CInstruction)<<5;
tempo=MAlloc(size1);
lx=LexNew(FileRead("OpCodes.TXT"),,"OpCodes.TXT.Z");
lx->htc.hash_table_lst=NULL;
Lex(lx);
while (lx->token) {
if (lx->token!=TK_IDENT)
LexExcept(lx,"expecting identifier at ");
i=LstMatch(lx->cur_str,"R8\0R16\0R32\0R64\0SEG\0FSTK\0MM\0XMM\0OPCODE\0KEYWORD\0ASM_KEYWORD\0");
if (i<0)
LexExcept(lx,"Unknown Statement");
Lex(lx); //skip keyword
if (lx->token!=TK_IDENT)
LexExcept(lx,"expecting identifier at ");
switch (i) {
case 8: //OPCODE
MemSet(tempo,0,size1);
tempo->type=HTT_OPCODE;
tempo->instruction_entry_cnt=0;
tempo->str=lx->cur_str;
lx->cur_str=0;
Lex(lx); //Skip OPCODE
while (lx->token && lx->token!=';') {
tempi=&tempo->ins[tempo->instruction_entry_cnt];
tempi->ins_entry_num=tempo->instruction_entry_cnt++;
tempi->slash_val=SV_NONE; //Not zero!!
while (lx->token==TK_INTEGER) {
tempi->opcode[tempi->opcode_cnt++]=lx->cur_i64;
Lex(lx);
}
if (lx->token==',')
Lex(lx);
else if (lx->token!=';')
LexExcept(lx,"expecting ',' at ");
AsmPrsInsFlags(lx,tempi);
tempi->arg1=0;
tempi->arg2=0;
if (lx->token==TK_IDENT) {
j=DefineMatch(lx->cur_str,"ST_ARG_TYPES");
tempi->arg1=j;
if (ARGT_REL8<=j<=ARGT_REL32 ||
ARGT_MOFFS8<=j<=ARGT_MOFFS64)
tempi|=IEF_NO_REX;
if (Lex(lx)==TK_IDENT) {
j=DefineMatch(lx->cur_str,"ST_ARG_TYPES");
Lex(lx);
tempi->arg2=j;
if (ARGT_REL8<=j<=ARGT_REL32 ||
ARGT_MOFFS8<=j<=ARGT_MOFFS64)
tempi|=IEF_NO_REX;
}
}
}
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))
LexExcept(lx,"Duplicate OPCODE entry ");
HashAdd(tempo1,cmp.asm_hash);
break;
case 9: //KEYWORD
case 10: //ASM_KEYWORD
temph=CAlloc(sizeof(CHashGeneric));
temph->str=lx->cur_str;
lx->cur_str=NULL;
Lex(lx); //skip keyword name
if (lx->token!=TK_INTEGER)
LexExcept(lx,"expecting integer at ");
temph->user_data0=lx->cur_i64;
if (i==9)
temph->type=HTT_KEYWORD;
else
temph->type=HTT_ASM_KEYWORD;
HashAdd(temph,cmp.asm_hash);
Lex(lx); //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=lx->cur_str;
lx->cur_str=NULL;
Lex(lx); //skip keyword name
if (lx->token!=TK_INTEGER)
LexExcept(lx,"expecting integer at ");
tempr->type=HTT_REG;
tempr->reg_type=i;
tempr->reg_num=lx->cur_i64;
HashAdd(tempr,cmp.asm_hash);
Lex(lx); //Skip INT
break;
}
if (lx->token!=';')
LexExcept(lx,"missing ';' at");
Lex(lx); //Skip ';'
}
Free(tempo);
LexDel(lx);
for (i=0;i<NUM_INTERNAL_TYPES;i++) {
tempit=&internal_types_table[i];
tempc=PrsClassNew;
tempc->type=HTT_INTERNAL_TYPE;
tempc->raw_type=tempit->type;
Bts(&tempc->flags,Cf_INTERNAL_TYPE);
tempc->size=tempit->size;
tempc->str=AStrNew(tempit->name);
HashAdd(tempc,cmp.asm_hash);
cmp.internal_types[tempc->raw_type]=tempc;
}
adam_task->hash_table->next=cmp.asm_hash;
}
U0 CmpLoadDefines()
{
DefineLstLoad("ST_RAW_TYPES",
@@ -208,26 +210,27 @@ U0 CmpLoadDefines()
"F32\0UF32\0F64\0UF64\0");
DefineLstLoad("ST_TY_TYPES","NULL\0IMM\0REG\0DISP\0SIB\0RIP\0STK\0");
DefineLstLoad("ST_U8_REGS","AL\0CL\0DL\0BL\0AH\0CH\0DH\0BH\0"
"R8u8\0R9u8\0R10u8\0R11u8\0R12u8\0R13u8\0R14u8\0R15u8\0");
"R8u8\0R9u8\0R10u8\0R11u8\0R12u8\0R13u8\0R14u8\0R15u8\0");
DefineLstLoad("ST_U8_REX_REGS","AL\0CL\0DL\0BL\0RSPu8\0RBPu8\0RSIu8\0RDIu8\0"
"R8u8\0R9u8\0R10u8\0R11u8\0R12u8\0R13u8\0R14u8\0R15u8\0");
"R8u8\0R9u8\0R10u8\0R11u8\0R12u8\0R13u8\0R14u8\0R15u8\0");
DefineLstLoad("ST_U16_REGS","AX\0CX\0DX\0BX\0SP\0BP\0SI\0DI\0"
"R8u16\0R9u16\0R10u16\0R11u16\0R12u16\0R13u16\0R14u16\0R15u16\0");
"R8u16\0R9u16\0R10u16\0R11u16\0R12u16\0R13u16\0R14u16\0R15u16\0");
DefineLstLoad("ST_U32_REGS","EAX\0ECX\0EDX\0EBX\0ESP\0EBP\0ESI\0EDI\0"
"R8u32\0R9u32\0R10u32\0R11u32\0R12u32\0R13u32\0R14u32\0R15u32\0");
"R8u32\0R9u32\0R10u32\0R11u32\0R12u32\0R13u32\0R14u32\0R15u32\0");
DefineLstLoad("ST_U64_REGS","RAX\0RCX\0RDX\0RBX\0RSP\0RBP\0RSI\0RDI\0"
"R8\0R9\0R10\0R11\0R12\0R13\0R14\0R15\0");
"R8\0R9\0R10\0R11\0R12\0R13\0R14\0R15\0");
DefineLstLoad("ST_MM_REGS","MM0\0MM1\0MM2\0MM3\0MM4\0MM5\0MM6\0MM7\0");
DefineLstLoad("ST_XMM_REGS","XMM0\0XMM1\0XMM2\0XMM3\0XMM4\0XMM5\0XMM6\0XMM7\0");
DefineLstLoad("ST_XMM_REGS",
"XMM0\0XMM1\0XMM2\0XMM3\0XMM4\0XMM5\0XMM6\0XMM7\0");
DefineLstLoad("ST_OPCODE_MODIFIERS","NO\0CB\0CW\0CD\0CP\0IB\0IW\0ID\0");
DefineLstLoad("ST_ARG_TYPES","NO\0REL8\0REL16\0REL32\0"
"IMM8\0IMM16\0IMM32\0IMM64\0UIMM8\0UIMM16\0UIMM32\0UIMM64\0"
"R8\0R16\0R32\0R64\0RM8\0RM16\0RM32\0RM64\0"
"M8\0M16\0M32\0M64\0M1632\0M16N32\0M16N16\0M32N32\0"
"MOFFS8\0MOFFS16\0MOFFS32\0MOFFS64\0"
"AL\0AX\0EAX\0RAX\0CL\0DX\0 \0SREG\0"
"SS\0DS\0ES\0FS\0GS\0CS\0ST0\0STI\0"
"MM\0MM32\0MM64\0XMM\0XMM32\0XMM64\0XMM128\0XMM0\0");
"IMM8\0IMM16\0IMM32\0IMM64\0UIMM8\0UIMM16\0UIMM32\0UIMM64\0"
"R8\0R16\0R32\0R64\0RM8\0RM16\0RM32\0RM64\0"
"M8\0M16\0M32\0M64\0M1632\0M16N32\0M16N16\0M32N32\0"
"MOFFS8\0MOFFS16\0MOFFS32\0MOFFS64\0"
"AL\0AX\0EAX\0RAX\0CL\0DX\0 \0SREG\0"
"SS\0DS\0ES\0FS\0GS\0CS\0ST0\0STI\0"
"MM\0MM32\0MM64\0XMM\0XMM32\0XMM64\0XMM128\0XMM0\0");
DefineLstLoad("ST_SEG_REGS","ES\0CS\0SS\0DS\0FS\0GS\0");
DefineLstLoad("ST_FSTK_REGS","ST0\0ST1\0ST2\0ST3\0ST4\0ST5\0ST6\0ST7\0");
}
@@ -239,19 +242,19 @@ U0 CmpFillTables()
cmp.to_reg_vars_map=CAlloc(NUM_REGS*sizeof(U8));
cmp.num_reg_vars=0;
cmp.reg_vars_mask=REG_VARS_MASK;
cmp.reg_vars_mask=REGG_C_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=REG_NON_PTR_MASK;
cmp.non_ptr_vars_mask=REGG_C_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"$.
/* STK TEMP ALLOCATION: See $LK,"::/Compiler/OptPass6.CPP"$.
Expressions are evaluated with a stack machine.
@@ -271,9 +274,9 @@ 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
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
@@ -281,14 +284,14 @@ 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
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=REG_STK_TEMPS_MASK;
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;
+318 -334
View File
@@ -1,254 +1,241 @@
U0 StreamPrint(U8 *fmt,...)
{//Injects text into the compile stream. Used in #exe{} blocks.
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv),*st;
CLex *lx=Fs->last_lex;
CStreamBlk *tempe=lx->last_stream_blk;
if (tempe!=&lx->next_stream_blk) {
st=MStrPrint("%s%s",tempe->body,buf);
Free(tempe->body);
tempe->body=st;
} else
PrintErr("No exe{} blk\n");
Free(buf);
}
U8 *LexStatement2Bin(CLex *lx,I64 *_type,I64 cmp_flags=0)
{//Compile one lx statement to bin code.
U8 *LexStatement2Bin(CCmpCtrl *cc,I64 *_type,I64 cmp_flags=0)
{//Compile one cc statement to bin code.
I64 size,i,j,k,*result=INVALID_PTR;
CLexCodeCtrl *tempcbh;
CCodeCtrl *tempcbh;
if (_type) *_type=RT_I64;
Btr(&lx->flags,Lf_OPT_TRACE_PRESENT);
if (lx->a_depth==2)
LCCPush(lx);
LCCInit(lx);
if (!PrsStatement(lx,,,cmp_flags)) {
if (lx->lcc.lcc_root.next!=&lx->lcc.lcc_root) {
lx->lcc.lcc_root.last->ic_flags&=~ICF_NO_DEPEND_RESULT;
LCCAdd(lx,IC_RETURN_VAL2,0,0);
LCCAdd(lx,IC_RET,0,0);
if (result=LCCCompile(lx,&size,NULL,_type)) {
if (lx->flags&LF_AOT_COMPILE) {
j=lx->a->ip;
Btr(&cc->flags,CCf_OPT_TRACE_PRESENT);
if (cc->aot_depth==2)
COCPush(cc);
COCInit(cc);
if (!PrsStatement(cc,,,cmp_flags)) {
if (cc->coc.coc_root.next!=&cc->coc.coc_root) {
cc->coc.coc_root.last->ic_flags&=~ICF_NO_DEPEND_RESULT;
ICAdd(cc,IC_RETURN_VAL2,0,0);
ICAdd(cc,IC_RET,0,0);
if (result=COCCompile(cc,&size,NULL,_type)) {
if (cc->flags&CCF_AOT_COMPILE) {
j=cc->aotc->ip;
k=(size+7)>>3;
for (i=0;i<k;i++)
AsmStoreCodeU64(lx,result[i]);
AOTStoreCodeU64(cc,result[i]);
Free(result);
result=j;
}
}
} //TODO: else del misc?
} else //TODO: too dangerous to del Misc?
QueDel(&lx->lcc.lcc_root.next);
if (lx->a_depth==2) {
tempcbh=LCCPopNoFree(lx);
LCCAppend(lx,tempcbh);
QueDel(&cc->coc.coc_root.next);
if (cc->aot_depth==2) {
tempcbh=COCPopNoFree(cc);
COCAppend(cc,tempcbh);
}
return result;
}
CExe *CmpJoin(CLex *lx,I64 cmp_flags,U8 *map_name=NULL,U8 mapfile_drv=0)
CAOT *CmpJoin(CCmpCtrl *cc,I64 cmp_flags,U8 *map_name=NULL,U8 mapfile_drv_let=0)
{
CAOTCtrl *a,*old_a=lx->a;
CAOTCtrl *aotc,*old_aot=cc->aotc;
I64 i,j,l;
U8 *buf;
CAsmCodeBlk *tempc;
CExeImportExport *tempe;
CAOTBinBlk *tempbin;
CAOTImportExport *tempie;
Bool okay=TRUE;
CLexHashTableContext *htc=MAlloc(sizeof(CLexHashTableContext));
CExe *result=CAlloc(sizeof(CExe)),*parent;
if (parent=lx->exe) {
result->parent_exe=parent;
CAOT *result=CAlloc(sizeof(CAOT)),*parent;
if (parent=cc->aot) {
result->parent_aot=parent;
QueIns(result,parent->last);
} else
QueInit(result);
lx->exe=result;
cc->aot=result;
result->next_ie=result->last_ie=&result->next_ie;
lx->a=a=CAlloc(sizeof(CAOTCtrl));
lx->a_depth++;
cc->aotc=aotc=CAlloc(sizeof(CAOTCtrl));
cc->aot_depth++;
a->cb=CAlloc(sizeof(CAsmCodeBlk));
a->max_align_bits=0;
a->module_org=INVALID_PTR;
aotc->bin=CAlloc(sizeof(CAOTBinBlk));
aotc->max_align_bits=0;
aotc->module_org=INVALID_PTR;
MemCpy(htc,&lx->htc,sizeof(CLexHashTableContext));
if (lx->htc.fun)
lx->htc.glbl_hash_table=HashTableNew(128);
MemCpy(htc,&cc->htc,sizeof(CLexHashTableContext));
if (cc->htc.fun)
cc->htc.glbl_hash_table=HashTableNew(128);
else
lx->htc.glbl_hash_table=HashTableNew(1024);
if (lx->flags&LF_AOT_COMPILE) {
lx->htc.define_hash_table=lx->htc.glbl_hash_table;
if (lx->a_depth<=1)
lx->htc.glbl_hash_table->next=cmp.asm_hash;
cc->htc.glbl_hash_table=HashTableNew(1024);
if (cc->flags&CCF_AOT_COMPILE) {
cc->htc.define_hash_table=cc->htc.glbl_hash_table;
if (cc->aot_depth<=1)
cc->htc.glbl_hash_table->next=cmp.asm_hash;
else
lx->htc.glbl_hash_table->next=htc->glbl_hash_table;
cc->htc.glbl_hash_table->next=htc->glbl_hash_table;
} else
lx->htc.glbl_hash_table->next=Fs->hash_table;
lx->htc.hash_table_lst=lx->htc.local_hash_table=HashTableNew(16);
lx->htc.local_hash_table->next=lx->htc.glbl_hash_table;
lx->htc.local_var_lst=lx->htc.fun; //HolyC local vars
lx->htc.fun=NULL;
cc->htc.glbl_hash_table->next=Fs->hash_table;
cc->htc.hash_table_lst=cc->htc.local_hash_table=HashTableNew(16);
cc->htc.local_hash_table->next=cc->htc.glbl_hash_table;
cc->htc.local_var_lst=cc->htc.fun; //HolyC local vars
cc->htc.fun=NULL;
try {
if (cmp_flags&CMPF_LEX_FIRST)
Lex(lx);
Lex(cc);
if (!(cmp_flags&CMPF_ONE_ASM_INS))
cmp_flags|=CMPF_PRS_SEMICOLON;
if (lx->flags&LF_AOT_COMPILE) {
while (lx->token!=TK_EOF) {
buf=LexStatement2Bin(lx,NULL,cmp_flags);
if (cc->flags&CCF_AOT_COMPILE) {
while (cc->token!=TK_EOF) {
buf=LexStatement2Bin(cc,NULL,cmp_flags);
if (buf!=INVALID_PTR) {
tempe=CAlloc(sizeof(CExeImportExport));
tempe->type=EIT_MAIN;
tempe->ip=buf;
QueIns(tempe,result->last_ie);
tempie=CAlloc(sizeof(CAOTImportExport));
tempie->type=IET_MAIN;
tempie->ip=buf;
QueIns(tempie,result->last_ie);
}
if (cmp_flags&CMPF_ASM_BLK)
break;
}
} else
PrsStatement(lx,,,cmp_flags);
AsmGlblsResolve(lx,result);
PrsStatement(cc,,,cmp_flags);
AOTGlblsResolve(cc,result);
} catch {
if (Fs->except_ch=='Compiler' && !(cmp_flags&CMPF_ASM_BLK)) {
LexPutPos(lx);
LexPutPos(cc);
Fs->catch_except=TRUE;
}
okay=FALSE;
}
if (!okay) {
if (lx->error_cnt<1)
lx->error_cnt=1;
lx->exe=result->parent_exe;
if (cc->error_cnt<1)
cc->error_cnt=1;
cc->aot=result->parent_aot;
Free(result);
LinkedLstDel(a->cb);
LinkedLstDel(aotc->bin);
result=NULL;
} else {
if (map_name && !cmp.dont_write_to_dsk)
Who("-r",lx->htc.glbl_hash_table,map_name,mapfile_drv);
HashTableDel(lx->htc.local_hash_table);
HashTableDel(lx->htc.glbl_hash_table);
if (map_name)
MapFileWrite(cc->htc.glbl_hash_table,map_name,mapfile_drv_let);
HashTableDel(cc->htc.local_hash_table);
HashTableDel(cc->htc.glbl_hash_table);
if (!a->num_ex_U8s)
if (!aotc->num_bin_U8s)
result->buf=NULL;
else {
if (lx->flags&LF_AOT_COMPILE)
result->buf=MAlloc(a->num_ex_U8s);
if (cc->flags&CCF_AOT_COMPILE)
result->buf=MAlloc(aotc->num_bin_U8s);
else {
if (a->module_org==INVALID_PTR)
result->buf=MAlloc(a->num_ex_U8s,Fs->code_heap);
if (aotc->module_org==INVALID_PTR)
result->buf=MAlloc(aotc->num_bin_U8s,Fs->code_heap);
else
result->buf=a->module_org;
result->buf=aotc->module_org;
}
result->ex_U8s=a->num_ex_U8s;
tempc=a->cb;
result->aot_U8s=aotc->num_bin_U8s;
tempbin=aotc->bin;
j=0;
l=a->num_ex_U8s;
while (tempc) {
l=aotc->num_bin_U8s;
while (tempbin) {
i=l;
if (i>ASM_CODE_BLK_SIZE)
i=ASM_CODE_BLK_SIZE;
MemCpy(result->buf+j,tempc->body,i);
if (i>AOT_BIN_BLK_SIZE)
i=AOT_BIN_BLK_SIZE;
MemCpy(result->buf+j,tempbin->body,i);
j+=i;
l-=i;
tempc=tempc->next;
tempbin=tempbin->next;
}
}
LinkedLstDel(a->cb);
result->abss=a->abss;
result->heap_glbls=a->heap_glbls;
result->max_align_bits=a->max_align_bits;
result->module_org=a->module_org;
LinkedLstDel(aotc->bin);
result->abss=aotc->abss;
result->heap_glbls=aotc->heap_glbls;
result->max_align_bits=aotc->max_align_bits;
result->module_org=aotc->module_org;
}
lx->exe=parent;
MemCpy(&lx->htc,htc,sizeof(CLexHashTableContext));
cc->aot=parent;
MemCpy(&cc->htc,htc,sizeof(CLexHashTableContext));
Free(htc);
Free(a);
lx->a=old_a;
lx->a_depth--;
Free(aotc);
cc->aotc=old_aot;
cc->aot_depth--;
return result;
}
CExe *CmpBuf(U8 *buf,U8 *map_name=NULL,
I64 *error_cnt=NULL, I64 *warning_cnt=NULL,U8 mapfile_drv=0)
CAOT *CmpBuf(U8 *buf,U8 *map_name=NULL,
I64 *error_cnt=NULL, I64 *warning_cnt=NULL,U8 mapfile_drv_let=0)
{
CLex *lx;
CExe *result=NULL;
lx=LexNew(buf,LF_DONT_FREE_BUF);
lx->flags|=LF_AOT_COMPILE;
QueIns(lx,Fs->last_lex);
result=CmpJoin(lx,CMPF_LEX_FIRST,map_name,mapfile_drv);
if (error_cnt) *error_cnt=lx->error_cnt;
if (warning_cnt) *warning_cnt=lx->warning_cnt;
QueRem(lx);
CCmpCtrl *cc;
CAOT *result=NULL;
cc=CmpCtrlNew(buf,CCF_DONT_FREE_BUF);
cc->flags|=CCF_AOT_COMPILE;
QueIns(cc,Fs->last_lex);
result=CmpJoin(cc,CMPF_LEX_FIRST,map_name,mapfile_drv_let);
if (error_cnt) *error_cnt=cc->error_cnt;
if (warning_cnt) *warning_cnt=cc->warning_cnt;
QueRem(cc);
if (result)
LexDel(lx);
CmpCtrlDel(cc);
return result;
}
U0 CmpFixUpJITAsm(CLex *lx,CExe *tempx)
U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tempaot)
{
I64 i,ip2=tempx->buf+tempx->ip,*str=NULL;
I64 i,ip2=tempaot->buf+tempaot->ip,*str=NULL;
U8 *ptr;
CLexCodeMisc *g_lb;
CExeAbsAddr *tempa,*tempa1;
CExeImportExport *tempe,*tempe1;
CCodeMisc *g_lb;
CAOTAbsAddr *tempa,*tempa1;
CAOTImportExport *tempie,*tempie1;
CHashExport *tempex;
tempa=tempx->abss;
tempa=tempaot->abss;
while (tempa) {
tempa1=tempa->next;
ptr=ip2+tempa->ip;
nobound_switch (tempa->type) {
case EAT_ADD_U8: *ptr(U8 *) +=ip2; break;
case EAT_SUB_U8: *ptr(U8 *) -=ip2; break;
case EAT_ADD_U16: *ptr(U16 *)+=ip2; break;
case EAT_SUB_U16: *ptr(U16 *)-=ip2; break;
case EAT_ADD_U32: *ptr(U32 *)+=ip2; break;
case EAT_SUB_U32: *ptr(U32 *)-=ip2; break;
case EAT_ADD_U64: *ptr(I64 *)+=ip2; break;
case EAT_SUB_U64: *ptr(I64 *)-=ip2; break;
case AAT_ADD_U8: *ptr(U8 *) +=ip2; break;
case AAT_SUB_U8: *ptr(U8 *) -=ip2; break;
case AAT_ADD_U16: *ptr(U16 *)+=ip2; break;
case AAT_SUB_U16: *ptr(U16 *)-=ip2; break;
case AAT_ADD_U32: *ptr(U32 *)+=ip2; break;
case AAT_SUB_U32: *ptr(U32 *)-=ip2; break;
case AAT_ADD_U64: *ptr(I64 *)+=ip2; break;
case AAT_SUB_U64: *ptr(I64 *)-=ip2; break;
}
Free(tempa);
tempa=tempa1;
}
tempe=tempx->next_ie;
while (tempe!=&tempx->next_ie) {
tempe1=tempe->next;
if (tempe->str) {
tempie=tempaot->next_ie;
while (tempie!=&tempaot->next_ie) {
tempie1=tempie->next;
if (tempie->str) {
Free(str);
str=tempe->str;
str=tempie->str;
}
switch (tempe->type) {
case EIT_REL32_EXPORT:
case EIT_IMM32_EXPORT:
case EIT_REL64_EXPORT:
case EIT_IMM64_EXPORT:
switch (tempie->type) {
case IET_REL32_EXPORT:
case IET_IMM32_EXPORT:
case IET_REL64_EXPORT:
case IET_IMM64_EXPORT:
tempex=CAlloc(sizeof(CHashExport));
tempex->str=str;
str=NULL;
tempex->type=HTT_EXPORT_SYS_SYM|HTF_IMM;
if (tempe->type==EIT_IMM32_EXPORT||tempe->type==EIT_IMM64_EXPORT)
tempex->val=tempe->ip;
if (tempie->type==IET_IMM32_EXPORT||tempie->type==IET_IMM64_EXPORT)
tempex->val=tempie->ip;
else
tempex->val=tempe->ip+ip2;
tempex->src_link=tempe->src_link;
tempe->src_link=NULL;
tempex->val=tempie->ip+ip2;
tempex->src_link=tempie->src_link;
tempie->src_link=NULL;
HashAdd(tempex,Fs->hash_table);
SysSymImportsResolve(tempex->str);
break;
case EIT_REL_I0...EIT_IMM_I64:
if (tempe->str) {
if (tempe->flags&EIF_GOTO_LABEL) {
if(!(g_lb=LCCGoToLabelFind(lx,str)))
case IET_REL_I0...IET_IMM_I64:
if (tempie->str) {
if (tempie->flags&IEF_GOTO_LABEL) {
if(!(g_lb=COCGoToLabelFind(cc,str)))
"Unresolved Reference:%s\n",str;
else {
g_lb->use_cnt++;
g_lb=OptLabelFwd(g_lb);
i=g_lb->addr+tempx->buf;
i=g_lb->addr+tempaot->buf;
}
tempex=NULL;
} else {
if (!(tempex=HashFind(str,Fs->hash_table,HTG_ALL-HTT_IMPORT_SYS_SYM)))
if (!(tempex=HashFind(str,Fs->hash_table,
HTG_ALL-HTT_IMPORT_SYS_SYM)))
"Unresolved Reference:%s\n",str;
else {
if (tempex->type & HTT_FUN)
@@ -262,94 +249,94 @@ U0 CmpFixUpJITAsm(CLex *lx,CExe *tempx)
}
}
if (tempex || g_lb) {
ptr=tempe->ip+ip2;
nobound_switch (tempe->type) {
case EIT_REL_I0:
case EIT_IMM_U0:
ptr=tempie->ip+ip2;
nobound_switch (tempie->type) {
case IET_REL_I0:
case IET_IMM_U0:
break;
case EIT_REL_I8:
case IET_REL_I8:
if (!(MIN_I8<=i-ptr-1<=MAX_I8))
LexExcept(lx,"branch out of range at ");
LexExcept(cc,"branch out of range at ");
*ptr(U8 *) =i-ptr-1;
break;
case EIT_IMM_U8:
case IET_IMM_U8:
*ptr(U8 *) =i;
break;
case EIT_REL_I16:
case IET_REL_I16:
if (!(MIN_I16<=i-ptr-2<=MAX_I16))
LexExcept(lx,"branch out of range at ");
LexExcept(cc,"branch out of range at ");
*ptr(U16 *)=i-ptr-2;
break;
case EIT_IMM_U16:
case IET_IMM_U16:
*ptr(U16 *)=i;
break;
case EIT_REL_I32:
case IET_REL_I32:
if (!(MIN_I32<=i-ptr-4<=MAX_I32))
LexExcept(lx,"branch out of range at ");
LexExcept(cc,"branch out of range at ");
*ptr(U32 *)=i-ptr-4;
break;
case EIT_IMM_U32:
case IET_IMM_U32:
*ptr(U32 *)=i;
break;
case EIT_REL_I64:
case IET_REL_I64:
*ptr(I64 *)=i-ptr-8;
break;
case EIT_IMM_I64:
case IET_IMM_I64:
*ptr(I64 *)=i;
break;
}
}
break;
}
Free(tempe->src_link);
Free(tempe);
tempe=tempe1;
Free(tempie->src_link);
Free(tempie);
tempie=tempie1;
}
Free(str);
if (!lx->a_depth && Bt(&lx->opts,OPTf_COMPILE_TRACE))
Un(ip2,tempx->ex_U8s,64);
QueRem(tempx);
Free(tempx);
if (!cc->aot_depth && Bt(&cc->opts,OPTf_COMPILE_TRACE))
Un(ip2,tempaot->aot_U8s,64);
QueRem(tempaot);
Free(tempaot);
}
U0 CmpFixUpAOTAsm(CLex *lx,CExe *tempx)
U0 CmpFixUpAOTAsm(CCmpCtrl *cc,CAOT *tempaot)
{
CAOTCtrl *a=lx->a;
I64 i,ip2=tempx->ip+lx->a->ip;
CAOTCtrl *aotc=cc->aotc;
I64 i,ip2=tempaot->ip+cc->aotc->ip;
U8 *ptr;
CLexCodeMisc *g_lb=NULL;
CExeAbsAddr *tempa,*tempa1;
CExeImportExport *tempe,*tempe1;
CCodeMisc *g_lb=NULL;
CAOTAbsAddr *tempa,*tempa1;
CAOTImportExport *tempie,*tempie1;
tempa=tempx->abss;
tempa=tempaot->abss;
while (tempa) {
tempa1=tempa->next;
tempa->next=a->abss;
ptr=tempx->buf+tempx->ip+tempa->ip;
tempa->next=aotc->abss;
ptr=tempaot->buf+tempaot->ip+tempa->ip;
nobound_switch (tempa->type) {
case EAT_ADD_U8: *ptr(U8 *)+=ip2; break;
case EAT_SUB_U8: *ptr(U8 *)-=ip2; break;
case EAT_ADD_U16: *ptr(U16 *)+=ip2; break;
case EAT_SUB_U16: *ptr(U16 *)-=ip2; break;
case EAT_ADD_U32: *ptr(U32 *)+=ip2; break;
case EAT_SUB_U32: *ptr(U32 *)-=ip2; break;
case EAT_ADD_U64: *ptr(I64 *)+=ip2; break;
case EAT_SUB_U64: *ptr(I64 *)-=ip2; break;
case AAT_ADD_U8: *ptr(U8 *)+=ip2; break;
case AAT_SUB_U8: *ptr(U8 *)-=ip2; break;
case AAT_ADD_U16: *ptr(U16 *)+=ip2; break;
case AAT_SUB_U16: *ptr(U16 *)-=ip2; break;
case AAT_ADD_U32: *ptr(U32 *)+=ip2; break;
case AAT_SUB_U32: *ptr(U32 *)-=ip2; break;
case AAT_ADD_U64: *ptr(I64 *)+=ip2; break;
case AAT_SUB_U64: *ptr(I64 *)-=ip2; break;
}
a->abss=tempa;
aotc->abss=tempa;
tempa->ip+=ip2;
tempa=tempa1;
}
tempe=tempx->next_ie;
while (tempe!=&tempx->next_ie) {
tempe1=tempe->next;
QueRem(tempe);
if (EIT_REL_I0<=tempe->type<=EIT_IMM_I64) {
if (tempe->str) {
if (tempe->flags&EIF_GOTO_LABEL) {
if(!(g_lb=LCCGoToLabelFind(lx,tempe->str)))
"Unresolved Reference:%s\n",tempe->str;
tempie=tempaot->next_ie;
while (tempie!=&tempaot->next_ie) {
tempie1=tempie->next;
QueRem(tempie);
if (IET_REL_I0<=tempie->type<=IET_IMM_I64) {
if (tempie->str) {
if (tempie->flags&IEF_GOTO_LABEL) {
if(!(g_lb=COCGoToLabelFind(cc,tempie->str)))
"Unresolved Reference:%s\n",tempie->str;
else {
g_lb->use_cnt++;
g_lb=OptLabelFwd(g_lb);
@@ -360,108 +347,108 @@ U0 CmpFixUpAOTAsm(CLex *lx,CExe *tempx)
} else
g_lb=NULL;
ptr=tempx->buf+tempx->ip+tempe->ip;
ptr=tempaot->buf+tempaot->ip+tempie->ip;
if (g_lb) {
i=g_lb->addr+tempx->buf;
nobound_switch (tempe->type) {
case EIT_REL_I0:
case EIT_IMM_U0:
i=g_lb->addr+tempaot->buf;
nobound_switch (tempie->type) {
case IET_REL_I0:
case IET_IMM_U0:
break;
case EIT_REL_I8:
case IET_REL_I8:
if (!(MIN_I8<=i-ptr-1<=MAX_I8))
LexExcept(lx,"branch out of range at ");
LexExcept(cc,"branch out of range at ");
*ptr(U8 *) =i-ptr-1;
break;
case EIT_IMM_U8:
case IET_IMM_U8:
*ptr(U8 *) =i;
break;
case EIT_REL_I16:
case IET_REL_I16:
if (!(MIN_I16<=i-ptr-2<=MAX_I16))
LexExcept(lx,"branch out of range at ");
LexExcept(cc,"branch out of range at ");
*ptr(U16 *)=i-ptr-2;
break;
case EIT_IMM_U16:
case IET_IMM_U16:
*ptr(U16 *)=i;
break;
case EIT_REL_I32:
case IET_REL_I32:
if (!(MIN_I32<=i-ptr-4<=MAX_I32))
LexExcept(lx,"branch out of range at ");
LexExcept(cc,"branch out of range at ");
*ptr(U32 *)=i-ptr-4;
break;
case EIT_IMM_U32:
case IET_IMM_U32:
*ptr(U32 *)=i;
break;
case EIT_REL_I64:
case IET_REL_I64:
*ptr(I64 *)=i-ptr-8;
break;
case EIT_IMM_I64:
case IET_IMM_I64:
*ptr(I64 *)=i;
break;
}
Free(tempe->src_link);
Free(tempe);
Free(tempie->src_link);
Free(tempie);
} else {
switch (tempe->type) {
switch (tempie->type) {
sub_switch_start:
case EIT_REL32_EXPORT:
case EIT_IMM32_EXPORT:
case EIT_REL64_EXPORT:
case EIT_IMM64_EXPORT:
case EIT_IMM_U0:
case EIT_IMM_U8:
case EIT_IMM_U16:
case EIT_IMM_U32:
case EIT_IMM_I64:
case EIT_REL_I0:
case IET_REL32_EXPORT:
case IET_IMM32_EXPORT:
case IET_REL64_EXPORT:
case IET_IMM64_EXPORT:
case IET_IMM_U0:
case IET_IMM_U8:
case IET_IMM_U16:
case IET_IMM_U32:
case IET_IMM_I64:
case IET_REL_I0:
break;
case EIT_REL_I8: *ptr(U8 *) -=ip2; break;
case EIT_REL_I16: *ptr(U16 *)-=ip2; break;
case EIT_REL_I32: *ptr(U32 *)-=ip2; break;
case EIT_REL_I64: *ptr(I64 *)-=ip2; break;
case IET_REL_I8: *ptr(U8 *) -=ip2; break;
case IET_REL_I16: *ptr(U16 *)-=ip2; break;
case IET_REL_I32: *ptr(U32 *)-=ip2; break;
case IET_REL_I64: *ptr(I64 *)-=ip2; break;
sub_switch_end:
tempe->ip+=ip2;
tempie->ip+=ip2;
break;
}
tempe->exe=NULL;
QueIns(tempe,tempx->parent_exe->last_ie);
tempie->aot=NULL;
QueIns(tempie,tempaot->parent_aot->last_ie);
}
tempe=tempe1;
tempie=tempie1;
}
}
I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv=0)
I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv_let=0)
{//AOT Compile CPP or PRJ file a and output BIN file. Returns err_cnt.
U8 *ptr,*fbuf=NULL,*fbuf2=NULL,*fbuf3=NULL,
*patch_table=MAlloc(0x20000);
CExe *tempx;
I64 i,cnt,size=0,error_cnt=0,warning_cnt=0,ex_U8s=0;
*patch_table=MAlloc(0x20000);
CAOT *tempaot;
I64 i,cnt,size=0,error_cnt=0,warning_cnt=0,aot_U8s=0;
CBinFile *bfh;
CExeImportExport *tempe,*tempe1;
CExeAbsAddr *tempa,*tempa1;
CExeHeapGlblRef *temphgr,*temphgr1;
CExeHeapGlbl *temphg,*temphg1;
CAOTImportExport *tempie,*tempie1;
CAOTAbsAddr *tempa,*tempa1;
CAOTHeapGlblRef *temphgr,*temphgr1;
CAOTHeapGlbl *temphg,*temphg1;
fbuf=DftExt(filename,"PRJ.Z");
fbuf2=MStrPrint("#include \"%s\"",fbuf);
if (map_name)
fbuf3=DftExt(map_name,"MAP.Z");
if (tempx=CmpBuf(fbuf2,fbuf3,&error_cnt,&warning_cnt,mapfile_drv)) {
ex_U8s=tempx->ex_U8s;
if (tempaot=CmpBuf(fbuf2,fbuf3,&error_cnt,&warning_cnt,mapfile_drv_let)) {
aot_U8s=tempaot->aot_U8s;
ptr=patch_table;
//See $LK,"Load",A="MN:Load"$()
//See $LK,"Load",A="MN:Load"$()
cnt=0;
tempa=tempx->abss;
tempa=tempaot->abss;
while (tempa) {
if (!(tempa->type&1))
cnt++;
tempa=tempa->next;
}
if (cnt) {
*ptr++=EIT_ABS_ADDR;
*ptr++=IET_ABS_ADDR;
*ptr(U32 *)++=cnt;
*ptr++=0;
tempa=tempx->abss;
tempa=tempaot->abss;
while (tempa) {
tempa1=tempa->next;
if (!(tempa->type&1))
@@ -470,7 +457,7 @@ I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv=0)
tempa=tempa1;
}
}
temphg=tempx->heap_glbls;
temphg=tempaot->heap_glbls;
while (temphg) {
temphg1=temphg->next;
cnt=0;
@@ -480,7 +467,7 @@ I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv=0)
temphgr=temphgr->next;
}
if (cnt) {
*ptr++=EIT_DATA_HEAP;
*ptr++=IET_DATA_HEAP;
*ptr(U32 *)++=cnt;
if (temphg->str) {
i=StrLen(temphg->str);
@@ -502,106 +489,108 @@ I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv=0)
temphg=temphg1;
}
//Do exports first
tempe=tempx->next_ie;
while (tempe!=&tempx->next_ie) {
tempe1=tempe->next;
if (!tempe->type || EIT_REL32_EXPORT<=tempe->type<=EIT_IMM64_EXPORT) {
QueRem(tempe);
*ptr++=tempe->type;
*ptr(U32 *)++=tempe->ip;
if (tempe->str) {
i=StrLen(tempe->str);
MemCpy(ptr,tempe->str,i+1);
Free(tempe->str);
//Do exports first
tempie=tempaot->next_ie;
while (tempie!=&tempaot->next_ie) {
tempie1=tempie->next;
if (!tempie->type || IET_REL32_EXPORT<=tempie->type<=IET_IMM64_EXPORT) {
QueRem(tempie);
*ptr++=tempie->type;
*ptr(U32 *)++=tempie->ip;
if (tempie->str) {
i=StrLen(tempie->str);
MemCpy(ptr,tempie->str,i+1);
Free(tempie->str);
ptr+=i+1;
} else
*ptr++=0;
Free(tempe->src_link);
Free(tempe);
Free(tempie->src_link);
Free(tempie);
}
tempe=tempe1;
tempie=tempie1;
}
//Do imports second
tempe=tempx->next_ie;
while (tempe!=&tempx->next_ie) {
tempe1=tempe->next;
QueRem(tempe);
*ptr++=tempe->type;
if (tempe->exe)
tempe->ip+=tempe->exe->ip2;
*ptr(U32 *)++=tempe->ip;
if (tempe->str) {
i=StrLen(tempe->str);
MemCpy(ptr,tempe->str,i+1);
Free(tempe->str);
//Do imports second
tempie=tempaot->next_ie;
while (tempie!=&tempaot->next_ie) {
tempie1=tempie->next;
QueRem(tempie);
*ptr++=tempie->type;
if (tempie->aot)
tempie->ip+=tempie->aot->ip2;
*ptr(U32 *)++=tempie->ip;
if (tempie->str) {
i=StrLen(tempie->str);
MemCpy(ptr,tempie->str,i+1);
Free(tempie->str);
ptr+=i+1;
} else
*ptr++=0;
Free(tempe->src_link);
Free(tempe);
tempe=tempe1;
Free(tempie->src_link);
Free(tempie);
tempie=tempie1;
}
*ptr++=EIT_END;
*ptr++=IET_END;
MemSet(ptr,0,16);
i=ptr-patch_table;
//Needs 16 ALIGN
size=(sizeof(CBinFile)+ex_U8s+i+15)&-16;
//Needs 16 ALIGN
size=(sizeof(CBinFile)+aot_U8s+i+15)&-16;
bfh=MAlloc(size);
bfh->jmp=0xEB+256*(sizeof(CBinFile)-2);
#assert sizeof(CBinFile)-2<=MAX_I8
bfh->reserved=0;
bfh->bin_signature=BIN_SIGNATURE_VAL;
bfh->module_org=tempx->module_org;
bfh->module_align_bits=tempx->max_align_bits;
bfh->patch_table_offset=sizeof(CBinFile)+ex_U8s;
bfh->module_org=tempaot->module_org;
bfh->module_align_bits=tempaot->max_align_bits;
bfh->patch_table_offset=sizeof(CBinFile)+aot_U8s;
bfh->file_size=size;
MemCpy(bfh(U8 *)+sizeof(CBinFile),tempx->buf,ex_U8s);
MemCpy(bfh(U8 *)+sizeof(CBinFile)+ex_U8s,patch_table,size-ex_U8s-sizeof(CBinFile));
MemCpy(bfh(U8 *)+sizeof(CBinFile),tempaot->buf,aot_U8s);
MemCpy(bfh(U8 *)+sizeof(CBinFile)+aot_U8s,patch_table,
size-aot_U8s-sizeof(CBinFile));
Free(fbuf2);
if (out_name)
fbuf2=DftExt(out_name,"BIN.Z");
else
fbuf2=ChgExt(fbuf,"BIN.Z");
if (!cmp.dont_write_to_dsk)
FileWrite(fbuf2,bfh,size);
FileWrite(fbuf2,bfh,size);
Free(bfh);
Free(tempx->buf);
QueDel(tempx);
Free(tempx);
Free(tempaot->buf);
QueDel(tempaot);
Free(tempaot);
}
Free(patch_table);
Free(fbuf);
Free(fbuf2);
Free(fbuf3);
Print("Errs:%d Warns:%d Code:%X Size:%X\n",error_cnt,warning_cnt,ex_U8s,size);
Print("Errs:%d Warns:%d Code:%X Size:%X\n",
error_cnt,warning_cnt,aot_U8s,size);
return error_cnt;
}
I64 ExePutS(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE,CLexHashTableContext *htc=NULL)
I64 ExePutS(U8 *buf,U8 *filename=NULL,
Bool just_load=FALSE,CLexHashTableContext *htc=NULL)
{//JIT Compile and execute text from a puts("").
I64 result;
Bool okay=TRUE;
CLex *lx;
CCmpCtrl *cc;
if (!filename)
filename=dsk.temp_filename;
lx=LexNew(buf,LF_DONT_FREE_BUF,filename);
cc=CmpCtrlNew(buf,CCF_DONT_FREE_BUF,filename);
if (just_load)
lx->flags|=LF_JUST_LOAD;
cc->flags|=CCF_JUST_LOAD;
if (Fs->last_lex!=&Fs->next_lex) {
lx->opts=Fs->last_lex->opts;
cc->opts=Fs->last_lex->opts;
if (htc) {
lx->flags=lx->flags &~LF_ASM_EXPRESSIONS |
htc->old_flags&LF_ASM_EXPRESSIONS;
MemCpy(&lx->htc,htc,sizeof(CLexHashTableContext));
cc->flags=cc->flags &~CCF_ASM_EXPRESSIONS |
htc->old_flags&CCF_ASM_EXPRESSIONS;
MemCpy(&cc->htc,htc,sizeof(CLexHashTableContext));
}
}
QueIns(lx,Fs->last_lex);
QueIns(cc,Fs->last_lex);
try {
Lex(lx);
result=ExeCmdLine(lx);
Lex(cc);
result=ExeCmdLine(cc);
} catch {
if (Fs->except_ch=='Compiler' || Fs->except_ch=='Break') {
Fs->catch_except=TRUE;
@@ -609,9 +598,9 @@ I64 ExePutS(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE,CLexHashTableContext
result=0;
}
}
QueRem(lx);
QueRem(cc);
if (okay)
LexDel(lx); //TODO: can crash
CmpCtrlDel(cc); //TODO: can crash
return result;
}
@@ -628,7 +617,7 @@ I64 ExeFile(U8 *name,Bool just_load=FALSE)
{//JIT Compile and execute a file.
I64 result;
U8 *name2=DftExt(name,"CPP.Z"),
*st=MStrPrint("#include \"%s\";",name2);
*st=MStrPrint("#include \"%s\";",name2);
result=ExePutS(st,name,just_load);
Free(st);
Free(name2);
@@ -638,19 +627,19 @@ I64 ExeFile(U8 *name,Bool just_load=FALSE)
I64 ExePutS2(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE)
{//throws exceptions
I64 result;
CLex *lx;
CCmpCtrl *cc;
if (!filename)
filename=dsk.temp_filename;
lx=LexNew(buf,LF_DONT_FREE_BUF,filename);
cc=CmpCtrlNew(buf,CCF_DONT_FREE_BUF,filename);
if (just_load)
lx->flags|=LF_JUST_LOAD;
cc->flags|=CCF_JUST_LOAD;
if (Fs->last_lex!=&Fs->next_lex)
lx->opts=Fs->last_lex->opts;
QueIns(lx,Fs->last_lex);
Lex(lx);
result=ExeCmdLine(lx);
QueRem(lx);
LexDel(lx);
cc->opts=Fs->last_lex->opts;
QueIns(cc,Fs->last_lex);
Lex(cc);
result=ExeCmdLine(cc);
QueRem(cc);
CmpCtrlDel(cc);
return result;
}
@@ -667,7 +656,7 @@ I64 ExeFile2(U8 *name,Bool just_load=FALSE)
{//throws exceptions
I64 result;
U8 *name2=DftExt(name,"CPP.Z"),
*st=MStrPrint("#include \"%s\";",name2);
*st=MStrPrint("#include \"%s\";",name2);
result=ExePutS2(st,name,just_load);
Free(st);
Free(name2);
@@ -675,17 +664,17 @@ I64 ExeFile2(U8 *name,Bool just_load=FALSE)
}
I64 StreamExePrint(U8 *fmt,...)
{//Suppose you want a value from the stream to be used in an #exe{} block...
{//Causes value from stream to be used in an #exe{} block.
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
I64 result=0;
CLexHashTableContext *htc;
CLex *lx=Fs->last_lex;
if (lx==&Fs->next_lex)
CCmpCtrl *cc=Fs->last_lex;
if (cc==&Fs->next_lex)
PrintErr("Not Compiling\n");
else {
if (!(lx->flags&LF_EXE_BLK))
LexExcept(lx,"StreamExePrint only allowed in AOT compiled #exe{} mode.");
if (htc=lx->htc.next)
if (!(cc->flags&CCF_EXE_BLK))
LexExcept(cc,"StreamExePrint only allowed in AOT compiled #exe{} mode.");
if (htc=cc->htc.next)
result=ExePutS(buf,,,htc);
}
Free(buf);
@@ -694,18 +683,13 @@ I64 StreamExePrint(U8 *fmt,...)
U0 CInit()
{
cmp.compiled_lines=0;
cmp.dont_write_to_dsk=FALSE;
CmpLoadDefines;
CmpFillTables;
MemSet(&cmp.ic_nop,0,sizeof(CIntermediateCode));
QueInit(&cmp.ic_nop);
cmp.ic_nop.ic_class=cmp.internal_types[RT_I64];
cmp.ic_nop.ic_code=IC_NOP1;
AsmHashLoad;
UasmHashLoad;
UAsmHashLoad;
}
CInit;
+77 -563
View File
@@ -40,583 +40,97 @@ Bool Echo(Bool val)
return OptEqu(OPTf_ECHO,val);
}
U0 StreamPrint(U8 *fmt,...)
{//Injects text into the compile stream. Used in #exe{} blocks.
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv),*st;
CCmpCtrl *cc=Fs->last_lex;
CStreamBlk *tempe=cc->last_stream_blk;
if (tempe!=&cc->next_stream_blk) {
st=MStrPrint("%s%s",tempe->body,buf);
Free(tempe->body);
tempe->body=st;
} else
PrintErr("No exe{} blk\n");
Free(buf);
}
U0 StreamDir()
{
U8 *dirname;
if (dirname=DirFile(Fs->last_lex->cur_lfn->full_name)) {
if (dirname=DirFile(Fs->last_lex->lex_include_stk->full_name)) {
StreamPrint("\"%s\"",dirname);
Free(dirname);
}
}
CIntermediateStruct intermediate_code_table[IC_NUM_ENTRIES]=
{
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"END"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"NOP1"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"END_EXP"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"NOP2"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"LABEL"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"CALL_START"},
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"CALL_END"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"CALL_END2"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"RETURN_VAL"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"RETURN_VAL2"},
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"IMM_I64"},
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"IMM_F64"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"STR_CONST"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"ABS_ADDR"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"ADDR_IMPORT"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"HEAP_GLBL"},
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"SIZEOF"},
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"TYPE"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"GET_LABEL"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"RBP"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"REG"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"FS"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"MOV_FS"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GS"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"MOV_GS"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"LEA"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"MOV"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TO_I64"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TO_F64"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TO_BOOL"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TOUPPER"},
{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"HOLYC_TYPECAST"},
{IS_1_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"ADDR"},
{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"COM"},
{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"NOT"},
{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"UNARY_MINUS"},
{IS_1_ARG,1,IST_DEREF,FALSE,TRUE,0,0,0,"DEREF"},
{IS_1_ARG,1,IST_DEREF,FALSE,TRUE,0,0,0,"DEREF_PP"},
{IS_1_ARG,1,IST_DEREF,FALSE,TRUE,0,0,0,"DEREF_MM"},
{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"_PP"},
{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"_MM"},
{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"PP_"},
{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"MM_"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"SHL"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"SHR"},
{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"SHL_CONST"},
{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"SHR_CONST"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"POWER"},
{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"MUL"},
{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"DIV"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"MOD"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"AND"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"OR"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"XOR"},
{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"ADD"},
{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SUB"},
{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"ADD_CONST"},
{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"SUB_CONST"},
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"EQUAL_EQUAL"},
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"NOT_EQUAL"},
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"LESS"},
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"GREATER_EQUAL"},
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"GREATER"},
{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"LESS_EQUAL"},
{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"PUSH_CMP"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"AND_AND"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"OR_OR"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"XOR_XOR"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ASSIGN"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ASSIGN_PP"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ASSIGN_MM"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"SHL_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"SHR_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"MUL_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"DIV_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"MOD_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"AND_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"OR_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"XOR_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ADD_EQUAL"},
{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"SUB_EQUAL"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"JMP"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SUB_CALL"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SWITCH"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"NOBOUND_SWITCH"},
{IS_V_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ADD_RSP"},
{IS_V_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ADD_RSP1"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ENTER"},
{IS_0_ARG,0,IST_ASSIGN,FALSE,FALSE,0,0,0,"PUSH_REGS"},
{IS_0_ARG,0,IST_ASSIGN,FALSE,FALSE,0,0,0,"POP_REGS"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"LEAVE"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"RET"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_INDIRECT"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_INDIRECT2"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_IMPORT"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_EXTERN"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"ASM"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"PREEMPT"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"PUSH"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"POP"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CLFLUSH"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"INVLPG"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"IN_U8"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"IN_U16"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"IN_U32"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"OUT_U8"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"OUT_U16"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"OUT_U32"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RFLAGS"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CARRY"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RFLAGS"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RAX"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RAX"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RBP"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RBP"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RSP"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RSP"},
{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"RIP"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"RDTSC"},
{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"HPET"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BT"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BTS"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BTR"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BTC"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"LBTS"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"LBTR"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"LBTC"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BSF"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BSR"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_INIT"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_INS"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_INS_REV"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_REM"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"STRLEN"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_ZERO"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_NOT_ZERO"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_CARRY"},
{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_NOT_CARRY"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_EQUAL_EQUAL"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_NOT_EQUAL"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_LESS"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_GREATER_EQUAL"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_GREATER"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_LESS_EQUAL"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2EQUAL_EQUAL"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2NOT_EQUAL"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2LESS"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2GREATER_EQUAL"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2GREATER"},
{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2LESS_EQUAL"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_ZERO"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_NOT_ZERO"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_MM_ZERO"},
{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_MM_NOT_ZERO"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_AND_ZERO"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_AND_NOT_ZERO"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_OR_OR_ZERO"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_OR_OR_NOT_ZERO"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BT"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BTS"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BTR"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BTC"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BT"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BTS"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BTR"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BTC"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U8"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U16"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U32"},
{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U64"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ABS_I64"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SIGN_I64"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MIN_I64"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MIN_U64"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MAX_I64"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MAX_U64"},
{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MOD_U64"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SQRI64"},
{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SQRU64"},
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SQR"},
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"ABS"},
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SQRT"},
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SIN"},
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"COS"},
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"TAN"},
{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"ATAN"},
};
CD2I32 *LexD2I32(CCmpCtrl *cc,CD2I32 *p)
{//Not HolyC. Sprite-like lex 2D point.
if (cc->token!='(')
LexExcept(cc,"expecting '(' at ");
Lex(cc); //Skip (
p->x=LexExpressionI64(cc);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
Lex(cc); //Skip ,
p->y=LexExpressionI64(cc);
if (cc->token!=')')
LexExcept(cc,"expecting ')' at ");
Lex(cc); //Skip )
return p;
}
U0 ICClassPut(CHashClass *c)
CD3I32 *LexD3I32(CCmpCtrl *cc,CD3I32 *p)
{//Not HolyC. Sprite-like lex 3D point.
if (cc->token!='(')
LexExcept(cc,"expecting '(' at ");
Lex(cc); //Skip (
p->x=LexExpressionI64(cc);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
Lex(cc); //Skip ,
p->y=LexExpressionI64(cc);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
Lex(cc); //Skip ,
p->z=LexExpressionI64(cc);
if (cc->token!=')')
LexExcept(cc,"expecting ')' at ");
Lex(cc); //Skip )
return p;
}
U8 *CmdLinePmt()
{
I64 i;
if (!c) return;
if (c->ptr_stars_cnt>4) {
PrintErr("put_class ptrcnt=%d\n",c->ptr_stars_cnt);
while (TRUE)
//TODO:
Yield;
U8 *result,*st;
if (Fs->new_answer) {
if (Fs->answer_type==RT_F64)
"%8.6fs ansf=%15.7g\n",Fs->answer_time,Fs->answer;
else
"%8.6fs ans=0x%08X=%d\n",Fs->answer_time,Fs->answer,Fs->answer;
Fs->new_answer=FALSE;
}
for (i=0;i<c->ptr_stars_cnt;i++)
'*';
c-=c->ptr_stars_cnt;
if (c->str)
"%s",c->str;
else {
PrintErr("put_class str=NULL\n");
while (TRUE)
//TODO:
Yield;
if (st=CurDir) {
"%s",st;
Free(st);
}
'' CH_SPACE;
}
'>';
if (IsDbg&&IsRaw)
RawDr;
st=GetStr(,,GSF_SHIFT_ESC_EXIT);
U0 ICArgPut(CICArg *a)
{
if (a->type_pointed)
"%Z %Z %Z ",
a->type&RT_MASK,"ST_RAW_TYPES",
a->type_pointed&RT_MASK,"ST_RAW_TYPES",
a->type>>4,"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:
"STK";
break;
case TY_IMM>>4:
"#%X",a->disp;
break;
case TY_REG>>4:
"%Z",a->reg,"ST_U64_REGS";
break;
case TY_DISP>>4:
"%X[%Z]",a->disp,a->reg,"ST_U64_REGS";
break;
case TY_RIP_DISP32>>4:
"[%X]",a->disp;
break;
case TY_SIB>>4:
if (a->disp)
"%X",a->disp;
if (a->reg==REG_RIP)
'[';
else
"[%Z+",a->reg&15,"ST_U64_REGS";
"%Z",a->reg>>8&15,"ST_U64_REGS";
switch (a->reg>>14) {
case 0: "]"; break;
case 1: "*2]"; break;
case 2: "*4]"; break;
case 3: "*8]"; break;
}
break;
}
}
i=StrLen(st);
result=MAlloc(i+1+2);
MemCpy(result,st,i+1);
i--;
while (i>=0 && Bt(chars_bmp_white_space,result[i]))
i--;
i++;
if (i>0 && result[i-1]==';')
result[i++]=';'; //The Lex goes one beyond
result[i++]='\n';//#define goes to '\n'
result[i]=0;
U0 ICPut(CLex *lx,CIntermediateCode *tempi)
{
I64 opcode=tempi->ic_code,i;
if (opcode>=IC_END_EXP && opcode!=IC_NOP2) {
"%15ts %016X ",intermediate_code_table[opcode].name,tempi->ic_data;
if (lx->pass) {
if (tempi->r.type&TY_MASK) {
ICArgPut(&tempi->r);
"<-";
}
if (tempi->a1.type&TY_MASK)
ICArgPut(&tempi->a1);
',';
if (tempi->a2.type&TY_MASK)
ICArgPut(&tempi->a2);
'' CH_SPACE;
}
ICClassPut(tempi->ic_class);
if (tempi->ic_flags & ICF_LOCK)
"$$BROWN$$lock$$FG$$ ";
if (tempi->ic_flags & ICF_A2_TO_F64)
"$$LTBLUE$$a2d$$FG$$ ";
if (tempi->ic_flags & ICF_A2_TO_INT)
"$$GREEN$$a2i$$FG$$ ";
if (tempi->ic_flags & ICF_A1_TO_F64)
"$$LTBLUE$$a1d$$FG$$ ";
if (tempi->ic_flags & ICF_A1_TO_INT)
"$$GREEN$$a1i$$FG$$ ";
if (tempi->ic_flags & ICF_R_TO_F64)
"$$LTBLUE$$rd$$FG$$ ";
if (tempi->ic_flags & ICF_R_TO_INT)
"$$GREEN$$ri$$FG$$ ";
if (tempi->ic_flags & ICF_USE_F64)
"[F64] ";
if (tempi->ic_flags & ICF_USE_UNSIGNED)
"[unsigned] ";
if (tempi->ic_flags & ICF_USE_INT)
"[int] ";
if (tempi->ic_flags & ICF_NO_DEPEND_RESULT)
"-DEP ";
if (tempi->ic_flags & ICF_DEPEND_RESULT)
"+DEP ";
if (tempi->ic_flags & ICF_NOT_ADDR)
"NOT_ADDR ";
if (tempi->ic_flags & ICF_PUSH_RESULT)
"PUSH ";
if (tempi->ic_flags & ICF_PUSH_CMP)
"PUSH_CMP ";
if (tempi->ic_flags & ICF_POP_CMP)
"POP_CMP ";
if (tempi->ic_flags & ICF_DEL_PREVIOUS_INS)
"DELPREV ";
if (tempi->ic_flags & ICF_PREVIOUS_DELETED)
"PREVDEL ";
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)
"ALT_TEMP ";
'\n';
}
}
U0 LCCQuePut(CLex *lx)
{
CIntermediateCode *tempi=lx->lcc.lcc_root.next;
while (tempi->ic_code) {
if (tempi->ic_flags&ICF_TRACE)
ICPut(lx,tempi);
tempi=tempi->next;
}
}
U0 LCCInit(CLex *lx)
{
CLexCodeCtrl *tempcbh=&lx->lcc;
QueInit(&tempcbh->lcc_root.next);
QueInit(&tempcbh->lcc_next_misc);
tempcbh->lcc_root.ic_code=IC_END;
}
CIntermediateCode *LCCAdd(CLex *lx,
I64 opcode_and_precedence,I64 arg, CHashClass *c,I64 flags=0)
{
CIntermediateCode *tempi=MAlloc(sizeof(CIntermediateCode));
tempi->ic_code=opcode_and_precedence.u16[0];
tempi->ic_precedence=opcode_and_precedence.u16[1];
tempi->ic_data=arg;
tempi->ic_class=c;
if (Bt(&lx->opts,OPTf_OPT_TRACE)) {
Bts(&lx->flags,Lf_OPT_TRACE_PRESENT);
flags|=ICF_TRACE;
}
if (lx->lock_cnt)
flags|=ICF_LOCK;
tempi->ic_flags=flags;
tempi->ic_line=lx->last_line_num;
QueIns(tempi,lx->lcc.lcc_root.last);
return tempi;
}
U0 LCCPush(CLex *lx)
{
CLexCodeCtrl *tempcbh=MAlloc(sizeof(CLexCodeCtrl));
MemCpy(tempcbh,&lx->lcc,sizeof(CLexCodeCtrl));
lx->lcc.lcc_next=tempcbh;
}
CLex *LCCPopNoFree(CLex *lx)
{
CLexCodeCtrl *tempcbh=lx->lcc.lcc_next;
MemCpy(&lx->lcc,tempcbh,sizeof(CLexCodeCtrl));
return tempcbh;
}
U0 LCCPop(CLex *lx)
{
Free(LCCPopNoFree(lx));
}
U0 LCCAppend(CLex *lx, CLexCodeCtrl *tempcbh)
{
if (tempcbh->lcc_root.next!=&lx->lcc.lcc_root.next) {
lx->lcc.lcc_root.last->next=tempcbh->lcc_root.next;
tempcbh->lcc_root.next->last=lx->lcc.lcc_root.last;
lx->lcc.lcc_root.last=tempcbh->lcc_root.last;
tempcbh->lcc_root.last->next=&lx->lcc.lcc_root.next;
}
if (tempcbh->lcc_next_misc!=&lx->lcc.lcc_next_misc) {
lx->lcc.lcc_last_misc->next=tempcbh->lcc_next_misc;
tempcbh->lcc_next_misc->last=lx->lcc.lcc_last_misc;
lx->lcc.lcc_last_misc=tempcbh->lcc_last_misc;
tempcbh->lcc_last_misc->next=&lx->lcc.lcc_next_misc;
}
Free(tempcbh);
}
CLexCodeMisc *LCCMiscNew(CLex *lx,I64 ty)
{
CLexCodeMisc *result=CAlloc(sizeof(CLexCodeMisc));
result->addr=INVALID_PTR;
result->type=ty;
QueIns(result,lx->lcc.lcc_last_misc);
return result;
}
CLexCodeMisc *LCCGoToLabelFind(CLex *lx,U8 *name)
{
CLexCodeMisc *mc=lx->lcc.lcc_next_misc;
while (mc!=&lx->lcc.lcc_next_misc) {
if ((mc->type==CMT_GOTO_LABEL||mc->type==CMT_ASM_LABEL) &&
!StrCmp(mc->str,name))
return mc;
mc=mc->next;
}
return NULL;
}
I64 LCCFloatConstFind(CLex *lx,F64 d)
{
I64 i;
CLexCodeMisc *mc=lx->lcc.lcc_next_misc;
while (mc!=&lx->lcc.lcc_next_misc) {
if (mc->type==CMT_FLOAT_CONSTS) {
for (i=0;i<mc->num_consts;i++)
if (mc->float_consts[i]==d)
return mc->addr+i*sizeof(F64);
if (mc->num_consts<CM_MAX_CONSTS) {
mc->float_consts[mc->num_consts++]=d;
return mc->addr+i*sizeof(F64);
}
}
mc=mc->next;
}
mc=LCCMiscNew(lx,CMT_FLOAT_CONSTS);
mc->float_consts=MAlloc(CM_MAX_CONSTS*sizeof(F64));
mc->float_consts[mc->num_consts++]=d;
return mc->addr;
}
U0 LCCDel(CLex *lx,CLexCodeCtrl *lcc)
{
CLexCodeMisc *mc,*mc1;
U8 *undef=NULL;
QueDel(&lcc->lcc_root.next);
mc=lcc->lcc_next_misc;
while (mc!=&lcc->lcc_next_misc) {
mc1=mc->next;
switch (mc->type) {
case CMT_GOTO_LABEL:
case CMT_ASM_LABEL:
if (!(mc->flags&CMF_DEFINED)) {
undef=mc->str;
mc->str=NULL;
} else if (!mc->use_cnt) {
PrintWarn("Unused label %s\n",mc->str);
LexWarn(lx,"Unused label at ");
}
break;
case CMT_JMP_TABLE:
Free(mc->jmp_table);
break;
case CMT_FLOAT_CONSTS:
Free(mc->float_consts);
break;
case CMT_ARRAY_DIM:
LinkedLstDel(mc->dim);
break;
case CMT_HASH_ENTRY:
HashDel(mc->h);
break;
}
Free(mc->str);
Free(mc);
mc=mc1;
}
if (undef) {
PrintErr("Undefined goto label %s\n",undef);
Free(undef);
LexExcept(lx,"Undefined goto label at ");
}
}
U0 LCCHeaderPut(CLex *lx,I64 pass,Bool put)
{
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT)) {
if (put) {
if (Bt(&lx->otrace_mask,pass-1)) {
"$$IV,1$$Pass %d:$$IV,0$$\n",pass-1;
LCCQuePut(lx);
}
} else if (Bt(&lx->otrace_mask,pass))
"$$IV,1$$Pass %d:$$IV,0$$\n",pass;
}
lx->pass=pass;
}
U8 *LCCCompile(CLex *lx,I64 *_code_size,CDbgInfo **_dbg,I64 *_type)
{
U8 *result;
CLexCodeMisc *lb;
I64 i,code_size,last_code_size;
COptReg reg_offsets[NUM_REGS];
if (_dbg) *_dbg=NULL;
lx->pass=0;
LCCHeaderPut(lx,1,TRUE);
OptPass012(lx);
LCCHeaderPut(lx,2,TRUE);
OptPass012(lx);
LCCHeaderPut(lx,3,TRUE);
OptPass3(lx,reg_offsets);
LCCHeaderPut(lx,4,TRUE);
OptPass4(lx,reg_offsets,_type);
LCCHeaderPut(lx,5,TRUE);
OptPass5(lx);
LCCHeaderPut(lx,6,TRUE);
OptPass6(lx);
LCCHeaderPut(lx,7,TRUE);
lb=lx->lcc.lcc_next_misc;
while (lb!=&lx->lcc.lcc_next_misc) {
if (lb->type==CMT_JMP_TABLE) {
for (i=0;i<lb->range;i++)
lb->jmp_table[i]=OptLabelFwd(lb->jmp_table[i]);
lb->dft=OptLabelFwd(lb->dft);
}
lb=lb->next;
}
LCCHeaderPut(lx,7,FALSE);
OptPass789A(lx,reg_offsets,NULL,NULL);
LCCHeaderPut(lx,8,FALSE);
OptPass789A(lx,reg_offsets,NULL,NULL);
LCCHeaderPut(lx,9,FALSE);
code_size=OptPass789A(lx,reg_offsets,NULL,NULL);
do {
last_code_size=code_size;
LCCHeaderPut(lx,9,FALSE);
code_size=OptPass789A(lx,reg_offsets,NULL,NULL);
if (code_size>last_code_size) {
"Pass:9 Code Size\n";
LexExcept(lx,"Compiler Optimization Error at ");
}
} while (code_size<last_code_size);
if (lx->flags&LF_AOT_COMPILE)
result=MAlloc(code_size);
else
result=MAlloc(code_size,Fs->code_heap);
LCCHeaderPut(lx,10,FALSE);
code_size=OptPass789A(lx,reg_offsets,result,_dbg);
LCCDel(lx,&lx->lcc);
if (Bt(&lx->opts,OPTf_COMPILE_TRACE)) {
if (lx->flags&LF_AOT_COMPILE) {
if (lx->a->seg_size==16)
Un(result,code_size,16);
else if (lx->a->seg_size==64)
Un(result,code_size,64);
else
Un(result,code_size,32);
} else
Un(result,code_size,64);
}
if (_code_size) *_code_size=code_size;
Free(st);
return result;
}
Binary file not shown.
+435 -449
View File
@@ -1,451 +1,437 @@
$LK,"AsmGlblsResolve ",A="FL:C:/Compiler/Asm.CPP.Z,284",BI=1$0000008E88 0001 0000000432 Funct Export Res
$LK,"AsmHashLoad ",A="FL:C:/Compiler/CInit.CPP.Z,68",BI=2$000002A482 0001 00000005BD Funct Export Res
$LK,"AsmLexExpression ",A="FL:C:/Compiler/Asm.CPP.Z,189",BI=3$0000008A60 0004 00000000B7 Funct Export Res
$LK,"AsmLineLst ",A="FL:C:/Compiler/Asm.CPP.Z,31",BI=4$00000084C8 0001 0000000148 Funct Export Res
$LK,"AsmLocalsResolve ",A="FL:C:/Compiler/Asm.CPP.Z,250",BI=5$0000008D60 0003 0000000127 Funct Export Res
$LK,"AsmMakeArgMask ",A="FL:C:/Compiler/Asm.CPP.Z,567",BI=6$00000097F8 0002 0000000444 Funct Export Res
$LK,"AsmPrsInsFlags ",A="FL:C:/Compiler/CInit.CPP.Z,18",BI=7$000002A242 0001 000000023B Funct Export Res
$LK,"AsmResolve ",A="FL:C:/Compiler/Asm.CPP.Z,209",BI=8$0000008B18 0002 0000000245 Funct Export Res
$LK,"AsmStoreCodeU32 ",A="FL:C:/Compiler/Asm.CPP.Z,90",BI=9$0000008718 0001 0000000145 Funct Export Res
$LK,"AsmStoreCodeU64 ",A="FL:C:/Compiler/Asm.CPP.Z,129",BI=10$0000008860 0005 0000000146 Funct Export Res
$LK,"AsmStoreCodeU8 ",A="FL:C:/Compiler/Asm.CPP.Z,61",BI=11$0000008610 001D 0000000103 Funct Export Res
$LK,"AsmStoreCodeU8At ",A="FL:C:/Compiler/Asm.CPP.Z,168",BI=12$00000089A8 0007 00000000B7 Funct Export Res
$LK,"AsmStoreNum ",A="FL:C:/Compiler/Asm.CPP.Z,661",BI=13$0000009C40 0004 00000004A6 Funct Export Res
$LK,"AsmUnresolvedAdd ",A="FL:C:/Compiler/Asm.CPP.Z,1",BI=14$00000083B8 0004 000000010C Funct Export Res
$LK,"CInit ",A="FL:C:/Compiler/CMain.CPP.Z,695",BI=15$000002CF52 0001 000000006B Funct Export Res
$LK,"CInternalType ",A="FL:C:/Compiler/CInit.CPP.Z,3"$007FCC2180 0002 000000000A Class
$LK,"CMP_TEMPLATES ",A="FL:C:/Compiler/Templates.CPP.Z,5"$0000000000 0001 ExportSysSym Export
$LK,"CMP_TEMPLATES_DONT_POP",A="FL:C:/Compiler/Templates.CPP.Z,179"$000000018B 0001 ExportSysSym Export
$LK,"CMP_TEMPLATES_DONT_PUSH",A="FL:C:/Compiler/Templates.CPP.Z,268"$0000000257 0001 ExportSysSym Export
$LK,"CMP_TEMPLATES_DONT_PUSH2",A="FL:C:/Compiler/Templates.CPP.Z,459"$0000000421 0001 ExportSysSym Export
$LK,"CMP_TEMPLATES_DONT_PUSH_POP",A="FL:C:/Compiler/Templates.CPP.Z,395"$0000000391 0001 ExportSysSym Export
$LK,"CN_A1 ",A="FL:C:/Compiler/BackFA.CPP.Z,2"$1 0006 0000000008 DefineStr
$LK,"CN_A2 ",A="FL:C:/Compiler/BackFA.CPP.Z,1"$0 0005 0000000008 DefineStr
$LK,"CN_MAIN ",A="FL:C:/Compiler/BackFA.CPP.Z,3"$2 0022 0000000008 DefineStr
$LK,"CN_R ",A="FL:C:/Compiler/BackFA.CPP.Z,4"$3 0003 0000000008 DefineStr
$LK,"COptMemberVar ",A="FL:C:/Compiler/OptLib.CPP.Z,544"$007FD8D750 0005 0000000028 Class
$LK,"CSubSwitch ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1343"$007FD98150 0004 0000000020 Class
$LK,"CSwitchCase ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1348"$007FD868F0 0004 0000000020 Class
$LK,"CTrace ",A="FL:C:/Compiler/CMisc.CPP.Z,33",BI=16$0000002818 0000 0000000017 Funct Export Res
$LK,"CVI2 ",A="FL:C:/Compiler/PrsStmt.CPP.Z,177"$007FD9A0C0 0003 0000000010 Class
$LK,"Cmp ",A="FL:C:/Compiler/CMain.CPP.Z,432",BI=17$000002C4AA 0000 000000059A Funct Export Res
$LK,"CmpBuf ",A="FL:C:/Compiler/CMain.CPP.Z,171",BI=18$000002BB72 0001 00000000B6 Funct Export Res
$LK,"CmpF1PushPop ",A="FL:C:/Compiler/OptLib.CPP.Z,527",BI=19$000000CCE6 0002 0000000042 Funct Export Res
$LK,"CmpF2PushPop ",A="FL:C:/Compiler/OptLib.CPP.Z,533",BI=20$000000CD2E 0005 0000000096 Funct Export Res
$LK,"CmpFillTables ",A="FL:C:/Compiler/CInit.CPP.Z,235",BI=21$000002AF3A 0001 00000003C3 Funct Export Res
$LK,"CmpFixUpAOTAsm ",A="FL:C:/Compiler/CMain.CPP.Z,315",BI=22$000002C0BA 0000 00000003EA Funct Export Res
$LK,"CmpFixUpJITAsm ",A="FL:C:/Compiler/CMain.CPP.Z,188",BI=23$000002BC2A 0000 000000048C Funct Export Res
$LK,"CmpJoin ",A="FL:C:/Compiler/CMain.CPP.Z,49",BI=24$000002B4EA 0001 0000000682 Funct Export Res
$LK,"CmpLoadDefines ",A="FL:C:/Compiler/CInit.CPP.Z,204",BI=25$000002AA42 0001 00000004F1 Funct Export Res
$LK,"CmpNoteFloatOp ",A="FL:C:/Compiler/BackFA.CPP.Z,6",BI=26$000001C43E 000E 000000020D Funct Export Res
$LK,"CmpOffset2Reg ",A="FL:C:/Compiler/OptLib.CPP.Z,83",BI=27$000000C05E 0005 0000000046 Funct Export Res
$LK,"CmpPrompt ",A="FL:C:/Compiler/Lex.CPP.Z,1",BI=28$0000004A69 0001 00000001B5 Funct Export Res
$LK,"CmpRawType ",A="FL:C:/Compiler/OptLib.CPP.Z,507",BI=29$000000CC8E 0006 0000000025 Funct Export Res
$LK,"CmpRawTypePointed ",A="FL:C:/Compiler/OptLib.CPP.Z,516",BI=30$000000CCB6 0005 0000000030 Funct Export Res
$LK,"CmpSetFloatOpPushPop",A="FL:C:/Compiler/BackFA.CPP.Z,57",BI=31$000001C64E 000C 0000000075 Funct Export Res
$LK,"Echo ",A="FL:C:/Compiler/CMisc.CPP.Z,38",BI=32$0000002830 0000 0000000017 Funct Export Res
$LK,"ExeFile ",A="FL:C:/Compiler/CMain.CPP.Z,627",BI=33$000002CC4A 0000 000000007B Funct Export Res
$LK,"ExeFile2 ",A="FL:C:/Compiler/CMain.CPP.Z,666",BI=34$000002CDE2 0000 0000000079 Funct Export Res
$LK,"ExePrint ",A="FL:C:/Compiler/CMain.CPP.Z,618",BI=35$000002CBFA 0000 0000000049 Funct Export Res
$LK,"ExePrint2 ",A="FL:C:/Compiler/CMain.CPP.Z,657",BI=36$000002CD9A 0000 0000000047 Funct Export Res
$LK,"ExePutS ",A="FL:C:/Compiler/CMain.CPP.Z,583",BI=37$000002CA4A 0003 00000001A9 Funct Export Res
$LK,"ExePutS2 ",A="FL:C:/Compiler/CMain.CPP.Z,638",BI=38$000002CCCA 0002 00000000CC Funct Export Res
$LK,"FBO1_F64 ",A="FL:C:/Compiler/OptLib.CPP.Z,94"$2 0002 0000000008 DefineStr
$LK,"FBO1_INT ",A="FL:C:/Compiler/OptLib.CPP.Z,93"$1 0013 0000000008 DefineStr
$LK,"FBO1_NOT_CONST ",A="FL:C:/Compiler/OptLib.CPP.Z,92"$0 0005 0000000008 DefineStr
$LK,"GetOpt ",A="FL:C:/Compiler/CMisc.CPP.Z,16",BI=39$0000002790 0004 000000002C Funct Export Res
$LK,"HashEntrySize ",A="FL:C:/Compiler/CHash.CPP.Z,1",BI=40$0000008098 0000 0000000103 Funct Export Res
$LK,"HashEntrySize2 ",A="FL:C:/Compiler/CHash.CPP.Z,32",BI=41$00000081A0 0002 00000001A1 Funct Export Res
$LK,"HashTableSize2 ",A="FL:C:/Compiler/CHash.CPP.Z,69",BI=42$0000008348 0000 000000006F Funct Export Res
$LK,"ICAddEct ",A="FL:C:/Compiler/BackA.CPP.Z,1",BI=43$00000200A6 0005 00000002F3 Funct Export Res
$LK,"ICAddRSP ",A="FL:C:/Compiler/BackLib.CPP.Z,69",BI=44$000001ADD6 0017 00000002A7 Funct Export Res
$LK,"ICAddSubEctEqual ",A="FL:C:/Compiler/BackA.CPP.Z,501",BI=45$00000219AE 0005 0000000673 Funct Export Res
$LK,"ICAddSubEctImm ",A="FL:C:/Compiler/BackA.CPP.Z,57",BI=46$000002039E 000D 0000000685 Funct Export Res
$LK,"ICAndAnd ",A="FL:C:/Compiler/BackB.CPP.Z,30",BI=47$000002264E 0001 000000014B Funct Export Res
$LK,"ICAndBranch ",A="FL:C:/Compiler/BackC.CPP.Z,1",BI=48$00000249C6 0002 00000006E6 Funct Export Res
$LK,"ICAndEqual ",A="FL:C:/Compiler/BackC.CPP.Z,675",BI=49$00000268A6 0001 000000010D Funct Export Res
$LK,"ICArgPut ",A="FL:C:/Compiler/CMisc.CPP.Z,267",BI=50$0000003B19 0003 00000002D6 Funct Export Res
$LK,"ICAssign ",A="FL:C:/Compiler/BackC.CPP.Z,159",BI=51$00000250AE 0001 0000000301 Funct Export Res
$LK,"ICAssignPostIncDec ",A="FL:C:/Compiler/BackB.CPP.Z,534",BI=52$0000023C9E 0002 000000020D Funct Export Res
$LK,"ICBitOps ",A="FL:C:/Compiler/BackB.CPP.Z,244",BI=53$0000022F46 0007 00000004F1 Funct Export Res
$LK,"ICBrBitOps ",A="FL:C:/Compiler/BackC.CPP.Z,207",BI=54$00000253B6 0008 00000009FB Funct Export Res
$LK,"ICBuiltInFloatConst ",A="FL:C:/Compiler/BackLib.CPP.Z,420",BI=55$000001B916 000F 00000000BD Funct Export Res
$LK,"ICClassPut ",A="FL:C:/Compiler/CMisc.CPP.Z,243",BI=56$0000003A49 0001 00000000D0 Funct Export Res
$LK,"ICCmp ",A="FL:C:/Compiler/BackB.CPP.Z,124",BI=57$0000022A5E 0006 00000004E6 Funct Export Res
$LK,"ICCmpAndBranch ",A="FL:C:/Compiler/BackB.CPP.Z,575",BI=58$0000023EAE 000C 000000081A Funct Export Res
$LK,"ICCopyTemplate ",A="FL:C:/Compiler/BackFA.CPP.Z,69",BI=59$000001C6C6 0013 000000021D Funct Export Res
$LK,"ICDeref ",A="FL:C:/Compiler/BackLib.CPP.Z,656",BI=60$000001C37E 0001 00000000B9 Funct Export Res
$LK,"ICDerefPostIncDec ",A="FL:C:/Compiler/BackB.CPP.Z,491",BI=61$0000023AA6 0002 00000001F1 Funct Export Res
$LK,"ICDiv ",A="FL:C:/Compiler/BackA.CPP.Z,409",BI=62$00000214DE 0001 00000000F1 Funct Export Res
$LK,"ICDivEqual ",A="FL:C:/Compiler/BackA.CPP.Z,428",BI=63$00000215D6 0002 00000002DE Funct Export Res
$LK,"ICFAdd ",A="FL:C:/Compiler/BackFB.CPP.Z,633",BI=64$000001FA66 0001 00000001FF Funct Export Res
$LK,"ICFCmp ",A="FL:C:/Compiler/BackFA.CPP.Z,549",BI=65$000001DA3E 0004 000000018B Funct Export Res
$LK,"ICFCmpAndBranch ",A="FL:C:/Compiler/BackFB.CPP.Z,325",BI=66$000001EE9E 0004 00000009F7 Funct Export Res
$LK,"ICFCvt ",A="FL:C:/Compiler/BackFA.CPP.Z,115",BI=67$000001C8E6 000C 000000017F Funct Export Res
$LK,"ICFCvt2 ",A="FL:C:/Compiler/BackFA.CPP.Z,163",BI=68$000001CA66 0010 0000000116 Funct Export Res
$LK,"ICFDiv ",A="FL:C:/Compiler/BackFB.CPP.Z,621",BI=69$000001F9B6 0001 00000000A9 Funct Export Res
$LK,"ICFMod ",A="FL:C:/Compiler/BackFA.CPP.Z,241",BI=70$000001CD5E 0001 0000000145 Funct Export Res
$LK,"ICFModEqual ",A="FL:C:/Compiler/BackFA.CPP.Z,589",BI=71$000001DBCE 0001 00000003D7 Funct Export Res
$LK,"ICFMul ",A="FL:C:/Compiler/BackFB.CPP.Z,603",BI=72$000001F896 0001 000000011B Funct Export Res
$LK,"ICFOp ",A="FL:C:/Compiler/BackFA.CPP.Z,350",BI=73$000001D19E 0004 000000089D Funct Export Res
$LK,"ICFOpEqual ",A="FL:C:/Compiler/BackFB.CPP.Z,1",BI=74$000001DFA6 0004 0000000EF7 Funct Export Res
$LK,"ICFPostIncDec ",A="FL:C:/Compiler/BackFB.CPP.Z,716",BI=75$000001FE9E 0002 0000000151 Funct Export Res
$LK,"ICFPow ",A="FL:C:/Compiler/BackFA.CPP.Z,271",BI=76$000001CEA6 0001 00000002F7 Funct Export Res
$LK,"ICFPreIncDec ",A="FL:C:/Compiler/BackFB.CPP.Z,694",BI=77$000001FD8E 0002 000000010A Funct Export Res
$LK,"ICFSub ",A="FL:C:/Compiler/BackFB.CPP.Z,671",BI=78$000001FC66 0001 0000000124 Funct Export Res
$LK,"ICFTemplateFun ",A="FL:C:/Compiler/BackFB.CPP.Z,744",BI=79$000001FFF6 0007 00000000AA Funct Export Res
$LK,"ICFUnaryMinus ",A="FL:C:/Compiler/BackFA.CPP.Z,190",BI=80$000001CB7E 0001 00000001E0 Funct Export Res
$LK,"ICFlagBranch ",A="FL:C:/Compiler/BackB.CPP.Z,804",BI=81$00000248BE 0004 0000000106 Funct Export Res
$LK,"ICLastIns ",A="FL:C:/Compiler/BackLib.CPP.Z,59",BI=82$000001AD96 0002 0000000040 Funct Export Res
$LK,"ICLea ",A="FL:C:/Compiler/BackLib.CPP.Z,622",BI=83$000001C1CE 0004 00000001AA Funct Export Res
$LK,"ICLocalVarInit ",A="FL:C:/Compiler/BackC.CPP.Z,908",BI=84$00000272C6 0001 0000000078 Funct Export Res
$LK,"ICMinMax ",A="FL:C:/Compiler/BackC.CPP.Z,496",BI=85$000002617E 0004 00000002AB Funct Export Res
$LK,"ICMod ",A="FL:C:/Compiler/BackA.CPP.Z,482",BI=86$00000218B6 0001 00000000F1 Funct Export Res
$LK,"ICModU64 ",A="FL:C:/Compiler/BackC.CPP.Z,575",BI=87$000002647E 0001 00000001B7 Funct Export Res
$LK,"ICModr1 ",A="FL:C:/Compiler/BackLib.CPP.Z,140",BI=88$000001B07E 0017 00000002FE Funct Export Res
$LK,"ICModr2 ",A="FL:C:/Compiler/BackLib.CPP.Z,230",BI=89$000001B37E 0016 00000000A6 Funct Export Res
$LK,"ICMov ",A="FL:C:/Compiler/BackLib.CPP.Z,442",BI=90$000001B9D6 019A 00000007F4 Funct Export Res
$LK,"ICMul ",A="FL:C:/Compiler/BackA.CPP.Z,285",BI=91$0000020E1E 0001 00000002B8 Funct Export Res
$LK,"ICMulEqual ",A="FL:C:/Compiler/BackA.CPP.Z,342",BI=92$00000210D6 0001 0000000406 Funct Export Res
$LK,"ICNot ",A="FL:C:/Compiler/BackB.CPP.Z,10",BI=93$000002254E 0001 00000000FF Funct Export Res
$LK,"ICOpSizeRex ",A="FL:C:/Compiler/BackLib.CPP.Z,28",BI=94$000001ACAE 0006 0000000040 Funct Export Res
$LK,"ICOrEqual ",A="FL:C:/Compiler/BackC.CPP.Z,698",BI=95$00000269B6 0001 000000010D Funct Export Res
$LK,"ICOrOr ",A="FL:C:/Compiler/BackB.CPP.Z,59",BI=96$000002279E 0001 0000000162 Funct Export Res
$LK,"ICPop ",A="FL:C:/Compiler/BackLib.CPP.Z,361",BI=97$000001B71E 0009 00000000EA Funct Export Res
$LK,"ICPopRegs ",A="FL:C:/Compiler/BackLib.CPP.Z,388",BI=98$000001B80E 000C 0000000057 Funct Export Res
$LK,"ICPostIncDec ",A="FL:C:/Compiler/BackB.CPP.Z,451",BI=99$00000238A6 0002 00000001FC Funct Export Res
$LK,"ICPreIncDec ",A="FL:C:/Compiler/BackB.CPP.Z,415",BI=100$00000236CE 0004 00000001D8 Funct Export Res
$LK,"ICPreempt ",A="FL:C:/Compiler/BackB.CPP.Z,348",BI=101$000002343E 0001 0000000122 Funct Export Res
$LK,"ICPush ",A="FL:C:/Compiler/BackLib.CPP.Z,310",BI=102$000001B56E 001F 0000000152 Funct Export Res
$LK,"ICPushRegs ",A="FL:C:/Compiler/BackLib.CPP.Z,348",BI=103$000001B6C6 0006 0000000054 Funct Export Res
$LK,"ICPut ",A="FL:C:/Compiler/CMisc.CPP.Z,312",BI=104$0000003DF1 0008 00000003DD Funct Export Res
$LK,"ICQueInit ",A="FL:C:/Compiler/BackC.CPP.Z,384",BI=105$0000025DB6 0001 0000000070 Funct Export Res
$LK,"ICQueIns ",A="FL:C:/Compiler/BackC.CPP.Z,398",BI=106$0000025E26 0001 0000000162 Funct Export Res
$LK,"ICQueInsRev ",A="FL:C:/Compiler/BackC.CPP.Z,439",BI=107$0000025F8E 0001 0000000162 Funct Export Res
$LK,"ICQueRem ",A="FL:C:/Compiler/BackC.CPP.Z,480",BI=108$00000260F6 0001 0000000088 Funct Export Res
$LK,"ICRex ",A="FL:C:/Compiler/BackLib.CPP.Z,22",BI=109$000001AC7E 0016 000000002D Funct Export Res
$LK,"ICShift ",A="FL:C:/Compiler/BackA.CPP.Z,639",BI=110$0000022026 0004 00000001A3 Funct Export Res
$LK,"ICShiftEqual ",A="FL:C:/Compiler/BackA.CPP.Z,672",BI=111$00000221CE 0002 000000030E Funct Export Res
$LK,"ICSlashOp ",A="FL:C:/Compiler/BackLib.CPP.Z,282",BI=112$000001B426 0027 0000000145 Funct Export Res
$LK,"ICSqr ",A="FL:C:/Compiler/BackC.CPP.Z,568",BI=113$000002642E 0002 000000004A Funct Export Res
$LK,"ICSub ",A="FL:C:/Compiler/BackA.CPP.Z,207",BI=114$0000020A26 0001 00000003F5 Funct Export Res
$LK,"ICSwap ",A="FL:C:/Compiler/BackC.CPP.Z,617",BI=115$0000026636 0001 000000026E Funct Export Res
$LK,"ICSwitch ",A="FL:C:/Compiler/BackC.CPP.Z,744",BI=116$0000026BCE 0002 00000006F2 Funct Export Res
$LK,"ICTest ",A="FL:C:/Compiler/BackLib.CPP.Z,410",BI=117$000001B8C6 000C 000000004E Funct Export Res
$LK,"ICTestAndBranch ",A="FL:C:/Compiler/BackB.CPP.Z,756",BI=118$00000246CE 0002 00000001EC Funct Export Res
$LK,"ICToBool ",A="FL:C:/Compiler/BackB.CPP.Z,400",BI=119$0000023656 0001 0000000075 Funct Export Res
$LK,"ICToF64 ",A="FL:C:/Compiler/BackB.CPP.Z,395",BI=120$0000023616 0001 000000003D Funct Export Res
$LK,"ICToI64 ",A="FL:C:/Compiler/BackB.CPP.Z,390",BI=121$00000235D6 0001 000000003D Funct Export Res
$LK,"ICToUpper ",A="FL:C:/Compiler/BackB.CPP.Z,379",BI=122$0000023566 0001 000000006B Funct Export Res
$LK,"ICU16 ",A="FL:C:/Compiler/BackLib.CPP.Z,35",BI=123$000001ACEE 0092 0000000029 Funct Export Res
$LK,"ICU24 ",A="FL:C:/Compiler/BackLib.CPP.Z,41",BI=124$000001AD1E 0063 0000000026 Funct Export Res
$LK,"ICU32 ",A="FL:C:/Compiler/BackLib.CPP.Z,47",BI=125$000001AD46 0054 0000000026 Funct Export Res
$LK,"ICU64 ",A="FL:C:/Compiler/BackLib.CPP.Z,53",BI=126$000001AD6E 0009 0000000028 Funct Export Res
$LK,"ICU8 ",A="FL:C:/Compiler/BackLib.CPP.Z,17",BI=127$000001AC56 0063 0000000028 Funct Export Res
$LK,"ICUnaries ",A="FL:C:/Compiler/BackB.CPP.Z,1",BI=128$00000224DE 0002 0000000069 Funct Export Res
$LK,"ICXorEqual ",A="FL:C:/Compiler/BackC.CPP.Z,721",BI=129$0000026AC6 0001 0000000107 Funct Export Res
$LK,"ICXorXor ",A="FL:C:/Compiler/BackB.CPP.Z,91",BI=130$0000022906 0001 0000000155 Funct Export Res
$LK,"ICZero ",A="FL:C:/Compiler/BackLib.CPP.Z,401",BI=131$000001B866 0017 000000005E Funct Export Res
$LK,"InstEntriesCompare ",A="FL:C:/Compiler/UAsm.CPP.Z,1",BI=132$00000006F0 0001 00000002A9 Funct Export Res
$LK,"InstEntryFind ",A="FL:C:/Compiler/UAsm.CPP.Z,72",BI=133$00000009A0 0002 00000003C9 Funct Export Res
$LK,"IsLexExpression2Bin ",A="FL:C:/Compiler/PrsExp.CPP.Z,1153",BI=134$000000FCCE 0000 0000000029 Funct Export Res
$LK,"LCCAdd ",A="FL:C:/Compiler/CMisc.CPP.Z,396",BI=135$0000004249 00A9 000000009F Funct Export Res
$LK,"LCCAppend ",A="FL:C:/Compiler/CMisc.CPP.Z,435",BI=136$0000004371 0003 00000000A6 Funct Export Res
$LK,"LCCCompile ",A="FL:C:/Compiler/CMisc.CPP.Z,552",BI=137$00000047A1 0006 00000002C7 Funct Export Res
$LK,"LCCDel ",A="FL:C:/Compiler/CMisc.CPP.Z,495",BI=138$0000004591 0001 0000000164 Funct Export Res
$LK,"LCCFloatConstFind ",A="FL:C:/Compiler/CMisc.CPP.Z,473",BI=139$00000044C9 000F 00000000C6 Funct Export Res
$LK,"LCCGoToLabelFind ",A="FL:C:/Compiler/CMisc.CPP.Z,461",BI=140$0000004471 0006 0000000057 Funct Export Res
$LK,"LCCHeaderPut ",A="FL:C:/Compiler/CMisc.CPP.Z,538",BI=141$00000046F9 000C 00000000A2 Funct Export Res
$LK,"LCCInit ",A="FL:C:/Compiler/CMisc.CPP.Z,388",BI=142$0000004209 000A 000000003A Funct Export Res
$LK,"LCCMiscNew ",A="FL:C:/Compiler/CMisc.CPP.Z,452",BI=143$0000004419 0021 0000000055 Funct Export Res
$LK,"LCCPop ",A="FL:C:/Compiler/CMisc.CPP.Z,430",BI=144$0000004351 0008 000000001A Funct Export Res
$LK,"LCCPopNoFree ",A="FL:C:/Compiler/CMisc.CPP.Z,423",BI=145$0000004321 0003 000000002E Funct Export Res
$LK,"LCCPush ",A="FL:C:/Compiler/CMisc.CPP.Z,416",BI=146$00000042E9 000E 0000000037 Funct Export Res
$LK,"LCCQuePut ",A="FL:C:/Compiler/CMisc.CPP.Z,378",BI=147$00000041D1 0001 0000000038 Funct Export Res
$LK,"Lex ",A="FL:C:/Compiler/Lex.CPP.Z,694",BI=148$0000006548 00ED 0000001746 Funct Export Res
$LK,"LexAttachDoc ",A="FL:C:/Compiler/Lex.CPP.Z,389",BI=149$0000005BC8 0001 0000000163 Funct Export Res
$LK,"LexBackupLastChar ",A="FL:C:/Compiler/Lex.CPP.Z,131",BI=150$0000004FE0 0003 0000000041 Funct Export Res
$LK,"LexD2I32 ",A="FL:C:/Compiler/PrsExp.CPP.Z,1198",BI=151$000000FDEE 0000 00000000A6 Funct Export Res
$LK,"LexD3I32 ",A="FL:C:/Compiler/PrsExp.CPP.Z,1214",BI=152$000000FE96 0000 00000000D9 Funct Export Res
$LK,"LexDel ",A="FL:C:/Compiler/Lex.CPP.Z,66",BI=153$0000004D61 0004 00000000A5 Funct Export Res
$LK,"LexDocRead ",A="FL:C:/Compiler/Lex.CPP.Z,368",BI=154$0000005B38 0001 0000000085 Funct Export Res
$LK,"LexDollar ",A="FL:C:/Compiler/Lex.CPP.Z,142",BI=155$0000005028 0003 0000000070 Funct Export Res
$LK,"LexExcept ",A="FL:C:/Compiler/Lex.CPP.Z,1532",BI=156$0000007FA8 00B8 00000000ED Funct Export Res
$LK,"LexExpression ",A="FL:C:/Compiler/PrsExp.CPP.Z,1186",BI=157$000000FDAE 0002 000000003F Funct Export Res
$LK,"LexExpression2Bin ",A="FL:C:/Compiler/PrsExp.CPP.Z,1135",BI=158$000000FC36 0006 0000000094 Funct Export Res
$LK,"LexExpressionF64 ",A="FL:C:/Compiler/PrsExp.CPP.Z,1172",BI=159$000000FD56 0000 0000000054 Funct Export Res
$LK,"LexExpressionI64 ",A="FL:C:/Compiler/PrsExp.CPP.Z,1158",BI=160$000000FCFE 000A 0000000054 Funct Export Res
$LK,"LexExtStr ",A="FL:C:/Compiler/Lex.CPP.Z,1449",BI=161$0000007C90 0004 00000000C5 Funct Export Res
$LK,"LexFirstRem ",A="FL:C:/Compiler/Lex.CPP.Z,328",BI=162$00000059E0 0000 00000000BC Funct Export Res
$LK,"LexGetChar ",A="FL:C:/Compiler/Lex.CPP.Z,156",BI=163$0000005098 002C 0000000915 Funct Export Res
$LK,"LexInStr ",A="FL:C:/Compiler/Lex.CPP.Z,624",BI=164$00000062E8 0001 000000025B Funct Export Res
$LK,"LexIncludeStr ",A="FL:C:/Compiler/Lex.CPP.Z,350",BI=165$0000005AA0 0003 0000000098 Funct Export Res
$LK,"LexNew ",A="FL:C:/Compiler/Lex.CPP.Z,35",BI=166$0000004C21 0004 000000013D Funct Export Res
$LK,"LexPop ",A="FL:C:/Compiler/Lex.CPP.Z,446",BI=167$0000005DB8 0004 0000000074 Funct Export Res
$LK,"LexPush ",A="FL:C:/Compiler/Lex.CPP.Z,434",BI=168$0000005D30 000F 0000000081 Funct Export Res
$LK,"LexPutLine ",A="FL:C:/Compiler/Lex.CPP.Z,1474",BI=169$0000007D58 0003 000000009B Funct Export Res
$LK,"LexPutPos ",A="FL:C:/Compiler/Lex.CPP.Z,1502",BI=170$0000007DF8 0003 00000000CA Funct Export Res
$LK,"LexPutToken ",A="FL:C:/Compiler/Lex.CPP.Z,108",BI=171$0000004EA9 0001 000000012B Funct Export Res
$LK,"LexSize ",A="FL:C:/Compiler/Lex.CPP.Z,88",BI=172$0000004E09 0000 000000009B Funct Export Res
$LK,"LexSkipEol ",A="FL:C:/Compiler/Lex.CPP.Z,321",BI=173$00000059B0 0004 000000002B Funct Export Res
$LK,"LexStatement2Bin ",A="FL:C:/Compiler/CMain.CPP.Z,15",BI=174$000002B3AA 0001 0000000140 Funct Export Res
$LK,"LexWarn ",A="FL:C:/Compiler/Lex.CPP.Z,1516",BI=175$0000007EC8 0009 00000000D9 Funct Export Res
$LK,"MDR_D32_INDIRECT_REG",A="FL:C:/Compiler/BackLib.CPP.Z,134"$3 0002 0000000008 DefineStr
$LK,"MDR_D8_INDIRECT_REG ",A="FL:C:/Compiler/BackLib.CPP.Z,133"$2 0002 0000000008 DefineStr
$LK,"MDR_INDIRECT_REG ",A="FL:C:/Compiler/BackLib.CPP.Z,132"$1 0002 0000000008 DefineStr
$LK,"MDR_REG ",A="FL:C:/Compiler/BackLib.CPP.Z,131"$0 0002 0000000008 DefineStr
$LK,"MDR_RIP_REL ",A="FL:C:/Compiler/BackLib.CPP.Z,138"$7 0004 0000000008 DefineStr
$LK,"MDR_SIB_D32_INDIRECT_REG",A="FL:C:/Compiler/BackLib.CPP.Z,137"$6 0003 0000000008 DefineStr
$LK,"MDR_SIB_D8_INDIRECT_REG",A="FL:C:/Compiler/BackLib.CPP.Z,136"$5 0002 0000000008 DefineStr
$LK,"MDR_SIB_INDIRECT_REG",A="FL:C:/Compiler/BackLib.CPP.Z,135"$4 0002 0000000008 DefineStr
$LK,"MemberAdd ",A="FL:C:/Compiler/Lex.CPP.Z,515",BI=176$0000005F68 0004 00000001B7 Funct Export Res
$LK,"MemberFind ",A="FL:C:/Compiler/Lex.CPP.Z,480",BI=177$0000005EB8 0005 0000000064 Funct Export Res
$LK,"MemberFind2 ",A="FL:C:/Compiler/Lex.CPP.Z,500",BI=178$0000005F20 0001 0000000044 Funct Export Res
$LK,"MemberLstDel ",A="FL:C:/Compiler/Lex.CPP.Z,563",BI=179$0000006120 0001 00000000F3 Funct Export Res
$LK,"MemberLstNew ",A="FL:C:/Compiler/PrsStmt.CPP.Z,38",BI=180$0000010046 0003 000000002A Funct Export Res
$LK,"MemberLstSize ",A="FL:C:/Compiler/Lex.CPP.Z,597",BI=181$0000006218 0002 00000000CF Funct Export Res
$LK,"MemberMetaData ",A="FL:C:/Compiler/Lex.CPP.Z,458",BI=182$0000005E30 0000 0000000041 Funct Export Res
$LK,"MemberMetaFind ",A="FL:C:/Compiler/Lex.CPP.Z,469",BI=183$0000005E78 0000 0000000040 Funct Export Res
$LK,"NUM_INTERNAL_TYPES ",A="FL:C:/Compiler/CInit.CPP.Z,1"$17 0002 0000000008 DefineStr
$LK,"OTrace ",A="FL:C:/Compiler/CMisc.CPP.Z,21",BI=184$00000027C0 0000 0000000017 Funct Export Res
$LK,"OTraceMask ",A="FL:C:/Compiler/CMisc.CPP.Z,26",BI=185$00000027D8 0000 0000000039 Funct Export Res
$LK,"OptBrNotZero ",A="FL:C:/Compiler/OptLib.CPP.Z,357",BI=186$000000C83E 0004 00000003B5 Funct Export Res
$LK,"OptBrZero ",A="FL:C:/Compiler/OptLib.CPP.Z,230",BI=187$000000C476 0006 00000003C4 Funct Export Res
$LK,"OptClassFwd ",A="FL:C:/Compiler/OptLib.CPP.Z,9",BI=188$000000BEC6 0013 0000000028 Funct Export Res
$LK,"OptEqu ",A="FL:C:/Compiler/CMisc.CPP.Z,1",BI=189$0000002730 0005 000000002E Funct Export Res
$LK,"OptFixSizeOf ",A="FL:C:/Compiler/OptLib.CPP.Z,484",BI=190$000000CBF6 0003 0000000098 Funct Export Res
$LK,"OptFixupBinaryOp1 ",A="FL:C:/Compiler/OptLib.CPP.Z,96",BI=191$000000C0A6 0013 00000002B0 Funct Export Res
$LK,"OptFixupBinaryOp2 ",A="FL:C:/Compiler/OptLib.CPP.Z,181",BI=192$000000C356 0001 0000000054 Funct Export Res
$LK,"OptFixupUnaryOp ",A="FL:C:/Compiler/OptLib.CPP.Z,195",BI=193$000000C3AE 0003 00000000C8 Funct Export Res
$LK,"OptFree ",A="FL:C:/Compiler/OptLib.CPP.Z,33",BI=194$000000BF6E 0024 0000000024 Funct Export Res
$LK,"OptIC4 ",A="FL:C:/Compiler/OptPass4.CPP.Z,1",BI=195$0000018AAE 0001 00000005CD Funct Export Res
$LK,"OptIC6 ",A="FL:C:/Compiler/OptPass6.CPP.Z,1",BI=196$000001A3EE 0001 0000000128 Funct Export Res
$LK,"OptLabelFwd ",A="FL:C:/Compiler/OptLib.CPP.Z,1",BI=197$000000BE9E 0010 0000000028 Funct Export Res
$LK,"OptLag ",A="FL:C:/Compiler/OptLib.CPP.Z,40",BI=198$000000BF96 000E 000000002A Funct Export Res
$LK,"OptLag1 ",A="FL:C:/Compiler/OptLib.CPP.Z,51",BI=199$000000BFC6 0006 0000000031 Funct Export Res
$LK,"OptLag2 ",A="FL:C:/Compiler/OptLib.CPP.Z,62",BI=200$000000BFFE 0003 000000002A Funct Export Res
$LK,"OptLead1 ",A="FL:C:/Compiler/OptLib.CPP.Z,73",BI=201$000000C02E 0003 0000000030 Funct Export Res
$LK,"OptMVCompare ",A="FL:C:/Compiler/OptLib.CPP.Z,550",BI=202$000000CDC6 0001 000000001A Funct Export Res
$LK,"OptOff ",A="FL:C:/Compiler/CMisc.CPP.Z,11",BI=203$0000002778 0000 0000000016 Funct Export Res
$LK,"OptOn ",A="FL:C:/Compiler/CMisc.CPP.Z,6",BI=204$0000002760 0000 0000000016 Funct Export Res
$LK,"OptPass012 ",A="FL:C:/Compiler/OptPass012.CPP.Z,23",BI=205$0000014BAE 0000 00000027E8 Funct Export Res
$LK,"OptPass3 ",A="FL:C:/Compiler/OptPass3.CPP.Z,1",BI=206$0000017396 0000 0000001717 Funct Export Res
$LK,"OptPass4 ",A="FL:C:/Compiler/OptPass4.CPP.Z,171",BI=207$000001907E 0000 0000000F16 Funct Export Res
$LK,"OptPass5 ",A="FL:C:/Compiler/OptPass5.CPP.Z,1",BI=208$0000019F96 0000 0000000457 Funct Export Res
$LK,"OptPass6 ",A="FL:C:/Compiler/OptPass6.CPP.Z,111",BI=209$000001A84E 0000 0000000402 Funct Export Res
$LK,"OptPass6Lag ",A="FL:C:/Compiler/OptPass6.CPP.Z,28",BI=210$000001A516 0001 0000000338 Funct Export Res
$LK,"OptPass789A ",A="FL:C:/Compiler/OptPass789A.CPP.Z,1",BI=211$000002733E 0000 0000002E58 Funct Export Res
$LK,"OptSetNOP1 ",A="FL:C:/Compiler/OptLib.CPP.Z,17",BI=212$000000BEEE 0079 000000003A Funct Export Res
$LK,"OptSetNOP2 ",A="FL:C:/Compiler/OptLib.CPP.Z,25",BI=213$000000BF2E 000D 000000003C Funct Export Res
$LK,"PE_CHECK_BINARY_OPS1",A="FL:C:/Compiler/PrsExp.CPP.Z,43"$5 0001 0000000008 DefineStr
$LK,"PE_CHECK_BINARY_OPS2",A="FL:C:/Compiler/PrsExp.CPP.Z,44"$6 0001 0000000008 DefineStr
$LK,"PE_DEREFERENCE ",A="FL:C:/Compiler/PrsExp.CPP.Z,42"$4 0003 0000000008 DefineStr
$LK,"PE_DO_BINARY_OP ",A="FL:C:/Compiler/PrsExp.CPP.Z,46"$8 0001 0000000008 DefineStr
$LK,"PE_DO_UNARY_OP ",A="FL:C:/Compiler/PrsExp.CPP.Z,45"$7 0001 0000000008 DefineStr
$LK,"PE_MAYBE_MODIFIERS ",A="FL:C:/Compiler/PrsExp.CPP.Z,40"$2 000A 0000000008 DefineStr
$LK,"PE_POP_ALL1 ",A="FL:C:/Compiler/PrsExp.CPP.Z,49"$11 0001 0000000008 DefineStr
$LK,"PE_POP_ALL2 ",A="FL:C:/Compiler/PrsExp.CPP.Z,50"$12 0001 0000000008 DefineStr
$LK,"PE_POP_HIGHER ",A="FL:C:/Compiler/PrsExp.CPP.Z,47"$9 0001 0000000008 DefineStr
$LK,"PE_PUSH_LOWER ",A="FL:C:/Compiler/PrsExp.CPP.Z,48"$10 0001 0000000008 DefineStr
$LK,"PE_UNARY_MODIFIERS ",A="FL:C:/Compiler/PrsExp.CPP.Z,41"$3 0009 0000000008 DefineStr
$LK,"PE_UNARY_TERM1 ",A="FL:C:/Compiler/PrsExp.CPP.Z,38"$0 0001 0000000008 DefineStr
$LK,"PE_UNARY_TERM2 ",A="FL:C:/Compiler/PrsExp.CPP.Z,39"$1 0003 0000000008 DefineStr
$LK,"ParenWarning ",A="FL:C:/Compiler/PrsExp.CPP.Z,1",BI=214$000000CDE6 0004 000000004C Funct Export Res
$LK,"PrsAddOp ",A="FL:C:/Compiler/PrsExp.CPP.Z,52",BI=215$000000CF2E 0002 00000001EB Funct Export Res
$LK,"PrsArrayDims ",A="FL:C:/Compiler/PrsStmt.CPP.Z,305",BI=216$0000010ADE 0001 000000012D Funct Export Res
$LK,"PrsAsmArg ",A="FL:C:/Compiler/Asm.CPP.Z,430",BI=217$00000093F8 0004 00000003FE Funct Export Res
$LK,"PrsAsmBlk ",A="FL:C:/Compiler/Asm.CPP.Z,1278",BI=218$000000B55E 0002 000000093F Funct Export Res
$LK,"PrsAsmDefine ",A="FL:C:/Compiler/Asm.CPP.Z,1189",BI=219$000000B1FE 0004 000000029D Funct Export Res
$LK,"PrsAsmImm ",A="FL:C:/Compiler/Asm.CPP.Z,396",BI=220$00000092C0 0002 0000000131 Funct Export Res
$LK,"PrsAsmInstruction ",A="FL:C:/Compiler/Asm.CPP.Z,779",BI=221$000000A0EE 0001 0000001110 Funct Export Res
$LK,"PrsBinFile ",A="FL:C:/Compiler/Asm.CPP.Z,1262",BI=222$000000B49E 0001 00000000B9 Funct Export Res
$LK,"PrsClass ",A="FL:C:/Compiler/PrsStmt.CPP.Z,786",BI=223$0000011B9E 0002 0000000261 Funct Export Res
$LK,"PrsClassNew ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1",BI=224$000000FF76 0003 0000000068 Funct Export Res
$LK,"PrsDoWhile ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1283",BI=225$0000012F46 0001 0000000137 Funct Export Res
$LK,"PrsDotDotDot ",A="FL:C:/Compiler/PrsStmt.CPP.Z,342",BI=226$0000010C0E 0001 0000000111 Funct Export Res
$LK,"PrsExpression ",A="FL:C:/Compiler/PrsExp.CPP.Z,298",BI=227$000000D7DE 0010 000000014C Funct Export Res
$LK,"PrsExpression2 ",A="FL:C:/Compiler/PrsExp.CPP.Z,102",BI=228$000000D11E 0001 00000006BB Funct Export Res
$LK,"PrsFor ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1306",BI=229$000001307E 0001 0000000162 Funct Export Res
$LK,"PrsFun ",A="FL:C:/Compiler/PrsStmt.CPP.Z,915",BI=230$0000011FEE 0001 00000003C9 Funct Export Res
$LK,"PrsFunCall ",A="FL:C:/Compiler/PrsExp.CPP.Z,409",BI=231$000000DC7E 0003 000000082D Funct Export Res
$LK,"PrsFunJoin ",A="FL:C:/Compiler/PrsStmt.CPP.Z,852",BI=232$0000011E06 0005 00000001E8 Funct Export Res
$LK,"PrsFunNew ",A="FL:C:/Compiler/PrsStmt.CPP.Z,22",BI=233$000000FFDE 0001 0000000068 Funct Export Res
$LK,"PrsGlblInit ",A="FL:C:/Compiler/PrsStmt.CPP.Z,265",BI=234$0000010926 0002 0000000076 Funct Export Res
$LK,"PrsGlblVarLst ",A="FL:C:/Compiler/PrsStmt.CPP.Z,981",BI=235$00000123BE 0007 0000000967 Funct Export Res
$LK,"PrsIf ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1236",BI=236$0000012D26 0001 000000012C Funct Export Res
$LK,"PrsKeyWord ",A="FL:C:/Compiler/PrsStmt.CPP.Z,45",BI=237$0000010076 000C 0000000040 Funct Export Res
$LK,"PrsNoUnusedWarn ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1554",BI=238$0000013A76 0001 000000008F Funct Export Res
$LK,"PrsOffsetOf ",A="FL:C:/Compiler/PrsExp.CPP.Z,379",BI=239$000000DB36 0002 0000000148 Funct Export Res
$LK,"PrsPop ",A="FL:C:/Compiler/PrsExp.CPP.Z,13",BI=240$000000CE5E 0016 0000000022 Funct Export Res
$LK,"PrsPop2 ",A="FL:C:/Compiler/PrsExp.CPP.Z,23",BI=241$000000CEBE 0001 000000002D Funct Export Res
$LK,"PrsPopDeref ",A="FL:C:/Compiler/PrsExp.CPP.Z,28",BI=242$000000CEEE 0004 000000003F Funct Export Res
$LK,"PrsPush ",A="FL:C:/Compiler/PrsExp.CPP.Z,8",BI=243$000000CE36 0017 0000000028 Funct Export Res
$LK,"PrsPush2 ",A="FL:C:/Compiler/PrsExp.CPP.Z,18",BI=244$000000CE86 0004 0000000033 Funct Export Res
$LK,"PrsSizeOf ",A="FL:C:/Compiler/PrsExp.CPP.Z,331",BI=245$000000D92E 0001 0000000207 Funct Export Res
$LK,"PrsStatement ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1665",BI=246$0000013F7E 0004 0000000C2C Funct Export Res
$LK,"PrsStaticInit ",A="FL:C:/Compiler/PrsStmt.CPP.Z,274",BI=247$000001099E 0002 000000013E Funct Export Res
$LK,"PrsStreamBlk ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1568",BI=248$0000013B06 0000 00000001B2 Funct Export Res
$LK,"PrsSwitch ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1355",BI=249$00000131E6 0002 000000088F Funct Export Res
$LK,"PrsTryBlk ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1604",BI=250$0000013CBE 0001 00000002BD Funct Export Res
$LK,"PrsType ",A="FL:C:/Compiler/PrsStmt.CPP.Z,377",BI=251$0000010D26 0002 0000000391 Funct Export Res
$LK,"PrsUnaryModifier ",A="FL:C:/Compiler/PrsExp.CPP.Z,980",BI=252$000000F3E6 0000 000000084A Funct Export Res
$LK,"PrsUnaryTerm ",A="FL:C:/Compiler/PrsExp.CPP.Z,617",BI=253$000000E4AE 0000 0000000F38 Funct Export Res
$LK,"PrsVarInit ",A="FL:C:/Compiler/PrsStmt.CPP.Z,66",BI=254$0000010146 0001 00000004DA Funct Export Res
$LK,"PrsVarInit2 ",A="FL:C:/Compiler/PrsStmt.CPP.Z,183",BI=255$0000010626 0004 00000002FE Funct Export Res
$LK,"PrsVarLst ",A="FL:C:/Compiler/PrsStmt.CPP.Z,471",BI=256$00000110BE 0006 0000000AD9 Funct Export Res
$LK,"PrsWhile ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1263",BI=257$0000012E56 0001 00000000EF Funct Export Res
$LK,"SLASH_OP_DEC ",A="FL:C:/Compiler/BackLib.CPP.Z,262"$0x052B0000 0006 0000000018 DefineStr
$LK,"SLASH_OP_DIV ",A="FL:C:/Compiler/BackLib.CPP.Z,267"$0x00000000 0001 0000000018 DefineStr
$LK,"SLASH_OP_FADD ",A="FL:C:/Compiler/BackLib.CPP.Z,271"$0x0000C1DE 0002 0000000018 DefineStr
$LK,"SLASH_OP_FDIV ",A="FL:C:/Compiler/BackLib.CPP.Z,275"$0x0000F9DE 0002 0000000018 DefineStr
$LK,"SLASH_OP_FDIVR ",A="FL:C:/Compiler/BackLib.CPP.Z,276"$0x0000F1DE 0003 0000000018 DefineStr
$LK,"SLASH_OP_FILD ",A="FL:C:/Compiler/BackLib.CPP.Z,280"$0x00000000 0002 0000000018 DefineStr
$LK,"SLASH_OP_FISTTP ",A="FL:C:/Compiler/BackLib.CPP.Z,279"$0x00000000 0002 0000000018 DefineStr
$LK,"SLASH_OP_FLD ",A="FL:C:/Compiler/BackLib.CPP.Z,277"$0x00000000 0008 0000000018 DefineStr
$LK,"SLASH_OP_FMUL ",A="FL:C:/Compiler/BackLib.CPP.Z,274"$0x0000C9DE 0002 0000000018 DefineStr
$LK,"SLASH_OP_FSTP ",A="FL:C:/Compiler/BackLib.CPP.Z,278"$0x00000000 000D 0000000018 DefineStr
$LK,"SLASH_OP_FSUB ",A="FL:C:/Compiler/BackLib.CPP.Z,272"$0x0000E9DE 0002 0000000018 DefineStr
$LK,"SLASH_OP_FSUBR ",A="FL:C:/Compiler/BackLib.CPP.Z,273"$0x0000E1DE 0003 0000000018 DefineStr
$LK,"SLASH_OP_IMUL ",A="FL:C:/Compiler/BackLib.CPP.Z,266"$0x00000000 0001 0000000018 DefineStr
$LK,"SLASH_OP_INC ",A="FL:C:/Compiler/BackLib.CPP.Z,261"$0x00030000 0004 0000000018 DefineStr
$LK,"SLASH_OP_MOV ",A="FL:C:/Compiler/BackLib.CPP.Z,268"$0x00000000 0002 0000000018 DefineStr
$LK,"SLASH_OP_MUL ",A="FL:C:/Compiler/BackLib.CPP.Z,265"$0x00000000 0001 0000000018 DefineStr
$LK,"SLASH_OP_NEG ",A="FL:C:/Compiler/BackLib.CPP.Z,264"$0x00000000 0001 0000000018 DefineStr
$LK,"SLASH_OP_NOT ",A="FL:C:/Compiler/BackLib.CPP.Z,263"$0x00000000 0001 0000000018 DefineStr
$LK,"SLASH_OP_POP ",A="FL:C:/Compiler/BackLib.CPP.Z,270"$0x00000000 0001 0000000018 DefineStr
$LK,"SLASH_OP_PUSH ",A="FL:C:/Compiler/BackLib.CPP.Z,269"$0x00000000 0001 0000000018 DefineStr
$LK,"StrMatchBits ",A="FL:C:/Compiler/UAsm.CPP.Z,229",BI=258$0000000EC8 0002 0000000073 Funct Export Res
$LK,"StreamDir ",A="FL:C:/Compiler/CMisc.CPP.Z,43",BI=259$0000002848 0000 000000004E Funct Export Res
$LK,"StreamExePrint ",A="FL:C:/Compiler/CMain.CPP.Z,677",BI=260$000002CE62 0000 00000000EC Funct Export Res
$LK,"StreamPrint ",A="FL:C:/Compiler/CMain.CPP.Z,1",BI=261$000002B302 0000 00000000A8 Funct Export Res
$LK,"U ",A="FL:C:/Compiler/UAsm.CPP.Z,640",BI=262$0000002580 0000 00000000CF Funct Export Res
$LK,"UasmHashLoad ",A="FL:C:/Compiler/UAsm.CPP.Z,187",BI=263$0000000D70 0001 0000000154 Funct Export Res
$LK,"Ui ",A="FL:C:/Compiler/UAsm.CPP.Z,242",BI=264$0000000F40 0002 000000163B Funct Export Res
$LK,"Un ",A="FL:C:/Compiler/UAsm.CPP.Z,655",BI=265$0000002650 0008 00000000DA Funct Export Res
$LK,"UndefinedExtern ",A="FL:C:/Compiler/PrsStmt.CPP.Z,54",BI=266$00000100B6 0001 0000000048 Funct Export Res
$LK,"UnusedExternWarning ",A="FL:C:/Compiler/PrsStmt.CPP.Z,60",BI=267$00000100FE 0004 0000000043 Funct Export Res
$LK,"asm_seg_prefixes ",A="FL:C:/Compiler/Asm.CPP.Z,777"$000000A0E8 0001 0000000006 GlbVar Export
$LK,"cmp ",A="FL:C:/Compiler/Compiler.PRJ.Z,16"$00000004E0 00C0 00000001E1 GlbVar Export
$LK,"cmp_templates ",A="FL:C:/Compiler/CExts.CPP.Z,38"$0000000000 0002 0000000004 GlbVar Export
$LK,"cmp_templates_dont_pop",A="FL:C:/Compiler/CExts.CPP.Z,39"$000000018B 0002 0000000004 GlbVar Export
$LK,"cmp_templates_dont_push",A="FL:C:/Compiler/CExts.CPP.Z,41"$0000000257 0002 0000000004 GlbVar Export
$LK,"cmp_templates_dont_push2",A="FL:C:/Compiler/CExts.CPP.Z,40"$0000000421 0002 0000000004 GlbVar Export
$LK,"cmp_templates_dont_push_pop",A="FL:C:/Compiler/CExts.CPP.Z,42"$0000000391 0002 0000000004 GlbVar Export
$LK,"cmp_type_flags_src_code",A="FL:C:/Compiler/Lex.CPP.Z,386"$0000005BC0 0001 0000000008 GlbVar Export
$LK,"intermediate_code_table",A="FL:C:/Compiler/CMisc.CPP.Z,52"$0000002898 0014 0000000BB0 GlbVar Export
$LK,"internal_types_table",A="FL:C:/Compiler/CInit.CPP.Z,8"$000002A198 0001 00000000AA GlbVar Export
$LK,"lex_zeros ",A="FL:C:/Compiler/Lex.CPP.Z,129"$0000004FDC 000A 0000000004 GlbVar Export
$LK,"uasm ",A="FL:C:/Compiler/Compiler.PRJ.Z,17"$00000006C8 001C 0000000028 GlbVar Export
Ì‹ˆŽˆŽ¢Ž­Ž¸ŽÁŽÉŽÌŽÓŽ×ŽàŽñŽõŽûŽ �%�,�7�<�H�M�T�`�e�h�r�j�‚�‹�š�’�ª�³�¹�¹�Ç�Ê�Þ�ç�ð�÷�û���/�8�F�b�n�n�†�—�—�ž�º�Æ�Î�á�è�ü�‘‘‘‘'‘2‘L‘}‘†‘Ž‘�‘›‘§‘«‘¼‘¾‘ϑّä‘î‘ý‘ ’(’(’+’3’8’º’,DË‚¤‚¤˜¤«¤³¤Á¤ߤê¤ð¤ý¤¥%¥6¥<¥Q¥o¥o¥„¥‰¥‘¥™¥Ÿ¥·¥Ê¥Õ¥Ù¥ã¥ø¥þ¥¦␍¦¦!¦!¦(¦,¦0¦>¦Q¦U¦^¦s¦w¦w¦Ц�¦£¦§¦°¦ͦѦѦѦѦÖ¦è¦÷¦§§/§?§O§T§T§T§`§h§p§v§‹§“§¡§«§¹§¿§Á§Á§Á§Á§Á§Á§Á§Á§Á§ͧÕ§ݧã§ø§¨¨ ¨¨ ¨ ¨ ¨2¨8¨D¨J¨W¨r¨‚¨ލ”¨¡¨³¨Á¨à¨©?ª\½Ð`Š`ŠnŠpŠ{ŠƒŠŽŠ™Š¤Š¦Š¾Š¾ŠÐŠÜŠåŠèŠ‹„ <ȄȄ܄ã„ê„î„…%…,…=…b…m…x…z………ª…µ…À…Â…É…Ò…Ô…ß…æ…ð…†”ú`�`�x��†�‰�’�•�˜�œ�¡�Á�®�Ñ�Ù�á�ä�æ�ö�ÿ�ŽŽŽ"Ž9ŽJŽUއŽ„7”ø—ø—˜˜$˜C˜U˜g˜y˜‹˜�˜ª˜ª˜¯˜¶˜Ì˜Þ˜ã˜þ˜␍™™+™:™G™G™G™g™g™}™�™“™¡™°™µ™µ™¼™Ò™ã™å™û™ššš)š4šJšUšjšoš‡šŒš¤š¸š½šÒš×šïšôš ››)›.›F›H›a›r›r›t›Š›‘›§›§›Â›Ú›ò›
œ œ œ<œÔCB¢B¢V¢V¢|¢|¢™¢�¢¢¢¢¢¢¢®¢³¢âȢȢȢ͢͢ã¢ê¢ý¢ ££$£-£/£/£/£/£6£=£D£K£R£Y£`£g£n£n£p£p£v£{£}¤°Ñù‹‹;‹H‹M‹Q‹Z‹g‹s‹~‹‰‹‘‹œ‹¤‹§‹³‹»‹Õ‹û‹õ‹ ŒŒIŒ5ŒYŒYŒqŒ|Œ˜ŒŸŒÃŒüŒüŒüŒüŒ]� ¨Z€‡‡.‡5‡<‡J‡[‡m‡o‡v‡|‡Œ‡—‡¡‡¬‡Ã‡Æ‡È‡Ú‡à‡ð‡ú‡ˆ ˆˆ+ˆ3ˆ3ˆIˆIˆIˆ]ˆ
¨�§`ˆ`ˆvˆ}ˆ„ˆ’ˆ£ˆµˆ·ˆ¾ˆÄˆÔˆßˆéˆôˆ ‰‰‰"‰)‰9‰C‰M‰T‰_‰s‰{‰{‰‘‰‘‰‘‰¦‰ €=Y††)†0†7†>†D†T†_†i†t†‹†Ž†�†«†µ†¿†Æ†Ñ†ã†ë†ë†‡‡‡ `¨¼¨‰¨‰È‰Ï‰×‰â‰ì‰÷‰ÿ‰ŠŠŠ?ŠAŠQŠQŠ_Š␍Ü•@œ@œeœlœƒœ�œšœ¬œ¬œÝœøœ� ���'�.�5�9�;�A�M�W�^�e�i�i�s�x�ƒ�•�•�Æ�ç�ó�ú�ž žžž$ž(ž*ž0ž<žFžMžTžXžXžežsžƒž•ž•žÆžçžóžúžŸ ŸŸŸ$Ÿ(Ÿ*Ÿ0Ÿ<ŸFŸMŸTŸXŸXŸbŸrŸ„Ÿ„ŸµŸ¼ŸÂŸÎŸØŸßŸæŸêŸìŸòŸþŸ     $ ; T ` d d g p æ „¸ƒ¸ƒëƒ÷ƒÿƒ„ „„„„"„&„.„3„7„H„Y„[„_„p„�„Ž„¡„¨„²„²„²„²„Ä„L·ÆRÏRÏVÏaÏhÏmÏrÏ‰ÏšÏ¨Ï±Ï¶Ï»Ï½Ï !%(("(*(/(h°FªÄªÄÃÄÛÄëÄ ÅÅ5ÅPÅPÅzłņʼnÅ�ŒŜşŦŬųŹŽÅÂÅÌÅÝÅäÅëÅíÅñÅúÅÆÆÆÆ!Æ2Æ=ÆCÆJÆSÆlÆ}ƆÆ�ƗƢƭƹÆÊÆÛÆçÆõÆ÷ÆþÆÇ
ÇÇÇ"ÇEÇSÇ]ÇgÇpljǚǣǬǴǽÇÃÇÇÇÌÇÐÇÝÇäÇòÇüÇÈÈ$È=ÈNÈWÈ`ÈhÈqÈwÈ{ȀȆÈ�ȚȶÈÄÈÊÈÏÈ×ÈßÈçÈôÈüÈÉ-É6ÉQÉeÉeɂɉɒɛɢɫɴɽɯɿÉêÉDÊP«»r»r»›»�»«»±»Ï»Þ»í»ü»
¼¼¼(¼$æÌæÌôÌÍ"Í"Í(Í8 .Í.ÍBÍPÍVÍͅͰͶͼͼÍÄÍ8ëu:¯:¯F¯V¯l¯t¯~¯–¯›¯«¯Á¯ɯÓ¯ë¯ð¯°°&°.°8°P°\°d°n°~°ƒ°™°£°­°·°Á°˰Õ°ß°é°ó°ý°±±±1±;±E±O±Y±c±m±w±�±—±¡±«±Á±˱ձ߱é±ó±ý±²²²%²/²9²C²M²W²a²k²u²²‰²“²�²§²±²»²ŲϲÙ²ã²í²ý²à;¯ºÀºÀØÀãÀôÀ÷ÀûÀÁ ÁÁ(Á>ÁOÁ`ÁrÁ„Á“Á¢Á³ÁÂÁÂÁÐÁÔÁØÁÝÁáÁîÁõÁ Â&Â4ÂMÂOÂSÂ]Â]ÂbÂbÂbÂgÂgÂv‡Â�Â�Â�¢¢·ÂÃÂÎÂÓÂÓÂÖÂÛÂÛÂ÷ÂÃÃÃÃÃÃÃ4Ã@ÃLÃNÃNÃQÃSÃSÃ`ÃbÃbÃeÃeÃnÃtÃyÕÕÕÕÕÕÕÕÕÕÕÕ×èúÃÉÃØÃØÃÜÃÜÃäÃÄÄ Ä¤Ä¼:*¼*¼D¼O¼S¼\¼c¼j¼€¼‘¼¢¼´¼ƼÕ¼ä¼õ¼½½ ½½½%½,½5½<½@½`½`½`½`½`½l½p½s½{½‰½‘½ž½¦½®½¿½ʽϽϽܽâ½ñ½¾
¾¾"¾1¾4¾6¾N¾e¾g¾u¾w¾‚¾ˆ¾ˆ¾�¾�¾¢¾©¾¿¾¿¾¿¾ľľÙ¾ç¾ò¾÷¾÷¾ú¾ÿ¾ÿ¾¿)¿6¿8¿8¿<¿>¿>¿Z¿h¿t¿v¿v¿y¿{¿{¿ˆ¿Š¿Š¿�¿�¿�¿�¿�¿–¿œ¿ ¿¬¿Ì¿Ù¿ç¿î¿¶Àô1ªê´ê´ò´µµµ µ3µBµbµoµ�µ£µõѵíµÿµ.¶9¶Z¶x¶‡¶¢¶­¶ȶá¶á¶ü¶%·?·Z·l·{·Š·Š·•·¨·¹·Ì·Ü·é·ô·¸#¸#¸/¸/¸/¸@¸M¸T¸s¸|¸‰¸�¸•¸ ¸¸¸иÙ¸é¸ñ¸ö¸ ¹-¹=¹M¹X¹l¹q¹y¹Ÿ¹¡¹¬¹ß¹ù¹ù¹º º(º7º@ºHºZºyº�º‰º”º–º¦º¾ºÖºîº»»/»8»A»S»a»e»l»ˆÌêBªBªKªFªFªUªdªdªsªsª‚ª‚ª‘ª‘ª ª ª¯ª¾ªͪܪܪëªúª «3¯Ø8>Ä>ÄfÄiĞįįÄÊÄÐÄÕÄÕÄðÄöÄûÄûÄÅÅÅ%Å+Å0ÅsÅ}Å„ÅŠÅŒÅŒÅŸÅ¥Å¥Å¥ÅªÅÆÅÕÅçÅìÅìÅìÅóÅúÅÆÆÆ9Æ9ÆKÆ0S[^À^ÀrÀzÀ‡À‘À¤À”"iJiJ|J‡J±JáJòJK KK&K-K;KDK\KkKxK{K”K—KœK³K¿KËKÏKÝKäKçKL0ûŽÌŽÌ—̜̥̬̮̳Ì8¶Ì¶Ì¿ÌÄÌÏÌØÌßÌáÌæÌ <9DNÆNÆhÆrÆvÆzÆÆ�Æ�ƹƹÆÃÆ &*0(0(:(B(G(!8s}JÌJÌcÌr̡̛̤̆̕ÌÅÌ"8š¤âÍâÍûÍ
ÎÎ+Î1Î7Î:Î[Î#0jrúËúËÌ#Ì2Ì8Ì;ÌCÌ$0‘™šÍšÍ°ÍÃÍÐÍÖÍÙÍáÍ%˜GiJÊJÊRÊVÊsʆʙʶÊ×ÊàÊñÊË/Ë/ËQË`ËiËvË}˯˼ËÀËÈËÈËÛËëËïËóË&X~�ÊÌÊÌçÌûÌÍÍ)ÍFÍdÍjÍsÍ�͇͖͊Í' �'�'™'·'¼'(ˆ ˜€˜€¨€É€É€×€×€×€×€à€à€ç€���%�%�3�C�C�Q�W�W�o�o�u�›�)  D � �°�¹�Ì�Ù�å�ñ�ý� ‚ ‚ ‚/‚:‚C‚J‚S‚}‚‚‚”‚£‚¯‚Á‚Á‚ê‚ê‚ì‚ÿ‚ƒƒ'ƒ*ƒAƒ*TEVHƒHƒZƒ]ƒfƒoƒ}ƒ‚ƒ‹ƒŽƒ“ƒ¡ƒªƒ·ƒ+ì8¦¦ÐÓÖÜáø&8^…ˆ¡¸Ê×êý
#,,7_y˜±³ÍÓì␍""4r‡™,üE€Ö­Ö­õ­®®7®U®d®‚®–®®®µ®º®Û®ù®¯%¯6¯M¯Q¯Q¯U¯Z¯_¯i¯l¯v¯|¯™¯œ¯œ¯œ¯¡¯§¯ïѯݯæ¯ú¯° °'°2°>°G°[°[°j°o°o°}°-4õ~®®àëø$RWW[eqŒ“¡£«Åàòÿ+07\clnt‡¥·ÄÜò$69;A]uw�¡¤¦¬ÈÈÈÚÚèò//48T`{˜¢¦Éàãõ *.DWnqƒ�¡«´ËÕ×ëõ     " 5 M O g z ‘ — © ± Ò é é é   ! .d9ΞžÔÛãìý
 "%)2@JOw|‰µºÇçìû'/4Iu}‚‚•¨¸¼Ûìññ#8;>BBGot}Š’­¿Ì×õõõ(?AANeev{›­¿ÝÝÝê'))6MM^fk‘£µÓÓÓà÷ùù   2 4 ; ] { € ‡ • Ÿ ¡ ¡ ¡ ½ Å Ç Ç é #
/€:N&N&b&i&u&…&¤&ª&±&Ð&Ò&ñ&ý&␍','2'9'9'A'I'T'\'g'r'‘'™'0„žÆIÆIäIöIüIJ
J JJJJJ9J=JCJCJ[JoJ€J€JˆJ¬JÌJíJòJKK$K/K4KAKDK{KŒK‘K—K™KŸK¢K³K¸K»KÃKÌKçKLL1L6L:L\LoLtL‹LžL£L§LÉLäLMMM-M2M5M7M=MCMTMYM_MgMgMqMzM‘M¤M©M­MÏMêM
NN"N=N]NtN‡NŒN�N²NÅNÅNàNàNàNîNOOOOO.O0O0O>OVOVOhOhOqO~O”O´OÎOÕOßOòOöOöOöOýOPP$P.PFPHPNPhPoPyP‡P’P’P¬P1h£¹¦h¦h¼hÈhÞhëhõhii!i'iFi:iWiYiYiŠixiYi©i³i2À 7;;";I;7;);j;z;l;›;¾;¾;Î;Ó;Ó;ç;ì;ì;<␍<␍<-<2<2<F<K<K<h<h<v<š<À<à<ò<==&=&=&=&=&=ï=3̟ήP®PÂPáPÍPQQ Q&Q`QeQ‘Q‘Q–Q¬Q¾QÔQêQR,RdRPRRŒR¸R½RäRìRSòR!S:S&SZSFSnS{S§S§S§S§S¯S4°>ž<ž<´<¼<Ç<Ó<Þ<à< ===6=C=n=™=“=‡=±=Ó=ë=Ø=þ=÷=>
>1>>>i>‚>|>p>Ž>¡>¡>¡>«>5¬ô[F/F/l/Œ/”/Ÿ/®/·/»/Æ/Ñ/æ/ë/0$0*0/0B0x0Ž0”0œ0Ÿ0¤0·0á0÷0ý0111(1-1J1i1o1w1w1|1‚1…1�1›1°1µ1Ï1î1ô1ù122"2'2F2N2S2^2s2|2~2�2¥2°2Å2Ê2ä23 333333"37373O3Z3m3z3’3¦3·3Á3Ã3×3è3í3ø3%4%4%4746Ð϶S¶SÔSäSïSúS?TfT„T®T´TºTÂTÄTÌTçTêTõTUFUmU‹UµU»UÁUÉUÎUÖUñUôUÿU VVUV|VšVÄVÊVÐVØVÚVâVýVW WW\WƒW¡WËWÑW×WßWäWìWX
XX!X!X&X,X2X:XBXMX_XnX�XÇXÍXÒXäXóX%YOYUY]YbYtYƒY²YÜYâYçYùYZ7ZaZgZlZlZlZ}ZˆZ“Z¹ZÑZÜZäZñZñZöZ [ [%[K[c[n[v[ƒ[ƒ[ˆ[›[¨[²[Æ[Ý[ö[\\@\T\k\y\{\�\¦\¦\¯\»\Ñ\ê\ý\ ]] ] ] ]'],]?]K]b]d]i]|]ˆ]•]Ÿ]Ÿ]±]7d¤¹¹¹¹-¹-¹G¹N¹Z¹Z¹q¹q¹ˆ¹ˆ¹Ÿ¹Ÿ¹¶¹¶¹͹ϹϹÓ¹8ló
I:I:W:a:h:::„:†:’:œ:ª:Ç:É:Ù:Ù:Þ:à:ç:;9ì|ó^*^*€*Š*½*Ì*â*+ +++ +/+6+?+D+Y+j+‰+‘+“+²+º+É+Ð+Ü+á+è+ð+ö+ø+,,,,;,A,A,I,R,a,€,‡,‰,¨,¯,¯,¯,Ã,×,Û,é,ü,ô,--$-+-3-9-;-G-W-\-^-~-„-„-�- -¥-ª-Ê-Ð-Õ-á-ñ-ö-ø-..%.-.3.5.A.Q.V.X.x.~.~.~.†.�.�.™.™.±.á.õ.ù.///2/2/D/:à?ó®>®>Ñ>Ù>é>ñ>?5?9?A?I?O?c?k?k?s?¬?ô?Ï?@@.@=@?@i@o@x@@‡@�@›@£@«@¾@Æ@Ë@Õ@õ@ý@ÿ@ AA8A@ABAbAjAjAjAsAzA�A•AžAžA£A§A¯A¸AÁAÍAèABBHBKBdBqB…BœB B¬BÑBíBÿB)C/C1C[C^C^CuC‚C–C­C¶CºCÅCÐCâCñCóCD D2DADFDpDvD{D�DœDžDÈDËDÝDìDîDEEEE(E(E3EdEmEmEmEmEvE‚E˜E±EÄEËE×EÞEÞEñEõEõEõEüEFFF'F.F.FEFGFLF_FfFrFyFyF†F�F�F¶F¶FÈF;ÄErÆÆÆÆòÆõÆúÆÇ ÇÇ Ç$Ç(Ç+Ç>ÇWÇyÇ‚Ç�ǔǭÇÏÇÔÇíÇÈÈÈ4ÈVÈXÈqȓȓȓȨÈÂÈÑÈãÈ<T�¡~Ã~ÒßîîúÃÀÃêÃÄìÃÄ Ä/Ä7Ä=¸ë¦:¦:¾:Â:Ð:ß:ê:ö:;;,;2;2;T;ƒ;g;[;¥;ª;Ñ;Ö;â;í;ï;<<<1<J<D<8<V<i<i<‹<‹<—<>X™«ÞÞìó13Rq‡’”ŸªÉÏ?ä¬áÖÖëöý*IKj—¥­¸ºÅÐÐÕ49@_~‰‹ªÉÉäòú=ZZg‹¬¬¬´@¤yžfúfú„ú•ú¡ú¸ú¿úØúÐúðúûüúû-û2ûSû?ûkû|û“ûšû³û«ûËûëû×û÷ûüü
ü6üCüCü[ü[üeüA¬%L>Ú>Ú\ÚnÚuÚ|Ú‹Ú�Ú¯Ú¯Ú´ÚÓÚØÚßÚîÚðÚÛÛ.ÛCÛ0ÛOÛ^Û`ÛÛÛÛÛŽÛ§Û Û¿ÛÉÛBdEZžîžî¼îÏîÖîÝîäîèîêîñîøîüîüîïï'ï'ï;ïFïTïeïiïnïyïŠï›ï²ï¶ï¿ïÃïÈïÙïöïöïððð6ðGðKðKðKðPð~ð“ðšð­ð±ð¶ðÁðÒðãðúðñ ñññ%ñ7ñGñ[ñ]ñvñ‰ñ�ñ�ñ�ñ˜ñ©ñºñÑñÕñÞñâñçñøñòò#ò7ò<òUòfòjò|ò|ò|ò�ò�ò’ò±ò±òÐòÛòáò÷òó␍ó"ó-ó>óOófójósówó|ó�ó¦ó¦ó´óÈóÊóãóôóøóøóÿóôô(ô-ô8ôIôZôqôyô‚ô†ô‹ôœô²ôÂôÖôÛôôôõ õõõõõ5õ"õAõPõRõqõ|õ‚õ˜õ©õ©õ©õ°õÃõÜõÜõÜõëõëõþõö ö1ö6ö<öFöHöTöTö[öfö{ö}öˆö�ö©ö«ö¶öÂöÒöÙöàöêöòöööúöüö÷ ÷␍÷ ÷!÷&÷.÷2÷4÷4÷=÷J÷`÷€÷š÷¦÷²÷¹÷¹÷Ì÷Ð÷Ð÷Ð÷×÷Ü÷ö÷øøøø,ø.ø3øMøYøeøløløyøƒøƒø•øCÌs¢æÈæÈÉÉÉ É&É(É.É4É4ÉFÉQÉXÉeÉrɅɔɨɮɰɷɽÉÇÉÇÉØÉÚÉáÉçÉñÉñÉñÉÊÊ!Ê0Ê2ÊDÊSÊSÊeÊDx£½fÊfÊ�ʓʚʠʦʨʮʴʻÊÈÊÕÊèÊõÊË
Ë ËËË+Ë=ËLËjË|ËE<mx¶ù¶ùÐùÜùîùú%úú=úUúUú_úF„ñ^Í^Ív͈Í�͖͵ͺÍÙÍÞÍøÍåÍÎÎ#Î8Î%ÎWÎDÎcÎcÎuÎ|ΛΛΣÎGM�ÎÛÎÛæÛøÛÜ+Ü
Ü7ÜUÜ‚Üa܎ܨܨÜÇÜÜÜÉÜ ÝèÜÝ/Ý/ÝAÝ[Ý[݈ݕÝÎÝÓÝÚÝÞùÝÞ2Þ>ÞpÞ]Þ‹Þ|Þ—ÞµÞÊÞ·ÞÖÞßõÞß*ß*ß<ßVßqß~ß�ß�ߥßHT[l–ø–ø°ø¼øÎøäøùòøù.ù@ùVùwùdù�ù§ù§ù±ùI(^$žÑžÑÄÑ×ÑßÑæÑíÑóÑõÑüÑÒÒÒÒÒ+Ò6ÒAÒRÒcÒzÒ‚Ò‹Ò“Ò˜Ò©Ò¿ÒÏÒáÒæÒÓÓÓÓ!ÓMÓbÓmÓ~Ó�Ó¦Ó®Ó·Ó¿ÓÄÓÕÓçÓ÷Ó Ô Ô%Ô=ÔAÔAÔLÔ]ÔnÔ…Ô�Ô–ÔžÔ£Ô´ÔÊÔÚÔìÔñÔ Õ#Õ'Õ:Õ:Õ:ÕRÕ?ÕrÕ_ÕÕ‹Õ‘Õ©ÕÁÕÆÕÛÕæÕ÷ÕÖ Ö'Ö0Ö8Ö=ÖNÖ`ÖpÖ‚Ö„ÖžÖ¶ÖºÖºÖÅÖÖÖçÖþÖ××××-×C×S×e×jׄלנ׳׳׳×Ë׸×ëר׸ר
Ø"Ø:Ø:Ø:ØFØLØWØbØt؄؛زØÉØàØàØôØÙÙÙ1Ù1Ù?ÙAÙAÙOÙOÙXÙcÙqٌٛ٢ٲٴÙÑÙÙÙöÙÚ"Ú"Ú;ÚJD¦ß¦ßÄßËßÒßÝßåßþßþßà+à+à6à:àEàmàLàyà�à�à³à·à¼àÎàßàöà␍áááá#áJá`ádádátá±á�á½áÚáÚáùáâ
â â1â6âHâYâpâ‡âŒâ”â˜âšâÁâ×âÛâæâ÷âã ã'ã,ã0ã5ãFã\ãjã~ãƒãœã­ã±ãÃãÃãÃãÃãÈã÷ãäã$ää0äMäXä^ätä…äŠä•ä¦ä·äÎäÖäÛäßäääõäåå)å+åDåUåYåYåYåkå|å“åªå¯å·å»å½åäåúåþå æ æ æ ææ$æ.æ5æHæ_æ_æ{æ{æ‰æ‹æ‹æ™æ™æ¯æ¿æÍæäæ÷æüæç ç<çLçSçaççwç¤çÍçÍçÍçÚçèè#è)è4èSèjèZèvèŒèšè²èÈèÌèÜèûè'éé3éPéPéoézé€é–é§é¬éÂéØéÜéçéøé ê ê(ê-ê1ê6êGê]êkêê„ê�ê®ê²êÄêÄêÄêÄêÉêøêåêë3ë#ë?ë\ëgëmëƒë”ë™ë¤ëµëÆëÝëåëêëîëóëìì$ì8ì:ìSìdìhìhì‡ì�ì³ì·ìÄìÄìÄì×ìÝìçìîìíííí4í4íBíDíDíRíRíhíxí†í¡í´í¹íÕíÝíùí îî4îPîPî]î}î}î}î�îK|Ìçžþžþ¸þàþÃþìþùþ ÿ%ÿÿ=ÿUÿBÿhÿaÿtÿ�ÿ”ÿ­ÿ¦ÿ¹ÿ¹ÿÆÿåÿåÿïÿLH]¦Î¦ÎÊÎâÎýÎéÎÏ Ï)Ï?Ï+Ï_ÏKÏkÏwÏ|ψϘϟϬϷÏÃÏÎÏÖÏÛÏçÏìÏÐÐ ÐÐÐ&Ð?ÐHÐTÐYÐmÐtÐxÐxÐ}ЖЛдÐÉÐÛÐàÐëÐóÐóÐóÐõÐÑ#Ñ.Ñ8ÑCÑEÑPÑXÑXÑeÑ]Ñ}Ñ�ÑMdËŽýŽý¨ýÌý¯ýØýñýêý þþ þ1þ*þ=þVþOþbþbþoþŽþŽþ˜þNhŸµfüfü„ü�ü§ü¸ü¿üØüÐüðüýüüý-ýCý/ý[ýhýhý€ý€ýŠýOLè÷öÿöÿ&-LL^q~w– Pؾð~Ë~ˠ˧˲ËÈËÈËÚËåËðËÌÌ)Ì-Ì2Ì6Ì8ÌIÌ[ÌgÌyÌ{̧̧̧̣̺̔ÌÏÌÏÌÛÌáÌëÌöÌÍ ÍÍÍ2ÍLÍLÍ^ÍQ�$D¾H¾HÜHäHðHII)I4ICIIIIIIINISIaIlI‚I„I‰I—I¢I¯I¶IÄIR4;D–­–­Ÿ­«­Ê­Ï­Ñ­Ñ­Ö­S”n�ÎÁÎÁÂ#Â#Â6Â:ÂYÂmÂrÂr‡Â�¤°ÂÁÂÆÂ×ÂëÂðÂò Ã#Ã%Ã%Ã>ÃVÃVÃxÃT<Œ—ÆrÆrÏrÚrårðrûrs#s.s>sU,ð7~a~aša a«a¼aÁaÇaÊaÎaÎaîaóa)bb5bNb:bZbsb_bb†b‹b•b˜bœb¡bºb¦bÆbÆbÆbËbÜbábçbêbîbîbccIc5cUcncZczc�c|cœc£c¨c®c±cµc·cÐc¼cÜcÜcÜcÜcôcd)dVXâôÄËê  *IW_jlw‚¡§W´?h~d~d–d¡dÄdÜdádædêdìdòdødeûdee9eQe>e]e€e˜e�e¢e¦e¨e®e´eÊe·eÖeÖeéeñefff)f5fXtŒå~°~°–°ž°«°˰ݰä°î°ô°ú°þ°±$±$±+±.±3±B±F±X±s±w±|±|±ƒ±†±‹±—±¥±©±º±ɱͱϱÞ±â±â±ô±²²␍²␍²!²$²0²:²A²g²r²v²{²±²ȲÓ²ײè²ó²÷²ù²³³³³³"³&³(³(³3³7³E³Q³U³U³U³Y³|³Yˆæ~³~³’³¨³¨³¨³ª³ª³±³³³³³º³¼³¼³ɳ˳˳سß³á³á³î³õ³÷³÷³´´´$´ZܺmÖ¹Ö¹ ºº#ºEºEºVºcº�º‰º¶º»ºäº»»#»'»J»p»u»ž»¸»Þ»õ»û»ÿ»¼ ¼%¼6¼>¼]¼c¼g¼€¼ˆ¼§¼¬¼½¼żä¼é¼ñ¼÷¼û¼ÿ¼½½%½9½>½P½U½f½k½~½‹½Ÿ½ª½³½×½ ¾4¾9¾9¾9¾I¾P¾^¾k¾�¾�¾¤¾©¾©¾À¾¾¾Ö¾ؾؾï¾ñ¾ñ¾¿
¿
¿!¿!¿2¿7¿7¿G¿l¿~¿ƒ¿ƒ¿ƒ¿ƒ¿Š¿¾¿Ï¿í¿í¿í¿ú¿ÀÀÀÀ À7À9À9ÀFÀ]À]ÀrÀtÀ�À«À«À«À¯À±À±À±À¶À¸À¸À½À½ÀÇÀÌÀÌÀêÀêÀêÀòÀôÀôÀôÀüÀþÀþÀÁÁÁÁ+Á-Á@ÁTÁTÁTÁTÁTÁgÁÁ‡Á‡ÁÊÁ[ðU<?QX_dfmtxмÃîó (7qv£«°¹ÄÌÓòø8CZy††Œ�“¤ÄÖ\V˜ÖÖîõ:EQ€€Œ”£Ýß AFe€†•ª¬·¿Úßèóû␍:Y[z§¯Üáè&(Gf�‰¤¤¤ÐÐÜ]\
N%N%`%l%Š%¦%³%Ê%Ý%è%ê% &&&/&(&G&M&^("®¬®¬½¬Ьè¬è¬î¬_hºÐ¶i¶iÌiØiîiûiÿij-j1j7jVjJjgjijijšjˆjij¹jÃj`Œ;Zž'ž'´'º'Á'Í'Ý'ý'( ()(+(K(W(g(‡(Œ(“(“(“(™(œ( (¨(À(Ë(Ö(ö()axiƒ··>·`·`·j·o·o·Ž·›·�·�·�·�·ª·²·Å·Ù·Û·Û·ã·ö·ö·¸b@„�¸¸¸'¸.¸M¸Z¸Z¸]¸_¸e¸c¬Ãê¦8¦8¾8Æ8Ñ8ÿ8Þ899Q919%9w9|9§9¬9¸9ß9ä9æ9: :'::?:F:g:Y:M:{:}:–:–:–:¢:dœŸÂÎ6Î6æ6î6ù63777Y7[7†7†7“7Ì7Ñ7Ý7è7ê7 88878)88K8M8f8f8s8š8š8š8¦8eˆ\z>4>4R4U4g4o4z4‰4‰4�4ª4µ4º4Ú4é4ñ4ü4555%505;5F5F5X5X5`5f¤6[nµnµ޵°µ°µϵßµäµäµóµ'¶.¶0¶C¶K¶K¶K¶M¶M¶M¶M¶k¶k¶k¶k¶}¶’¶�À¶g@\hƶƶÔ¶ܶã¶······h8yñ=ñ=> > >O>[>h>r>‚>‚>™> >·>¾>Ç>Þ>Þ>ô>ô>
?
? ? ?6?6?L?L?b?b?x?x?Ž?Ž?¥?¥?¼?¼?Ó?Ó?ê?ê?@@@@/@/@G@G@_@g@r@ƒ@Ž@Ÿ@¢@¤@»@Â@Â@ÎAiD€�¶]¶]Ê]Ö]ì]Ø]ø]ú] ^^&^j°Ž&^&^<^C^T^Y^n^[^z^€^€^Œ^¤^‘^°^³^µ^Ã^È^Ý^Ê^é^ì^ì^ø^␍_ú^_ _ _2_E_X_k_~_ˆ_k°·ßŽ_Ž_¤_«_¼_Á_Ö_Ã_â_è_è_ô_ `ù_```+`0`E`2`Q`T`T```u`b`�`‡`‡`š`­`À`Ó`æ`ð`lLàïö`ö`
aa,aa8a:aMa`akava~am$~¬~¬�¬¥¬¥¬«¬n�Ÿ& & T Y m u ƒ ‡ � � • ¢ ¸ â ç  !!! !5!K!M!c!y!�!·!É!o ãÎ!Î!"""'"."5">"@"C"b"i"„"†"�"¨"¯"¸"º"½"Ü"Ü"Ü"ê"ô"#!###=#E#E#a#€#…#Œ#¢#©#Ä#Æ#Í#è#þ#$$ $-$M$O$i$q$q$�$¤$¤$Ê$Ü$p|5&´&´J´^´i´~´œ´§´Å´Å´Å´Ò´ê´ì´ì´ì´ù´µµµ!µ.µFµFµWµkµq(8>.d.dUdBdadpdxdrDÏ&
&
N
[
^
g
m
„
›
²
ò
 ( - 2 = T f s † œ ° µ À à å è   $ , 1 K e m u z ” œ ¡ Á Æ É ã ý ␍␍␍␍)␍C␍K␍S␍U␍o␍w␍w␍|␍�␍Œ␍Œ␍—␍—␍£␍£␍µ␍õ␍  sôi¢6f6fLfXfcfhftff„f‹f�f›f f f¿fÞfàfåfðfõfõfg3gZgZgmg€g“g¦g«g«g¾gÑgäg÷gügügh"h5hHhJhJh]hphƒh–h–h–h¤htœè‹ÎkÎkìkllll$lDlIl_lwlclƒl’l¤l­lµl½l×lélòlúlmmm'm9mCmKmPmkmWm‹mwm—m­m™mÍm¹mÙmëmõmýmýmnn$n=nOn^nbnbninnnŒnŽn“nžn´n´n´n¸nÄnånónoo/o=oKoMoMofouo„o‡o«o¯oÕoÙopp'p+p+p+p1p?pIpbphpspp�p‰p�p¨p³pÁpËpäpçpïpûpýpqq!q#q/q1q9q?qXqpq|q‘q–q¨q·qÐqáqáqìq÷qrr0r5rGrVror€r€r†r‘r™r§r®rÀru4š£ƸƸÚ¸߸å¸é¸í¸ ¹¹vÌô#ÎFÎFðFGG0GLGYGpGƒGŽG�G°G¸G¸GÇGÇGÏGÛGñGHH H3H9H9H9H>HCHRH]HtHvH{HŠH•H¢H¬H¬HºHwH�žV6V6j6v6�6—6ƒ6£6¥6¬6·6Ã6Ë6x ‹�66*6K6S6y †ŠÖ5Ö5ê5 66z8{…f5f5‡5t5“5ž5©5´5¿5Ë5Ñ5{$#(î¬î¬ý¬ ­­­|$).­­+­9­>­D­}$/4F­F­S­a­f­l­~$5:n­n­|­‹­�­–­ V¬V¬e¬x¬~¬€0 Þ$Þ$%ò$%'% %?%G%�hÑçÆjÆjÜjèjþj kkk7k;kAk`kTkqksksk¤k’kskÃkÍk‚�[{)))!)3)R)X)_)~)€)Ÿ)±)Ð)Ö)Ý)Ý)å)í)ø)* ***)*4*S*[*ƒ0‘™f¸f¸t¸z¸~¸�¸¾¸¾¸ĸ„ð9ðð((22<N[^`ivv�——±¸ÎÎÜëú  22@Ndd�Öììú   N � ‡ ‡ ‡ ™ …ØHº    º ½ Ì Ì Ù ê í ð ð õ ú 


#
6
;
P
[
e
e
Ž
™
¤
Í
á
ÿ
 3 : ? S � ’ ˜ ž ¥ ª ª ° » » Ó ù ÿ  " ) ) ) . 1 7 = D I I O U Z Z p Š ˜ ­ ³ Ã Ï Õ ã ê ì ␍␍␍␍␍␍␍␍␍␍␍␍␍␍␍␍␍!␍,␍8␍;␍=␍A␍A␍F␍F␍W␍i␍† �…ÎüÎüÜüñü÷ü‡\ŒŸIBIBiBxB�BŠBŽB’B›B B¥B¥B¶BºBÁBÙBÜBèBˆP³ÃqCqCCŒCšC¬C·CÅCÒCàCòCýC DDD‰,(o¡G¡GÆGÒGÝGçGíG÷GýGHH H1H;HAHKHQH[HbHnHtH}H¨H·HºH¼HÆHØHâHôHþHIII I5I:IJIUIZInI�I‹I I®I·I¿IÍIÞIîIÿI J JJJ!JhJЏï‘E‘E©E«E·E»EÈEËEåEåEåEëEïE÷EFF"F$F$F-F/F/F8F:F:FCFEFEFNFNFWF]F`FjF{F�F�F�FõF‹dÙîÉDÉDÙDàDìDòDúDEE'E>EKEKENE\ElEƒE‡E�EŒ<ÍØqDqD…DŒD˜D¤D´D¹D¼DÀDÈD�D'ùFùFGGG(G=GCGOG`G`GgG›GŽ,„‹ B BB!B,B7B=BCB�0ÄÌDD-D9DGDKDcDfDnD� ®²QCQCZCfCkC‘(§­!C!C/C6CFCICOC’( ¦éBéB÷BCCC C“4zƒÑAÑAßAæAðAþABB B”Ø ¨HeHeeeteteteŽeŽe�e�e£e¥e¥e«e­e­e³eµeµe¼eÀeÅeÅeÅeÅeÅeÅeÍeâeâeìeñeúeff&f(fCfEf`fef€f…f‹f‹f f£fÊf×fÿfïfgggg;g)gAgPgUg\gegxg€gˆg�g�g�g–g¯gµgµgÎgÜgög hhhh$h)h)h/h/h8hIhKh`hbhjhphxh}h}h}h}h‹hŸh¡hµhµh½hÃhËhÐhÙháhêhðhöhøhøhøhiii"i&i(i4i6iQiWi_idimixi{i�i‡i�i“i“i¡i¯i±iÔiñi÷iÿij␍jjjjjjj9jKjPj\jbjej|j~j�j‘j•jœj¥j´jÂjÈjÐjÕjÝjâjâjëjøjýjkk&kNkNkTkYkYk_kdkdkjkokokukzkzk€k…k…k‹k�k�k–k›k›k¡k¦k¦k¦k®k®kÇkÕkïklllllllll$l$l,l5l;lGlGlNlbldlgllltl|l�l�l‡l‹l�lŸl¤l®l¸l¸lÅlìlìlòlmmm$m2mAmWm]mbmbmgmzm†mŽmžm¨m±m¿mÆmÈmÑmÑm×måmñmnn+n1n3nFnKnKnhnhnzn€n‰n�n˜n¦n«n«n¾nÄnÆnÑnãnönön
oo(o-o9o?oBoYo[o^onoxo{o{oŠo�o¯o´oÀoÆoÉoàoâoåoõoùoppppp p'p,p,p2p2p@pFpLpVp`pƒp†pˆp’p’p”pœp¡p¦p«p«p±p¹p¾p¾pÃpÎpÓpØpãpèpqqqq q$q)q.q3q3q8q=qYq‹q‘q™q™q§q­q³q½qÇqêqíqïqùqr␍r␍r␍rrr#r#r(r(r.r6r;r;r@rKrPrUrZririrzr€r€rŽr”ršr¤r®rÑrÔrÖràrïrôrôrôrürs
sssss"s"s's2s7s<sAsPsPsasgsgsus{s�s‹s•s¸s»s½sÇsÖsÛsÛsÛsãsèsñsösösüst t tttt*t0t6t@tJtmtptrt|t‹t�t�t�t˜t�t¦t«t«t±t¹t¾t¾tËtÑtÑtßtåtëtõtÿt"u%u'u1u@uEuEuEuMuRu[u`u`ujuruwuwuwu}u‡u�u¡u¦u¦u¬u¶u¼uÁuÁuÇuÕuÞuæuóuýuv
v
vvv*v;vHvOvWvavovovtvtvvvvƒvˆvˆvŽv’v—vŸv¥v§v°v¿vÇvÌvÒvÒvÚvàvîvùvþvw wwwwwwwwwww*w0w9w?wGwLwQwZwewnwvw{w{w{w�w‰wŽwŽw’w—w—w w®wºwÇwÍwÍwÖwêwêwðwùw␍x␍xxxx'x;x;xDxDxDxIxNxNxVx[x[xxx†x’x›x¡x«x³x¸x¸x¸xÌxÕxÛxíx÷x÷xÿxÿxy y y"y,y5y7y7y7y=yAyCyCyCyCyHyNyTyXyŽ|•À…±È[È[î[ÿ[\ \\\"\5\9\>\S\U\X\\\c\w\{\‡\Ž\’\™\¡\£\«\¸\Æ\Î\Ð\Ó\á\í\û\] ]]]+]–8ƒ�àOàOîOõOPPPPPP!P—L®½îýîýüýþþþ.þ4þ=þOþUþXþ”þ˜\¾Ñ–þ–þ¤þ¶þ¼þÄþÖþÜþåþ÷þýþÿÿÿoÿ™dBWaMaMqMxM„M‹M—MŸM¨M¬MºMÃMÑMÝMæMïMøMþMNšPp€8[8[N[Z[b[f[w[…[‹[—[Ÿ[ª[°[³[½[›DŽ›(P(PBPIPRP^PsP{P�P‡P‰P‰P˜PœTü␍¨¨ÄÏÖæ÷ü€ €&€-€;€G€•€�<¢­®ý®ý¾ýÏýØýÞýâýåýíýžTo€6ü6üLüZü`üfüwü…ü“ü¥ü©ü¯ü½üÀüÊüŸD”¡VýVýfýzýƒý‰ý›ý›ýŸý¢ýªý D†“þüþüý"ý+ý1ýCýCýGýJýRý¡p©Á�|�|®|²|¶|¾|È|Ë|Î|Ý|á|å|í|ö|}}(}/}6}6}@}C}U}¢dH]àYàYZ ZZZZ,Z.Z;Z=ZHZ\ZdZtZyZZ‡ZŠZœZ£ œ@˜P˜P®PºPºPÐP×PÙPõPõPõPüPQ
QQQQQQ4Q4QjQvQ‡Q—Q­Q²QµQºQºQºQÒQÙQæQíQõQúQúQRR&R+R+RCRPRXR]R]RuR�RŠR’RšR¦R¼RÇRêRîRüRS S S!S;SESQSYS^S^S}S‰SšSŸS·SÃSÒS×SæSóSøSøSøSûSTTT T+T<T>TATFTFTFTPTbTiTxT�T‰T�TœT¥T­TµT¼TÀTËTÖTÜTêTôTôTúTUU U U3U;U;U=U=U=UBUBUIUOUSUZU^U^U^U^UmUmU’U›U›UŸU­Y¤$pµèbèb ccc c)c4c@cHcRczczc†cˆcˆc”c™c™c¥cªcªc¶c»c»cÇcÌcÌcØcÝcÝcécîcîcúcÿcÿcÿcddd)d=dMdMdOdOd[dadfdfdldxdxdƒd�dœd±d¹d¿d¿dÐdÐdÙdÜdCe¥T^o Z ZÁZÈZ×ZÚZÞZæZêZîZöZ[%[,[8[¦ˆ#A!L!L=LLLVLcLjLyL�LµLËLÜLãLñLM M M2MGMOMRM^M§<¾É¸]¸]È]Ï]î]ù]^^^$^,^¨<²½0]0]@]G]f]{]�]Ž]˜]±]©|ÂÝX}X}n}w}‚}›}›}ž}­}³}¼}¾}Ä}Í}Ï}Õ}ß}æ}é}é}ó}ªDÞëø}ø}~~"~'~R~T~q~—~ž~¯~Â~«`l€©N©N²N¹NÍNáNæNO O'O)OGOIO`OtO}OO“O£OÔO¬\Xk N NN"N$N0N7NFNQN]NaNoN�N�N—NšN¤N­(AG°Y°Y¾YÇYÕYÛY®”0ª³ª³̳Ö³â³ç³÷³ý³´&´5´C´Q´h´p´z´‰´‘´ž´¦´©´©´©´«´º´Ä´Í´Õ´Ø´ê´¯LìûÈ~È~Ö~ç~ó~35Pkksz¡°Ì2h_h_ˆ_Œ_Í_Û_á_ø_`%`%`*`.`5`@`K`X`a`a`f`k`r`}`Š`Œ`™`›`�`�`�`¥`¥`¥`­`µ`½`Å`É`Ó` a±\àó¸^¸^Î^Î^Ò^×^ê^í^ò^ò^ü^_____²Hô _ _4_8_=_H_H_R_X_X_\_d_³”3T a a4a8aAaDaMaVahaha‘a•aša�a¦a¶a½aÀaÈaËaØaàaèaða÷abbb´(&,FFTcgjpµxUobb*b,b0b9bEbQbfbfb’b–b›b§bºbÄbÇbÒbÕbÝbçb8ÊÔ0^0^D^H^M^W^b^e^i^q^·8Õßx^x^Œ^�^•^Ÿ^©^¬^°^¸^¸ À'À'Ê'Ò'×'¹( Ø'Ø'æ'÷'( ((ºeã>È>ÈXÈaÈ�È�ȇÈ�ȗȟȧȭȺȺÈÈÈÍÈÍÈÓÈØÈØÈÞÈãÈãÈéÈîÈîÈÉÉ É$É$É-ÉMÉMÉMÉTÉVÉVÉ]É_É_ÉeÉeÉlÉnÉnÉtÉtÉ{É}É}ɃɃɊɊɒɘɞɦɦɦɦɲɺÉÂÉÊÉÒÉÚÉâÉèÉÊÊÊÊÊ&Ê,Ê2Ê2Ê6Ê>ÊEÊMÊUÊYÊ_ÊgÊnÊvÊ~ʂʈʓʙʦʲʸÊÀÊÄÊËÊÓÊÛÊßÊåÊíÊôÊüÊËËËËË4ËEËJËMËóË»ædvÄvÄ�ęĹĹĿÄÇÄÏÄ×ÄßÄåÄòÄòÄÅÅÅÅ Å Å%Å*Å*Å0Å5Å5ÅMÅ`ÅfÅkÅkÅtŔŔŔśÅ�Å�ŤŦŦŬŬųŵŵŻŻÅÂÅÄÅÄÅÊÅÊÅÑÅÑÅÙÅßÅåÅíÅíÅíÅíÅùÅÆ ÆÆÆ!Æ)Æ/ÆGÆVÆ`ÆcÆcÆmÆsÆyÆyÆ}Æ…ÆŒÆ�ƘƠƦƮƵƽÆÅÆÉÆÏÆÚÆàÆíÆùÆÿÆÇ ÇÇÇ"Ç&Ç,Ç4Ç;ÇCÇKÇOÇUÇ`ÇeÇ{njǑǔÇ:ȼ, ƾƾԾ۾ã¾è¾î¾½ 0'0'?'X'^'¾häúöËöË
Ì Ì-Ì8Ì<ÌCÌGÌPÌ_ÌaÌaÌuÌẁ̆̆̆̆̎̿``´¦À¦ÀÄÀÈÀÕÀ×ÀäÀæÀòÀòÀÿÀÁÁÁÁÁ2Á;Á;ÁFÁMÁ\ÁgÁmÁrÁtÁ€Á‡Á–Á¡Á§Á¬Á®ÁºÁêÁ Â0Â@ÂBÂRÂbÂrÂrÂw‘˜ŸŸŸŸ¦¼ÂÈÂÎÂÔÂÚÂÞÂÞÂÞ ÃÃ(Ã4Ã:Ã@ÃFÃHÃHÃVÃÀDµÂVÃVÃlÃoÃrÃÅÒÕØÞàêÃÁ�Ãã®Ã®ÃÊÃÖÃÚÃÞÃåÃìÃûÃÄ ÄÄÄ Ä&Ä.Ä4Ä:Ä>Ä>ÄMÄTÄ\ÄbÄhÄjÄjÄvÄÂ(!'n¿n¿w¿…¿‹¿�¿’¿Ã´ª®Š®ŠÈŠ׊׊ÚŠãŠïŠïŠûŠ‹1‹C‹U‹Y‹i‹‰‹›‹¡‹´‹½‹Á‹Ç‹ЋЋñ‹õ‹ŒŒ0ŒBŒHŒ[ŒmŒyŒ{Œ‡Œ�Œ“Œ™Œ¢Œ¢Œ¢Œ¢Œ´ŒÊŒÐŒÜŒñŒøŒ� �!�(�(�(�6�D�N�Q�_�i�l�~�ƒ�ˆ�˜�›� �°�³�·�À�È�Ú�â�ë�ŽŽŽ(Ž/Ž7ŽIŽOŽ^ŽoŽoŽvŽvŽvŽ„Ž’ŽœŽŸŽ­Ž·ŽºŽÌŽÑŽÖŽæŽéŽîŽþŽ����(�0�9�9�D�[�s�w�ƒ�›�£�©�µ�¾�Â�Ê�Ó�Ó�Ó�ì�ô�ú���"�(�.�.�.�5�G�S�[�a�g�g�i�{�Äxî£î£ü£¤¤#¤E¤y¤•¤§¤»¤Á¤ͤÖ¤Þ¤æ¤è¤î¤ô¤¥¥¥¥¥Å,ž¾ž¾¬¾³¾»¾À¾Æ¾Æ8(2–¿–¿Ÿ¿Ÿ¿­¿±¿¸¿»¿À¿Ç83=ƿƿϿϿݿá¿ï¿ò¿÷¿È8>Hþ¿þ¿ÀÀÀÀ À#À(ÀÉ4IR.À.À7À7À:ÀHÀVÀYÀ^ÀÊ &*ÆÍÆÍÔÍàÍË  x'x'�'‰'Ž'Ì 
`'`'i'q'v'ÍØ ®K®KiqËKÓKåKL LL%L6L>LFLILWLƒLƒL˜LšLšL¦L®L²L¿L¿LËLÓL×LäLäLäLM MMM!M9MHMMMSM^McMcMhM€M�M”MšM¥MªMªM¸MÁMÍMÕMÝMåMèMîMóMüMNN(N8N8N=NENMNPNVNVN[N[N[NaNdNkNvN°NÇNÔNÜNäNðNüNO OOOO%O+O2O7O7OEOUOUObObOjOrO{OŠO�O�O–O¡O§O¯OµOÀOÅOÅOÔOßOñO÷OÿOP
PP'P-P5P;P@P@PTPZPePkPmP}PƒPƒP¥PÌPÑPÑPåPëPQQQQ6Q<QLQTQ\QbQgQgQ{Q�Q—Q¨Q®Q³QÌQÒQâQêQòQøQýQýQRR/R@RFRKRZR`RqRyR�R‡RŽR“R“R©R¯RÅRÖRÜRÞRíRóRýRS␍SSSSS,S5SFSVSVS[S[SiSqS‚S•SœS¢SªS°SÀSÆSÎSÔSÔSÔSÙSÙSÙSÙSÙSøST T T T(T3T<TGTRTWTWTmTsT‰TšT T¥T·T½TÂTÛTùTùTþTþT
UUUU!U&U&UJURUZUjUpUvUvU‡U¥U¥UªUªU¶U¾UÁUÈUÎUÓUÓUóUûU VVV6VEVMVeVmVpVwV}V•V�VµV½VÀVÇVÍVÍVÍVìVüVWWWW W0W?WKWfWnWqWxW~W–W¢W½WÅWÈWÏWÕWÕWÕWÕWÚWÚWóW XX'X:X@XEXWX]XbX~X„X�X˜X›X¢X¨XÑXÙXéXïXöXöXöXûXûXY2Y8YPYcYiYnY™YŸY²YûYZ Z%Z*Z*ZDZPZ\ZgZgZlZlZ†Z’ZžZ©Z©Z®Z®ZÈZÔZàZëZëZðZðZ[ [[[#[5[;[@[O[[[g[m[s[z[�[˜[¡[­[µ[¸[¾[Ä[É[Ý[ì[ô[ \\\\#\;\C\c\}\…\ˆ\Ž\”\”\¥\®\º\Â\Å\Ì\Ò\×\é\ø\]] ]#]*]0]H]P]o]‰]‘]”]›]¡]¡]±]º]Æ]Î]Ñ]×]Ý]â]ö]^␍^'^/^2^8^>^V^^^€^œ^¤^§^­^³^³^Ä^Í^Ù^á^ä^ë^ñ^ö^__ _:_B_E_L_R_j_r_”_±_¹_¼_Ã_É_É_É_É_É_Î_Î_ä_ê_ö_ü_````,`8`A`M`U`X`_`e`j`|`‹`“`«`³`¶`½`Ã`Û`ã`aa$a'a.a4a4a4aEaNaZabaealarawa‰a˜a¤a¿aÇaÊaÑa×aïaûab:bBbEbLbRbRbRbRbRbWbWbjb…b‹b–b›b›b®bÄbÊbÕb×b×bêb␍cccc0c9cJcOcacqcqcvcvc‰cŸc¥c³cÂcÇcÇcÚcðcöcdddd.d4dQdidid“d™dždªd³dÂdÂdÇdÇdÝdãdeeeBeHeMeYebeqeqeveveŒe’e¯eÇeÇeñe÷eüeff f f%f%f;fAf^fvfvf f¦f¨f´f½fÈfÈfÈfÈfÍfÛfäfõf÷f gggg&g6g;g_gkglgqg†g£g³g×gçgígígígòg÷g h h]hmhshuhzh‹hšhÌhÔhÚhÜháhèhèhñhii i.i.i3i8iGiPi[i]ifiqiqi’i™iŸi§i²i¸iÈiÎiÖiáiçiçiìiñiøiÿij␍jj%j%j%j*j*j*j<jAjAjSj^jfjnjtjtjtjyjyj„j•j˜j¤j­j¹jÀjÆjËjËjÖjçjêjöjÿj kkkkkkk"k'k'k.k2k2k>kGkJkJkUkWkikpkvk…k�k›k¡kªk®k®kºkÃkÆkÆkÑkÓkåkìkòkúklll l#l'l'l/l6l9l;lFlJlSlVlVlalcl{l‚l�l˜l›l¡l¦l¦l­l±l±l½lÆlÉlÉlÔlÖlèlïlõlmmm m)m-m-m9mBmEmEmPmRmdmkmqmym„m�m•mŸm¢m¦m¦m®mµm¸mºmÅmÉmÒmÕmÕmàmâmúmn nnn n%n%n7n;n;nGnPnSnSn^n`nrnynn‘nœn§n­n²n²n½nÂnÂnÍnÒnÒnÝnànänënðnõnúnúnooo o$o5o=oAoUo\o`o`omoyo�o‡o—o›o¬o¾oÉoÍoÍoÚoâoêoðoðoðoðoðoòoòoppp p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p0p0pGpOp[p[p|pŠp¢p¤p°p½p½pàpípøpq
qqqq&q&q)q;qYqeqeq–sÎÀ m–s–s³s»s¾sÌsÚsïsøst&t8tCtTtXtjtmtxt�t�t tÑt¬tátõtuu u>uPutu…u‡uŽuÃuÃuÆuËuÎuÎuÕuìuóuvvv!v4v4vHvLvyvyv‘v–v–v¦v®v¾vÈvØvâvòvþvwwww+w5wEwOw_wkwpwpwpw’w wªw¯w¼wÑwÑwÖwàwïwôwúwÿwÿwxxx"x(x-x-x3x9x>x>xMx`xlxyx…x˜x x¦x¯xÆxÚxëxøxýxy(y?yLyTygyoyuy~y‡y‡yŒyŒyŒyŒyŒy˜y˜y˜y¡yºyÏy×yòyzzz&z+z+z+z6zDzIzIzPz^zcz{z‡z™z¥z«zºz¾zÇzÐzízùzÿz{{ {({U{f{s{u{ƒ{ƒ{ˆ{ˆ{�{�{¢{µ{Á{Í{Ó{×{à{å{å{å{å{å{ý{||||||||||||||||5|J|R|m|~|‹|�|¡|­|²|²|²|»|Õ|á|}}}}}}}}}}}.}3}3}3}D}O}T}T}_}q}‰}›}¼}Ü}ç}ø}ý}ý}ý}(~1~B~F~^~n~v~~~³~¼~À~Ø~è~è~è~è~è~
CLPV[dmrrrr�•³¾ÃÉÎÎáõ€&€.€4€4€9€9€H€\€z€…€Š€�€•€•€¨€¼€â€í€õ€û€û€��� �"�7�?�Z�k�x�z�‰�‹�‹�‹�‹�‹�Ÿ�Ÿ�Ÿ�Ÿ�Ÿ�Ÿ�Ÿ�Ÿ�Ÿ�Ÿ�Ÿ�Ÿ�Ÿ�Ÿ�Ÿ�Ÿ�®�½�È�Ê�Ê�Ó�Õ�Õ�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�é�ë�ë�‚
‚‚‚‚ ‚/‚_‚n‚z‚�‚ª‚­‚·‚Âé‚ ƒ)ƒMƒOƒbƒhƒ«ƒ«ƒ®ƒ¾ƒƃáƒòƒõƒ„„)„A„A„l„o„~„’„³„Ä„à„Ì„ü„…,…_…]…G…8…m…m…m…p…u…x…’… …Î…ð…ð…††-†A†b†s†�†{†«†Ɇü†ú†ä†Õ†
‡
‡
‡␍‡‡‡‡)‡J‡V‡­ŠÏœ«Î~�~�”�˜�£�ª�µ�É�É�Ô�å�ì�ù�‘‘‘+‘+‘4‘9‘A‘Q‘_‘n‘y‘Œ‘Œ‘Ÿ‘Ÿ‘µ‘á‘á‘õ‘÷‘÷‘’ ’ ’’’’’,’,’,’0’8’>’C’C’G’O’S’Y’^’^’j’’�’™’¬’±’¹’¹’¾’¾’Å’Ñ’æ’ö’“““!“&“.“4“4“9“@“K“s“~“�“—“Ÿ“¥“·“½““““““““““͓ٓæ“ö“ü“”””$”)”1”6”6”6”>”F”O”W”\”d”i”p”{”£”®”¶”Å”Ï”á”æ”ì”ñ”ñ”ø”
••%•-•5•J•L•W•_•t•t•�•˜•Ÿ•¥•©•­•¼•Í•ã•ï•÷• –––)–4–9–9–Z–t–y–�–�–˜– –µ–º–Å–Í–â–ç–ó– ———2—>—C—O—Z—_—_—_—_—_—_—j—j—j—j—j—j—j—j—j—j—j—j—u—•—²——È—Зã—è—ð—ø—ú—˜˜˜#˜+˜-˜M˜U˜^˜f˜n˜s˜x˜˜Š˜²˜½˜ŘÔ˜Þ˜÷˜ü˜™ ™ ™ ™™™™(™6™H™J™\™n™n™n™y™~™›™ ™ ™©™®™®™®™®™®™®™®™®™®™®™®™®™®™®™®™®™¹™Å™Ñ™ñ™š š,š1š9š@šMšUš^šfšmšršršzš‚šžš¦š©š«š»šÅšÅšÅšÇšÚšëšîšñšùšþšþš› ›››(›A›H›M›e›o›Š›£›«›¸›Ñ›Ø›Ø›Ý›Ý›Ý›Ý›Ý›Ý›Ý›å›ð›û›
œœœœ œ,œ1œ1œ1œ5œ:œ:œJœOœOœOœ[œbœhœxœ‰œ¥œ¸œ¾œÆœÛœâœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœìœìœ�� � �$�/�6�R�_�_�_�c�n�Œ�š�”ŸÐø{–Ÿ–Ÿ¬Ÿ·Ÿ¾ŸÉŸÔŸëŸöŸýŸ␍   * * F ` g p w z † � – ™ ž ´ ¾ РÖ â ÷ þ ¡¡'¡.¡.¡.¡<¡J¡T¡W¡e¡o¡r¡„¡‰¡Ž¡ž¡¡¡¦¡¶¡¹¡½¡Æ¡Ρà¡è¡è¡è¡þ¡¢¢ ¢,¢A¢H¢P¢b¢h¢w¢ˆ¢ˆ¢�¢�¢�¢�¢«¢µ¢¸¢Æ¢ТÓ¢å¢ê¢ï¢ÿ¢£££££'£/£A£I£I£b£j£j£m£x£–£¤£í£Ñ\oÂN¨N¨h¨{¨‚¨‰¨”¨§¨ª¨³¨º¨½¨ͨÛ¨æ¨ñ¨ô¨
©©+©6©A©W©b©y©…©œ©¤©­©µ©Ý©à©æ©ë©þ©ª ª ª%ª-ª-ª;ªMªZªmªsª{ªŽª”ªœªœªŪʪéªìªìªóª«««)«5«E«e«�«•«�«§«Æ«Ú«Ú«P¬ÒXn¥¥<¥N¥S¥j¥|¥†¥�¥ž¥¦¥µ¥Ë¥Í¥Ö¥ì¥ú¥¦
¦ ¦¦"¦"¦*¦2¦<¦D¦N¦W¦_¦b¦k¦†¦—¦©¦¬¦±¦Ħܦð¦ø¦ø¦
§␍§§%§=§Q§Y§Y§z§}§‚§•§›§°§Ƨȧݧó§û§û§¨%¨,¨7¨N¨Ó¤¦>s>s_sqs|s…s§s±s¿sÙsæsæsðsðsttt#t-t3t9t<tJtQtitptst…tŠt•t tºtÕtétu(u-u3u9uDuQuWuxu|u‚uŠu�u—u¸u¼uÂuÊuÏuÏuÜuâuýuéu v␍vvv vAvEvKvSvbv}viv‰v�v“v›v vÁvÅvËvÓvÓvØvåvëv wwww&wGwKwQwYwYwfwlw�w‘w—wŸw§wÈwÌwÒwÚwÚwÚwðwðwðwðwûwxx.x:xHxMx[xoxtxtxx‡x�x˜x¸xÅxÔxãxýxyy␍yy"y-y:yEy_yqyƒyŽy“y“yžy´yÉyÕyãyèyöy
z
zz
z*z/z/z>zCzCzRzWzWzhzmzmz~zƒzƒz–z¥zªzªz½zÌzÑzÑzózøzøz{ { {A{F{F{h{m{m{Š{±{¶{¶{Ø{Ý{Ý{ú{!|&|&|H|M|M|j|‘|–|–|¸|½|½|Ú|}}}(}-}-}H}M}M}h}m}m}ˆ}�}�}¨}­}­}È}Í}Í}è}í}í}~␍~␍~(~-~-~>~C~C~T~Y~Y~e~p~…~Š~Š~–~¯~´~×~Þ~è~í~þ~(->IQVVZ^eoyyŒ‘‘‘•«´´×ÜÜäø€€(€3€>€I€[€g€p€u€u€u€†€£€®€¸€ÀÈ€Ó€Û€à€à€ë€ó€ü€��/�G�[�`�`�k�~�ˆ�“�´�À�Î�Ó�á�å�ê�ê�ú�‚␍‚‚‚*‚5‚O‚a‚s‚~‚ƒ‚Ž‚–‚›‚¦‚³‚¾‚Ø‚ê‚ü‚ü‚ü‚ü‚ƒƒƒƒ#ƒIƒgƒgƒqƒ…ƒ�ƒ‘ƒ�ƒ¥ƒƒÓƒ݃èƒ „-„>„I„a„q„v„v„�„†„†„Ž„™„ž„ž„¦„±„¶„¶„¾„܄Ƅô„ù„ù„… … …7…<…P…<…h…m…m…z………‡…Œ…Œ…˜…©…»…À…À…Ô…À…ì…ñ…ñ…ù…þ…þ…†††)†.†.†H†X†]†]†w†‡†Œ†Œ†¦†¶†»†»†Õ†å†ê†‡ê†‡‡‡)‡.‡j‡X‡.‡‚‡‡‡Ç±‡‡‡Û‡à‡à‡ï‡ÿ‡ˆˆˆ#ˆ(ˆ(ˆ7ˆEˆJˆrˆ`ˆJˆŠˆ�ˆ·ˆ¥ˆ�ˆψÔˆüˆêˆÔˆ‰‰‰6‰ ‰`‰p‰u‰u‰�‰|‰º‰ʉωωÛ‰à‰à‰ì‰ñ‰ñ‰ŠŠŠŠ,Š<ŠAŠAŠTŠdŠiŠiŠ|ŠŒŠ‘Š‘Š™ŠžŠžŠ¦Š«Š«Š³Š¸Š¸ŠÀŠÅŠÅŠØŠÝŠÝŠðŠõŠC‹1‹ ‹õŠP‹U‹£‹‘‹‹U‹°‹µ‹µ‹Ä‹ß‹ä‹ä‹õ‹ŒŒŒ&Œ4Œ9Œ9ŒAŒFŒFŒNŒSŒSŒ[Œ`Œ`Œ˜Œ†ŒgŒ·ŒÒŒ׌׌�ýŒÞŒ.�I�N�€�n�N�˜���Ï�½���ç�ì�Žì�Ž#Ž@Ž#ŽXŽ]Ž]ŽiނޒޣŽÉŽËŽáŽçŽ��A�ƒ�`���—�—�—�£�¨�¨�»�Æ�Ð�Õ�à�ê�ï�ï� �����/��;�F�K�_�K�k�v�{�{�†�”�™�™�¤�¯�´�´�Å�Ê�Ê�Û�à�à�ú�‘
‘‘
‘‘#‘7‘#‘C‘H‘P‘H‘\‘a‘u‘a‘�‘†‘†‘𑆑¦‘¦‘¦‘«‘·‘«‘ʑϑϑۑϑî‘ó‘ó‘ÿ‘ó‘’’’#’’6’;’O’;’[’g’r’}’‚’–’‚’¢’®’¹’Ä’É’Ý’É’é’ú’ÿ’ÿ’“ “ ““““"“'“'“0“5“5“>“C“C“N“S“S“^“c“c“n“s“s“~“ƒ“ƒ“Ž“““““ž“£“£“®“³“Ç“³“Ó“Þ“é“ô“ù“ù“””””””!”&”&”0”5”5”=”B”B”O”T”T”a”f”f”f”f”f”n”s”s”{”€”€”ˆ”�”�”•”š”š”¢”§”»”§”ǔؔݔݔï”ú”• •5•@•Y•E•e•p•{•€•€•’•�•½••Ø•ã•ü•è•–––#–#–5–@–`–e–{–†–Ÿ–‹–«–¶–Á–Æ–Æ–ì–Ø–ø–——3—>—C—^—J—~—j—Š— —Œ—À—¬—Ì—×—Ü—Ü—˜î—˜.˜3˜I˜T˜Y˜t˜`˜”˜€˜ ˜¶˜¢˜Ö˜˜â˜í˜ò˜ò˜™™$™D™I™_™j™o™Š™v™ª™–™¶™Ì™¸™ì™Ø™ø™šššššš+š0š0š0š6š;š;š;šEšGšGšQš^š~š€š€šŠšŠšŠšŠšŠšŒšŒš£šªšµšµššÈšÏšÚšåšðšûš›)›!›A›I›r›j›Š›Š›Š›“›››®›´››Õ›Õ›í›÷› œ%œ%œFœVœkœ}œ�œ�œµœ¼œËœÝœÝœáœæœíœýœ�� �7�>�C�C�G�R�^�l�™�¢�³�Á�ô�žžž/ž;žIžNž\žxž£žÉžÌžÜžÞžÞžâžŸ Ÿ ŸŸŸHŸhŸhŸhŸ–¡Ô,î¾î¾÷¾ý¾¿¿#¿(¿Õ, .¿.¿<¿B¿F¿U¿d¿j¿Ö(æÍæÍïÍùÍ ÎÎÎ2Î×Ô4e.Ï.ÏDÏKÏNÏrÏrÏ�ϢϵÏÈÏÍÏÍÏëÏùÏ Ð Ð'Ð'Ð)Ð)Ð)Ð<Ð>Ð>Ð>ÐEÐXÐkÐkÐkÐ}ЉМвзлÐÂÐ×ÐêÐñÐñÐôÐÑØ 1UÞ
Þ
ø
þ
 ␍   # 7 > A C L ] ] ` h ~ � � ’ • œ   ¨  È Î Ö  Ù0®6ø“ø“”A”I”I”W”j”ƒ”†”¢”¢”¢”ª”¬”¬”´”¶”¶”¾”À”À”ȔȔєהܔܔå”ñ”õ”ú”•••␍•••!•!•&•2•J•i•l•�• • • •¨•ª•ª•ª•²•´•´•´•¼•¾•¾•¾•ƕȕȕӕӕٕޕޕޕޕå•ð•–––(–(–(–8–8–?–C–I–a–o–‚–Ž–·–º–Á–Ó–Û–ä–ï–ï–ú–———— ——'—/—5—W—c—i—n—n—u—€—€—…———�—�—�—�—ö—ÚXþÐ^µ^µxµµŒµ—µœµ¢µ´µºµÒµØµöµ
=¶=¶M¶b¶d¶g¶s¶{¶ƒ¶‹¶™¶Ÿ¶¥¶±¶±¶³¶Å¶Ë¶Ð¶Ð¶ç¶ç¶···%·*·*·A·J·Y·o·z·ˆ·“·£·°·Â·È·Ò·Þ·ë·í·í·õ·ú·ú·¸¸¸¸¸¸¸!¸!¸'¸,¸,¸3¸8¸8¸?¸D¸D¸O¸T¸T¸_¸d¸d¸o¸t¸t¸¸¸˜¸Ÿ¸¥¸¨¸³¸¶¸Ê¸×¸æ¸í¸ð¸¹¹
¹¹+¹:¹:¹:¹:¹D¹\¹q¹�¹’¹˜¹©¹¯¹´¹¾¹Ï¹à¹ï¹õ¹ººº*º9º?ºJºPºeºkº|º‡º�º�º�º­ºÀºÌºÔºäºëºñº»␍»»/»D»R»b»n»€»‹»š»œ»®»¶»»»Â»Æ»Ô»Þ»ä»î»ô»ÿ»¼¼¼!¼+¼P¼P¼V¼]¼�¾Û0¥íþ±þ±²²4²<²D²N²R²Y²_²s²{²€²ƒ²Ž²™²¡²¬²·²¹²Ñ²Ø²ß²ê²õ²÷²³␍³³³$³$³:³[³a³g³x³~³‡³™³Ÿ³Ÿ³§³«³¶³»³Í³Ø³Ü³ê³ì³ð³ÿ³ÿ³ÿ³´´´'´-´›´Ü”Œ­À’À’Î’à’ä’ì’ô’ÿ’
“““(“-“E“L“S“^“i“k“v“�“ƒ“�“𓥓®“¶“¶“º“ñ“Ýt ¤î î  ¡¡¡%¡=¡G¡G¡_¡i¡„¡š¡¨¡¬¡Ì¡à¡ç¡ê¡¢␍¢¢ ¢1¢1¢8¢?¢H¢M¢R¢Y¢`¢z¢�¢‘¢•¢•¢Ÿ¢µ¢¹¢¹¢Ë¢ß¢ó¢ó¢ú¢£ ££ £'£0£;£B£B£M£k£o£x£¢£¢£¨£¯£¾£Æ£Ô£Û£ß£á£ó£ó£ó£¤␍¤3¤A¤A¤E¤Z¤b¤r¤}¤’¤—¤¥¤´¤¼¤Ê¤Õ¤Ù¤Þ¤æ¤ê¤ù¤û¤
¥ ¥¥¥,¥3¥9¥M¥U¥c¥j¥n¥~¥‰¥Ž¥¬¥´¥Â¥É¥Í¥Õ¥ã¥ê¥î¥
¦¦¦#¦#¦#¦,¦7¦G¦i¦q¦|¦‹¦“¦ž¦£¦«¦¶¦Â¦Æ¦Ñ¦Ö¦è¦ð¦û¦û¦û¦û¦ §§5§A§I§Y§i§‡§‹§º§ §Ê§Ê§Ô§Û§ê§ù§¨¨¨¨¨+¨3¨A¨H¨L¨L¨N¨`¨`¨r¨r¨r¨x¨„¨–¨ž¨¶¨â¨ð¨ô¨©© ©+©A©C©J©]©e©s©z©~©€©“©›©©©°©´©´©´©´©Â©Í©Ü©ä©ò©ý©ªªªªª!ª#ª2ª4ªCªEªTª[ªaªuª}ª‹ª’ª–ª¦ª±ª¶ªÔªÜªêªñªõªýª «««2«:«E«K«K«K«T«i«ƒ«“«ž«³«¸«Ã«Ó«õ«ý«¬¬ ¬*¬/¬7¬B¬N¬R¬]¬b¬t¬|¬‡¬‡¬‡¬‡¬›¬«¬À¬Í¬Ñ¬å¬ö¬ ­­­*­?­O­f­­˜­š­¥­­­­­¶­Ó­ä­û­®"®-®:®B®D®O®W®W®W®q®®�®¢®¿®Î®ú®¯¯¯%¯?¯?¯C¯Y¯h¯ƒ¯Ž¯¥¯­¯­¯Ï¯Ï¯â¯ý¯°°;°J°v°„°š°³°Ã°Û°Û°ó°ó°ÿ°±/±8±8±8±D±U±m±v±v±}±†±Œ±˜±þ±ÞLîýž´ž´°´Å´Ö´ç´î´ö´µµ µ%µWµßSžžÁÖÛãëó">DFHUUWsy{}ŠŠŠ�˜ ©±³»ÃËØÞéð 5<GM^bjj~Ž–™ÿà`vÿvÿ‚ÿ™ÿ­ÿµÿ¹ÿÃÿÍÿÕÿØÿÞÿáhF/F/\/g/r/€/‹/‘/¢/¨/¹/¿/Ë/â/â/ô/000)0/0}0â˜Vx  * / 6 @ F Q a i q v � ‹ ‘ œ ¬ ´ Ä Ë Ó Û ã ë ð û    ã�*JÞ×Þ׿×ê×öר ØØ$Ø6ØAØLØsØsØŒØ�Ø�Ø�اخØÁØÊØØØìØÙ Ù*Ùäf)ÑÑ@Ñ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ÖƒÖ–Ö§Ö¾ÖÑÖÖÖÖÖÖÖÞÖéÖûÖ× × × ××J×P×P×P×[×e×q×|×~×~×~׃×�×�×Ù×å >~0~0–0¨0®0º0Å0Ó0ß0ö011#1)1/151H1N1W1]1o1u1€1ˆ1–1£1à1æ“Ôî î   - 2 P V [ a o v … Š – ¨ ¨ Æ Ñ ä ë !"!.!I!a!}!†!•!�!ª!³!¸!É!÷!ü!""/"?"E"P"Y"_"¥"€"µ"ð"Ë"####·#çL™h~Ü~ܜܢܥܮܸÜÐÜàÜéÜïÜóÜ÷ÜùÜÝ!Ý.Ý4Ý8Ý<Ý>ÝBÝFÝFÝiÝmÝsÝsÝzݜݱÝÄÝ×ÝÝÝäÝïÝùÝýÝÞÞ ÞÞÞ)Þ/Þ4Þ;ÞHÞJÞ\Þ^ÞcÞpÞrÞ„Þ„Þ„Þ„Þ„Þ¦Þ±Þ½ÞÔÞÔÞéÞõÞß6ßPßUßlßqßߖߛߡ߲ßÇßÍßÝßêßà àà à-à9à9à9à?àBàEà^àdàxà~à…à�à�à•à¢à¯à¯àµàÃàÚàààãàæàíàôàûàûàá ááá á.áEáKáNáQáXáXáiáná{áˆáˆá�á™á á¦á­á¸áÌáÌáæáëáòáúáââââ5â:âcânâuâ}â–âªâªâÅâÅâßâôâûâã0ãTãVã`ã‚ã‚ã‚ã›ã©ãºãÒãÖã«äèT’*16>XacpprŒ’”–££££§¿ÇÐØßåç   , 2 F K X X l s z ƒ ‘ š º À Ä É Î Ñ Û Þ î éL%ÞÿÞÿêÿ!+5=@Fê0 & & > € t H F ” œ ëÕÓ¾#¾#Û#æ#ù#æ#$!$!$1$:$A$E$N$N$V$Z$x$„$�$–$¡$Ã$Ã$Ö$á$ç$î$ó$ó$%%%#%+%8%8%J%O%O%_%d%d%d%w%|%�%•%œ%±%Å%Å%Ê%Ê%Ú%ß%ß%ä%ë%ó%ú%ü%& & && &-&4&7&Y&Y&a&pLine truncated
++$+;+=+F+Q+S+_+}+ƒ+‰+�+˜+©+Ð+Ù+ã+ð+,,,*,?,?,L,Q,c,i,i,i,i,%-ìxÔî&-&-D-V-\-h---‘-—-¢-²-¾-Ç-Í-Ó-Þ-ì-ù-..".".R.í0-5vv„¤ª°°îD v:v:„:Ž:˜:¨:­:³:¿:Á:Ó:Ó:Õ:;ï„{˜6Û6ÛHÛ]ÛgÛpÛrÛyÛ‰Û”Û–Û Û Û¦Û·ÛºÛºÛÛÛæÛèÛÜÜ ÜÜ+Ü~Üð ␍^Î^ÎgÎ{΀Îñ ¾Î¾ÎÇÎæÎëÎò4%îÎîÎüÎÏÏÏÏ'Ï-Ïó  6Î6ÎDÎXÎ^Îô †Î†Î”γιÎõÌKz.Ù.ÙBÙWÙfÙjÙxÙ~Ù�Ù�ٜ٧ٲٽÙÄÙÔÙþÙÚ Ú␍ÚÚÚ3Ú5Ú?Ú`ÚkÚmÚ†ÚŠÚ˜Ú�Ú�Ú¤Ú°Ú¸ÚËÚ5Ûö�½~?~?œ?Ÿ?¥?¹?Á?Ò?ß?å?ê?ê?÷?@@@$@&@E@V@]@i@y@y@‡@š@¥@©@º@º@º@¿@¿@Ë@Ú@í@ó@ø@ AAA,A2A4ACAPAVA\AaAgAmAtA€A‡A‰AŽA–A˜A�A©A«A°A¸AºA¿AÇAÉAÎAÖAØAÝAçAéAîAøAøAøABBB B%B+B6B;BCB\BbBmBqBwB‚B›B¦B±B·BÄBÉBÎBÎBãBëBóBCC'C-C<CECJCOCdCkCtC€C†C’C–C›C«C¶CÁCÃCÉCÖCÛCàCùCDDDD"D$D)D2DKDVDaDgDtDtDxD}D}DŽD�D�D£D¥D¥D¸DºDºDÍDÏDÏDâDäDäDöDöDüDEEE,E!E9EAEHEOEWEjElE…E…EŸE¢E¤E°EÂEÒEÞEõEFF(F8FKFPFPFVFjF|F‡F�F—F›F©F¯F´F´FºFÎFÞFãFãFéFïFôFôFôFúF GG)G-G2G2G6G;G;G@GKGWGqG‡G“G“G™G¦G¨G³G¿GÎGáGáGîGúGúGúGúGþGHH&H1H9HAHCHUHZHhHtHzH‡H‡HžH®H®HÂHÎHÐHÙHåHüHüHIII#I#I.I.I.I.I.IªK÷ˆ0ž ž ¾ Æ Ê Ø Þ ä 
'
;
I
`
f
r
w
…
¤
­
½
¿
Æ
Æ
Ì
$LK,"LexPutPos",A="FL:::/Compiler/CExcept.CPP.Z,50",BI=1$
$LK,"ICAssignPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,549",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,"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,"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,"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,192",BI=20$
$LK,"ICQueIns",A="FL:::/Compiler/BackC.CPP.Z,411",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,666",BI=23$
$LK,"ICQueRem",A="FL:::/Compiler/BackC.CPP.Z,493",BI=24$
$LK,"ICAndEqual",A="FL:::/Compiler/BackC.CPP.Z,694",BI=25$
$LK,"CN_R",A="FL:::/Compiler/BackFA.CPP.Z,4"$
$LK,"OptLead1",A="FL:::/Compiler/OptLib.CPP.Z,73",BI=26$
$LK,"CmpNoteFloatOp",A="FL:::/Compiler/BackFA.CPP.Z,6",BI=27$
$LK,"AOTGlblsResolve",A="FL:::/Compiler/AsmResolve.CPP.Z,76",BI=28$
$LK,"ExePutS2",A="FL:::/Compiler/CMain.CPP.Z,627",BI=29$
$LK,"HashEntrySize",A="FL:::/Compiler/CHash.CPP.Z,1",BI=30$
$LK,"COCPush",A="FL:::/Compiler/PrsLib.CPP.Z,107",BI=31$
$LK,"SLASH_OP_DEC",A="FL:::/Compiler/BackLib.CPP.Z,255"$
$LK,"ICPushRegs",A="FL:::/Compiler/BackLib.CPP.Z,341",BI=32$
$LK,"PE_POP_HIGHER",A="FL:::/Compiler/PrsExp.CPP.Z,10"$
$LK,"SLASH_OP_FLD",A="FL:::/Compiler/BackLib.CPP.Z,270"$
$LK,"ICU32",A="FL:::/Compiler/BackLib.CPP.Z,47",BI=33$
$LK,"ICU24",A="FL:::/Compiler/BackLib.CPP.Z,41",BI=34$
$LK,"ICU16",A="FL:::/Compiler/BackLib.CPP.Z,35",BI=35$
$LK,"SLASH_OP_DIV",A="FL:::/Compiler/BackLib.CPP.Z,260"$
$LK,"CmpFillTables",A="FL:::/Compiler/CInit.CPP.Z,238",BI=36$
$LK,"AOTStoreCodeU32",A="FL:::/Compiler/AsmLib.CPP.Z,30",BI=37$
$LK,"ICFOpEqual",A="FL:::/Compiler/BackFB.CPP.Z,1",BI=38$
$LK,"ICU64",A="FL:::/Compiler/BackLib.CPP.Z,53",BI=39$
$LK,"SLASH_OP_INC",A="FL:::/Compiler/BackLib.CPP.Z,254"$
$LK,"AOTStoreCodeU64",A="FL:::/Compiler/AsmLib.CPP.Z,69",BI=40$
$LK,"LexPopNoRestore",A="FL:::/Compiler/LexLib.CPP.Z,38",BI=41$
$LK,"ExePrint",A="FL:::/Compiler/CMain.CPP.Z,607",BI=42$
$LK,"SLASH_OP_NEG",A="FL:::/Compiler/BackLib.CPP.Z,257"$
$LK,"PrsVarLst",A="FL:::/Compiler/PrsVar.CPP.Z,413",BI=43$
$LK,"PrsAsmDefine",A="FL:::/Compiler/Asm.CPP.Z,811",BI=44$
$LK,"PrsAddOp",A="FL:::/Compiler/PrsExp.CPP.Z,15",BI=45$
$LK,"LexWarn",A="FL:::/Compiler/CExcept.CPP.Z,65",BI=46$
$LK,"PE_POP_ALL1",A="FL:::/Compiler/PrsExp.CPP.Z,12"$
$LK,"PE_POP_ALL2",A="FL:::/Compiler/PrsExp.CPP.Z,13"$
$LK,"COCAppend",A="FL:::/Compiler/PrsLib.CPP.Z,126",BI=47$
$LK,"LexFilePush",A="FL:::/Compiler/Lex.CPP.Z,1",BI=48$
$LK,"CN_MAIN",A="FL:::/Compiler/BackFA.CPP.Z,3"$
$LK,"PrsUnaryModifier",A="FL:::/Compiler/PrsExp.CPP.Z,956",BI=49$
$LK,"OptFixupUnaryOp",A="FL:::/Compiler/OptLib.CPP.Z,196",BI=50$
$LK,"LexPush",A="FL:::/Compiler/LexLib.CPP.Z,12",BI=51$
$LK,"SLASH_OP_MOV",A="FL:::/Compiler/BackLib.CPP.Z,261"$
$LK,"ICPopRegs",A="FL:::/Compiler/BackLib.CPP.Z,381",BI=52$
$LK,"SLASH_OP_MUL",A="FL:::/Compiler/BackLib.CPP.Z,258"$
$LK,"SLASH_OP_NOT",A="FL:::/Compiler/BackLib.CPP.Z,256"$
$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=53$
$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=54$
$LK,"ICAdd",A="FL:::/Compiler/PrsLib.CPP.Z,79",BI=55$
$LK,"CmpRawType",A="FL:::/Compiler/OptLib.CPP.Z,509",BI=56$
$LK,"LexExpressionI64",A="FL:::/Compiler/PrsExp.CPP.Z,1135",BI=57$
$LK,"ICQueInsRev",A="FL:::/Compiler/BackC.CPP.Z,452",BI=58$
$LK,"LexExpression",A="FL:::/Compiler/PrsExp.CPP.Z,1163",BI=59$
$LK,"ICAddSubEctEqual",A="FL:::/Compiler/BackA.CPP.Z,545",BI=60$
$LK,"PrsExpression",A="FL:::/Compiler/PrsExp.CPP.Z,264",BI=61$
$LK,"PrsClassNew",A="FL:::/Compiler/PrsLib.CPP.Z,40",BI=62$
$LK,"LexInStr",A="FL:::/Compiler/Lex.CPP.Z,369",BI=63$
$LK,"internal_types_table",A="FL:::/Compiler/CInit.CPP.Z,6"$
$LK,"OptPass3",A="FL:::/Compiler/OptPass3.CPP.Z,1",BI=64$
$LK,"OptPass4",A="FL:::/Compiler/OptPass4.CPP.Z,171",BI=65$
$LK,"OptPass5",A="FL:::/Compiler/OptPass5.CPP.Z,1",BI=66$
$LK,"OptPass6",A="FL:::/Compiler/OptPass6.CPP.Z,111",BI=67$
$LK,"Echo",A="FL:::/Compiler/CMisc.CPP.Z,38",BI=68$
$LK,"PrsGlblVarLst",A="FL:::/Compiler/PrsStmt.CPP.Z,201",BI=69$
$LK,"ICQueInit",A="FL:::/Compiler/BackC.CPP.Z,397",BI=70$
$LK,"ICCmp",A="FL:::/Compiler/BackB.CPP.Z,136",BI=71$
$LK,"ICAddRSP",A="FL:::/Compiler/BackLib.CPP.Z,69",BI=72$
$LK,"ICDiv",A="FL:::/Compiler/BackA.CPP.Z,428",BI=73$
$LK,"ICDeref",A="FL:::/Compiler/BackLib.CPP.Z,647",BI=74$
$LK,"ICLea",A="FL:::/Compiler/BackLib.CPP.Z,615",BI=75$
$LK,"CmpBuf",A="FL:::/Compiler/CMain.CPP.Z,157",BI=76$
$LK,"CMP_TEMPLATES_DONT_PUSH_POP",A="FL:::/Compiler/Templates.CPP.Z,394"$
$LK,"ICAddEct",A="FL:::/Compiler/BackA.CPP.Z,1",BI=77$
$LK,"ICToF64",A="FL:::/Compiler/BackB.CPP.Z,404",BI=78$
$LK,"PrsBinFile",A="FL:::/Compiler/Asm.CPP.Z,885",BI=79$
$LK,"HashTableSize2",A="FL:::/Compiler/CHash.CPP.Z,72",BI=80$
$LK,"HashEntrySize2",A="FL:::/Compiler/CHash.CPP.Z,33",BI=81$
$LK,"Ui",A="FL:::/Compiler/UAsm.CPP.Z,255",BI=82$
$LK,"ICSlashOp",A="FL:::/Compiler/BackLib.CPP.Z,275",BI=83$
$LK,"OptBrZero",A="FL:::/Compiler/OptLib.CPP.Z,231",BI=84$
$LK,"Un",A="FL:::/Compiler/UAsm.CPP.Z,681",BI=85$
$LK,"PrsSizeOf",A="FL:::/Compiler/PrsExp.CPP.Z,298",BI=86$
$LK,"ICMulEqual",A="FL:::/Compiler/BackA.CPP.Z,344",BI=87$
$LK,"ICToI64",A="FL:::/Compiler/BackB.CPP.Z,398",BI=88$
$LK,"ICMod",A="FL:::/Compiler/BackA.CPP.Z,521",BI=89$
$LK,"OptSetNOP1",A="FL:::/Compiler/OptLib.CPP.Z,17",BI=90$
$LK,"OptPass789A",A="FL:::/Compiler/OptPass789A.CPP.Z,1",BI=91$
$LK,"OptSetNOP2",A="FL:::/Compiler/OptLib.CPP.Z,25",BI=92$
$LK,"FBO1_F64",A="FL:::/Compiler/OptLib.CPP.Z,94"$
$LK,"ICToUpper",A="FL:::/Compiler/BackB.CPP.Z,387",BI=93$
$LK,"AsmLexExpression",A="FL:::/Compiler/AsmLib.CPP.Z,129",BI=94$
$LK,"ICMov",A="FL:::/Compiler/BackLib.CPP.Z,435",BI=95$
$LK,"ICNot",A="FL:::/Compiler/BackB.CPP.Z,10",BI=96$
$LK,"ICMul",A="FL:::/Compiler/BackA.CPP.Z,286",BI=97$
$LK,"ICRex",A="FL:::/Compiler/BackLib.CPP.Z,22",BI=98$
$LK,"ICPop",A="FL:::/Compiler/BackLib.CPP.Z,354",BI=99$
$LK,"MDR_RIP_REL",A="FL:::/Compiler/BackLib.CPP.Z,139"$
$LK,"SLASH_OP_FADD",A="FL:::/Compiler/BackLib.CPP.Z,264"$
$LK,"ICSub",A="FL:::/Compiler/BackA.CPP.Z,207",BI=100$
$LK,"ICPreempt",A="FL:::/Compiler/BackB.CPP.Z,355",BI=101$
$LK,"COCFloatConstFind",A="FL:::/Compiler/PrsLib.CPP.Z,164",BI=102$
$LK,"ICPut",A="FL:::/Compiler/CExcept.CPP.Z,187",BI=103$
$LK,"PrsArrayDims",A="FL:::/Compiler/PrsVar.CPP.Z,247",BI=104$
$LK,"ICSqr",A="FL:::/Compiler/BackC.CPP.Z,581",BI=105$
$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=106$
$LK,"MemberMetaData",A="FL:::/Compiler/LexLib.CPP.Z,45",BI=107$
$LK,"ICSwitch",A="FL:::/Compiler/BackC.CPP.Z,757",BI=108$
$LK,"OptBrNotZero",A="FL:::/Compiler/OptLib.CPP.Z,358",BI=109$
$LK,"ICShiftEqual",A="FL:::/Compiler/BackA.CPP.Z,726",BI=110$
$LK,"OTrace",A="FL:::/Compiler/CMisc.CPP.Z,21",BI=111$
$LK,"LexPutToken",A="FL:::/Compiler/CExcept.CPP.Z,1",BI=112$
$LK,"GetOpt",A="FL:::/Compiler/CMisc.CPP.Z,16",BI=113$
$LK,"SLASH_OP_FDIV",A="FL:::/Compiler/BackLib.CPP.Z,268"$
$LK,"AsmHashLoad",A="FL:::/Compiler/AsmInit.CPP.Z,50",BI=114$
$LK,"UAsmHashLoad",A="FL:::/Compiler/UAsm.CPP.Z,205",BI=115$
$LK,"UnusedExternWarning",A="FL:::/Compiler/CExcept.CPP.Z,105",BI=116$
$LK,"SLASH_OP_FILD",A="FL:::/Compiler/BackLib.CPP.Z,273"$
$LK,"ICXorXor",A="FL:::/Compiler/BackB.CPP.Z,98",BI=117$
$LK,"PrsTryBlk",A="FL:::/Compiler/PrsStmt.CPP.Z,825",BI=118$
$LK,"CInit",A="FL:::/Compiler/CMain.CPP.Z,684",BI=119$
$LK,"MemberMetaFind",A="FL:::/Compiler/LexLib.CPP.Z,56",BI=120$
$LK,"ExePrint2",A="FL:::/Compiler/CMain.CPP.Z,646",BI=121$
$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=122$
$LK,"ICModr1",A="FL:::/Compiler/BackLib.CPP.Z,141",BI=123$
$LK,"ICModr2",A="FL:::/Compiler/BackLib.CPP.Z,223",BI=124$
$LK,"SLASH_OP_FMUL",A="FL:::/Compiler/BackLib.CPP.Z,267"$
$LK,"ICPreIncDec",A="FL:::/Compiler/BackB.CPP.Z,425",BI=125$
$LK,"PrsAsmInstruction",A="FL:::/Compiler/Asm.CPP.Z,390",BI=126$
$LK,"PrsUnaryTerm",A="FL:::/Compiler/PrsExp.CPP.Z,588",BI=127$
$LK,"ICFModEqual",A="FL:::/Compiler/BackFA.CPP.Z,585",BI=128$
$LK,"MemberLstDel",A="FL:::/Compiler/LexLib.CPP.Z,158",BI=129$
$LK,"SLASH_OP_FSUB",A="FL:::/Compiler/BackLib.CPP.Z,265"$
$LK,"ICAndAnd",A="FL:::/Compiler/BackB.CPP.Z,31",BI=130$
$LK,"InstEntriesCompare",A="FL:::/Compiler/UAsm.CPP.Z,1",BI=131$
$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=132$
$LK,"PE_UNARY_TERM1",A="FL:::/Compiler/PrsExp.CPP.Z,1"$
$LK,"ICFAdd",A="FL:::/Compiler/BackFB.CPP.Z,599",BI=133$
$LK,"PE_UNARY_TERM2",A="FL:::/Compiler/PrsExp.CPP.Z,2"$
$LK,"CmdLinePmt",A="FL:::/Compiler/CMisc.CPP.Z,102",BI=134$
$LK,"AsmMakeArgMask",A="FL:::/Compiler/Asm.CPP.Z,172",BI=135$
$LK,"COCHeaderPut",A="FL:::/Compiler/PrsLib.CPP.Z,229",BI=136$
$LK,"PrsGlblInit",A="FL:::/Compiler/PrsVar.CPP.Z,206",BI=137$
$LK,"LexD2I32",A="FL:::/Compiler/CMisc.CPP.Z,66",BI=138$
$LK,"MemberLstNew",A="FL:::/Compiler/LexLib.CPP.Z,151",BI=139$
$LK,"LexD3I32",A="FL:::/Compiler/CMisc.CPP.Z,82",BI=140$
$LK,"OptClassFwd",A="FL:::/Compiler/OptLib.CPP.Z,9",BI=141$
$LK,"ICFCmp",A="FL:::/Compiler/BackFA.CPP.Z,545",BI=142$
$LK,"PrsSwitch",A="FL:::/Compiler/PrsStmt.CPP.Z,575",BI=143$
$LK,"ICFDiv",A="FL:::/Compiler/BackFB.CPP.Z,587",BI=144$
$LK,"AOTStoreCodeU8At",A="FL:::/Compiler/AsmLib.CPP.Z,108",BI=145$
$LK,"PE_PUSH_LOWER",A="FL:::/Compiler/PrsExp.CPP.Z,11"$
$LK,"ICXorEqual",A="FL:::/Compiler/BackC.CPP.Z,736",BI=146$
$LK,"OptPass6Lag",A="FL:::/Compiler/OptPass6.CPP.Z,28",BI=147$
$LK,"MemberFind2",A="FL:::/Compiler/LexLib.CPP.Z,87",BI=148$
$LK,"OptLag1",A="FL:::/Compiler/OptLib.CPP.Z,51",BI=149$
$LK,"OptLag2",A="FL:::/Compiler/OptLib.CPP.Z,62",BI=150$
$LK,"StreamPrint",A="FL:::/Compiler/CMisc.CPP.Z,43",BI=151$
$LK,"ICFCvt",A="FL:::/Compiler/BackFA.CPP.Z,121",BI=152$
$LK,"StreamDir",A="FL:::/Compiler/CMisc.CPP.Z,57",BI=153$
$LK,"PrsOffsetOf",A="FL:::/Compiler/PrsExp.CPP.Z,348",BI=154$
$LK,"MDR_REG",A="FL:::/Compiler/BackLib.CPP.Z,132"$
$LK,"LexStatement2Bin",A="FL:::/Compiler/CMain.CPP.Z,1",BI=155$
$LK,"PrsDoWhile",A="FL:::/Compiler/PrsStmt.CPP.Z,503",BI=156$
$LK,"ICShift",A="FL:::/Compiler/BackA.CPP.Z,693",BI=157$
$LK,"ICFMod",A="FL:::/Compiler/BackFA.CPP.Z,249",BI=158$
$LK,"COCPop",A="FL:::/Compiler/PrsLib.CPP.Z,121",BI=159$
$LK,"PrsExpression2",A="FL:::/Compiler/PrsExp.CPP.Z,65",BI=160$
$LK,"SLASH_OP_PUSH",A="FL:::/Compiler/BackLib.CPP.Z,262"$
$LK,"PE_DEREFERENCE",A="FL:::/Compiler/PrsExp.CPP.Z,5"$
$LK,"LexPopRestore",A="FL:::/Compiler/LexLib.CPP.Z,23",BI=161$
$LK,"ICUnaries",A="FL:::/Compiler/BackB.CPP.Z,1",BI=162$
$LK,"ICFMul",A="FL:::/Compiler/BackFB.CPP.Z,569",BI=163$
$LK,"LexExpression2Bin",A="FL:::/Compiler/PrsExp.CPP.Z,1112",BI=164$
$LK,"ICFPow",A="FL:::/Compiler/BackFA.CPP.Z,280",BI=165$
$LK,"MapFileWrite",A="FL:::/Compiler/CHash.CPP.Z,90",BI=166$
$LK,"ICFSub",A="FL:::/Compiler/BackFB.CPP.Z,635",BI=167$
$LK,"CmpF1PushPop",A="FL:::/Compiler/OptLib.CPP.Z,529",BI=168$
$LK,"OptFree",A="FL:::/Compiler/OptLib.CPP.Z,33",BI=169$
$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,94",BI=170$
$LK,"AsmUnresolvedAdd",A="FL:::/Compiler/AsmResolve.CPP.Z,189",BI=171$
$LK,"AOTStoreCodeU8",A="FL:::/Compiler/AsmLib.CPP.Z,1",BI=172$
$LK,"MDR_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,133"$
$LK,"ICBitOps",A="FL:::/Compiler/BackB.CPP.Z,256",BI=173$
$LK,"lex_zeros",A="FL:::/Compiler/Lex.CPP.Z,92"$
$LK,"CSwitchCase",A="FL:::/Compiler/PrsStmt.CPP.Z,568"$
$LK,"AsmResolve",A="FL:::/Compiler/AsmResolve.CPP.Z,1",BI=174$
$LK,"COCCompile",A="FL:::/Compiler/PrsLib.CPP.Z,249",BI=175$
$LK,"Cmp",A="FL:::/Compiler/CMain.CPP.Z,419",BI=176$
$LK,"PrsPush2",A="FL:::/Compiler/PrsLib.CPP.Z,11",BI=177$
$LK,"ICArgPut",A="FL:::/Compiler/CExcept.CPP.Z,142",BI=178$
$LK,"UndefinedExtern",A="FL:::/Compiler/CExcept.CPP.Z,99",BI=179$
$LK,"OptIC4",A="FL:::/Compiler/OptPass4.CPP.Z,1",BI=180$
$LK,"OptIC6",A="FL:::/Compiler/OptPass6.CPP.Z,1",BI=181$
$LK,"ICCmpAndBranch",A="FL:::/Compiler/BackB.CPP.Z,588",BI=182$
$LK,"PrsStatement",A="FL:::/Compiler/PrsStmt.CPP.Z,887",BI=183$
$LK,"PrsWhile",A="FL:::/Compiler/PrsStmt.CPP.Z,483",BI=184$
$LK,"ICFCmpAndBranch",A="FL:::/Compiler/BackFB.CPP.Z,306",BI=185$
$LK,"Lex",A="FL:::/Compiler/Lex.CPP.Z,439",BI=186$
$LK,"ICTestAndBranch",A="FL:::/Compiler/BackB.CPP.Z,768",BI=187$
$LK,"uasm",A="FL:::/Compiler/Compiler.PRJ.Z,17"$
$LK,"MDR_SIB_D32_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,138"$
$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=188$
$LK,"PE_DO_BINARY_OP",A="FL:::/Compiler/PrsExp.CPP.Z,9"$
$LK,"CmpFixUpAOTAsm",A="FL:::/Compiler/CMain.CPP.Z,302",BI=189$
$LK,"OptLabelFwd",A="FL:::/Compiler/OptLib.CPP.Z,1",BI=190$
$LK,"ICOrOr",A="FL:::/Compiler/BackB.CPP.Z,63",BI=191$
$LK,"LexExcept",A="FL:::/Compiler/CExcept.CPP.Z,81",BI=192$
$LK,"cmp_templates",A="FL:::/Compiler/CExts.CPP.Z,46"$
$LK,"CmpF2PushPop",A="FL:::/Compiler/OptLib.CPP.Z,536",BI=193$
$LK,"MDR_D32_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,135"$
$LK,"CmpJoin",A="FL:::/Compiler/CMain.CPP.Z,35",BI=194$
$LK,"MDR_SIB_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,136"$
$LK,"PrsPop2",A="FL:::/Compiler/PrsLib.CPP.Z,16",BI=195$
$LK,"CMP_TEMPLATES",A="FL:::/Compiler/Templates.CPP.Z,4"$
$LK,"PrsAsmBlk",A="FL:::/Compiler/Asm.CPP.Z,901",BI=196$
$LK,"PrsAsmArg",A="FL:::/Compiler/Asm.CPP.Z,35",BI=197$
$LK,"LexFirstRem",A="FL:::/Compiler/Lex.CPP.Z,272",BI=198$
$LK,"MemberFind",A="FL:::/Compiler/LexLib.CPP.Z,67",BI=199$
$LK,"cmp",A="FL:::/Compiler/Compiler.PRJ.Z,16"$
$LK,"OptLag",A="FL:::/Compiler/OptLib.CPP.Z,40",BI=200$
$LK,"ICPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,466",BI=201$
$LK,"ICDivEqual",A="FL:::/Compiler/BackA.CPP.Z,452",BI=202$
$LK,"ICFPostIncDec",A="FL:::/Compiler/BackFB.CPP.Z,677",BI=203$
$LK,"ICTest",A="FL:::/Compiler/BackLib.CPP.Z,403",BI=204$
$LK,"ICModU64",A="FL:::/Compiler/BackC.CPP.Z,588",BI=205$
$LK,"ICLastIns",A="FL:::/Compiler/BackLib.CPP.Z,59",BI=206$
$LK,"PrsAsmImm",A="FL:::/Compiler/Asm.CPP.Z,1",BI=207$
$LK,"LexExtStr",A="FL:::/Compiler/LexLib.CPP.Z,219",BI=208$
$LK,"OptEqu",A="FL:::/Compiler/CMisc.CPP.Z,1",BI=209$
$LK,"ICAddSubEctImm",A="FL:::/Compiler/BackA.CPP.Z,57",BI=210$
$LK,"OptOff",A="FL:::/Compiler/CMisc.CPP.Z,11",BI=211$
$LK,"ICPush",A="FL:::/Compiler/BackLib.CPP.Z,303",BI=212$
$LK,"ICSwap",A="FL:::/Compiler/BackC.CPP.Z,632",BI=213$
$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=214$
$LK,"CmpCtrlDel",A="FL:::/Compiler/Lex.CPP.Z,59",BI=215$
$LK,"ICClassPut",A="FL:::/Compiler/CExcept.CPP.Z,118",BI=216$
$LK,"ICAssign",A="FL:::/Compiler/BackC.CPP.Z,159",BI=217$
$LK,"ICFTemplateFun",A="FL:::/Compiler/BackFB.CPP.Z,701",BI=218$
$LK,"MemberAdd",A="FL:::/Compiler/LexLib.CPP.Z,102",BI=219$
$LK,"PrsPush",A="FL:::/Compiler/PrsLib.CPP.Z,1",BI=220$
$LK,"SLASH_OP_FDIVR",A="FL:::/Compiler/BackLib.CPP.Z,269"$
$LK,"SLASH_OP_FISTTP",A="FL:::/Compiler/BackLib.CPP.Z,272"$
$LK,"CmpCtrlSize",A="FL:::/Compiler/Lex.CPP.Z,71",BI=221$
$LK,"ICLocalVarInit",A="FL:::/Compiler/BackC.CPP.Z,923",BI=222$
$LK,"PrsFor",A="FL:::/Compiler/PrsStmt.CPP.Z,526",BI=223$
$LK,"PrsPopDeref",A="FL:::/Compiler/PrsLib.CPP.Z,21",BI=224$
$LK,"ICCopyTemplate",A="FL:::/Compiler/BackFA.CPP.Z,75",BI=225$
$LK,"PrsFun",A="FL:::/Compiler/PrsStmt.CPP.Z,132",BI=226$
$LK,"OTraceMask",A="FL:::/Compiler/CMisc.CPP.Z,26",BI=227$
$LK,"LexIncludeStr",A="FL:::/Compiler/Lex.CPP.Z,294",BI=228$
$LK,"PrsType",A="FL:::/Compiler/PrsVar.CPP.Z,284",BI=229$
$LK,"CmpCtrlNew",A="FL:::/Compiler/Lex.CPP.Z,28",BI=230$
$LK,"cmp_type_flags_src_code",A="FL:::/Compiler/Lex.CPP.Z,324"$
$LK,"PrsVarInit2",A="FL:::/Compiler/PrsVar.CPP.Z,123",BI=231$
$LK,"PrsPop",A="FL:::/Compiler/PrsLib.CPP.Z,6",BI=232$
$LK,"OptOn",A="FL:::/Compiler/CMisc.CPP.Z,6",BI=233$
$LK,"asm_seg_prefixes",A="FL:::/Compiler/Asm.CPP.Z,388"$
$LK,"ICMinMax",A="FL:::/Compiler/BackC.CPP.Z,509",BI=234$
$LK,"CmpLoadDefines",A="FL:::/Compiler/CInit.CPP.Z,206",BI=235$
$LK,"PrsIf",A="FL:::/Compiler/PrsStmt.CPP.Z,456",BI=236$
$LK,"ICBuiltInFloatConst",A="FL:::/Compiler/BackLib.CPP.Z,413",BI=237$
$LK,"ICFUnaryMinus",A="FL:::/Compiler/BackFA.CPP.Z,198",BI=238$
$LK,"ICOrEqual",A="FL:::/Compiler/BackC.CPP.Z,715",BI=239$
$LK,"LexDocRead",A="FL:::/Compiler/Lex.CPP.Z,306",BI=240$
$LK,"COCPopNoFree",A="FL:::/Compiler/PrsLib.CPP.Z,114",BI=241$
$LK,"CmpFixUpJITAsm",A="FL:::/Compiler/CMain.CPP.Z,174",BI=242$
$LK,"ParenWarning",A="FL:::/Compiler/CExcept.CPP.Z,111",BI=243$
$LK,"PrsFunCall",A="FL:::/Compiler/PrsExp.CPP.Z,378",BI=244$
$LK,"ICDerefPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,505",BI=245$
$LK,"ExeFile2",A="FL:::/Compiler/CMain.CPP.Z,655",BI=246$
$LK,"COptMemberVar",A="FL:::/Compiler/OptLib.CPP.Z,550"$
$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=247$
$LK,"ICBrBitOps",A="FL:::/Compiler/BackC.CPP.Z,211",BI=248$
$LK,"LexGetChar",A="FL:::/Compiler/Lex.CPP.Z,108",BI=249$
$LK,"LexSkipEol",A="FL:::/Compiler/Lex.CPP.Z,265",BI=250$
$LK,"ICFlagBranch",A="FL:::/Compiler/BackB.CPP.Z,817",BI=251$
$LK,"SLASH_OP_FSUBR",A="FL:::/Compiler/BackLib.CPP.Z,266"$
$LK,"ICFPreIncDec",A="FL:::/Compiler/BackFB.CPP.Z,657",BI=252$
$LK,"ExeFile",A="FL:::/Compiler/CMain.CPP.Z,616",BI=253$
$LK,"COCMiscNew",A="FL:::/Compiler/PrsLib.CPP.Z,143",BI=254$
$LK,"cmp_templates_dont_pop",A="FL:::/Compiler/CExts.CPP.Z,47"$
$LK,"CmpOffset2Reg",A="FL:::/Compiler/OptLib.CPP.Z,83",BI=255$
$LK,"PrsFunNew",A="FL:::/Compiler/PrsLib.CPP.Z,62",BI=256$
$LK,"StreamExePrint",A="FL:::/Compiler/CMain.CPP.Z,666",BI=257$
$LK,"COCGoToLabelFind",A="FL:::/Compiler/PrsLib.CPP.Z,152",BI=258$
$LK,"OptMVCompare",A="FL:::/Compiler/OptLib.CPP.Z,556",BI=259$
$LK,"ICToBool",A="FL:::/Compiler/BackB.CPP.Z,410",BI=260$
$LK,"PrsFunJoin",A="FL:::/Compiler/PrsStmt.CPP.Z,68",BI=261$
$LK,"PrsNoUnusedWarn",A="FL:::/Compiler/PrsStmt.CPP.Z,774",BI=262$
$LK,"OptFixSizeOf",A="FL:::/Compiler/OptLib.CPP.Z,485",BI=263$
$LK,"cmp_templates_dont_push",A="FL:::/Compiler/CExts.CPP.Z,49"$
$LK,"CTrace",A="FL:::/Compiler/CMisc.CPP.Z,33",BI=264$
$LK,"cmp_templates_dont_push_pop",A="FL:::/Compiler/CExts.CPP.Z,50"$
$LK,"LexAttachDoc",A="FL:::/Compiler/Lex.CPP.Z,327",BI=265$
$LK,"PrsStreamBlk",A="FL:::/Compiler/PrsStmt.CPP.Z,788",BI=266$
$LK,"cmp_templates_dont_push2",A="FL:::/Compiler/CExts.CPP.Z,48"$
$LK,"InstEntryFind",A="FL:::/Compiler/UAsm.CPP.Z,80",BI=267$
$LK,"PrsDotDotDot",A="FL:::/Compiler/PrsVar.CPP.Z,378",BI=268$
$LK,"AsmPrsInsFlags",A="FL:::/Compiler/AsmInit.CPP.Z,1",BI=269$
H2@1$1$:$@$[$`$‹$�$À$ª$Ğ$×$è$û$¨%K�O�O¤O¬O·OÃOÎOíOĞOùOÿOÿO&P3P^PwPwP¡PÃPÛPÈPçP␍QúP!Q.QYQYQ`Q~Q‘Q‘Q‘Q›QH<J>Ù>ÙXÙbÙfÙjÙoÙqÙ�٩٩ٳÙ|ªÅVİV݂݀݉İ�ݕݗİ�ݣݪݷİÄİ×İåİôİùİûİŞ
ŞŞ-Ş=Ş[ŞmŞ8fßfßoßtß߈ß�ߑߖß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@‡@‡N‡X‡c‡n‡t‡z‡ jn66DY_
P ©6©6·6Æ6Ş6ä6ö6ö67
7777 œ;^îÊîÊöÊúÊË*Ë=ËZË{˄˕˼ËÓËÓËõËÌ␍ÌÌ!ÌSÌ`ÌdÌlÌlÌÌ�Ì“Ì—Ì Œ×ö¦¦ÆÎÒàæìì/CQhnz�¬µÅÇÎÎÔÔä␍|1‘#‘#§#°#»#Ô#Ô#×#æ#ì#õ#÷#ı#$$$$ $"$"$,$0 '�…�…�…¾…Ä…Ê…Ê…Ğ…„•²°œ°œÄœËœÒœÖœúœ␍��%�J�U�`�b�m�’���¨�ª�±�º�¼�Ç�Î�ø�("î¿î¿ı¿À(À(À.À –¿–¿¥¿¸¿¾¿ƒ¯¯%¯,¯C¯O¯Z¯l¯}¯n¯l¯�¯¸¯Ä¯Ë¯Ñ¯İ¯ç¯î¯õ¯ù¯û¯°␍°°°%°)°)°3°8°C°U°f°W°U°†°§°³°º°À°Ì°Ö°İ°ä°è°ê°ğ°ü°±␍±±±±%±3±C±U±f±W±U±†±§±³±º±À±Ì±Ö±İ±ä±è±ê±ğ±ü±²␍²²²²"²2²D²U²F²D²u²|²‚²�²˜²Ÿ²¦²ª²¬²²²¾²È²Ï²Ö²Ú²Ú²ä²ò²û²³ ³$³$³'³0³¦³ğî^î^ _©„_%_A_L_^_e_v_~_†_‰_—_Ã_Ã_Ø_Ú_Ú_æ_î_ò_ÿ_ÿ_ ```$`$`$`@`K`\`\`a`y`ˆ`�`“`�`£`£`¨`À`Ï`Ô`Ú`å`ê`ê`ø`a␍aaa%a(a.a3a<aNaWahaxaxa}a…a�a�a–a–a›a›a›a¡a¤a«a¶aËağabbb$b0b<bBbIbRbVbYbebkbrbwbwb…b•b•b¢b¢bªb²b»bÊbÏbÏbÖbábçbïbõbcccc c1c7c?cEcJcUcgcmcuc{c€c€c”cšc¥c«c­c½cÃcÃcåc ddd%d+dAdRdXd]dvd|dŒd”dœd¢d§d§d»dÁd×dèdîdód ee"e*e2e8e=e=eSeYeoe€e†e‹eše e±e¹eÁeÇeÎeÓeÓeéeïeffff-f3f=fEfMfSfZfZfZflfuf†f–f–f›f›f©f±fÂfÕfÜfâfêfğfggggggggggg8gDgIgIg_ghgsg|g‡g’g—g—g­g³gÉgÚgàgåg÷gıghh9h9h>h>hJhRhUh[hahfhfhŠh’hšhªh°h¶h¶hÇhåhåhêhêhöhşhiiiii3i;iKiQiXivi…i�i¥i­i°i·i½iÕiİiõiıijj␍j␍j␍j,j<jHjPjSjZj`jpjj‹j¦j®j±j¸j¾jÖjâjıjkkkkkkkkk#k3kIkOkgkzk€k…k—k�k¢k¾kÄkĞkØkÛkâkèkll)l/l6l6l6l;l;lDl\lrlxl�l£l©l®lÙlßlòl)m;mWm_memjmjm„m�mœm§m§m¬m¬mÆmÒmŞmémémîmîmnn n+n+n0n0nFnLnXn^ncnun{n€n�n›n§n­n³nºnÍnØnánínõnønşno oo,o4oLoToWo]oco{oƒo£o½oÅoÈoÎoÔoÔoåoîoúopp ppp)p8p@pXp`pcpjpppˆp�p¯pÉpÑpÔpÛpápápñpúpqqqqq"q6qEqMqgqoqrqxq~q–q�qÀqÜqäqçqíqóqóqr␍rr!r$r+r1r6rHrWr_rzr‚r…rŒr’rªr²rÔrñrùrürs s s s s sss$s*s6s<sAsSsYs^slsxs�s�s•s˜sŸs¥sªs¼sËsÓsësósösıstt#tBt\tdtgtnttttttt…t�tšt¢t¥t¬t²t·tÉtØtätÿtu
uuu/u;u]uzu‚u…uŒu’u’u’u’u’u—u—uªuÅuËuÖuÛuÛuîuv
vvvv*vMvSv^v^vpvyvŠv�v¡v±v±v¶v¶vÉvßvåvóvwwww0w6wDwSwXwXwnwtw‘w©w©wÓwÙwŞwêwówxxxxx#x@xXxXx‚xˆx�x™x¢x±x±x¶x¶xÌxÒxïxyy1y7y<yHyQy`y`yeyey{y�y�y¶y¶yàyæyèyôyıyzzzz␍zz$z5z7zIzVzVzVzfzvz{zŸz«z¬z±zÆzãzóz{'{-{-{-{2{7{L{_{�{­{³{µ{º{Ë{Ú{ ||||!|(|(|1|C|V|_|n|n|s|x|‡|�|›|�|¦|±|±|Ò|Ù|ß|ç|ò|ø|}}}!}'}'},}1}8}?}F}M}V}e}e}e}j}j}j}|}�}�}“}�}¦}®}´}´}´}¹}¹}Ä}Õ}Ø}ä}í}ù}~~ ~ ~~'~*~6~?~K~R~X~]~]~]~]~b~g~g~n~r~r~~~‡~Š~Š~•~—~©~°~¶~Å~Ğ~Û~á~ê~î~î~ú~%,2:EPV`cggovy{†Š“––¡£»ÂÍØÛáææíññı€ € €€€(€/€5€D€O€Z€`€i€m€m€y€‚€…€…€�€’€¤€«€±€¹€Ä€Ï€Õ€߀â€æ€æ€î€õ€ø€ú€� ���� �"�:�A�L�W�Z�`�e�e�w�{�{�‡���“�“��� �²�¹�¿�Ñ�Ü�ç�í�ò�ò�ı�‚‚␍‚‚‚‚ ‚$‚+‚0‚5‚:‚:‚N‚S‚S‚`‚d‚u‚}‚�‚•‚œ‚ ‚ ‚­‚¹‚Á‚Ç‚ׂÛ‚ì‚ş‚ ƒ␍ƒ␍ƒƒ"ƒ*ƒ0ƒ0ƒ0ƒ0ƒ0ƒ2ƒ2ƒ@ƒGƒTƒ`ƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒnƒpƒpƒ‡ƒ�ƒ›ƒ›ƒ¼ƒʃâƒäƒğƒıƒıƒ „-„8„A„J„U„\„\„f„f„i„{„™„¥„¥„Ö†xÀÚ™4™4«4­4±4º4Æ4Ò4ç4ç4555(5;5E5H5S5V5^5h5°›Ãqq$q+q<qAqVqCqbqhqhqtqŒqyq˜q›q�q«q°qÅq²qÑqÔqÔqàqõqâqrrrr-r@rSrfrpr„�®\®\Ì\Ş\ä\ë\ò\ô\÷\ş\]]!]%]+]+]C]W]h]h]p]”]´]Õ]Ú]û]^ ^^^)^,^c^t^y^^�^‡^Š^›^ ^£^«^´^Ï^ï^___"_D_W_\_s_†_‹_�_±_Ì_ì_ÿ_```` `%`+`<`A`G`O`O`Y`b`y`Œ`‘`•`·`Ò`ò`a
a%aEa\aoataxaša­a­aÈaÈaÈaÖaîağağağaşabbb&b>b>bPbPbYbfb|bœb¶b½bÇbÚbŞbŞbŞbåbëbc cc.c0c6cPcWcacoczczc”cHš¨°}°}Ç}İ}í}ô} ~&~8~<~~LíüŞsŞsòsşstt t"t5tHtSt^tft`Ê�{�{¤{Æ{Ó{İ{ì{| ||"|?|A|A|r|`|A|‘|›|4IRŞÒŞÒçÒçÒêÒøÒÓ ÓÓä;.×.×V×Y×w×�ןן׺×À×Å×Å×à׿×ë×ë×ô×ØØØØ ØcØmØtØzØ|Ø|Ø�ؕؕؕإؚضØÅØרÜØÜØÜØãØêØñØÙ␍Ù)Ù)Ù;ÙĞL¼h¡h¡‚¡�¡˜¡¡¡©¡¬¡³¡·¡À¡Ñ¡Õ¡Û¡é¡¢¢"¢'¢3¢8¢?¢K¢P¢S¢]¢U¢m¢v¢‡¢…¢}¢•¢�¢¤¢¤¢²¢µ¢É¢Ò¢Û¢â¢æ¢ë¢££#£1£M£Y£Y£q£‚£‚£‰£¥£±£¹£Ì£Ó£ç£ğ£÷£û£¤ ¤¤/¤\¤c¤g¤i¤t¤€¤„¤™¤›¤¬¤¶¤Á¤Ë¤Ú¤é¤¥¥¥¥¥—¥Xs…nÍn͋ͬ͟ͶÍÍÍêÍÎÎÎ%Î+Î.Î:ÎŒ ``p‘‘ŸŸŸŸ¨¨¯ÉÚââííû € €€ € €7€7€=€c€ (kq€‡€‡�‡š‡ª‡±‡·‡ @UaÊÊÊÊ#ÊBÊOÊOÊRÊTÊZÊ!$/4†À†À“À¡À¦À¬À"$).^À^ÀkÀyÀ~À„À#$#(.À.À=ÀLÀQÀWÀ$8îx™™¥µËÓİõú
( 2 J O _ o … � — ¯ » Ã Í İ â ø   * 4 > H R \ f p z � š ¤ ® ¸ Â Ì Ö à ö !
! !*!4!>!H!R!\!f!p!z!„!�!˜!¢!¬!¶!À!Ê!Ô!Ş!è!ò!ü!"""$"."8"B"L"\"%¨D°˜°˜Æ˜Í˜Ô˜â˜ó˜™™™™$™/™9™D™[™^™`™r™x™ˆ™’™œ™£™®™Ã™Ë™Ë™á™á™á™õ™&Ğ1–ò–ò´ò»òÂòÍòÕòîòîòóóó&ó*ó5ó]ó<óióó�ó£ó§ó¬ó¾óæóıóô
ôôô:ôPôTôTôdô¡ô€ô­ôÊôÊôéôôôúôõ!õ&õ8õ`õwõ|õ„õˆõŠõ±õÇõËõçõööö ö%ö6öLöZönösöŒö�ö¡ö³ö³ö³ö³ö¸öÔö÷óö ÷=÷H÷N÷d÷u÷z÷–÷¾÷Æ÷Ë÷Ï÷Ô÷å÷÷÷øøø4øEøIøIø[øƒøšøŸø§ø«ø­øÔøêøîøûøûøûøûøùùù%ù8ùOùOùkù{ù‰ù‰ùŸù¯ù½ùÔùçùìùòùúúú,ú<úCúQúoúgú”ú½ú½ú½úÊúûûûû$ûCûZûJûfû|ûŠû¢û¸û¼ûÌûëûüü#ü@ü_üjüpü†ü—üœü²üÈüÌüèüııı!ı&ı7ıMı[ıoıtı�ı�ı¢ı´ı´ı´ı´ı¹ıÕıôı#şş/şLşWş]şsş„ş‰ş¥şÍşÕşÚşŞşãşôşÿÿ(ÿ*ÿCÿTÿXÿXÿwÿ�ÿ£ÿ§ÿ´ÿ´ÿ´ÿÇÿÍÿ×ÿŞÿñÿ$4BBXh}v‘¤©¯ÅÔÍéù$$@@Mmmm�'$5:®À®À¼ÀËÀĞÀÖÀ(¨Ekø™ø™ššš*š;šMšOšVš\šlšwš�šŒš£š¦š¨šºšÁšÑšÛšåšìš÷š ›››)›)›)›>›)(&,I0I0W0^0h0n0t0*0_g�Ì�Ì´ÌÇÌÖÌÜÌßÌçÌ+ �ܾ¾àèîû  $ $ $ 1 3 > H O [ f l v } � � ™ £ £ µ » Ë Ñ Ö İ İ ş   & , / 5 5 7 = C E E E V ` e e z „ „ ˜ ¡ § ­ à È Ï â æ æ î ô ú ! !!!-!-!R!V!\!b!q!„!Š!�!”!š! ! !¢!¦!¬!²!¸!½!½!½!½!è!ù!ù!""!")">"^"^"d"g"k"q"q"ƒ"”"©"½"Å"Ö"Ú"ë"ï"õ"#####%#1#O#U#`#ƒ#�#”#š# #©#¯#Ä#Ò#Ú#Ş#ï#ó#ù#$$$'$)$5$S$Y$_$e$n$t$‘$„$«$´$º$º$Ï$Ô$Ô$Û$â$ô$ù$ù$ù$%%/%1%K%Q%Y%]%d%‡%�%“%Ÿ%¶%½%Ã%Î%Ó%Ó%Ú%Ş%å%ó%õ%ı%&
&&&'&,&2&7&?&D&S&n&~&‹&š&¶&¸&Ô&Ô&Û&ğ&õ&ş& '''''"'&'-';'='E'I'M'W'c'j'n'v'~'†'•'£'¨'´'´'¼'¼'ß'ß'í'ó'ø'ü'((((( ( (,(2(8(?(U(W(W(W(b(b(b(g(�),4+t®Ä®ÄÈÄÌÄäÄìÄôÄşÄÅ ÅÅ#Å+Å0Å3Å>ÅIÅQÅ\ÅgÅiÅņÅ�ŘţťŰŻŽÅÉÅÒÅÒÅèÅòÅ ÆÆÆ&Æ,Æ5ÆGÆMÆMÆUÆYÆdÆiÆ{ƆƊƘƚÆ�ƭƭƭƾƾÆÃÆÕÆÛÆIÇ-Ô@–à–à¬à³à¶àÚàÚà÷à
áá0á5á5áSáaátá‡á�á�á‘á‘á‘á¤á¦á¦á¦á­áÀáÓáÓáÓáæáñáââ â#â*â?âRâYâYâ\â�â.LAP%%% %,%G%L%l%n%‰%¤%¤%¬%³%Ú%/P~�ˆˆˆ#ˆ1ˆCˆNˆ\ˆiˆwˆ‰ˆ”ˆ¢ˆ¨ˆ®ˆ04
Q6Q6_6k6|6�6—6¡6§61|¼WNNpw†‘··ÀÂÂÉğ÷÷*55AHX^|‡‰¢¨³ÃÕŞéîôû %3<<CRiix~’™ ¥°¾äíôù 38@L^^u|„”¦¬µµÄÊŞç÷  ! 1 D L ` � ˜ œ ¨ ¿ Û í ó ş 

*
/
8
8
J
N
Z
q
�
Ÿ
¥
°
¼
Ì
Ü
øœ C;;;";.;>;V;\;j;{;ƒ;Š; ;Æ;à;í;ú;
<<<#<E<L<R<`<h<~<‰<�<•<¸<ù(Kæ1æ12 22&282>2I2`2o2z2~2‰2•2 2¬2Ã2Ú2í233)3)3;3A3R3X3h3h3€3€3¥3¥3ª3ª3°3¼3É3Õ3ê3444-494P4h4‰4‰4’4—4—4—4—4§4°4¸4½4Ë4Ù4é4î4î455 5 55 52585D5T5_5i5m5v5�5’5¢5¯5¿5Ï5Ö5Ü5è5ð5û5666 6,676=6M6]6]6Š6¬6¸6À6Ë6Ò6Ý6ß6ê6ê6ú6ÿ6ÿ6 77&7,7:7G7T7^7b7k7„7‡7—7ž7£7£7·7·7¼7À7Ð7Ù7ë7ñ7ó7ó788␍88$808@8@8@8E8]8]8l8o8ƒ8¡8¬8Õ8ç8ò899␍99&969N9U9Y9_9g9r9u:úD€¾<¾<Ú<á<ù<==&=&=+=6=B=M=[=k={=‚=‰=ž=³=³=Ç=ß=ì=û=>>*>8>F>M>T>i>~>~>’>Ÿ>°>À>Æ>×>×>Ý>ë>ü> ??{?û„yÖ&␍&␍H␍S␍Z␍b␍e␍e␍u␍€␍€␍ƒ␍Š␍‘␍˜␍ž␍¤␍«␍±␍Â␍Â␍Ä␍Í␍Ù␍ß␍  $))06GMS^oox}‡Ž•�£¥³ÊÍÜèõõõõû␍$EVjq{ƒŠŠ“š¦ÁÁÁÕéùü·üxÔnæóæóôôô)ôOôOôXôZôZôaôˆô�ô�ôžô­ôÂôÍôÍôÙôàôðôöôõ õ!õ:õ@õKõ[õmõvõ�õ†õŒõ“õ¸õ½õËõÔõÔõÛõêõöööö*ö1ö8ö=öHöNöVö|ö…öŒö‘öœö¨ö·öËöÐöØöäööööö␍÷÷÷,÷>÷D÷M÷M÷\÷b÷v÷÷�÷ž÷°÷¹÷É÷Ü÷ä÷ø÷ø0ø4ø@øWøsø…ø‹ø–ø¢ø²øÂøÇøÐøÐøâøæøòø ù%ù7ù=ùHùTùdùtù†ùŒùŒù‘ù“ù“ù˜ù˜ù§ù­ù³ù³ù·ù0üý¸iÓ®ä®äÌä×äâäåå
åå"å(å9åHåWådådåjåoåtå‡åšå¥å©å»åÌåÔåÛåöåææææ+ææ<æ3æFæHædæPælæzæzæ|æ˜æ˜æŸæ¥æ®æµæ¸æÏæÚæîæáæöæüæçççççç%ç%ç0çEçNçNçNçNçjç�ç‡çŒçŒç¡ç§ç¬ç¬ç¸çÕçóçøçýçýç è&è5èDèLèQèWè\è\ècèjè�èªè¬èÉèÞèÞèäèäèñèúèúè'é2é7éDéOéWé_éoé†é†é–é–é¨é®éÖéßéßéáéèéíéíéúéê êêê'ê4êFêQê_êhêmê”ê�ê¨ê­ê´ê¼êÏêäêéêðêýêëë+ë2ë8ëAëAëdëkëpë~ëŽëœëœë¢ë©ë²ë²ëÅë×ëÚëÚëëëóëûëì$ì+ì8ì:ìAìUìdìdìdì‹ì‹ì‹ì˜ì˜ì­ì¸ìÊì×ìâìðìûì
íí+í>í@íOídífítí‰í‰í�í˜í˜í¥í«í½í½íÊíÍíØíêíñíüíî îîî î5î7îQîfîfîfîhîoîvî‡î•î§î§î­î´î½îÂîãîìîìîòîûîûîïï'ï*ï0ï9ïAïLï^ïdïoïoï|ïï…ïŽï–ï¡ï³ï¹ïÄïÄïÑïÔïÚïãïåïðð/ð5ð@ðRðXð`ð`ð`ð`ðkðæóþÈB°FFhszƒ“¥¬²¸½âïòû␍;NRXov„Š– ¥¬ÅÏØèêñöþ+7Qpw��–œ¢¨¾ßóÿ!0=LYiw’Ÿª¿âô &+2ITahhv…‡•¤¾áì ÿT·&&Q[ny‹™ ¯¾ÔÜï 0@IOT[bhny„‡Ž¨°Êßìï÷û␍'/F_cls…�”˜¡£µÌÚàäæóóóõ   $ ø×¾¾àèîû$$$13>HO[flv}ŽŽ™££µ»ËÑÖÝÝþ&,/557=CEEEV`eez„„˜¡§­ÃÈÏâææîôú --RV]cr…‹�–œ¢¢¤¨¯µ»ÀÀÀÀëüü $,Aaagjntt†—¬ÀÈÙÝîòø&(4RYd‡’˜ž¤­´É×ßãôøþ ,.:X^djszбºÀÀÕÚÚáèúÿÿÿ57QW_cj�“™¥¼ÃÉÕÚÚáåìúü ".39>FKZu…’¡½¿ÛÛâ÷ü##*.5CEMQU_krv~†Ž�©®ººÃÃææôúÿ39?\^^^iiin‘—\ïV.V.l.~.„.�.�.©.À.À.Ò.Ø.ã.ó.þ. //E/@åñÈÈÑÜçòý)+;0+3H(H(Q(w(ˆ(Ž(Ž(–(T¥bÎbÎ|Î�ΑΛΨνοÎÑÎÛÎðÎðÎ÷ÎúÎNÏD³³³/³9³@³L³e³n³r³„³‹³ª³H€Ž€%€%—%­%½%Ä%Û%ö%& &O&´»äp␍p␍‚␍…␍�␍›␍¬␍·␍Â␍Ô␍ì␍ñ␍
,>V[dkxŒ“•˜�Ÿ¸ÄDò@@Ydt½ÄØßçïø
!(G_hh�ÇÐò )S_�ƒŠ‘‘·÷7w·÷77FSXXgtvv~~~�¦¿ØÚÚááïòÿ␍1lsss{˜¦ÄÍÖò666Sa}›››¦©ÖØïõ -/<<`bizƒ…“•£¥³³ÓÓÓÓàó'4MUYaes�ƒ‹�“›©··ÑÜò$;FPWp|ƒœœ®³µ»ÌÝìó␍ -/===aa~…Œ�›ž¬°¾ÂÐÔÔíôù 5UhwyˆŠ™££±ºÐ×ü*Z_mo}† ¢¤«¼ÅÇÕ×åçõõ444?[€™žžžÀÅÅÅåêêê  !!((+0OeЦº¿¿Úçéø"CEEH†††¥¥¥ÆËËËíòòò    6 ; ; V d f u ~ ˜ š š Ÿ š À   Š     8 8 b z ’ � ³ Ã Ø ð !! !1!K!b!i!{% L�žP&P&i&k&r&ˆ&˜&ž&µ&Í&Ð&â&*'
$6;ºÒäþ $<Aþþ  'A
î
ô
ô
ù
û
û
       ˜␍2�Ää^Ö^ÖzÖ†ÖŠÖ�ֶּ֕֜֫ÖÁÖÃÖÏÖÖÖŞÖäÖêÖîÖîÖıÖ× ×××××&×38 �/�/�/•/¡/¬/½/Ç/Î/Ô/4@}‰NËNË\ËgËnË�˚˚Ë�ËŸË¥Ë5ğh �ä�ä´äÇäÏäÖäİäãäåäìäóäöäöäååå&åBåjårå{åƒåˆå™å¯å¿åÑåÖåğåæ æ ææ=æRænæ–æ�æ§æ¯æ´æÅæ׿çæùæûæç-ç1ç1çMçuç}ç†ç�ç“ç¤çºçÊçÜçáçûçèè*è*è*èBè/èbèOèoè{è�è™è±è¶èËèçèéé é(é-é>éPé`érété�é¦éªéªéÆéîéöéÿéê êê3êCêUêZêtêŒê�ê£ê£ê£ê¨êÈêèêôêúêë*ë*ë*ë6ë<ëGëRëdëtë‹ë¢ë¹ëĞëĞëäëììì!ì1ì?ì?ìHìSìaì|ì‹ì’ì¢ì¤ìªìÁìĞìÉìæì÷ìíí+í6D}о¾Îâëñ
7\Ob † †À†Ï†Ø†á†å†é†ò†÷†ü†ü†␍‡‡‡0‡3‡?‡80ı>ß>ßGßLßUß\ß^ßcß9Do|ffvŠ“™««¯²º:°ÄìvrvrŒr“r¤r©r¾r«rÊrĞrĞrÜrôrársssss-ss9s<s<sHs]sJsisosos‚s•s¨s»sÎsØs;<‹–&7@FJU<\!´�,�,Ğ,Û,--è,-E-J-J-N-X-d--†-”-–-�-¸-Ô-æ-ó- . .$.+.P.W.`.b.g.{.˜.ª.·.Ï.ì.å./////)/,/./D/3/P/h/j/‚/”/—/™/¯/�/»/»/»/Í/Í/Û/å/␍00"0"0'0+0G0S0n0Œ0–0š0ª0É0¾0Õ0×0é0ı0111!171V1K1b1d1v1€1”1�1§1¾1È1Ê1Ş1è1è1ş1222␍22(2@2B2Z2n2…2Š2œ2¤2Å2Û2Û2Û2333=”)FéFéNéRé^éoéqé�éŒé�é©é´éÃéÔéÛéôéøéêêêê)ê2ê@êTêpêuê’ê>d(=Ğ…Ğ…Ü…ğ…󅆆††'†/†2†8†?$q¨E¨EÌEÏEÓEàEéEôEFFF:F:FFFHFHFTFYFYFeFjFjFvF{F{F‡FŒFŒF˜F�F�F©F®F®FºF¿F¿F¿FÂFÂFÛFéFıF␍G␍GGGG!G&G&G,G8G8GCGOG\GqGyGGG�G�G™GœGH@ì xÖ†Ö†ó†û†ş† ‡‡/‡8‡P‡f‡x‡ƒ‡”‡˜‡ª‡­‡¸‡Á‡͇à‡ˆˆì‡!ˆ5ˆFˆRˆ`ˆ~ˆ�ˆ´ˆňLjèˆΈ‰‰‰ ‰‰‰‰,‰3‰@‰E‰T‰a‰t‰t‰ˆ‰Œ‰¹‰¹‰щÖ‰Ö‰æ‰î‰ş‰ŠŠ"Š2Š>ŠCŠCŠSŠ[ŠkŠuŠ…Š�ŠŸŠ«Š°Š°Š°ŠÒŠàŠêŠïŠüŠ‹‹‹ ‹/‹4‹:‹?‹?‹D‹N‹]‹b‹h‹m‹m‹s‹y‹~‹~‹�‹ ‹¬‹¹‹Å‹Ø‹à‹æ‹ï‹ŒŒ+Œ8Œ=ŒUŒhŒŒŒŒ”Œ§Œ¯ŒµŒ¾ŒÇŒÇŒÌŒÌŒÌŒÌŒÌŒØŒØŒØŒáŒúŒ��2�C�P�R�f�k�k�k�v�„�‰�‰�����£�»�Ç�Ù�å�ë�ú�ş���-�9�?�E�X�`�h�•�¦�³�µ�Ã�Ã�È�È�Ï�İ�â�õ��␍��� �%�%�%�%�%�=�B�B�B�B�B�S�S�S�S�S�S�S�S�S�S�\�u�Š�’�­�¾�Ë�Í�á�í�ò�ò�ò�û��!�&�H�T�T�Y�Y�Y�Y�Y�Y�Y�Y�n�s�s�s�„���”�”�Ÿ�±�É�Û�ü�‘'‘8‘=‘=‘=‘F‘h‘q‘‚‘†‘�‘®‘¶‘¾‘É‘ó‘ü‘’’(’(’(’(’(’J’ƒ’Œ’�’–’›’¤’­’²’²’²’²’Á’Õ’ó’ş’“ “““!“5“[“f“n“t“t“y“y“ˆ“œ“º“œʓГՓՓè“ü“"”-”5”;”;”@”@”@”I”b”w””𔫔¸”º”ɔ˔˔˔˔˔ߔߔߔߔߔߔߔߔߔߔߔߔߔߔߔߔî”ı”•
•
••••)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•)•+•+•B•J•V•V•Z•_•o•Š•Ÿ•®•º•Ğ•ê•í•÷•–)–I–i–�–�–¢–Ğ–¨–ë–ë–î–ş–—!—2—5—O—]—i—�—�—¬—¯—¾—Ò—ó—˜ ˜ ˜<˜N˜l˜Ÿ˜�˜’˜‡˜x˜­˜­˜­˜°˜µ˜¸˜Ò˜à˜™0™0™[™^™m™�™¢™³™Ï™»™ë™ë™ š<š:š/š$ššJšJšJšMšRšRšYšišŠš–ší�A´«Ô¾£¾£Ô£Ø£ã£ê£õ£ ¤ ¤¤%¤,¤9¤E¤R¤Z¤k¤k¤t¤y¤�¤‘¤Ÿ¤®¤¹¤̤̤ߤߤõ¤!¥!¥5¥7¥7¥A¥I¥I¥S¥[¥[¥[¥l¥l¥l¥p¥x¥~¥ƒ¥ƒ¥‡¥�¥“¥™¥�¥�¥ª¥¿¥Ï¥Ù¥ì¥ñ¥ù¥ù¥ş¥ş¥¦¦&¦6¦@¦H¦N¦a¦f¦n¦t¦t¦y¦€¦‹¦³¦¾¦ͦצߦå¦÷¦ı¦§§§§§§§§§␍§§&§6§<§D§W§\§d§i§q§v§v§v§~§†§�§—§œ§¤§©§°§»§ã§î§ö§¨¨!¨&¨,¨1¨1¨8¨J¨R¨e¨m¨u¨ЍŒ¨—¨Ÿ¨´¨´¨¼¨Шبߨå¨é¨í¨ü¨©␍©#©/©7©L©X©]©i©t©y©y©y©š©´©¹©Á©Ğ©Ø©à©õ©ú©ª␍ª"ª'ª'ª3ªIªUª]ªrª~ªƒª�ªšªŸªŸªŸªŸªŸªŸªªªªªªªªªªªªªªªªªªªªªªªªªµªÕªòª«««#«(«0«8«:«B«U«[«c«k«m«�«•«�«¦«®«³«¸«¿«Ê«ò«ı«¬¬¬7¬<¬D¬I¬I¬I¬R¬[¬^¬h¬v¬ˆ¬Ьœ¬®¬®¬®¬¹¬¾¬Û¬à¬à¬é¬î¬î¬î¬î¬î¬î¬î¬î¬î¬î¬î¬î¬î¬î¬î¬î¬ù¬­­1­D­L­l­q­y­€­�­•­�­¦­­­²­²­º­­Ş­æ­é­ë­û­®®®®®+®.®1®9®>®>®G®L®T®[®h®�®ˆ®�®¥®¯®Ê®ã®ë®ø®¯¯¯¯¯¯¯¯¯¯%¯0¯;¯J¯O¯O¯W¯_¯l¯q¯q¯q¯u¯z¯z¯Н�¯�¯�¯›¯¢¯¨¯¸¯ɯ坸¯ş¯°°"°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°,°,°G°Q°_°_°d°o°v°’°Ÿ°Ÿ°Ÿ°£°®°̰Ú°Ô²Bü|Ö²Ö²ì²÷²ş² ³³+³6³=³M³`³j³j³†³ ³§³°³·³º³ƳϳÖ³Ù³޳ô³ş³´´"´7´>´F´R´g´n´n´n´|´Š´”´—´¥´¯´²´Ä´É´δŞ´á´æ´ö´ù´ı´µµ µ(µ(µ(µ>µHµZµ`µlµ�µˆµ�µ¢µ¨µ·µȵȵϵϵϵݵëµõµøµ%¶*¶/¶?¶B¶G¶W¶Z¶^¶g¶o¶�‰¶‰¶•¶¢¶ª¶ª¶­¶¸¶Ö¶ä¶-·ChoÅ�»�»¨»»»»É»Ô»ç»ê»ó»ú»ı»␍¼¼&¼1¼4¼J¼V¼k¼v¼�¼Œ¼—¼¢¼¹¼żܼä¼í¼õ¼½½ ½&½+½>½D½L½_½e½m½m½{½�½š½­½³½»½νÔ½ܽܽ¾
¾)¾,¾,¾3¾@¾D¾O¾i¾u¾…¾¥¾Á¾Õ¾ݾ羿¿¿�¿D &*–*–* *¨*­*EÉÇş6ş67&797&7S7a7a7q7z7�7…7�7�7–7š7¸7Ä7Ğ7Ö7á7888!8'8.83838F8Q8\8c8k8x8x8Š8�8�8Ÿ8¤8¤8¤8·8¼8Ï8Õ8Ü8ñ899
9
99 9 9$9+939:9<9D9K9K9Z9`9m9t9w9™9™9¡9°9»9Â9Ä9Ø9ç9ì9ñ9ñ9ñ9: :: :&:;:O:O:T:T:\:r:w:‹:’:—:—:£:²:Ä:Ó:æ:ê:ù:;;$;A;L;Q;`;t;{;‚;’;”;¢;²;´;Â;Ï;ß;æ;û;<< <6<8<D<O<Q<Q<\<p<}<…<‡<›<­<´<Ä<Ğ<ñ<ø<="="="=*=5=9=A=E=M=T=d=o=‰=�=•= =©=±=¶=¶=Å=Ò=à=ë=ö=>
>>> >%>4>A>I>U>c>z>|>…>�>’>�>¼>Â>È>Î>×>è>??!?.?F?M?Y?h?}?}?Š?�?¡?§?§?§?§?c@FD�š�p�p²p¾pÔpÀpàpâpôpqqGìˆÿN=N=p=z=­=¼=Ò=ö=û=ÿ=>> >&>/>4>I>Z>y>�>ƒ>¢>ª>¹>À>Ì>Ñ>Ø>à>æ>è>? ? ? ?+?1?1?9?B?Q?p?w?y?˜?Ÿ?Ÿ?Ÿ?³?Ç?Ë?Ù?ì?ä?@ @@@#@)@+@G@L@b@N@n@t@t@�@•@®@š@º@À@Å@á@æ@ü@è@AAAA#A%AAAFA\AHAhAnAnAnAvAAA‰A‰A¡AÑAåAéA÷A
BB"B"B4BHüE€ÁÁ5ÁQÁVÁwÁ•Á¤ÁÂÁÖÁîÁõÁúÁÂ9ÂHÂeÂvÂ�‘‘•šŸ©¬¶¼ÂÙÂÜÂÜÂÜÂáÂçÂÃÃÃ&Ã:ÃBÃKÃgÃrÃ~ÇÛÛêïïýÃIl¬ÃÎ'Î'Ü'ö'ã'((!(6(#(U(B(a(o(w(‚(„(�(š(š(¹(¿(JP‡—nÖnÖ‚Ö�Ö�ÖªÖ°ÖÚÖğÖÜÖ×üÖ ×'×KŒg†şÔşÔ0ÕSÕSÕfÕjÕ‰Õ�Õ¢Õ¢Õ¯Õ·Õ¿ÕÔÕàÕñÕöÕÖÖ Ö"Ö"Ö"Ö;ÖSÖSÖmÖLP�­&¼&¼O¼Q¼_¼e¼ƒ¼’¼¡¼°¼¾¼ɼ̼ܼMì8––ÀÃÆÌÑèÿ(Nux‘¨ºÇÚíòú  'Oioˆ¡£½ÃÜõı$bw‰N$”™II1II;ICIOLu„NÇNÇ`ÇudžǗÇ�ǦǶǾÇÏÇÕÇÈPTHY‚‚"‚$‚-‚6‚D‚I‚R‚U‚Z‚h‚r‚u‚‚Q¨!Gh€h€x€�€”€¡€­€¹€Å€Ñ€è€è€÷€� ���2�E�J�\�k�w�‰�‰�’�²�²�´�Ç�É�ã�ï�ò� ‚Rxÿ™�g�g©g´gÄg␍hh(h/h7h?hHhPhXhZhbhjhqhxh—h¯h¸h¸híhi iBi\iyi£i¯iÑiÓiÚiáiáijjDj]j„j�jÄjİjkkDk]k„k„k“k k¥k¥k´kÁkÆkÆkÍkØkêkll5l7l7l7l>l>lKlPlPlPlalol‚l—lÑlØlØlØlàlıl m)m2m;mHmVmpmŒmŒmŒmŸm­mÉmçmçmçmòmõm"n$n;nAnRn[n]njnlnyn{nˆnˆn¬n®nµnÆnÏnÑnßnánïnñnÿnÿn o o o o,o?oRoso€o™o¡o¥o­o±o¿oÍoÏo×oÛoßoçoõoppp(p>pPppp‡p’pœp£p¼pÈpÏpèpèpúpÿpqqq)q8q?qPqYq[qiqkqyq{q‰q‰q‰q­q­qÊqÑqØqÛqçqêqøqüq
rrr r r9r@rErSrdrkr�r¡r´rÃrÅrÔrÖrårïrïrırss#sHsMsvs¦s«s¹s»sÉsÒsìsîsğs÷sttt!t#t1t3tAtAtatatatatat€t€t€t‹t§tÌtåtêtêtêt uuuu1u6u6u6uUuZuZuaucucukumumututuwu|u›u±uÖuòuv v v&v3v5vDvMvgvivivnviv�v‘v‘v™v”vÒvÒvÒvñvñvñvwwww9w>w>w>w^wcwcwcw‚w‡w‡w¢w°w²wÁwÊwäwæwæwëwæw xxxxxOxOxOxZxZx„x„x®xÆxŞxéxÿxy$y<yPyjyly}y—y®yµy­}S|.fÇfÇŠÇ�ǩǾÇÜÇçÇÈÈÈÈ*È,È,È,È9ÈQÈSÈSÈaÈnȆȆȗȫÈTçe&×&×@×I×i×i×o×w×ׇ×�ועע׿×Ä×Ä×Ê×Ï×Ï×Õ×Ú×Ú×à×å×å×ı×ØØØØ$ØDØDØDØKØMØMØTØVØVØ\Ø\ØcØeØeØkØkØrØtØtØzØzØ�Ø�؉Ø�Ø•Ø�Ø�Ø�Ø�ةرعØÁØÉØÑØÙØßØ÷ØÙÙÙÙÙ#Ù)Ù)Ù-Ù5Ù<Ù@ÙHÙPÙVÙ^ÙeÙmÙuÙyÙÙŠÙ�Ù�٩ٯٷٻÙÂÙÊÙÒÙÖÙÜÙäÙëÙóÙûÙÿÙÚÚÚ+Ú<ÚAÚDÚêÚUL©¸€~€~™~›~¢~¸~È~Î~æ~ş~[VÔ*[–ê–êªê¿êÎêÒêàêæêõêõêëëë%ë,ë<ëSëfëlëqëuë…ë…ë›ë�ë§ëÈëÓëÕëîëòëììì ìì ì3ì�ìW\X«Æ#Æ#Ş#å#÷#*$5$A$O$C$p$p$|$„$“$Í$Ï$ü$%%1%I%6%d%U%p%v%…%š%œ%§%¯%¯%Ê%Ï%Ø%ã%ë%ö%& &ı%=&*&I&^&K&‹&v&j&—&±&Ÿ&Ì&Ñ&ë&Ø&
'÷&'+''J'7'V'V'q'€'y'”'”'”'À'À'Ì'X$�“ÆHÆHñHÚHûHIYl  ¦+¦+´+Î+»+í+Ú+ù+,û+-,,9,G,O,Z,\,g,r,r,‘,—,Z,�Ñ�ѧѭѵÑÄÑÓÑØÑ[XÓ††?†Q†\†e†‡†‘†Ÿ†¹†ƆƆІІê†è†ø†ø†‡␍‡‡‡‡*‡1‡I‡P‡S‡e‡j‡u‡€‡š‡µ‡ɇ懈␍ˆˆˆ$ˆ1ˆOˆ7ˆXˆ\ˆbˆjˆoˆ�ˆwˆ˜ˆœˆ¢ˆªˆ¯ˆ¯ˆ¼ˆˆ݈Ɉéˆíˆóˆûˆ‰‰!‰%‰+‰3‰B‰]‰I‰i‰m‰s‰{‰€‰€‰¡‰¥‰«‰³‰³‰¸‰ʼnã‰ˉì‰ğ‰ö‰ş‰ŠŠ'Š+Š1Š9Š9ŠFŠdŠLŠmŠqŠwŠŠŸŠ‡Š¨Š¬Š²ŠºŠºŠºŠĞŠĞŠĞŠĞŠÛŠåŠîŠ‹‹(‹-‹;‹O‹T‹T‹_‹g‹o‹x‹„‹˜‹¥‹´‹Ëİ‹â‹â‹í‹õ‹Œ␍ŒŒ%Œ?ŒQŒcŒnŒsŒsŒ~Œ”Œ¡Œ©ŒµŒÃŒÈŒÖŒêŒêŒòŒêŒ
����#�#�2�7�7�H�M�M�^�c�c�v�…�Š�Š���¬�±�¿�±�Ó�Ø�æ�Ø�ú�ÿ�␍�ÿ�!�&�4�&�H�M�M�j�o�‘�–�¤�–�¸�½�½�Ú�ß�����(�-�-�J�O�q�v�„�v�˜�����º�¿�á�æ�ô�æ��␍�␍�(�-�-�H�M�M�h�m�m�ˆ�����¨�­�­�È�Í�Í�è�í�í�‘␍‘␍‘‘#‘#‘4‘9‘9‘E‘P‘e‘j‘j‘v‘�‘”‘·‘¾‘ȑ͑ޑè‘ı‘’␍’’)’1’6’6’:’>’E’O’Y’Y’l’q’q’q’u’‹’”’”’·’¼’¼’Ä’Ø’á’û’“““)“;“G“P“U“U“U“f“ƒ“�“˜“£“¨“³“»“À“À“˓ӓܓç“÷“”'”;”@”@”K”^”h”s””” ”®”³”Á”Ŕʔʔڔå”í”ò”ı”
••/•A•S•^•c•n•v•{•†•“•�•¸•Ê•Ü•Ü•Ü•Ü•á•æ•æ•ò•––)–+–G–G–Q–e–o–q–}–…–¢–³–½–È–ë–ü–␍——)—A—Q—V—V—a—f—f—n—y—~—~—†—‘—–—–—�—¼—¦—ԗٗٗá—ÿ—é—˜˜0˜˜H˜M˜M˜Z˜_˜_˜g˜l˜l˜x˜‰˜›˜ ˜ ˜´˜ ˜̘јјÙ˜ޘޘñ˜ö˜ö˜ ™™™(™8™=™=™W™g™l™l™†™–™›™›™µ™Å™Ê™á™Ê™ù™ş™ş™ ššJš8š&ššbšgš£š‘ššgš»šÀšÀšÏšßšäšäšóš››››%›*›R›@›*›j›o›—›…›o›¯›´›Ü›Ê›´›ô›ù›ù›œœ@œPœUœUœpœ\œšœªœ¯œ¯œ»œÀœÀœÌœÑœÑœäœôœùœùœ ��!�!�4�D�I�I�\�l�q�q�y�~�~�†�‹�‹�“�˜�˜� �¥�¥�¸�½�½�Ğ�Õ�#��ÿ�í�Õ�0�5�ƒ�q�_�M�5���•�•�¤�¿�Ä�Ä�Õ�ğ�õ�õ�ŸŸŸŸ!Ÿ&Ÿ&Ÿ.Ÿ3Ÿ3Ÿ;Ÿ@Ÿ@ŸxŸfŸTŸGŸ—Ÿ²Ÿ·Ÿ·ŸïŸİŸËŸ¾Ÿ ) . ` N F . x } ¯ � • } Ç Ì æ Ğ Ì ş ¡ ¡
¡¡8¡=¡=¡I¡b¡r¡ƒ¡ƒ¡©¡«¡Á¡Ç¡Ç¡ã¡ğ¡!¢c¢R¢@¢o¢w¢w¢w¢ƒ¢ˆ¢ˆ¢›¢¦¢°¢µ¢À¢Ê¢Ï¢Ï¢é¢î¢î¢ö¢û¢£û¢£&£+£?£+£K£V£[£[£f£t£y£y£„£�£”£”£¥£ª£ª£»£À£À£Ú£å£ê£ò£ê£ş£¤¤¤#¤(¤0¤(¤<¤A¤U¤A¤a¤f¤f¤z¤f¤†¤†¤†¤‹¤—¤‹¤ª¤¯¤¯¤»¤¯¤ΤÓ¤Ó¤ߤÓ¤ò¤÷¤÷¤¥÷¤¥¥/¥¥;¥G¥R¥]¥b¥v¥b¥‚¥�¥™¥¤¥©¥½¥©¥Ñ¥É¥Ú¥ߥߥç¥ì¥ì¥ô¥ù¥ù¥¦¦¦¦¦¦¦#¦#¦.¦3¦3¦>¦C¦C¦N¦S¦S¦^¦c¦c¦n¦s¦s¦~¦ƒ¦ƒ¦�¦“¦§¦“¦³¦¾¦ɦԦ٦٦ã¦è¦è¦ò¦÷¦÷¦§§§§§§§"§"§/§4§4§A§F§F§F§F§F§N§S§S§[§`§`§h§m§m§u§z§z§‚§‡§›§‡§§§¸§½§½§ϧÚ§ú§ÿ§¨ ¨9¨%¨E¨P¨[¨`¨`¨r¨}¨�¨¢¨¸¨èܨȨè¨ó¨ş¨©©© ©@©E©[©f©©k©‹©–©¡©¦©¦©Ì©¸©Ø©ø©ı©ªª#ª>ª*ª^ªJªjª€ªlª ªŒª¬ª·ª¼ª¼ªâªΪ«)«4«9«T«@«t«`«€«–«‚«¶«¢««Í«Ò«Ò«ø«ä«¬$¬)¬?¬J¬O¬j¬V¬Ьv¬–¬¬¬˜¬̬¸¬جã¬è¬è¬÷¬ü¬ü¬ ­­­­­­­­%­'­'­1­>­^­`­`­j­j­j­j­j­l­l­ƒ­Š­•­•­¢­¨­¯­º­Å­Ğ­Û­æ­à­ ®®!®/®)®R®J®j®j®j®s®{®�®”®¢®µ®µ®Í®×®ë®¯¯&¯6¯K¯]¯m¯m¯•¯œ¯«¯½¯½¯Á¯Ưͯݯü¯ü¯°°°#°#°'°2°>°L°y°‚°“°¡°Ô°à°å°û°±±)±.±<±X±ƒ±©±¬±¼±¾±¾±±á±ì±ì±ï±ı±(²H²H²H²v´\, ŞÑŞÑìÑòÑöÑÒÒÒ]8ƒ�VHVHwHdHƒH�H™H¤H¯H»HÁH^\�”ø›ø›œœœœ&œ1œ<œ>œTœTœfœrœ{œ~œ­œ_ܳfÍÍHÍQÍ_Í�Í�͒͟ͽÍÅÍòÍ÷Í Î=ÎYÎ_ÎcΆάαÎÚÎôÎÏ1Ï7Ï;ÏTÏ\ÏaÏrÏzϙϟϣϼÏÄÏãÏèÏùÏĞ Ğ%Ğ-Ğ3Ğ7Ğ;ĞMĞUĞaĞwĞ|Ğ�ГФЩлĞÄĞØĞãĞÑ8Ñ]ÑbÑbÑbÑrÑyчєѶѶÑÍÑÒÑÒÑéÑëÑëÑÿÑÒÒÒÒÒ1Ò3Ò3ÒJÒJÒ[Ò`Ò`ÒpÒ•Ò§Ò¬Ò¬Ò¬Ò¬ÒÄÒçÒúÒÓÓÓ%Ó<Ó>Ó>Ó>ÓKÓbÓdÓdÓqÓˆÓˆÓŸÓ¡Ó»ÓÙÓÙÓÙÓİÓßÓßÓßÓäÓæÓæÓëÓëÓõÓúÓúÓÔÔÔ Ô"Ô"Ô"Ô*Ô,Ô,Ô4Ô4Ô6Ô=Ô[Ô]ÔpÔ†Ô†Ô†Ô†Ô†Ô™Ô±Ô¹Ô¹ÔüÔ``
>8>8P8\8z8–8£8º8Í8Ø8í8Ú8ù89 9 9979=9aôW!!,!/!A!H!O!T!V!]!d!h!z!¬!Æ!³!Ş!ã!""""'"a"f"“"›" "©"´"¼"Ã"â"è"# #(#3#J#i#o#v#v#|##ƒ#”#´#Æ#b$¾¿¾¿Í¿å¿å¿ë¿cxb|^Ê^Ê~ʠʠʪʯʯÊÎÊÛÊİÊİÊİÊİÊêÊòÊËËËË#Ë6Ë6ËHËdHÏ>KNW]t‹¢´âş"-DVcvŒ ¥°ĞÕØò   ! ; U ] e j „ Œ ‘ ± ¹ Ó í õ ı ÿ  3 ; C E _ g g l q | | ‡ ‡ “ “ ¥ å û û  !eŒc‚.G.GBGEGWG_GjGyGyG�GšG¥G¾GªGÊGÙGáGìGôGÿG
HH H+H6H6HHHHHPHfd¤¹`‰`‰p‰w‰ƒ‰‰‰‘‰Ÿ‰²‰¾‰Õ‰â‰â‰å‰ó‰ŠŠŠ&Šg»üY+Y+o+t+ˆ+·+Ã+Ğ+Ú+ê+ê+,, ,&,/,F,F,\,\,r,r,ˆ,ˆ,�,�,´,´,Ê,Ê,à,à,ö,ö,␍-␍-$-$-;-;-R-R-i-i-€-€-—-—-¯-¯-Ç-Ï-Ú-ë-ö-.
. .#.*.6/h ÷ææ␍ +?FIKTeehp†‰—š�¤¨°¾ĞÖŞi(EKww=w*wIwXw`wjCŞ.Ş.///#/+/3/@/F/O/U/Z/b/~/„/†/ˆ/•/•/¢/—/³/¹/»/½/Ê/Ê/Ê/Ï/Ø/à/é/ñ/ó/û/0 000)000@0K0W0u0|0‡0�0�0¢0ª0ª0¾0Î0Ö0Ù0?1k8-7y0y0�0‘0–0¡0¬0¯0³0»0l¤õš¶~¶~Ô~ø~ş~ ,1GcOo‚”�¥¯Íßèğú€ÿ €1€;€C€H€c€O€ƒ€o€�€¥€‘€Å€±€Ñ€ã€í€õ€õ€ş€��5�G�V�Z�Z�a�f�„�†�‹�–�¬�¬�¬�°�¼�İ�ë�õ�‚#‚1‚;‚=‚=‚W‚j‚x‚{‚›‚Ÿ‚¾‚‚å‚邃 ƒ ƒ ƒƒ ƒ*ƒCƒIƒTƒ`ƒbƒjƒpƒ‰ƒ”ƒ¢ƒ¬ƒŃȃЃ܃ރæƒéƒ„„„„„ „9„Q„]„r„w„‰„˜„±„„„̈́؄ğ„ü„……(…7…P…a…a…g…r…z…ˆ…�…¡…mfäîÚîÚÛÛ1Û1Û7Û?ÛGÛOÛWÛ]ÛjÛjÛxÛ}Û}ÛƒÛˆÛˆÛ�Û“Û“Û™Û�Û�Û¶ÛÉÛÏÛÔÛÔÛİÛıÛıÛıÛÜÜÜ␍ÜÜÜÜÜÜÜÜ$Ü$Ü+Ü-Ü-Ü3Ü3Ü:Ü:ÜBÜHÜNÜVÜVÜVÜVÜbÜjÜrÜz܂܊ܒܘܰܿÜÉÜÌÜÌÜÖÜÜÜâÜâÜæÜîÜõÜıÜİ İİİİ&İ.İ2İ8İCİIİVİbİhİpİtİ{݃݋İ�İ•İ�ݤݬݴݸݾİÉİÎİäİõİúİıİ£ŞnÖ¾4¾4ğ45 555%5.50535Q5X5s5u5|5—5�5§5©5¬5Ê5Ê5Ê5Ø5â5ï566+63636O6m6r6y6�6”6¯6±6¸6Ó6ç677␍77:7<7V7^7^7z7•7•7»7Í7o &*&*0*8*=*p`a"a"j"q"…"™"�"¼"Á"ß"á"ÿ"##,#5#7#K#[#Œ#q ö)ö)ÿ)*"*rl2ÉP‘P‘f‘w‘ˆ‘™‘ª‘»‘Α֑ä‘’␍’’ ’5’5’H’Y’_’t’�’�’¤’©’±’¹’¿’×’ê’õ’ù’“““ “-“/“A“A“H“W“e“x“|“†“Š“–“𓦓ª“¶“º“º“Í“à“æ“ê“ô“ø“” ”””1”5”5”5”5”:”L”[”j”x”“”£”³”¸”¸”¸”Ĕ̔Ԕڔï”÷”•••#•%•%•%•%•%•%•%•%•%•1•9•A•G•\•d•h•p•~•„•„•„•–•œ•¨•®•»•Ö•æ•ò•ø•––%–D–£—sÔÍş°e°eÂeÓeŞeéeÿef)f.f7f>fKfRf`fgfiflfqfsfyf“f­fÃfÛfàféfğfıfg,g3g5g8g=g`g~gŠgt$in'''';'B'\'u¤b‡ö;ö;
<<7<#<C<H<O<O<o<…<q<‘<·<£<Ã<È<Ï<Ï<×<Ş<é<ô<ü<===-=%=E=M=v9vşOşOP!P9PQP[PfPfPkPvP‚P�P›P«P»PÂPÈPİPòPòPQQQ+Q:QGQXQiQwQ…QŒQ’Q§Q¼Q¼QĞQİQîQşQRRRR)R:RGRWR¹Rw8¬öÏöÏúÏÿÏĞĞ#Ğ,Ğ1Ğ6Ğ8Ğx88BÁ0Á0Õ0Ù0Ş0é0ó0ö0ú01y0†�>Î>ÎTÎgÎtÎzÎ}Î…ÎzÜtVVxƒ�—§¹¿ÅËáĞõ␍ %*M`dj�‡—�©·¼Êãñú
  ?MYs’™£²¸¾ÄÊà!8CR_n{‹™°¼ÁÏî &16<S^krr€�‘Ÿ®ÀÀÈëö*{T�޾þÃÖÃŞÃëà ÄÄ$Ä.Ä4Ä:Ä>ÄBÄdÄdÄkÄnÄsĂĆijķļļÄÃÄÆÄËÄ×ÄåÄéÄúÄ Å␍ÅÅÅ"ÅDÅHÅMÅMÅaÅdÅpÅzÅ�ŧŲŶŻÅñÅÆÆÆ(Æ3Æ7Æ9ÆDÆHÆHÆbÆfÆhÆhÆsÆwƑƕƕƕƙƼÆ|ˆßı¾Æ¾ÆÒÆèÆèÆèÆêÆêÆñÆóÆóÆúÆüÆüÆ Ç Ç ÇÇ Ç!Ç!Ç.Ç5Ç7Ç7ÇOÇTÇTÇdÇ}°©Ñ¾I¾IÖIŞIéICJ.J#JJ÷IIJ[JKJvJvJ�JƒJ¼JÁJÍJØJíJÚJùJÿJK'KK␍K;K=KVKVKcKŠKŠKŠK–K~ †*®³®³Ë³Ò³Ú³å³ü³´´´'´B´X´f´j´Š´�´²´¹´½´Ö´à´ñ´ş´ş´µ µµµµ"µ)µCµJµZµ^µ^µhµ~µ‚µ‚µ“µ¦µ¹µ¹µ¿µÊµÑµÙµäµëµóµşµ.¶2¶J¶;¶e¶e¶k¶r¶�‰¶—¶�¢¶¤¶¶¶¶¶¶¶È¶Ğ¶ö¶····%·5·@·U·Z·h·w··�·˜·œ·¡·©·­·¼·¾·Í·Ï·Ş·à·ï·ö·ú·¸¸$¸+¸/¸?¸J¸O¸m¸u¸ƒ¸Š¸�¸–¸¤¸«¸¯¸·¸Ë¸Ó¸Ş¸â¸â¸â¸í¸ø¸¹¹*¹2¹=¹L¹T¹_¹d¹l¹w¹ƒ¹‡¹’¹—¹©¹±¹¼¹¼¹¼¹¼¹Ê¹Ù¹ö¹º
ºº*ºHºLº{ºpºaº‹º‹º•ºœº«ºººÂºĞº×ºÛºİºìºôº» »␍»␍»»!»!»3»3»3»9»E»W»_»w»£»±»µ»Ó»Ú»á»ì»¼¼ ¼¼&¼4¼;¼?¼A¼T¼\¼j¼q¼u¼u¼u¼u¼ƒ¼�¼�¼¥¼³¼¾¼Â¼Â¼Ç¼Ï¼Ó¼â¼ä¼ó¼õ¼½½½½ ½4½<½J½Q½U½e½p½u½“½›½©½°½´½¼½Ê½Ñ½Õ½İ½ñ½ù½¾¾¾¾¾¾(¾B¾R¾]¾r¾w¾‚¾’¾�¾´¾¼¾Ç¾Ö¾Ş¾é¾î¾ö¾¿␍¿¿¿!¿3¿;¿F¿F¿F¿F¿Z¿j¿¿Œ¿�¿¤¿µ¿Ê¿×¿Û¿é¿ş¿À%À>ÀWÀYÀdÀlÀlÀuÀ’À£ÀºÀÓÀáÀìÀøÀÁÁ␍ÁÁÁÁ/Á=ÁKÁ`ÁwÁ†Á“Á±Á¸Á¸ÁÈÁÜÁöÁöÁúÁ Â:ÂEÂ\ÂdÂd††™´½ÂÒÂìÂûÂÃ&Ã4ÃJÃcÃsËËããïÃÇÃßÃèÃèÃèÃôÃÄÄ&Ä&Ä-Ä6Ä<ÄHÄ®ÄÌL»öö4ö?öJöpöpörööŠö�ö¡ö°ö¿öÌöÌöÒö×öÜöïö÷␍÷÷#÷0÷8÷C÷?÷Z÷h÷h÷h÷s÷�÷y÷Ÿ÷–÷©÷«÷Ç÷³÷Ï÷İ÷İ÷ß÷û÷û÷øøøøø=øQøDøYø_øhøhøhø{ø€ø€øˆøˆø“ø¨ø±ø±ø±ø±øÍøäøêøïøïøù
ùùùù8ùXù]ùbùbùnù‹ùšù©ù±ù¶ù¼ùÁùÁùÈùÏùòùúú.úCúCúIúIúVú_ú_úzúŒú—úœú©ú´ú¼úÄúÔúëúëúûúûú␍ûû;ûDûDûFûMûRûRû_ûjûpûyûyûŒû™û«û¶ûÄûÍûÒûùûü␍üüü!ü4üIüNüUübüiü{ü�ü—ü�ü¦ü¦ü¯üÉüĞüÕüãüóüıııııı*ı<ı?ı?ıPıXı`ılı‰ı�ı�ıŸı¦ıºıÉıÉıÉığığığııııışş/ş<şGşUş`şoşvşvş�ş£ş¥ş´şÉşËşÙşîşîşôşışış
ÿÿ"ÿ"ÿ/ÿ2ÿ=ÿOÿVÿaÿfÿnÿuÿ€ÿ…ÿšÿœÿ¶ÿËÿËÿËÿÍÿÔÿÚÿëÿùÿ  !&GPPV__~~‹�”�¥°ÂÈÓÓàãéòú((58>GIk~“™¤¼ÄÄÄÄÏJ€@I•¾î¾îÖîèîóîïïúî'ïEïrï]ïQï~ï˜ï˜ï·ïÌï¹ïùïäïØïğ ğ ğ ğ1ğKğKğxğ‘ğ…ğ¾ğÃğÖğÊğøğéğñ"ñ:ñ.ñ`ñMñ{ñlñ‡ñ¥ñºñ§ñÒñÆñôñåñòòòò,òFòFòaònò�ò�ò•ò�”�¿¡3¡3µ3¹3Â3Å3Î3×3é3é34444'474>4A4I4L4Y4a4i4q4x4ˆ4ˆ4”4‚Œ >>9>9R9Y9‰9u9•9š9¡9¡9Á9×9Ã9ã9:ÿ9 :$:+:+:3:::E:M:X:k:c:ƒ:‹:ƒø;8_8_V_f_p_p_z_z_„_–_£_¦_¨_±_¾_¾_Ø_ß_ß_ù_```$`3`B`X`X`X`h`h`z`z`ˆ`–`¬`¬`Â`å`û`a4a4aBaPacaca–aÉaÏaÏaÏaáa„¸ºä(Š(Š@ŠBŠNŠRŠ_ŠbŠ|Š|Š|ЂІŠ�ЙЭйллŠÄŠÆŠÆŠÏŠÑŠÑŠÚŠÜŠÜŠåŠåŠîŠôŠ÷Š‹‹‹$‹$‹Œ‹…œWzV␍V␍t␍…␍¨␍¯␍È␍À␍à␍ì␍ "C/[ƒŠ£›»ÛÇçøú&33KKU†œf‰.-.-:-J-U--¯-¼-Í-ß-æ-í-.....=.J.M.f.i.n.….‘.�.¡.¨.Ş.‡x¬ثثî«õ«ü«¬*¬9¬H¬W¬f¬p¬p¬u¬|¬�¬�¬£¬¾¬Ø¬Ø¬î¬­­­­­­%­7­@­B­P­b­b­b­t­­‘­œ­©­®­¾­Ã­Ó­ß­ä­ñ­ö­® ®®®-®/®?®A®R®[®[®]®m®t®„®„®Ÿ®±®Ã®Õ®å®å®å®è®û®ˆ\åø�‹�‹«‹²‹·‹Å‹Ú‹á‹ë‹ù‹ü‹ş‹ŒŒŒ!ŒWŒ‰0ÎÖ..Fˆ|PNœ¤ŠLBQ¦+¦+´+Æ+Ì+Ô+æ+ì+õ+,␍,,L,‹(—�q3q33�3’3•3›3Œ\ReN,N,\,n,t,|,�,”,�,¯,µ,¾,Ğ,Ö,Ù,'-�, vÑvфыѓјÑ�Ñ�¬!H.í.íLí^íeílí{í€íŸíŸí¤íÃíÈíÏíŞíàíÿíÿíî3î î?îNîPîoîoîoîoî~î—î�î¯î¹î�(?&E&ECEKEREfExE~E‰E E¯EºE¾EÉEÕEàEìEFF-FDFYFiFiF{F�F’F˜F¨F¨FÀFÀFåFåFêFêFğFüF GG*GAGPG[GmGyG�G¨GÉGÉGÒG×G×G×G×GçGğGøGıG HH)H.H.HFHFHKHKHUH`HrHxH„H”HŸH©H­H¶HÏHÒHâHïHÿHIII(I0I;IBIFIYI_IlIwI}I�I�I�IÊIìIøIJ JJJ J*J*J:J?J?JIJTJfJlJzJ‡J”J�J¢J«JÄJÇJ×JŞJãJãJ÷J÷JüJKKK+K1K3K3KAKGKMK^KdKpK€K€K€K…K�K�K¬K¯KÃKáKìKL'L2LDLHLMLTLfLvL�L•L™LŸL§L²LµM�<KV¦ ¦ À Ì Ş ô ␍␍-␍E␍E␍O␍‘`l€@›@›`›g›o›z›„›�›—›¦›°›³›×›Ù›é›é›÷›’`àô®}®}Ä}æ}ó}÷}~ ~#~)~<~Y~[~[~Œ~z~[~«~µ~“XnV¸V¸|¸�¸“¸ª¸¼¸Ƹи޸æ¸õ¸ ¹␍¹¹,¹:¹B¹J¹L¹W¹b¹b¹j¹r¹|¹„¹�¹—¹Ÿ¹¢¹«¹ƹ×¹é¹ì¹ñ¹ºº0º8º8ºJºMºRºeº}º‘º™º™ººº½ººÕºÛºğº»»»3»;»;»F»e»l»w»�»”HWeq1q1…1‰1�1™1™1£1©1©1­1µ1•83=vÒvÒÒÒ�Ò‘ÒŸÒ¢Ò§Ò–8>H®Ò®Ò·Ò·ÒÅÒÉÒĞÒÓÒØÒ—D+8®*®*È*Û*å*ì*ø*+++/+5+T+˜Ğy©ÖÛÖÛÜÜ
ÜÜÜÜÜ$Ü$Ü6ÜAÜHÜUÜbÜu܄ܘÜ�ܠܧܭܷܷÜÈÜÊÜÑÜ×ÜáÜáÜáÜøÜ
İİ İ"İ4İCİCİUİ™09AV+V+_+…+–+œ+œ+¤+š„\y�ì�ì°ìÅìÏìØìÚìáìñìüìşìííí í"í"íCíNíPíiípítí€í“íæí›”"v´v´˜´¢´®´³´ôÉ´Ş´ò´µµµ4µ<µFµUµ]µjµrµuµuµuµwµ†µ�µ™µ¡µ¤µ¶µœh÷ †B†BœB§B²BÀBËBÑBâBèBùBÿB C"C"C4CECRCXCiCoC½C��µÕ33D3I3]3e3s3w3€3€3…3’3¨3Ò3×3û3444%4;4=4S4i4�4§4¹4�ˆùNàNàfàxàà†à¥àªàÉàÎàèàÕàáôàá(ááGá4áSáSáSáeálá‹á‹á“០y}è‡è‡ñ‡ı‡ˆ (A†â†â¨â°â¶â¾âÀâÀâÑâÑâÑâÙâáâóâãóâããã3ã5ã5ã@ãEã_ãdãdãdãyã{ãˆãŠã—ã™ã¦ã®ã¶ã½ãÌãÙãÛãìãùãùãùãää'ä-ä5ä7äDäDäYäYäYädänä†ä‹ä‹ä‹ä™äŸä¤ä¬ä·äÉäÔäÙäÙäàäääòäöäÿäå$å1å8åAå]åbåbåbåbåjåuåƒåƒå£å£å£åªå¸åÇåÚåíåïåïåïåææ ææææ-æ7æRæ{æ�æ�æ•æšæ¾æÅæÑæïæç çççççç#ç-ç;ç]çhç…ç�ç�ç�ç»çëçşçè&è9è>è>è>èFèQècènèsèsèsè…è²è¸è¸è¸èÃèÍèÙèäèæèæèæèëè÷è÷èAé¡H%Ù/Ù/ç/î/ù/000020<0B0H0¢0 Î7Î7õ7â7888/878£T9J† †   ¬ ¾ Ô õ â   0 F g T  — — ¡ ¤TXi� � ´  È Î ß í û  %(2¥Lg–á–áÅáºáÒáíáÙá âùáâ/ââOâ;â[âgâlâxâˆâ�âœâ§â³â¾âÆâËâ×âÜâğâ÷âûâã ãã/ã8ãDãIã]ãdãhãhãmã†ã‹ã¤ã¹ãËãĞãÛãããããããåãşãää(ä3ä5ä@äHäHäUäMämä�ä¦àZ�€‚€‚š‚¨‚­‚º‚Ȃтì‚ú‚ƒ%ƒ5ƒOƒZƒjƒlƒnƒxƒ„ƒˆƒ•ƒ¡ƒ³ƒ»ƒÓƒ×ƒ×ƒ×ƒ×ƒÜƒúƒ„„„„&„2„;„‘„§d{�VVt—¨¯ÈÀàì 3 KXXppz¨(–ߖߤßÇßÍßÒßÒߨߩ(!'ÒÒ'Ò5Ò;Ò=ÒBÒªD^kP9P9j9q9z9†9›9£9©9¯9±9±9À9«„½Ú˜¥˜¥Ë¥×¥Û¥ã¥ë¥ï¥ú¥ş¥¦¦¦¦¦(¦9¦;¦?¦P¦a¦n¦�¦ˆ¦’¦’¦’¦¤¦¬€¨—¨—Á—È—Ï—Ö—Ü—ì—÷—˜ ˜#˜&˜(˜C˜M˜W˜^˜i˜{˜ƒ˜ƒ˜™˜™˜«˜­˜b6B6B\B|B„B�B�B§B«B¶BÖBÛBõBCC C2C_ChC~C„CŒC�C”C§CÌCÑCçCíCõCøCDD:DYD_DgDgDlDrDuD€D D¥D¿DŞDäDéD EEE6E>ECEcElEnE�E•EµEºEÔEóEùEşEşEşEşE FF'F?FJF]FjF‚F–F§F±F³FÇFØFİFèFõFGGG'G®°)ø�ø��(�-�1�:�G�S�^�i�q�|�„�‡�“�›�µ�Û�Õ�ë�ô�)ŸŸ9Ÿ9ŸQŸ\ŸxŸŸ£ŸÜŸÜŸÜŸÜŸ= ¯,ù@XŒXŒ}Œ‰Œ”Œ�Œ¤Œ®Œ´Œ¾ŒÌŒÖŒèŒòŒøŒ����%�+�4�_�n�q�s�}���™�«�µ�Ê�Ê�Í�×�ì�ñ�� ��%�8�B�W�e�n�v�„�•�¥��Ã�Ã�Ğ�Ğ�Ø� �°l£:^Å^ÅwÅ�ÅŸÅ¿ÅÑÅéÅÆÆ.Æ6Æ:Æ=ÆAÆFÆPÆSÆZÆ`ÆgÆmÆqÆvÆ€Æ‘Æ˜ÆŸÆ¡Æ¥Æ®Æ¸Æ»ÆÆÆÒÆÕÆæÆñÆ÷ÆşÆÇ Ç1Ç:ÇCÇKÇVÇaÇmÇ~Ç�ǛǩǫDzǹǾÇÂÇÏÇÖÇùÇÈÈÈ$È=ÈNÈWÈ`ÈhÈqÈwÈ{ȀȄȑȘȦȰÈÅÈÏÈØÈñÈÉ ÉÉÉ%É+É/É4É:ÉDÉNÉjÉxÉ~ɃɋɓɛɨɰÉÏÉÂÉáÉêÉÊÊ,Ê3Ê<ÊEÊLÊUÊ^ÊgÊ€ÊpÊ�Ê”Êîʱ  è„è„ö„……²À�º�(�(Š(±(Ÿ(‘(Ò(â(Ô()&)&)6););)O)T)T)p)u)u)•)Line truncated
   1 8 @ L a h h h v „ � ‘ Ÿ © ¬ ¾ àÈ Ø Û à ğ ó ÷ ¡¡¡"¡+¡A¡G¡S¡h¡o¡w¡‰¡�¡�¡¯¡¯¡¶¡¶¡¶¡Ä¡Ò¡Ü¡ß¡í¡÷¡ú¡ ¢¢¢&¢)¢.¢>¢A¢E¢N¢V¢h¢p¢y¢y¢„¢›¢³¢·¢âÛ¢ã¢é¢õ¢ş¢£
££££,£4£:£Q£Z£b£h£n£n£n£u£‡£“£›£¡£§£§£©£»£µx.·.·<·Q·X·c·…·¹·Õ·ç·û·¸␍¸¸¸&¸(¸.¸4¸@¸H¸N¸P¸V¸ÜLÿ�Q�Q¼QÄQÔQÜQ R R$R,R4R:RNRVRVR^R—RáR¼RS SS*S,SVS\SeSlStS|SˆS�S˜S«S³S¸SÂSâSêSìSöST%T-T/TOTWTWTWTbTiT|T„T�T�T’T–T�T§T°T¸TÔTïT U3U6UMUZUnU…U‰UºUÔUæUVVVBVEVEV\ViV}V”VŸV£V®V¹VËVÚVÜVW WW*W/WYW_WdWvW…W‡W±W´WÆWÕW×WXXXXXXXMXXXXXXXXXaXmXƒXœX¯X¶XÂXÉXÉXÜXàXàXàXçXìXÿXYYYY0Y2Y7YJYQY]YdYdYqY{Y{Y‚Y£Y£YµY·w¸¾R¾RÜRßRåRùRSS S%S*S*S7S@SFSVSdSfS…S–S�S©S¹S¹SÇSÚSåSéSúSúSúSÿSÿS TT-T3T8TLTRTZTlTrTtTƒT�T–TœT¡T§T­T´TÀTÇTÉTÎTÖTØTİTéTëTğTøTúTÿTU UUUUU'U)U.U8U8U8UHUHUHU_UeUkUvU{UƒUœU¢U­U±U·UÂUÛUæUñU÷UV VVV#V+V3VQV\VgVsVmV|V…VŠV�V¤V«V´VÀVÆVÒVÖVÛVàVëVöVWW WWW W9WDWOWOWUWbWdWiWrW‹W–W¡W§W´W´W¸W½W½WÎWĞWĞWãWåWåWøWúWúW␍XXX"X$X$X6X6X<XAXAXXXlXaXyX�XˆX�X–X©X´X«XÄXÄXÆXŞXáXãXïXYYY4YNYSYgYwYŠY�Y�Y•Y©Y»YÆYÎYÖYÚYèYîYóYóYùY␍ZZ"Z"Z(Z.Z3Z3Z3Z9ZHZ[ZhZlZqZqZuZzZzZZŠZ–Z°ZÆZÒZÒZØZåZçZòZşZ␍[ [ [-[9[9[9[9[=[B[S[e[p[x[€[‚[”[™[§[³[¹[Æ[Æ[İ[í[í[\␍\\\$\;\;\A\N\P\b\b\m\m\m\m\m\é^¸\ãö–A–A¬A¾AÄAÏAİAéABBBB#B3B>BLBYB…B¹(28��¬¿ÆÍÔØÚáèììô␍+6DUY^z¢¦¯³¸Éææô␍&7;;;@nƒŠ�¡¦Âêòûÿ'7KMfy}}}™ÁÅÎÒ×è',EVZlllq€¡ÀËÑçøı.VZcgl}––¤¸ºÓäèèï9airv{Œ¢²ÆËä÷û␍␍␍␍1@alrˆ™™™ ³ÌÌÌÛÛî  ! & , 6 8 D D K V k m x � ™ › ¦ ²  É Ğ Ú â æ ê ì ñ ù ı 



"
$
$
-
:
P
p
Š
–
¢
©
©
¼
À
À
À
Ç
Ì
æ
ò
ş
    # = I U \ \ i s s … º¤ ·œHH%H4H4H4HNHNH]H]HcHeHeHkHmHmHsHuHuH|H€H…H…H…H…H…H…H�H¢H¢H¬H±HºHÄHÑHæHèHII I%I@IEIKIKI`IcIŠI—I¯IÏIÏIØIİIûIéIJJJJ%J8J@JHJMJMJMJVJoJuJuJ�JœJ¶JÌJÎJÖJÜJäJéJéJïJïJøJ K K K"K*K0K8K=K=K=K=KKK_KaKuKuK}KƒK‹K�K™K¡KªK°K¶K¸K¸K¸KÀKÀKÎKâKæKèKôKöKLL L$L-L8L;LALGLPLSLSLaLoLqL”L±L·L¿LÄLÍLÏLÏLÔLÖLŞLŞLùL MMM"M%M<M>MAMQMUM\MeMtM‚MˆM�M•M�M¢M¢M«M¸M½MÅMÜMæMNN$N/N:NENPN[NfNfNfNnNnN‡N•N¯NÅNÅNÇNÇNĞNÖNØNØNŞNäNäNìNõNûNOOO"O$O'O,O4O<OAOAOGOKOPO_OdOnOxOxO…O¬O¬O²OÀOÑOİOäOòOPPP"P"P'P:PFPNP^PhPqPP†PˆP‘P‘P—P¥P±PÄP×PëPñPóPQ Q Q(Q(Q:Q@QIQOQXQfQkQkQ~Q„Q†Q‘Q£Q¶Q¶QÊQÖQèQíQùQÿQRRRR.R8R;R;RJR]RoRtR€R†R‰R R¢R¥RµR¹RÁRÏRÔRÙRÙRßRçRìRìRòRòRSS SS S.SCSFSHSRSRSTS\SaSfSkSkSqSyS~S~SƒS�S“S˜S£S¨SÎSĞSÕSÚSßSäSéSîSóSóSøSıST#T7TKTQTYTYTgTmTsT}T‡T•TªT­T¯T¹TÈTÍTÍTÍTÕTÚTãTãTèTèTîTöTûTûTU UUUU)U)U:U@U@UNUTUZUdUnU|U‘U”U–U U¯U´U´U´U¼UÁUÊUÏUÏUÕUİUâUâUçUòU÷UüUVVV!V'V'V5V;VAVKVUVcVxV{V}V‡V–V›V›V›V£V¨V±V¶V¶V¼VÄVÉVÉVÖVÜVÜVêVğVöVW
WW-W0W2W<WKWPWPWPWXW]WfWkWkWqWyW~W~W‹W‘W‘WŸW¥W«WµW¿WÍWâWåWçWñWXXXX XXX X X*X2X7X7X7X=XGXMXaXfXfXlXvX|X�X�X‡X•X�X¬X±X±X·XÅXÑXâXïXöXşXYYYYY&Y&Y&Y*Y/Y/Y5Y9Y>YFYLYNYWYfYnYsYyYyY�Y‡Y•Y Y¥Y«Y³Y¸Y¸Y¸Y¸Y¸Y¸Y¸Y¸Y¸Y¸YÑY×YàYæYîYóYøYZ ZZZ"Z"Z"Z(Z0Z5Z5Z9Z>Z>ZGZUZaZnZtZtZ}Z‘Z‘Z—Z Z´Z´Z½Z¿ZÅZÎZâZâZëZëZëZğZõZõZıZ[[ [-[9[B[H[R[Z[_[_[_[s[|[‚[”[�[�[¦[¦[®[°[°[É[Ó[Ü[Ş[Ş[Ş[ä[è[ê[ê[ê[ê[ï[õ[û[5_»Ğ0¶Y¶YØYîYúYZ4ZAZXZkZvZŒZxZ˜Z Z Z¯Z¯Z·ZÃZÙZîZıZ[[![![![&[+[:[E[\[^[c[r[}[Š[”[”[¢[¼”*K@ @ X _ f i r u x | � ¡ � ± ¹ Á Ä Æ Ö ß è î ñ ¡¡*¡5¡g¡½à.¢nÁnÁŒÁ—Á¨Á«Á¯Á¸Á¿ÁÍÁÜÁòÁÂÂ&Â8ÂGÂVÂgÂvÂv„ˆŒ‘•¢©·ÂËÂÔÂÚÂèÂÃÃÃÃÃÃÃÃÃÃ*Ã3Ã;ÃQÃQÃQÃVÃVÃkÃwÂÇÇÊÃ�Ã�ë÷ÃÄÃÆÃÆÃÊÃÌÃÌÃèÃôÃÄÄÄÄÄÄÄÄÄÄÄ"Ä(Ä-ÄIÄIÄIÄIÄIÄIÄIÄIÄIÄIÄIÄIÄKÄ\ÄnÄ}ČČÄ�Ä�ĘĴĸĽÄXž,NÑNÑ\ÑcÑkÑpÑvÑ¿˜?a�:�:¤:ª:±:á:Í:í:ò:ù:ù:;/;;;;k;W;w;|;ƒ;ƒ;ƒ;‰;Œ;�;˜;°;»;Î;Æ;æ;ğ;ÀTQbá%á%ï%ı%&& &0&5&R&X&_&f&t&€&’&Î&ÁD%ŞßŞßòßàà)à/à5àZà`àfàlàlàtàÂô#œ¶µ¶µ¾µ͵ѵ޵ëµÿµ.¶;¶M¶o¶��¹¶˶ã¶ú¶·&·D·S·n·y·”·­·­·È·ñ· ¸&¸8¸G¸V¸V¸a¸t¸…¸˜¸¨¸µ¸À¸ϸï¸ï¸û¸û¸û¸ ¹¹ ¹?¹H¹U¹Y¹a¹l¹„¹œ¹¥¹µ¹½¹¹æ¹ö¹ºº%º*º2ºXºZºeº˜º²º²ºʺÙºáºğºùº»»2»:»B»M»O»_»w»�»§»¿»Ñ»è»ñ»ú» ¼¼¼"¼à  … …)…H…M…ÄX…WÈÈ(È/È<ÈGÈLÈRÈdÈjȂȈȦȺÈÅÈËÈíÈíÈıÈÉÉÉ#É+É3É;ÉIÉOÉUÉaÉaÉcÉuÉ{ɀɀɗɗɵɵÉÈÉÕÉÚÉÚÉñÉúÉ Ê Ê*Ê8ÊCÊSÊ`ÊrÊxÊ‚Ê�Ê›Ê�Ê�ʥʪʪʲʷʷʿÊÄÊÄÊÌÊÑÊÑÊ×ÊÜÊÜÊãÊèÊèÊïÊôÊôÊÿÊËËËËË Ë$Ë$Ë/Ë/ËHËOËUËXËcËfËzˇ˖Ë�ˠ˲˴˺ËÎËÛËêËêËêËêËôË Ì!Ì1ÌBÌHÌYÌ_ÌdÌnÌÌ�̶̟̥ÌÁÌËÌÚÌéÌïÌúÌÍÍÍ,Í7Í=ÍMÍMÍ]ÍpÍ|͔̈́͛͡ͲͽÍÂÍßÍôÍÎÎÎ0Î;ÎJÎLÎ^ÎfÎkÎrÎv΄Î�ΔÎ�ΤίεηÎÄÎÑÎÛÎÏÏÏ ÏMÑÅ0#«Ø§Ø§÷§!¨)¨)¨7¨J¨c¨f¨‚¨‚¨‚¨Š¨Œ¨Œ¨”¨–¨–¨�¨ ¨ ¨¨¨¨¨±¨·¨¼¨¼¨Å¨Ñ¨Õ¨Ú¨à¨å¨å¨í¨ö¨ü¨©©©©*©I©L©a©€©€©€©ˆ©Š©Š©Š©’©”©”©”©œ©�©�©�©¦©¨©¨©³©³©¹©¾©¾©¾©¾©Å©Ğ©â©ğ©ş©ªªªªª ª#ª)ªAªOªbªnª—ªšª¡ª³ª»ªÄªÏªÏªÚªàªåªåªåªìªòª«««7«C«I«N«N«U«`«`«e«w«}«}«}«}«Ö«Æd%ˆBˆBªB´B·B·BÁBÔBÖBãBåBğBC CC!C'C/C2CDCÇ\CV 1 1 1 1#1(1;1>1C1C1M1S1S1a1c1m1È8(2FÒFÒOÒOÒ]ÒaÒhÒkÒpÒɨÒø–K–K®K¶KÁKÚKÎKLaLLLAL,LLgL|LlL—LœL¨LÏLÔLéLÖLõLûLûLM/MWM=MkM†M†M†M’MÊ ÄÆ(Æ(Û(æ()ù(í(-))9)N);){)f)Z)‡)•)�)¨)ª)µ)À)À)Å)ò)÷)$*)*C*0*b*O*n*y*�*{*­*š*¹*¾*¹*Ô*â*ê*õ*÷*+ + ++-+/+J+J+W+\+{+}+œ+œ+œ+¤+Ël¥Line truncated
ÁÁÁÁÁÏ”"¨¦¨¦¶¦È¦Ì¦Ô¦Ü¦ç¦ò¦ú¦§§§+§2§9§D§O§Q§\§g§i§u§€§‹§”§œ§œ§ §×§Ğ€Û÷i5i5‡5‹5�5—5¥5¨5«5¾5Ä5Æ5Õ5Ù5İ5å5í5ù56 6&6-6-6:6O6Ñ –)–)¥)¾)Ä)Òd9Î��ÄËÓÜíú"0:?gly¥ª·×Üë $9emrr…˜¨¬ËÜáá(+.227_dmz‚�¯¼Çåååò    /11>UUfk‹�¯ÍÍÍÚñóóó&==NV[�“¥ÃÃÃĞçééö␍␍"$+Mkpw…�‘‘‘­µ··ÙÓ  Ş)Ş)ç)ï)ô)Ô¤/T®È®ÈÎÈğÈğÈÉ É$É$É3ÉEÉ_ÉgÉnÉpɃɋɋɋÉ�É�É�É�ɫɫɫɫɽɿɿɿɿÉÒÉİÉÊÕxµyy4y@yKyPy\ygylysyxyƒyˆyˆyˆyºy§yÆyÈyÍyØyİyİyİyzüyzBzBzUzhz{z�z“z“z¦z¹zÌzßzäzäz÷z
{{0{2{2{E{X{k{~{~{~{Œ{Ö0Š’¦Ë¦Ë´ËºË¾Ëİ˺˺ËÌ×<;FQ8Q8Z8e8s88‹8”8�8¦8¬8±8Ølv�±'±'¿'É'Ğ'ç'ç'ì'î'ú'((/(1(A(A(F(H(O(�(ÙÜŸÒ–c–cªcÔcÉcµcïcücdddHdMdydyd~d”d¦d¼dÒdeeLe8egete e¥e­eÌeÔeùeîeÚe f"ffBf.fVfcf�f�f�f�f—fÚL½Ìææ<<Nang†�ÛĞf–¹1¹1Ù1İ1ü12,222I2h2v2v2{22†2‘2œ2©2²2²2·2¼2Ã2Î2Û2İ2ê2ì2î2î2î2ö2ö2ö2ş23333$3p3Ü ˜„˜„¦„º„À„İ`G[±8±8Á8È8Ê8Ï8Ş8ä8ù8ù89999 9-979:9B9Ş<›¦¦…¦…¯…º…Å…Ğ…Û…å…†††ß 2¾C¾CÖCèCîCúCDD D6DADQDcDiDoDuDˆD�D—D�D¯DµDÀDÈDÖDãD Eà4P…P…^…h…q…x……‰…‰…�…áÄKx¶Ù¶ÙâÙåÙêÙ÷ÙüÙÚÚÚÚÚ.ÚGÚiÚrÚ}Ú„Ú�Ú¿ÚÄÚİÚÿÚÛ Û$ÛFÛHÛaÛƒÛƒÛƒÛ˜Û²ÛÁÛÓÛâ „È.3.3L3Z3m3r3�3–3›3¡3¯3¶3Å3Ê3Ö3è3è344$4+4E4b4n4‰4¡4½4Æ4Õ4İ4ê4ó4ø4 5575<5D5]5o55…5�5™5Ÿ5å5Ï5À5õ5066 6@6C6c6÷6ã( >*>*L*]*n*q*w*ä<&1HCHCiCoCxCŠC§C¯CÅCÑCå„y8CJRUUeppsz�‡�“š ±±³¼ÈÎôøû  %6<BM^^glv}„Œ’”¢¹¼Ë×ääääêü4EY`jryy‚‰•¥°°°ÄØèë¦æˆ:!7!7=7L7S7b7x7�7´7Å7Î7Ü7î7 8 8838;8>8J8çX{Í..Ycv�“¡§¸¿Çİåø␍')9IRX]djpv�Œ�–°¸Òçô÷ÿ$/7Ngkt{�•œ ©«½Ôâèìîûûûı,è 
À„À„Ʉ݄â„é 
Æ)Æ)Ï)×)Ü)ê,ıDftft‚tˆt“t¤t©t¯t²t¶t¶tÖtÛtuıtu6u"uBu[uGugunusu}u€u„u‰u¢u�u®u®u®u³uÄuÉuÏuÒuÖuÖuöuûu1vv=vVvBvbvxvdv„v‹v�v–v™v�vŸv¸v¤vÄvÄvÄvÄvÜvwwëŒÎí¡¡ª¥¥´ÃÃÒÒááğğÿÿ",;;JYh’ìxÈâf@f@„@–@œ@¨@¿@¿@Ñ@×@â@ò@ş@A␍AAA,A9AEASAbAbA’Aíd�²VÌVÌZÌmÌṁÌ�̱̱̚̚ÌÈÌÈÌßÌßÌöÌöÌ␍ÍÍÍÍîØÆønŞnŞ�ޗޢ޸޸ŞÊŞÕŞàŞñŞßßß"ß&ß(ß9ßKßWßißk߄ߓߗߗߗߪ߿߿ßËßÑßÛßæßôßûß
à à"à<à<àNàï`Ëß�|�|´|Ö|ã|ç|ö|}} }2}O}Q}Q}‚}p}Q}¡}«}ğP2BØCØCîCúCDDD%D+D7D?DJDPDSD]Dñ(rx¸‡¸‡Æ‡Í‡İ‡à‡æ‡ò ®-޼޼ø¼½½½½½4½E½V½h½z½‰½˜½©½¸½¸½¿½ý̽Ù½à½é½ğ½ô½¾¾¾¾¾ ¾$¾'¾/¾=¾E¾R¾Z¾b¾s¾~¾ƒ¾ƒ¾�¾–¾¥¾¼¾¾¾ɾÖ¾å¾è¾î¾ê¾¿¿¿)¿+¿6¿<¿<¿D¿D¿V¿]¿s¿s¿s¿x¿x¿�¿›¿¦¿«¿«¿®¿³¿³¿Ï¿İ¿ê¿ì¿ì¿ğ¿ò¿ò¿ÀÀ(À*À*À-À/À/À<À>À>ÀAÀAÀAÀAÀAÀJÀPÀTÀ`À€À�À›À¢ÀjÁó(oua'a'j't'„'�'�'­'ôTzKæíæíî
î␍îî î8îHîQîWîZî^î`îxîˆî•î›îŸî¥î§îªî®î®îÑîÕîÛîÛîâîïï,ï?ïEïLïWïaïeïhïoïuïyïï�ï–ï›ï ï­ï¯ïÁïÃïÊï×ïÙïëïëïëïëïëïğğ&ğ=ğ=ğRğ^ğ{ğŸğ¹ğ¾ğÕğÚğèğÿğñ
ññ0ñ6ñFñSñkñrñ~ñ–ñ¢ñ¢ñ¢ñ¨ñ«ñ®ñÇñÍñáñçñìñ÷ñ÷ñüñ òòòò*òAòGòJòMòTò]òdòdòiòvòƒòƒò‰ò—ò®ò´ò·òºòÁòÁòÒòÙòæòóòóòúòó óóó#ó7ó7óQóVó]óeóló{óóˆó ó¥ó¬óÎóÙóßóçóôôô/ô/ôIôWô^ôeô‡ôšô¾ôÀôÊôìôìôìôõõ"õ:õ>õöõ¼ù$–M–M®M²MÀMÏMÚMæMñMNóMN"N"NDNtNXNKN–N›NÃNÈNÔNßNÿNáN OO#O*OGOZOZO}O}O‰Oö8�™†Î†ÎŸÎ®ÎÂÎÏÎÕÎÛÎŞÎÿÎ÷8 9/9/G/N/Y/a/h/n/t/t/z/øôÓŒ�f�f¼fÌf×fâfûf'g@glg–gœg¢gªg¬g´gÏgÒgİgégh.hGhsh�h£h©h±h¶h¾hÙhÜhçhóhøhi=iVi‚i¬i²i¸iÀiÂiÊiåièióiÿijDj]j‰j³j¹j¿jÇjÌjÔjïjòjıj k kkkk"k*k5kGkVkqk…k¯kµkºkÌkÛkùk␍l7l=lElJl\lkl†lšlÄlÊlÏlálğl m mImOmTmTmTmempm{m¡m¹mÄmÌmÙmÙmŞmñmn␍n3nKnVn^nknknpnƒn�nšn®nÅnŞnğnın(o<oSoaocowo�o�o—o£o¹oÒoåoñopppppp'p3pJpLpQpdppp}p‡p‡p™pù€lÀ9À9Ö9â9â9ø9::!:!:!:(:2:6:::=:=:F:J:`:`:–:¢:­:½:Í:Ò:Õ:Ú:Ú:Ú:ï:ö:;
;;;;,;8;@;E;E;Z;g;o;t;t;‰;•;�;¦;®;º;Ğ;Û;ş;<<<<<2<L<V<b<j<o<o<�<š<¥<ª<¿<Ë<Ú<ß<î<û<======='=3=>=@=C=H=H=H=R=Z=a=i=r=}=ƒ=‘=›=›=¡=ª=Â=Ç=Ç=Ú=â=â=ä=ä=ä=é=é=ğ=ö=ú=>>>>>>>9>B>B>F>TBú( XBXBfBoB}BƒBû�1Q¦[¦[Ä[Ì[Ø[î[\\\+\1\1\1\6\;\I\T\j\l\q\\Š\—\�\¬\ü\‘¤~~˜¼ŸÈáÚùû-?RR_~~ˆı8hrîÌîÌÍÍ*Í9Í?ÍEÍHÍiÍş0�—°ˆ°ˆÄˆĞˆŞˆáˆùˆüˆ‰ÿ0S[ÓÓ"Ó*Ó7ÓAÓTÓP>N8†8†D†X†[†o†w†{†…†�†—†š† †Tš«ÏÏ Ï3Ï6Ï@ÏMÏbÏdÏvπϔϔϚÏ�ÏñÏ<˜£‰‰‰#‰/‰;‰K‰P‰S‰W‰_‰ ,0vàvà„à�àHš¨FIFIZIfIqI‡IsI“I•IœI§I³I»I DƒF1F1j1q1v1~1˜1¡1£1°1°1²1Ì1Ò1Ô1Ö1ã1ã1ã1ã1ç1ö1ÿ1222 2%2'2C2G2Y2l2r2†2‹2˜2˜2¬2³2º2Ã2Ñ2Ú2ú233 33333.3D¶M¶MÄMÎMØMèMíMóMÿMNNNNENlåü¦Ş¦ŞºŞĞŞİŞèŞìŞóŞ÷Şßßßß%ß'ß0ß6ß6ß6ß6ß>ß !%~*~*ˆ*�*•* ´GphDhD�DŸD¤D«DµDµD½DĞDÔDÙDîDğDóD÷DşDEEE*E1E5E=E?EGEUE]E_EbEwEE‡E•E™E§E
 8FNFNVNbNnN~N–NœNªN»NÃNÊNàNO O-O:OJOPOROcO…OŒO’O O¨O¾OÉOÏOÕOøO PÌèaèabb bb&b(b3bBbBbOb]b`bcbcbhbmbvb�b‡b�b£b¨b½bÈbÒbÒbûbcc4cHc]ccchcoc„c‹c�c¤cØcİcäcêcñcöcöcücdddd6d@dFdKd_didpdpdpdudxdd…dŒd‘d‘d—d�d¢d¢d¹dÍdÓdádödüd eee,e3e5eIeOeVeVeVeVeVeVe\eaeeegejeue�e„e†eŠeŠe�e�e�e¯e ˜zœ¦¦ÂÇÎØŞéù #)4DL\cks{ƒˆ“¡¡·␍Ğ1 � �4�4�Z�Z�w�{�€�€�€�Œ�‘�¡�¦�¦�¦�«�«�Á�È�×�å�î�ş�� � � � ����%�,�3�:�A�A�C�C�I�N�P‘
+12 -5
View File
@@ -5,8 +5,8 @@
OptOn(OPTf_KEEP_PRIVATE);
}
#include "/Kernel/KernelA.HPP"
#exe {OptOn(OPTf_EXTERNS_TO_IMPORTS);};
#include "/Compiler/CompilerA.HPP"
#exe {OptOn(OPTf_EXTERNS_TO_IMPORTS);};
#include "/Kernel/KernelB.HPP"
#include "/Kernel/KernelC.HPP"
#exe {OptOff(OPTf_EXTERNS_TO_IMPORTS);};
@@ -14,14 +14,22 @@
#include "Templates"
#include "CExts"
CCmpGlbls cmp;
CUasmGlbls uasm;
#include "UAsm"
#include "CMisc"
CUAsmGlbls uasm;
#include "CInit"
#include "CExcept"
#include "LexLib"
#include "Lex"
#include "UAsm"
#include "CHash"
#include "PrsLib"
#include "AsmInit"
#include "AsmLib"
#include "AsmResolve"
#include "Asm"
#include "OptLib"
#include "PrsExp"
#include "PrsVar"
#include "CMisc"
#include "PrsStmt"
#include "OptPass012"
#include "OptPass3"
@@ -35,5 +43,4 @@ CUasmGlbls uasm;
#include "BackB"
#include "BackC"
#include "OptPass789A"
#include "CInit"
#include "CMain"
+5 -2
View File
@@ -1,3 +1,4 @@
#help_index "Compiler/Internal"
//Intermediate compiler codes
#define IS_0_ARG 0
#define IS_1_ARG 1
@@ -366,8 +367,8 @@ class CIntermediateStruct
#define FSF_HASERRCODE (1<<Ff_HASERRCODE)
#define FSF_ARGPOP (1<<Ff_ARGPOP)
#define FSF_NOARGPOP (1<<Ff_NOARGPOP)
#define FSG_FUN_FLAGS1 (FSF_INTERRUPT|FSF_HASERRCODE|FSF_ARGPOP|FSF_NOARGPOP)
#define FSG_FUN_FLAGS2 (FSG_FUN_FLAGS1|FSF_PUBLIC)
#define FSG_FUN_FLAGS1 (FSF_INTERRUPT|FSF_HASERRCODE|FSF_ARGPOP|FSF_NOARGPOP)
#define FSG_FUN_FLAGS2 (FSG_FUN_FLAGS1|FSF_PUBLIC)
//Byte 0
#define PRS0_NULL 0x000000
@@ -402,3 +403,5 @@ class COptReg
#define CMPF_ONE_ASM_INS 2
#define CMPF_LEX_FIRST 4
#define CMPF_PRS_SEMICOLON 8
#help_index ""
+36 -30
View File
@@ -24,49 +24,55 @@ public extern U0 StreamPrint(U8 *fmt,...);
#help_index "Compiler/Lex"
#help_file "::/Doc/Lex"
public extern I64 IsLexExpression2Bin(CLex *lx,U8 **ex); //FALSE=no err
public extern I64 Lex(CLex *lx);
public extern U0 LexAttachDoc(CLex *lx,CLexFile *tempf=NULL,
public extern U0 CmpCtrlDel(CCmpCtrl *cc);
public extern CCmpCtrl *CmpCtrlNew(U8 *buf=NULL,I64 flags=0,U8 *filename=NULL);
public extern I64 CmpCtrlSize(CCmpCtrl *cc);
public extern I64 IsLexExpression2Bin(
CCmpCtrl *cc,U8 **machine_code); //FALSE=no err
public extern I64 Lex(CCmpCtrl *cc);
public extern U0 LexAttachDoc(CCmpCtrl *cc,CLexFile *tempf=NULL,
CDoc *doc=NULL,U8 *abs_filename=NULL,CDocEntry *doc_e=NULL,I64 col=0);
public extern CD2I32 *LexD2I32(CLex *lx,CD2I32 *p);
public extern CD3I32 *LexD3I32(CLex *lx,CD3I32 *p);
public extern U0 LexDel(CLex *lx);
public extern U0 LexExcept(CLex *lx,U8 *str=NULL);
public extern I64 LexExpression(CLex *lx);
public extern U8 *LexExpression2Bin(CLex *lx,I64 *_type=NULL);
public extern F64 LexExpressionF64(CLex *lx);
public extern I64 LexExpressionI64(CLex *lx);
public extern U8 *LexExtStr(CLex *lx,I64 *_size=NULL);
public extern U8 *LexFirstRem(CLex *lx,U8 *marker,I64 _len=NULL);
public extern I64 LexGetChar(CLex *lx);
public extern CLex *LexNew(U8 *buf=NULL,I64 flags=0,U8 *filename=NULL);
public extern U0 LexPop(CLex *lx);
public extern U0 LexPush(CLex *lx);
public extern U0 LexPutLine(CLex *lx,U8 *start);
public extern U0 LexPutPos(CLex *lx);
public extern U0 LexPutToken(CLex *lx);
public extern I64 LexSize(CLex *lx);
public extern U0 LexSkipEol(CLex *lx);
public extern U8 *LexStatement2Bin(CLex *lx,I64 *_type,I64 cmp_flags=CMPF_PRS_SEMICOLON);
public extern U0 LexWarn(CLex *lx,U8 *str=NULL);
public extern CD2I32 *LexD2I32(CCmpCtrl *cc,CD2I32 *p);
public extern CD3I32 *LexD3I32(CCmpCtrl *cc,CD3I32 *p);
public extern U0 LexExcept(CCmpCtrl *cc,U8 *str=NULL);
public extern I64 LexExpression(CCmpCtrl *cc);
public extern U8 *LexExpression2Bin(CCmpCtrl *cc,I64 *_type=NULL);
public extern F64 LexExpressionF64(CCmpCtrl *cc);
public extern I64 LexExpressionI64(CCmpCtrl *cc);
public extern U8 *LexExtStr(CCmpCtrl *cc,I64 *_size=NULL,Bool lex_next=TRUE);
public extern U8 *LexFirstRem(CCmpCtrl *cc,U8 *marker,I64 _len=NULL);
public extern I64 LexGetChar(CCmpCtrl *cc);
public extern U0 LexPopNoRestore(CCmpCtrl *cc);
public extern U0 LexPopRestore(CCmpCtrl *cc);
public extern U0 LexPush(CCmpCtrl *cc);
public extern U0 LexPutLine(CCmpCtrl *cc,U8 *start);
public extern U0 LexPutPos(CCmpCtrl *cc);
public extern U0 LexPutToken(CCmpCtrl *cc);
public extern U0 LexSkipEol(CCmpCtrl *cc);
public extern U8 *LexStatement2Bin(
CCmpCtrl *cc,I64 *_type,I64 cmp_flags=CMPF_PRS_SEMICOLON);
public extern U0 LexWarn(CCmpCtrl *cc,U8 *str=NULL);
public extern CMemberLst *MemberFind(U8 *needle_str,CHashClass *haystack_class);
public extern CMemberLst *MemberFind2(CHashClass *needle_class,CHashClass *haystack_class);
public extern CMemberLst *MemberFind2(
CHashClass *needle_class,CHashClass *haystack_class);
extern U0 MemberLstDel(CHashClass *c);
public extern I64 MemberMetaData(U8 *st,CMemberLst *ml);
public extern CMemberLstMeta *MemberMetaFind(U8 *st,CMemberLst *ml);
public extern CHashClass *OptClassFwd(CHashClass *tempc);
public extern I64 PrsKeyWord(CLex *lx);
public extern I64 PrsKeyWord(CCmpCtrl *cc);
#help_index "Compiler;Cmd Line (Typically)"
extern I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv=0);
extern I64 Cmp(U8 *filename,
U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv_let=0);
#help_index "Debugging/Unassemble"
public extern U8 *U(U8 *ip,I64 cnt=20,I64 seg_size=64);
public extern U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE);
public extern U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,
I64 *_jmp_dst=NULL,Bool just_ins=FALSE);
public extern I64 Un(U8 *ip,I64 cnt=0x80,I64 seg_size=64);
extern CUasmGlbls uasm;
extern CUAsmGlbls uasm;
#help_index "Hash"
#help_index "Hash/System"
public extern I64 HashEntrySize(CHashSrcSym *temph);
public extern I64 HashEntrySize2(CHashSrcSym *temph);
public extern I64 HashTableSize2(CHashTable *table);
+403 -772
View File
File diff suppressed because it is too large. Load diff
+246
View File
@@ -0,0 +1,246 @@
U0 LexBackupLastChar(CCmpCtrl *cc)
{
CLexFile *tempf=cc->lex_include_stk;
tempf->buf_ptr=cc->cur_buf_ptr;
if (cc->flags & CCF_USE_LAST_U16) {
tempf->last_U16=cc->last_U16;
cc->flags&=~CCF_USE_LAST_U16;
} else
tempf->last_U16=0;
}
U0 LexPush(CCmpCtrl *cc)
{//Create token-stream save point.
CLexFile *tempf;
LexBackupLastChar(cc);
if (cc->lex_include_stk->last_U16)
cc->flags|=CCF_USE_LAST_U16;
tempf=MAllocIdentical(cc->lex_include_stk);
tempf->next=cc->lex_prs_stk;
cc->lex_prs_stk=tempf;
}
U0 LexPopRestore(CCmpCtrl *cc)
{//Restore token-stream saved-point.
//Bad things can happen if you cross an #include file boundary.
CLexFile *tempf=cc->lex_prs_stk;
cc->cur_buf_ptr=tempf->buf_ptr;
if (cc->last_U16=tempf->last_U16)
cc->flags|=CCF_USE_LAST_U16;
else
cc->flags&=~CCF_USE_LAST_U16;
MemCpy(cc->lex_include_stk(U8 *)+sizeof(U8 *),tempf(U8 *)+sizeof(U8 *),
sizeof(CLexFile)-sizeof(U8 *));
cc->lex_prs_stk=tempf->next;
Free(tempf);
}
U0 LexPopNoRestore(CCmpCtrl *cc)
{//Don't restore token-stream saved-point.
CLexFile *tempf=cc->lex_prs_stk;
cc->lex_prs_stk=tempf->next;
Free(tempf);
}
I64 MemberMetaData(U8 *needle_str,CMemberLst *haystack_member_lst)
{//Find meta data name, return meta data val. See $LK,"::/Demo/ClassMeta.CPP"$.
CMemberLstMeta *meta=haystack_member_lst->meta;
while (meta) {
if (!StrCmp(meta->str,needle_str))
return meta->user_data;
meta=meta->next;
}
return 0;
}
CMemberLstMeta *MemberMetaFind(U8 *needle_str,CMemberLst *haystack_member_lst)
{//Find meta data name, return meta data struct. See $LK,"::/Demo/ClassMeta.CPP"$.
CMemberLstMeta *meta=haystack_member_lst->meta;
while (meta) {
if (!StrCmp(meta->str,needle_str))
return meta;
meta=meta->next;
}
return NULL;
}
CMemberLst *MemberFind(U8 *needle_str,CHashClass *haystack_class)
{//Find class member. See $LK,"ClassRep",A="MN:ClassRep"$() and $LK,"DocForm",A="MN:DocForm"$().
I64 i;
CMemberLst *tempm;
do {
tempm=haystack_class->member_lst;
while (tempm) {
if (!(i=StrCmp(tempm->str,needle_str))) {
tempm->use_cnt++;
return tempm;
}
if (i<=0)
tempm=tempm->left;
else
tempm=tempm->right;
}
} while (haystack_class=haystack_class->base_class);
return NULL;
}
CMemberLst *MemberFind2(CHashClass *needle_class,CHashClass *haystack_class)
{//Find class member, just offset<0. See $LK,"ClassRep",A="MN:ClassRep"$() and $LK,"DocForm",A="MN:DocForm"$().
CMemberLst *tempm;
tempm=haystack_class->member_lst2;
while (tempm) {
if (needle_class==tempm->member_class2)
return tempm;
if (needle_class<tempm->member_class2)
tempm=tempm->left2;
else
tempm=tempm->right2;
}
return NULL;
}
U0 MemberAdd(CCmpCtrl *cc,CMemberLst *tempm,CHashClass *tempc,I64 mode)
{
U8 *st=tempm->str;
CMemberLst **tempm1,*tempm2;
CHashClass *tempc2;
if (MemberFind(st,tempc) && StrCmp(st,"pad") &&
StrCmp(st,"reserved") && StrCmp(st,"_anon_"))
LexExcept(cc,"Duplicate member at ");
if (mode==PRS1B_LOCAL_VAR) {
tempc2=tempm->member_class-tempm->member_class->ptr_stars_cnt;
if (Bt(&cc->opts,OPTf_WARN_DUP_TYPES) && MemberFind2(tempc2,tempc))
LexWarn(cc,"Duplicate type at ");
} else
tempc2=NULL;
tempm->member_class2=tempc2;
tempm1=&tempc->member_lst;
while (tempm2=*tempm1) {
if (StrCmp(tempm2->str,st)<=0)
tempm1=&tempm2->left;
else
tempm1=&tempm2->right;
}
*tempm1=tempm;
if (tempc2) {
tempm1=&tempc->member_lst2;
while (tempm2=*tempm1) {
if (tempc2<tempm2->member_class2)
tempm1=&tempm2->left2;
else if (tempc2>tempm2->member_class2)
tempm1=&tempm2->right2;
else {
tempm1=NULL;
break;
}
}
if (tempm1)
*tempm1=tempm;
}
tempm->left=NULL;
tempm->right=NULL;
tempm->left2=NULL;
tempm->right2=NULL;
tempm2=tempc->last_in_member_lst;
tempm2->next=tempc->last_in_member_lst=tempm;
}
CMemberLst *MemberLstNew(I64 _reg)
{
CMemberLst *result=CAlloc(sizeof(CMemberLst));
result->reg=_reg;
return result;
}
U0 MemberLstDel(CHashClass *tempc)
{
CMemberLst *tempm,*tempm1;
CMemberLstMeta *temp_meta,*temp_meta1;
tempm=tempc->member_lst;
while (tempm) {
tempm1=tempm->next;
Free(tempm->str);
LinkedLstDel(tempm->dim.next);
if (tempm->flags & MLF_STR_DFT_AVAILABLE)
Free(tempm->dft_val);
if (tempm->flags & MLF_FUN)
HashDel(tempm->fun_ptr-tempm->fun_ptr->ptr_stars_cnt);
temp_meta=tempm->meta;
while (temp_meta) {
temp_meta1=temp_meta->next;
Free(temp_meta->str);
if (temp_meta->flags&MLMF_IS_STR)
Free(temp_meta->user_data);
Free(temp_meta);
temp_meta=temp_meta1;
}
Free(tempm);
tempm=tempm1;
}
tempc->size=0;
tempc->last_in_member_lst=&tempc->member_lst;
tempc->member_lst=NULL;
tempc->member_lst2=NULL;
tempc->member_cnt=0;
if (tempc->type&HTT_FUN)
tempc(CHashFun *)->arg_cnt=0;
}
I64 MemberLstSize(CHashClass *tempc)
{
CMemberLst *tempm;
CMemberLstMeta *temp_meta;
I64 result=0;
tempm=tempc->member_lst;
while (tempm) {
result+=MSize2(tempm->str);
result+=LinkedLstSize(tempm->dim.next);
if (tempm->flags & MLF_STR_DFT_AVAILABLE)
result+=MSize2(tempm->dft_val);
if (tempm->flags & MLF_FUN)
result+=HashEntrySize2(tempm->fun_ptr-tempm->fun_ptr->ptr_stars_cnt);
temp_meta=tempm->meta;
while (temp_meta) {
result+=MSize2(temp_meta->str);
if (temp_meta->flags&MLMF_IS_STR)
result+=MSize2(temp_meta->user_data);
result+=MSize2(temp_meta);
temp_meta=temp_meta->next;
}
result+=MSize2(tempm);
tempm=tempm->next;
}
return result;
}
U8 *LexExtStr(CCmpCtrl *cc,I64 *_size=NULL,Bool lex_next=TRUE)
{//Lex $LK,"TK_STR",A="MN:TK_STR"$'s to one combined str. _size includes terminator.
I64 len=cc->cur_str_len,len1,len2;
U8 *st=cc->cur_str,*st1,*st2;
cc->cur_str=NULL;
while (cc->token==TK_STR) {
st1=st;
len1=len;
if (!lex_next && LexGetChar(cc)!='\\') {
cc->flags|=CCF_USE_LAST_U16;
break;
}
if (Lex(cc)==TK_STR) {
len2=cc->cur_str_len;
st2=cc->cur_str;
cc->cur_str=NULL;
len=len1+len2-1;
st=MAlloc(len);
if (len1>1)
MemCpy(st,st1,len1-1);
MemCpy(st+len1-1,st2,len2);
Free(st1);
Free(st2);
}
}
if (_size) *_size=len;
return st;
}
+11 -11
View File
@@ -1,9 +1,9 @@
/*
/* See $LK,"AsmHashLoad",A="MN:AsmHashLoad"$().
'!'= don't switch modes
'&'= default
'-'= NoRex
'='= Rex 0x48 only if 64-bit code segment
'~'= Rex 0x40
'%'= Not allowed in 64-bit mode
'='= Rex 0x48 only if 64-bit mode
'`'= Rex only R8-R15
'^'= Rex xor-like
':'= floating sti-like for disassembly
@@ -16,8 +16,8 @@
The assembler will not report certain invalid
forms. Get an Intel datasheet and learn
which forms are valid.
*/
R8 AL 0;
R8 CL 1;
R8 DL 2;
@@ -218,10 +218,10 @@ OPCODE PUSH
0x6A, &IB IMM8
0x68, 16 !IW IMM16
0x68, 32 !ID IMM32
0x50,+R 16 R16
0x50,+R 16 % R16
0x50,+R 32 R32
0x50,+R 32 ` R64
0xFF,/6 16 RM16
0xFF,/6 16 % RM16
0xFF,/6 32 RM32
0xFF,/6 32 RM64;
OPCODE PUSHAW 0x60, 16;
@@ -765,15 +765,15 @@ OPCODE JZ
0x0F 0x84, 32 !CD REL32;
OPCODE INC
// 0x40,+R 16 R16
// 0x40,+R 32 R32
0x40,+R 16 % R16
0x40,+R 32 % R32
0xFE,/0 RM8
0xFF,/0 16 RM16
0xFF,/0 32 RM32
0xFF,/0 32 RM64;
OPCODE DEC
// 0x48,+R 16 R16
// 0x48,+R 32 R32
0x48,+R 16 % R16
0x48,+R 32 % R32
0xFE,/1 RM8
0xFF,/1 16 RM16
0xFF,/1 32 RM32
+38 -32
View File
@@ -1,6 +1,6 @@
CLexCodeMisc *OptLabelFwd(CLexCodeMisc *lb)
CCodeMisc *OptLabelFwd(CCodeMisc *lb)
{
CLexCodeMisc *lb1;
CCodeMisc *lb1;
while (lb1=lb->fwd)
lb=lb1;
return lb;
@@ -140,7 +140,7 @@ Bool OptFixupBinaryOp1(CIntermediateCode *tempi,
tempi2->ic_flags|=ICF_R_TO_F64;
if (IC_LESS<=tempi->ic_code<=IC_GREATER_EQUAL && (tempii=OptLead1(tempi)) &&
tempii->ic_code!=IC_PUSH_CMP && tempii->ic_code!=IC_AND_AND) {
//We are looking for float comparisons to zero to convert to int.
//We are looking for float comparisons to zero to convert to int.
if (tempi1->ic_code==IC_IMM_F64 && !tempi1->ic_data &&
tempi2->ic_code==IC_DEREF && tempc2==cmp.internal_types[RT_F64]) {
tempi1->ic_code==IC_IMM_I64;
@@ -150,7 +150,8 @@ Bool OptFixupBinaryOp1(CIntermediateCode *tempi,
tempi2->ic_code==IC_IMM_I64;
fb_here1:
tempi1->ic_flags&=~ICF_R_TO_F64;
tempi->ic_class=tempi1->ic_class=tempi2->ic_class=cmp.internal_types[RT_I64];
tempi->ic_class=tempi1->ic_class=tempi2->ic_class=
cmp.internal_types[RT_I64];
*is_unsigned=FALSE;
return FBO1_NOT_CONST;
}
@@ -181,7 +182,7 @@ fb_here2:
Bool OptFixupBinaryOp2(CIntermediateCode **tempi1,CIntermediateCode **tempi2)
{
CIntermediateCode *tempii1=*tempi1,
*tempii2=*tempi2;
*tempii2=*tempi2;
if (tempii1->ic_code==IC_IMM_I64 && !(tempii1->ic_flags & ICF_R_TO_F64))
return TRUE;
if (tempii2->ic_code==IC_IMM_I64 && !(tempii2->ic_flags & ICF_R_TO_F64)) {
@@ -208,7 +209,7 @@ Bool OptFixupUnaryOp(CIntermediateCode *tempi,
tempi1->ic_flags&=~ICF_R_TO_F64;
} else
if (tempc1->raw_type!=RT_F64)
tempi1->ic_flags|=ICF_R_TO_F64;
tempi1->ic_flags|=ICF_R_TO_F64;
if (tempi1->ic_code==IC_IMM_F64) {
tempi->ic_flags|=tempi1->ic_flags;
OptSetNOP1(tempi1);
@@ -225,11 +226,11 @@ Bool OptFixupUnaryOp(CIntermediateCode *tempi,
return FBO1_NOT_CONST;
}
extern U0 OptBrNotZero(CLex *lx,CIntermediateCode *tempi);
extern U0 OptBrNotZero(CCmpCtrl *cc,CIntermediateCode *tempi);
CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi)
CIntermediateCode *OptBrZero(CCmpCtrl *cc,CIntermediateCode *tempi)
{
CLexCodeMisc *lb_true,*lb_false;
CCodeMisc *lb_true,*lb_false;
CIntermediateCode *tempii=OptLag(tempi),*tempii2;
switch (tempii->ic_code) {
case IC_NOT:
@@ -239,7 +240,7 @@ CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi)
tempi->t.a1c=tempii->t.a1c;
tempi->t.a1t=tempii->t.a1t;
OptFree(tempii);
return OptBrNotZero(lx,tempi);
return OptBrNotZero(cc,tempi);
case IC_EQUAL_EQUAL...IC_LESS_EQUAL:
tempi->ic_code=(tempii->ic_code-IC_EQUAL_EQUAL)^1+IC_BR_EQUAL_EQUAL;
break;
@@ -253,7 +254,7 @@ CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi)
tempi->ic_code=IC_BR_AND_ZERO;
break;
case IC_MM_:
if (lx->pass==2 && !(tempii->ic_flags&ICF_R_TO_F64) &&
if (cc->pass==2 && !(tempii->ic_flags&ICF_R_TO_F64) &&
tempii->ic_class->raw_type!=RT_F64)
tempi->ic_code=IC_BR_MM_ZERO;
break;
@@ -318,16 +319,16 @@ CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi)
tempii->t.a1t=tempi->t.a1t;
tempii->t.a1c=tempi->t.a1c;
tempii->ic_code=IC_BR_ZERO;
OptBrZero(lx,tempii);
OptBrZero(cc,tempii);
tempii=tempi->t.a2t->next;
tempii->t.a1t=tempi->t.a2t;
tempii->t.a1c=tempi->t.a2c;
tempii->ic_data=lb_true;
tempii->ic_code=IC_BR_ZERO;
tempii=OptBrZero(lx,tempii);
tempii=OptBrZero(cc,tempii);
OptSetNOP1(tempi);
} else if (tempi->ic_code==IC_BR_OR_OR_ZERO) {
lb_false=LCCMiscNew(lx,CMT_LABEL);
lb_false=COCMiscNew(cc,CMT_LABEL);
tempi->ic_code=IC_LABEL;
tempi->ic_flags=0;
tempi->ic_data=lb_false;
@@ -336,13 +337,13 @@ CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi)
tempii->t.a1c=tempi->t.a1c;
tempii->ic_data=lb_false;
tempii->ic_code=IC_BR_NOT_ZERO;
OptBrNotZero(lx,tempii);
OptBrNotZero(cc,tempii);
tempii=tempi->t.a2t->next;
tempii->t.a1t=tempi->t.a2t;
tempii->t.a1c=tempi->t.a2c;
tempii->ic_data=lb_true;
tempii->ic_code=IC_BR_ZERO;
tempii=OptBrZero(lx,tempii);
tempii=OptBrZero(cc,tempii);
} else
tempii=tempi;
if (tempi->ic_flags&ICF_POP_CMP && tempi->t.a1t->ic_code==IC_NOP1) {
@@ -354,9 +355,9 @@ CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi)
return tempi;
}
CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi)
CIntermediateCode *OptBrNotZero(CCmpCtrl *cc,CIntermediateCode *tempi)
{
CLexCodeMisc *lb_true,*lb_false;
CCodeMisc *lb_true,*lb_false;
CIntermediateCode *tempii=OptLag(tempi),*tempii2;
switch (tempii->ic_code) {
case IC_NOT:
@@ -366,7 +367,7 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi)
tempi->t.a1c=tempii->t.a1c;
tempi->t.a1t=tempii->t.a1t;
OptFree(tempii);
return OptBrZero(lx,tempi);
return OptBrZero(cc,tempi);
case IC_EQUAL_EQUAL...IC_LESS_EQUAL:
tempi->ic_code=tempii->ic_code+IC_BR_EQUAL_EQUAL-IC_EQUAL_EQUAL;
break;
@@ -380,7 +381,7 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi)
tempi->ic_code=IC_BR_AND_NOT_ZERO;
break;
case IC_MM_:
if (lx->pass==2 && !(tempii->ic_flags&ICF_R_TO_F64) &&
if (cc->pass==2 && !(tempii->ic_flags&ICF_R_TO_F64) &&
tempii->ic_class->raw_type!=RT_F64)
tempi->ic_code=IC_BR_MM_NOT_ZERO;
break;
@@ -445,16 +446,16 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi)
tempii->t.a1c=tempi->t.a1c;
tempii->ic_data=lb_true;
tempii->ic_code=IC_BR_NOT_ZERO;
OptBrNotZero(lx,tempii);
OptBrNotZero(cc,tempii);
tempii=tempi->t.a2t->next;
tempii->t.a1t=tempi->t.a2t;
tempii->t.a1c=tempi->t.a2c;
tempii->ic_data=lb_true;
tempii->ic_code=IC_BR_NOT_ZERO;
tempii=OptBrNotZero(lx,tempii);
tempii=OptBrNotZero(cc,tempii);
OptSetNOP1(tempi);
} else if (tempi->ic_code==IC_BR_AND_AND_NOT_ZERO) {
lb_false=LCCMiscNew(lx,CMT_LABEL);
lb_false=COCMiscNew(cc,CMT_LABEL);
tempi->ic_code=IC_LABEL;
tempi->ic_flags=0;
tempi->ic_data=lb_false;
@@ -463,13 +464,13 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi)
tempii->t.a1c=tempi->t.a1c;
tempii->ic_data=lb_false;
tempii->ic_code=IC_BR_ZERO;
OptBrZero(lx,tempii);
OptBrZero(cc,tempii);
tempii=tempi->t.a2t->next;
tempii->t.a1t=tempi->t.a2t;
tempii->t.a1c=tempi->t.a2c;
tempii->ic_data=lb_true;
tempii->ic_code=IC_BR_NOT_ZERO;
tempii=OptBrNotZero(lx,tempii);
tempii=OptBrNotZero(cc,tempii);
} else
tempii=tempi;
if (tempi->ic_flags&ICF_POP_CMP && tempi->t.a1t->ic_code==IC_NOP1) {
@@ -481,7 +482,8 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi)
return tempi;
}
U0 OptFixSizeOf(CIntermediateCode *tempi1,CIntermediateCode *tempi_push,CHashClass *tempcc)
U0 OptFixSizeOf(CIntermediateCode *tempi1,
CIntermediateCode *tempi_push,CHashClass *tempcc)
{
if (tempi1->ic_code==IC_MUL && tempi1->t.a2t->ic_code==IC_SIZEOF) {
tempi1->t.a2t->ic_code=IC_IMM_I64;
@@ -526,18 +528,22 @@ I64 CmpRawTypePointed(CHashClass *tempc)
U0 CmpF1PushPop(CIntermediateCode *tempi,CIntermediateCode *tempi2)
{
if (intermediate_code_table[tempi2->ic_code].fpop|| tempi2->ic_flags&ICF_R_TO_F64)
if (intermediate_code_table[tempi2->ic_code].fpop||
tempi2->ic_flags&ICF_R_TO_F64)
Bts(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0);
}
U0 CmpF2PushPop(CIntermediateCode *tempi,CIntermediateCode *tempi1,CIntermediateCode *tempi2)
U0 CmpF2PushPop(CIntermediateCode *tempi,
CIntermediateCode *tempi1,CIntermediateCode *tempi2)
{
if ((tempi2->ic_code==IC_MOV || tempi2->ic_code==IC_IMM_F64) &&
!(tempi2->ic_flags&ICF_R_TO_F64) &&
(intermediate_code_table[tempi1->ic_code].fpop || tempi1->ic_flags&ICF_R_TO_F64))
!(tempi2->ic_flags&ICF_R_TO_F64) &&
(intermediate_code_table[tempi1->ic_code].fpop ||
tempi1->ic_flags&ICF_R_TO_F64))
Bts(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0);
else if ((intermediate_code_table[tempi2->ic_code].fpop || tempi2->ic_flags&ICF_R_TO_F64)&&
!(tempi1->ic_flags&ICF_R_TO_F64))
else if ((intermediate_code_table[tempi2->ic_code].fpop ||
tempi2->ic_flags&ICF_R_TO_F64)&&
!(tempi1->ic_flags&ICF_R_TO_F64))
Bts(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0);
}
+41 -35
View File
@@ -20,7 +20,7 @@ logic. 3-Arg comparisons are established.
*/
CIntermediateCode *OptPass012(CLex *lx)
CIntermediateCode *OptPass012(CCmpCtrl *cc)
{/*Simplify CONST arithmetic.
Sets the class throughout Expression trees.
Returns the type of an Expression for use
@@ -32,13 +32,13 @@ args.
CHashClass *tempc,*tempc1,*tempc2;
CIntermediateCode *tempi,*tempi1,*tempi2,*tempi3,*tempi_push,
*last_with_class=NULL;
CLexCodeMisc *lb,*lb1,*lb2;
CCodeMisc *lb,*lb1,*lb2;
CPrsStk *ps;
if (!(ps=lx->ps))
ps=lx->ps=MAlloc(sizeof(CPrsStk));
if (!(ps=cc->ps))
ps=cc->ps=MAlloc(sizeof(CPrsStk));
ps->ptr=0;
ps->ptr2=0;
tempi=lx->lcc.lcc_root.next;
tempi=cc->coc.coc_root.next;
while (code=tempi->ic_code) {
tempc=tempi->ic_class;
tempi->ic_class2=tempc;
@@ -63,11 +63,11 @@ args.
break;
}
if (intermediate_code_table[code].not_const)
lx->flags|=LF_NOT_CONST;
cc->flags|=CCF_NOT_CONST;
nobound_switch (code) {
case IC_IMM_F64:
tempi->ic_flags&=~ICF_R_TO_F64;
if (lx->pass==2 && tempi->ic_flags&ICF_R_TO_INT) {
if (cc->pass==2 && tempi->ic_flags&ICF_R_TO_INT) {
tempi->ic_data=ToI64(tempi->ic_data(F64));
tempi->ic_flags&=~ICF_R_TO_INT;
tempi->ic_code=IC_IMM_I64;
@@ -76,7 +76,7 @@ args.
break;
case IC_IMM_I64:
tempi->ic_flags&=~ICF_R_TO_INT;
if (lx->pass==2 && tempi->ic_flags&ICF_R_TO_F64) {
if (cc->pass==2 && tempi->ic_flags&ICF_R_TO_F64) {
tempi->ic_data(F64)=ToF64(tempi->ic_data);
tempi->ic_flags&=~ICF_R_TO_F64;
tempi->ic_code=IC_IMM_F64;
@@ -116,7 +116,8 @@ args.
tempi2=tempi1->next; //ADD
tempi3=tempi2->next; //DEREF
if (tempi1->ic_code==IC_IMM_I64 && tempi2->ic_code==IC_ADD &&
tempi3->ic_code==IC_DEREF && !(tempi3->ic_flags&~ICG_NO_CVT_MASK)) {
tempi3->ic_code==IC_DEREF &&
!(tempi3->ic_flags&~ICG_NO_CVT_MASK)) {
tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags|tempi3->ic_flags;
if (tempi->ic_code==IC_FS)
tempi->ic_code=IC_MOV_FS;
@@ -271,9 +272,9 @@ args.
}
break;
case IC_DEREF:
if (lx->pass==2) {
if (cc->pass==2) {
if (!tempc->size)
LexWarn(lx,"Dereference U0 ");
LexWarn(cc,"Dereference U0 ");
if (tempi1->ic_class->raw_type!=RT_F64) {
if (tempi1->ic_code==IC__PP) {
tempi->ic_code=IC_DEREF_PP;
@@ -291,8 +292,8 @@ args.
case IC__MM:
case IC_PP_:
case IC_MM_:
if (lx->pass==2 && !tempc->size)
LexWarn(lx,"Dereference U0 ");
if (cc->pass==2 && !tempc->size)
LexWarn(cc,"Dereference U0 ");
break;
case IC_POWER:
tempc=tempi->ic_class=cmp.internal_types[RT_F64];
@@ -316,7 +317,7 @@ args.
tempi->ic_code=IC_IMM_F64;
}
} else {
if (tempi1->ic_code==IC_IMM_I64 && lx->pass==2) {
if (tempi1->ic_code==IC_IMM_I64 && cc->pass==2) {
switch (i=tempi1->ic_data) {
case 0:
break;
@@ -353,7 +354,7 @@ args.
tempi->ic_data=Bsf(i);
tempi->ic_code=IC_SHL_CONST;
OptSetNOP1(tempi2);
} else if (tempi1->ic_code==IC_MUL && lx->pass==2) {
} else if (tempi1->ic_code==IC_MUL && cc->pass==2) {
if (tempi1->t.a1t->ic_code==IC_IMM_I64) {
tempi1->ic_flags|=tempi->ic_flags;
tempi1->t.a1t->ic_data*=tempi2->ic_data;
@@ -371,7 +372,7 @@ args.
}
}
}
} else if (tempi2->ic_code==IC_IMM_F64 && lx->pass==2) {
} else if (tempi2->ic_code==IC_IMM_F64 && cc->pass==2) {
if (tempi2->ic_data(F64)==1.0) {
tempi1->ic_flags|=tempi->ic_flags|tempi2->ic_flags;
tempi1->ic_class2=tempi->ic_class2;
@@ -399,7 +400,8 @@ args.
}
break;
case IC_DIV:
if ((tempi2->ic_data || tempi2->ic_code!=IC_IMM_I64 && tempi2->ic_code!=IC_IMM_F64) &&
if ((tempi2->ic_data || tempi2->ic_code!=IC_IMM_I64 &&
tempi2->ic_code!=IC_IMM_F64) &&
(i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned))) {
if (i==FBO1_INT) {
if (is_unsigned)
@@ -430,7 +432,8 @@ args.
}
break;
case IC_MOD:
if ((tempi2->ic_data || tempi2->ic_code!=IC_IMM_I64 && tempi2->ic_code!=IC_IMM_F64) &&
if ((tempi2->ic_data || tempi2->ic_code!=IC_IMM_I64 &&
tempi2->ic_code!=IC_IMM_F64) &&
(i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned))) {
if (i==FBO1_INT) {
if (is_unsigned)
@@ -443,8 +446,9 @@ args.
tempi2->ic_data(F64);
tempi->ic_code=IC_IMM_F64;
}
} else if (lx->pass==2 && tempi2->ic_code==IC_IMM_I64 &&
(i=tempi2->ic_data) && Bsf(i)==Bsr(i) && tempi_push->ic_class->raw_type!=RT_F64 &&
} 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
tempi2->ic_data=i-1;
tempi->ic_code=IC_AND;
@@ -494,7 +498,7 @@ args.
tempi->ic_code=IC_ABS_ADDR;
OptSetNOP1(tempi1);
OptSetNOP1(tempi2);
} else if (lx->pass==2) {
} else if (cc->pass==2) {
if (tempi1->ic_code==IC_IMM_I64) {
if (!tempi1->ic_data) {
tempi2->ic_flags|=tempi1->ic_flags|tempi->ic_flags;
@@ -622,7 +626,7 @@ args.
tempi->ic_code=IC_IMM_F64;
}
} else {
if (lx->pass==2) {
if (cc->pass==2) {
if (tempi2->ic_code==IC_IMM_I64) {
if (!tempi2->ic_data) {
tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags;
@@ -818,8 +822,8 @@ args.
tempi->ic_class=cmp.internal_types[RT_I64];
break;
sub_switch_start:
if (lx->pass==2 && (!tempc->size||!tempc2->size))
LexWarn(lx,"Assign U0 ");
if (cc->pass==2 && (!tempc->size||!tempc2->size))
LexWarn(cc,"Assign U0 ");
sub_switch_start:
case IC_MUL_EQUAL:
if (tempi2->ic_code==IC_IMM_I64 &&
@@ -870,7 +874,7 @@ args.
if (tempc2->raw_type==RT_F64)
tempi2->ic_flags|=ICF_R_TO_INT;
}
if (lx->pass==2 && tempi1->ic_class->raw_type!=RT_F64) {
if (cc->pass==2 && tempi1->ic_class->raw_type!=RT_F64) {
if (tempi1->ic_code==IC__PP) {
tempi->ic_code=IC_ASSIGN_PP;
tempi->ic_flags|=tempi1->ic_flags;
@@ -896,7 +900,7 @@ args.
break;
case IC_ENTER:
case IC_LEAVE:
tempi->ic_data=-lx->htc.fun->size;
tempi->ic_data=-cc->htc.fun->size;
break;
case IC_ADD_RSP:
if (tempi1=OptLag(tempi)) {
@@ -990,7 +994,8 @@ args.
while (tempi2->ic_code!=IC_CALL_END)
tempi2=tempi2->next;
tempi1->ic_flags=tempi->ic_flags|tempi1->ic_flags&~(ICF_R_TO_F64|ICF_PUSH_RESULT)|tempi2->ic_flags;
tempi1->ic_flags=tempi->ic_flags|tempi1->ic_flags&
~(ICF_R_TO_F64|ICF_PUSH_RESULT)|tempi2->ic_flags;
OptSetNOP1(tempi2);
tempi1->ic_class=cmp.internal_types[RT_I64];
@@ -1054,7 +1059,8 @@ args.
while (tempi2->ic_code!=IC_CALL_END)
tempi2=tempi2->next;
tempi1->ic_flags=tempi->ic_flags|tempi1->ic_flags&~(ICF_R_TO_INT|ICF_PUSH_RESULT)|tempi2->ic_flags;
tempi1->ic_flags=tempi->ic_flags|tempi1->ic_flags&
~(ICF_R_TO_INT|ICF_PUSH_RESULT)|tempi2->ic_flags;
OptSetNOP1(tempi2);
tempi1->ic_class=cmp.internal_types[RT_F64];
@@ -1085,10 +1091,10 @@ args.
}
break;
case IC_BR_ZERO:
tempi_push=OptBrZero(lx,tempi);
tempi_push=OptBrZero(cc,tempi);
break;
case IC_BR_NOT_ZERO:
tempi_push=OptBrNotZero(lx,tempi);
tempi_push=OptBrNotZero(cc,tempi);
break;
case IC_NOP1:
if (tempi->ic_flags&ICF_PUSH_RESULT) {
@@ -1251,9 +1257,9 @@ args.
case IC_ASM:
break;
default:
"Pass:%d Missing IC handler\n",lx->pass;
ICPut(lx,tempi);
LexExcept(lx,"Compiler Optimization Error at ");
"Pass:%d Missing IC handler\n",cc->pass;
ICPut(cc,tempi);
LexExcept(cc,"Compiler Optimization Error at ");
}
if (intermediate_code_table[code].arg_cnt==IS_2_ARG) {
if (tempi_push->ic_precedence.u8[0]&~ASSOC_MASK==PREC_ASSIGN)
@@ -1278,8 +1284,8 @@ args.
tempi=tempi->next;
}
if (ps->ptr>2) {
"Pass:%d Stk:%08X\n",lx->pass,ps->ptr;
LexExcept(lx,"Compiler Optimization Error at ");
"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.
+58 -47
View File
@@ -1,15 +1,15 @@
U0 OptPass3(CLex *lx,COptReg *reg_offsets)
U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
{
CHashClass *tempc,*tempc1,*tempc2;
CLexCodeMisc *lb;
CCodeMisc *lb;
CIntermediateCode *tempi,*tempi1,*tempi2,*tempi_next,
*tempil1,*tempil2;
I64 code,i,j,l,member_cnt,used_reg_mask=0;
CMemberLst *tempm;
COptMemberVar *mv=NULL;
CExe *tempx;
CExeImportExport *tempe;
CPrsStk *ps=lx->ps;
CAOT *tempaot;
CAOTImportExport *tempie;
CPrsStk *ps=cc->ps;
ps->ptr=0;
ps->ptr2=0;
@@ -17,19 +17,20 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets)
reg_offsets[i].offset=MAX_I64;
reg_offsets[i].m=NULL;
}
if (lx->htc.fun) {
member_cnt=lx->htc.fun->member_cnt;
if (Bt(&lx->htc.fun->flags,Ff_DOT_DOT_DOT))
if (cc->htc.fun) {
member_cnt=cc->htc.fun->member_cnt;
if (Bt(&cc->htc.fun->flags,Ff_DOT_DOT_DOT))
member_cnt+=2;
mv=CAlloc(member_cnt*sizeof(COptMemberVar));
member_cnt=0;
tempm=lx->htc.fun->member_lst;
tempm=cc->htc.fun->member_lst;
while (tempm) {
tempc=OptClassFwd(tempm->member_class);
if (0<=tempm->reg<NUM_REGS) {
if (Bts(&used_reg_mask,tempm->reg))
PrintWarn("Reg in use\n $$LK,\"FL:%s,%d\"$$ '%s' in '%s'\n",
lx->cur_lfn->full_name,lx->cur_lfn->line_num,tempm->str,lx->htc.fun->str);
cc->lex_include_stk->full_name,
cc->lex_include_stk->line_num,tempm->str,cc->htc.fun->str);
reg_offsets[tempm->reg].offset=tempm->offset;
reg_offsets[tempm->reg].m=tempm;
} else if (tempc->raw_type!=RT_F64 && tempm->reg!=REG_NONE ||
@@ -42,14 +43,15 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets)
} else {
if (tempm->reg==REG_ALLOC)
PrintWarn("Can't reg var\n $$LK,\"FL:%s,%d\"$$ '%s' in '%s'\n",
lx->cur_lfn->full_name,lx->cur_lfn->line_num,tempm->str,lx->htc.fun->str);
cc->lex_include_stk->full_name,
cc->lex_include_stk->line_num,tempm->str,cc->htc.fun->str);
}
tempm=tempm->next;
}
} else
member_cnt=0;
tempi=lx->lcc.lcc_root.next;
tempi=cc->coc.coc_root.next;
while (code=tempi->ic_code) {
tempi_next=tempi->next;
if (code==IC_NOP1)
@@ -256,7 +258,8 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets)
if (tempc) {
if (tempc->raw_type==RT_F64 && tempil1->ic_class->raw_type!=RT_F64)
tempil1->ic_flags|=ICF_R_TO_F64;
else if (tempc->raw_type!=RT_F64 && tempil1->ic_class->raw_type==RT_F64)
else if (tempc->raw_type!=RT_F64 &&
tempil1->ic_class->raw_type==RT_F64)
tempil1->ic_flags|=ICF_R_TO_INT;
}
break;
@@ -272,23 +275,24 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets)
break;
case IC_NOBOUND_SWITCH:
case IC_SWITCH:
lb=OptLabelFwd(tempi->ic_data(CLexCodeMisc *)->dft);
lb=OptLabelFwd(tempi->ic_data(CCodeMisc *)->dft);
lb->use_cnt++;
break;
case IC_ASM:
tempx=tempi->ic_data;
tempe=tempx->next_ie;
while (tempe!=&tempx->next_ie) {
if (EIT_REL_I0<=tempe->type<=EIT_IMM_I64 &&
tempe->str && tempe->flags&EIF_GOTO_LABEL &&
(lb=LCCGoToLabelFind(lx,tempe->str)))
tempaot=tempi->ic_data;
tempie=tempaot->next_ie;
while (tempie!=&tempaot->next_ie) {
if (IET_REL_I0<=tempie->type<=IET_IMM_I64 &&
tempie->str && tempie->flags&IEF_GOTO_LABEL &&
(lb=COCGoToLabelFind(cc,tempie->str)))
lb->use_cnt++; //Prevent deadcode elimination.
tempe=tempe->next;
tempie=tempie->next;
}
break;
case IC_BR_NOT_EQUAL:
case IC_BR_EQUAL_EQUAL:
if ((tempi1->ic_code==IC_IMM_I64 || tempi1->ic_code==IC_IMM_F64) && !tempi1->ic_data) {
if ((tempi1->ic_code==IC_IMM_I64 ||
tempi1->ic_code==IC_IMM_F64) && !tempi1->ic_data) {
OptFree(tempi1);
MemCpy(&tempi->a1,&tempi->a2,sizeof(CICArg));
tempi->a2.type=TY_NULL;
@@ -298,7 +302,8 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets)
code=tempi->ic_code=IC_BR_NOT_ZERO;
tempi1=tempi2;
tempc1=tempc2;
} else if ((tempi2->ic_code==IC_IMM_I64 || tempi2->ic_code==IC_IMM_F64) && !tempi2->ic_data) {
} else if ((tempi2->ic_code==IC_IMM_I64 ||
tempi2->ic_code==IC_IMM_F64) && !tempi2->ic_data) {
OptFree(tempi2);
tempi->a2.type=TY_NULL;
if (code==IC_BR_EQUAL_EQUAL)
@@ -509,9 +514,9 @@ here1:
case IC_LABEL:
break;
default:
"Pass:%d Missing IC handler\n",lx->pass;
ICPut(lx,tempi);
LexExcept(lx,"Compiler Optimization Error at ");
"Pass:%d Missing IC handler\n",cc->pass;
ICPut(cc,tempi);
LexExcept(cc,"Compiler Optimization Error at ");
}
}
tempi=tempi_next;
@@ -521,8 +526,8 @@ here1:
We just scored num occurrences of each [RBP] offset in the code to help decide
which variables should be assigned to register variables.
We counted the times each offset was added to RBP as a plus LEA and we subtract the
times the offset is dereferenced. If the address was calculated more times
We counted the times each offset was added to RBP as a plus LEA and we subtract
the times the offset is dereferenced. If the address was calculated more times
than the offset was dereferenced, the variable's address was passed or assigned
and we cannot use a register because you can't take address of a reg var.
@@ -535,10 +540,11 @@ have a unusual ModR addressing mode in the x86_64 architecture, so I only use
R12 and R13 as non-pointer register variables, such as index variables i,j,k.
*/
if (lx->htc.fun) {
lx->htc.fun->used_reg_mask=lx->htc.fun->used_reg_mask&~(REG_VARS_MASK|REG_NON_PTR_MASK)|used_reg_mask;
if (!Bt(&lx->opts,OPTf_NO_REG_VAR) &&
!(lx->flags & LF_NO_REG_OPT)) {
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;
if (!Bt(&cc->opts,OPTf_NO_REG_VAR) &&
!(cc->flags & CCF_NO_REG_OPT)) {
QSort(mv,member_cnt,sizeof(COptMemberVar),&OptMVCompare);
while (member_cnt && !mv[member_cnt-1].score)
member_cnt--;
@@ -551,12 +557,13 @@ R12 and R13 as non-pointer register variables, such as index variables i,j,k.
} else {
if (mv[i].m->reg==REG_ALLOC)
PrintWarn("Can't reg var\n $$LK,\"FL:%s,%d\"$$ '%s' in '%s'\n",
lx->cur_lfn->full_name,lx->cur_lfn->line_num,mv[i].m->str,lx->htc.fun->str);
cc->lex_include_stk->full_name,
cc->lex_include_stk->line_num,mv[i].m->str,cc->htc.fun->str);
}
}
if (j>0) {
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT))
"Fun:%s\n",lx->htc.fun->str;
if (Bt(&cc->flags,CCf_OPT_TRACE_PRESENT))
"Fun:%s\n",cc->htc.fun->str;
if (j>cmp.num_reg_vars) {
l=0;
for (i=0;i<j && l<cmp.num_non_ptr_vars;i++) {
@@ -564,22 +571,24 @@ R12 and R13 as non-pointer register variables, such as index variables i,j,k.
tempc=OptClassFwd(tempm->member_class);
if (!tempc->ptr_stars_cnt && !tempm->dim.next) {
while (l<cmp.num_non_ptr_vars &&
Bts(&lx->htc.fun->used_reg_mask,cmp.non_ptr_vars_map[l]))
Bts(&cc->htc.fun->used_reg_mask,cmp.non_ptr_vars_map[l]))
l++;
if (l<cmp.num_non_ptr_vars) {
tempm->reg=cmp.non_ptr_vars_map[l++];
reg_offsets[tempm->reg].offset=mv[i].offset_start;
reg_offsets[tempm->reg].m=tempm;
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT))
if (Bt(&cc->flags,CCf_OPT_TRACE_PRESENT))
"Reg %Z Var \"%-15ts\" %016X[RBP]\n",tempm->reg,"ST_U64_REGS",
tempm->str,reg_offsets[tempm->reg].offset;
mv[i].offset_start=0; //flag as reg var
if (tempm->size<8 && !StrIMatch("Bool",tempm->member_class->str) &&
if (tempm->size<8 &&
!StrIMatch("Bool",tempm->member_class->str) &&
tempm->member_class->type&HTT_INTERNAL_TYPE)
PrintWarn("Using 64-bit reg var.\n "
"$$LK,\"FL:%s,%d\"$$ '%s' in '%s'\n",
lx->cur_lfn->full_name,lx->cur_lfn->line_num,
tempm->str,lx->htc.fun->str);
cc->lex_include_stk->full_name,
cc->lex_include_stk->line_num,
tempm->str,cc->htc.fun->str);
}
}
}
@@ -591,21 +600,23 @@ R12 and R13 as non-pointer register variables, such as index variables i,j,k.
if (mv[i].offset_start && (!mv[i].m->dim.next||
tempm->offset>0 && StrCmp(tempm->str,"argv"))) {
while (l<cmp.num_reg_vars &&
Bts(&lx->htc.fun->used_reg_mask,cmp.to_reg_vars_map[l]))
Bts(&cc->htc.fun->used_reg_mask,cmp.to_reg_vars_map[l]))
l++;
if (l<cmp.num_reg_vars) {
tempm->reg=cmp.to_reg_vars_map[l++];
reg_offsets[tempm->reg].offset=mv[i].offset_start;
reg_offsets[tempm->reg].m=tempm;
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT))
if (Bt(&cc->flags,CCf_OPT_TRACE_PRESENT))
"Reg %Z Var \"%-15ts\" %016X[RBP]\n",tempm->reg,"ST_U64_REGS",
tempm->str,reg_offsets[tempm->reg].offset;
if (tempm->size<8 && !StrIMatch("Bool",tempm->member_class->str) &&
if (tempm->size<8 &&
!StrIMatch("Bool",tempm->member_class->str) &&
tempm->member_class->type&HTT_INTERNAL_TYPE)
PrintWarn("Using 64-bit reg var.\n "
"$$LK,\"FL:%s,%d\"$$ '%s' in '%s'\n",
lx->cur_lfn->full_name,lx->cur_lfn->line_num,
tempm->str,lx->htc.fun->str);
cc->lex_include_stk->full_name,
cc->lex_include_stk->line_num,
tempm->str,cc->htc.fun->str);
}
}
}
@@ -614,8 +625,8 @@ R12 and R13 as non-pointer register variables, such as index variables i,j,k.
Free(mv);
}
if (ps->ptr>2) {
"Pass:%d Stk:%08X\n",lx->pass,ps->ptr;
LexExcept(lx,"Compiler Optimization Error at ");
"Pass:%d Stk:%08X\n",cc->pass,ps->ptr;
LexExcept(cc,"Compiler Optimization Error at ");
}
}
+38 -32
View File
@@ -10,15 +10,15 @@ Bool OptIC4(CIntermediateCode *tempi)
return FALSE;
if (tempil2->r.type&TY_MASK==TY_STK &&
!(tempil2->ic_flags&ICF_PUSH_RESULT)) {
!(tempil2->ic_flags&ICF_PUSH_RESULT)) {
if (tempil1->ic_code==IC_ADD_CONST &&
tempil1->a1.type&TY_MASK==TY_STK) {
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) {
tempil2->ic_code==IC_MOV) &&
tempil2->a1.type&TY_MASK==TY_REG) {
i=tempil1->ic_data;
if (MIN_I32<=i<=MAX_I32 &&
!Bt(&cmp.non_ptr_vars_mask,tempil2->a1.reg)) {
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;
@@ -28,11 +28,11 @@ Bool OptIC4(CIntermediateCode *tempi)
return TRUE;
}
} else if (tempil2->ic_code==IC_SHL_CONST &&
tempil2->a1.type&TY_MASK==TY_REG) {
tempil2->a1.type&TY_MASK==TY_REG) {
i=tempil1->ic_data;
if (MIN_I32<=i<=MAX_I32 &&
tempil2->a1.reg!=REG_RSP &&
1<=tempil2->ic_data<=3) {
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;
@@ -50,7 +50,7 @@ Bool OptIC4(CIntermediateCode *tempi)
}
}
if (tempil2->ic_code==IC_MOV ||
tempil2->ic_code==IC_REG) {
tempil2->ic_code==IC_REG) {
if (tempil1->a2.type&TY_MASK==TY_STK) {
if (tempil2->ic_flags & ICF_R_TO_INT) {
if (tempil2->a1.type&TY_MASK==TY_IMM)
@@ -131,11 +131,11 @@ 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) {
tempil2->a1.type&TY_MASK==TY_REG &&
tempil1->a1.type&TY_MASK==TY_STK) {
i=tempil2->ic_data;
if (MIN_I32<=i<=MAX_I32 &&
!Bt(&cmp.non_ptr_vars_mask,tempil2->a1.reg)) {
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;
@@ -146,7 +146,7 @@ Bool OptIC4(CIntermediateCode *tempi)
}
}
if (tempil2->ic_code==IC_LEA &&
tempil1->a1.type&TY_MASK==TY_STK) {
tempil1->a1.type&TY_MASK==TY_STK) {
tempil1->ic_flags|=tempil2->ic_flags;
tempil1->ic_code=IC_MOV;
tempil1->a1.type=tempil2->a1.type&TY_MASK+tempil1->a1.type_pointed;
@@ -168,21 +168,22 @@ Bool OptIC4(CIntermediateCode *tempi)
return FALSE;
}
U0 OptPass4(CLex *lx,COptReg *reg_offsets,I64 *_type)
U0 OptPass4(CCmpCtrl *cc,COptReg *reg_offsets,I64 *_type)
{
CHashClass *tempc,*tempc1,*tempc2;
CIntermediateCode *tempi,*tempi1,*tempi2,*tempil1,*tempil2,*tempil3,*tempi_next;
CIntermediateCode *tempi,*tempi1,*tempi2,*tempil1,*tempil2,*tempil3,
*tempi_next;
I64 code,i;
Bool dead_code=FALSE;
CLexCodeMisc *lb;
CPrsStk *ps=lx->ps;
CCodeMisc *lb;
CPrsStk *ps=cc->ps;
ps->ptr=0;
ps->ptr2=0;
if (_type)
*_type=RT_I64;
tempi=lx->lcc.lcc_root.next;
tempi=cc->coc.coc_root.next;
while (code=tempi->ic_code) {
tempi_next=tempi->next;
if (dead_code&&code!=IC_LABEL) {
@@ -331,7 +332,8 @@ p4_lea_gone:
tempi->a1.disp=0;
tempi->a1.reg=tempi2->a1.reg+tempi1->a1.reg<<8;
p4_sib:
tempi->ic_flags|=(tempi1->ic_flags|tempi2->ic_flags)&ICG_NO_CVT_MASK;
tempi->ic_flags|=(tempi1->ic_flags|tempi2->ic_flags)
&ICG_NO_CVT_MASK;
OptSetNOP2(tempi1);
OptFree(tempi2);
@@ -341,7 +343,8 @@ p4_sib:
tempi->a2.type=TY_NULL+tempi->a2.type&RT_MASK;
}
} else if (tempi2->ic_code==IC_SHL_CONST && tempi2->a1.type==TY_REG+RT_I64 &&
} else if (tempi2->ic_code==IC_SHL_CONST &&
tempi2->a1.type==TY_REG+RT_I64 &&
tempi2->ic_data<=3) {
if (tempi2->a1.reg!=REG_RSP) {
tempi->a1.disp=0;
@@ -355,8 +358,10 @@ p4_sib:
goto p4_sib;
}
}
} else if (tempi1->ic_code==IC_LEA && tempi1->a1.type&TY_MASK==TY_DISP) {
if (tempi1->a1.reg==REG_RBP && CmpOffset2Reg(tempi1->a1.disp,reg_offsets)>=0)
} else if (tempi1->ic_code==IC_LEA &&
tempi1->a1.type&TY_MASK==TY_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 ||
tempi2->ic_code==IC_REG) {
@@ -369,7 +374,8 @@ p4_sib:
tempi->a1.reg=tempi2->a1.reg+tempi1->a1.reg<<8;
goto p4_sib;
}
} else if (tempi2->ic_code==IC_SHL_CONST && tempi2->a1.type==TY_REG+RT_I64 &&
} else if (tempi2->ic_code==IC_SHL_CONST &&
tempi2->a1.type==TY_REG+RT_I64 &&
tempi2->ic_data<=3) {
if (tempi2->a1.reg!=REG_RSP) {
tempi->a1.disp=tempi1->a1.disp;
@@ -575,7 +581,7 @@ p4_sib:
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) {
tempil1->r.type&TY_MASK==TY_STK) {
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
tempi->a1.reg=REG_RAX;
tempi->a1.disp=0;
@@ -697,9 +703,9 @@ p4_sib:
case IC_CALL_END2:
break;
default:
"Pass:%d Missing IC handler\n",lx->pass;
ICPut(lx,tempi);
LexExcept(lx,"Compiler Optimization Error at ");
"Pass:%d Missing IC handler\n",cc->pass;
ICPut(cc,tempi);
LexExcept(cc,"Compiler Optimization Error at ");
}
if (tempi) {
while (OptIC4(tempi));
@@ -711,7 +717,7 @@ p4_sib:
tempi=tempi_next;
}
if (ps->ptr>2) {
"Pass:%d Stk:%08X\n",lx->pass,ps->ptr;
LexExcept(lx,"Compiler Optimization Error at ");
"Pass:%d Stk:%08X\n",cc->pass,ps->ptr;
LexExcept(cc,"Compiler Optimization Error at ");
}
}
+11 -10
View File
@@ -1,18 +1,18 @@
U0 OptPass5(CLex *lx)
U0 OptPass5(CCmpCtrl *cc)
{
CIntermediateCode *tempi,*tempi1;
I64 code,i,ty,pt,ty1,pt1;
CPrsStk *ps=lx->ps;
CPrsStk *ps=cc->ps;
ps->ptr=0;
ps->ptr2=0;
tempi=lx->lcc.lcc_root.next;
tempi=cc->coc.coc_root.next;
while (code=tempi->ic_code) {
if (code>IC_NOP2) {
if (tempi->ic_flags&ICF_TRACE) {
if (Bt(&lx->otrace_mask,5)) {
if (Bt(&cc->otrace_mask,5)) {
"%2d:",ps->ptr;
ICPut(lx,tempi);
ICPut(cc,tempi);
}
}
if (intermediate_code_table[code].arg_cnt==IS_V_ARG)
@@ -29,7 +29,7 @@ U0 OptPass5(CLex *lx)
if (tempi->a2.type&TY_MASK==TY_STK) {
tempi1=PrsPop(ps);
if (tempi1->ic_code==IC_MOV ||
tempi1->ic_code==IC_REG) {
tempi1->ic_code==IC_REG) {
if (tempi1->ic_flags & ICF_R_TO_INT) {
if (tempi1->a1.type&TY_MASK==TY_IMM)
tempi1->a1.disp=tempi1->a1.disp(F64);
@@ -70,7 +70,7 @@ U0 OptPass5(CLex *lx)
if (tempi->a1.type&TY_MASK==TY_STK) {
tempi1=PrsPop(ps);
if (tempi1->ic_code==IC_MOV ||
tempi1->ic_code==IC_REG) {
tempi1->ic_code==IC_REG) {
if (tempi1->ic_flags & ICF_R_TO_INT) {
if (tempi1->a1.type&TY_MASK==TY_IMM)
tempi1->a1.disp=tempi1->a1.disp(F64);
@@ -110,13 +110,14 @@ U0 OptPass5(CLex *lx)
OptSetNOP2(tempi1);
}
}
if (tempi->r.type&TY_MASK==TY_STK && !(tempi->ic_flags&ICF_NO_DEPEND_RESULT))
if (tempi->r.type&TY_MASK==TY_STK &&
!(tempi->ic_flags&ICF_NO_DEPEND_RESULT))
PrsPush(ps,tempi);
}
tempi=tempi->next;
}
if (ps->ptr>2) {
"Pass:%d Stk:%08X\n",lx->pass,ps->ptr;
LexExcept(lx,"Compiler Optimization Error at ");
"Pass:%d Stk:%08X\n",cc->pass,ps->ptr;
LexExcept(cc,"Compiler Optimization Error at ");
}
}
+28 -25
View File
@@ -4,9 +4,9 @@ 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 &&
!Bt(&cmp.non_ptr_vars_mask,tempil1->a1.reg)) {
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 &&
!Bt(&cmp.non_ptr_vars_mask,tempil1->a1.reg)) {
if (tempil1->a1.type&TY_MASK==TY_REG) {
tempi->ic_flags=tempi->ic_flags&~ICF_A1_WAS_STK | tempil1->ic_flags;
tempi->ic_code=IC_MOV;
@@ -25,20 +25,20 @@ Bool OptIC6(CIntermediateCode *tempi)
return FALSE;
}
U0 OptPass6Lag(CLex *lx,CPrsStk *ps,CIntermediateCode *tempi,
U0 OptPass6Lag(CCmpCtrl *cc,CPrsStk *ps,CIntermediateCode *tempi,
I64 *i_,I64 num_stk,I64 *_clobbered_reg_mask,I64 fun_num)
{
I64 i=*i_,j,k,l,code,clobbered_reg_mask=*_clobbered_reg_mask;
CHashFun *tempf;
code=tempi->ic_code;
if (tempi->ic_flags&ICF_TRACE && Bt(&lx->otrace_mask,6)) {
if (tempi->ic_flags&ICF_TRACE && Bt(&cc->otrace_mask,6)) {
"%2d:",i;
ICPut(lx,tempi);
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"$
//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]);
@@ -108,18 +108,18 @@ U0 OptPass6Lag(CLex *lx,CPrsStk *ps,CIntermediateCode *tempi,
*_clobbered_reg_mask=clobbered_reg_mask;
}
U0 OptPass6(CLex *lx)
U0 OptPass6(CCmpCtrl *cc)
{
CIntermediateCode *tempi,*tempi_next,*tempil1,*tempil2,*old_tempil2;
I64 i=0,num_stk,clobbered_reg_mask=REG_ALWAYS_CLOBBERED_MASK,fun_num=0;
CPrsStk *ps=lx->ps;
I64 i=0,num_stk,clobbered_reg_mask=REGG_C_CLOBBERED,fun_num=0;
CPrsStk *ps=cc->ps;
ps->ptr=0;
ps->ptr2=0;
if (Bt(&lx->opts,OPTf_NO_REG_VAR) || lx->flags&LF_NO_REG_OPT)
if (Bt(&cc->opts,OPTf_NO_REG_VAR) || cc->flags&CCF_NO_REG_OPT)
num_stk=0;
else
num_stk=cmp.num_stk_temps;
tempi=lx->lcc.lcc_root.next;
tempi=cc->coc.coc_root.next;
old_tempil2=NULL;
tempil1=tempil2=&cmp.ic_nop;
while (tempi->ic_code) {
@@ -132,7 +132,8 @@ U0 OptPass6(CLex *lx)
!(tempil2->ic_flags&ICF_PUSH_RESULT)) {
if (tempi->ic_code==IC_ASSIGN && tempi->ic_flags&ICF_NOT_ADDR &&
tempi->ic_flags&ICF_NO_DEPEND_RESULT &&
tempil2->ic_code!=IC_CALL_END && tempil2->ic_code!=IC_CALL_END2 &&
tempil2->ic_code!=IC_CALL_END &&
tempil2->ic_code!=IC_CALL_END2 &&
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))) {
@@ -140,8 +141,10 @@ U0 OptPass6(CLex *lx)
tempil2->r.type_pointed=tempi->a1.type_pointed;
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)|ICF_DEPEND_RESULT;
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)
|ICF_DEPEND_RESULT;
old_tempil2=NULL;
OptSetNOP1(tempi);
} else {
@@ -167,7 +170,7 @@ U0 OptPass6(CLex *lx)
tempi->r.type==TY_STK+tempi->r.type&RT_MASK;
if (old_tempil2!=tempil2) {
if (tempil2->ic_code>IC_NOP2)
OptPass6Lag(lx,ps,tempil2,&i,num_stk,&clobbered_reg_mask,fun_num);
OptPass6Lag(cc,ps,tempil2,&i,num_stk,&clobbered_reg_mask,fun_num);
old_tempil2=tempil2;
}
}
@@ -177,16 +180,16 @@ U0 OptPass6(CLex *lx)
tempi=tempi_next;
}
if (ps->ptr>2) {
"Pass:%d Stk:%08X\n",lx->pass,ps->ptr;
LexExcept(lx,"Compiler Optimization Error at ");
"Pass:%d Stk:%08X\n",cc->pass,ps->ptr;
LexExcept(cc,"Compiler Optimization Error at ");
}
if (lx->htc.fun) {
lx->htc.fun->used_reg_mask&=~REG_STK_TEMPS_MASK;
lx->htc.fun->used_reg_mask|=clobbered_reg_mask;
lx->htc.fun->clobbered_reg_mask=clobbered_reg_mask;
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT) &&
Bt(&lx->otrace_mask,6)) {
"Used Reg Mask:%04X\n",lx->htc.fun->used_reg_mask;
if (cc->htc.fun) {
cc->htc.fun->used_reg_mask&=~REGG_C_TEMP_CLOBBERED;
cc->htc.fun->used_reg_mask|=clobbered_reg_mask;
cc->htc.fun->clobbered_reg_mask=clobbered_reg_mask;
if (Bt(&cc->flags,CCf_OPT_TRACE_PRESENT) &&
Bt(&cc->otrace_mask,6)) {
"Used Reg Mask:%04X\n",cc->htc.fun->used_reg_mask;
"Clobbered Reg Mask:%04X\n",clobbered_reg_mask;
}
}
+233 -188
View File
@@ -1,22 +1,22 @@
I64 OptPass789A(CLex *lx,COptReg *reg_offsets,U8 *buf,CDbgInfo **_dbg)
{/*lx->pass==7 is first time
lx->pass==8 is second time
lx->pass==9 is third time
lx->pass==9 is fourth time and repeated until size stops shrinking
I64 OptPass789A(CCmpCtrl *cc,COptReg *reg_offsets,U8 *buf,CDbgInfo **_dbg)
{/*cc->pass==7 is first time
cc->pass==8 is second time
cc->pass==9 is third time
cc->pass==9 is fourth time and repeated until size stops shrinking
size is now known
lx->pass==10 is final pass, code is placed into buf.
cc->pass==10 is final pass, code is placed into buf.
*/
CIntermediateCode *tempi,*tempi_next;
I64 i,cnt,num_lines=lx->max_line+1-lx->min_line,ip=0,ip2;
I64 i,cnt,num_lines=cc->max_line+1-cc->min_line,ip=0,ip2;
U8 *ptr;
CLexCodeMisc *lb;
CExe *tempx;
CExeAbsAddr *tempa;
CExeImportExport *tempe;
CExeHeapGlbl *temphg;
CExeHeapGlblRef *temphgr;
CCodeMisc *lb;
CAOT *tempaot;
CAOTAbsAddr *tempa;
CAOTImportExport *tempie;
CAOTHeapGlbl *temphg;
CAOTHeapGlblRef *temphgr;
CDbgInfo *dbg_info;
CAOTCtrl *a=lx->a;
CAOTCtrl *aotc=cc->aotc;
Bool short_jmp;
CICArg saved_p123[3];
CHashClass *tempc;
@@ -26,53 +26,57 @@ lx->pass==10 is final pass, code is placed into buf.
if (_dbg) {
*_dbg=dbg_info=CAlloc(offset(CDbgInfo.body)+sizeof(U32)*(num_lines+1));
dbg_info->min_line=lx->min_line;
dbg_info->max_line=lx->max_line;
if (lx->flags&LF_AOT_COMPILE)
dbg_info->body[0]=a->ip;
dbg_info->min_line=cc->min_line;
dbg_info->max_line=cc->max_line;
if (cc->flags&CCF_AOT_COMPILE)
dbg_info->body[0]=aotc->ip;
else
dbg_info->body[0]=buf;
} else
dbg_info=NULL;
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT) && Bt(&lx->otrace_mask,lx->pass))
"$$BK,1$$$$LTRED$$$$IV,1$$This code gets merged together and patched.\n$$FG$$$$IV,0$$$$BK,0$$";
if (Bt(&cc->flags,CCf_OPT_TRACE_PRESENT) && Bt(&cc->otrace_mask,cc->pass))
"$$BK,1$$$$LTRED$$$$IV,1$$This code gets merged together and patched.\n"
"$$FG$$$$IV,0$$$$BK,0$$";
lx->last_float_op_ic=NULL;
tempi=&lx->lcc.lcc_root;
cc->last_float_op_ic=NULL;
tempi=&cc->coc.coc_root;
tempi->ic_cnt=0;
tempi->ic_last_cnt=-1;
tempi=tempi->next;
while (tempi->ic_code) {
tempi_next=tempi->next;
if (tempi->ic_flags&ICF_TRACE && Bt(&lx->otrace_mask,lx->pass))
ICPut(lx,tempi);
if (tempi->ic_flags&ICF_TRACE && Bt(&cc->otrace_mask,cc->pass))
ICPut(cc,tempi);
ip2=ip;
if (lx->flags&LF_AOT_COMPILE)
ip2+=a->ip;
if (cc->flags&CCF_AOT_COMPILE)
ip2+=aotc->ip;
else
ip2+=buf;
lx->cur_ic_float_op_num=0;
cc->cur_ic_float_op_num=0;
if (!(tempi->ic_flags &ICF_CODE_FINAL)) {
tempi->ic_flags=tempi->ic_flags&~(ICF_PREVIOUS_DELETED|ICF_DONT_RESTORE)|ICF_CODE_FINAL;
if (lx->pass==7)
lx->dont_push_float=Btr(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0);
tempi->ic_flags=tempi->ic_flags&
~(ICF_PREVIOUS_DELETED|ICF_DONT_RESTORE)|ICF_CODE_FINAL;
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)
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(lx,tempi,REG_RDX,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,FALSE,CN_A1,ip2);
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(lx,tempi,REG_RDX,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,TRUE,CN_A1,ip2);
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;
@@ -89,7 +93,8 @@ lx->pass==10 is final pass, code is placed into buf.
tempi->a1.disp=0;
tempi->ic_flags&=~ICF_A1_FIRST;
}
ICFCvt(lx,tempi,REG_RAX,tempi->a2.type,tempi->a2.reg,tempi->a2.disp,FALSE,CN_A2,ip2);
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;
@@ -102,7 +107,8 @@ lx->pass==10 is final pass, code is placed into buf.
tempi->a1.disp=0;
tempi->ic_flags&=~ICF_A1_FIRST;
}
ICFCvt(lx,tempi,REG_RAX,tempi->a2.type,tempi->a2.reg,tempi->a2.disp,TRUE,CN_A2,ip2);
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;
@@ -111,12 +117,14 @@ lx->pass==10 is final pass, code is placed into buf.
} else {
if (tempi->a2.type&TY_MASK) {
if (tempi->ic_flags & ICF_A2_TO_F64) {
ICFCvt(lx,tempi,REG_RAX,tempi->a2.type,tempi->a2.reg,tempi->a2.disp,FALSE,CN_A2,ip2);
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(lx,tempi,REG_RAX,tempi->a2.type,tempi->a2.reg,tempi->a2.disp,TRUE,CN_A2,ip2);
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;
@@ -124,12 +132,14 @@ lx->pass==10 is final pass, code is placed into buf.
}
if (tempi->a1.type&TY_MASK) {
if (tempi->ic_flags & ICF_A1_TO_F64) {
ICFCvt(lx,tempi,REG_RDX,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,FALSE,CN_A1,ip2);
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(lx,tempi,REG_RDX,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,TRUE,CN_A1,ip2);
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;
@@ -142,12 +152,12 @@ lx->pass==10 is final pass, code is placed into buf.
case IC_ABS_ADDR:
ICU16(tempi,0xB848);
ICU64(tempi,tempi->ic_data);
if (buf && lx->flags&LF_AOT_COMPILE &&
!(lx->flags&(LF_NO_ABSS|LF_ASM_EXPRESSIONS))) {
tempa=CAlloc(sizeof(CExeAbsAddr));
tempa->next=a->abss;
tempa->type=EAT_ADD_U64;
a->abss=tempa;
if (buf && cc->flags&CCF_AOT_COMPILE &&
!(cc->flags&(CCF_NO_ABSS|CCF_ASM_EXPRESSIONS))) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
tempa->next=aotc->abss;
tempa->type=AAT_ADD_U64;
aotc->abss=tempa;
tempa->ip=ip2+tempi->ic_cnt-8;
}
break;
@@ -155,9 +165,10 @@ lx->pass==10 is final pass, code is placed into buf.
ICU16(tempi,0xB848);
ICU64(tempi,0);
temphg=tempi->ic_data;
if (buf && lx->flags&LF_AOT_COMPILE &&
!(lx->flags&(LF_NO_ABSS|LF_ASM_EXPRESSIONS))) {//is this necessary--flags?
temphgr=CAlloc(sizeof(CExeHeapGlblRef));
if (buf && cc->flags&CCF_AOT_COMPILE &&
//TODO:is this necessary--flags?
!(cc->flags&(CCF_NO_ABSS|CCF_ASM_EXPRESSIONS))) {
temphgr=CAlloc(sizeof(CAOTHeapGlblRef));
temphgr->next=temphg->references;
temphg->references=temphgr;
temphgr->ip=ip2+tempi->ic_cnt-8;
@@ -166,24 +177,25 @@ lx->pass==10 is final pass, code is placed into buf.
case IC_ADDR_IMPORT:
ICU8(tempi,0xB8);
ICU32(tempi,0);
if (buf && !(lx->flags&LF_NO_ABSS)) {
if (buf && !(cc->flags&CCF_NO_ABSS)) {
tempg=tempi->ic_data;
tempe=CAlloc(sizeof(CExeImportExport));
tempe->type=EIT_IMM_U32;
tempe->ip=ip2+tempi->ic_cnt-4;
tempe->next=tempg->ie_lst;
tempg->ie_lst=tempe;
tempie=CAlloc(sizeof(CAOTImportExport));
tempie->type=IET_IMM_U32;
tempie->ip=ip2+tempi->ic_cnt-4;
tempie->next=tempg->ie_lst;
tempg->ie_lst=tempie;
}
ICU24(tempi,0xC06348);
break;
case IC_RIP:
ICU16(tempi,0xB848);
ICU64(tempi,ip2+tempi->ic_cnt-2);
if (lx->flags&LF_AOT_COMPILE && buf && !(lx->flags&LF_NO_ABSS)) {
tempa=CAlloc(sizeof(CExeAbsAddr));
tempa->next=a->abss;
tempa->type=EAT_ADD_U64;
a->abss=tempa;
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;
aotc->abss=tempa;
tempa->ip=ip2+tempi->ic_cnt-8;
}
break;
@@ -212,52 +224,64 @@ lx->pass==10 is final pass, code is placed into buf.
ICFlagBranch(tempi,ip,0x75850F,buf);
break;
case IC_BR_EQUAL_EQUAL:
ICCmpAndBranch(tempi,FALSE,ip,0x74840F,0x74840F,0x74840F,0x74840F,buf,ip2);
ICCmpAndBranch(tempi,FALSE,ip,0x74840F,0x74840F,
0x74840F,0x74840F,buf,ip2);
break;
case IC_BR_EQUAL_EQUAL2:
ICCmpAndBranch(tempi,TRUE,ip,0x74840F,0x74840F,0x74840F,0x74840F,buf,ip2);
ICCmpAndBranch(tempi,TRUE,ip,0x74840F,0x74840F,
0x74840F,0x74840F,buf,ip2);
break;
case IC_BR_NOT_EQUAL:
ICCmpAndBranch(tempi,FALSE,ip,0x75850F,0x75850F,0x75850F,0x75850F,buf,ip2);
ICCmpAndBranch(tempi,FALSE,ip,0x75850F,0x75850F,
0x75850F,0x75850F,buf,ip2);
break;
case IC_BR_NOT_EQUAL2:
ICCmpAndBranch(tempi,TRUE,ip,0x75850F,0x75850F,0x75850F,0x75850F,buf,ip2);
ICCmpAndBranch(tempi,TRUE,ip,0x75850F,0x75850F,
0x75850F,0x75850F,buf,ip2);
break;
case IC_BR_LESS:
if (tempi->ic_flags&ICF_USE_F64)
ICFCmpAndBranch(lx,tempi, ip,0x72820F,0x77870F,buf,ip2);
ICFCmpAndBranch(cc,tempi, ip,0x72820F,0x77870F,buf,ip2);
else
ICCmpAndBranch(tempi,FALSE,ip,0x72820F,0x7C8C0F,0x77870F,0x7F8F0F,buf,ip2);
ICCmpAndBranch(tempi,FALSE,ip,0x72820F,0x7C8C0F,
0x77870F,0x7F8F0F,buf,ip2);
break;
case IC_BR_LESS2:
ICCmpAndBranch(tempi,TRUE,ip,0x72820F,0x7C8C0F,0x77870F,0x7F8F0F,buf,ip2);
ICCmpAndBranch(tempi,TRUE,ip,0x72820F,0x7C8C0F,
0x77870F,0x7F8F0F,buf,ip2);
break;
case IC_BR_GREATER_EQUAL:
if (tempi->ic_flags&ICF_USE_F64)
ICFCmpAndBranch(lx,tempi, ip,0x73830F,0x76860F,buf,ip2);
ICFCmpAndBranch(cc,tempi, ip,0x73830F,0x76860F,buf,ip2);
else
ICCmpAndBranch(tempi,FALSE,ip,0x73830F,0x7D8D0F,0x76860F,0x7E8E0F,buf,ip2);
ICCmpAndBranch(tempi,FALSE,ip,0x73830F,0x7D8D0F,
0x76860F,0x7E8E0F,buf,ip2);
break;
case IC_BR_GREATER_EQUAL2:
ICCmpAndBranch(tempi,TRUE,ip,0x73830F,0x7D8D0F,0x76860F,0x7E8E0F,buf,ip2);
ICCmpAndBranch(tempi,TRUE,ip,0x73830F,0x7D8D0F,
0x76860F,0x7E8E0F,buf,ip2);
break;
case IC_BR_GREATER:
if (tempi->ic_flags&ICF_USE_F64)
ICFCmpAndBranch(lx,tempi, ip,0x77870F,0x72820F,buf,ip2);
ICFCmpAndBranch(cc,tempi, ip,0x77870F,0x72820F,buf,ip2);
else
ICCmpAndBranch(tempi,FALSE,ip,0x77870F,0x7F8F0F,0x72820F,0x7C8C0F,buf,ip2);
ICCmpAndBranch(tempi,FALSE,ip,0x77870F,0x7F8F0F,
0x72820F,0x7C8C0F,buf,ip2);
break;
case IC_BR_GREATER2:
ICCmpAndBranch(tempi,TRUE,ip,0x77870F,0x7F8F0F,0x72820F,0x7C8C0F,buf,ip2);
ICCmpAndBranch(tempi,TRUE,ip,0x77870F,0x7F8F0F,
0x72820F,0x7C8C0F,buf,ip2);
break;
case IC_BR_LESS_EQUAL:
if (tempi->ic_flags&ICF_USE_F64)
ICFCmpAndBranch(lx,tempi, ip,0x76860F,0x73830F,buf,ip2);
ICFCmpAndBranch(cc,tempi, ip,0x76860F,0x73830F,buf,ip2);
else
ICCmpAndBranch(tempi,FALSE,ip,0x76860F,0x7E8E0F,0x73830F,0x7D8D0F,buf,ip2);
ICCmpAndBranch(tempi,FALSE,ip,0x76860F,0x7E8E0F,
0x73830F,0x7D8D0F,buf,ip2);
break;
case IC_BR_LESS_EQUAL2:
ICCmpAndBranch(tempi,TRUE,ip,0x76860F,0x7E8E0F,0x73830F,0x7D8D0F,buf,ip2);
ICCmpAndBranch(tempi,TRUE,ip,0x76860F,0x7E8E0F,
0x73830F,0x7D8D0F,buf,ip2);
break;
case IC_BR_BT:
ICBrBitOps(tempi,ip,0xA30F,0x20BA0F,0x72820F,buf,ip2);
@@ -326,33 +350,33 @@ lx->pass==10 is final pass, code is placed into buf.
case IC_STR_CONST:
case IC_GET_LABEL:
lb=tempi->ic_data;
if (lx->flags&LF_AOT_COMPILE)
i=lb->addr+a->ip;
if (cc->flags&CCF_AOT_COMPILE)
i=lb->addr+aotc->ip;
else
i=lb->addr+buf;
ICLea(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_RIP_DISP32+RT_PTR,0,i,lx,buf,ip2);
TY_RIP_DISP32+RT_PTR,0,i,cc,buf,ip2);
break;
case IC_ASM:
tempx=tempi->ic_data;
tempi->ic_cnt+=tempx->ex_U8s;
tempaot=tempi->ic_data;
tempi->ic_cnt+=tempaot->aot_U8s;
if (buf) {
MemCpy(buf+ip,tempx->buf,tempx->ex_U8s);
Free(tempx->buf);
tempx->buf=buf;
tempx->ip=ip;
tempx->ip2=ip2;
if (lx->flags&LF_AOT_COMPILE)
CmpFixUpAOTAsm(lx,tempx);
MemCpy(buf+ip,tempaot->buf,tempaot->aot_U8s);
Free(tempaot->buf);
tempaot->buf=buf;
tempaot->ip=ip;
tempaot->ip2=ip2;
if (cc->flags&CCF_AOT_COMPILE)
CmpFixUpAOTAsm(cc,tempaot);
else
CmpFixUpJITAsm(lx,tempx);
CmpFixUpJITAsm(cc,tempaot);
cnt=tempi->ic_cnt;
goto op789A_skip_copy;
}
break;
case IC_CALL:
i=tempi->ic_data-(ip2+5);
if (!(MIN_I32<=i<=MAX_I32) && !(lx->flags&LF_AOT_COMPILE)) {
if (!(MIN_I32<=i<=MAX_I32) && !(cc->flags&CCF_AOT_COMPILE)) {
ICU16(tempi,0xBB48);
ICU64(tempi,tempi->ic_data);
ICU16(tempi,0xD3FF);
@@ -374,14 +398,14 @@ lx->pass==10 is final pass, code is placed into buf.
break;
case IC_CALL_INDIRECT2:
ICU16(tempi,0xBB48);
if (lx->flags&LF_AOT_COMPILE) i=ip2+tempi->ic_cnt;
if (cc->flags&CCF_AOT_COMPILE) i=ip2+tempi->ic_cnt;
ICU64(tempi,tempi->ic_data);
ICU16(tempi,0x13FF);
if (buf && lx->flags&LF_AOT_COMPILE&& !(lx->flags&LF_NO_ABSS)) {
tempa=CAlloc(sizeof(CExeAbsAddr));
tempa->next=a->abss;
tempa->type=EAT_ADD_U64;
a->abss=tempa;
if (buf && cc->flags&CCF_AOT_COMPILE&& !(cc->flags&CCF_NO_ABSS)) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
tempa->next=aotc->abss;
tempa->type=AAT_ADD_U64;
aotc->abss=tempa;
tempa->ip=i;
}
break;
@@ -391,11 +415,11 @@ lx->pass==10 is final pass, code is placed into buf.
ICU64(tempi,0);
if (buf) {
tempf=tempi->ic_data;
tempe=CAlloc(sizeof(CExeImportExport));
tempe->type=EIT_IMM_I64;
tempe->ip=ip2+tempi->ic_cnt-8;
tempe->next=tempf->ie_lst;
tempf->ie_lst=tempe;
tempie=CAlloc(sizeof(CAOTImportExport));
tempie->type=IET_IMM_I64;
tempie->ip=ip2+tempi->ic_cnt-8;
tempie->next=tempf->ie_lst;
tempf->ie_lst=tempie;
}
ICU16(tempi,0xD3FF);
} else {
@@ -403,11 +427,11 @@ lx->pass==10 is final pass, code is placed into buf.
ICU32(tempi,0);
if (buf) {
tempf=tempi->ic_data;
tempe=CAlloc(sizeof(CExeImportExport));
tempe->type=EIT_REL_I32;
tempe->ip=ip2+tempi->ic_cnt-4;
tempe->next=tempf->ie_lst;
tempf->ie_lst=tempe;
tempie=CAlloc(sizeof(CAOTImportExport));
tempie->type=IET_REL_I32;
tempie->ip=ip2+tempi->ic_cnt-4;
tempie->next=tempf->ie_lst;
tempf->ie_lst=tempie;
}
}
break;
@@ -415,11 +439,14 @@ lx->pass==10 is final pass, code is placed into buf.
tempi->ic_flags&=~ICF_CODE_FINAL;
break;
case IC_LEAVE:
if (lx->htc.fun) {
if (Bt(&lx->htc.fun->flags,Ff_INTERRUPT))
ICPopRegs(tempi,REG_ALWAYS_CLOBBERED_MASK&~(1<<REG_RBP|1<<REG_RSP)|lx->htc.fun->used_reg_mask&(REG_VARS_MASK|REG_NON_PTR_MASK|REG_STK_TEMPS_MASK));
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));
else
ICPopRegs(tempi,lx->htc.fun->used_reg_mask&(REG_VARS_MASK|REG_NON_PTR_MASK));
ICPopRegs(tempi,cc->htc.fun->used_reg_mask&
(REGG_C_LOCAL_VARS|REGG_C_LOCAL_NON_PTR_VARS));
}
if (tempi->ic_data<=MAX_I16) {
if (tempi->ic_data)
@@ -430,15 +457,16 @@ lx->pass==10 is final pass, code is placed into buf.
ICAddRSP(tempi,tempi->ic_data);
ICU8(tempi,0x5D); //POP RBP
}
if (lx->htc.fun && Bt(&lx->htc.fun->flags,Ff_INTERRUPT)) {
if (Bt(&lx->htc.fun->flags,Ff_HASERRCODE))
if (cc->htc.fun && Bt(&cc->htc.fun->flags,Ff_INTERRUPT)) {
if (Bt(&cc->htc.fun->flags,Ff_HASERRCODE))
ICAddRSP(tempi,8);
ICU16(tempi,0xCF48);
} else if (lx->htc.fun && lx->htc.fun->arg_cnt &&
(Bt(&lx->htc.fun->flags,Ff_RET1) || Bt(&lx->htc.fun->flags,Ff_ARGPOP)) &&
!Bt(&lx->htc.fun->flags,Ff_NOARGPOP)) {
} else if (cc->htc.fun && cc->htc.fun->arg_cnt &&
(Bt(&cc->htc.fun->flags,Ff_RET1) ||
Bt(&cc->htc.fun->flags,Ff_ARGPOP)) &&
!Bt(&cc->htc.fun->flags,Ff_NOARGPOP)) {
ICU8(tempi,0xC2);
ICU16(tempi,lx->htc.fun->arg_cnt<<3);
ICU16(tempi,cc->htc.fun->arg_cnt<<3);
} else
ICU8(tempi,0xC3);
break;
@@ -479,7 +507,7 @@ lx->pass==10 is final pass, code is placed into buf.
break;
case IC_UNARY_MINUS:
if (tempi->r.type&RT_MASK==RT_F64)
ICFUnaryMinus(lx,tempi,buf,ip2);
ICFUnaryMinus(cc,tempi,buf,ip2);
else
ICUnaries(tempi,SLASH_OP_NEG,ip2);
break;
@@ -501,60 +529,62 @@ lx->pass==10 is final pass, code is placed into buf.
if (tempi->ic_flags&ICF_USE_INT)
ICPostIncDec(tempi,SLASH_OP_INC,ip2);
else
ICFPostIncDec(lx,tempi,CMP_TEMPLATE_INC,ip2);
ICFPostIncDec(cc,tempi,CMP_TEMPLATE_INC,ip2);
break;
case IC__MM:
if (tempi->ic_flags&ICF_USE_INT)
ICPostIncDec(tempi,SLASH_OP_DEC,ip2);
else
ICFPostIncDec(lx,tempi,CMP_TEMPLATE_DEC,ip2);
ICFPostIncDec(cc,tempi,CMP_TEMPLATE_DEC,ip2);
break;
case IC_PP_:
if (tempi->ic_flags&ICF_USE_INT)
ICPreIncDec(tempi,SLASH_OP_INC,ip2);
else
ICFPreIncDec(lx,tempi,CMP_TEMPLATE_INC,ip2);
ICFPreIncDec(cc,tempi,CMP_TEMPLATE_INC,ip2);
break;
case IC_MM_:
if (tempi->ic_flags&ICF_USE_INT)
ICPreIncDec(tempi,SLASH_OP_DEC,ip2);
else
ICFPreIncDec(lx,tempi,CMP_TEMPLATE_DEC,ip2);
ICFPreIncDec(cc,tempi,CMP_TEMPLATE_DEC,ip2);
break;
case IC_LEA:
ICLea(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,lx,buf,ip2);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,cc,buf,ip2);
break;
case IC_POWER:
ICFPow(lx,tempi,buf,ip2);
ICFPow(cc,tempi,buf,ip2);
break;
case IC_SHL:
ICShift(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2);
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,
0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2);
break;
case IC_SHR:
ICShift(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2);
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,
0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2);
break;
case IC_MUL:
if (tempi->ic_flags&ICF_USE_INT)
ICMul(tempi,ip2);
else
ICFMul(lx,tempi,buf,ip2);
ICFMul(cc,tempi,buf,ip2);
break;
case IC_DIV:
if (tempi->ic_flags&ICF_USE_INT)
ICDiv(tempi,ip2);
else
ICFDiv(lx,tempi,buf,ip2);
ICFDiv(cc,tempi,buf,ip2);
break;
case IC_MOD:
if (tempi->ic_flags&ICF_USE_INT)
ICMod(tempi,ip2);
else
ICFMod(lx,tempi,ip2);
ICFMod(cc,tempi,ip2);
break;
case IC_AND:
ICAddEct(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
@@ -577,7 +607,7 @@ lx->pass==10 is final pass, code is placed into buf.
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,0x03,ip2);
else
ICFAdd(lx,tempi,buf,ip2);
ICFAdd(cc,tempi,buf,ip2);
break;
case IC_SUB:
if (tempi->ic_flags&ICF_USE_INT)
@@ -585,7 +615,7 @@ lx->pass==10 is final pass, code is placed into buf.
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
else
ICFSub(lx,tempi,buf,ip2);
ICFSub(cc,tempi,buf,ip2);
break;
case IC_EQUAL_EQUAL:
ICCmp(tempi,0x75,0x75,ip2);
@@ -597,25 +627,25 @@ lx->pass==10 is final pass, code is placed into buf.
if (tempi->ic_flags&ICF_USE_INT)
ICCmp(tempi,0x73,0x7D,ip2);
else
ICFCmp(lx,tempi,CMP_TEMPLATE_LESS,ip2);
ICFCmp(cc,tempi,CMP_TEMPLATE_LESS,ip2);
break;
case IC_GREATER_EQUAL:
if (tempi->ic_flags&ICF_USE_INT)
ICCmp(tempi,0x72,0x7C,ip2);
else
ICFCmp(lx,tempi,CMP_TEMPLATE_GREATER_EQUAL,ip2);
ICFCmp(cc,tempi,CMP_TEMPLATE_GREATER_EQUAL,ip2);
break;
case IC_GREATER:
if (tempi->ic_flags&ICF_USE_INT)
ICCmp(tempi,0x76,0x7E,ip2);
else
ICFCmp(lx,tempi,CMP_TEMPLATE_GREATER,ip2);
ICFCmp(cc,tempi,CMP_TEMPLATE_GREATER,ip2);
break;
case IC_LESS_EQUAL:
if (tempi->ic_flags&ICF_USE_INT)
ICCmp(tempi,0x77,0x7F,ip2);
else
ICFCmp(lx,tempi,CMP_TEMPLATE_LESS_EQUAL,ip2);
ICFCmp(cc,tempi,CMP_TEMPLATE_LESS_EQUAL,ip2);
break;
case IC_AND_AND:
ICAndAnd(tempi,ip2);
@@ -639,31 +669,33 @@ lx->pass==10 is final pass, code is placed into buf.
ICShiftEqual(tempi,tempi->a1.type_pointed,
tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2);
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,
0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2);
break;
case IC_SHR_EQUAL:
ICShiftEqual(tempi,tempi->a1.type_pointed,
tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2);
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,
0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2);
break;
case IC_MUL_EQUAL:
if (tempi->ic_flags&ICF_USE_INT)
ICMulEqual(tempi,ip2);
else
ICFOpEqual(lx,tempi,SLASH_OP_FMUL,buf,ip2);
ICFOpEqual(cc,tempi,SLASH_OP_FMUL,buf,ip2);
break;
case IC_DIV_EQUAL:
if (tempi->ic_flags&ICF_USE_INT)
ICDivEqual(tempi,FALSE,ip2);
else
ICFOpEqual(lx,tempi,SLASH_OP_FDIV,buf,ip2);
ICFOpEqual(cc,tempi,SLASH_OP_FDIV,buf,ip2);
break;
case IC_MOD_EQUAL:
if (tempi->ic_flags&ICF_USE_INT)
ICDivEqual(tempi,TRUE,ip2);
else
ICFModEqual(lx,tempi,ip2);
ICFModEqual(cc,tempi,ip2);
break;
case IC_AND_EQUAL:
ICAndEqual(tempi,ip2);
@@ -679,54 +711,64 @@ lx->pass==10 is final pass, code is placed into buf.
ICAddSubEctEqual(tempi,tempi->a1.type_pointed,
tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,0x010000000003,ip2);
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,
0x010000000003,ip2);
else
ICFOpEqual(lx,tempi,SLASH_OP_FADD,buf,ip2);
ICFOpEqual(cc,tempi,SLASH_OP_FADD,buf,ip2);
break;
case IC_SUB_EQUAL:
if (tempi->ic_flags&ICF_USE_INT)
ICAddSubEctEqual(tempi,tempi->a1.type_pointed,
tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,0x29000000052B,ip2);
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,
0x29000000052B,ip2);
else
ICFOpEqual(lx,tempi,SLASH_OP_FSUB,buf,ip2);
ICFOpEqual(cc,tempi,SLASH_OP_FSUB,buf,ip2);
break;
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,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2);
TY_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,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2);
TY_IMM+RT_I64,0,tempi->ic_data,
0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2);
break;
case IC_ADD_CONST:
ICAddSubEctImm(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,tempi->ic_data,0x0003,ip2);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,tempi->ic_data,
0x0003,ip2);
break;
case IC_SUB_CONST:
ICAddSubEctImm(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,tempi->ic_data,0x052B,ip2);
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,tempi->ic_data,
0x052B,ip2);
break;
case IC_ENTER:
ICU32(tempi,0xEC8B4855);
if (tempi->ic_data)
ICAddRSP(tempi,-tempi->ic_data,FALSE);
if (lx->htc.fun) {
if (Bt(&lx->htc.fun->flags,Ff_INTERRUPT))
ICPushRegs(tempi,REG_ALWAYS_CLOBBERED_MASK&~(1<<REG_RBP|1<<REG_RSP)|lx->htc.fun->used_reg_mask&(REG_VARS_MASK|REG_NON_PTR_MASK|REG_STK_TEMPS_MASK));
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));
else {
if (sys_var_init_flag&1 && i)
ICLocalVarInit(tempi);
ICPushRegs(tempi,lx->htc.fun->used_reg_mask&(REG_VARS_MASK|REG_NON_PTR_MASK));
ICPushRegs(tempi,cc->htc.fun->used_reg_mask
&(REGG_C_LOCAL_VARS|REGG_C_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,REG_RBP,reg_offsets[i].offset,ip2);
TY_DISP+tempc->raw_type,
REG_RBP,reg_offsets[i].offset,ip2);
}
}
break;
@@ -767,10 +809,10 @@ lx->pass==10 is final pass, code is placed into buf.
ICU24(tempi,0x01E083); //AND EAX,1
break;
case IC_RDTSC:
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_RDTSC,TRUE,FALSE,FALSE,CN_MAIN);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_RDTSC,TRUE,FALSE,FALSE,CN_MAIN);
break;
case IC_HPET:
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_HPET,TRUE,FALSE,FALSE,CN_MAIN);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_HPET,TRUE,FALSE,FALSE,CN_MAIN);
break;
case IC_SET_RFLAGS:
ICPush(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
@@ -836,7 +878,8 @@ lx->pass==10 is final pass, code is placed into buf.
case IC_SIGN_I64:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_SIGN_I64,TRUE,FALSE,FALSE,CN_MAIN);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_SIGN_I64,
TRUE,FALSE,FALSE,CN_MAIN);
break;
case IC_PREEMPT:
ICPreempt(tempi,ip2);
@@ -845,34 +888,34 @@ lx->pass==10 is final pass, code is placed into buf.
ICToUpper(tempi,ip2);
break;
case IC_TO_I64:
ICToI64(lx,tempi,ip2);
ICToI64(cc,tempi,ip2);
break;
case IC_TO_F64:
ICToF64(lx,tempi,ip2);
ICToF64(cc,tempi,ip2);
break;
case IC_TO_BOOL:
ICToBool(lx,tempi,ip2);
ICToBool(cc,tempi,ip2);
break;
case IC_SQR:
ICFTemplateFun(lx,tempi,CMP_TEMPLATE_SQR,ip2);
ICFTemplateFun(cc,tempi,CMP_TEMPLATE_SQR,ip2);
break;
case IC_ABS:
ICFTemplateFun(lx,tempi,CMP_TEMPLATE_ABS,ip2);
ICFTemplateFun(cc,tempi,CMP_TEMPLATE_ABS,ip2);
break;
case IC_SQRT:
ICFTemplateFun(lx,tempi,CMP_TEMPLATE_SQRT,ip2);
ICFTemplateFun(cc,tempi,CMP_TEMPLATE_SQRT,ip2);
break;
case IC_SIN:
ICFTemplateFun(lx,tempi,CMP_TEMPLATE_SIN,ip2);
ICFTemplateFun(cc,tempi,CMP_TEMPLATE_SIN,ip2);
break;
case IC_COS:
ICFTemplateFun(lx,tempi,CMP_TEMPLATE_COS,ip2);
ICFTemplateFun(cc,tempi,CMP_TEMPLATE_COS,ip2);
break;
case IC_TAN:
ICFTemplateFun(lx,tempi,CMP_TEMPLATE_TAN,ip2);
ICFTemplateFun(cc,tempi,CMP_TEMPLATE_TAN,ip2);
break;
case IC_ATAN:
ICFTemplateFun(lx,tempi,CMP_TEMPLATE_ATAN,ip2);
ICFTemplateFun(cc,tempi,CMP_TEMPLATE_ATAN,ip2);
break;
case IC_ABS_I64:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
@@ -923,7 +966,7 @@ lx->pass==10 is final pass, code is placed into buf.
case IC_STRLEN:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_STRLEN,TRUE,FALSE,FALSE,CN_MAIN);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_STRLEN,TRUE,FALSE,FALSE,CN_MAIN);
break;
case IC_IN_U32:
if (tempi->a1.type&TY_MASK==TY_IMM) {
@@ -1049,10 +1092,10 @@ lx->pass==10 is final pass, code is placed into buf.
}
break;
case IC_NOBOUND_SWITCH:
ICSwitch(tempi,ip,TRUE,lx,buf,ip2);
ICSwitch(tempi,ip,TRUE,cc,buf,ip2);
break;
case IC_SWITCH:
ICSwitch(tempi,ip,FALSE,lx,buf,ip2);
ICSwitch(tempi,ip,FALSE,cc,buf,ip2);
break;
case IC_NOP1:
case IC_NOP2:
@@ -1077,9 +1120,9 @@ lx->pass==10 is final pass, code is placed into buf.
case IC_ADD_RSP1:
break;
default:
"Pass:%d Missing IC handler\n",lx->pass;
ICPut(lx,tempi);
LexExcept(lx,"Compiler Optimization Error at ");
"Pass:%d Missing IC handler\n",cc->pass;
ICPut(cc,tempi);
LexExcept(cc,"Compiler Optimization Error at ");
}
if (tempi->r.type&TY_MASK) {
if (tempi->ic_flags & ICF_R_TO_F64) {
@@ -1089,12 +1132,14 @@ lx->pass==10 is final pass, code is placed into buf.
ICU24(tempi,0x1BDD48);
ICU8(tempi,0x9B);
} else {
ICFCvt(lx,tempi,REG_RAX,tempi->r.type,tempi->r.reg,tempi->r.disp,FALSE,CN_R,ip2);
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);
}
} else if (tempi->ic_flags & ICF_R_TO_INT) {
ICFCvt(lx,tempi,REG_RAX,tempi->r.type,tempi->r.reg,tempi->r.disp,TRUE,CN_R,ip2);
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);
}
@@ -1102,19 +1147,19 @@ lx->pass==10 is final pass, code is placed into buf.
}
cnt=tempi->ic_cnt;
if (tempi->ic_flags&ICF_DEL_PREVIOUS_INS) {
if (lx->pass>8)
if (cc->pass>8)
cnt=tempi->ic_last_cnt;
tempi->ic_flags&=~ICF_DEL_PREVIOUS_INS;
}
if (cnt && buf)
MemCpy(buf+ip,tempi->ic_body,cnt);
op789A_skip_copy:
if (dbg_info && lx->min_line<=tempi->ic_line<=lx->max_line) {
i=tempi->ic_line-lx->min_line;
if (dbg_info && cc->min_line<=tempi->ic_line<=cc->max_line) {
i=tempi->ic_line-cc->min_line;
if (!dbg_info->body[i])
dbg_info->body[i]=ip2;
}
if (tempi->ic_flags&ICF_TRACE && Bt(&lx->otrace_mask,lx->pass) && cnt) {
if (tempi->ic_flags&ICF_TRACE && Bt(&cc->otrace_mask,cc->pass) && cnt) {
"$$RED$$";
if (buf)
Un(buf+ip,cnt,64);
@@ -1131,8 +1176,8 @@ op789A_next:
tempi=tempi_next;
}
lb=lx->lcc.lcc_next_misc;
while (lb!=&lx->lcc.lcc_next_misc) {
lb=cc->coc.coc_next_misc;
while (lb!=&cc->coc.coc_next_misc) {
switch (lb->type) {
case CMT_STR_CONST:
lb->addr=ip;
@@ -1156,13 +1201,13 @@ op789A_next:
} else {
if (buf)
for (i=0;i<lb->range;i++) {
if (lx->flags&LF_AOT_COMPILE && !(lx->flags&LF_NO_ABSS)) {
tempa=CAlloc(sizeof(CExeAbsAddr));
tempa->next=a->abss;
tempa->type=EAT_ADD_U32;
a->abss=tempa;
tempa->ip=a->ip+lb->addr+i<<2;
*ptr(U32 *)++=lb->jmp_table[i]->addr+a->ip;
if (cc->flags&CCF_AOT_COMPILE && !(cc->flags&CCF_NO_ABSS)) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
tempa->next=aotc->abss;
tempa->type=AAT_ADD_U32;
aotc->abss=tempa;
tempa->ip=aotc->ip+lb->addr+i<<2;
*ptr(U32 *)++=lb->jmp_table[i]->addr+aotc->ip;
} else
*ptr(U32 *)++=lb->jmp_table[i]->addr+buf;
}
@@ -1179,8 +1224,8 @@ op789A_next:
lb=lb->next;
}
if (dbg_info) {
if (lx->flags&LF_AOT_COMPILE)
dbg_info->body[num_lines]=ip+a->ip;
if (cc->flags&CCF_AOT_COMPILE)
dbg_info->body[num_lines]=ip+aotc->ip;
else
dbg_info->body[num_lines]=ip+buf;
}
+470 -529
View File
File diff suppressed because it is too large. Load diff
+319
View File
@@ -0,0 +1,319 @@
U0 PrsPush(CPrsStk *ps,I64 val)
{
ps->stk[++ps->ptr]=val;
}
I64 PrsPop(CPrsStk *ps)
{
return ps->stk[ps->ptr--];
}
U0 PrsPush2(CPrsStk *ps,I64 val)
{
ps->stk2[++ps->ptr2]=val;
}
I64 PrsPop2(CPrsStk *ps)
{
return ps->stk2[ps->ptr2--];
}
U0 PrsPopDeref(CPrsStk *ps)
{
I64 i=PrsPop(ps);
CHashClass *tempc=PrsPop(ps);
if (i.u16[0]!=IC_DEREF) {
PrsPush(ps,tempc);
PrsPush(ps,i);
}
}
I64 PrsKeyWord(CCmpCtrl *cc)
{//Cvt cur token to $LK,"KEYWORD",A="FF:::/Compiler/OpCodes.TXT,KEYWORD"$ or -1.
CHashGeneric *temph;
if (cc->token==TK_IDENT &&(temph=cc->hash_entry) && temph->type&HTT_KEYWORD)
return temph->user_data0;
else
return -1;
}
CHashClass *PrsClassNew()
{/*Ptrs to classes are handled by
allocating 5 structures for each
new class and representing a pointer
to a class by advancing 1 struct fwd
for one * and two fwd for two **.
*/
I64 i;
CHashClass *result=CAlloc(sizeof(CHashClass)*(MAX_PTR_STARS+1),Fs->code_heap),
*tempc=result;
for (i=0;i<=MAX_PTR_STARS;i++) {
tempc->type=HTT_CLASS;
tempc->raw_type=RT_PTR;
tempc->size=sizeof(U8 *);
tempc->ptr_stars_cnt=i;
tempc++;
}
result->last_in_member_lst=&result->member_lst;
result->size=0;
return result;
}
CHashFun *PrsFunNew()
{
I64 i;
CHashFun *result=CAlloc(sizeof(CHashFun)*(MAX_PTR_STARS+1),Fs->code_heap),
*tempf=result;
for (i=0;i<=MAX_PTR_STARS;i++) {
tempf->type=HTT_FUN;
tempf->raw_type=RT_PTR;
tempf->size=sizeof(U8 *);
tempf->ptr_stars_cnt=i;
tempf++;
}
result->last_in_member_lst=&result->member_lst;
result->size=0;
return result;
}
CIntermediateCode *ICAdd(CCmpCtrl *cc,
I64 opcode_and_precedence,I64 arg, CHashClass *c,I64 flags=0)
{
CIntermediateCode *tempi=MAlloc(sizeof(CIntermediateCode));
tempi->ic_code=opcode_and_precedence.u16[0];
tempi->ic_precedence=opcode_and_precedence.u16[1];
tempi->ic_data=arg;
tempi->ic_class=c;
if (Bt(&cc->opts,OPTf_OPT_TRACE)) {
Bts(&cc->flags,CCf_OPT_TRACE_PRESENT);
flags|=ICF_TRACE;
}
if (cc->lock_cnt)
flags|=ICF_LOCK;
tempi->ic_flags=flags;
tempi->ic_line=cc->last_line_num;
QueIns(tempi,cc->coc.coc_root.last);
return tempi;
}
U0 COCInit(CCmpCtrl *cc)
{
CCodeCtrl *tempcbh=&cc->coc;
QueInit(&tempcbh->coc_root.next);
QueInit(&tempcbh->coc_next_misc);
tempcbh->coc_root.ic_code=IC_END;
}
U0 COCPush(CCmpCtrl *cc)
{
CCodeCtrl *tempcbh=MAlloc(sizeof(CCodeCtrl));
MemCpy(tempcbh,&cc->coc,sizeof(CCodeCtrl));
cc->coc.coc_next=tempcbh;
}
CCmpCtrl *COCPopNoFree(CCmpCtrl *cc)
{
CCodeCtrl *tempcbh=cc->coc.coc_next;
MemCpy(&cc->coc,tempcbh,sizeof(CCodeCtrl));
return tempcbh;
}
U0 COCPop(CCmpCtrl *cc)
{
Free(COCPopNoFree(cc));
}
U0 COCAppend(CCmpCtrl *cc, CCodeCtrl *tempcbh)
{
if (tempcbh->coc_root.next!=&cc->coc.coc_root.next) {
cc->coc.coc_root.last->next=tempcbh->coc_root.next;
tempcbh->coc_root.next->last=cc->coc.coc_root.last;
cc->coc.coc_root.last=tempcbh->coc_root.last;
tempcbh->coc_root.last->next=&cc->coc.coc_root.next;
}
if (tempcbh->coc_next_misc!=&cc->coc.coc_next_misc) {
cc->coc.coc_last_misc->next=tempcbh->coc_next_misc;
tempcbh->coc_next_misc->last=cc->coc.coc_last_misc;
cc->coc.coc_last_misc=tempcbh->coc_last_misc;
tempcbh->coc_last_misc->next=&cc->coc.coc_next_misc;
}
Free(tempcbh);
}
CCodeMisc *COCMiscNew(CCmpCtrl *cc,I64 ty)
{
CCodeMisc *result=CAlloc(sizeof(CCodeMisc));
result->addr=INVALID_PTR;
result->type=ty;
QueIns(result,cc->coc.coc_last_misc);
return result;
}
CCodeMisc *COCGoToLabelFind(CCmpCtrl *cc,U8 *name)
{
CCodeMisc *cm=cc->coc.coc_next_misc;
while (cm!=&cc->coc.coc_next_misc) {
if ((cm->type==CMT_GOTO_LABEL||cm->type==CMT_ASM_LABEL) &&
!StrCmp(cm->str,name))
return cm;
cm=cm->next;
}
return NULL;
}
I64 COCFloatConstFind(CCmpCtrl *cc,F64 d)
{
I64 i;
CCodeMisc *cm=cc->coc.coc_next_misc;
while (cm!=&cc->coc.coc_next_misc) {
if (cm->type==CMT_FLOAT_CONSTS) {
for (i=0;i<cm->num_consts;i++)
if (cm->float_consts[i]==d)
return cm->addr+i*sizeof(F64);
if (cm->num_consts<CM_MAX_CONSTS) {
cm->float_consts[cm->num_consts++]=d;
return cm->addr+i*sizeof(F64);
}
}
cm=cm->next;
}
cm=COCMiscNew(cc,CMT_FLOAT_CONSTS);
cm->float_consts=MAlloc(CM_MAX_CONSTS*sizeof(F64));
cm->float_consts[cm->num_consts++]=d;
return cm->addr;
}
U0 COCDel(CCmpCtrl *cc,CCodeCtrl *coc)
{
CCodeMisc *cm,*cm1;
U8 *undef=NULL;
QueDel(&coc->coc_root.next);
cm=coc->coc_next_misc;
while (cm!=&coc->coc_next_misc) {
cm1=cm->next;
switch (cm->type) {
case CMT_GOTO_LABEL:
case CMT_ASM_LABEL:
if (!(cm->flags&CMF_DEFINED)) {
undef=cm->str;
cm->str=NULL;
} else if (!cm->use_cnt) {
PrintWarn("Unused label %s\n",cm->str);
LexWarn(cc,"Unused label at ");
}
break;
case CMT_JMP_TABLE:
Free(cm->jmp_table);
break;
case CMT_FLOAT_CONSTS:
Free(cm->float_consts);
break;
case CMT_ARRAY_DIM:
LinkedLstDel(cm->dim);
break;
case CMT_HASH_ENTRY:
HashDel(cm->h);
break;
}
Free(cm->str);
Free(cm);
cm=cm1;
}
if (undef) {
PrintErr("Undefined goto label %s\n",undef);
Free(undef);
LexExcept(cc,"Undefined goto label at ");
}
}
U0 COCHeaderPut(CCmpCtrl *cc,I64 pass,Bool put)
{
CIntermediateCode *tempi;
if (Bt(&cc->flags,CCf_OPT_TRACE_PRESENT)) {
if (put) {
if (Bt(&cc->otrace_mask,pass-1)) {
"$$IV,1$$Pass %d:$$IV,0$$\n",pass-1;
tempi=cc->coc.coc_root.next;
while (tempi->ic_code) {
if (tempi->ic_flags&ICF_TRACE)
ICPut(cc,tempi);
tempi=tempi->next;
}
}
} else if (Bt(&cc->otrace_mask,pass))
"$$IV,1$$Pass %d:$$IV,0$$\n",pass;
}
cc->pass=pass;
}
U8 *COCCompile(CCmpCtrl *cc,I64 *_code_size,CDbgInfo **_dbg,I64 *_type)
{
U8 *result;
CCodeMisc *lb;
I64 i,code_size,last_code_size;
COptReg reg_offsets[NUM_REGS];
if (_dbg) *_dbg=NULL;
cc->pass=0;
COCHeaderPut(cc,1,TRUE);
OptPass012(cc);
COCHeaderPut(cc,2,TRUE);
OptPass012(cc);
COCHeaderPut(cc,3,TRUE);
OptPass3(cc,reg_offsets);
COCHeaderPut(cc,4,TRUE);
OptPass4(cc,reg_offsets,_type);
COCHeaderPut(cc,5,TRUE);
OptPass5(cc);
COCHeaderPut(cc,6,TRUE);
OptPass6(cc);
COCHeaderPut(cc,7,TRUE);
lb=cc->coc.coc_next_misc;
while (lb!=&cc->coc.coc_next_misc) {
if (lb->type==CMT_JMP_TABLE) {
for (i=0;i<lb->range;i++)
lb->jmp_table[i]=OptLabelFwd(lb->jmp_table[i]);
lb->dft=OptLabelFwd(lb->dft);
}
lb=lb->next;
}
COCHeaderPut(cc,7,FALSE);
OptPass789A(cc,reg_offsets,NULL,NULL);
COCHeaderPut(cc,8,FALSE);
OptPass789A(cc,reg_offsets,NULL,NULL);
COCHeaderPut(cc,9,FALSE);
code_size=OptPass789A(cc,reg_offsets,NULL,NULL);
do {
last_code_size=code_size;
COCHeaderPut(cc,9,FALSE);
code_size=OptPass789A(cc,reg_offsets,NULL,NULL);
if (code_size>last_code_size) {
"Pass:9 Code Size\n";
LexExcept(cc,"Compiler Optimization Error at ");
}
} while (code_size<last_code_size);
if (cc->flags&CCF_AOT_COMPILE)
result=MAlloc(code_size);
else
result=MAlloc(code_size,Fs->code_heap);
COCHeaderPut(cc,10,FALSE);
code_size=OptPass789A(cc,reg_offsets,result,_dbg);
COCDel(cc,&cc->coc);
if (Bt(&cc->opts,OPTf_COMPILE_TRACE)) {
if (cc->flags&CCF_AOT_COMPILE) {
if (cc->aotc->seg_size==16)
Un(result,code_size,16);
else if (cc->aotc->seg_size==64)
Un(result,code_size,64);
else
Un(result,code_size,32);
} else
Un(result,code_size,64);
}
if (_code_size) *_code_size=code_size;
return result;
}
+548 -1321
View File
File diff suppressed because it is too large. Load diff
+731
View File
@@ -0,0 +1,731 @@
U0 PrsVarInit(CCmpCtrl *cc,U8 **_dst,CHashClass *tempc,CArrayDim *tempad,
U8 *data_addr_ip,U8 **_base,Bool data_heap,I64 pass)
{
U8 *dst=*_dst,*machine_code;
I64 i,j,r,old_flags,type,size;
CMemberLst *tempm;
CIntermediateCode *tempi;
CAOTCtrl *aotc=cc->aotc;
CAOTAbsAddr *tempa;
CAOTImportExport *tempie;
Bool is_str;
tempc=OptClassFwd(tempc);
if (tempm=tempc->member_lst) {
if (cc->token!='{')
LexExcept(cc,"expecting '{' at ");
LexPopNoRestore(cc);
LexPush(cc);
Lex(cc);
while (tempm) {
PrsVarInit2(cc,&dst,tempm->member_class,&tempm->dim,
data_addr_ip,_base,data_heap,pass);
if (cc->token==',')
Lex(cc);
tempm=tempm->next;
}
LexPopNoRestore(cc);
if (cc->token!='}')
LexExcept(cc,"missing '}' at ");
Lex(cc);
} else {
if (tempc->ptr_stars_cnt==1 &&
((tempc-1)->raw_type==RT_I8 || (tempc-1)->raw_type==RT_U8) &&
!tempad && cc->token==TK_STR)
is_str=TRUE;
else
is_str=FALSE;
if (cc->flags&CCF_AOT_COMPILE && is_str) {
LexPopNoRestore(cc);
machine_code=LexExtStr(cc,&i);
if (pass==2) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
tempa->next=aotc->abss;
tempa->type=AAT_ADD_U64;
aotc->abss=tempa;
tempa->ip=data_addr_ip+dst-*_base;
*dst(I64 *)=aotc->ip;
for (j=0;j<i;j++)
AOTStoreCodeU8(cc,machine_code[j]);
}
Free(machine_code);
} else {
old_flags=cc->flags;
cc->flags=CCF_NO_ABSS | cc->flags &
~(CCF_AOT_COMPILE|CCF_HAS_MISC_DATA|CCF_NOT_CONST);
machine_code=LexExpression2Bin(cc,&type);
if (old_flags&CCF_AOT_COMPILE &&
cc->flags&CCF_NOT_CONST &&
!Bt(&cc->opts,OPTf_GLBLS_ON_DATA_HEAP)) {
cc->flags=cc->flags&~CCF_NO_ABSS|CCF_AOT_COMPILE;
Free(machine_code);
if (pass==2) {
MemSet(dst,0,tempc->size);
LexPopRestore(cc);
Lex(cc);
COCPush(cc);
COCInit(cc);
ICAdd(cc,IC_ABS_ADDR,data_addr_ip,tempc+1);
ICAdd(cc,IC_IMM_I64,dst-*_base,tempc+1);
ICAdd(cc,IC_ADD,0,tempc+1);
if (!PrsExpression(cc,NULL,TRUE))
throw('Compiler');
tempi=cc->coc.coc_root.last;
if (tempi->ic_code==IC_END_EXP) {
tempi->ic_code=IC_NOP1;
tempi->ic_flags=0;
}
ICAdd(cc,IC_ASSIGN,0,tempc);
ICAdd(cc,IC_END_EXP,0,tempc,ICF_NO_DEPEND_RESULT);
ICAdd(cc,IC_RET,0,0);
if (machine_code=COCCompile(cc,&size,NULL,NULL)) {
tempie=CAlloc(sizeof(CAOTImportExport));
tempie->type=IET_MAIN;
tempie->ip=cc->aotc->ip;
QueIns(tempie,cc->aot->last_ie);
for (i=0;i<size;i++)
AOTStoreCodeU8(cc,machine_code[i]);
Free(machine_code);
}
COCPop(cc);
} else
LexPopNoRestore(cc);
} else {
LexPopNoRestore(cc);
if (!machine_code)
throw('Compiler');
r=Call(machine_code);
if (!(cc->flags & CCF_HAS_MISC_DATA)||pass==1)
Free(machine_code);
if (type==RT_F64 &&
tempc->raw_type!=RT_F64)
r=r(F64);
else if (type!=RT_F64 &&
tempc->raw_type==RT_F64)
r(F64)=r;
MemCpy(dst,&r,tempc->size);
}
}
dst+=tempc->size;
cc->flags=cc->flags&
~CCF_NO_ABSS|old_flags&(CCF_HAS_MISC_DATA|CCF_AOT_COMPILE);
}
*_dst=dst;
}
class CVI2
{
CVI2 *next,*last;
U0 base;
};
U0 PrsVarInit2(CCmpCtrl *cc,U8 **_dst,CHashClass *tempc,
CArrayDim *tempad,U8 *data_addr_ip,U8 **_base,Bool data_heap,I64 pass)
{
I64 i,j,cnt;
U8 *st,*_b;
CVI2 root,*tempvi,*tempvi1;
CArrayDim *tempad1;
tempc=OptClassFwd(tempc);
if (tempad1=tempad->next) {
if (!tempc->ptr_stars_cnt &&
(tempc->raw_type==RT_I8 || tempc->raw_type==RT_U8) &&
cc->token==TK_STR) {
LexPopNoRestore(cc);
st=LexExtStr(cc,&i);
if (tempad1->cnt<0) {//[]
tempad1->cnt=i;
tempad->total_cnt=i*tempad1->total_cnt;
Free(*_base);
if (data_heap)
*_base=MAlloc(i);
else
*_base=MAlloc(i,Fs->code_heap);
MemCpy(*_base,st,i);
*_dst=*_base+i;
} else {
MemCpy(*_dst,st,tempad1->cnt);
*_dst+=tempad1->cnt;
}
Free(st);
LexPush(cc);
} else {
if (cc->token=='{') {
LexPopNoRestore(cc);
LexPush(cc);
Lex(cc);
}
if (tempad1->cnt<0) {//[]
QueInit(&root);
cnt=0;
while (cc->token!='}') {
tempvi=MAlloc(offset(CVI2.base)+tempad1->total_cnt*tempc->size);
_b=&tempvi->base;
PrsVarInit2(cc,&_b,tempc,tempad1,data_addr_ip,_base,data_heap,pass);
QueIns(tempvi,root.last);
if (cc->token==',')
Lex(cc);
cnt++;
}
Lex(cc); //skip '}'
tempad1->cnt=cnt;
tempad->total_cnt=cnt*tempad1->total_cnt;
j=tempad1->total_cnt*tempc->size;
i=cnt*j;
Free(*_base);
if (data_heap)
*_base=_b=MAlloc(i);
else
*_base=_b=MAlloc(i,Fs->code_heap);
tempvi=root.next;
while (tempvi!=&root) {
tempvi1=tempvi->next;
MemCpy(_b,&tempvi->base,j);
_b+=j;
Free(tempvi);
tempvi=tempvi1;
}
*_dst=_b;
} else {
for (i=0;i<tempad1->cnt;i++) {
PrsVarInit2(cc,_dst,tempc,tempad1,data_addr_ip,_base,data_heap,pass);
if (tempad1->cnt>1 && cc->token==',')
Lex(cc);
}
if (cc->token=='}')
Lex(cc);
}
}
} else {
PrsVarInit(cc,_dst,tempc,tempad1,data_addr_ip,_base,data_heap,pass);
LexPush(cc);
}
}
U0 PrsGlblInit(CCmpCtrl *cc,CHashGlblVar *tempg,I64 pass)
{
U8 *dst=tempg->data_addr;
PrsVarInit2(cc,&dst,tempg->var_class,&tempg->dim,
tempg->data_addr_ip,&tempg->data_addr,
Bt(&cc->opts,OPTf_GLBLS_ON_DATA_HEAP)||
Bt(&cc->flags,CCf_AOT_COMPILE),pass);
}
U0 PrsStaticInit(CCmpCtrl *cc,CMemberLst *tempm,I64 pass)
{
U8 *machine_code,*dst=tempm->static_data;
CHashClass *tempc=tempm->member_class;
I64 i,size;
CAOTImportExport *tempie;
if (cc->flags&CCF_AOT_COMPILE && pass==2) {
COCPush(cc);
COCInit(cc);
}
PrsVarInit2(cc,&dst,tempc,&tempm->dim,tempm->static_data_ip,
&tempm->static_data,Bt(&cc->flags,CCf_AOT_COMPILE),pass);
if (cc->flags&CCF_AOT_COMPILE && pass==2) {
if (cc->coc.coc_root.next!=&cc->coc.coc_root) {
ICAdd(cc,IC_RET,0,0);
if (machine_code=COCCompile(cc,&size,NULL,NULL)) {
if (pass==2) {
tempie=CAlloc(sizeof(CAOTImportExport));
tempie->type=IET_MAIN;
tempie->ip=cc->aotc->ip;
QueIns(tempie,cc->aot->last_ie);
for (i=0;i<size;i++)
AOTStoreCodeU8(cc,machine_code[i]);
}
Free(machine_code);
}
} //TODO: else del misc?
COCPop(cc);
}
}
Bool PrsArrayDims(CCmpCtrl *cc,CArrayDim *dim)
{//Returns false on empty []
//dim->next!=0 for array
CArrayDim *tempad,*tempad1;
I64 j;
Bool result=TRUE;
dim->next=NULL;
dim->cnt=0;
dim->total_cnt=1;
tempad1=&dim->next;
while (cc->token=='[') {
if (Lex(cc)==']' && !dim->next) {
j=-1;
result=FALSE;
} else {
if ((j=LexExpressionI64(cc))<0)
LexExcept(cc,"Invalid array size at ");
}
tempad1=&dim->next;
while (tempad1->next) {
tempad1->next->total_cnt*=j;
tempad1=tempad1->next;
}
tempad=MAlloc(sizeof(CArrayDim));
tempad1->next=tempad;
tempad1=tempad;
tempad->next=NULL;
tempad->cnt=j;
tempad->total_cnt=1;
dim->total_cnt*=j;
if (cc->token!=']')
LexExcept(cc,"missing ']' at ");
Lex(cc);
}
return result;
}
CHashClass *PrsType(CCmpCtrl *cc,CHashClass **_tempc1,
I64 *_mode,CMemberLst *tempm,U8 **_ident,CHashFun **_fun_ptr,
CHashExport **_tempex,CArrayDim *tempad,I64 fsp_flags)
{
I64 k,ptr_stars_cnt,mode=*_mode;
CHashClass *tempc1=*_tempc1,*tempc2;
CHashFun *fun_ptr=NULL;
CHashExport *tempex=NULL;
CArrayDim *tempad2;
pt_start:
if (!tempc1 || !(tempc1->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"invalid class at ");
ptr_stars_cnt=0;
while (cc->token=='*') {
if (mode.u8[1]) {
LexPopNoRestore(cc);
LexPush(cc);
}
Lex(cc);
tempc1++;
if (++ptr_stars_cnt>MAX_PTR_STARS)
LexExcept(cc,"Too many *'s at ");
}
k=PrsKeyWord(cc);
if (k==KW_UNION || k==KW_CLASS) {
Lex(cc);
tempc2=PrsClass(cc,k,fsp_flags,mode&255==PRS0_EXTERN);
tempc2->fwd_class=tempc1;
tempc1=tempc2;
if (_tempc1) *_tempc1=tempc1;
mode=PRS0_NULL|PRS1_NULL;
goto pt_start;
}
if (cc->token=='(') {
if (Lex(cc)!='*')
LexExcept(cc,"expecting '*' at ");
ptr_stars_cnt=1; //fun_ptr
while (Lex(cc)=='*')
ptr_stars_cnt++; //fun_ptr
if (ptr_stars_cnt>MAX_PTR_STARS)
LexExcept(cc,"Too many *'s at ");
} else
ptr_stars_cnt=-1; //fun_ptr
if (_ident) {
if (cc->token==TK_IDENT) {
tempex=cc->hash_entry;
*_ident=cc->cur_str;
cc->cur_str=NULL;
Lex(cc);
} else {
if (!mode.u8[1])
*_ident=NULL;
else if (cc->token==',' || cc->token==';' || cc->token==')') {
tempex=NULL;
*_ident=StrNew("_anon_");
tempm->flags|=MLF_NO_UNUSED_WARN;
} else
LexExcept(cc,"expecting identifier at ");
}
}
if (ptr_stars_cnt>=0) { //fun_ptr
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
if (Lex(cc)!='(')
LexExcept(cc,"expecting '(' at ");
fun_ptr=PrsFunJoin(cc,tempc1,NULL,fsp_flags)+ptr_stars_cnt;
tempc1=cmp.internal_types[RT_PTR]+ptr_stars_cnt;
}
if (!PrsArrayDims(cc,tempad) && cc->token!='=') {
tempc1++;
tempad2=tempad->next->next;
Free(tempad->next);
tempad->next=tempad2;
}
tempc2=OptClassFwd(tempc1);
if (tempc2->ptr_stars_cnt) {
tempc2-=tempc2->ptr_stars_cnt;
if (tempc2->type&HTT_INTERNAL_TYPE && !tempc2->size)
LexWarn(cc,"use \"U8 *\" instead of \"U0 *\" at ");
}
if (_mode) *_mode=mode;
if (_fun_ptr) *_fun_ptr=fun_ptr;
if (_tempex) *_tempex=tempex;
return tempc1;
}
U0 PrsDotDotDot(CCmpCtrl *cc,CHashFun *tempf,I64 _reg)
{
CMemberLst *tempm;
CArrayDim *tempad;
Bts(&tempf->flags,Ff_DOT_DOT_DOT);
Lex(cc);
tempm=MemberLstNew(_reg);
tempm->flags=MLF_DOT_DOT_DOT;
tempm->member_class=cmp.internal_types[RT_I64];
tempm->str=StrNew("argc");
tempm->offset=tempf->size;
tempm->size=8;
tempf->size+=8;
MemberAdd(cc,tempm,tempf,PRS1B_FUN_ARG);
tempm=MemberLstNew(_reg);
tempm->flags=MLF_DOT_DOT_DOT;
tempm->member_class=cmp.internal_types[RT_I64];
tempm->str=StrNew("argv");
tempm->dim.total_cnt=127; //arbitrary
tempm->dim.next=tempad=MAlloc(sizeof(CArrayDim));
tempad->next=NULL;
tempad->cnt=127; //arbitrary
tempad->total_cnt=1;
tempm->offset=tempf->size;
tempm->size=8; //Close enough
tempf->size+=8;//Close enough
MemberAdd(cc,tempm,tempf,PRS1B_FUN_ARG);
if (cc->token==')')
Lex(cc);
}
U0 PrsVarLst(CCmpCtrl *cc,CHashClass *tempc,I64 mode,I64 union_base=0)
{
I64 i,k,old_flags=cc->flags,old_flags2,type,_reg;
CHashClass *tempc1,*tempc2;
CHash *temph;
CMemberLst *tempm;
CMemberLstMeta *temp_meta;
U8 *machine_code;
Bool undef_array_size,first;
cc->flags|=CCF_DONT_MAKE_RESULT;
if (mode.u8[1]==PRS1B_CLASS)
cc->flags|=CCF_CLASS_IP;
if ((mode.u8[1]!=PRS1B_LOCAL_VAR && mode.u8[1]!=PRS1B_STATIC_LOCAL_VAR ||
mode&PRSF_UNION) && (cc->token=='(' || cc->token=='{'))
Lex(cc);
while (TRUE) {
while (cc->token==';')
Lex(cc);
if (mode&PRSF_UNION)
cc->class_ip=union_base;
else
cc->class_ip=tempc->size;
while (cc->token=='$$') {
if (Lex(cc)!='=') //skip $$
LexExcept(cc,"expecting '=' at ");
Lex(cc); //skip =
cc->class_ip=LexExpression(cc);
if (-cc->class_ip>tempc->neg_offset)
tempc->neg_offset=-cc->class_ip;
if (mode&PRSF_UNION)
union_base=cc->class_ip;
else
tempc->size=cc->class_ip;
if (cc->token!=';')
LexExcept(cc,"missing ';' at");
Lex(cc); //skip ;
}
if (cc->token==')' || cc->token=='}') {
Lex(cc);
goto pvl_done;
}
_reg=REG_UNDEF;
pvl_restart1:
switch (PrsKeyWord(cc)) {
case KW_REG:
_reg=REG_ALLOC;
if (Lex(cc)==TK_IDENT) {
k=DefineMatch(cc->cur_str,"ST_U64_REGS");
if (k>=0) {
_reg=k;
Lex(cc);
}
}
goto pvl_restart1;
case KW_NOREG:
_reg=REG_NONE;
Lex(cc);
goto pvl_restart1;
}
if (cc->token==TK_DOT_DOT_DOT && mode.u8[1]==PRS1B_FUN_ARG) {
PrsDotDotDot(cc,tempc,_reg);
goto pvl_done;
}
if (cc->token==TK_IDENT)
temph=cc->hash_entry;
else
temph=NULL;
if (!temph)
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 ");
first=TRUE;
pvl_restart2:
tempc1=temph;
LexPush(cc);
Lex(cc); //skip type or ','
tempm=MemberLstNew(_reg);
_reg=REG_UNDEF;
if (mode.u8[1]==PRS1B_STATIC_LOCAL_VAR) {
tempm->flags|=MLF_STATIC;
tempm->reg=REG_NONE;
}
if (mode.u8[1]==PRS1B_FUN_ARG || mode.u8[1]==PRS1B_LOCAL_VAR) {
pvl_restart3:
switch (PrsKeyWord(cc)) {
case KW_REG:
tempm->reg=REG_ALLOC;
LexPopNoRestore(cc);
LexPush(cc);
if (Lex(cc)==TK_IDENT) {
k=DefineMatch(cc->cur_str,"ST_U64_REGS");
if (k>=0) {
tempm->reg=k;
LexPopNoRestore(cc);
LexPush(cc);
Lex(cc);
}
}
goto pvl_restart3;
case KW_NOREG:
tempm->reg=REG_NONE;
LexPopNoRestore(cc);
LexPush(cc);
Lex(cc);
goto pvl_restart3;
}
}
tempm->member_class=PrsType(cc,&tempc1,&mode,tempm,&tempm->str,
&tempm->fun_ptr,NULL,&tempm->dim,0);
if (tempm->fun_ptr)
tempm->flags|=MLF_FUN;
if (first)
MemberAdd(cc,tempm,tempc,mode.u8[1]);
else
MemberAdd(cc,tempm,tempc,PRS1B_NULL);
tempc->member_cnt++;
tempc2=tempm->member_class;
i=tempc2->size*tempm->dim.total_cnt;
switch (mode.u8[1]) {
case PRS1B_STATIC_LOCAL_VAR:
if (i<0) {
i=0;
undef_array_size=TRUE;
} else
undef_array_size=FALSE;
if (mode&PRSF_UNION)
LexExcept(cc,"Static unions are not implemented ");
k=(i+7)&~7;
if (cc->flags&CCF_AOT_COMPILE)
tempm->static_data=MAlloc(k);
else
tempm->static_data=MAlloc(k,Fs->code_heap);
if (cc->flags&CCF_AOT_COMPILE) {
tempm->static_data_ip=cc->aotc->ip;
k>>=3;
if (sys_var_init_flag&1) {
k<<=3;
while (k--)
AOTStoreCodeU8(cc,sys_var_init_val);
} else
while (k--)
AOTStoreCodeU64(cc,0);
} else
if (sys_var_init_flag&1)
MemSet(tempm->static_data,sys_var_init_val,k);
LexPopNoRestore(cc);
if (cc->token=='=') {
cc->flags=cc->flags&
~CCF_DONT_MAKE_RESULT|old_flags&CCF_DONT_MAKE_RESULT;
if (undef_array_size) {
LexPush(cc);
LexPush(cc);
Lex(cc); //skip =
PrsStaticInit(cc,tempm,1);
LexPopNoRestore(cc);
i=tempc2->size*tempm->dim.total_cnt;
k=(i+7)&~7;
if (cc->flags&CCF_AOT_COMPILE) {
k>>=3;
if (sys_var_init_flag&1) {
k<<=3;
while (k--)
AOTStoreCodeU8(cc,sys_var_init_val);
} else
while (k--)
AOTStoreCodeU64(cc,0);
} else
if (sys_var_init_flag&1)
MemSet(tempm->static_data,sys_var_init_val,k);
LexPopRestore(cc);
}
LexPush(cc);
Lex(cc); //skip =
PrsStaticInit(cc,tempm,2);
LexPopNoRestore(cc);
if (cc->flags&CCF_AOT_COMPILE)
for (k=0;k<i;k++)
AOTStoreCodeU8At(cc,tempm->static_data_ip+k,
tempm->static_data[k]);
tempm->use_cnt=0;
cc->flags|=CCF_DONT_MAKE_RESULT;
}
if (cc->flags&CCF_AOT_COMPILE)
Free(tempm->static_data);
break;
case PRS1B_LOCAL_VAR:
if (mode&PRSF_UNION) {
if (union_base-tempc->size<i)
i=union_base-i-tempc->size;
else
i=0;
}
if (i>=8)
tempc->size=(tempc->size-i)&~7;
else if (i>=4)
tempc->size=(tempc->size-i)&~3;
else if (i>=2)
tempc->size=(tempc->size-i)&~1;
else
tempc->size-=i;
tempm->offset=tempc->size;
tempm->size=i;
if (cc->token=='=') {
cc->flags=cc->flags&~CCF_DONT_MAKE_RESULT|
old_flags&CCF_DONT_MAKE_RESULT;
LexPopRestore(cc);
Lex(cc);
if (!PrsExpression(cc,NULL,TRUE))
throw('Compiler');
tempm->use_cnt=0;
cc->flags|=CCF_DONT_MAKE_RESULT;
} else
LexPopNoRestore(cc);
break;
case PRS1B_FUN_ARG:
if (mode&PRSF_UNION) {
tempm->offset=union_base;
if (tempc->size-union_base<8)
tempc->size=8+union_base;
} else {
tempm->offset=tempc->size;
tempc->size+=8;
}
tempm->size=8;
if (cc->token=='=') {
Lex(cc);
if (PrsKeyWord(cc)==KW_LASTCLASS) {
tempm->flags|=MLF_LASTCLASS;
Lex(cc);
} else {
old_flags2=cc->flags;
cc->flags&=~CCF_HAS_MISC_DATA;
machine_code=LexExpression2Bin(cc,&type);
if (!machine_code)
throw('Compiler');
tempm->dft_val=Call(machine_code);
tempc2=OptClassFwd(tempc2);
if (tempc2->raw_type==RT_F64) {
if (type!=RT_F64)
tempm->dft_val(F64)=tempm->dft_val;
} else {
if (type==RT_F64)
tempm->dft_val=tempm->dft_val(F64);
}
if (cc->flags & CCF_HAS_MISC_DATA) {
tempm->dft_val=StrNew(tempm->dft_val);
tempm->flags|=MLF_STR_DFT_AVAILABLE;
}
Free(machine_code);
cc->flags|=old_flags2&CCF_HAS_MISC_DATA;
}
tempm->flags|=MLF_DFT_AVAILABLE;
}
LexPopNoRestore(cc);
break;
case PRS1B_CLASS:
if (mode&PRSF_UNION) {
tempm->offset=union_base;
if (tempc->size-union_base<i)
tempc->size=i+union_base;
} else {
tempm->offset=tempc->size;
tempc->size+=i;
}
tempm->size=i;
while (cc->token==TK_IDENT) {
temp_meta=MAlloc(sizeof(CMemberLstMeta));
temp_meta->next=tempm->meta;
tempm->meta=temp_meta;
temp_meta->str=cc->cur_str;
temp_meta->flags=0;
cc->cur_str=NULL;
if (Lex(cc)==TK_STR) {
temp_meta->user_data=LexExtStr(cc);
temp_meta->flags|=MLMF_IS_STR;
} else
temp_meta->user_data=LexExpression(cc);
}
LexPopNoRestore(cc);
break;
}
switch (cc->token) {
case ',':
if (mode.u8[1]==PRS1B_FUN_ARG && !(mode&PRSF_UNION))
Lex(cc);
else {
first=FALSE;
goto pvl_restart2;
}
break;
case ')':
case '}':
Lex(cc);
goto pvl_done;
case ';':
cc->flags=cc->flags&~CCF_DONT_MAKE_RESULT|
old_flags&CCF_DONT_MAKE_RESULT;
Lex(cc);
cc->flags|=CCF_DONT_MAKE_RESULT;
if ((mode.u8[1]==PRS1B_LOCAL_VAR||mode.u8[1]==
PRS1B_STATIC_LOCAL_VAR) && !(mode&PRSF_UNION))
goto pvl_done;
break;
default:
LexExcept(cc,"missing ';' at");
}
}
}
pvl_done:
cc->flags=cc->flags&~(CCF_CLASS_IP|CCF_DONT_MAKE_RESULT)|
old_flags& (CCF_CLASS_IP|CCF_DONT_MAKE_RESULT);
}
-1
View File
@@ -1,5 +1,4 @@
asm {
USE64
//************************************
CMP_TEMPLATES::
DU32 @@05,@@10,@@15,@@25,@@30,
+117 -91
View File
@@ -22,12 +22,12 @@ I64 InstEntriesCompare(CInstruction *tempi1,CInstruction *tempi2)
i2=tempi2->opcode[j]>>3&7;
else
i2=tempi2->slash_val;
if (result=i1-i2) return result;
if (result=i1-i2) return result;
if (tempi1->flags&IEF_STI && tempi2->flags&IEF_STI) {
i1=tempi1->opcode[j]&7;
i2=tempi2->opcode[j]&7;
if (result=i1-i2) return result;
if (result=i1-i2) return result;
}
if (tempi1->flags&IEF_STI)
@@ -38,15 +38,17 @@ I64 InstEntriesCompare(CInstruction *tempi1,CInstruction *tempi2)
i1=tempi1->flags & IEF_OP_SIZE32;
i2=tempi2->flags & IEF_OP_SIZE32;
if (result=i1-i2) return result;
if (result=i1-i2) return result;
i1=Bt(&uasm.ins64_mask,tempi1->arg1) || Bt(&uasm.ins64_mask,tempi1->arg2);
i2=Bt(&uasm.ins64_mask,tempi2->arg1) || Bt(&uasm.ins64_mask,tempi2->arg2);
if (result=i1-i2) return result;
i1=Bt(&uasm.ins64_arg_mask,tempi1->arg1) ||
Bt(&uasm.ins64_arg_mask,tempi1->arg2);
i2=Bt(&uasm.ins64_arg_mask,tempi2->arg1) ||
Bt(&uasm.ins64_arg_mask,tempi2->arg2);
if (result=i1-i2) return result;
i1=tempi1->flags & IEF_48_REX;
i2=tempi2->flags & IEF_48_REX;
if (result=i1-i2) return result;
if (result=i1-i2) return result;
i1=tempi1->arg2==ARGT_IMM64 || tempi1->arg2==ARGT_UIMM64;
i2=tempi2->arg2==ARGT_IMM64 || tempi2->arg2==ARGT_UIMM64;
@@ -56,29 +58,41 @@ I64 InstEntriesCompare(CInstruction *tempi1,CInstruction *tempi2)
}
/*
U0 DumpUasmIns(CInstruction *tempi)
U0 DumpUAsmIns(CInstruction *tempi)
{
CHashOpcode *tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInstruction)-offset(CHashOpcode.ins);
"%10s:%02d,%02d SV:%02d\n",tempo->str,tempi->arg1,tempi->arg2,tempi->slash_val;
CHashOpcode *tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInstruction)
-offset(CHashOpcode.ins);
"%10s:%02d,%02d SV:%02d\n",tempo->str,
tempi->arg1,tempi->arg2,tempi->slash_val;
}
U0 DumpUasmTable()
U0 DumpUAsmTables()
{
I64 k;
for (k=0;k<uasm.table_entries;k++)
DumpUasmIns(uasm.table[k]);
"16/32 Bit Table\n";
for (k=0;k<uasm.table_16_32_entries;k++)
DumpUAsmIns(uasm.table_16_32[k]);
"\n\n\n\n64 Bit Table\n";
for (k=0;k<uasm.table_64_entries;k++)
DumpUAsmIns(uasm.table_64[k]);
}
*/
CInstruction *InstEntryFind(U8 *ip,I64 opsize)
CInstruction *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
{//Binary Search
I64 i,j,n,m,k,a1,a2,o1,o2,oc_cnt,sv;
CInstruction *tempi;
CInstruction *tempi,**table;
i=0;
j=uasm.table_entries-1;
if (seg_size==64) {
table=uasm.table_64;
j=uasm.table_64_entries-1;
} else {
table=uasm.table_16_32;
j=uasm.table_16_32_entries-1;
}
while (TRUE) {
k=(i+j)>>1; //binary search
tempi=uasm.table[k];
//DumpUasmIns(tempi);
tempi=table[k];
//DumpUAsmIns(tempi);
m=0;
n=0;
while (TRUE) {
@@ -101,8 +115,8 @@ CInstruction *InstEntryFind(U8 *ip,I64 opsize)
sv=tempi->slash_val;
if (sv<8) {
if (!(m=ip[n]>>3&7-sv)) {
if ((Bt(&uasm.mem_mask,a1) || Bt(&uasm.mem_mask,a2)) &&
ip[n]&0xC0==0xC0) {
if ((Bt(&uasm.mem_arg_mask,a1) || Bt(&uasm.mem_arg_mask,a2)) &&
ip[n]&0xC0==0xC0) {
m=1;
break;
} else if (tempi->flags&IEF_STI) {
@@ -125,11 +139,13 @@ CInstruction *InstEntryFind(U8 *ip,I64 opsize)
break;
}
}
if (opsize==64||a1==ARGT_M64||a2==ARGT_M64||tempi->flags&IEF_NO_REX) {
if (!Bt(&uasm.ins64_mask,a1) && !Bt(&uasm.ins64_mask,a2) && !(tempi->flags&IEF_48_REX))
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))
m=1;
} else {
if (Bt(&uasm.ins64_mask,a1) || Bt(&uasm.ins64_mask,a2) || tempi->flags&IEF_48_REX)
if (Bt(&uasm.ins64_arg_mask,a1) || Bt(&uasm.ins64_arg_mask,a2) ||
tempi->flags&IEF_48_REX)
m=-1;
}
}
@@ -147,18 +163,20 @@ CInstruction *InstEntryFind(U8 *ip,I64 opsize)
}
}
if (opsize==64 || a1==ARGT_M64 || a2==ARGT_M64) {
if (!Bt(&uasm.ins64_mask,a1) && !Bt(&uasm.ins64_mask,a2) && !(tempi->flags&IEF_48_REX)&&
!(a2==ARGT_NO &&
(ARGT_UIMM8<=a1<=ARGT_UIMM64 ||
ARGT_IMM8<=a1<=ARGT_IMM64 ) ))
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) {
if (a2!=ARGT_IMM64&&a2!=ARGT_UIMM64)
m=1;
} else if (a2==ARGT_IMM64||a2==ARGT_UIMM64)
m=-1;
m=-1;
} else {
if (Bt(&uasm.ins64_mask,a1) || Bt(&uasm.ins64_mask,a2) || tempi->flags&IEF_48_REX)
if (Bt(&uasm.ins64_arg_mask,a1) || Bt(&uasm.ins64_arg_mask,a2) ||
tempi->flags&IEF_48_REX)
m=-1;
}
}
@@ -181,41 +199,30 @@ CInstruction *InstEntryFind(U8 *ip,I64 opsize)
} else
break;
}
return uasm.table[k];
return table[k];
}
U0 UasmHashLoad()
U0 UAsmHashLoad()
{
CHashOpcode *temph;
CInstruction *tempi;
I64 i,j,k,cnt=0;
I64 i,j1,j2,k;
uasm.table=NULL;
uasm.table_entries=0;
uasm.ins64_mask=0x0880888880+1<<ARGT_ST0+1<<ARGT_STI;
uasm.ins64_arg_mask=0x0880888880+1<<ARGT_ST0+1<<ARGT_STI;
uasm.signed_arg_mask=1<<ARGT_REL8+1<<ARGT_REL16+1<<ARGT_REL32+
1<<ARGT_IMM8+1<<ARGT_IMM16+1<<ARGT_IMM32+1<<ARGT_IMM64;
uasm.mem_mask=1<<ARGT_M8+1<<ARGT_M16+1<<ARGT_M32+1<<ARGT_M64;
uasm.mem_arg_mask=1<<ARGT_M8+1<<ARGT_M16+1<<ARGT_M32+1<<ARGT_M64;
for (i=0;i<=cmp.asm_hash->mask;i++) {
temph=cmp.asm_hash->body[i];
while (temph) {
if (temph->type==HTT_OPCODE)
cnt+=temph->instruction_entry_cnt;
temph=temph->next;
}
}
uasm.table_entries=cnt;
j=0;
uasm.table=MAlloc(cnt*sizeof(U8 *));
uasm.table_16_32_entries=uasm.table_64_entries=0;
for (i=0;i<=cmp.asm_hash->mask;i++) {
temph=cmp.asm_hash->body[i];
while (temph) {
if (temph->type==HTT_OPCODE) {
tempi=&temph->ins;
for (k=0;k<temph->instruction_entry_cnt;k++) {
uasm.table[j++]=tempi;
uasm.table_16_32_entries++;
if (!(tempi->flags&IEF_NOT_IN_64_BIT))
uasm.table_64_entries++;
tempi++;
}
}
@@ -223,20 +230,26 @@ U0 UasmHashLoad()
}
}
QSortI64(uasm.table,cnt,&InstEntriesCompare);
}
I64 StrMatchBits(U8 *st)
{
if (StrMatch("8",st))
return 8;
if (StrMatch("16",st))
return 16;
if (StrMatch("32",st))
return 32;
if (StrMatch("64",st))
return 64;
return 0;
j1=j2=0;
uasm.table_16_32=MAlloc(uasm.table_16_32_entries*sizeof(U8 *));
uasm.table_64 =MAlloc(uasm.table_64_entries *sizeof(U8 *));
for (i=0;i<=cmp.asm_hash->mask;i++) {
temph=cmp.asm_hash->body[i];
while (temph) {
if (temph->type==HTT_OPCODE) {
tempi=&temph->ins;
for (k=0;k<temph->instruction_entry_cnt;k++) {
uasm.table_16_32[j1++]=tempi;
if (!(tempi->flags&IEF_NOT_IN_64_BIT))
uasm.table_64[j2++]=tempi;
tempi++;
}
}
temph=temph->next;
}
}
QSortI64(uasm.table_16_32,uasm.table_16_32_entries,&InstEntriesCompare);
QSortI64(uasm.table_64 ,uasm.table_64_entries ,&InstEntriesCompare);
}
U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
@@ -249,7 +262,8 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
Bool cont;
CInstruction *tempi,*tempi2;
CHashOpcode *tempo;
U8 *ip=*_ip,*ptr,*reloced_a1_st,*reloced_a2_st,*bin_data_area1,*bin_data_area2,
U8 *ip=*_ip,*ptr,*reloced_a1_st,*reloced_a2_st,
*bin_data_area1,*bin_data_area2,
line1[512],line2[512],buf2[512],a1_st[512],a2_st[512],seg_overrides[32];
if (_jmp_dst) *_jmp_dst=-1;
@@ -283,14 +297,20 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
*seg_overrides=0;
cont=TRUE;
do {
switch (*ip++) {
case 0x2E: if (StrLen(seg_overrides)<24) CatPrint(seg_overrides,"CS:"); break;
case 0x36: if (StrLen(seg_overrides)<24) CatPrint(seg_overrides,"SS:"); break;
case 0x3E: if (StrLen(seg_overrides)<24) CatPrint(seg_overrides,"DS:"); break;
case 0x26: if (StrLen(seg_overrides)<24) CatPrint(seg_overrides,"ES:"); break;
case 0x64: if (StrLen(seg_overrides)<24) CatPrint(seg_overrides,"FS:"); break;
case 0x65: if (StrLen(seg_overrides)<24) CatPrint(seg_overrides,"GS:"); break;
while (TRUE) {
switch (*ip) {
case 0x2E: if (StrLen(seg_overrides)<24)
CatPrint(seg_overrides,"CS:"); break;
case 0x36: if (StrLen(seg_overrides)<24)
CatPrint(seg_overrides,"SS:"); break;
case 0x3E: if (StrLen(seg_overrides)<24)
CatPrint(seg_overrides,"DS:"); break;
case 0x26: if (StrLen(seg_overrides)<24)
CatPrint(seg_overrides,"ES:"); break;
case 0x64: if (StrLen(seg_overrides)<24)
CatPrint(seg_overrides,"FS:"); break;
case 0x65: if (StrLen(seg_overrides)<24)
CatPrint(seg_overrides,"GS:"); break;
case OC_OP_SIZE_PREFIX:
if (opsize==16)
opsize=32;
@@ -303,25 +323,28 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
else
opadd=16;
break;
sub_switch_start:
case 0x48...0x4F:
opsize=64;
case 0x40...0x47:
sub_switch_end:
REX=*(ip-1);
REX_b=Bt(&REX,0)<<3;
REX_x=Bt(&REX,1)<<3;
REX_r=Bt(&REX,2)<<3;
break;
case 0x40...0x4F:
if (seg_size==64) {
REX=*ip;
if (REX>=0x48)
opsize=64;
REX_b=Bt(&REX,0)<<3;
REX_x=Bt(&REX,1)<<3;
REX_r=Bt(&REX,2)<<3;
break;
} //Fall thru if !64
default:
cont=FALSE;
}
} while (cont);
ip--;
if (cont)
ip++;
else
break;
}
tempi=InstEntryFind(ip,opsize);
tempi=InstEntryFind(ip,opsize,seg_size);
if (opsize==32 && seg_size==64) {
tempi2=InstEntryFind(ip,64);
tempi2=InstEntryFind(ip,64,seg_size);
if (tempi2!=tempi &&
tempi2->flags&IEF_REX_ONLY_R8_R15 ||
tempi2->flags&IEF_REX_XOR_LIKE&& ip[1]>>3&7==ip[1]&7)
@@ -329,7 +352,8 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
}
ip+=tempi->opcode_cnt;
tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInstruction)-offset(CHashOpcode.ins);
tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInstruction)
-offset(CHashOpcode.ins);
if (just_ins)
*line1=0;
CatPrint(line1,tempo->str);
@@ -337,14 +361,14 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
a1=tempi->arg1;
a2=tempi->arg2;
if (a1_size=StrMatchBits(DefineSub(a1,"ST_ARG_TYPES"))) {
if (a1_size=tempi->size1) {
if (Bt(&uasm.signed_arg_mask,a1))
CatPrint(a1_st,"I%d ",a1_size);
else
CatPrint(a1_st,"U%d ",a1_size);
}
if (a2_size=StrMatchBits(DefineSub(a2,"ST_ARG_TYPES"))) {
if (a2_size=tempi->size2) {
if (Bt(&uasm.signed_arg_mask,a2))
CatPrint(a2_st,"I%d ",a2_size);
else
@@ -571,7 +595,8 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
break;
case ARGT_STI:
ip--;
CatPrint(a1_st,"%Z",*ip++ - tempi->opcode[tempi->opcode_cnt-1],"ST_FSTK_REGS");
CatPrint(a1_st,"%Z",*ip++ - tempi->opcode[tempi->opcode_cnt-1],
"ST_FSTK_REGS");
break;
}
@@ -609,7 +634,8 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
break;
case ARGT_STI:
ip--;
CatPrint(a2_st,"%Z",*ip++ - tempi->opcode[tempi->opcode_cnt-1],"ST_FSTK_REGS");
CatPrint(a2_st,"%Z",*ip++ -tempi->opcode[tempi->opcode_cnt-1],
"ST_FSTK_REGS");
break;
}
if (tempi->flags&IEF_ENDING_ZERO)