TempleOSCDV4.05.ISO

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

No files matched your search

Binary file not shown.
+7
View File
@@ -106,6 +106,13 @@ Bool ClassRep2(CDoc *doc,U8 *_d,U8 *class_name=lastclass,
} else
DocPrint(doc,"%08X ",*ptr(U32 *)++);
break;
case RT_U64:
if (dynamic) {
doc_e=DocPrint(doc,"$$DA-TRM+RD+UD,RT=U64,A=\"%%08X\"$$ ");
doc_e->data=ptr(U64 *)++;
} else
DocPrint(doc,"%08X ",*ptr(U64 *)++);
break;
case RT_F64:
if (dynamic) {
doc_e=DocPrint(doc,"$$DA-TRM+RD+UD,RT=F64,A=\"%%16g\"$$ ");
+2 -2
View File
@@ -11,8 +11,8 @@ U0 LoadDocDefines()
//This is cut and replaced when I generate a distro.
//See $LK,"DD_TEMPLEOS_LOC",A="FF:::/Demo/AcctExample/TOSDistro.CPP,DD_TEMPLEOS_LOC"$.
$TR-C,"LineRep"$
$ID,4$DefinePrint("DD_TEMPLEOS_LOC","119,708");
DefinePrint("DD_TEMPLEOS_LOC_OFFICIAL","80,702");
$ID,4$DefinePrint("DD_TEMPLEOS_LOC","119,248");
DefinePrint("DD_TEMPLEOS_LOC_OFFICIAL","79,899");
$ID,-4$
DefinePrint("DD_KERNEL","%08X",bfh);
bfh(I64)+=bfh->file_size-1;
+8 -7
View File
@@ -385,7 +385,7 @@ I64 EdFindReplace(CDoc *doc)
Bool found,unlock;
I64 cmd,i,j,plen,rlen,dlen,result=-1,sf_flags;
U8 *src,*dst,*dst2;
CDocEntry *doc_ce=doc->cur_entry,*doc_e;
CDocEntry *doc_ce,*doc_e,*doc_marker=NULL;
if (doc->find_replace->pmt)
cmd=RSAC_REPLACE;
else
@@ -448,10 +448,8 @@ I64 EdFindReplace(CDoc *doc)
goto fr_unlock_done;
}
if (doc->find_replace->local_var) {
if (doc->find_replace->local_var)
EdSelectFun(doc);
doc_ce=doc->cur_entry;
}
if (!doc->find_replace->replace && !doc->find_replace->local_var) {
EdFindNext(doc);
@@ -462,14 +460,15 @@ I64 EdFindReplace(CDoc *doc)
goto fr_unlock_done;
rlen=StrLen(doc->find_replace->replace_text);
if (doc->root.next!=doc) {
doc_e=doc_ce;
doc_e=doc_marker=DocSplitTag(doc,doc->cur_entry,doc->cur_col,
doc->cur_entry->x+doc->cur_col,doc->cur_entry->y,DOCT_MARKER);
do {
if (doc_e==doc) {
if (doc->find_replace->scan_fwd)
doc_e=doc_e->next;
else
doc_e=doc_e->last;
if (doc_e==doc_ce)
if (doc_e==doc_marker)
break;
}
if (doc_e->type_u8==DOCT_TEXT &&
@@ -527,9 +526,11 @@ I64 EdFindReplace(CDoc *doc)
doc_e=doc_e->next;
else
doc_e=doc_e->last;
} while (doc_e!=doc_ce);
} while (doc_e!=doc_marker);
}
fr_unlock_done:
if (doc_marker)
DocEntryDel(doc,doc_marker);
DocRemSoftNewLines(doc,NULL);
DocRecalc(doc);
DocCenter(doc);
+23 -3
View File
@@ -213,7 +213,7 @@ public Bool DocForm(U8 *_d,U8 *class_name=lastclass,
CMemberLst *ml;
CDocEntry *doc_e;
U8 *fmtstr;
CHashClass *tempc;
CHashClass *tempc,*tempc2;
CDoc *doc;
Bool result=FALSE;
I64 old_border_src=Fs->border_src,has_action;
@@ -227,8 +227,28 @@ public Bool DocForm(U8 *_d,U8 *class_name=lastclass,
doc->flags|=DOCF_MIN_SIZE;
ml=tempc->member_lst_and_root;
while (ml) {
if (fmtstr=MemberMetaData("fmtstr",ml)) {
doc_e=DocPrint(doc,"%s",fmtstr);
if ((fmtstr=MemberMetaData("fmtstr",ml)) &&
(doc_e=DocPrint(doc,"%s",fmtstr))) {
tempc2=ml->member_class;
if ((doc_e->type_u8==DOCT_DATA || doc_e->type_u8==DOCT_LST ||
doc_e->type_u8==DOCT_CHECK_BOX) && !tempc2->ptr_stars_cnt) {
tempc2=OptClassFwd(tempc2);
tempc2-=tempc2->ptr_stars_cnt;
if (tempc2->type & HTT_INTERNAL_TYPE) {
if (ml->dim.next) { //Array
if (tempc2->raw_type==RT_U8 &&
LBtr(&doc_e->de_flags,&DOCEf_DFT_LEN)) {
doc_e->len=ml->dim.total_cnt;
if (doc_e->de_flags&DOCEF_HAS_TERMINATOR)
doc_e->len--;
Free(doc_e->tag); //See $LK,"DataTagWidth",A="FA:::/Adam/DolDoc/DocPlain.CPP,DataTagWidth"$
doc_e->tag=MAlloc(doc_e->len+doc_e->min_col+2,
doc->mem_task); //+2 because "_\0"
}
} else if (LBtr(&doc_e->de_flags,DOCEf_DFT_RAW_TYPE))
doc_e->raw_type=tempc2->raw_type;
}
}
if (doc_e->de_flags&DOCEF_REMALLOC_DATA) {
doc_e->user_data=_d+ml->offset;
doc_e->data=*doc_e->user_data(U8 **);
+10 -10
View File
@@ -53,16 +53,16 @@ public I64 PopUpColorLighting(U8 *header=NULL)
class CTransformForm
{
F64 x_scale fmtstr "$$DA-TRM,RT=F64,A=\"X Scale :%12.6f\"$$\n";
F64 y_scale fmtstr "$$DA-TRM,RT=F64,A=\"Y Scale :%12.6f\"$$\n";
F64 z_scale fmtstr "$$DA-TRM,RT=F64,A=\"Z Scale :%12.6f\"$$\n";
F64 é_z fmtstr
"\nAngles are in degrees\n$$DA-TRM,RT=F64,A=\"Z-Axis :%12.6f\"$$\n";
F64 é_y fmtstr "$$DA-TRM,RT=F64,A=\"Y-Axis :%12.6f\"$$\n";
F64 é_x fmtstr "$$DA-TRM,RT=F64,A=\"X-Axis :%12.6f\"$$\n";
F64 x_offset fmtstr "\n$$DA-TRM,RT=F64,A=\"X Offset:%12.6f\"$$\n";
F64 y_offset fmtstr "$$DA-TRM,RT=F64,A=\"Y Offset:%12.6f\"$$\n";
F64 z_offset fmtstr "$$DA-TRM,RT=F64,A=\"Z Offset:%12.6f\"$$\n";
F64 x_scale fmtstr "$$DA-TRM,A=\"X Scale :%12.6f\"$$\n";
F64 y_scale fmtstr "$$DA-TRM,A=\"Y Scale :%12.6f\"$$\n";
F64 z_scale fmtstr "$$DA-TRM,A=\"Z Scale :%12.6f\"$$\n";
F64 é_z fmtstr "\nAngles are in degrees\n"
"$$DA-TRM,A=\"Z-Axis :%12.6f\"$$\n";
F64 é_y fmtstr "$$DA-TRM,A=\"Y-Axis :%12.6f\"$$\n";
F64 é_x fmtstr "$$DA-TRM,A=\"X-Axis :%12.6f\"$$\n";
F64 x_offset fmtstr "\n$$DA-TRM,A=\"X Offset:%12.6f\"$$\n";
F64 y_offset fmtstr "$$DA-TRM,A=\"Y Offset:%12.6f\"$$\n";
F64 z_offset fmtstr "$$DA-TRM,A=\"Z Offset:%12.6f\"$$\n";
};
Bool PopUpTransform(I64 *r)
+5 -5
View File
@@ -7,7 +7,7 @@ U0 DocInit()
CHashGeneric *temph;
DefineLstLoad("ST_DOC_CMDS",
"TX\0CR\0SR\0CU\0TB\0CL\0PB\0PL\0LM\0RM\0HD\0FO\0ID\0FG\0"
"TX\0CR\0SR\0CU\0MK\0TB\0CL\0PB\0PL\0LM\0RM\0HD\0FO\0ID\0FG\0"
"BG\0FD\0BD\0PT\0WW\0UL\0IV\0BK\0SX\0SY\0CM\0AN\0LK\0BT\0"
"DA\0CB\0LS\0MA\0MU\0HX\0TR\0SP\0IB\0IS\0SO\0HL\0HC\0ER\0");
DefineLstLoad("ST_DOC_FLAGS",
@@ -15,7 +15,7 @@ U0 DocInit()
"LC\0LA\0RC\0RA\0LX\0CX\0RX\0TY\0CY\0BY\0"
"HL\0WW\0BK\0IV\0SEL\0UL\0"
"TC\0PRY\0MRX\0WR\0L\0X\0Q\0FST\0B\0S\0BD\0C\0CA\0RD\0UD\0P\0M\0"
"TRM\0Z\0H\0TR\0LS\0SK\0PU\0SIF\0FS\0NC\0DD\0");
"TRM\0Z\0H\0TR\0LS\0SK\0PU\0SIF\0FS\0NC\0DD\0DL\0DRT\0");
DefineLstLoad("ST_LINK_TYPES",
"FI\0FA\0FF\0FL\0MN\0PI\0PF\0PL\0BF\0DN\0HI\0AD\0AI\0AA\0AF\0AL\0");
@@ -26,9 +26,9 @@ U0 DocInit()
MemSet(doldoc.dft_de_flags, 0,sizeof(doldoc.dft_de_flags));
MemSet(doldoc.dft_type_flags, 0,sizeof(doldoc.dft_type_flags));
cc=CmpCtrlNew("TX+T;DA+P+TRM+T;CM+LE+RE;AN+T;LK+L+UL+T;MA+X+UL+T;MU+X+UL+T;"
"BT+X+B+T;CB+CA+P+T;LS+LS+P+T;HX+P+Z;TR+TR+C+CA+UL+T;SP+T;IB+T;IS+T;"
"SO+T;HC+T;",CCF_DONT_FREE_BUF);
cc=CmpCtrlNew("TX+T;DA+P+TRM+T+DL+DRT;CM+LE+RE;AN+T;LK+L+UL+T;MA+X+UL+T;"
"MU+X+UL+T;BT+X+B+T;CB+CA+P+T+DRT;LS+LS+P+T+DRT;HX+P+Z;TR+TR+C+CA+UL+T;"
"SP+T;IB+T;IS+T;SO+T;HC+T;",CCF_DONT_FREE_BUF);
cc->htc.hash_table_lst=NULL;
Lex(cc);
while (cc->token==TK_IDENT) {
+5 -3
View File
@@ -338,9 +338,10 @@ CDocEntry *PrsDollarCmd(CDoc *doc,U8 *st)
}
break;
case DOCEf_LEN:
if (cc->token)
if (cc->token) {
doc_e->len=LexExpression(cc);
else
doc_e->de_flags&=~DOCEF_DFT_LEN;
} else
goto pd_err;
break;
case DOCEf_AUX_STR:
@@ -349,7 +350,7 @@ CDocEntry *PrsDollarCmd(CDoc *doc,U8 *st)
doc_e->aux_str=StrNew(st2,doc->mem_task);
Free(st2);
//$AN,"Anchor",A="DataTagWidth"$
if (i==DOCT_DATA) {
if (i==DOCT_DATA) { //See $LK,"DocForm",A="MN:DocForm"$()
if (ptr=StrMatch(":",doc_e->aux_str))
doc_e->min_col=ptr-doc_e->aux_str+1;
doc_e->tag=MAlloc(doc_e->len+doc_e->min_col+2,
@@ -430,6 +431,7 @@ CDocEntry *PrsDollarCmd(CDoc *doc,U8 *st)
if (j<0)
goto pd_err;
doc_e->raw_type=j;
doc_e->de_flags&=~DOCEF_DFT_RAW_TYPE;
Lex(cc);
} else
goto pd_err;
+3 -2
View File
@@ -2,8 +2,8 @@
CDocEntry *DocPutS(CDoc *doc,U8 *st)
{//Don't use this. Use $LK-UL,"DocPrint",A="MN:DocPrint"$().
//Does not handle partial Doc entries
//Returns last newly created dollar-sign CDocEntry.
//Does not handle partial Doc entries.
//Returns last newly created dollar-sign CDocEntry or NULL.
U8 *ptr=st,*ptr2,*st2,*ptr3,*ptr4,*src,
*char_bitmap;
Bool unlock;
@@ -157,6 +157,7 @@ CDocEntry *DocPutS(CDoc *doc,U8 *st)
public CDocEntry *DocPrint(CDoc *doc=NULL,U8 *fmt,...)
{//You must not print partial doc cmds.
//Returns last newly created dollar-sign CDocEntry or NULL.
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
CDocEntry *result=DocPutS(doc,buf);
Free(buf);
+8 -2
View File
@@ -129,9 +129,12 @@ U0 DocRecalcXY(CDoc *doc,CDocEntry *doc_e,
}
CDocEntry *DocSplitTag(CDoc *doc,CDocEntry *doc_e,I64 i,I64 x,I64 y,I64 type_u8)
{//Split tag at i, insert DOCT_SOFT_NEW_LINE or DOCT_CURSOR
{//Split tag at i, insert DOCT_SOFT_NEW_LINE, DOCT_MARKER or DOCT_CURSOR
U8 *ptr;
CDocEntry *doc_e2=MAllocIdentical(doc_e,doc->mem_task);
CDocEntry *doc_e2;
if (doc_e->type_u8==DOCT_TEXT && i) {
if (i<StrLen(doc_e->tag)) {
doc_e2=MAllocIdentical(doc_e,doc->mem_task);
doc_e2->tag=StrNew(doc_e->tag+i,doc->mem_task);
doc_e2->de_flags=doc_e->de_flags&~DOCEG_HAS_ALLOC|DOCEF_TAG;
QueIns(doc_e2,doc_e);
@@ -143,6 +146,9 @@ CDocEntry *DocSplitTag(CDoc *doc,CDocEntry *doc_e,I64 i,I64 x,I64 y,I64 type_u8)
ptr=StrNew(doc_e->tag,doc->mem_task);
Free(doc_e->tag);
doc_e->tag=ptr;
}
} else
doc_e=doc_e->last;
doc_e2=DocEntryNewBase(doc,type_u8|doc_e->type & 0xFFFFFF00,
doc_e->de_flags&~DOCEG_HAS_ARG,x,y,doc_e->page_line_num);
MemCpy(&doc_e2->settings,&doc_e->settings,sizeof(CDocSettings));
+67 -80
View File
@@ -31,12 +31,12 @@ I64 PopUpLinkType(Bool include_anchor)
class CEdFileLink
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,LEN=511,A=\"File :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,A=\"File :%s\"$$\n";
I64 book;
U8 aux[512];
I64 num;
U8 html_link[512] fmtstr "$$DA-P,LEN=511,A=\"Html Link :%s\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
quote fmtstr "$$CB,\"Quote\"$$\n",
hide;
@@ -44,12 +44,12 @@ class CEdFileLink
class CEdFileAnchorLink
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,LEN=511,A=\"File :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,A=\"File :%s\"$$\n";
I64 book;
U8 aux[512] fmtstr "$$DA-P,LEN=511,A=\"Anchor Label :%s\"$$\n";
U8 aux[512] fmtstr "$$DA-P,A=\"Anchor Label :%s\"$$\n";
I64 num;
U8 html_link[512] fmtstr "$$DA-P,LEN=511,A=\"Html Link :%s\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
quote fmtstr "$$CB,\"Quote\"$$\n",
hide;
@@ -57,12 +57,12 @@ class CEdFileAnchorLink
class CEdFileFindLink
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,LEN=511,A=\"File :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,A=\"File :%s\"$$\n";
I64 book;
U8 aux[512] fmtstr "$$DA-P,LEN=511,A=\"Str :%s\"$$\n";
U8 aux[512] fmtstr "$$DA-P,A=\"Str :%s\"$$\n";
I64 num fmtstr "$$DA-TRM,A=\"Occurrence Num:%04d\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,LEN=511,A=\"Html Link :%s\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
quote fmtstr "$$CB,\"Quote\"$$\n",
hide;
@@ -70,12 +70,12 @@ class CEdFileFindLink
class CEdFileLineLink
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,LEN=511,A=\"File :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,A=\"File :%s\"$$\n";
I64 book;
U8 aux[512];
I64 num fmtstr "$$DA-TRM,A=\"Line Num :%04d\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,LEN=511,A=\"Html Link :%s\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
quote fmtstr "$$CB,\"Quote\"$$\n",
hide;
@@ -83,12 +83,12 @@ class CEdFileLineLink
class CEdManPageLink
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n",
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n",
file[512];
I64 book;
U8 aux[512] fmtstr "$$DA-P,LEN=511,A=\"Label :%s\"$$\n";
U8 aux[512] fmtstr "$$DA-P,A=\"Label :%s\"$$\n";
I64 num;
U8 html_link[512] fmtstr "$$DA-P,LEN=511,A=\"Html Link :%s\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
quote fmtstr "$$CB,\"Quote\"$$\n",
hide;
@@ -96,12 +96,12 @@ class CEdManPageLink
class CEdAddrLink
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n",
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n",
file[512];
I64 book;
U8 aux[512] fmtstr "$$DA-P,LEN=511,A=\"Addr Exp :%s\"$$\n";
U8 aux[512] fmtstr "$$DA-P,A=\"Addr Exp :%s\"$$\n";
I64 num fmtstr "$$DA-TRM,A=\"Bin Size :%04d\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,LEN=511,A=\"Html Link :%s\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
quote fmtstr "$$CB,\"Quote\"$$\n",
hide;
@@ -109,12 +109,12 @@ class CEdAddrLink
class CEdPlaceAnchor
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n",
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n",
file[512];
I64 book;
U8 aux[512] fmtstr "$$DA-P,LEN=511,A=\"Anchor Label :%s\"$$\n";
U8 aux[512] fmtstr "$$DA-P,A=\"Anchor Label :%s\"$$\n";
I64 num;
U8 html_link[512] fmtstr "$$DA-P,LEN=511,A=\"Html Link :%s\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,A=\"Html Link :%s\"$$\n";
Bool pop_up,
quote fmtstr "$$CB,\"Quote\"$$\n",
hide fmtstr "$$CB,\"Hide\"$$\n";
@@ -122,13 +122,13 @@ class CEdPlaceAnchor
class CEdBibleLink
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n",
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n",
file[512];
I64 book fmtstr "$$LS,D=\"ST_BIBLE_BOOKS\"$$\n";
U8 aux[512] fmtstr "$$DA-P,LEN=511,A=\"Chapter Verse :%s\"$$\n";
U8 aux[512] fmtstr "$$DA-P,A=\"Chapter Verse :%s\"$$\n";
I64 num;
U8 html_link[512] fmtstr "$$DA-P,LEN=511,A=\"Html Link :%s\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
quote fmtstr "$$CB,\"Quote\"$$\n",
hide;
@@ -136,12 +136,12 @@ class CEdBibleLink
class CEdDefLink
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n",
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n",
file[512];
I64 book;
U8 aux[512] fmtstr "$$DA-P,LEN=511,A=\"Word :%s\"$$\n";
U8 aux[512] fmtstr "$$DA-P,A=\"Word :%s\"$$\n";
I64 num fmtstr "$$DA-TRM,A=\"Def Num :%4d\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,LEN=511,A=\"Html Link :%s\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
quote fmtstr "$$CB,\"Quote\"$$\n",
hide;
@@ -149,12 +149,12 @@ class CEdDefLink
class CEdProject
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,LEN=511,A=\"File :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,A=\"File :%s\"$$\n";
I64 book;
U8 aux[512];
I64 num;
U8 html_link[512] fmtstr "$$DA-P,LEN=511,A=\"Html Link :%s\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
quote fmtstr "$$CB,\"Quote\"$$\n",
hide;
@@ -433,13 +433,13 @@ U0 EdInsColor()
class CEdPageSetting1
{
U8 val[512] fmtstr "$$DA-P,LEN=511,A=\"Setting Val:%s\"$$\n";
U8 val[512] fmtstr "$$DA-P,A=\"Setting Val:%s\"$$\n";
Bool winrel;
};
class CEdPageSetting2
{
U8 val[512] fmtstr "$$DA-P,LEN=511,A=\"Setting Val:%s\"$$\n";
U8 val[512] fmtstr "$$DA-P,A=\"Setting Val:%s\"$$\n";
Bool winrel fmtstr "$$CB,\"Win Relative\"$$\n";
};
@@ -507,7 +507,7 @@ I64 PopUpWidgetType()
class CEdText
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n";
Bool left_x fmtstr "$$CB,\"Left X\"$$\n",
center_x fmtstr "$$CB,\"Center X\"$$\n",
right_x fmtstr "$$CB,\"Right X\"$$\n",
@@ -517,16 +517,11 @@ class CEdText
underline fmtstr "$$CB,\"Underline\"$$\n",
tree fmtstr "$$CB,\"Tree\"$$\n",
collapsed fmtstr "$$CB,\"Collapsed\"$$\n";
U8 scroll_x [512]
fmtstr "$$DA-P,LEN=511,A=\"Scroll X Length Expression:%s\"$$\n",
shift_x [512]
fmtstr "$$DA-P,LEN=511,A=\"X Offset Expression :%s\"$$\n",
shift_y [512]
fmtstr "$$DA-P,LEN=511,A=\"Y Offset Expression :%s\"$$\n",
define_str[512]
fmtstr "$$DA-P,LEN=511,A=\"Define Str :%s\"$$\n",
html_link[512]
fmtstr "$$DA-P,LEN=511,A=\"Html Link :%s\"$$\n";
U8 scroll_x [512] fmtstr "$$DA-P,A=\"Scroll X Length Expression:%s\"$$\n",
shift_x [512] fmtstr "$$DA-P,A=\"X Offset Expression :%s\"$$\n",
shift_y [512] fmtstr "$$DA-P,A=\"Y Offset Expression :%s\"$$\n",
define_str[512] fmtstr "$$DA-P,A=\"Define Str :%s\"$$\n",
html_link[512] fmtstr "$$DA-P,A=\"Html Link :%s\"$$\n";
};
U0 EdInsText()
@@ -570,8 +565,8 @@ U0 EdInsText()
class CEdSong
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n",
song[512] fmtstr "$$DA-P,LEN=511,A=\"Song :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n",
song[512] fmtstr "$$DA-P,A=\"Song :%s\"$$\n";
};
U0 EdInsSong()
@@ -584,7 +579,7 @@ U0 EdInsSong()
class CEdHtmlCode
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Html Code:%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Html Code:%s\"$$\n";
};
U0 EdInsHtml()
@@ -597,12 +592,9 @@ U0 EdInsHtml()
class CEdMacroMenu
{
U8 tag[512]
fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n",
left_macro[512]
fmtstr "$$DA-P,LEN=511,A=\"Left Click Macro :%s\"$$\n",
left_exp[512]
fmtstr "$$DA-P,LEN=511,A=\"Left Click Expression :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n",
left_macro[512] fmtstr "$$DA-P,A=\"Left Click Macro :%s\"$$\n",
left_exp[512] fmtstr "$$DA-P,A=\"Left Click Expression :%s\"$$\n";
Bool popup fmtstr "$$CB,\"PopUp\"$$\n",
left_is_auto fmtstr "$$CB,\"Left is AutoStr\"$$\n",
left_x fmtstr "$$CB,\"Left X \"$$\n",
@@ -613,12 +605,9 @@ class CEdMacroMenu
invert fmtstr "$$CB,\"Invert\"$$\n",
underline fmtstr "$$CB,\"Underline\"$$\n",
escape fmtstr "$$CB,\"Escape\"$$\n";
U8 scroll_x[512]
fmtstr "$$DA-P,LEN=511,A=\"Scroll X Length Expression:%s\"$$\n",
shift_x[512]
fmtstr "$$DA-P,LEN=511,A=\"X Offset Expression :%s\"$$\n",
shift_y[512]
fmtstr "$$DA-P,LEN=511,A=\"Y Offset Expression :%s\"$$\n";
U8 scroll_x[512] fmtstr "$$DA-P,A=\"Scroll X Length Expression:%s\"$$\n",
shift_x[512] fmtstr "$$DA-P,A=\"X Offset Expression :%s\"$$\n",
shift_y[512] fmtstr "$$DA-P,A=\"Y Offset Expression :%s\"$$\n";
};
U0 EdInsMacroMenu(Bool is_macro)
@@ -673,17 +662,16 @@ U0 EdInsMacroMenu(Bool is_macro)
class CEdButton
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n";
Bool popup fmtstr "$$CB,\"PopUp\"$$\n",
left_x fmtstr "$$CB,\"Left X \"$$\n",
center_x fmtstr "$$CB,\"Center X \"$$\n",
right_x fmtstr "$$CB,\"Right X \"$$\n",
margin_rel fmtstr "$$CB,\"Margin Rel X\"$$\n",
escape fmtstr "$$CB,\"Escape\"$$\n";
U8 left_macro[512] fmtstr "$$DA-P,LEN=511,A=\"Left Click Macro:%s\"$$\n";
U8 left_macro[512] fmtstr "$$DA-P,A=\"Left Click Macro:%s\"$$\n";
Bool left_is_auto fmtstr "$$CB,\"Left is AutoStr\"$$\n";
U8 left_exp[512] fmtstr "$$DA-P,LEN=511,"
"A=\"Left Click Expression:%s\"$$\n";
U8 left_exp[512] fmtstr "$$DA-P,A=\"Left Click Expression:%s\"$$\n";
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
};
@@ -734,8 +722,8 @@ U0 EdInsButton()
class CEdCursorMovement
{
U8 left_exp[512] fmtstr "$$DA-P,LEN=511,A=\"X Expression (LE):%s\"$$\n",
right_exp[512] fmtstr "$$DA-P,LEN=511,A=\"Y Expression (RE):%s\"$$\n";
U8 left_exp[512] fmtstr "$$DA-P,A=\"X Expression (LE):%s\"$$\n",
right_exp[512] fmtstr "$$DA-P,A=\"Y Expression (RE):%s\"$$\n";
Bool left_x fmtstr "$$CB,\"Left X \"$$\n",
center_x fmtstr "$$CB,\"Center X \"$$\n",
right_x fmtstr "$$CB,\"Right X \"$$\n",
@@ -779,7 +767,7 @@ U0 EdInsCursorMovement()
class CEdDataNum
{
U8 fmt_str[512] fmtstr "$$DA-P,LEN=511,A=\"Format Str:%s\"$$\n";
U8 fmt_str[512] fmtstr "$$DA-P,A=\"Format Str:%s\"$$\n";
I64 len;
Bool term fmtstr "$$CB,\"Form Field Terminator\"$$\n",
remalloc,
@@ -789,7 +777,7 @@ class CEdDataNum
class CEdDataStr
{
U8 fmt_str[512] fmtstr "$$DA-P,LEN=511,A=\"Format Str:%s\"$$\n";
U8 fmt_str[512] fmtstr "$$DA-P,A=\"Format Str:%s\"$$\n";
I64 len fmtstr "$$DA,A=\"Length:%d\"$$\n";
Bool term fmtstr "$$CB,\"Zero Terminator\"$$\n",
remalloc fmtstr "$$CB,\"Remalloc for Unlimited Length\"$$\n",
@@ -845,7 +833,7 @@ U0 EdInsData()
class CEdCheckBox
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n";
Bool refresh fmtstr "$$CB,\"Refresh Data\"$$\n";
I64 type fmtstr "$$LS,D=\"ST_INT_SIZE_TYPES\"$$\n";
};
@@ -872,8 +860,8 @@ U0 EdInsCheckBox()
class CEdLst
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Dft Select :%s\"$$\n",
define_str[512] fmtstr "$$DA-P,LEN=511,A=\"Define Str :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Dft Select :%s\"$$\n",
define_str[512] fmtstr "$$DA-P,A=\"Define Str :%s\"$$\n";
Bool refresh fmtstr "$$CB,\"Refresh Data\"$$\n";
I64 type fmtstr "$$LS,D=\"ST_INT_SIZE_TYPES\"$$\n";
};
@@ -932,12 +920,11 @@ U0 EdInsHexEd()
class CEdBin
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,"
"A=\"Tag Text :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n";
I64 bin_num fmtstr "$$DA,A=\"Bin Num:%d\"$$\n";
U8 bin_ptr_link_file[512] fmtstr "$$DA-P,LEN=511,A=\"File:%s\"$$\n";
U8 bin_ptr_link_file[512] fmtstr "$$DA-P,A=\"File:%s\"$$\n";
I64 bin_ptr_link_bin_num fmtstr "$$DA,A=\"File Bin Num:%d\"$$\n";
U8 bin_ptr_link_tag[512] fmtstr "$$DA-P,LEN=511,A=\"File Bin Tag:%s\"$$\n";
U8 bin_ptr_link_tag[512] fmtstr "$$DA-P,A=\"File Bin Tag:%s\"$$\n";
};
U0 EdInsBin(I64 bin_num,I64 type)
@@ -970,7 +957,7 @@ U0 EdInsBin(I64 bin_num,I64 type)
class CEdTree
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n";
I64 indent fmtstr "$$DA,A=\"Indention:%d\"$$\n";
Bool collapsed fmtstr "$$CB,\"Collapsed\"$$\n";
};
@@ -1087,8 +1074,8 @@ I64 PopUpSpriteType()
class CEdMacroSprite
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n",
exp[512] fmtstr "$$DA-P,LEN=511,A=\"Macro :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n",
exp[512] fmtstr "$$DA-P,A=\"Macro :%s\"$$\n";
Bool escape fmtstr "$$CB,\"Escape\"$$\n",
popup fmtstr "$$CB,\"PopUp\"$$\n",
is_auto fmtstr "$$CB,\"AutoStr\"$$\n";
@@ -1096,8 +1083,8 @@ class CEdMacroSprite
class CEdMenuSprite
{
U8 tag[512] fmtstr "$$DA-P,LEN=511,A=\"Tag Text :%s\"$$\n",
exp[512] fmtstr "$$DA-P,LEN=511,A=\"Expression :%s\"$$\n";
U8 tag[512] fmtstr "$$DA-P,A=\"Tag Text :%s\"$$\n",
exp[512] fmtstr "$$DA-P,A=\"Expression :%s\"$$\n";
Bool escape fmtstr "$$CB,\"Escape\"$$\n",
popup,
is_auto;
+7 -7
View File
@@ -9,7 +9,7 @@ public Bool GrPlot0(CDC *dc=gr.dc,I64 x,I64 y)
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistSqrI64(x,y,dc->cur_x,dc->cur_y);
if (dist<dc->nearest_dist) {
if (dist<=dc->nearest_dist) {
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
@@ -102,7 +102,7 @@ public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img)
}
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistSqrI64(x+img->width>>1,y+img->height>>1,dc->cur_x,dc->cur_y);
if (dist<dc->nearest_dist) {
if (dist<=dc->nearest_dist) {
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
@@ -669,7 +669,7 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch)
}
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistSqrI64(x+w2>>1,y+h2>>1,dc->cur_x,dc->cur_y);
if (dist<dc->nearest_dist) {
if (dist<=dc->nearest_dist) {
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
@@ -961,7 +961,7 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h)
dist=0;
else
dist=DistSqrI64(x+w>>1,y+h>>1,dc->cur_x,dc->cur_y);
if (dist<dc->nearest_dist) {
if (dist<=dc->nearest_dist) {
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
@@ -1515,7 +1515,7 @@ I64 GrRayLen(CDC *dc,I64 *x1,I64 y,I64 z=0,I32 *db=NULL)
!not_color && c==dc->color2) && plot) {
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistSqrI64(x3,y3,dc->cur_x,dc->cur_y);
if (dist<dc->nearest_dist) {
if (dist<=dc->nearest_dist) {
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
@@ -1592,7 +1592,7 @@ I64 GrRayLen(CDC *dc,I64 *x1,I64 y,I64 z=0,I32 *db=NULL)
!not_color && c==dc->color2) && plot) {
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistSqrI64(x3,y3,dc->cur_x,dc->cur_y);
if (dist<dc->nearest_dist) {
if (dist<=dc->nearest_dist) {
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
@@ -1721,7 +1721,7 @@ public I64 GrHLine(CDC *dc=gr.dc,I64 x1,I64 x2,I64 y,I64 z1=0,I64 z2=0)
else
dist=SqrI64(dc->cur_x-x2);
dist+=SqrI64(y-dc->cur_y);
if (dist<dc->nearest_dist) {
if (dist<=dc->nearest_dist) {
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
+2 -1
View File
@@ -36,7 +36,8 @@ public class CGrGlbls
I64 screen_zoom,sx,sy;
//When zoomed, this keeps the mouse centered.
Bool continuous_scroll;
Bool continuous_scroll,
hide_row,hide_col;
} gr;
//See $LK,"RLf_VGA",A="FF:::/Kernel/KStart.CPP,RLf_VGA"$
+1 -1
View File
@@ -384,7 +384,7 @@ public Bool GrPlot3(CDC *dc=gr.dc,I64 x,I64 y,I64 z)
}
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistSqrI64(x,y,dc->cur_x,dc->cur_y);
if (dist<dc->nearest_dist) {
if (dist<=dc->nearest_dist) {
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
+4 -4
View File
@@ -172,7 +172,7 @@ U0 GrUpdateTextBG()
Bool blink_flag=Blink;
U8 *dst2=dst;
if (gr.pan_text_x) {
if (gr.pan_text_x||gr.hide_col) {
gr.pan_text_x=ClampI64(gr.pan_text_x,-7,7);
j=AbsI64(gr.pan_text_x)/FONT_WIDTH+1;
num_cols-=j;
@@ -197,7 +197,7 @@ U0 GrUpdateTextBG()
}
dst=dst2;
if (gr.pan_text_y) {
if (gr.pan_text_y||gr.hide_row) {
gr.pan_text_y=ClampI64(gr.pan_text_y,-7,7);
j=AbsI64(gr.pan_text_y)/FONT_HEIGHT+1;
num_rows-=j;
@@ -261,7 +261,7 @@ U0 GrUpdateTextFG()
U8 *dst_start=gr.dc2->body,*dst_end=dst_start+w1*gr.dc2->height-7*w1-8;
Bool blink_flag=Blink;
if (gr.pan_text_x) {
if (gr.pan_text_x||gr.hide_col) {
gr.pan_text_x=ClampI64(gr.pan_text_x,-7,7);
j=AbsI64(gr.pan_text_x)/FONT_WIDTH+1;
num_cols-=j;
@@ -273,7 +273,7 @@ U0 GrUpdateTextFG()
w2+=j*FONT_WIDTH;
}
if (gr.pan_text_y) {
if (gr.pan_text_y||gr.hide_row) {
gr.pan_text_y=ClampI64(gr.pan_text_y,-7,7);
j=AbsI64(gr.pan_text_y)/FONT_HEIGHT+1;
num_rows-=j;
+26 -26
View File
@@ -238,7 +238,7 @@ CSprite *Code2SpriteElem(CCmpCtrl *cc,I64 type)
g.type=type;
LexD2I32(cc,&g.pp.x1);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc); //Skip ,
LexD2I32(cc,&g.pp.x2);
break;
@@ -247,7 +247,7 @@ CSprite *Code2SpriteElem(CCmpCtrl *cc,I64 type)
Lex(cc); //Skip {
LexD2I32(cc,&g.pp.x1);
if (cc->token!=':')
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
Lex(cc); //Skip :
LexD2I32(cc,&g.pp.x2);
g.ppa.x2+=g.pp.x1;
@@ -289,7 +289,7 @@ CSprite *Code2SpriteElem(CCmpCtrl *cc,I64 type)
g.type=SPT_CIRCLE;
LexD2I32(cc,&g.pr.x1);
if (cc->token!=':')
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
Lex(cc); //Skip :
g.pr.radius=LexExpressionI64(cc);
break;
@@ -297,17 +297,17 @@ CSprite *Code2SpriteElem(CCmpCtrl *cc,I64 type)
Lex(cc); //Skip {
g.pwhas.sides=LexExpressionI64(cc);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
case SPT_ELLIPSE:
Lex(cc); //Skip {
g.type=type;
LexD2I32(cc,&g.pwha.x1);
if (cc->token!=':')
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
Lex(cc); //Skip :
LexD2I32(cc,&g.pwha.width);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc); //Skip ,
g.pwha.angle=ã/180*LexExpressionF64(cc);
break;
@@ -323,11 +323,11 @@ CSprite *Code2SpriteElem(CCmpCtrl *cc,I64 type)
g.type=type;
LexD2I32(cc,&g.ps.x1);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
if (Lex(cc)==TK_STR) //Skip ,
st=LexExtStr(cc);
else
LexExcept(cc,"expecting string at ");
LexExcept(cc,"Expecting string at ");
size=SpriteElemQuedBaseSize(type);
i=StrLen(st)+1;
result=MAlloc(size+i);
@@ -348,7 +348,7 @@ CSprite *Code2SpriteElem(CCmpCtrl *cc,I64 type)
Lex(cc); //Skip ,
}
if (g.nu.num<2)
LexExcept(cc,"expecting point at ");
LexExcept(cc,"Expecting point at ");
size=SpriteElemQuedBaseSize(SPT_POLYLINE);
result=MAlloc(size+g.nu.num*sizeof(CD2I32));
MemCpy(result,&g,size);
@@ -377,7 +377,7 @@ CSprite *Code2SpriteElem(CCmpCtrl *cc,I64 type)
Lex(cc); //Skip ,
}
if (g.nu.num<2)
LexExcept(cc,"expecting point at ");
LexExcept(cc,"Expecting point at ");
size=SpriteElemQuedBaseSize(type);
result=MAlloc(size+g.nu.num*sizeof(CD3I32));
if (LexExpressionI64(cc)) {
@@ -406,11 +406,11 @@ CSprite *Code2SpriteElem(CCmpCtrl *cc,I64 type)
Lex(cc); //Skip {
LexD2I32(cc,&g.npu.x);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
tempv=QueVectU8New;
while (TRUE) {
if (!(i=LexGetChar(cc)))
LexExcept(cc,"expecting '}' at ");
LexExcept(cc,"Expecting '}' at ");
if (i=='}')
break;
if ('0'<=i<='7')
@@ -431,16 +431,16 @@ CSprite *Code2SpriteElem(CCmpCtrl *cc,I64 type)
Lex(cc); //Skip {
LexD2I32(cc,&g.pwhu.x1);
if (cc->token!=':')
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
Lex(cc); //Skip :
LexD2I32(cc,&g.pwhu.width);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
tempv=QueVectU8New;
num1=0;
while (TRUE) {
if (!(i=ToUpper(LexGetChar(cc))))
LexExcept(cc,"expecting '}' at ");
LexExcept(cc,"Expecting '}' at ");
if (i=='}')
break;
if ('0'<=i<='9')
@@ -469,16 +469,16 @@ CSprite *Code2SpriteElem(CCmpCtrl *cc,I64 type)
if (LexExpressionI64(cc)) {
g.type=SPT_SHIFTABLE_MESH;
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc); //Skip ,
LexD3I32(cc,&g.pmu.x);
if (cc->token!=':')
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
Lex(cc); //Skip :
} else {
g.type=SPT_MESH;
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc); //Skip ,
}
num1=0;
@@ -492,7 +492,7 @@ CSprite *Code2SpriteElem(CCmpCtrl *cc,I64 type)
Lex(cc); //Skip ,
}
if (cc->token!=':')
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
Lex(cc); //Skip :
num2=0;
QueInit(&roott);
@@ -503,19 +503,19 @@ CSprite *Code2SpriteElem(CCmpCtrl *cc,I64 type)
Free(st);
Lex(cc); //Skip color
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc); //Skip ,
tempt->nums[0]=LexExpressionI64(cc);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc); //Skip ,
tempt->nums[1]=LexExpressionI64(cc);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc); //Skip ,
tempt->nums[2]=LexExpressionI64(cc);
if (cc->token!=')')
LexExcept(cc,"expecting ')' at ");
LexExcept(cc,"Expecting ')' at ");
Lex(cc); //Skip )
QueIns(tempt,roott.last);
num2++;
@@ -553,9 +553,9 @@ CSprite *Code2SpriteElem(CCmpCtrl *cc,I64 type)
break;
}
if (cc->token!='}')
LexExcept(cc,"expecting '}' at ");
LexExcept(cc,"Expecting '}' at ");
if (Lex(cc)!=';')
LexExcept(cc,"expecting ';' at ");
LexExcept(cc,"Expecting ';' at ");
return result;
}
@@ -580,7 +580,7 @@ public U8 *Code2Sprite(CDoc *doc,I64 *_size=NULL)
if (Lex(cc)=='{') //Skip ident
QueIns(Code2SpriteElem(cc,i),root.last);
} else if (cc->token)
LexExcept(cc,"expecting sprite element type name at ");
LexExcept(cc,"Expecting sprite element type name at ");
} while (cc->token);
okay=TRUE;
} catch {
+4 -4
View File
@@ -62,9 +62,9 @@ CMenuEntry *MenuNewSub(CCmpCtrl *cc,CTask *task)
if (cc->token!=',' && cc->token!=')')
tempme->a2=LexExpressionI64(cc);
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
if (Lex(cc)!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc); //Skip ;
} else if (cc->token=='{') {
Lex(cc); //Skip {
@@ -73,11 +73,11 @@ CMenuEntry *MenuNewSub(CCmpCtrl *cc,CTask *task)
while (tempse && cc->token!='}')
tempse=tempse->next=MenuNewSub(cc,task);
if (cc->token!='}')
LexExcept(cc,"missing '}' at ");
LexExcept(cc,"Missing '}' at ");
else
Lex(cc); //Skip }
} else
LexExcept(cc,"expecting '{' at ");
LexExcept(cc,"Expecting '{' at ");
}
return tempme;
}
+3 -3
View File
@@ -197,14 +197,14 @@ public I64 FileOcc(U8 *needle_str,
class CFind
{
U8 find_text[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,"
U8 find_text[STR_LEN] fmtstr "$$DA-P,"
"A=\"FIND :%s\"$$\n";
U8 replace_text[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,"
U8 replace_text[STR_LEN] fmtstr "$$DA-P,"
"A=\"REPLACE :%s\"$$\n";
Bool replace fmtstr "$$CB,\"REPLACE\"$$\n";
Bool match_case fmtstr "$$CB,\"MATCH CASE\"$$\n";
Bool whole_labels fmtstr "$$CB,\"WHOLE LABELS\"$$\n";
U8 filemask[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,A=\"FILE MASK :%s\"$$\n";
U8 filemask[STR_LEN] fmtstr "$$DA-P,A=\"FILE MASK :%s\"$$\n";
Bool recurse fmtstr "$$CB,\"RECURSE\"$$\n";
};
+4 -4
View File
@@ -23,11 +23,11 @@ U0 BgtIns(CBgtEntry *tempb)
class CBgtEntryForm
{
U8 date[512] fmtstr "$$DA-P,LEN=511,A=\"Date :%s\"$$\n";
U8 date[512] fmtstr "$$DA-P,A=\"Date :%s\"$$\n";
F64 amount fmtstr "Amount $$$$$$DA,A=\"%6.2f\"$$\n";
U8 credit[512] fmtstr "$$DA-P,LEN=511,A=\"Credit Acct:%s\"$$\n";
U8 debit [512] fmtstr "$$DA-P,LEN=511,A=\"Debit Acct:%s\"$$\n";
U8 desc [512] fmtstr "$$DA-P,LEN=511,A=\"Desc :%s\"$$\n";
U8 credit[512] fmtstr "$$DA-P,A=\"Credit Acct:%s\"$$\n";
U8 debit [512] fmtstr "$$DA-P,A=\"Debit Acct:%s\"$$\n";
U8 desc [512] fmtstr "$$DA-P,A=\"Desc :%s\"$$\n";
};
CBgtEntry *BgtEntryPmt(CBgtEntry *dft=NULL)
+3 -3
View File
@@ -42,10 +42,10 @@ class CBgtTemplate
CBgtTemplate *next,*last;
U0 start;
U16 type fmtstr "$$LS,RT=U16,D=\"ST_BGT_TEMPLATE_TYPES\"$$\n";
U16 type fmtstr "$$LS,D=\"ST_BGT_TEMPLATE_TYPES\"$$\n";
U16 flags;
U8 start_date[16] fmtstr "$$DA-P,LEN=15,A=\"Start Date:%s\"$$\n";
U8 end_date[16] fmtstr "$$DA-P,LEN=15,A=\"End Date :%s\"$$\n";
U8 start_date[16] fmtstr "$$DA-P,A=\"Start Date:%s\"$$\n";
U8 end_date[16] fmtstr "$$DA-P,A=\"End Date :%s\"$$\n";
F64 period fmtstr "$$DA,A=\"Period :%6.2f\"$$\n";
U0 end;
+1 -1
View File
@@ -13,7 +13,7 @@ class Ball
class BallDefineStruct
{
F64 radius fmtstr "$$DA-TRM,RT=F64,A=\"Radius :%8.3f\"$$\n";
F64 radius fmtstr "$$DA-TRM,A=\"Radius :%8.3f\"$$\n";
I64 n_longitude fmtstr "$$DA-TRM,A=\"Longitude Faces:%5d\"$$\n";
I64 n_lattitude fmtstr "$$DA-TRM,A=\"Lattitude Rings:%5d\"$$\n";
};
+28 -28
View File
@@ -14,66 +14,66 @@ class Man
class ManDefineStruct
{
F64 head_rad fmtstr
"$$DA-TRM,RT=F64,A=\"Head Radius :%8.3f\"$$\n";
"$$DA-TRM,A=\"Head Radius :%8.3f\"$$\n";
F64 torso_len fmtstr
"$$DA-TRM,RT=F64,A=\"Torso Length :%8.3f\"$$\n";
"$$DA-TRM,A=\"Torso Length :%8.3f\"$$\n";
F64 arm_len fmtstr
"$$DA-TRM,RT=F64,A=\"Arm Length :%8.3f\"$$\n";
"$$DA-TRM,A=\"Arm Length :%8.3f\"$$\n";
F64 hand_len fmtstr
"$$DA-TRM,RT=F64,A=\"Hand Length :%8.3f\"$$\n";
"$$DA-TRM,A=\"Hand Length :%8.3f\"$$\n";
F64 leg_len fmtstr
"$$DA-TRM,RT=F64,A=\"Leg Length :%8.3f\"$$\n";
"$$DA-TRM,A=\"Leg Length :%8.3f\"$$\n";
F64 foot_len fmtstr
"$$DA-TRM,RT=F64,A=\"Foot Length :%8.3f\"$$\n";
"$$DA-TRM,A=\"Foot Length :%8.3f\"$$\n";
F64 torso_width fmtstr
"$$DA-TRM,RT=F64,A=\"Torso Width :%8.3f\"$$\n";
"$$DA-TRM,A=\"Torso Width :%8.3f\"$$\n";
F64 torso_depth fmtstr
"$$DA-TRM,RT=F64,A=\"Torso Depth :%8.3f\"$$\n";
"$$DA-TRM,A=\"Torso Depth :%8.3f\"$$\n";
F64 arm_rad fmtstr
"$$DA-TRM,RT=F64,A=\"Arm Radius :%8.3f\"$$\n";
"$$DA-TRM,A=\"Arm Radius :%8.3f\"$$\n";
F64 hand_rad fmtstr
"$$DA-TRM,RT=F64,A=\"Hand Radius :%8.3f\"$$\n";
"$$DA-TRM,A=\"Hand Radius :%8.3f\"$$\n";
F64 leg_rad fmtstr
"$$DA-TRM,RT=F64,A=\"Leg Radius :%8.3f\"$$\n";
"$$DA-TRM,A=\"Leg Radius :%8.3f\"$$\n";
F64 foot_rad fmtstr
"$$DA-TRM,RT=F64,A=\"Foot Radius :%8.3f\"$$\n\n";
"$$DA-TRM,A=\"Foot Radius :%8.3f\"$$\n\n";
F64 r_shoulder_a1 fmtstr
"$$DA-TRM,RT=F64,A=\"R.Shoulder Front/Back Angle:%8.3f\"$$\n";
"$$DA-TRM,A=\"R.Shoulder Front/Back Angle:%8.3f\"$$\n";
F64 l_shoulder_a1 fmtstr
"$$DA-TRM,RT=F64,A=\"L.Shoulder Front/Back Angle:%8.3f\"$$\n";
"$$DA-TRM,A=\"L.Shoulder Front/Back Angle:%8.3f\"$$\n";
F64 r_hip_a1 fmtstr
"$$DA-TRM,RT=F64,A=\"R.Hip Front/Back Angle :%8.3f\"$$\n";
"$$DA-TRM,A=\"R.Hip Front/Back Angle :%8.3f\"$$\n";
F64 l_hip_a1 fmtstr
"$$DA-TRM,RT=F64,A=\"L.Hip Front/Back Angle :%8.3f\"$$\n";
"$$DA-TRM,A=\"L.Hip Front/Back Angle :%8.3f\"$$\n";
F64 r_shoulder_a2 fmtstr
"$$DA-TRM,RT=F64,A=\"R.Shoulder Side Angle :%8.3f\"$$\n";
"$$DA-TRM,A=\"R.Shoulder Side Angle :%8.3f\"$$\n";
F64 l_shoulder_a2 fmtstr
"$$DA-TRM,RT=F64,A=\"L.Shoulder Side Angle :%8.3f\"$$\n";
"$$DA-TRM,A=\"L.Shoulder Side Angle :%8.3f\"$$\n";
F64 r_hip_a2 fmtstr
"$$DA-TRM,RT=F64,A=\"R.Hip Side Angle :%8.3f\"$$\n";
"$$DA-TRM,A=\"R.Hip Side Angle :%8.3f\"$$\n";
F64 l_hip_a2 fmtstr
"$$DA-TRM,RT=F64,A=\"L.Hip Side Angle :%8.3f\"$$\n";
"$$DA-TRM,A=\"L.Hip Side Angle :%8.3f\"$$\n";
F64 r_elbow_a fmtstr
"$$DA-TRM,RT=F64,A=\"R.Elbow Angle :%8.3f\"$$\n";
"$$DA-TRM,A=\"R.Elbow Angle :%8.3f\"$$\n";
F64 l_elbow_a fmtstr
"$$DA-TRM,RT=F64,A=\"L.Elbow Angle :%8.3f\"$$\n";
"$$DA-TRM,A=\"L.Elbow Angle :%8.3f\"$$\n";
F64 r_knee_a fmtstr
"$$DA-TRM,RT=F64,A=\"R.Knee Angle :%8.3f\"$$\n";
"$$DA-TRM,A=\"R.Knee Angle :%8.3f\"$$\n";
F64 l_knee_a fmtstr
"$$DA-TRM,RT=F64,A=\"L.Knee Angle :%8.3f\"$$\n";
"$$DA-TRM,A=\"L.Knee Angle :%8.3f\"$$\n";
F64 r_wrist_a fmtstr
"$$DA-TRM,RT=F64,A=\"R.Wrist Angle :%8.3f\"$$\n";
"$$DA-TRM,A=\"R.Wrist Angle :%8.3f\"$$\n";
F64 l_wrist_a fmtstr
"$$DA-TRM,RT=F64,A=\"L.Wrist Angle :%8.3f\"$$\n";
"$$DA-TRM,A=\"L.Wrist Angle :%8.3f\"$$\n";
F64 r_ankle_a fmtstr
"$$DA-TRM,RT=F64,A=\"R.Ankle Angle :%8.3f\"$$\n";
"$$DA-TRM,A=\"R.Ankle Angle :%8.3f\"$$\n";
F64 l_ankle_a fmtstr
"$$DA-TRM,RT=F64,A=\"L.Ankle Angle :%8.3f\"$$\n";
"$$DA-TRM,A=\"L.Ankle Angle :%8.3f\"$$\n";
};
+35 -37
View File
@@ -1,7 +1,7 @@
Bool PrsAsmImm(CCmpCtrl *cc,CAsmArg *arg)
{
if (arg->imm_or_off_present)
LexExcept(cc,"already one immediate at ");
LexExcept(cc,"Already one immediate at ");
arg->imm_or_off_present=TRUE;
arg->num.local_asm_undef_hash=NULL;
arg->num.glbl_asm_undef_hash=NULL;
@@ -146,8 +146,8 @@ pa_asm_direct_imm:
goto pa_asm_indirect_imm;
} else if (cc->token=='*') {
Lex(cc);
if (cc->token!=TK_INTEGER)
LexExcept(cc,"expecting scale factor at ");
if (cc->token!=TK_INT)
LexExcept(cc,"Expecting scale factor at ");
arg->scale=cc->cur_i64;
Lex(cc); //skip scale
if (arg->reg2!=REG_NONE)
@@ -161,7 +161,7 @@ pa_asm_indirect_imm:
}
}
if (cc->token!=']')
LexExcept(cc,"missing ']' at ");
LexExcept(cc,"Missing ']' at ");
Lex(cc); //skip ]
return;
} else
@@ -276,7 +276,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
num2->num.glbl_asm_undef_hash,cc->lex_include_stk->line_num,
U8_avail);
else if (!num2->imm_flag && !(MIN_I8<=num2->num.i<=MAX_I8))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
if (num2->imm_flag) {
if (num2->num.abs_cnts.abs_addres&1) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
@@ -303,7 +303,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
num2->num.glbl_asm_undef_hash,cc->lex_include_stk->line_num,
U8_avail);
else if (!num2->imm_flag && !(MIN_I16<=num2->num.i<=MAX_I16))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
if (num2->imm_flag) {
if (num2->num.abs_cnts.abs_addres&1) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
@@ -330,7 +330,7 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
num2->num.glbl_asm_undef_hash,cc->lex_include_stk->line_num,
U8_avail);
else if (!num2->imm_flag && !(MIN_I32<=num2->num.i<=MAX_I32))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
if (num2->imm_flag) {
if (num2->num.abs_cnts.abs_addres&1) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
@@ -387,13 +387,13 @@ Bool AsmStoreNum(CCmpCtrl *cc,CAsmNum2 *num2,I64 cnt,Bool U8_avail)
U8 asm_seg_prefixes[6]={0x26,0x2E,0x36,0x3E,0x64,0x65};
Bool PrsAsmInstruction(CCmpCtrl *cc,CHashOpcode *tempo,I64 argcnt)
Bool PrsAsmInst(CCmpCtrl *cc,CHashOpcode *tempo,I64 argcnt)
{
CAOTCtrl *aotc=cc->aotc;
I64 i,j,a1,a2,om,seg,arg1mask,arg2mask;
CAsmArg *tempa1,*tempa2;
Bool ModrM_complete,U8_avail=FALSE,found_second_possible=FALSE;
CInstruction *tempi;
CInst *tempi;
CAsmIns cur,best;
best.U8_cnt=255;
@@ -406,7 +406,7 @@ Bool PrsAsmInstruction(CCmpCtrl *cc,CHashOpcode *tempo,I64 argcnt)
arg2mask=AsmMakeArgMask(cc,&aotc->arg2);
else
arg2mask=1;
for (i=0;i<tempo->instruction_entry_cnt;i++) {
for (i=0;i<tempo->inst_entry_cnt;i++) {
tempi=&tempo->ins[i];
if (tempi->arg1==ARGT_REL8 || tempi->arg2==ARGT_REL8)
U8_avail=TRUE;
@@ -559,8 +559,7 @@ Bool PrsAsmInstruction(CCmpCtrl *cc,CHashOpcode *tempo,I64 argcnt)
}
}
}
} else if (ARGT_REL8<=a1<=ARGT_REL32 ||
ARGT_IMM8<=a1<=ARGT_IMM64 ||
} else if (ARGT_REL8<=a1<=ARGT_REL32 || ARGT_IMM8<=a1<=ARGT_IMM64 ||
ARGT_UIMM8<=a1<=ARGT_UIMM64) {
if (a1==ARGT_IMM64 || a2==ARGT_UIMM64)
cur.REX|=8;
@@ -596,8 +595,7 @@ Bool PrsAsmInstruction(CCmpCtrl *cc,CHashOpcode *tempo,I64 argcnt)
cur.last_opcode_U8|=tempa2->fstk;
}
}
if (a1==ARGT_RM64 || a2==ARGT_RM64 ||
a1==ARGT_M64 || a2==ARGT_M64 ||
if (a1==ARGT_RM64 || a2==ARGT_RM64 || a1==ARGT_M64 || a2==ARGT_M64 ||
a1==ARGT_R64 || a2==ARGT_R64)
cur.REX|=8;
if (ARGT_RM8<=a1<=ARGT_RM64 || ARGT_RM8<=a2<=ARGT_RM64 ||
@@ -801,11 +799,11 @@ Bool PrsAsmInstruction(CCmpCtrl *cc,CHashOpcode *tempo,I64 argcnt)
if (!AsmStoreNum(cc,&best.imm,1,U8_avail))
return FALSE;
}
if (tempi->flags&IEF_ENDING_ZERO) //ENTER instruction
if (tempi->flags&IEF_ENDING_ZERO) //ENTER inst
AOTStoreCodeU8(cc,0);
return TRUE;
}
LexExcept(cc,"invalid instruction at ");
LexExcept(cc,"Invalid inst at ");
}
U0 PrsAsmDefine(CCmpCtrl *cc,I64 U8_cnt)
@@ -853,11 +851,11 @@ U0 PrsAsmDefine(CCmpCtrl *cc,I64 U8_cnt)
cc->hash_entry->user_data0==AKW_DUP) {
is_dup=TRUE;
if (Lex(cc)!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
Lex(cc); //skip (
dup_val=AsmLexExpression(cc);
if (cc->token!=')')
LexExcept(cc,"expecting ')' at ");
LexExcept(cc,"Expecting ')' at ");
Lex(cc); //SKIP )
}
}
@@ -866,7 +864,7 @@ U0 PrsAsmDefine(CCmpCtrl *cc,I64 U8_cnt)
num2.num.abs_cnts=cc->abs_cnts;
if (is_dup) {
if (num2.num.local_asm_undef_hash || num2.num.glbl_asm_undef_hash)
LexExcept(cc,"undefined DUP cnt at ");
LexExcept(cc,"Undefined DUP cnt at ");
num2.num.i=dup_val;
AsmStoreNum(cc,&num2,i,FALSE);
} else {
@@ -878,7 +876,7 @@ U0 PrsAsmDefine(CCmpCtrl *cc,I64 U8_cnt)
Lex(cc);
}
if (cc->token!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc);
}
@@ -887,14 +885,14 @@ U0 PrsBinFile(CCmpCtrl *cc)
I64 i,size;
U8 *buf,*st;
if (cc->token!=TK_STR)
LexExcept(cc,"expecting string at ");
LexExcept(cc,"Expecting string at ");
st=DftExt(cc->cur_str,"BIN");
buf=FileRead(st,&size);
Free(st);
for (i=0;i<size;i++)
AOTStoreCodeU8(cc,buf[i]);
if (Lex(cc)!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc);
}
@@ -912,7 +910,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
cc->flags|=CCF_ASM_EXPRESSIONS;
if (!(cmp_flags&CMPF_ONE_ASM_INS)) {
if (cc->token!='{')
LexExcept(cc,"expecting '{' at ");
LexExcept(cc,"Expecting '{' at ");
Lex(cc);
}
while (cc->token && cc->token!='}') {
@@ -925,7 +923,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
case AKW_IMPORT:
while (cc->token && cc->token!=';') {
if (cc->token!=TK_IDENT)
LexExcept(cc,"expecting identifier at ");
LexExcept(cc,"Expecting identifier at ");
else {
tempex=NULL;
tempex=CAlloc(sizeof(CHashExport));
@@ -939,7 +937,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
}
}
if (cc->token!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc); //skip ';';
break;
case AKW_MODULE_ORG:
@@ -963,7 +961,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
if (j>aotc->max_align_bits) aotc->max_align_bits=j;
i=CeilU64(aotc->ip,i);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc);
k=AsmLexExpression(cc);
for (j=aotc->ip;j<i;j++)
@@ -1000,7 +998,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
aotc->seg_size=64;
break;
default:
LexExcept(cc,"syntax error at ");
LexExcept(cc,"Syntax error at ");
}
} else if (cc->hash_entry->type & HTT_OPCODE) {
tempo=cc->hash_entry;
@@ -1015,7 +1013,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
if (tempo->ins[0].arg2) {
argcnt++;
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
else {
Lex(cc); //skip ','
if (ARGT_REL8<=tempo->ins[0].arg2<=ARGT_REL32)
@@ -1025,13 +1023,13 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
}
}
}
PrsAsmInstruction(cc,tempo,argcnt);
PrsAsmInst(cc,tempo,argcnt);
} else if (cc->hash_entry->type & HTT_EXPORT_SYS_SYM) {
if (Btr(&cc->hash_entry->type,HTf_UNRESOLVED)) {
if (cc->hash_entry->type & HTF_LOCAL) {
cc->hash_entry(CHashExport *)->val=aotc->ip;
if (Lex(cc)!=':')
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
Lex(cc);
} else {
if (cc->hash_entry->type & HTF_IMPORT)
@@ -1040,7 +1038,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
next_last_label=cc->hash_entry->str;
Lex(cc); //Skip cur_str
if (cc->token!=':' && cc->token!=TK_DBL_COLON)
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
if (cc->token==TK_DBL_COLON) {
cc->hash_entry->type|=HTF_EXPORT;
HashSrcFileSet(cc,cc->hash_entry);
@@ -1053,12 +1051,12 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
} else if (cc->hash_entry(CHashExport *)->val==aotc->ip) {
Lex(cc); //Skip cur_str
if (cc->token!=':' && cc->token!=TK_DBL_COLON)
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
Lex(cc);
} else
LexExcept(cc,"redefinition at ");
LexExcept(cc,"Redefinition at ");
} else
LexExcept(cc,"syntax error at ");
LexExcept(cc,"Syntax error at ");
} else if (cc->token==TK_IDENT) {
tempex=CAlloc(sizeof(CHashExport));
tempex->str=cc->cur_str;
@@ -1067,11 +1065,11 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
tempex->val=aotc->ip;
Lex(cc); //Skip cur_str
if (cc->token!=':' && cc->token!=TK_DBL_COLON)
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
else {
if (*tempex->str=='@' && tempex->str[1]=='@') {
if (cc->token==TK_DBL_COLON)
LexExcept(cc,"no local glbl exports at ");
LexExcept(cc,"No local glbl exports at ");
HashAdd(tempex,cc->htc.local_hash_table);
} else
HashAdd(tempex,cc->htc.glbl_hash_table);
@@ -1099,7 +1097,7 @@ U0 PrsAsmBlk(CCmpCtrl *cc,I64 cmp_flags)
} else if (cc->token==';')
Lex(cc);
else
LexExcept(cc,"syntax error at ");
LexExcept(cc,"Syntax error at ");
if (cmp_flags&CMPF_ONE_ASM_INS && (cc->token!=TK_IDENT ||
!(tempo=cc->hash_entry) ||
!(tempo->type&(HTT_OPCODE|HTT_ASM_KEYWORD))))
+59 -54
View File
@@ -1,4 +1,4 @@
U0 AsmPrsInsFlags(CCmpCtrl *cc,CInstruction *tempi)
U0 AsmPrsInsFlags(CCmpCtrl *cc,CInst *tempi)
{
I64 i;
while (TRUE) {
@@ -9,7 +9,7 @@ U0 AsmPrsInsFlags(CCmpCtrl *cc,CInstruction *tempi)
break;
} else
return;
case TK_INTEGER:
case TK_INT:
if (cc->cur_i64==16)
tempi->flags|=IEF_OP_SIZE16;
else if (cc->cur_i64==32)
@@ -20,7 +20,7 @@ U0 AsmPrsInsFlags(CCmpCtrl *cc,CInstruction *tempi)
case '+':
tempi->flags|=IEF_PLUS_OPCODE;
case '/':
if (Lex(cc)==TK_INTEGER && cc->cur_i64<8)
if (Lex(cc)==TK_INT && cc->cur_i64<8)
tempi->slash_val=cc->cur_i64;
else if (cc->token==TK_IDENT) {
if (!StrCmp(cc->cur_str,"R"))
@@ -49,13 +49,13 @@ U0 AsmPrsInsFlags(CCmpCtrl *cc,CInstruction *tempi)
U0 AsmHashLoad()
{//See $LK,"::/Compiler/OpCodes.TXT"$.
I64 i,j,size,size1;
I64 i,j,size,size_max;
CInternalType *tempit;
CCmpCtrl *cc;
CHashGeneric *temph;
CHashReg *tempr;
CHashOpcode *tempo,*tempo1;
CInstruction *tempi;
CHashOpcode *tempo,*tempo2,*tempo_max;
CInst *tempi;
CHashClass *tempc;
cmp.size_arg_mask[0]=0x3FF0FFFFFE;
@@ -65,42 +65,57 @@ U0 AsmHashLoad()
cmp.size_arg_mask[8]=0x0880888880;
cmp.asm_hash=HashTableNew(1024);
size1=offset(CHashOpcode.ins)+sizeof(CInstruction)<<5;
tempo=MAlloc(size1);
size_max=offset(CHashOpcode.ins)+sizeof(CInst)<<5;
tempo_max=MAlloc(size_max);
cc=CmpCtrlNew(FileRead("OpCodes.TXT"),,"OpCodes.TXT.Z");
cc->htc.hash_table_lst=NULL;
Lex(cc);
while (cc->token) {
if (cc->token!=TK_IDENT)
LexExcept(cc,"expecting identifier at ");
LexExcept(cc,"Expecting identifier at ");
i=LstMatch(cc->cur_str,"R8\0R16\0R32\0R64\0SEG\0FSTK\0"
"MM\0XMM\0OPCODE\0KEYWORD\0ASM_KEYWORD\0");
if (i<0)
LexExcept(cc,"Unknown Stmt");
Lex(cc); //skip keyword
if (cc->token!=TK_IDENT)
LexExcept(cc,"expecting identifier at ");
LexExcept(cc,"Expecting identifier at ");
switch (i) {
case 8: //OPCODE
MemSet(tempo,0,size1);
tempo->type=HTT_OPCODE;
tempo->instruction_entry_cnt=0;
tempo->str=cc->cur_str;
case REGT_R8...REGT_XMM:
tempr=CAlloc(sizeof(CHashReg));
tempr->str=cc->cur_str;
cc->cur_str=NULL;
Lex(cc); //skip keyword name
if (cc->token!=TK_INT)
LexExcept(cc,"Expecting int at ");
tempr->type=HTT_REG;
tempr->reg_type=i;
tempr->reg_num=cc->cur_i64;
HashAdd(tempr,cmp.asm_hash);
Lex(cc); //Skip INT
break;
case: //OPCODE
if (cc->token!=TK_IDENT)
LexExcept(cc,"Expecting opcode at ");
MemSet(tempo_max,0,size_max);
tempo_max->type=HTT_OPCODE;
tempo_max->inst_entry_cnt=0;
tempo_max->str=cc->cur_str;
cc->cur_str=0;
Lex(cc); //Skip OPCODE
while (cc->token && cc->token!=';') {
tempi=&tempo->ins[tempo->instruction_entry_cnt];
tempi->ins_entry_num=tempo->instruction_entry_cnt++;
while (cc->token && cc->token!=';' && cc->token!=':') {
tempi=&tempo_max->ins[tempo_max->inst_entry_cnt];
tempi->ins_entry_num=tempo_max->inst_entry_cnt++;
tempi->slash_val=SV_NONE; //Not zero!!
while (cc->token==TK_INTEGER) {
while (cc->token==TK_INT) {
tempi->opcode[tempi->opcode_cnt++]=cc->cur_i64;
Lex(cc);
}
if (cc->token==',')
Lex(cc);
else if (cc->token!=';')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
AsmPrsInsFlags(cc,tempi);
@@ -136,24 +151,34 @@ U0 AsmHashLoad()
}
}
}
size=offset(CHashOpcode.ins)+
sizeof(CInstruction)*tempo->instruction_entry_cnt;
tempo1=MAlloc(size);
MemCpy(tempo1,tempo,size);
tempo1->use_cnt=0;
if (HashFind(tempo1->str,cmp.asm_hash,HTT_OPCODE))
size=offset(CHashOpcode.ins)+sizeof(CInst)*tempo_max->inst_entry_cnt;
tempo=MAlloc(size);
MemCpy(tempo,tempo_max,size);
tempo->use_cnt=0;
if (HashFind(tempo->str,cmp.asm_hash,HTT_OPCODE))
LexExcept(cc,"Duplicate OPCODE entry ");
HashAdd(tempo1,cmp.asm_hash);
HashAdd(tempo,cmp.asm_hash);
//Parse aliases.
if (cc->token==':') {
while (Lex(cc)==TK_IDENT) {
tempo2=MAllocIdentical(tempo);
tempo2->str=cc->cur_str;
cc->cur_str=0;
tempo2->oc_flags|=OCF_ALIAS;
if (HashFind(tempo2->str,cmp.asm_hash,HTT_OPCODE))
LexExcept(cc,"Duplicate OPCODE ALIAS entry ");
HashAdd(tempo2,cmp.asm_hash);
}
}
break;
case 9: //KEYWORD
case 10: //ASM_KEYWORD
case: //KEYWORD
case: //ASM_KEYWORD
temph=CAlloc(sizeof(CHashGeneric));
temph->str=cc->cur_str;
cc->cur_str=NULL;
Lex(cc); //skip keyword name
if (cc->token!=TK_INTEGER)
LexExcept(cc,"expecting integer at ");
if (cc->token!=TK_INT)
LexExcept(cc,"Expecting int at ");
temph->user_data0=cc->cur_i64;
if (i==9)
temph->type=HTT_KEYWORD;
@@ -162,32 +187,12 @@ U0 AsmHashLoad()
HashAdd(temph,cmp.asm_hash);
Lex(cc); //Skip INT
break;
case REGT_R8:
case REGT_R16:
case REGT_R32:
case REGT_R64:
case REGT_SEG:
case REGT_FSTK:
case REGT_MM:
case REGT_XMM:
tempr=CAlloc(sizeof(CHashReg));
tempr->str=cc->cur_str;
cc->cur_str=NULL;
Lex(cc); //skip keyword name
if (cc->token!=TK_INTEGER)
LexExcept(cc,"expecting integer at ");
tempr->type=HTT_REG;
tempr->reg_type=i;
tempr->reg_num=cc->cur_i64;
HashAdd(tempr,cmp.asm_hash);
Lex(cc); //Skip INT
break;
}
if (cc->token!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc); //Skip ';'
}
Free(tempo);
Free(tempo_max);
CmpCtrlDel(cc);
for (i=0;i<NUM_INTERNAL_TYPES;i++) {
tempit=&internal_types_table[i];
+3 -5
View File
@@ -30,8 +30,7 @@ U0 AOTStoreCodeU8(CCmpCtrl *cc,U8 b)
U0 AOTStoreCodeU32(CCmpCtrl *cc,U32 d)
{
CAOTCtrl *aotc=cc->aotc;
I64 i=aotc->ip>>AOT_BIN_BLK_BITS,
j=(aotc->ip+sizeof(U32))>>AOT_BIN_BLK_BITS;
I64 i=aotc->ip>>AOT_BIN_BLK_BITS,j=(aotc->ip+sizeof(U32))>>AOT_BIN_BLK_BITS;
U32 *_d;
CAOTBinBlk *tempbin;
if (i!=j)
@@ -69,8 +68,7 @@ U0 AOTStoreCodeU32(CCmpCtrl *cc,U32 d)
U0 AOTStoreCodeU64(CCmpCtrl *cc,U64 q)
{
CAOTCtrl *aotc=cc->aotc;
I64 i=aotc->ip>>AOT_BIN_BLK_BITS,
j=(aotc->ip+sizeof(I64))>>AOT_BIN_BLK_BITS,
I64 i=aotc->ip>>AOT_BIN_BLK_BITS,j=(aotc->ip+sizeof(I64))>>AOT_BIN_BLK_BITS,
*_q;
CAOTBinBlk *tempbin;
if (i!=j)
@@ -139,7 +137,7 @@ I64 AsmLexExpression(CCmpCtrl *cc)
if (cc->abs_cnts.externs)
LexExcept(cc,"Extern Not Allowed at ");
if (cc->flags & CCF_UNRESOLVED)
LexExcept(cc,"undefined sym at ");
LexExcept(cc,"Undefined sym at ");
result=Call(machine_code);
Free(machine_code);
}
+6 -7
View File
@@ -16,11 +16,11 @@ U0 AsmResolve(CCmpCtrl *cc,CAsmUnresolvedRef *tempu,U8 *label,Bool undefined)
}
tempauh=tempauh->next; //Technically, more than one won't work.
}
} else if (!(tempu->type&1)) {//Rel?
} else if (!(tempu->type&IEF_IMM_NOT_REL)) {
r-=tempu->rel_ip;
if (tempu->type==IET_REL_I8 && !(MIN_I8<=r<=MAX_I8) ||
tempu->type==IET_REL_I16 && !(MIN_I16<=r<=MAX_I16)) {
PrintErr("branch out of range at line:%04d %s\n",
PrintErr("Branch out of range at line:%04d %s\n",
tempu->line_num,label);
LexExcept(cc);
}
@@ -53,7 +53,7 @@ U0 AOTLocalsResolve(CCmpCtrl *cc)
tempauh=tempu->asm_undef_hash;
while (tempauh) {
if (tempauh->hash->type & HTF_UNRESOLVED) {
PrintErr("undefined sym at line:%04d %s %s\n",
PrintErr("Undefined sym at line:%04d %s %s\n",
tempu->line_num,aotc->last_label,tempauh->hash->str);
LexExcept(cc);
}
@@ -94,8 +94,7 @@ U0 AOTGlblsResolve(CCmpCtrl *cc,CAOT *tempaot)
while (tempauh) {
if (tempauh->hash->type & HTF_UNRESOLVED) {
tempex=tempauh->hash;
if (tempex->type & HTT_EXPORT_SYS_SYM &&
tempex->type & HTF_UNRESOLVED &&
if (tempex->type & HTT_EXPORT_SYS_SYM&& tempex->type & HTF_UNRESOLVED &&
!(tempex->type & HTF_IMPORT) &&
(tempf=HashFind(tempex->str,cc->htc.hash_table_lst,HTT_FUN)) &&
!Bt(&tempf->flags,Cf_EXTERN)) {
@@ -108,7 +107,7 @@ U0 AOTGlblsResolve(CCmpCtrl *cc,CAOT *tempaot)
tempex->type|=HTF_GOTO_LABEL;
tempex->use_cnt++;
} else {
PrintErr("undefined sym at line:%04d %s\n",
PrintErr("Undefined sym at line:%04d %s\n",
tempu->line_num,tempex->str);
LexExcept(cc);
}
@@ -150,7 +149,7 @@ U0 AOTGlblsResolve(CCmpCtrl *cc,CAOT *tempaot)
}
} else if (tempex->type & (HTF_EXPORT|HTF_RESOLVE)) {
if (tempex->type & HTF_UNRESOLVED) {
PrintErr("undefined sym at %s\n",tempex->str);
PrintErr("Undefined sym at %s\n",tempex->str);
LexExcept(cc);
}
if (tempex->type & HTF_RESOLVE) {
+204 -307
View File
@@ -1,5 +1,5 @@
U0 ICAddEct(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
I64 t2,I64 r2,I64 d2,I64 t3,I64 r3,I64 d3,I64 op,I64 ip)
U0 ICAddEct(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,
CICType t2,I64 r2,I64 d2,CICType t3,I64 r3,I64 d3,I64 op,I64 ip)
{
I64 i,temp,result_reg=REG_RAX;
Bool swap=FALSE;
@@ -9,11 +9,10 @@ U0 ICAddEct(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
SwapI64(&r2,&r3);
SwapI64(&d2,&d3);
}
if (t2&RT_MASK>=RT_I64 && r2!=result_reg &&
TY_REG<=t2&TY_MASK<=TY_RIP_DISP32) {
if (t1&TY_MASK==TY_REG && !(r2==r1 && TY_REG<=t2&TY_MASK<=TY_SIB))
if (t2.raw_type>=RT_I64 && r2!=result_reg && t2&MDG_REG_DISP_SIB_RIP) {
if (t1&MDF_REG && !(r2==r1 && t2&MDG_REG_DISP_SIB))
result_reg=r1;
ICMov(tempi,TY_REG+RT_I64,result_reg,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,result_reg,0,t3,r3,d3,ip);
i=ICModr1(result_reg,t2,r2,d2);
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
@@ -21,26 +20,26 @@ U0 ICAddEct(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
ICU16(tempi,i.u8[2]<<8+op);
ICModr2(tempi,i,d2,ip+4);
} else {
if (t2&TY_MASK==TY_REG)
if (t2&MDF_REG)
temp=r2;
else
temp=REG_RCX;
if (t1&TY_MASK==TY_REG)
if (t1&MDF_REG)
result_reg=r1;
if (temp==result_reg)
result_reg=REG_RDX;
if (swap ^^ tempi->ic_flags & ICF_A1_FIRST) {
if (r3==temp && TY_REG<=t3&TY_MASK<=TY_SIB)
if (swap) {
if (r3==temp && t3&MDG_REG_DISP_SIB)
temp=REG_RCX;
ICMov(tempi,TY_REG+RT_I64,temp,0,t2,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,result_reg,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,temp,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,result_reg,0,t3,r3,d3,ip);
} else {
if (r2==result_reg && TY_REG<=t2&TY_MASK<=TY_SIB)
if (r2==result_reg && t2&MDG_REG_DISP_SIB)
result_reg=REG_RDX;
ICMov(tempi,TY_REG+RT_I64,result_reg,0,t3,r3,d3,ip);
ICMov(tempi,TY_REG+RT_I64,temp,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,result_reg,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,temp,0,t2,r2,d2,ip);
}
i=0x48;
if (result_reg>7)
@@ -51,19 +50,19 @@ U0 ICAddEct(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
ICU8(tempi,OC_LOCK_PREFIX);
ICU24(tempi,0xC00000+i+(temp&7)<<16+(result_reg&7)<<19+op<<8);
}
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,result_reg,0,ip);
}
U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
I64 t2,I64 r2,I64 d2,I64 d,I64 op,I64 ip)
U0 ICAddSubEctImm(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,
CICType t2,I64 r2,I64 d2,I64 d,I64 op,I64 ip)
{
I64 i,r;
if (op.u8[0]==0x2B) {
op=0x0003;
d=-d;
}
if (t1&TY_MASK==TY_REG) {
if (t2&TY_MASK!=TY_REG) {
if (t1&MDF_REG) {
if (!(t2&MDF_REG)) {
ICMov(tempi,t1,r1,d1,t2,r2,d2,ip);
t2=t1;
r2=r1;
@@ -95,18 +94,18 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
}
if (op.u8[0]==0x03 && MIN_I32<=d<=MAX_I32 &&
!Bt(&cmp.non_ptr_vars_mask,r2)) {
i=ICModr1(r1,TY_DISP+RT_I64,r2,d);
i=ICModr1(r1,MDF_DISP+RT_I64,r2,d);
i.u8[1]|=0x48;
ICU24(tempi,i.u8[2]<<16+0x8D00+i.u8[1]);
ICModr2(tempi,i,d,ip+4);
return;
}
}
switch (t1>>4) {
case TY_REG>>4:
case TY_DISP>>4:
case TY_SIB>>4:
case TY_RIP_DISP32>>4:
switch (Bsr(t1)) {
case MDf_REG:
case MDf_DISP:
case MDf_SIB:
case MDf_RIP_DISP32:
if (t1!=t2 || r1!=r2 || d1!=d2) {
ICMov(tempi,t1,r1,d1,t2,r2,d2,ip);
t2=t1;
@@ -114,8 +113,7 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
d2=d1;
}
if (!d &&
(op.u8[0]==0x03||op.u8[0]==0x2B||op.u8[0]==0x33||op.u8[0]==0x0B))
if (!d &&(op.u8[0]==0x03||op.u8[0]==0x2B||op.u8[0]==0x33||op.u8[0]==0x0B))
return;
r=op.u8[1]; //not a reg but a slash val
if (op.u8[0]==0x03 && d==-1) //add -1
@@ -123,9 +121,9 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
if (op.u8[0]==0x03 && (d==1 || d==-1)) { //Add
i=ICModr1(r,t1,r1,d1);
if (t1!=TY_REG && tempi->ic_flags&ICF_LOCK)
if (!(t1&MDF_REG) && tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
switch (t1&RT_MASK) {
switch (t1.raw_type) {
case RT_I8:
case RT_U8:
ICRex(tempi,i.u8[1]);
@@ -143,11 +141,11 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
ICModr2(tempi,i,d1,ip+4);
return;
}
if (MIN_I8<=d<=MAX_I8 || t1&(RT_MASK-1)==RT_I8) {
if (MIN_I8<=d<=MAX_I8 || t1&(RTG_MASK-RTF_UNSIGNED)==RT_I8) {
i=ICModr1(r,t1,r1,d1);
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
switch (t1&RT_MASK) {
switch (t1.raw_type) {
case RT_I8:
case RT_U8:
ICRex(tempi,i.u8[1]);
@@ -166,11 +164,11 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
ICU8(tempi,d);
return;
}
if (MIN_I32<=d<=MAX_I32 || t1&RT_MASK<RT_I64) {
if (MIN_I32<=d<=MAX_I32 || t1.raw_type<RT_I64) {
i=ICModr1(r,t1,r1,d1);
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
switch (t1&RT_MASK) {
switch (t1.raw_type) {
case RT_I16:
case RT_U16:
ICOpSizeRex(tempi,i.u8[1]);
@@ -180,32 +178,32 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
ICRex(tempi,i.u8[1]);
ICU16(tempi,i.u8[2]<<8+0x81);
}
if (i.u8[0]!=MDR_RIP_REL)
if (i.u8[0]!=MODR_RIP_REL)
ICModr2(tempi,i,d1,);
else {
if (t1&(RT_MASK-1)==RT_I16)
if (t1&(RTG_MASK-RTF_UNSIGNED)==RT_I16)
ICU32(tempi,d1-(ip+tempi->ic_cnt+6));
else
ICU32(tempi,d1-(ip+tempi->ic_cnt+8));
tempi->ic_flags&=~ICF_CODE_FINAL;
}
if (t1&(RT_MASK-1)==RT_I16)
if (t1&(RTG_MASK-RTF_UNSIGNED)==RT_I16)
ICU16(tempi,d);
else
ICU32(tempi,d);
return;
}
break;
case TY_STK>>4:
ICAddSubEctImm(tempi,TY_REG+RT_I64,REG_RAX,0,t2,r2,d2,d,op,ip);
case MDf_STK:
ICAddSubEctImm(tempi,MDF_REG+RT_I64,REG_RAX,0,t2,r2,d2,d,op,ip);
ICPushRegs(tempi,1<<REG_RAX);
return;
}
ICAddEct(tempi,t1,r1,d1,TY_IMM+RT_I64,0,d,t2,r2,d2,op.u8[0],ip);
ICAddEct(tempi,t1,r1,d1,MDF_IMM+RT_I64,0,d,t2,r2,d2,op.u8[0],ip);
}
U0 ICSub(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
I64 t2,I64 r2,I64 d2,I64 t3,I64 r3,I64 d3,I64 ip)
U0 ICSub(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,
CICType t2,I64 r2,I64 d2,CICType t3,I64 r3,I64 d3,I64 ip)
{
I64 i=0x48,op=0x2B;
Bool swap=FALSE;
@@ -215,10 +213,9 @@ U0 ICSub(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
SwapI64(&r2,&r3);
SwapI64(&d2,&d3);
}
if (t2&RT_MASK>=RT_I64 && r2.u8[0]!=REG_RAX &&
(t2&TY_MASK!=TY_SIB || r2.u8[1]&15!=REG_RAX) &&
TY_REG<=t2&TY_MASK<=TY_RIP_DISP32) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
if (t2.raw_type>=RT_I64 && r2.u8[0]!=REG_RAX &&
(!(t2&MDF_SIB) || r2.u8[1]&15!=REG_RAX) && t2&MDG_REG_DISP_SIB_RIP) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
if (!swap) {
op=0x03;
ICU24(tempi,0xD8F748);
@@ -229,45 +226,25 @@ U0 ICSub(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
ICRex(tempi,i.u8[1]);
ICU16(tempi,i.u8[2]<<8+op);
ICModr2(tempi,i,d2,ip+4);
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,REG_RAX,0,ip);
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
if (t3&TY_MASK!=TY_REG || t3&RT_MASK<RT_I64) {
if (!(t3&MDF_REG) || t3.raw_type<RT_I64) {
if (swap) {
swap=FALSE;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
r3=REG_RCX;
r2=REG_RAX;
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
r2=REG_RCX;
r3=REG_RAX;
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
r2=REG_RCX;
}
} else {
if (t3&TY_MASK!=TY_REG || t3&RT_MASK<RT_I64) {
if (swap) {
swap=FALSE;
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
r2=REG_RAX;
r3=REG_RCX;
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
r3=REG_RAX;
r2=REG_RCX;
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
r2=REG_RCX;
}
}
if (swap) {
op=0x03;
ICU24(tempi,0xD9F748);
@@ -279,7 +256,7 @@ U0 ICSub(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
ICU24(tempi,0xC00000+i+(r3&7)<<16+(r2&7)<<19+op<<8);
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,r2,0,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,r2,0,ip);
}
}
@@ -287,23 +264,25 @@ U0 ICMul(CIntermediateCode *tempi,I64 ip)
{
I64 i,r2,r=REG_RAX,j;
CICArg *a1,*a2;
if (tempi->a1.type&TY_MASK==TY_IMM) {
Bool alt;
if (tempi->a1.type&MDF_IMM) {
a1=&tempi->a2;
a2=&tempi->a1;
tempi->ic_flags|=ICF_A1_FIRST;
alt=TRUE;
} else {
a1=&tempi->a1;
a2=&tempi->a2;
alt=FALSE;
}
i=a2->disp;
if (!(tempi->ic_class->raw_type&1) &&
a2->type&TY_MASK==TY_IMM && MIN_I32<=i<=MAX_I32) {
if (tempi->r.type==TY_REG+RT_I64) {
if (!(tempi->ic_class->raw_type&RTF_UNSIGNED) &&
a2->type&MDF_IMM && MIN_I32<=i<=MAX_I32) {
if (tempi->r.type==MDF_REG+RT_I64) {
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
a1->type,a1->reg,a1->disp,ip);
r=tempi->r.reg;
} else
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip);
if (r>7)
j=0xC0004D;
else
@@ -315,19 +294,18 @@ U0 ICMul(CIntermediateCode *tempi,I64 ip)
ICU32(tempi,i);
}
} else {
if (tempi->ic_class->raw_type&1)
if (tempi->ic_class->raw_type&RTF_UNSIGNED)
i=0xE0F748;
else
i=0xE8F748;
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
if (alt) {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
r2=REG_RCX;
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
if (a1->type&TY_MASK!=TY_REG ||
a1->type&RT_MASK<RT_I64) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
if (!(a1->type&MDF_REG) || a1->type.raw_type<RT_I64) {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
r2=REG_RCX;
} else
r2=a1->reg;
@@ -338,20 +316,20 @@ U0 ICMul(CIntermediateCode *tempi,I64 ip)
}
ICU24(tempi,i+r2<<16);
}
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,TY_REG+RT_I64,r,0,ip);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,MDF_REG+RT_I64,r,0,ip);
}
U0 ICMulEqu(CIntermediateCode *tempi,I64 ip)
{
I64 i=tempi->a2.disp,r=REG_RAX,j;
if (!(tempi->ic_class->raw_type&1) &&
tempi->a2.type&TY_MASK==TY_IMM && MIN_I32<=i<=MAX_I32) {
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->a1.type==TY_REG+RT_I64)
if (!(tempi->ic_class->raw_type&RTF_UNSIGNED) &&
tempi->a2.type&MDF_IMM && MIN_I32<=i<=MAX_I32) {
if (tempi->ic_flags & ICF_BY_VAL) {
if (tempi->a1.type==MDF_REG+RT_I64)
r=tempi->a1.reg;
else
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
if (r>7)
j=0xC0004D;
@@ -363,13 +341,13 @@ U0 ICMulEqu(CIntermediateCode *tempi,I64 ip)
ICU24(tempi,0x6900+j+(r&7)<<16+(r&7)<<19);
ICU32(tempi,i);
}
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,TY_REG+RT_I64,r,0,ip);
ICMov(tempi,tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,MDF_REG+RT_I64,r,0,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,
MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
r=REG_RBX;
if (MIN_I8<=i<=MAX_I8)
ICU32(tempi,i<<24+0xDB6B48);
@@ -377,68 +355,46 @@ U0 ICMulEqu(CIntermediateCode *tempi,I64 ip)
ICU24(tempi,0xDB6948);
ICU32(tempi,i);
}
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
TY_REG+RT_I64,REG_RBX,0,ip);
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
MDF_REG+RT_I64,REG_RBX,0,ip);
}
} else {
if (tempi->ic_class->raw_type&1)
if (tempi->ic_class->raw_type&RTF_UNSIGNED)
i=0xE3F748;
else
i=0xEBF748;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
if (tempi->ic_flags & ICF_BY_VAL) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
}
ICU24(tempi,i);
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,MDF_REG+RT_I64,REG_RAX,0,ip);
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_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,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,
MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
ICU24(tempi,i);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
MDF_REG+RT_I64,REG_RAX,0,ip);
}
}
if (tempi->r.type&TY_MASK)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,TY_REG+RT_I64,r,0,ip);
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,MDF_REG+RT_I64,r,0,ip);
}
U0 ICDiv(CIntermediateCode *tempi,I64 ip)
{
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_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,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
if (tempi->ic_class->raw_type&1) {
if (tempi->ic_class->raw_type&RTF_UNSIGNED) {
ICZero(tempi,REG_RDX);
ICU24(tempi,0xF1F748);
} else {
@@ -446,26 +402,18 @@ U0 ICDiv(CIntermediateCode *tempi,I64 ip)
ICU24(tempi,0xF9F748);
}
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICDivEqu(CIntermediateCode *tempi,Bool is_mod,I64 ip)
{
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
if (tempi->ic_flags & ICF_BY_VAL) {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
}
if (tempi->ic_class->raw_type&1) {
if (tempi->ic_class->raw_type&RTF_UNSIGNED) {
ICZero(tempi,REG_RDX);
ICU24(tempi,0xF1F748);
} else {
@@ -473,28 +421,20 @@ U0 ICDivEqu(CIntermediateCode *tempi,Bool is_mod,I64 ip)
ICU24(tempi,0xF9F748);
}
if (is_mod)
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,TY_REG+RT_I64,REG_RDX,0,ip);
ICMov(tempi,tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,MDF_REG+RT_I64,REG_RDX,0,ip);
else
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,MDF_REG+RT_I64,REG_RAX,0,ip);
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,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,
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
//dangerous might clobber RBX in Mov, but it doesn't
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,TY_DISP+tempi->a1.type_pointed_to,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+tempi->a1.type_pointed_to,
REG_RBX,0,ip);
if (tempi->ic_class->raw_type&1) {
if (tempi->ic_class->raw_type&RTF_UNSIGNED) {
ICZero(tempi,REG_RDX);
ICU24(tempi,0xF1F748);
} else {
@@ -502,36 +442,29 @@ U0 ICDivEqu(CIntermediateCode *tempi,Bool is_mod,I64 ip)
ICU24(tempi,0xF9F748);
}
if (is_mod)
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,REG_RBX,0,
TY_REG+RT_I64,REG_RDX,0,ip);
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,REG_RBX,0,
MDF_REG+RT_I64,REG_RDX,0,ip);
else
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,REG_RBX,0,
TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,REG_RBX,0,
MDF_REG+RT_I64,REG_RAX,0,ip);
}
if (tempi->r.type&TY_MASK) {
if (tempi->r.type.mode) {
if (is_mod)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RDX,0,ip);
MDF_REG+RT_I64,REG_RDX,0,ip);
else
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
}
U0 ICMod(CIntermediateCode *tempi,I64 ip)
{
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_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,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
if (tempi->ic_class->raw_type&1) {
if (tempi->ic_class->raw_type&RTF_UNSIGNED) {
ICZero(tempi,REG_RDX);
ICU24(tempi,0xF1F748);
} else {
@@ -539,35 +472,33 @@ U0 ICMod(CIntermediateCode *tempi,I64 ip)
ICU24(tempi,0xF9F748);
}
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RDX,0,ip);
MDF_REG+RT_I64,REG_RDX,0,ip);
}
U0 ICAddSubEctEqu(CIntermediateCode *tempi,I64 type_pointed_to,
I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,
I64 t3,I64 r3,I64 d3,I64 op,I64 ip)
U0 ICAddSubEctEqu(CIntermediateCode *tempi,U8 type_pointed_to,
CICType t1,I64 r1,I64 d1,CICType t2,I64 r2,I64 d2,
CICType t3,I64 r3,I64 d3,I64 op,I64 ip)
{
Bool done;
I64 result_reg,temp,i;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (t3&TY_MASK==TY_IMM) {
ICAddSubEctImm(tempi,
t2&TY_MASK+type_pointed_to,r2,d2,t2&TY_MASK+
if (tempi->ic_flags & ICF_BY_VAL) {
if (t3&MDF_IMM) {
ICAddSubEctImm(tempi,t2&MDG_MASK+type_pointed_to,r2,d2,t2&MDG_MASK+
type_pointed_to,r2,d2,d3,op,ip);
if (t1&TY_MASK)
ICMov(tempi,t1,r1,d1,t2&TY_MASK+type_pointed_to,r2,d2,ip);
if (t1.mode)
ICMov(tempi,t1,r1,d1,t2&MDG_MASK+type_pointed_to,r2,d2,ip);
return;
} else {
done=FALSE;
if (type_pointed_to>=RT_I64) {
if (!(t1&TY_MASK) &&
TY_REG<=t2&TY_MASK<=TY_RIP_DISP32) {
if (t3&TY_MASK==TY_REG)
if (!t1.mode && t2&MDG_REG_DISP_SIB_RIP) {
if (t3&MDF_REG)
temp=r3;
else {
temp=REG_RCX;
ICMov(tempi,TY_REG+RT_I64,temp,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,temp,0,t3,r3,d3,ip);
}
i=ICModr1(temp,t2&TY_MASK+type_pointed_to,r2,d2);
i=ICModr1(temp,t2&MDG_MASK+type_pointed_to,r2,d2);
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
ICRex(tempi,i.u8[1]);
@@ -575,44 +506,32 @@ U0 ICAddSubEctEqu(CIntermediateCode *tempi,I64 type_pointed_to,
ICModr2(tempi,i,d2,ip+4);
return;
}
if (t3&RT_MASK>=RT_I64 &&
TY_REG<=t3&TY_MASK<=TY_RIP_DISP32) {
if (t2&TY_MASK==TY_REG)
if (t3.raw_type>=RT_I64 && t3&MDG_REG_DISP_SIB_RIP) {
if (t2&MDF_REG)
result_reg=r2;
else {
result_reg=REG_RCX;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
}
i=ICModr1(result_reg,t3&TY_MASK+type_pointed_to,r3,d3);
i=ICModr1(result_reg,t3&MDG_MASK+type_pointed_to,r3,d3);
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
ICRex(tempi,i.u8[1]);
ICU16(tempi,i.u8[2]<<8+op.u8[0]);
ICModr2(tempi,i,d3,ip+4);
ICMov(tempi,t2&TY_MASK+type_pointed_to,r2,d2,
TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,t2&MDG_MASK+type_pointed_to,r2,d2,
MDF_REG+RT_I64,result_reg,0,ip);
done=TRUE;
}
}
if (!done) {
if (tempi->ic_flags & ICF_A1_FIRST) {
if (t2&TY_MASK==TY_REG && r2!=REG_RAX)
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
if (t2&MDF_REG && r2!=REG_RAX)
result_reg=r2;
else {
result_reg=REG_RCX;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
t2&TY_MASK+type_pointed_to,r2,d2,ip);
}
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
if (t2&TY_MASK==TY_REG && r2!=REG_RAX)
result_reg=r2;
else {
result_reg=REG_RCX;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
t2&TY_MASK+type_pointed_to,r2,d2,ip);
}
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
t2&MDG_MASK+type_pointed_to,r2,d2,ip);
}
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
@@ -621,35 +540,35 @@ U0 ICAddSubEctEqu(CIntermediateCode *tempi,I64 type_pointed_to,
else
ICU8(tempi,0x48);
ICU16(tempi,0xC000+op.u8[0]+(result_reg&7)<<11);
ICMov(tempi,t2&TY_MASK+type_pointed_to,r2,d2,
TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,t2&MDG_MASK+type_pointed_to,r2,d2,
MDF_REG+RT_I64,result_reg,0,ip);
}
}
} else {
done=FALSE;
if (t3&TY_MASK==TY_IMM && op.u8[2]) {
if (t3&MDF_IMM && op.u8[2]) {
if (!d3.u32[1]) {
if (tempi->ic_flags&ICF_NO_DEPEND_RESULT &&
t2&TY_MASK==TY_REG && d3(U64)<=MAX_I8) {
ICSlashOp(tempi,TY_DISP+type_pointed_to,r2,0,0x838000+op.u8[4],ip);
t2&MDF_REG && d3(U64)<=MAX_I8) {
ICSlashOp(tempi,MDF_DISP+type_pointed_to,r2,0,0x838000+op.u8[4],ip);
ICU8(tempi,d3);
done=TRUE;
} else if (op.u8[2]==0x24) {//AND
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_DISP+type_pointed_to,REG_RCX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
MDF_DISP+type_pointed_to,REG_RCX,0,ip);
result_reg=REG_RAX;
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
ICU16(tempi,op.u8[3]<<8+0x40);
ICU32(tempi,d3);
ICMov(tempi,TY_DISP+type_pointed_to,REG_RCX,0,
TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,MDF_DISP+type_pointed_to,REG_RCX,0,
MDF_REG+RT_I64,result_reg,0,ip);
done=TRUE;
} else if (type_pointed_to&RT_MASK<RT_I64) {//OR/XOR
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_DISP+type_pointed_to,REG_RCX,0,ip);
} else if (type_pointed_to<RT_I64) {//OR/XOR
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
MDF_DISP+type_pointed_to,REG_RCX,0,ip);
result_reg=REG_RAX;
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
@@ -663,48 +582,46 @@ U0 ICAddSubEctEqu(CIntermediateCode *tempi,I64 type_pointed_to,
ICU16(tempi,op.u8[2]<<8+0x40);
ICU8(tempi,d3);
}
ICMov(tempi,TY_DISP+type_pointed_to,REG_RCX,0,
TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,MDF_DISP+type_pointed_to,REG_RCX,0,
MDF_REG+RT_I64,result_reg,0,ip);
done=TRUE;
}
}
}
if (!done) {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
}
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,TY_DISP+type_pointed_to,REG_RCX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,
MDF_DISP+type_pointed_to,REG_RCX,0,ip);
result_reg=REG_RBX;
if (tempi->ic_flags&ICF_LOCK)
ICU8(tempi,OC_LOCK_PREFIX);
ICU8(tempi,0x48);
ICU16(tempi,0xC000+op.u8[0]+(result_reg&7)<<11);
ICMov(tempi,TY_DISP+type_pointed_to,REG_RCX,0,
TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,MDF_DISP+type_pointed_to,REG_RCX,0,
MDF_REG+RT_I64,result_reg,0,ip);
}
}
if (t1&TY_MASK)
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,result_reg,0,ip);
if (t1.mode)
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,result_reg,0,ip);
}
U0 ICShift(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
I64 t2,I64 r2,I64 d2,I64 t3,I64 r3,I64 d3,I64 us,I64 is,I64 ip)
U0 ICShift(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,
CICType t2,I64 r2,I64 d2,CICType t3,I64 r3,I64 d3,
I64 us,I64 is,I64 ip)
{
I64 i=0x48,result_reg;
if (tempi->ic_class->raw_type&1 || tempi->ic_flags & ICF_USE_UNSIGNED)
if (tempi->ic_class->raw_type&RTF_UNSIGNED ||
tempi->ic_flags & ICF_USE_UNSIGNED)
is=us;
if (t1&TY_MASK==TY_REG) {
if (t1&MDF_REG) {
result_reg=r1;
if (result_reg>7)
i++;
} else
result_reg=REG_RAX;
if (t3&TY_MASK==TY_IMM) {
ICMov(tempi,TY_REG+RT_I64,result_reg,0,t2,r2,d2,ip);
if (t3&MDF_IMM) {
ICMov(tempi,MDF_REG+RT_I64,result_reg,0,t2,r2,d2,ip);
if (d3==1)
ICU24(tempi,i+is.u16[2]<<8+(result_reg&7)<<16);
else {
@@ -712,52 +629,37 @@ U0 ICShift(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,
ICU8(tempi,d3);
}
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,result_reg,0,t2,r2,d2,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
ICMov(tempi,TY_REG+RT_I64,result_reg,0,t2,r2,d2,ip);
}
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,result_reg,0,t2,r2,d2,ip);
ICU24(tempi,i+is.u16[1]<<8+(result_reg&7)<<16);
}
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,result_reg,0,ip);
}
U0 ICShiftEqu(CIntermediateCode *tempi,I64 type_pointed_to,
I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 t3,I64 r3,I64 d3,
I64 us,I64 is,I64 ip)
U0 ICShiftEqu(CIntermediateCode *tempi,U8 type_pointed_to,
CICType t1,I64 r1,I64 d1,
CICType t2,I64 r2,I64 d2,
CICType t3,I64 r3,I64 d3,I64 us,I64 is,I64 ip)
{
I64 result_reg;
if (tempi->ic_class->raw_type&1 || tempi->ic_flags & ICF_USE_UNSIGNED)
if (tempi->ic_class->raw_type&RTF_UNSIGNED ||
tempi->ic_flags & ICF_USE_UNSIGNED)
is=us;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->ic_flags & ICF_A1_FIRST) {
if (t2&TY_MASK==TY_REG)
if (tempi->ic_flags & ICF_BY_VAL) {
if (!(t3&MDF_IMM))
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
if (t2&MDF_REG)
result_reg=r2;
else {
result_reg=REG_RAX;
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
t2&TY_MASK+type_pointed_to,r2,d2,ip);
}
if (t3&TY_MASK!=TY_IMM)
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
} else {
if (t3&TY_MASK!=TY_IMM)
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
if (t2&TY_MASK==TY_REG)
result_reg=r2;
else {
result_reg=REG_RAX;
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
t2&TY_MASK+type_pointed_to,r2,d2,ip);
}
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
t2&MDG_MASK+type_pointed_to,r2,d2,ip);
}
if (result_reg>7)
ICU8(tempi,0x49);
else
ICU8(tempi,0x48);
if (t3&TY_MASK==TY_IMM) {
if (t3&MDF_IMM) {
if (d3==1)
ICU16(tempi,is.u16[2]+(result_reg&7)<<8);
else {
@@ -766,21 +668,16 @@ U0 ICShiftEqu(CIntermediateCode *tempi,I64 type_pointed_to,
}
} else
ICU16(tempi,is.u16[1]+(result_reg&7)<<8);
ICMov(tempi,t2&TY_MASK+type_pointed_to,r2,d2,TY_REG+RT_I64,result_reg,0,ip);
ICMov(tempi,t2&MDG_MASK+type_pointed_to,r2,d2,
MDF_REG+RT_I64,result_reg,0,ip);
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,t2,r2,d2,ip);
if (t3&TY_MASK!=TY_IMM)
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
} else {
if (t3&TY_MASK!=TY_IMM)
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,t2,r2,d2,ip);
}
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,TY_DISP+type_pointed_to,REG_RDX,0,ip);
if (!(t3&MDF_IMM))
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t3,r3,d3,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,t2,r2,d2,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+type_pointed_to,REG_RDX,0,ip);
result_reg=REG_RAX;
ICU8(tempi,0x48);
if (t3&TY_MASK==TY_IMM) {
if (t3&MDF_IMM) {
if (d3==1)
ICU16(tempi,is.u16[2]+(result_reg&7)<<8);
else {
@@ -790,8 +687,8 @@ U0 ICShiftEqu(CIntermediateCode *tempi,I64 type_pointed_to,
} else
ICU16(tempi,is.u16[1]+(result_reg&7)<<8);
ICMov(tempi,
TY_DISP+type_pointed_to,REG_RDX,0,TY_REG+RT_I64,result_reg,0,ip);
MDF_DISP+type_pointed_to,REG_RDX,0,MDF_REG+RT_I64,result_reg,0,ip);
}
if (t1&TY_MASK)
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,result_reg,0,ip);
if (t1.mode)
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,result_reg,0,ip);
}
+146 -249
View File
@@ -1,55 +1,43 @@
U0 ICUnaries(CIntermediateCode *tempi,I64 op,I64 ip)
{
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICSlashOp(tempi,TY_REG+RT_I64,REG_RAX,0,op,ip);
ICSlashOp(tempi,MDF_REG+RT_I64,REG_RAX,0,op,ip);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICNot(CIntermediateCode *tempi,I64 ip)
{
I64 i;
if (tempi->a1.type&RT_MASK<=RT_U8 &&
TY_DISP<=tempi->a1.type&TY_MASK<=TY_RIP_DISP32) {
if (tempi->a1.type.raw_type<=RT_U8 && tempi->a1.type&MDG_DISP_SIB_RIP) {
i=ICModr1(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp);
ICRex(tempi,i.u8[1]);
ICU16(tempi,i.u8[2]<<8+0xF6); //TEST ?,0xFF
ICModr2(tempi,i,tempi->a1.disp,ip+5);
ICU8(tempi,0xFF);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICTest(tempi,REG_RAX);
}
ICU24(tempi,0xC0940F); //SETZ AL
ICU32(tempi,0xC0B60F48); //MOVZX RAX,AL
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_U64,REG_RAX,0,ip);
MDF_REG+RT_U64,REG_RAX,0,ip);
}
U0 ICAndAnd(CIntermediateCode *tempi,I64 ip)
{
I64 r2;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.type&TY_MASK!=TY_REG || tempi->a1.reg==REG_RAX) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (!(tempi->a1.type&MDF_REG) || tempi->a1.reg==REG_RAX) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->a1.type&TY_MASK!=TY_REG || tempi->a1.reg==REG_RAX) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
}
ICZero(tempi,REG_RAX);
ICTest(tempi,r2);
ICU16(tempi,0x0874);
@@ -57,31 +45,20 @@ U0 ICAndAnd(CIntermediateCode *tempi,I64 ip)
ICU16(tempi,0x0374);
ICU24(tempi,0xC0FF48);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICOrOr(CIntermediateCode *tempi,I64 ip)
{
I64 i=0x48,r2;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.type&TY_MASK!=TY_REG || tempi->a1.reg==REG_RAX) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (!(tempi->a1.type&MDF_REG) || tempi->a1.reg==REG_RAX) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->a1.type&TY_MASK!=TY_REG || tempi->a1.reg==REG_RAX) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
}
if (r2>7) {
i++;
@@ -92,31 +69,20 @@ U0 ICOrOr(CIntermediateCode *tempi,I64 ip)
ICU16(tempi,0x0374);
ICU24(tempi,0xC0FF48);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICXorXor(CIntermediateCode *tempi,I64 ip)
{
I64 r2;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.type&TY_MASK!=TY_REG) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (!(tempi->a1.type&MDF_REG)) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->a1.type&TY_MASK!=TY_REG) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r2=REG_RDX;
} else
r2=tempi->a1.reg;
}
ICZero(tempi,REG_RBX);
ICTest(tempi,r2);
ICU16(tempi,0x0374);
@@ -130,16 +96,16 @@ U0 ICXorXor(CIntermediateCode *tempi,I64 ip)
ICU24(tempi,0xC33348);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICCmp(CIntermediateCode *tempi,I64 us,I64 is,I64 ip)
{
I64 r1,d1,r2,i=0x48,j=tempi->a2.disp;
if (tempi->a2.type&TY_MASK==TY_IMM && MIN_I32<=j<=MAX_I32) {
if (tempi->a2.type&MDF_IMM && MIN_I32<=j<=MAX_I32) {
if (!(tempi->ic_flags&(ICF_POP_CMP|ICF_PUSH_CMP)) &&
tempi->a1.type&TY_MASK==TY_DISP && //TODO
tempi->a1.type&RT_MASK>=RT_I64 && tempi->a1.reg!=REG_RAX) {
tempi->a1.type&MDF_DISP && //TODO
tempi->a1.type.raw_type>=RT_I64 && tempi->a1.reg!=REG_RAX) {
r1=tempi->a1.reg;
d1=tempi->a1.disp;
ICZero(tempi,REG_RAX);
@@ -167,10 +133,10 @@ U0 ICCmp(CIntermediateCode *tempi,I64 us,I64 is,I64 ip)
ICPopRegs(tempi,1<<REG_RCX);
r1=REG_RCX;
} else {
if (tempi->a1.type&TY_MASK==TY_REG && tempi->a1.reg!=REG_RAX)
if (tempi->a1.type&MDF_REG && tempi->a1.reg!=REG_RAX)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r1=REG_RCX;
}
@@ -187,39 +153,19 @@ U0 ICCmp(CIntermediateCode *tempi,I64 us,I64 is,I64 ip)
}
}
if (tempi->ic_flags & ICF_PUSH_CMP)
ICPush(tempi,TY_IMM+RT_I64,0,j,ip);
if (tempi->ic_class->raw_type&1 || tempi->ic_flags & ICF_USE_UNSIGNED)
ICPush(tempi,MDF_IMM+RT_I64,0,j,ip);
if (tempi->ic_class->raw_type&RTF_UNSIGNED ||
tempi->ic_flags & ICF_USE_UNSIGNED)
is=us;
ICU16(tempi,0x300+is);
ICU24(tempi,0xC0FF48);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->ic_flags & ICF_POP_CMP) {
ICPopRegs(tempi,1<<REG_RCX);
r1=REG_RCX;
} else {
if (tempi->a1.type&TY_MASK==TY_REG && tempi->a1.reg!=REG_RAX)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r1=REG_RCX;
}
}
if (tempi->a2.type&TY_MASK==TY_REG && tempi->a2.reg!=REG_RAX)
if (tempi->a2.type&MDF_REG && tempi->a2.reg!=REG_RAX)
r2=tempi->a2.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
r2=REG_RDX;
}
} else {
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,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
r2=REG_RCX;
}
@@ -227,15 +173,14 @@ U0 ICCmp(CIntermediateCode *tempi,I64 us,I64 is,I64 ip)
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&MDF_REG && tempi->a1.reg!=REG_RAX)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r1=REG_RDX;
}
}
}
ICZero(tempi,REG_RAX);
if (r2>7)
i++;
@@ -244,12 +189,13 @@ U0 ICCmp(CIntermediateCode *tempi,I64 us,I64 is,I64 ip)
if (tempi->ic_flags & ICF_PUSH_CMP)
ICPushRegs(tempi,1<<r2);
ICU24(tempi,0xC03B00+i+(r2&7)<<16+(r1&7)<<19);
if (tempi->ic_class->raw_type&1 || tempi->ic_flags & ICF_USE_UNSIGNED)
if (tempi->ic_class->raw_type&RTF_UNSIGNED ||
tempi->ic_flags & ICF_USE_UNSIGNED)
is=us;
ICU16(tempi,0x300+is);
ICU24(tempi,0xC0FF48);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
}
@@ -258,85 +204,50 @@ U0 ICBitOps(CIntermediateCode *tempi,CICArg *a1,CICArg *a2,
{//TODO:not fully utilizing Modr
Bool no_depend=ToBool(tempi2->ic_flags&ICF_NO_DEPEND_RESULT);
I64 r1,t2,r2,d2,i=0x48;
if (tempi->ic_flags & ICF_NOT_ADDR) {
t2=a2->type&TY_MASK+RT_I64; //TODO: check overflow
if (tempi->ic_flags & ICF_BY_VAL) {
t2=a2->type&MDG_MASK+RT_I64; //TODO: check overflow
r2=a2->reg;
d2=a2->disp;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (a1->type&TY_MASK==TY_REG && (a1->reg!=REG_RAX||no_depend))
r1=a1->reg;
else if (a1->type&TY_MASK!=TY_IMM || a1->disp>63) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
r1=REG_RCX;
} else
r1=0;
if (!(TY_REG<=t2&TY_MASK<=TY_RIP_DISP32) ||
!(r2.u8[0]!=REG_RAX&&(t2&TY_MASK!=TY_SIB||r2.u8[1]&15!=REG_RAX)||
no_depend)) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,t2,r2,d2,ip);
t2=TY_REG+RT_I64;
r2=REG_RDX;
d2=0;
}
} else {
if (!(TY_REG<=t2&TY_MASK<=TY_RIP_DISP32) ||
!(r2.u8[0]!=REG_RAX&&(t2&TY_MASK!=TY_SIB||r2.u8[1]&15!=REG_RAX)||
no_depend)) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
t2=TY_REG+RT_I64;
if (!(t2&MDG_REG_DISP_SIB_RIP) || !(r2.u8[0]!=REG_RAX&&(!(t2&MDF_SIB) ||
r2.u8[1]&15!=REG_RAX) || no_depend)) {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,ip);
t2=MDF_REG+RT_I64;
r2=REG_RCX;
d2=0;
}
if (a1->type&TY_MASK==TY_REG && (a1->reg!=REG_RAX||no_depend))
if (a1->type&MDF_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);
else if (!(a1->type&MDF_IMM) || a1->disp>63) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
r1=REG_RDX;
} else
r1=0;
}
} else {
t2=TY_DISP+RT_I64;
t2=MDF_DISP+RT_I64;
d2=0;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (a1->type&TY_MASK==TY_REG && (a1->reg!=REG_RAX||no_depend))
r1=a1->reg;
else if (a1->type&TY_MASK!=TY_IMM || a1->disp>63) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
r1=REG_RCX;
} else
r1=0;
if (a2->type&TY_MASK==TY_REG && (a2->reg!=REG_RAX||no_depend))
if (a2->type&MDF_REG && (a2->reg!=REG_RAX||no_depend))
r2=a2->reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a2->type,a2->reg,a2->disp,ip);
r2=REG_RDX;
}
} else {
if (a2->type&TY_MASK==TY_REG && (a2->reg!=REG_RAX||no_depend))
r2=a2->reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,MDF_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&MDF_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);
else if (!(a1->type&MDF_IMM) || a1->disp>63) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
r1=REG_RDX;
} else
r1=0;
}
}
if (!no_depend)
ICZero(tempi,REG_RAX);
if (tempi->ic_flags&ICF_LOCK && op!=0xA30F)
ICU8(tempi,OC_LOCK_PREFIX);
if (a1->type&TY_MASK==TY_IMM && a1->disp<32)
t2=t2&TY_MASK+RT_U32;
if (a1->type&MDF_IMM && a1->disp<32)
t2=t2&MDG_MASK+RT_U32;
i=ICModr1(r1,t2,r2,d2);
ICRex(tempi,i.u8[1]);
if (a1->type&TY_MASK==TY_IMM && a1->disp<64) {
if (a1->type&MDF_IMM && a1->disp<64) {
ICU24(tempi,i.u8[2]<<16+op_imm);
ICModr2(tempi,i,d2,ip+5);
ICU8(tempi,a1->disp);
@@ -346,15 +257,15 @@ U0 ICBitOps(CIntermediateCode *tempi,CICArg *a1,CICArg *a2,
}
if (!no_depend) {
ICU32(tempi,0xD08348);
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
}
U0 ICToUpper(CIntermediateCode *tempi,I64 ip)
{
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICU32(tempi,0x61F88348);
ICU16(tempi,0x0A7C);
@@ -378,10 +289,10 @@ U0 ICToF64(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip)
U0 ICToBool(CCmpCtrl *,CIntermediateCode *tempi,I64 ip)
{
I64 r;
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->a1.type&MDF_REG)
r=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RAX;
}
@@ -394,40 +305,40 @@ U0 ICPreIncDec(CIntermediateCode *tempi,I64 op,I64 ip)
{
I64 r;
CHashClass *tempc=tempi->ic_class,*tempc1=tempc-1;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->ic_flags & ICF_BY_VAL) {
if (tempc->ptr_stars_cnt && tempc1->size!=1) {
ICAddSubEctImm(tempi,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,tempc1->size,op.u16[3],ip);
} else
ICSlashOp(tempi,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,op,ip);
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
} else {
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->a1.type&MDF_REG)
r=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RCX;
}
if (tempc->ptr_stars_cnt &&
tempc1->size!=1) {
ICAddSubEctImm(tempi,TY_DISP+tempi->a1.type_pointed_to,r,0,
TY_DISP+tempi->a1.type_pointed_to,r,0,
ICAddSubEctImm(tempi,MDF_DISP+tempi->a1.type_pointed_to,r,0,
MDF_DISP+tempi->a1.type_pointed_to,r,0,
tempc1->size,op.u16[3],ip);
} else
ICSlashOp(tempi,
TY_DISP+tempi->a1.type_pointed_to,r,0,op,ip);
if (tempi->r.type&TY_MASK)
MDF_DISP+tempi->a1.type_pointed_to,r,0,op,ip);
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+tempi->a1.type_pointed_to,r,0,ip);
MDF_DISP+tempi->a1.type_pointed_to,r,0,ip);
}
}
@@ -435,82 +346,83 @@ U0 ICPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip)
{
I64 r;
CHashClass *tempc=tempi->ic_class,*tempc1=tempc-1;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->r.type&TY_MASK)
if (tempi->ic_flags & ICF_BY_VAL) {
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
if (tempc->ptr_stars_cnt && tempc1->size!=1)
ICAddSubEctImm(tempi,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,op,ip);
} else {
if (tempi->a1.type&TY_MASK==TY_REG &&
!(tempi->r.type&TY_MASK==TY_REG && tempi->r.reg==tempi->a1.reg))
if (tempi->a1.type&MDF_REG &&
!(tempi->r.type&MDF_REG && tempi->r.reg==tempi->a1.reg))
r=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RCX;
}
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+tempi->a1.type_pointed_to,r,0,ip);
MDF_DISP+tempi->a1.type_pointed_to,r,0,ip);
if (tempc->ptr_stars_cnt && tempc1->size!=1)
ICAddSubEctImm(tempi,TY_DISP+tempi->a1.type_pointed_to,r,0,
TY_DISP+tempi->a1.type_pointed_to,r,0,tempc1->size,op.u16[3],ip);
ICAddSubEctImm(tempi,MDF_DISP+tempi->a1.type_pointed_to,r,0,
MDF_DISP+tempi->a1.type_pointed_to,r,0,tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,TY_DISP+tempi->a1.type_pointed_to,r,0,op,ip);
ICSlashOp(tempi,MDF_DISP+tempi->a1.type_pointed_to,r,0,op,ip);
}
}
U0 ICDerefPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip)
{
I64 t,r;
CICType t;
I64 r;
CHashClass *tempc1=tempi->ic_class;
t=tempi->r.type&RT_MASK;
t=tempi->r.type.raw_type;
if (t>tempi->a1.type_pointed_to)
t=tempi->a1.type_pointed_to;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->ic_flags & ICF_BY_VAL) {
if (tempi->a1.type&MDF_REG)
r=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RDX;
}
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+t,r,0,ip);
MDF_DISP+t,r,0,ip);
if (tempc1->size!=1)
ICAddSubEctImm(tempi,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,
tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,op,ip);
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,op,ip);
} else {
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->a1.type&MDF_REG)
r=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RCX;
}
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_DISP+RT_I64,r,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_I64,r,0,ip);
if (tempc1->size!=1)
ICAddSubEctImm(tempi,TY_DISP+RT_I64,r,0,TY_DISP+RT_I64,r,0,
ICAddSubEctImm(tempi,MDF_DISP+RT_I64,r,0,MDF_DISP+RT_I64,r,0,
tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,TY_DISP+RT_I64,r,0,op,ip);
ICSlashOp(tempi,MDF_DISP+RT_I64,r,0,op,ip);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+t,REG_RDX,0,ip);
MDF_DISP+t,REG_RDX,0,ip);
}
}
@@ -518,70 +430,72 @@ U0 ICAssignPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip)
{
CHashClass *tempc1=tempi->ic_class2-1;
I64 r;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->ic_flags & ICF_BY_VAL) {
if (tempi->a1.type&MDF_REG)
r=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
r=REG_RDX;
}
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,r,0,
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,r,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempc1->size!=1 || tempi->a1.type&TY_MASK==TY_STK)
if (tempc1->size!=1 || tempi->a1.type&MDF_STK)
ICAddSubEctImm(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
TY_REG+RT_I64,r,0,tempc1->size,op.u16[3],ip);
MDF_REG+RT_I64,r,0,tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,op,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,TY_DISP+RT_I64,REG_RDX,0,ip);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_I64,REG_RDX,0,ip);
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempc1->size!=1)
ICAddSubEctImm(tempi,TY_DISP+RT_I64,REG_RDX,0,
TY_REG+RT_I64,REG_RCX,0,tempc1->size,op.u16[3],ip);
ICAddSubEctImm(tempi,MDF_DISP+RT_I64,REG_RDX,0,
MDF_REG+RT_I64,REG_RCX,0,tempc1->size,op.u16[3],ip);
else
ICSlashOp(tempi,TY_DISP+RT_I64,REG_RDX,0,op,ip);
ICSlashOp(tempi,MDF_DISP+RT_I64,REG_RDX,0,op,ip);
}
}
U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip,
I64 us,I64 is,I64 not_us,I64 not_is,U8 *buf,I64 ip2)
{
I64 r1,r2,i=0x48,j,t1,t2,result_reg;
I64 r1,r2,i=0x48,j,result_reg;
CICType t1,t2;
Bool short_jmp,swap,done;
CCodeMisc *lb;
CICArg *a1=&tempi->a1,*a2=&tempi->a2;
j=a1->disp;
if (a1->type&TY_MASK==TY_IMM && MIN_I32<=j<=MAX_I32) {
if (a1->type&MDF_IMM && MIN_I32<=j<=MAX_I32) {
SwapI64(&a1,&a2);
swap=TRUE;
us=not_us;
is=not_is;
} else
swap=FALSE;
if (tempi->ic_class->raw_type&1 || tempi->ic_flags & ICF_USE_UNSIGNED)
if (tempi->ic_class->raw_type&RTF_UNSIGNED ||
tempi->ic_flags & ICF_USE_UNSIGNED)
is=us;
j=a2->disp;
if (a2->type&TY_MASK==TY_IMM && MIN_I32<=j<=MAX_I32) {
if (!has_result && TY_REG<=a1->type&TY_MASK<=TY_RIP_DISP32)
if (a2->type&MDF_IMM && MIN_I32<=j<=MAX_I32) {
if (!has_result && a1->type&MDG_REG_DISP_SIB_RIP)
ICAddSubEctImm(tempi,a1->type,a1->reg,a1->disp,
a1->type,a1->reg,a1->disp,j,0x073B,ip2);
else {
if (a1->type&TY_MASK==TY_REG)
if (a1->type&MDF_REG)
r1=a1->reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
r1=REG_RDX;
}
if (!j) {
@@ -613,7 +527,7 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip,
}
if (has_result) {
if (!swap) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,TY_IMM+RT_I64,0,j,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,MDF_IMM+RT_I64,0,j,ip2);
result_reg=REG_RCX;
} else
result_reg=r1;
@@ -624,10 +538,9 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip,
r1=a1->reg;
r2=a2->reg;
t2=a2->type;
if (t2&RT_MASK>=RT_I64 && !has_result &&
TY_DISP<=t2&TY_MASK<=TY_RIP_DISP32) {
if (t1&TY_MASK!=TY_REG || t1&RT_MASK<RT_I64) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip2);
if (t2.raw_type>=RT_I64 && !has_result && t2&MDG_DISP_SIB_RIP) {
if (!(t1&MDF_REG) || t1.raw_type<RT_I64) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip2);
r1=REG_RAX;
}
i=ICModr1(r1,t2,r2,a2->disp);
@@ -635,13 +548,13 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip,
ICU16(tempi,i.u8[2]<<8+0x3B);
ICModr2(tempi,i,a2->disp,ip2+4);
done=TRUE;
} else if (t1&RT_MASK>=RT_I64 && TY_REG<=t1&TY_MASK<=TY_RIP_DISP32) {
if (t2&TY_MASK!=TY_REG || t2&RT_MASK<RT_I64) {
if (t1&TY_MASK==TY_REG && r1==REG_RAX) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
} else if (t1.raw_type>=RT_I64 && t1&MDG_REG_DISP_SIB_RIP) {
if (!(t2&MDF_REG) || t2.raw_type<RT_I64) {
if (t1&MDF_REG && r1==REG_RAX) {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
r2=REG_RCX;
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
r2=REG_RAX;
}
}
@@ -654,33 +567,18 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip,
done=TRUE;
}
if (!done) {
if (tempi->ic_flags & ICF_A1_FIRST) {
if (a1->type&TY_MASK==TY_REG)
r1=a1->reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip2);
r1=REG_RAX;
}
if (a2->type&TY_MASK==TY_REG)
if (a2->type&MDF_REG)
r2=a2->reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
r2=REG_RCX;
}
} else {
if (a2->type&TY_MASK==TY_REG)
r2=a2->reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
r2=REG_RAX;
}
if (a1->type&TY_MASK==TY_REG)
if (a1->type&MDF_REG)
r1=a1->reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip2);
r1=REG_RCX;
}
}
if (r2>7)
i++;
if (r1>7)
@@ -730,7 +628,7 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip,
}
if (has_result)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,result_reg,0,ip2);
MDF_REG+RT_I64,result_reg,0,ip2);
}
U0 ICTestAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
@@ -739,16 +637,15 @@ U0 ICTestAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
Bool short_jmp;
CCodeMisc *lb;
if (tempi->a1.type&TY_MASK!=TY_REG) {
if (tempi->a1.type&RT_MASK<=RT_U8 &&
TY_DISP<=tempi->a1.type&TY_MASK<=TY_RIP_DISP32) {
if (!(tempi->a1.type&MDF_REG)) {
if (tempi->a1.type.raw_type<=RT_U8 && tempi->a1.type&MDG_DISP_SIB_RIP) {
i=ICModr1(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp);
ICRex(tempi,i.u8[1]);
ICU16(tempi,i.u8[2]<<8+0xF6);
ICModr2(tempi,i,tempi->a1.disp,ip2+5);
ICU8(tempi,0xFF);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICTest(tempi,REG_RAX);
}
+162 -324
View File
@@ -6,7 +6,7 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
CCodeMisc *lb;
CICArg *a1,*a2;
if (tempi->a1.type&TY_MASK==TY_IMM) {
if (tempi->a1.type&MDF_IMM) {
swap=TRUE;
a1=&tempi->a2;
a2=&tempi->a1;
@@ -16,19 +16,19 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
a2=&tempi->a2;
}
if (a2->type&TY_MASK==TY_IMM && a2->disp>MAX_U32)
if (a2->type&MDF_IMM && a2->disp>MAX_U32)
override=TRUE;
else
override=FALSE;
if (a1->type&RT_MASK<a2->type&RT_MASK)
it=a1->type&RT_MASK;
if (a1->type.raw_type<a2->type.raw_type)
it=a1->type.raw_type;
else
it=a2->type&RT_MASK;
it=a2->type.raw_type;
i=a2->disp;
if (a2->type&TY_MASK==TY_IMM && i<=MAX_U32) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip2);
if (a2->type&MDF_IMM && i<=MAX_U32) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a1->type,a1->reg,a1->disp,ip2);
if (i<=MAX_U8)
ICU16(tempi,i<<8+0xA8);
else if (i<=MAX_U16)
@@ -38,51 +38,51 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
ICU32(tempi,i);
}
} else {
t1=TY_REG+it;
t1=MDF_REG+it;
d1=0;
if ((tempi->ic_flags&ICF_A1_FIRST ^^swap)&&!override) {
if (a1->type&TY_MASK==TY_REG) {
if (swap && !override) {
if (a1->type&MDF_REG) {
r1=a1->reg;
swap=TRUE;
} else {
r1=REG_RCX;
swap=FALSE;
}
if (a2->type&TY_MASK==TY_REG) {
if (a2->type&MDF_REG) {
r2=a2->reg;
swap=FALSE;
} else
r2=REG_RDX;
if (swap) {
if (a1->type&TY_MASK!=TY_REG || r1!=a1->reg)
ICMov(tempi,TY_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
if (TY_REG<=a2->type&TY_MASK<=TY_RIP_DISP32) {
t1=a2->type&TY_MASK+it;
if (!(a1->type&MDF_REG) || r1!=a1->reg)
ICMov(tempi,MDF_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
if (a2->type&MDG_REG_DISP_SIB_RIP) {
t1=a2->type&MDG_MASK+it;
r2=a2->reg;
d1=a2->disp;
} else
ICMov(tempi,TY_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
i=ICModr1(r1,t1,r2,d1);
} else {
if (TY_REG<=a1->type&TY_MASK<=TY_RIP_DISP32) {
t1=a1->type&TY_MASK+it;
if (a1->type&MDG_REG_DISP_SIB_RIP) {
t1=a1->type&MDG_MASK+it;
r1=a1->reg;
d1=a1->disp;
} else
ICMov(tempi,TY_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
if (a2->type&TY_MASK!=TY_REG || r2!=a2->reg)
ICMov(tempi,TY_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
if (!(a2->type&MDF_REG) || r2!=a2->reg)
ICMov(tempi,MDF_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
i=ICModr1(r2,t1,r1,d1);
}
} else {
if (a2->type&TY_MASK==TY_REG) {
if (a2->type&MDF_REG) {
r2=a2->reg;
swap=FALSE;
} else {
r2=REG_RDX;
swap=TRUE;
}
if (a1->type&TY_MASK==TY_REG) {
if (a1->type&MDF_REG) {
r1=a1->reg;
swap=TRUE;
} else
@@ -90,24 +90,24 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
if (override)
swap=FALSE;
if (swap) {
if (TY_REG<=a2->type&TY_MASK<=TY_RIP_DISP32) {
t1=a2->type&TY_MASK+it;
if (a2->type&MDG_REG_DISP_SIB_RIP) {
t1=a2->type&MDG_MASK+it;
r2=a2->reg;
d1=a2->disp;
} else
ICMov(tempi,TY_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
if (a1->type&TY_MASK!=TY_REG || r1!=a1->reg)
ICMov(tempi,TY_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
if (!(a1->type&MDF_REG) || r1!=a1->reg)
ICMov(tempi,MDF_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
i=ICModr1(r1,t1,r2,d1);
} else {
if (a2->type&TY_MASK!=TY_REG || r2!=a2->reg)
ICMov(tempi,TY_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
if (TY_REG<=a1->type&TY_MASK<=TY_RIP_DISP32) {
t1=a1->type&TY_MASK+it;
if (!(a2->type&MDF_REG) || r2!=a2->reg)
ICMov(tempi,MDF_REG+RT_I64,r2,0,a2->type,a2->reg,a2->disp,ip2);
if (a1->type&MDG_REG_DISP_SIB_RIP) {
t1=a1->type&MDG_MASK+it;
r1=a1->reg;
d1=a1->disp;
} else
ICMov(tempi,TY_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,r1,0,a1->type,a1->reg,a1->disp,ip2);
i=ICModr1(r2,t1,r1,d1);
}
}
@@ -159,33 +159,31 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2)
U0 ICAssign(CIntermediateCode *tempi,I64 ip)
{
CIntermediateCode *tempi1;
if (tempi->ic_flags & ICF_NOT_ADDR) {
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
if (tempi->ic_flags & ICF_BY_VAL) {
ICMov(tempi,tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->r.type&TY_MASK) {
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->r.type.mode) {
if (tempi->a1.type&MDF_REG)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
else
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
}
} else {
if (tempi->a1.type&TY_MASK==TY_REG) {
if (!(tempi1=OptLag1(tempi)) ||
tempi1->ic_code!=IC_ADD_CONST ||
tempi1->r.type!=TY_REG+RT_I64 || tempi1->r.reg!=tempi->a1.reg ||
tempi1->a1.type!=TY_REG+RT_I64 || tempi1->a1.reg!=tempi->a1.reg ||
(tempi->a2.type&TY_MASK==TY_REG||tempi->a2.type&TY_MASK==TY_DISP) &&
if (tempi->a1.type&MDF_REG) {
if (!(tempi1=OptLag1(tempi)) || tempi1->ic_code!=IC_ADD_CONST ||
tempi1->r.type!=MDF_REG+RT_I64 || tempi1->r.reg!=tempi->a1.reg ||
tempi1->a1.type!=MDF_REG+RT_I64 || tempi1->a1.reg!=tempi->a1.reg ||
(tempi->a2.type&MDF_REG || tempi->a2.type&MDF_DISP) &&
tempi->a2.reg==tempi->a1.reg ||
tempi->r.type&TY_MASK ||
tempi1->ic_flags&~ICG_NO_CVT_MASK) {
tempi->r.type.mode || tempi1->ic_flags&~ICG_NO_CVT_MASK) {
ICMov(tempi,
TY_DISP+tempi->a1.type_pointed_to,tempi->a1.reg,tempi->a1.disp,
MDF_DISP+tempi->a1.type_pointed_to,tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
@@ -193,16 +191,16 @@ U0 ICAssign(CIntermediateCode *tempi,I64 ip)
~ICF_CODE_FINAL|ICF_DONT_RESTORE;
tempi->a1.disp=tempi1->ic_data;
OptSetNOP1(tempi1); //This better not be last pass!
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
}
@@ -217,135 +215,80 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,
Bool short_jmp;
CCodeMisc *lb;
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->ic_flags & ICF_A1_FIRST) {
if (!(tempi->ic_flags&ICF_SWAP) && a1->type&TY_MASK!=TY_REG &&
(a1->type&TY_MASK!=TY_IMM || a1->disp>63) ||
tempi->ic_flags&ICF_SWAP && a1->type&TY_MASK==TY_IMM &&
a1->disp<64 || a1->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip2);
t1=TY_REG+RT_I64;
r1=REG_RCX;
d1=0;
} else {
t1=a1->type;
if (t1&TY_MASK==TY_IMM && a1->disp<64)
r1=0;
else
r1=a1->reg;
d1=a1->disp;
}
if (tempi->ic_flags&ICF_SWAP && a2->type&TY_MASK!=TY_REG &&
(a2->type&TY_MASK!=TY_IMM || a2->disp>63) ||
!(tempi->ic_flags&ICF_SWAP) && a2->type&TY_MASK==TY_IMM &&
a2->disp<64 || a2->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a2->type,a2->reg,a2->disp,ip2);
t2=TY_REG+RT_I64;
r2=REG_RDX;
if (tempi->ic_flags & ICF_BY_VAL) {
if (tempi->ic_flags&ICF_SWAP && !(a2->type&MDF_REG) &&
(!(a2->type&MDF_IMM) ||a2->disp>63)||
!(tempi->ic_flags&ICF_SWAP) && a2->type&MDF_IMM &&
a2->disp<64 || a2->type&MDF_STK) {
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
t2=MDF_REG+RT_I64;
r2=REG_RCX;
d2=0;
} else {
t2=a2->type;
if (t2&TY_MASK==TY_IMM && a2->disp<64)
if (t2&MDF_IMM && a2->disp<64)
r2=0;
else
r2=a2->reg;
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) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
t2=TY_REG+RT_I64;
r2=REG_RCX;
d2=0;
} else {
t2=a2->type;
if (t2&TY_MASK==TY_IMM && a2->disp<64)
r2=0;
else
r2=a2->reg;
d2=a2->disp;
}
if (!(tempi->ic_flags&ICF_SWAP) && a1->type&TY_MASK!=TY_REG &&
(a1->type&TY_MASK!=TY_IMM || a1->disp>63) ||
tempi->ic_flags&ICF_SWAP && a1->type&TY_MASK==TY_IMM &&
a1->disp<64 || a1->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
t1=TY_REG+RT_I64;
if (!(tempi->ic_flags&ICF_SWAP) && !(a1->type&MDF_REG) &&
(!(a1->type&MDF_IMM) || a1->disp>63) ||
tempi->ic_flags&ICF_SWAP && a1->type&MDF_IMM &&
a1->disp<64 || a1->type&MDF_STK) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
t1=MDF_REG+RT_I64;
r1=REG_RDX;
d1=0;
} else {
t1=a1->type;
if (t1&TY_MASK==TY_IMM && a1->disp<64)
if (t1&MDF_IMM && a1->disp<64)
r1=0;
else
r1=a1->reg;
d1=a1->disp;
}
}
} else {
t1=TY_DISP+RT_I64;
t2=TY_DISP+RT_I64;
t1=MDF_DISP+RT_I64;
t2=MDF_DISP+RT_I64;
d1=0;
d2=0;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (a1->type&TY_MASK==TY_REG)
r1=a1->reg;
else if (tempi->ic_flags&ICF_SWAP || a1->type&TY_MASK!=TY_IMM ||
a1->disp>63) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip2);
r1=REG_RCX;
} else
r1=0;
if (a2->type&TY_MASK==TY_REG)
if (a2->type&MDF_REG)
r2=a2->reg;
else if (!(tempi->ic_flags&ICF_SWAP) || a2->type&TY_MASK!=TY_IMM ||
else if (!(tempi->ic_flags&ICF_SWAP) || !(a2->type&MDF_IMM) ||
a2->disp>63) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a2->type,a2->reg,a2->disp,ip2);
r2=REG_RDX;
} else
r2=0;
} else {
if (a2->type&TY_MASK==TY_REG)
r2=a2->reg;
else if (!(tempi->ic_flags&ICF_SWAP) || a2->type&TY_MASK!=TY_IMM ||
a2->disp>63) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a2->type,a2->reg,a2->disp,ip2);
r2=REG_RCX;
} else
r2=0;
if (a1->type&TY_MASK==TY_REG)
if (a1->type&MDF_REG)
r1=a1->reg;
else if (tempi->ic_flags&ICF_SWAP || a1->type&TY_MASK!=TY_IMM ||
a1->disp>63) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
else if (tempi->ic_flags&ICF_SWAP || !(a1->type&MDF_IMM) || a1->disp>63) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
r1=REG_RDX;
} else
r1=0;
}
}
if (tempi->ic_flags&ICF_LOCK && op!=0xA30F)
ICU8(tempi,OC_LOCK_PREFIX);
if (tempi->ic_flags&ICF_SWAP) {
if (a2->type&TY_MASK==TY_IMM && a2->disp<32) {
if (a2->type&MDF_IMM && a2->disp<32) {
if (op==0xA30F && a2->disp<8) {
t=t1&TY_MASK+RT_U8;
t=t1&MDG_MASK+RT_U8;
op_imm=0xF6; //TEST
} else
t=t1&TY_MASK+RT_U32;
t=t1&MDG_MASK+RT_U32;
} else
t=t1;
i=ICModr1(r2,t,r1,d1);
SwapI64(&a1,&a2);
} else {
if (a1->type&TY_MASK==TY_IMM && a1->disp<32) {
if (a1->type&MDF_IMM && a1->disp<32) {
if (op==0xA30F && a1->disp<8) {
t=t2&TY_MASK+RT_U8;
t=t2&MDG_MASK+RT_U8;
op_imm=0xF6; //TEST
} else
t=t2&TY_MASK+RT_U32;
t=t2&MDG_MASK+RT_U32;
} else
t=t2;
i=ICModr1(r1,t,r2,d2);
@@ -359,7 +302,7 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,
is=0x75850F;
else
is=0x74840F;
} else if (a1->type&TY_MASK==TY_IMM && a1->disp<64) {
} else if (a1->type&MDF_IMM && a1->disp<64) {
ICU24(tempi,i.u8[2]<<16+op_imm);
ICModr2(tempi,i,a2->disp,ip2+5);
ICU8(tempi,a1->disp);
@@ -398,111 +341,77 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,
U0 ICQueInit(CIntermediateCode *tempi,I64 ip2)
{
I64 r1;
if (tempi->a1.type==TY_REG+RT_I64)
if (tempi->a1.type==MDF_REG+RT_I64)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RAX;
}
ICMov(tempi,TY_DISP+RT_I64,r1,0,TY_REG+RT_I64,r1,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,r1,sizeof(U8 *),TY_REG+RT_I64,r1,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r1,0,MDF_REG+RT_I64,r1,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r1,sizeof(U8 *),MDF_REG+RT_I64,r1,0,ip2);
}
U0 ICQueIns(CIntermediateCode *tempi,I64 ip2)
{
I64 r1,r2;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.type==TY_REG+RT_I64 && tempi->a1.reg!=REG_RAX)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RDX;
}
if (tempi->a2.type==TY_REG+RT_I64)
if (tempi->a2.type==MDF_REG+RT_I64 && tempi->a2.reg!=REG_RDX)
r2=tempi->a2.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r2=REG_RAX;
}
} else {
if (tempi->a2.type==TY_REG+RT_I64 && tempi->a2.reg!=REG_RDX)
r2=tempi->a2.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r2=REG_RAX;
}
if (tempi->a1.type==TY_REG+RT_I64)
if (tempi->a1.type==MDF_REG+RT_I64)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RDX;
}
}
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,TY_DISP+RT_I64,r1,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,r1,0,TY_REG+RT_I64,r2,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,r2,0,TY_REG+RT_I64,REG_RBX,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,r2,sizeof(U8 *),TY_REG+RT_I64,r1,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,REG_RBX,sizeof(U8 *),TY_REG+RT_I64,r2,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,MDF_DISP+RT_I64,r1,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r1,0,MDF_REG+RT_I64,r2,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r2,0,MDF_REG+RT_I64,REG_RBX,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r2,sizeof(U8 *),MDF_REG+RT_I64,r1,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,REG_RBX,sizeof(U8 *),MDF_REG+RT_I64,r2,0,ip2);
}
U0 ICQueInsRev(CIntermediateCode *tempi,I64 ip2)
{
I64 r1,r2;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.type==TY_REG+RT_I64 && tempi->a1.reg!=REG_RAX)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RDX;
}
if (tempi->a2.type==TY_REG+RT_I64)
if (tempi->a2.type==MDF_REG+RT_I64 && tempi->a2.reg!=REG_RDX)
r2=tempi->a2.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r2=REG_RAX;
}
} else {
if (tempi->a2.type==TY_REG+RT_I64 && tempi->a2.reg!=REG_RDX)
r2=tempi->a2.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r2=REG_RAX;
}
if (tempi->a1.type==TY_REG+RT_I64)
if (tempi->a1.type==MDF_REG+RT_I64)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RDX;
}
}
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,TY_DISP+RT_I64,r1,sizeof(U8 *),ip2);
ICMov(tempi,TY_DISP+RT_I64,REG_RBX,0,TY_REG+RT_I64,r2,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,r2,0,TY_REG+RT_I64,r1,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,r2,sizeof(U8 *),TY_REG+RT_I64,REG_RBX,0,ip2);
ICMov(tempi,TY_DISP+RT_I64,r1,sizeof(U8 *),TY_REG+RT_I64,r2,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,MDF_DISP+RT_I64,r1,sizeof(U8 *),ip2);
ICMov(tempi,MDF_DISP+RT_I64,REG_RBX,0,MDF_REG+RT_I64,r2,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r2,0,MDF_REG+RT_I64,r1,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r2,sizeof(U8 *),MDF_REG+RT_I64,REG_RBX,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,r1,sizeof(U8 *),MDF_REG+RT_I64,r2,0,ip2);
}
U0 ICQueRem(CIntermediateCode *tempi,I64 ip2)
{
I64 r1;
if (tempi->a1.type==TY_REG+RT_I64)
if (tempi->a1.type==MDF_REG+RT_I64)
r1=tempi->a1.reg;
else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RAX;
}
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,TY_DISP+RT_I64,r1,0,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_DISP+RT_I64,r1,sizeof(U8 *),ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,MDF_DISP+RT_I64,r1,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_I64,r1,sizeof(U8 *),ip2);
ICU24(tempi,0x1A8948);
ICU32(tempi,sizeof(U8 *)<<24+0x538948);
}
@@ -510,58 +419,25 @@ U0 ICQueRem(CIntermediateCode *tempi,I64 ip2)
U0 ICMinMax(CIntermediateCode *tempi,I64 op,I64 ip2)
{
I64 r1,i1=0x48;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.type==TY_REG+RT_I64 && tempi->a1.reg!=REG_RAX) {
r1=tempi->a1.reg;
if (r1>7) {
i1++;
r1&=7;
}
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
if (tempi->a2.reg==REG_RAX && TY_REG<=tempi->a2.type&TY_MASK<=TY_SIB) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
r1=REG_RDX;
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
if (tempi->a2.type==TY_REG+RT_I64) {
if (tempi->a2.type==MDF_REG+RT_I64 && tempi->a2.reg!=REG_RAX) {
r1=tempi->a2.reg;
if (r1>7) {
i1++;
r1&=7;
}
} else {
r1=REG_RDX;
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
}
}
}
} else {
if (tempi->a2.type==TY_REG+RT_I64 && tempi->a2.reg!=REG_RAX) {
r1=tempi->a2.reg;
if (r1>7) {
i1++;
r1&=7;
}
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
} else {
if (tempi->a1.reg==REG_RAX && TY_REG<=tempi->a1.type&TY_MASK<=TY_SIB) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
if (tempi->a1.reg==REG_RAX && tempi->a1.type&MDG_REG_DISP_SIB) {
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
r1=REG_RDX;
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
if (tempi->a1.type==TY_REG+RT_I64) {
if (tempi->a1.type==MDF_REG+RT_I64) {
r1=tempi->a1.reg;
if (r1>7) {
i1++;
@@ -569,125 +445,94 @@ U0 ICMinMax(CIntermediateCode *tempi,I64 op,I64 ip2)
}
} else {
r1=REG_RDX;
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
}
}
}
ICU24(tempi,0xC03B00+r1<<16+i1);
ICU32(tempi,0xC0000F00+op<<16+r1<<24+i1);
}
U0 ICSqr(CIntermediateCode *tempi,I64 op,I64 ip2)
{
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICSlashOp(tempi,TY_REG+RT_I64,REG_RAX,0,op,ip2);
ICSlashOp(tempi,MDF_REG+RT_I64,REG_RAX,0,op,ip2);
}
U0 ICModU64(CIntermediateCode *tempi,I64 ip2)
{
I64 t1,r1,d1;
if (tempi->ic_flags & ICF_A1_FIRST) {
CICType t1;
I64 r1,d1;
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
if (tempi->a1.reg!=REG_RAX && tempi->a1.reg!=REG_RDX &&
TY_REG<=tempi->a1.type&TY_MASK<=TY_SIB &&
tempi->a1.type&RT_MASK>=RT_I64) {
tempi->a1.type&MDG_REG_DISP_SIB &&
tempi->a1.type.raw_type>=RT_I64) {
t1=tempi->a1.type;
r1=tempi->a1.reg;
d1=tempi->a1.disp;
} else {
t1=TY_REG+RT_I64;
t1=MDF_REG+RT_I64;
r1=REG_RBX;
d1=0;
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
if (tempi->a1.reg!=REG_RAX && tempi->a1.reg!=REG_RDX &&
TY_REG<=tempi->a1.type&TY_MASK<=TY_SIB &&
tempi->a1.type&RT_MASK>=RT_I64) {
t1=tempi->a1.type;
r1=tempi->a1.reg;
d1=tempi->a1.disp;
} else {
t1=TY_REG+RT_I64;
r1=REG_RBX;
d1=0;
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
}
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,TY_DISP+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+RT_I64,REG_RCX,0,ip2);
ICZero(tempi,REG_RDX);
ICSlashOp(tempi,t1,r1,d1,SLASH_OP_DIV,ip2);
ICMov(tempi,TY_DISP+RT_I64,REG_RCX,0,TY_REG+RT_I64,REG_RAX,0,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_REG+RT_I64,REG_RDX,0,ip2);
ICMov(tempi,MDF_DISP+RT_I64,REG_RCX,0,MDF_REG+RT_I64,REG_RAX,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
MDF_REG+RT_I64,REG_RDX,0,ip2);
}
U0 ICSwap(CIntermediateCode *tempi,I64 ip2)
{
I64 r1,r2;
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->a1.type&MDF_REG)
r1=tempi->a1.reg;
else
r1=REG_RAX;
if (tempi->a2.type&TY_MASK==TY_REG)
if (tempi->a2.type&MDF_REG)
r2=tempi->a2.reg;
else
r2=REG_RAX;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (r1==r2) {
if (r2==REG_RAX)
r2=REG_RBX;
else
r1=REG_RAX;
}
ICMov(tempi,TY_REG+RT_I64,r1,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,r2,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
if (r1==r2) {
if (r1==REG_RAX)
r1=REG_RBX;
else
r2=REG_RAX;
}
ICMov(tempi,TY_REG+RT_I64,r2,0,
ICMov(tempi,MDF_REG+RT_I64,r2,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,r1,0,
ICMov(tempi,MDF_REG+RT_I64,r1,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
switch (tempi->ic_code) {
case IC_SWAP_U8:
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,TY_DISP+RT_U8,r1,0,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_DISP+RT_U8,r2,0,ip2);
ICMov(tempi,TY_DISP+RT_U8,r2,0,TY_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,TY_DISP+RT_U8,r1,0,TY_REG+RT_I64,REG_RDX,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_U8,r1,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U8,r2,0,ip2);
ICMov(tempi,MDF_DISP+RT_U8,r2,0,MDF_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,MDF_DISP+RT_U8,r1,0,MDF_REG+RT_I64,REG_RDX,0,ip2);
break;
case IC_SWAP_U16:
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,TY_DISP+RT_U16,r1,0,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_DISP+RT_U16,r2,0,ip2);
ICMov(tempi,TY_DISP+RT_U16,r2,0,TY_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,TY_DISP+RT_U16,r1,0,TY_REG+RT_I64,REG_RDX,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_U16,r1,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U16,r2,0,ip2);
ICMov(tempi,MDF_DISP+RT_U16,r2,0,MDF_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,MDF_DISP+RT_U16,r1,0,MDF_REG+RT_I64,REG_RDX,0,ip2);
break;
case IC_SWAP_U32:
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,TY_DISP+RT_U32,r1,0,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_DISP+RT_U32,r2,0,ip2);
ICMov(tempi,TY_DISP+RT_U32,r2,0,TY_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,TY_DISP+RT_U32,r1,0,TY_REG+RT_I64,REG_RDX,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_U32,r1,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U32,r2,0,ip2);
ICMov(tempi,MDF_DISP+RT_U32,r2,0,MDF_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,MDF_DISP+RT_U32,r1,0,MDF_REG+RT_I64,REG_RDX,0,ip2);
break;
case IC_SWAP_I64:
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,TY_DISP+RT_U64,r1,0,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_DISP+RT_U64,r2,0,ip2);
ICMov(tempi,TY_DISP+RT_U64,r2,0,TY_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,TY_DISP+RT_U64,r1,0,TY_REG+RT_I64,REG_RDX,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,MDF_DISP+RT_U64,r1,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_DISP+RT_U64,r2,0,ip2);
ICMov(tempi,MDF_DISP+RT_U64,r2,0,MDF_REG+RT_I64,REG_RCX,0,ip2);
ICMov(tempi,MDF_DISP+RT_U64,r1,0,MDF_REG+RT_I64,REG_RDX,0,ip2);
break;
}
}
@@ -695,14 +540,14 @@ U0 ICSwap(CIntermediateCode *tempi,I64 ip2)
U0 ICAndEqu(CIntermediateCode *tempi,I64 ip2)
{
I64 i,bit;
if (tempi->a2.type&TY_MASK==TY_IMM && tempi->a1.type&TY_MASK!=TY_STK &&
if (tempi->a2.type&MDF_IMM && !(tempi->a1.type&MDF_STK) &&
tempi->ic_flags&ICF_NO_DEPEND_RESULT) {
i=~tempi->a2.disp;
bit=Bsf(i);
if (0<=bit==Bsr(i)) {
tempi->a2.disp=bit;
tempi->a2.reg=0;
tempi->a1.type=tempi->a1.type&TY_MASK+RT_I64;
tempi->a1.type=tempi->a1.type&MDG_MASK+RT_I64;
ICBitOps(tempi,&tempi->a2,&tempi->a1,tempi,0xB30F,0x30BA0F,ip2);
return;
}
@@ -716,14 +561,14 @@ U0 ICAndEqu(CIntermediateCode *tempi,I64 ip2)
U0 ICOrEqu(CIntermediateCode *tempi,I64 ip2)
{
I64 i,bit;
if (tempi->a2.type&TY_MASK==TY_IMM && tempi->a1.type&TY_MASK!=TY_STK &&
if (tempi->a2.type&MDF_IMM && !(tempi->a1.type&MDF_STK) &&
tempi->ic_flags&ICF_NO_DEPEND_RESULT) {
i=tempi->a2.disp;
bit=Bsf(i);
if (0<=bit==Bsr(i) && i>MAX_I8) {
tempi->a2.disp=bit;
tempi->a2.reg=0;
tempi->a1.type=tempi->a1.type&TY_MASK+RT_I64;
tempi->a1.type=tempi->a1.type&MDG_MASK+RT_I64;
ICBitOps(tempi,&tempi->a2,&tempi->a1,tempi,0xAB0F,0x28BA0F,ip2);
return;
}
@@ -737,14 +582,14 @@ U0 ICOrEqu(CIntermediateCode *tempi,I64 ip2)
U0 ICXorEqu(CIntermediateCode *tempi,I64 ip2)
{
I64 i,bit;
if (tempi->a2.type&TY_MASK==TY_IMM && tempi->a1.type&TY_MASK!=TY_STK &&
if (tempi->a2.type&MDF_IMM && !(tempi->a1.type&MDF_STK) &&
tempi->ic_flags&ICF_NO_DEPEND_RESULT) {
i=tempi->a2.disp;
bit=Bsf(i);
if (0<=bit==Bsr(i)) {
tempi->a2.disp=bit;
tempi->a2.reg=0;
tempi->a1.type=tempi->a1.type&TY_MASK+RT_I64;
tempi->a1.type=tempi->a1.type&MDG_MASK+RT_I64;
ICBitOps(tempi,&tempi->a2,&tempi->a1,tempi,0xBB0F,0x38BA0F,ip2);
return;
}
@@ -762,17 +607,17 @@ U0 ICSwitch(CIntermediateCode *tempi,I64 ip,
CCodeMisc *lb;
Bool short_jmp;
CAOTAbsAddr *tempa;
if (tempi->a1.type&TY_MASK!=TY_REG || tempi->a1.reg&7==REG_RSP)
if (!(tempi->a1.type&MDF_REG) || tempi->a1.reg&7==REG_RSP)
r=REG_RDX;
else
r=tempi->a1.reg;
if (nobound)
ICMov(tempi,TY_REG+RT_I64,r,0,
ICMov(tempi,MDF_REG+RT_I64,r,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
else {
if (tempi->a2.type&TY_MASK==TY_IMM) {
if (tempi->a2.type&MDF_IMM) {
j=tempi->a2.disp;
ICMov(tempi,TY_REG+RT_I64,r,0,
ICMov(tempi,MDF_REG+RT_I64,r,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
if (MIN_I8<=j<=MAX_I8) {
i=0xF88348+(r&7)<<16;
@@ -785,24 +630,17 @@ U0 ICSwitch(CIntermediateCode *tempi,I64 ip,
ICU24(tempi,i);
ICU32(tempi,j);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
i=0xC13B48+(r&7)<<19;
if (r>7) i+=4;
ICU24(tempi,i);
}
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,r,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,r,0,
ICMov(tempi,MDF_REG+RT_I64,r,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
i=0xC13B48+(r&7)<<19;
if (r>7) i+=4;
ICU24(tempi,i);
+103 -160
View File
@@ -21,17 +21,19 @@ U0 CmpNoteFloatOp(CCmpCtrl *cc,CIntermediateCode *tempi,
case CN_MAIN:
if (cc->last_float_op_ic!=tempi) {
if (cc->dont_push_float) {
if (!(tempi->ic_flags & ICF_A1_FIRST))
tempi->ic_flags|=ICF_ALTERNATE_TEMPLATE;
if (intermediate_code_table[tempi->ic_code].arg_cnt==IS_2_ARG &&
cc->last_float_op_ic->r.reg!=REG_R8)
tempi->ic_flags|=ICF_ALT_TEMPLATE;
else
tempi->ic_flags&=~ICF_ALTERNATE_TEMPLATE;
tempi->ic_flags&=~ICF_ALT_TEMPLATE;
link=TRUE;
}
} else {
if (cc->last_float_op_pos==CN_A1 ^^ !(tempi->ic_flags & ICF_A1_FIRST))
tempi->ic_flags|=ICF_ALTERNATE_TEMPLATE;
if (intermediate_code_table[tempi->ic_code].arg_cnt==IS_2_ARG &&
cc->last_float_op_pos!=CN_A1)
tempi->ic_flags|=ICF_ALT_TEMPLATE;
else
tempi->ic_flags&=~ICF_ALTERNATE_TEMPLATE;
tempi->ic_flags&=~ICF_ALT_TEMPLATE;
link=TRUE;
}
break;
@@ -79,7 +81,7 @@ U0 ICCopyTemplate(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,
U8 *ptr;
I64 i=0;
if (!off_the_record) {
if (tempi->ic_flags&ICF_ALTERNATE_TEMPLATE)
if (tempi->ic_flags&ICF_ALT_TEMPLATE)
alt=TRUE;
else
alt=FALSE;
@@ -118,8 +120,8 @@ U0 ICCopyTemplate(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,
tempi->ic_cnt+=i;
}
U0 ICFCvt(CCmpCtrl *cc,CIntermediateCode *tempi,
I64 r1,I64 t2,I64 r2,I64 d2,Bool to_int,I64 pos,I64 ip)
U0 ICFCvt(CCmpCtrl *cc,CIntermediateCode *tempi,I64 r1,
CICType t2,I64 r2,I64 d2,Bool to_int,I64 pos,I64 ip)
{
I64 rsp_size=0,op1,op2;
Bool dont_push_float,dont_pop_float;
@@ -134,12 +136,9 @@ U0 ICFCvt(CCmpCtrl *cc,CIntermediateCode *tempi,
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (!dont_push_float) {
if (!(t2&RT_MASK>=RT_I64 &&
(t2&TY_MASK==TY_DISP ||
t2&TY_MASK==TY_RIP_DISP32 ||
t2&TY_MASK==TY_SIB))) {
if (!(t2.raw_type>=RT_I64 && t2&MDG_DISP_SIB_RIP)) {
ICPush(tempi,t2,r2,d2,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size=8;
} else {
if (!dont_pop_float) {
@@ -162,13 +161,13 @@ U0 ICFCvt(CCmpCtrl *cc,CIntermediateCode *tempi,
if (rsp_size)
ICAddRSP(tempi,rsp_size);
} else {
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,op2,ip);
ICPop(tempi,TY_REG+RT_I64,r1,0,ip);
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,op2,ip);
ICPop(tempi,MDF_REG+RT_I64,r1,0,ip);
}
}
U0 ICFCvt2(CCmpCtrl *cc,CIntermediateCode *tempi,
I64 r1,I64 t2,I64 r2,I64 d2,Bool to_int,I64 ip)
U0 ICFCvt2(CCmpCtrl *cc,CIntermediateCode *tempi,I64 r1,
CICType t2,I64 r2,I64 d2,Bool to_int,I64 ip)
{
I64 rsp_size=0,op1,op2;
if (to_int) {
@@ -178,20 +177,17 @@ U0 ICFCvt2(CCmpCtrl *cc,CIntermediateCode *tempi,
op1=SLASH_OP_FILD;
op2=SLASH_OP_FSTP;
}
if (!(t2&RT_MASK>=RT_I64 &&
(t2&TY_MASK==TY_DISP ||
t2&TY_MASK==TY_RIP_DISP32 ||
t2&TY_MASK==TY_SIB))) {
if (!(t2.raw_type>=RT_I64 && t2&MDG_DISP_SIB_RIP)) {
ICPush(tempi,t2,r2,d2,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size=8;
} else {
rsp_size=8;
ICAddRSP(tempi,-8);
}
ICSlashOp(tempi,t2,r2,d2,op1,ip);
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,op2,ip);
ICPop(tempi,TY_REG+RT_I64,r1,0,ip);
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,op2,ip);
ICPop(tempi,MDF_REG+RT_I64,r1,0,ip);
cc->last_dont_pushable=cc->last_dont_popable=FALSE; //TODO: improve this
}
@@ -206,23 +202,20 @@ U0 ICFUnaryMinus(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf2,I64 ip)
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (!dont_push_float) {
if (a1->type&RT_MASK>=RT_I64 &&
(a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 ||
a1->type&TY_MASK==TY_SIB)) {
if (a1->type.raw_type>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
t1=a1->type;
r1=a1->reg;
d1=a1->disp;
} else {
if (a1->type&TY_MASK==TY_IMM) {
if (a1->type&MDF_IMM) {
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
t1=MDF_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
}
}
@@ -241,7 +234,7 @@ U0 ICFUnaryMinus(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf2,I64 ip)
if (rsp_size)
ICAddRSP(tempi,rsp_size);
} else {
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,ip);
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,ip);
ICPop(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,ip);
}
}
@@ -251,30 +244,23 @@ U0 ICFMod(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip)
Bool dont_push_float,dont_pop_float;
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (dont_push_float) {
if (tempi->ic_flags&ICF_ALTERNATE_TEMPLATE)
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
if (tempi->ic_flags&ICF_ALT_TEMPLATE)
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
else
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
}
//TODO: unpushable,unpop? Not sure
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_MAIN);
if (!dont_pop_float)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICFPow(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
@@ -284,17 +270,10 @@ U0 ICFPow(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
CHashExport *tempex=HashFind("SYS_POW",
cc->htc.hash_table_lst,HTT_EXPORT_SYS_SYM);
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
if (cc->flags&CCF_AOT_COMPILE) {
if (!tempex) {
tempex=CAlloc(sizeof(CHashExport));
@@ -354,17 +333,16 @@ U0 ICFPow(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
}
tempi->ic_flags&=~ICF_CODE_FINAL;
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICFOp(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
{//for ADD,SUB,DIV,MUL
CICArg *a1,*a2;
Bool dont_push_float,dont_pop_float,alt;
I64 rsp_size=0,builtin1=0,builtin2=0,
t1,r1,d1,t2,r2,d2;
I64 rsp_size=0,builtin1=0,builtin2=0,t1,r1,d1,t2,r2,d2;
if (tempi->ic_flags&ICF_ALTERNATE_TEMPLATE) {
if (tempi->ic_flags&ICF_ALT_TEMPLATE) {
a1=&tempi->a2;
a2=&tempi->a1;
alt=TRUE;
@@ -379,122 +357,115 @@ U0 ICFOp(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (dont_push_float) {
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
}
}
} else {
if (tempi->ic_flags & ICF_A1_FIRST^^alt) {
if (a2->type&TY_MASK!=TY_STK) {
if (a1->type&RT_MASK>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
if (alt) {
if (!(a2->type&MDF_STK)) {
if (a1->type.raw_type>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
t1=a1->type;
r1=a1->reg;
d1=a1->disp;
} else {
if (a1->type&TY_MASK==TY_IMM) {
if (a1->type&MDF_IMM) {
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
t1=MDF_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
}
}
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
if (r1==REG_RSP+REG_RSP<<8)
d1+=8;
}
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
}
} else {
if (a1->type&TY_MASK!=TY_STK) {
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
if (!(a1->type&MDF_STK)) {
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
}
}
if (a1->type&RT_MASK>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
if (a1->type.raw_type>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
t1=a1->type;
r1=a1->reg;
d1=a1->disp;
} else {
if (a1->type&TY_MASK==TY_IMM) {
if (a1->type&MDF_IMM) {
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
t1=MDF_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
if (r2==REG_RSP+REG_RSP<<8)
d2+=8;
}
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
}
}
}
@@ -531,10 +502,9 @@ U0 ICFOp(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
ICAddRSP(tempi,rsp_size);
} else {
if (rsp_size==8)
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,
SLASH_OP_FSTP,ip);
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,ip);
else if (rsp_size>8) {
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
SLASH_OP_FSTP,ip);
ICAddRSP(tempi,rsp_size-8);
}
@@ -547,114 +517,87 @@ U0 ICFCmp(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,I64 ip)
Bool dont_push_float,dont_pop_float;
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (dont_push_float) {
if (tempi->ic_flags&ICF_ALTERNATE_TEMPLATE) {
if (tempi->ic_flags&ICF_ALT_TEMPLATE) {
if (tempi->ic_flags&ICF_POP_CMP)
ICPopRegs(tempi,1<<REG_RAX);
else
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
} else
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->ic_flags&ICF_POP_CMP)
ICPopRegs(tempi,1<<REG_RDX);
else
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
if (tempi->ic_flags&ICF_POP_CMP)
ICPopRegs(tempi,1<<REG_RDX);
else
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
}
}
if (tempi->ic_flags&ICF_PUSH_CMP)
ICPushRegs(tempi,1<<REG_RAX);
ICCopyTemplate(cc,tempi,op,FALSE,TRUE,FALSE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICFModEqu(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip)
{
Bool dont_push_float,dont_pop_float;
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->ic_flags & ICF_BY_VAL) {
if (dont_push_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,FALSE,ip);
} else if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICFCvt2(cc,tempi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,ip);
}
//TODO: unpushable,unpop? Not sure
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_MAIN);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,TY_REG+RT_I64,REG_RAX,0,ip);
if (tempi->r.type&TY_MASK)
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,MDF_REG+RT_I64,REG_RAX,0,ip);
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to,
tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to,
tempi->a1.reg,tempi->a1.disp,ip);
} else {
if (dont_push_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,tempi->a1.type,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,tempi->a1.type,
tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,FALSE,ip);
} else if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,tempi->a1.type,
tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,tempi->a1.type,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,tempi->a1.type,
tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,ip);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICFCvt2(cc,tempi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,ip);
}
//TODO: unpushable,unpop? Not sure
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_MAIN);
if (tempi->a1.type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,TY_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
TY_REG+RT_I64,REG_RAX,0,ip);
if (tempi->r.type&TY_MASK)
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,MDF_DISP+tempi->a1.type_pointed_to,REG_RCX,0,
MDF_REG+RT_I64,REG_RAX,0,ip);
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
}
+141 -241
View File
@@ -13,117 +13,67 @@ U0 ICFOpEqu(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
if (dont_pop_float)
throw('Compiler');
if (tempi->ic_flags & ICF_NOT_ADDR) {
if (tempi->ic_flags & ICF_BY_VAL) {
p1_mem=FALSE;
if (dont_push_float) {
if (a1->type_pointed_to!=RT_F64) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
a1->type&TY_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,FALSE,ip);
ICPush(tempi,TY_REG+RT_I64,REG_RAX,0,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
a1->type&MDG_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,ip);
ICPush(tempi,MDF_REG+RT_I64,REG_RAX,0,ip);
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
} else {
if (a1->type_pointed_to>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
t1=a1->type_pointed_to+a1->type&TY_MASK;
if (a1->type_pointed_to>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
t1=a1->type&MDG_MASK+a1->type_pointed_to;
r1=a1->reg;
d1=a1->disp;
p1_mem=TRUE;
} else {
ICPush(tempi,
a1->type_pointed_to+a1->type&TY_MASK,a1->reg,a1->disp,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
a1->type&MDG_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
}
}
} else if (tempi->ic_flags & ICF_A1_FIRST) {
if (a1->type_pointed_to!=RT_F64 || a2->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
a1->type&TY_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
} else {
if (a1->type_pointed_to!=RT_F64 || a1->type&MDF_STK) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
a1->type&MDG_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
if (a1->type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
a2->type,a2->reg,a2->disp,ip);
ICFCvt2(cc,tempi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
} else {
if (a1->type_pointed_to>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
t1=a1->type_pointed_to+a1->type&TY_MASK;
r1=a1->reg;
d1=a1->disp;
p1_mem=TRUE;
} else {
ICPush(tempi,
a1->type_pointed_to+a1->type&TY_MASK,a1->reg,a1->disp,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
}
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
if (r1==REG_RSP+REG_RSP<<8)
d1+=8;
}
}
}
} else {
if (a1->type_pointed_to!=RT_F64 || a1->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
a1->type&TY_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
if (a1->type_pointed_to!=RT_F64)
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)) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
}
}
if (a1->type_pointed_to>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
t1=a1->type_pointed_to+a1->type&TY_MASK;
if (a1->type_pointed_to>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
t1=a1->type&MDG_MASK+a1->type_pointed_to;
r1=a1->reg;
d1=a1->disp;
p1_mem=TRUE;
} else {
ICPush(tempi,
a1->type_pointed_to+a1->type&TY_MASK,a1->reg,a1->disp,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
a1->type&MDG_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
if (r2==REG_RSP+REG_RSP<<8)
d2+=8;
@@ -152,112 +102,72 @@ U0 ICFOpEqu(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
ICAddRSP(tempi,rsp_size);
} else {
if (rsp_size==8)
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,
SLASH_OP_FSTP,ip);
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,ip);
else if (rsp_size>8) {
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
SLASH_OP_FSTP,ip);
ICAddRSP(tempi,rsp_size-8);
}
if (a1->type_pointed_to!=RT_F64) {
ICPop(tempi,TY_REG+RT_I64,REG_RAX,0,ip);
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,a1->type&TY_MASK+a1->type_pointed_to,a1->reg,a1->disp,
TY_REG+RT_I64,REG_RAX,0,ip);
ICPop(tempi,MDF_REG+RT_I64,REG_RAX,0,ip);
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,a1->type&MDG_MASK+a1->type_pointed_to,a1->reg,a1->disp,
MDF_REG+RT_I64,REG_RAX,0,ip);
} else
ICPop(tempi,a1->type_pointed_to+a1->type&TY_MASK,a1->reg,a1->disp,ip);
ICPop(tempi,a1->type&MDG_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
}
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
a1->type&TY_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
a1->type&MDG_MASK+a1->type_pointed_to,a1->reg,a1->disp,ip);
} else {
if (a1->type_pointed_to>=RT_I64)
p1_mem=TRUE;
else
p1_mem=FALSE;
if (dont_push_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
if (a1->type_pointed_to!=RT_F64) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_DISP+a1->type_pointed_to,REG_RCX,0,ip);
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,FALSE,ip);
ICPush(tempi,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
MDF_DISP+a1->type_pointed_to,REG_RCX,0,ip);
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,ip);
ICPush(tempi,MDF_REG+RT_I64,REG_RAX,0,ip);
} else
ICPush(tempi,a1->type_pointed_to+TY_DISP,REG_RCX,0,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
ICPush(tempi,MDF_DISP+a1->type_pointed_to,REG_RCX,0,ip);
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
} else if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
if (a1->type_pointed_to!=RT_F64 || a2->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
TY_DISP+a1->type_pointed_to,REG_RCX,0,ip);
} else {
if (a1->type_pointed_to!=RT_F64 || a1->type&MDF_STK) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
MDF_DISP+a1->type_pointed_to,REG_RCX,0,ip);
if (a1->type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RDX,TY_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICFCvt2(cc,tempi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,ip);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
} else {
ICPush(tempi,TY_DISP+a1->type_pointed_to,REG_RCX,0,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
if (r1==REG_RSP+REG_RSP<<8)
d1+=8;
}
}
}
} else {
if (a1->type_pointed_to!=RT_F64 || a1->type&TY_MASK==TY_STK) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
TY_DISP+a1->type_pointed_to,REG_RCX,0,ip);
if (a1->type_pointed_to!=RT_F64)
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)) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64)))) {
t2=TY_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
}
}
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
ICPush(tempi,TY_DISP+a1->type_pointed_to,REG_RCX,0,ip);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,a1->type,a1->reg,a1->disp,ip);
ICPush(tempi,MDF_DISP+a1->type_pointed_to,REG_RCX,0,ip);
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
if (r2==REG_RSP+REG_RSP<<8)
d2+=8;
@@ -281,28 +191,26 @@ U0 ICFOpEqu(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,U8 *buf2,I64 ip)
ICSlashOp(tempi,t1,r1,d1,op,ip);
CmpNoteFloatOp(cc,tempi,TRUE,FALSE,CN_MAIN);
if (p1_mem && a1->type_pointed_to==RT_F64) {
ICSlashOp(tempi,TY_DISP+a1->type_pointed_to,REG_RCX,0,
SLASH_OP_FSTP,ip);
ICSlashOp(tempi,MDF_DISP+a1->type_pointed_to,REG_RCX,0,SLASH_OP_FSTP,ip);
if (rsp_size)
ICAddRSP(tempi,rsp_size);
} else {
if (rsp_size==8)
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,
SLASH_OP_FSTP,ip);
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,ip);
else if (rsp_size>8) {
ICSlashOp(tempi,TY_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
ICSlashOp(tempi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8,
SLASH_OP_FSTP,ip);
ICAddRSP(tempi,rsp_size-8);
}
ICPop(tempi,TY_REG+RT_I64,REG_RAX,0,ip);
ICPop(tempi,MDF_REG+RT_I64,REG_RAX,0,ip);
if (a1->type_pointed_to!=RT_F64)
ICFCvt2(cc,tempi,REG_RAX,TY_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,TY_DISP+a1->type_pointed_to,REG_RCX,0,
TY_REG+RT_I64,REG_RAX,0,ip);
ICFCvt2(cc,tempi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,ip);
ICMov(tempi,MDF_DISP+a1->type_pointed_to,REG_RCX,0,
MDF_REG+RT_I64,REG_RAX,0,ip);
}
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
}
@@ -315,7 +223,7 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip,
CCodeMisc *lb;
U8 *buf2;
if (tempi->ic_flags&ICF_ALTERNATE_TEMPLATE) {
if (tempi->ic_flags&ICF_ALT_TEMPLATE) {
a1=&tempi->a2;
a2=&tempi->a1;
alt=TRUE;
@@ -333,71 +241,68 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip,
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (dont_push_float) {
if (tempi->ic_flags&ICF_POP_CMP && alt) {
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
} else {
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64))) ||
tempi->ic_flags&ICF_PUSH_CMP) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip2);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
}
}
}
} else {
if (tempi->ic_flags & ICF_A1_FIRST^^alt) {
if (a2->type&TY_MASK!=TY_STK) {
if (alt) {
if (!(a2->type&MDF_STK)) {
if (tempi->ic_flags&ICF_POP_CMP) {
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
} else {
if (a1->type&RT_MASK>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
if (a1->type.raw_type>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
t1=a1->type;
r1=a1->reg;
d1=a1->disp;
} else {
if (a1->type&TY_MASK==TY_IMM) {
if (a1->type&MDF_IMM) {
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
t1=MDF_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip2);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
}
}
}
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64))) ||
tempi->ic_flags&ICF_PUSH_CMP) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip2);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
if (r1==REG_RSP+REG_RSP<<8)
d1+=8;
@@ -407,55 +312,53 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip,
if (tempi->ic_flags&ICF_POP_CMP)
ICPopRegs(tempi,1<<REG_RDX);
else
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
}
} else {
if (a1->type&TY_MASK!=TY_STK) {
if (a2->type&RT_MASK>=RT_I64 && (a2->type&TY_MASK==TY_DISP ||
a2->type&TY_MASK==TY_RIP_DISP32 || a2->type&TY_MASK==TY_SIB)) {
if (!(a1->type&MDF_STK)) {
if (a2->type.raw_type>=RT_I64 && a2->type&MDG_DISP_SIB_RIP) {
t2=a2->type;
r2=a2->reg;
d2=a2->disp;
} else {
if (a2->type&TY_MASK==TY_IMM) {
if (a2->type&MDF_IMM) {
if (!(builtin2=ICBuiltInFloatConst(a2->disp(F64))) ||
tempi->ic_flags&ICF_PUSH_CMP) {
t2=TY_RIP_DISP32+RT_I64;
t2=MDF_RIP_DISP32+RT_I64;
r2=REG_RIP;
d2=COCFloatConstFind(cc,a2->disp(F64))+buf2;
}
} else {
ICPush(tempi,a2->type,a2->reg,a2->disp,ip2);
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
rsp_size+=8;
}
}
if (tempi->ic_flags&ICF_POP_CMP) {
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
if (r2==REG_RSP+REG_RSP<<8)
d1+=8;
} else {
if (a1->type&RT_MASK>=RT_I64 && (a1->type&TY_MASK==TY_DISP ||
a1->type&TY_MASK==TY_RIP_DISP32 || a1->type&TY_MASK==TY_SIB)) {
if (a1->type.raw_type>=RT_I64 && a1->type&MDG_DISP_SIB_RIP) {
t1=a1->type;
r1=a1->reg;
d1=a1->disp;
} else {
if (a1->type&TY_MASK==TY_IMM) {
if (a1->type&MDF_IMM) {
if (!(builtin1=ICBuiltInFloatConst(a1->disp(F64)))) {
t1=TY_RIP_DISP32+RT_I64;
t1=MDF_RIP_DISP32+RT_I64;
r1=REG_RIP;
d1=COCFloatConstFind(cc,a1->disp(F64))+buf2;
}
} else {
ICPush(tempi,a1->type,a1->reg,a1->disp,ip2);
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0;
rsp_size+=8;
if (r2==REG_RSP+REG_RSP<<8)
d2+=8;
@@ -463,15 +366,15 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip,
}
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,a2->type,a2->reg,a2->disp,ip2);
if (tempi->ic_flags&ICF_POP_CMP)
ICPopRegs(tempi,1<<REG_RDX);
else
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,a1->type,a1->reg,a1->disp,ip2);
ICU16(tempi,0x5052); //PUSH EDX PUSH EAX
rsp_size=16;
t1=TY_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
}
}
}
@@ -488,7 +391,7 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip,
else
ICSlashOp(tempi,t2,r2,d2,SLASH_OP_FLD,ip2);
if (tempi->ic_flags&ICF_PUSH_CMP) {
t2=TY_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0;
if (!rsp_size) {
rsp_size=8;
ICAddRSP(tempi,-8);
@@ -571,15 +474,13 @@ U0 ICFCmpAndBranch(CCmpCtrl *cc,CIntermediateCode *tempi,I64 ip,
U0 ICFMul(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
{
if (tempi->a1.type&TY_MASK==TY_IMM &&
tempi->a1.type_pointed_to&RT_MASK==RT_F64 &&
if (tempi->a1.type&MDF_IMM && tempi->a1.type_pointed_to==RT_F64 &&
tempi->a1.disp(F64)==1.0) {
CmpNoteFloatOp(cc,tempi,FALSE,FALSE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
} else if (tempi->a2.type&TY_MASK==TY_IMM &&
tempi->a2.type_pointed_to&RT_MASK==RT_F64 &&
tempi->a2.disp(F64)==1.0) {
} else if (tempi->a2.type&MDF_IMM &&
tempi->a2.type_pointed_to==RT_F64&& tempi->a2.disp(F64)==1.0) {
CmpNoteFloatOp(cc,tempi,FALSE,FALSE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
@@ -589,8 +490,7 @@ U0 ICFMul(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
U0 ICFDiv(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
{
if (tempi->a2.type&TY_MASK==TY_IMM &&
tempi->a2.type_pointed_to&RT_MASK==RT_F64 &&
if (tempi->a2.type&MDF_IMM && tempi->a2.type_pointed_to==RT_F64 &&
tempi->a2.disp(F64)==1.0) {
CmpNoteFloatOp(cc,tempi,FALSE,FALSE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
@@ -603,13 +503,13 @@ U0 ICFAdd(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
{
Bool dont_push_float,dont_pop_float;
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (tempi->a1.type&TY_MASK==TY_IMM && !tempi->a1.disp) {
if (tempi->a1.type&MDF_IMM && !tempi->a1.disp) {
if (dont_push_float) {
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FSTP,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
} else if (dont_pop_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
} else {
@@ -617,13 +517,13 @@ U0 ICFAdd(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip);
}
} else if (tempi->a2.type&TY_MASK==TY_IMM && !tempi->a2.disp) {
} else if (tempi->a2.type&MDF_IMM && !tempi->a2.disp) {
if (dont_push_float) {
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FSTP,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
} else if (dont_pop_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
} else {
@@ -638,14 +538,14 @@ U0 ICFAdd(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
U0 ICFSub(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
{
Bool dont_push_float,dont_pop_float;
if (tempi->a2.type&TY_MASK==TY_IMM && !tempi->a2.disp) {
if (tempi->a2.type&MDF_IMM && !tempi->a2.disp) {
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (dont_push_float) {
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FSTP,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
} else if (dont_pop_float) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_FLD,FALSE,TRUE,TRUE,CN_MAIN);
} else {
@@ -659,46 +559,46 @@ U0 ICFSub(CCmpCtrl *cc,CIntermediateCode *tempi,U8 *buf,I64 ip)
U0 ICFPreIncDec(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,I64 ip)
{
if (tempi->ic_flags & ICF_NOT_ADDR) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->ic_flags & ICF_BY_VAL) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
ICCopyTemplate(cc,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,TY_DISP+RT_I64,REG_RCX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+RT_I64,REG_RCX,0,ip);
ICCopyTemplate(cc,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,TY_DISP+RT_I64,REG_RCX,0,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,MDF_DISP+RT_I64,REG_RCX,0,MDF_REG+RT_I64,REG_RAX,0,ip);
}
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
U0 ICFPostIncDec(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,I64 ip)
{
if (tempi->ic_flags & ICF_NOT_ADDR) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type&TY_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->r.type&TY_MASK)
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_REG+RT_I64,REG_RAX,0,ip);
if (tempi->ic_flags & ICF_BY_VAL) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type&MDG_MASK+RT_I64,tempi->a1.reg,tempi->a1.disp,ip);
if (tempi->r.type.mode)
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_REG+RT_I64,REG_RAX,0,ip);
ICCopyTemplate(cc,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,TY_DISP+RT_I64,REG_RCX,0,ip);
if (tempi->r.type&TY_MASK)
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+RT_I64,REG_RCX,0,ip);
if (tempi->r.type.mode)
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,MDF_REG+RT_I64,REG_RAX,0,ip);
ICCopyTemplate(cc,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
ICMov(tempi,TY_DISP+RT_I64,REG_RCX,0,TY_REG+RT_I64,REG_RAX,0,ip);
ICMov(tempi,MDF_DISP+RT_I64,REG_RCX,0,MDF_REG+RT_I64,REG_RAX,0,ip);
}
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RDX,0,ip);
MDF_REG+RT_I64,REG_RDX,0,ip);
}
U0 ICFTemplateFun(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,I64 ip)
@@ -707,12 +607,12 @@ U0 ICFTemplateFun(CCmpCtrl *cc,CIntermediateCode *tempi,I64 op,I64 ip)
CmpSetFloatOpPushPop(cc,tempi,&dont_push_float,&dont_pop_float);
if (!dont_push_float)
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICCopyTemplate(cc,tempi,op,FALSE,TRUE,TRUE,CN_MAIN);
if (tempi->r.type&TY_MASK && !(tempi->ic_flags & ICF_R_TO_F64) &&
if (tempi->r.type.mode && !(tempi->ic_flags & ICF_R_TO_F64) &&
!(tempi->ic_flags & ICF_R_TO_INT))
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip);
MDF_REG+RT_I64,REG_RAX,0,ip);
}
+111 -113
View File
@@ -72,8 +72,7 @@ U0 ICAddRSP(CIntermediateCode *tempi,I64 i,Bool optimize=TRUE)
CIntermediateCode *tempil1;
if (optimize && (tempil1=ICLastIns(tempi))) {
j=tempil1->ic_cnt;
if (tempil1->ic_last_cnt==j-4 &&
tempil1->ic_body[j-3]==0x83 &&
if (tempil1->ic_last_cnt==j-4 && tempil1->ic_body[j-3]==0x83 &&
tempil1->ic_body[j-4]==0x48) {
if (tempil1->ic_body[j-2]==0xEC)
j=-tempil1->ic_body[j-1](I8);
@@ -81,8 +80,7 @@ U0 ICAddRSP(CIntermediateCode *tempi,I64 i,Bool optimize=TRUE)
j=tempil1->ic_body[j-1](I8);
else
j=0;
} else if (tempil1->ic_last_cnt==j-7 &&
tempil1->ic_body[j-6]==0x81 &&
} else if (tempil1->ic_last_cnt==j-7 && tempil1->ic_body[j-6]==0x81 &&
tempil1->ic_body[j-7]==0x48) {
if (tempil1->ic_body[j-5]==0xEC)
j=-tempil1->ic_body[j-4](I32);
@@ -127,28 +125,24 @@ U0 ICAddRSP(CIntermediateCode *tempi,I64 i,Bool optimize=TRUE)
}
extern U0 ICMov(CIntermediateCode *tempi,
I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 ip);
CICType t1,I64 r1,I64 d1,CICType t2,I64 r2,I64 d2,I64 ip);
#define MDR_REG 0
#define MDR_INDIRECT_REG 1
#define MDR_D8_INDIRECT_REG 2
#define MDR_D32_INDIRECT_REG 3
#define MDR_SIB_INDIRECT_REG 4
#define MDR_SIB_D8_INDIRECT_REG 5
#define MDR_SIB_D32_INDIRECT_REG 6
#define MDR_RIP_REL 7
#define MODR_REG 0
#define MODR_INDIRECT_REG 1
#define MODR_D8_INDIRECT_REG 2
#define MODR_D32_INDIRECT_REG 3
#define MODR_SIB_INDIRECT_REG 4
#define MODR_SIB_D8_INDIRECT_REG 5
#define MODR_SIB_D32_INDIRECT_REG 6
#define MODR_RIP_REL 7
I64 ICModr1(I64 r,I64 t2,I64 r2,I64 d2)
I64 ICModr1(I64 r,CICType t2,I64 r2,I64 d2)
{//result.u8[0] is type
//result.u8[1] is REX
//result.u8[2] is ModR
//result.u8[3] is SIB
I64 result=0;
if (t2&TY_MASK>TY_RIP_DISP32) {
"Callers:%P;%P\n",Caller,Caller(2);
throw('Compiler');
}
if (t2&RT_MASK<RT_I64)
if (t2.raw_type<RT_I64)
result.u8[1]=0x40;
else
result.u8[1]=0x48;
@@ -156,36 +150,36 @@ I64 ICModr1(I64 r,I64 t2,I64 r2,I64 d2)
result.u8[1]+=4;
r&=7;
}
switch (t2>>4) {
case TY_REG>>4:
switch (Bsr(t2)) {
case MDf_REG:
if (r2>7) {
result.u8[1]++;
r2&=7;
}
result.u8[2]=0xC0+r<<3+r2;
result.u8[0]=MDR_REG;
if (result.u8[1]==0x40 && (t2&RT_MASK>=RT_I16 || r<4 && r2<4))
result.u8[0]=MODR_REG;
if (result.u8[1]==0x40 && (t2.raw_type>=RT_I16 || r<4 && r2<4))
result.u8[1]=0;
break;
case TY_DISP>>4:
case MDf_DISP:
if (r2>7) {
result.u8[1]++;
r2&=7;
}
if (!d2 && r2!=REG_RBP) {
result.u8[2]=r<<3+r2;
result.u8[0]=MDR_INDIRECT_REG;
result.u8[0]=MODR_INDIRECT_REG;
} else if (MIN_I8<=d2<=MAX_I8) {
result.u8[2]=0x40+r<<3+r2;
result.u8[0]=MDR_D8_INDIRECT_REG;
result.u8[0]=MODR_D8_INDIRECT_REG;
} else {
result.u8[2]=0x80+r<<3+r2;
result.u8[0]=MDR_D32_INDIRECT_REG;
result.u8[0]=MODR_D32_INDIRECT_REG;
}
if (result.u8[1]==0x40 && (t2&RT_MASK>=RT_I16 || r<4))
if (result.u8[1]==0x40 && (t2.raw_type>=RT_I16 || r<4))
result.u8[1]=0;
break;
case TY_SIB>>4:
case MDf_SIB:
if (7<r2.u8[0]<REG_NONE)
result.u8[1]++;
if (r2.u8[1]&15>7)
@@ -193,27 +187,27 @@ I64 ICModr1(I64 r,I64 t2,I64 r2,I64 d2)
if (r2.u8[0]==REG_NONE) {
result.u8[3]=5+(r2.u8[1]&7)<<3+r2.u8[1]&0xC0;
result.u8[2]=4+r<<3;
result.u8[0]=MDR_SIB_D32_INDIRECT_REG;
result.u8[0]=MODR_SIB_D32_INDIRECT_REG;
} else {
result.u8[3]=r2.u8[0]&7+(r2.u8[1]&7)<<3+r2.u8[1]&0xC0;
if (!d2 && r2.u8[0]&7!=REG_RBP) {
result.u8[2]=4+r<<3;
result.u8[0]=MDR_SIB_INDIRECT_REG;
result.u8[0]=MODR_SIB_INDIRECT_REG;
} else if (MIN_I8<=d2<=MAX_I8) {
result.u8[2]=0x44+r<<3;
result.u8[0]=MDR_SIB_D8_INDIRECT_REG;
result.u8[0]=MODR_SIB_D8_INDIRECT_REG;
} else {
result.u8[2]=0x84+r<<3;
result.u8[0]=MDR_SIB_D32_INDIRECT_REG;
result.u8[0]=MODR_SIB_D32_INDIRECT_REG;
}
}
if (result.u8[1]==0x40 && (t2&RT_MASK>=RT_I16 || r<4))
if (result.u8[1]==0x40 && (t2.raw_type>=RT_I16 || r<4))
result.u8[1]=0;
break;
case TY_RIP_DISP32>>4:
case MDf_RIP_DISP32:
result.u8[2]=0x05+r<<3;
result.u8[0]=MDR_RIP_REL;
if (result.u8[1]==0x40 && (t2&RT_MASK>=RT_I16 || r<4))
result.u8[0]=MODR_RIP_REL;
if (result.u8[1]==0x40 && (t2.raw_type>=RT_I16 || r<4))
result.u8[1]=0;
break;
}
@@ -223,28 +217,28 @@ I64 ICModr1(I64 r,I64 t2,I64 r2,I64 d2)
U0 ICModr2(CIntermediateCode *tempi,I64 i,I64 d,I64 ip=0)
{//t=0 means no SIB
switch [i.u8[0]] {
case MDR_REG:
case MODR_REG:
break;
case MDR_INDIRECT_REG:
case MODR_INDIRECT_REG:
break;
case MDR_D8_INDIRECT_REG:
case MODR_D8_INDIRECT_REG:
ICU8(tempi,d);
break;
case MDR_D32_INDIRECT_REG:
case MODR_D32_INDIRECT_REG:
ICU32(tempi,d);
break;
case MDR_SIB_INDIRECT_REG:
case MODR_SIB_INDIRECT_REG:
ICU8(tempi,i.u8[3]);
break;
case MDR_SIB_D8_INDIRECT_REG:
case MODR_SIB_D8_INDIRECT_REG:
ICU8(tempi,i.u8[3]);
ICU8(tempi,d);
break;
case MDR_SIB_D32_INDIRECT_REG:
case MODR_SIB_D32_INDIRECT_REG:
ICU8(tempi,i.u8[3]);
ICU32(tempi,d);
break;
case MDR_RIP_REL:
case MODR_RIP_REL:
ICU32(tempi,d-(ip+tempi->ic_cnt));
tempi->ic_flags&=~ICF_CODE_FINAL;
break;
@@ -272,16 +266,16 @@ U0 ICModr2(CIntermediateCode *tempi,I64 i,I64 d,I64 ip=0)
#define SLASH_OP_FISTTP 0x0000000001DDDD01
#define SLASH_OP_FILD 0x0000000001DFDF05
U0 ICSlashOp(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 op,I64 ip)
U0 ICSlashOp(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,I64 op,I64 ip)
{
I64 i;
if (t1&TY_MASK==TY_REG && !op.u8[3])
t1=t1&(TY_MASK|1)+RT_I64; //Set to 64 bit, preserving signed/unsigned
if (t1&MDF_REG && !op.u8[3])
t1=t1&(MDG_MASK|RTF_UNSIGNED)+RT_I64; //Set to 64 bit,preserving unsigned
i=ICModr1(op.u8[0],t1,r1,d1);
if (tempi->ic_flags&ICF_LOCK && op!=SLASH_OP_MOV && t1&TY_MASK!=TY_REG)
if (tempi->ic_flags&ICF_LOCK && op!=SLASH_OP_MOV && !(t1&MDF_REG))
ICU8(tempi,OC_LOCK_PREFIX);
switch (t1&RT_MASK) {
switch (t1.raw_type) {
case RT_I8:
case RT_U8:
ICRex(tempi,i.u8[1]);
@@ -300,32 +294,32 @@ U0 ICSlashOp(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 op,I64 ip)
ICModr2(tempi,i,d1,ip+4);
}
U0 ICPush(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 ip)
U0 ICPush(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,I64 ip)
{
switch (t1>>4) {
case TY_REG>>4:
switch (Bsr(t1)) {
case MDf_REG:
if (r1>7)
ICU16(tempi,0x5049+(r1&7)<<8);
else
ICU8(tempi,0x50+r1);
return;
case TY_IMM>>4:
case MDf_IMM:
if (MIN_I8<=d1<=MAX_I8)
ICU16(tempi,0x6A+d1<<8);
else if (MIN_I32<=d1<=MAX_I32) {
ICU8(tempi,0x68);
ICU32(tempi,d1);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,t1,r1,d1,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,t1,r1,d1,ip);
ICU8(tempi,0x50+REG_RBX);
}
return;
case TY_STK>>4:
case MDf_STK:
return;
case TY_DISP>>4:
case TY_SIB>>4:
case TY_RIP_DISP32>>4:
switch (t1&RT_MASK) {
case MDf_DISP:
case MDf_SIB:
case MDf_RIP_DISP32:
switch (t1.raw_type) {
case RT_I64:
case RT_U64:
case RT_F64:
@@ -334,7 +328,7 @@ U0 ICPush(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 ip)
}
break;
}
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,t1,r1,d1,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,t1,r1,d1,ip);
ICU16(tempi,0x5048+REG_RBX<<8);
}
@@ -351,30 +345,31 @@ U0 ICPushRegs(CIntermediateCode *tempi,I64 mask)
}
}
U0 ICPop(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 ip)
U0 ICPop(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,I64 ip)
{
switch (t1>>4) {
case TY_NULL>>4:
ICAddRSP(tempi,8);
break;
case TY_REG>>4:
switch (Bsr(t1)) {
case MDf_REG:
if (r1>7)
ICU16(tempi,0x5849+(r1&7)<<8);
else
ICU8(tempi,0x58+r1);
break;
case TY_DISP>>4:
case TY_RIP_DISP32>>4:
case TY_SIB>>4:
if (t1&RT_MASK<RT_I64) {
case MDf_DISP:
case MDf_RIP_DISP32:
case MDf_SIB:
if (t1.raw_type<RT_I64) {
ICU8(tempi,0x58+REG_RBX);
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,REG_RBX,0,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,REG_RBX,0,ip);
} else
ICSlashOp(tempi,t1,r1,d1,SLASH_OP_POP,ip);
break;
default:
case MDf_STK:
case MDf_IMM:
ICU8(tempi,0x58+REG_RBX);
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,REG_RBX,0,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,REG_RBX,0,ip);
break;
default:
ICAddRSP(tempi,8);
}
}
@@ -433,14 +428,14 @@ I64 ICBuiltInFloatConst(F64 d)
}
U0 ICMov(CIntermediateCode *tempi,
I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 ip)
CICType t1,I64 r1,I64 d1,CICType t2,I64 r2,I64 d2,I64 ip)
{
I64 i,j,last_cnt=tempi->ic_cnt;
CIntermediateCode *tempil1;
Bool old_lock=Btr(&tempi->ic_flags,ICf_LOCK);
switch (t1>>4) {
case TY_REG>>4:
if (t2&TY_MASK==TY_IMM) {
switch (Bsr(t1)) {
case MDf_REG:
if (t2&MDF_IMM) {
if (!d2)
ICZero(tempi,r1);
else if (0<=d2<=MAX_U8) {
@@ -492,13 +487,13 @@ U0 ICMov(CIntermediateCode *tempi,
ICU16(tempi,i+r1<<8);
ICU64(tempi,d2);
}
} else if (t2&TY_MASK==TY_STK)
} else if (t2&MDF_STK)
ICPop(tempi,t1,r1,d1,ip);
else {
if (r1==r2 && t2&TY_MASK==TY_REG)
if (r1==r2 && t2&MDF_REG)
goto move_done;
if (t2&TY_MASK==TY_REG) {
t2=TY_REG+RT_I64;
if (t2&MDF_REG) {
t2=MDF_REG+RT_I64;
if (tempil1=ICLastIns(tempi)) {
i=tempil1->ic_cnt;
j=0x48+(r1>7);
@@ -511,10 +506,10 @@ U0 ICMov(CIntermediateCode *tempi,
}
}
i=ICModr1(r1,t2,r2,d2);
if (t2&RT_MASK!=RT_U32)
if (t2.raw_type!=RT_U32)
i|=0x4800;
ICRex(tempi,i.u8[1]);
switch (t2&RT_MASK) {
switch (t2.raw_type) {
case RT_I8:
ICU24(tempi,i.u8[2]<<16+0xBE0F);
break;
@@ -537,19 +532,22 @@ U0 ICMov(CIntermediateCode *tempi,
ICModr2(tempi,i,d2,ip+4);
}
break;
case TY_STK>>4:
if (t1&RT_MASK<t2&RT_MASK)
ICPush(tempi,t2&TY_MASK+t1&RT_MASK,r2,d2,ip);
case MDf_STK:
if (tempi->ic_flags&ICF_PUSH_CMP)
ICPopRegs(tempi,1<<REG_RBX);
if (t1.raw_type<t2.raw_type)
ICPush(tempi,t2&MDG_MASK+t1.raw_type,r2,d2,ip);
else
ICPush(tempi,t2,r2,d2,ip);
if (tempi->ic_flags&ICF_PUSH_CMP)
ICPushRegs(tempi,1<<REG_RBX);
break;
case TY_DISP>>4:
case TY_RIP_DISP32>>4:
case TY_SIB>>4:
if (t2&TY_MASK==TY_IMM && (t1&RT_MASK<RT_I64 ||
(MIN_I32<=d2<=MAX_I32))) {
case MDf_DISP:
case MDf_RIP_DISP32:
case MDf_SIB:
if (t2&MDF_IMM && (t1.raw_type<RT_I64 || (MIN_I32<=d2<=MAX_I32))) {
i=ICModr1(0,t1,r1,d1);
switch (t1&RT_MASK) {
switch (t1.raw_type) {
case RT_I8:
case RT_U8:
ICRex(tempi,i.u8[1]);
@@ -564,11 +562,11 @@ U0 ICMov(CIntermediateCode *tempi,
ICRex(tempi,i.u8[1]);
ICU16(tempi,i.u8[2]<<8+0xC7);
}
if (i.u8[0]!=MDR_RIP_REL)
if (i.u8[0]!=MODR_RIP_REL)
ICModr2(tempi,i,d1,);
else {
i=d1-(ip+tempi->ic_cnt+4);
switch (t1&RT_MASK) {
switch (t1.raw_type) {
case RT_I8:
case RT_U8:
i--;
@@ -584,7 +582,7 @@ U0 ICMov(CIntermediateCode *tempi,
tempi->ic_flags&=~ICF_CODE_FINAL;
}
switch (t1&RT_MASK) {
switch (t1.raw_type) {
case RT_I8:
case RT_U8:
ICU8(tempi,d2);
@@ -597,11 +595,11 @@ U0 ICMov(CIntermediateCode *tempi,
ICU32(tempi,d2);
}
} else {
if (t2&TY_MASK==TY_REG)
if (t2&MDF_REG)
ICSlashOp(tempi,t1,r1,d1,r2+SLASH_OP_MOV,ip);
else {
ICMov(tempi,TY_REG+RT_I64,REG_RBX,0,t2,r2,d2,ip);
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,REG_RBX,0,ip);
ICMov(tempi,MDF_REG+RT_I64,REG_RBX,0,t2,r2,d2,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,REG_RBX,0,ip);
}
}
break;
@@ -612,20 +610,20 @@ move_done:
tempi->ic_last_cnt=last_cnt;
}
U0 ICLea(CIntermediateCode *tempi,
I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,CCmpCtrl *cc,U8 *buf,I64 ip)
U0 ICLea(CIntermediateCode *tempi,CICType t1,I64 r1,I64 d1,
CICType t2,I64 r2,I64 d2,CCmpCtrl *cc,U8 *buf,I64 ip)
{
I64 i;
CAOTAbsAddr *tempa;
switch (t1>>4) {
case TY_REG>>4:
switch (Bsr(t1)) {
case MDf_REG:
i=ICModr1(r1,t2,r2,d2);
i.u8[1]|=0x48;
ICU24(tempi,i.u8[2]<<16+0x8D00+i.u8[1]);
ICModr2(tempi,i,d2,ip+4);
break;
case TY_STK>>4:
if (t2&TY_MASK==TY_RIP_DISP32) {
case MDf_STK:
if (t2&MDF_RIP_DISP32) {
ICU8(tempi,0x68);
ICU32(tempi,d2);
if (cc->flags&CCF_AOT_COMPILE && buf && !(cc->flags&CCF_NO_ABSS)) {
@@ -639,24 +637,24 @@ U0 ICLea(CIntermediateCode *tempi,
break;
} // Fall thru
default:
ICLea(tempi,TY_REG+RT_I64,REG_RCX,0,t2,r2,d2,cc,buf,ip);
ICMov(tempi,t1,r1,d1,TY_REG+RT_I64,REG_RCX,0,ip);
ICLea(tempi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,cc,buf,ip);
ICMov(tempi,t1,r1,d1,MDF_REG+RT_I64,REG_RCX,0,ip);
}
}
U0 ICDeref(CIntermediateCode *tempi,I64 ip)
{
I64 t;
t=tempi->r.type&RT_MASK;
CICType t;
t=tempi->r.type.raw_type;
if (t>tempi->a1.type_pointed_to)
t=tempi->a1.type_pointed_to;
if (tempi->a1.type&TY_MASK==TY_REG)
if (tempi->a1.type&MDF_REG)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+t,tempi->a1.reg,tempi->a1.disp,ip);
MDF_DISP+t,tempi->a1.reg,tempi->a1.disp,ip);
else {
ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RCX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+t,REG_RCX,0,ip);
MDF_DISP+t,REG_RCX,0,ip);
}
}
+21 -23
View File
@@ -3,7 +3,7 @@ U0 LexPutToken(CCmpCtrl *cc)
'"';
if (cc->token==TK_IDENT || cc->token==TK_STR)
"%s",cc->cur_str;
else if (cc->token==TK_INTEGER)
else if (cc->token==TK_INT)
"INT:%X",cc->cur_i64;
else if (cc->token==TK_CHAR_CONST)
"U8:%X",cc->cur_i64;
@@ -141,31 +141,29 @@ U0 ICClassPut(CHashClass *c)
U0 ICArgPut(CICArg *a)
{
if (a->type_pointed_to)
"%Z %Z %Z ",
a->type&RT_MASK,"ST_RAW_TYPES",
a->type_pointed_to&RT_MASK,"ST_RAW_TYPES",
a->type>>4,"ST_TY_TYPES";
"%Z %Z %Z ",a->type.raw_type,"ST_RAW_TYPES",
a->type_pointed_to,"ST_RAW_TYPES",
Bsr(a->type>>8)+1,"ST_TY_TYPES";
else
"%Z %Z ",
a->type&RT_MASK,"ST_RAW_TYPES",
a->type>>4,"ST_TY_TYPES";
switch (a->type>>4) {
case TY_STK>>4:
"%Z %Z ",a->type.raw_type,"ST_RAW_TYPES",
Bsr(a->type>>8)+1,"ST_TY_TYPES";
switch (Bsr(a->type)) {
case MDf_STK:
"STK";
break;
case TY_IMM>>4:
case MDf_IMM:
"#%X",a->disp;
break;
case TY_REG>>4:
case MDf_REG:
"%Z",a->reg,"ST_U64_REGS";
break;
case TY_DISP>>4:
case MDf_DISP:
"%X[%Z]",a->disp,a->reg,"ST_U64_REGS";
break;
case TY_RIP_DISP32>>4:
case MDf_RIP_DISP32:
"[%X]",a->disp;
break;
case TY_SIB>>4:
case MDf_SIB:
if (a->disp)
"%X",a->disp;
if (a->reg==REG_RIP)
@@ -189,14 +187,14 @@ U0 ICPut(CCmpCtrl *cc,CIntermediateCode *tempi)
if (opcode>=IC_END_EXP && opcode!=IC_NOP2) {
"%15ts %016X ",intermediate_code_table[opcode].name,tempi->ic_data;
if (cc->pass) {
if (tempi->r.type&TY_MASK) {
if (tempi->r.type.mode) {
ICArgPut(&tempi->r);
"<-";
}
if (tempi->a1.type&TY_MASK)
if (tempi->a1.type.mode)
ICArgPut(&tempi->a1);
',';
if (tempi->a2.type&TY_MASK)
if (tempi->a2.type.mode)
ICArgPut(&tempi->a2);
'' CH_SPACE;
}
@@ -225,8 +223,8 @@ U0 ICPut(CCmpCtrl *cc,CIntermediateCode *tempi)
"-DEP ";
if (tempi->ic_flags & ICF_DEPEND_RESULT)
"+DEP ";
if (tempi->ic_flags & ICF_NOT_ADDR)
"NOT_ADDR ";
if (tempi->ic_flags & ICF_BY_VAL)
"BY_VAL ";
if (tempi->ic_flags & ICF_PUSH_RESULT)
"PUSH ";
if (tempi->ic_flags & ICF_PUSH_CMP)
@@ -234,16 +232,16 @@ U0 ICPut(CCmpCtrl *cc,CIntermediateCode *tempi)
if (tempi->ic_flags & ICF_POP_CMP)
"POP_CMP ";
if (tempi->ic_flags & ICF_DEL_PREVIOUS_INS)
"DELPREV ";
"DEL_PREV ";
if (tempi->ic_flags & ICF_PREVIOUS_DELETED)
"PREVDEL ";
"PREV_DEL ";
for (i=0;i<3;i++) {
if (Bt(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0+i))
"DONT_PUSH#%d ",i;
if (Bt(&tempi->ic_flags,ICf_DONT_POP_FLOAT0+i))
"DONT_POP#%d ",i;
}
if (tempi->ic_flags & ICF_ALTERNATE_TEMPLATE)
if (tempi->ic_flags & ICF_ALT_TEMPLATE)
"ALT_TEMP ";
'\n';
}
+4 -49
View File
@@ -211,7 +211,7 @@ U0 CmpLoadDefines()
"I8\0U8\0I16\0U16\0I32\0U32\0I64\0U64\0F64\0String\0");
DefineLstLoad("ST_INT_SIZE_TYPES",
"I8\0U8\0I16\0U16\0I32\0U32\0I64\0U64\0");
DefineLstLoad("ST_TY_TYPES","NULL\0IMM\0REG\0DISP\0SIB\0RIP\0STK\0");
DefineLstLoad("ST_TY_TYPES","NULL\0STK\0IMM\0REG\0DISP\0SIB\0RIP\0");
DefineLstLoad("ST_U8_REGS","AL\0CL\0DL\0BL\0AH\0CH\0DH\0BH\0"
"R8u8\0R9u8\0R10u8\0R11u8\0R12u8\0R13u8\0R14u8\0R15u8\0");
DefineLstLoad("ST_U8_REX_REGS","AL\0CL\0DL\0BL\0RSPu8\0RBPu8\0RSIu8\0RDIu8\0"
@@ -239,68 +239,23 @@ U0 CmpLoadDefines()
U0 CmpFillTables()
{
I64 i,k;
I64 i;
U32 *d;
cmp.to_reg_vars_map=CAlloc(NUM_REGS*sizeof(U8));
cmp.num_reg_vars=0;
cmp.reg_vars_mask=REGG_C_LOCAL_VARS;
cmp.reg_vars_mask=REGG_LOCAL_VARS;
for (i=0;i<NUM_REGS;i++)
if (Bt(&cmp.reg_vars_mask,i))
cmp.to_reg_vars_map[cmp.num_reg_vars++]=i;
cmp.non_ptr_vars_map=CAlloc(NUM_REGS*sizeof(U8));
cmp.num_non_ptr_vars=0;
cmp.non_ptr_vars_mask=REGG_C_LOCAL_NON_PTR_VARS;
cmp.non_ptr_vars_mask=REGG_LOCAL_NON_PTR_VARS;
for (i=0;i<NUM_REGS;i++)
if (Bt(&cmp.non_ptr_vars_mask,i))
cmp.non_ptr_vars_map[cmp.num_non_ptr_vars++]=i;
/* STK TEMP ALLOCATION: See $LK,"::/Compiler/OptPass6.CPP"$.
Expressions are evaluated with a stack machine.
1+(2+3)*4
STK[2]: 1 1 1 1 1 1 21
STK[1]: 2 2 5 5 20
STK[0]: 3 4
The top of the stack is stored in RAX.
STK[2]: RAX 1 1 1 1 1 RAX
STK[1]: RAX 2 RAX 5 RAX
STK[0]: RAX RAX
Two regs are alloced for stk temps.
STK[0]:
R9 : RAX R9 R9 R9 R9 R9 RAX
R8 : RAX R8 RAX R8 RAX
: RAX RAX
Every other funtion, the regs are reversed. This is to reduce
pushes before function calls. R8 is used in even numbered functions
while R9 is used in odd, so maybe we can avoid pushes if only one
stk temp reg is used.
STK[0]:
R9 : RAX R8 R8 R8 R8 R8 RAX
R8 : RAX R9 RAX R9 RAX
: RAX RAX
*/
cmp.to_stk_temps_map_odd =CAlloc(NUM_REGS*sizeof(U8));
cmp.to_stk_temps_map_even=CAlloc(NUM_REGS*sizeof(U8));
cmp.num_stk_temps=0;
cmp.stk_temps_mask=REGG_C_TEMP_CLOBBERED;
for (i=0;i<NUM_REGS;i++)
if (Bt(&cmp.stk_temps_mask,i))
cmp.to_stk_temps_map_even[cmp.num_stk_temps++]=i;
k=cmp.num_stk_temps;
for (i=0;i<NUM_REGS;i++)
if (Bt(&cmp.stk_temps_mask,i))
cmp.to_stk_temps_map_odd[--k]=i;
cmp.dual_U16_tokens1=d=CAlloc(sizeof(U32)*TK_NUM_TK);
d['!']=TK_NOT_EQU<<16+'=';
d['&']=TK_AND_AND<<16+'&';
+9 -10
View File
@@ -256,7 +256,7 @@ U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tempaot)
break;
case IET_REL_I8:
if (!(MIN_I8<=i-ptr-1<=MAX_I8))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
*ptr(U8 *) =i-ptr-1;
break;
case IET_IMM_U8:
@@ -264,7 +264,7 @@ U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tempaot)
break;
case IET_REL_I16:
if (!(MIN_I16<=i-ptr-2<=MAX_I16))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
*ptr(U16 *)=i-ptr-2;
break;
case IET_IMM_U16:
@@ -272,7 +272,7 @@ U0 CmpFixUpJITAsm(CCmpCtrl *cc,CAOT *tempaot)
break;
case IET_REL_I32:
if (!(MIN_I32<=i-ptr-4<=MAX_I32))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
*ptr(U32 *)=i-ptr-4;
break;
case IET_IMM_U32:
@@ -356,7 +356,7 @@ U0 CmpFixUpAOTAsm(CCmpCtrl *cc,CAOT *tempaot)
break;
case IET_REL_I8:
if (!(MIN_I8<=i-ptr-1<=MAX_I8))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
*ptr(U8 *) =i-ptr-1;
break;
case IET_IMM_U8:
@@ -364,7 +364,7 @@ U0 CmpFixUpAOTAsm(CCmpCtrl *cc,CAOT *tempaot)
break;
case IET_REL_I16:
if (!(MIN_I16<=i-ptr-2<=MAX_I16))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
*ptr(U16 *)=i-ptr-2;
break;
case IET_IMM_U16:
@@ -372,7 +372,7 @@ U0 CmpFixUpAOTAsm(CCmpCtrl *cc,CAOT *tempaot)
break;
case IET_REL_I32:
if (!(MIN_I32<=i-ptr-4<=MAX_I32))
LexExcept(cc,"branch out of range at ");
LexExcept(cc,"Branch out of range at ");
*ptr(U32 *)=i-ptr-4;
break;
case IET_IMM_U32:
@@ -440,7 +440,7 @@ I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv_let=0)
cnt=0;
tempa=tempaot->abss;
while (tempa) {
if (!(tempa->type&1))
if (!(tempa->type&IEF_IMM_NOT_REL))
cnt++;
tempa=tempa->next;
}
@@ -451,7 +451,7 @@ I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv_let=0)
tempa=tempaot->abss;
while (tempa) {
tempa1=tempa->next;
if (!(tempa->type&1))
if (!(tempa->type&IEF_IMM_NOT_REL))
*ptr(U32 *)++ =tempa->ip;
Free(tempa);
tempa=tempa1;
@@ -655,8 +655,7 @@ I64 ExePrint2(U8 *fmt,...)
I64 ExeFile2(U8 *name,Bool just_load=FALSE)
{//throws exceptions
I64 result;
U8 *name2=DftExt(name,"CPP.Z"),
*st=MStrPrint("#include \"%s\";",name2);
U8 *name2=DftExt(name,"CPP.Z"),*st=MStrPrint("#include \"%s\";",name2);
result=ExePutS2(st,name,just_load);
Free(st);
Free(name2);
+8 -8
View File
@@ -16,7 +16,7 @@ I64 PassTrace(I64 i=0b10001111101)
return old;
}
Bool Trace(Bool val)
Bool Trace(Bool val=ON)
{//Displays assembly code output from compiler.
return Option(OPTf_TRACE,val);
}
@@ -52,15 +52,15 @@ U0 StreamDir()
CD2I32 *LexD2I32(CCmpCtrl *cc,CD2I32 *p)
{//Not HolyC. Sprite-like lex 2D point.
if (cc->token!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
Lex(cc); //Skip (
p->x=LexExpressionI64(cc);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc); //Skip ,
p->y=LexExpressionI64(cc);
if (cc->token!=')')
LexExcept(cc,"expecting ')' at ");
LexExcept(cc,"Expecting ')' at ");
Lex(cc); //Skip )
return p;
}
@@ -68,19 +68,19 @@ CD2I32 *LexD2I32(CCmpCtrl *cc,CD2I32 *p)
CD3I32 *LexD3I32(CCmpCtrl *cc,CD3I32 *p)
{//Not HolyC. Sprite-like lex 3D point.
if (cc->token!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
Lex(cc); //Skip (
p->x=LexExpressionI64(cc);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc); //Skip ,
p->y=LexExpressionI64(cc);
if (cc->token!=',')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
Lex(cc); //Skip ,
p->z=LexExpressionI64(cc);
if (cc->token!=')')
LexExcept(cc,"expecting ')' at ");
LexExcept(cc,"Expecting ')' at ");
Lex(cc); //Skip )
return p;
}
Binary file not shown.
+289 -257
View File
@@ -1,31 +1,29 @@
$LK,"LexPutPos",A="FL:::/Compiler/CExcept.CPP.Z,50",BI=1$
$LK,"ICAssignPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,517",BI=2$
$LK,"CmpSetFloatOpPushPop",A="FL:::/Compiler/BackFA.CPP.Z,60",BI=3$
$LK,"ICFCvt2",A="FL:::/Compiler/BackFA.CPP.Z,170",BI=4$
$LK,"CmpRawTypePointed",A="FL:::/Compiler/OptLib.CPP.Z,518",BI=5$
$LK,"ICAssignPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,429",BI=2$
$LK,"CmpSetFloatOpPushPop",A="FL:::/Compiler/BackFA.CPP.Z,62",BI=3$
$LK,"ICFCvt2",A="FL:::/Compiler/BackFA.CPP.Z,169",BI=4$
$LK,"CmpRawTypePointed",A="FL:::/Compiler/OptLib.CPP.Z,517",BI=5$
$LK,"OptFixupBinaryOp1",A="FL:::/Compiler/OptLib.CPP.Z,96",BI=6$
$LK,"OptFixupBinaryOp2",A="FL:::/Compiler/OptLib.CPP.Z,182",BI=7$
$LK,"COCInit",A="FL:::/Compiler/PrsLib.CPP.Z,99",BI=8$
$LK,"IsLexExpression2Bin",A="FL:::/Compiler/PrsExp.CPP.Z,1130",BI=9$
$LK,"CSubSwitch",A="FL:::/Compiler/PrsStmt.CPP.Z,563"$
$LK,"IsLexExpression2Bin",A="FL:::/Compiler/PrsExp.CPP.Z,1128",BI=9$
$LK,"CSubSwitch",A="FL:::/Compiler/PrsStmt.CPP.Z,562"$
$LK,"LexFilePop",A="FL:::/Compiler/Lex.CPP.Z,11",BI=10$
$LK,"ExePutS",A="FL:::/Compiler/CMain.CPP.Z,571",BI=11$
$LK,"PrsStaticInit",A="FL:::/Compiler/PrsVar.CPP.Z,215",BI=12$
$LK,"LexPutLine",A="FL:::/Compiler/CExcept.CPP.Z,22",BI=13$
$LK,"PrsKeyWord",A="FL:::/Compiler/PrsLib.CPP.Z,31",BI=14$
$LK,"AsmLineLst",A="FL:::/Compiler/AsmLib.CPP.Z,149",BI=15$
$LK,"AsmLineLst",A="FL:::/Compiler/AsmLib.CPP.Z,147",BI=15$
$LK,"ICOpSizeRex",A="FL:::/Compiler/BackLib.CPP.Z,28",BI=16$
$LK,"CVI2",A="FL:::/Compiler/PrsVar.CPP.Z,117"$
$LK,"ICU8",A="FL:::/Compiler/BackLib.CPP.Z,17",BI=17$
$LK,"AsmStoreNum",A="FL:::/Compiler/Asm.CPP.Z,263",BI=18$
$LK,"MDR_SIB_D8_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,137"$
$LK,"OptPass012",A="FL:::/Compiler/OptPass012.CPP.Z,23",BI=19$
$LK,"MemberLstSize",A="FL:::/Compiler/LexLib.CPP.Z,191",BI=20$
$LK,"ICQueIns",A="FL:::/Compiler/BackC.CPP.Z,412",BI=21$
$LK,"ICQueIns",A="FL:::/Compiler/BackC.CPP.Z,355",BI=21$
$LK,"ICAndBranch",A="FL:::/Compiler/BackC.CPP.Z,1",BI=22$
$LK,"MDR_D8_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,134"$
$LK,"U",A="FL:::/Compiler/UAsm.CPP.Z,649",BI=23$
$LK,"ICQueRem",A="FL:::/Compiler/BackC.CPP.Z,494",BI=24$
$LK,"U",A="FL:::/Compiler/UAsm.CPP.Z,645",BI=23$
$LK,"ICQueRem",A="FL:::/Compiler/BackC.CPP.Z,403",BI=24$
$LK,"CN_R",A="FL:::/Compiler/BackFA.CPP.Z,4"$
$LK,"OptLead1",A="FL:::/Compiler/OptLib.CPP.Z,73",BI=25$
$LK,"CmpNoteFloatOp",A="FL:::/Compiler/BackFA.CPP.Z,6",BI=26$
@@ -33,24 +31,25 @@ $LK,"AOTGlblsResolve",A="FL:::/Compiler/AsmResolve.CPP.Z,76",BI=27$
$LK,"ExePutS2",A="FL:::/Compiler/CMain.CPP.Z,627",BI=28$
$LK,"HashEntrySize",A="FL:::/Compiler/CHash.CPP.Z,1",BI=29$
$LK,"COCPush",A="FL:::/Compiler/PrsLib.CPP.Z,107",BI=30$
$LK,"SLASH_OP_DEC",A="FL:::/Compiler/BackLib.CPP.Z,255"$
$LK,"ICPushRegs",A="FL:::/Compiler/BackLib.CPP.Z,341",BI=31$
$LK,"SLASH_OP_DEC",A="FL:::/Compiler/BackLib.CPP.Z,249"$
$LK,"MODR_SIB_D32_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,136"$
$LK,"ICPushRegs",A="FL:::/Compiler/BackLib.CPP.Z,335",BI=31$
$LK,"PE_POP_HIGHER",A="FL:::/Compiler/PrsExp.CPP.Z,10"$
$LK,"SLASH_OP_FLD",A="FL:::/Compiler/BackLib.CPP.Z,270"$
$LK,"SLASH_OP_FLD",A="FL:::/Compiler/BackLib.CPP.Z,264"$
$LK,"ICU32",A="FL:::/Compiler/BackLib.CPP.Z,47",BI=32$
$LK,"ICU24",A="FL:::/Compiler/BackLib.CPP.Z,41",BI=33$
$LK,"ICU16",A="FL:::/Compiler/BackLib.CPP.Z,35",BI=34$
$LK,"SLASH_OP_DIV",A="FL:::/Compiler/BackLib.CPP.Z,260"$
$LK,"SLASH_OP_DIV",A="FL:::/Compiler/BackLib.CPP.Z,254"$
$LK,"CmpFillTables",A="FL:::/Compiler/CInit.CPP.Z,240",BI=35$
$LK,"AOTStoreCodeU32",A="FL:::/Compiler/AsmLib.CPP.Z,30",BI=36$
$LK,"ICU64",A="FL:::/Compiler/BackLib.CPP.Z,53",BI=37$
$LK,"SLASH_OP_INC",A="FL:::/Compiler/BackLib.CPP.Z,254"$
$LK,"AOTStoreCodeU64",A="FL:::/Compiler/AsmLib.CPP.Z,69",BI=38$
$LK,"SLASH_OP_INC",A="FL:::/Compiler/BackLib.CPP.Z,248"$
$LK,"AOTStoreCodeU64",A="FL:::/Compiler/AsmLib.CPP.Z,68",BI=38$
$LK,"LexPopNoRestore",A="FL:::/Compiler/LexLib.CPP.Z,38",BI=39$
$LK,"ExePrint",A="FL:::/Compiler/CMain.CPP.Z,607",BI=40$
$LK,"SLASH_OP_NEG",A="FL:::/Compiler/BackLib.CPP.Z,257"$
$LK,"SLASH_OP_NEG",A="FL:::/Compiler/BackLib.CPP.Z,251"$
$LK,"PrsVarLst",A="FL:::/Compiler/PrsVar.CPP.Z,416",BI=41$
$LK,"PrsAsmDefine",A="FL:::/Compiler/Asm.CPP.Z,811",BI=42$
$LK,"PrsAsmDefine",A="FL:::/Compiler/Asm.CPP.Z,809",BI=42$
$LK,"PrsAddOp",A="FL:::/Compiler/PrsExp.CPP.Z,15",BI=43$
$LK,"LexWarn",A="FL:::/Compiler/CExcept.CPP.Z,65",BI=44$
$LK,"PE_POP_ALL1",A="FL:::/Compiler/PrsExp.CPP.Z,12"$
@@ -58,163 +57,162 @@ $LK,"PE_POP_ALL2",A="FL:::/Compiler/PrsExp.CPP.Z,13"$
$LK,"COCAppend",A="FL:::/Compiler/PrsLib.CPP.Z,126",BI=45$
$LK,"LexFilePush",A="FL:::/Compiler/Lex.CPP.Z,1",BI=46$
$LK,"CN_MAIN",A="FL:::/Compiler/BackFA.CPP.Z,3"$
$LK,"PrsUnaryModifier",A="FL:::/Compiler/PrsExp.CPP.Z,956",BI=47$
$LK,"PrsUnaryModifier",A="FL:::/Compiler/PrsExp.CPP.Z,954",BI=47$
$LK,"OptFixupUnaryOp",A="FL:::/Compiler/OptLib.CPP.Z,196",BI=48$
$LK,"LexPush",A="FL:::/Compiler/LexLib.CPP.Z,12",BI=49$
$LK,"SLASH_OP_MOV",A="FL:::/Compiler/BackLib.CPP.Z,261"$
$LK,"ICPopRegs",A="FL:::/Compiler/BackLib.CPP.Z,381",BI=50$
$LK,"SLASH_OP_MUL",A="FL:::/Compiler/BackLib.CPP.Z,258"$
$LK,"SLASH_OP_NOT",A="FL:::/Compiler/BackLib.CPP.Z,256"$
$LK,"SLASH_OP_MOV",A="FL:::/Compiler/BackLib.CPP.Z,255"$
$LK,"ICPopRegs",A="FL:::/Compiler/BackLib.CPP.Z,376",BI=50$
$LK,"SLASH_OP_MUL",A="FL:::/Compiler/BackLib.CPP.Z,252"$
$LK,"SLASH_OP_NOT",A="FL:::/Compiler/BackLib.CPP.Z,250"$
$LK,"NUM_INTERNAL_TYPES",A="FL:::/Compiler/CInit.CPP.Z,1"$
$LK,"SLASH_OP_POP",A="FL:::/Compiler/BackLib.CPP.Z,263"$
$LK,"ICFOp",A="FL:::/Compiler/BackFA.CPP.Z,360",BI=51$
$LK,"SLASH_OP_POP",A="FL:::/Compiler/BackLib.CPP.Z,257"$
$LK,"ICFOp",A="FL:::/Compiler/BackFA.CPP.Z,339",BI=51$
$LK,"CN_A1",A="FL:::/Compiler/BackFA.CPP.Z,2"$
$LK,"CN_A2",A="FL:::/Compiler/BackFA.CPP.Z,1"$
$LK,"LexExpressionF64",A="FL:::/Compiler/PrsExp.CPP.Z,1149",BI=52$
$LK,"LexExpressionF64",A="FL:::/Compiler/PrsExp.CPP.Z,1147",BI=52$
$LK,"ICAdd",A="FL:::/Compiler/PrsLib.CPP.Z,79",BI=53$
$LK,"CmpRawType",A="FL:::/Compiler/OptLib.CPP.Z,509",BI=54$
$LK,"CmpRawType",A="FL:::/Compiler/OptLib.CPP.Z,508",BI=54$
$LK,"ICFOpEqu",A="FL:::/Compiler/BackFB.CPP.Z,1",BI=55$
$LK,"LexExpressionI64",A="FL:::/Compiler/PrsExp.CPP.Z,1135",BI=56$
$LK,"ICQueInsRev",A="FL:::/Compiler/BackC.CPP.Z,453",BI=57$
$LK,"LexExpression",A="FL:::/Compiler/PrsExp.CPP.Z,1163",BI=58$
$LK,"LexExpressionI64",A="FL:::/Compiler/PrsExp.CPP.Z,1133",BI=56$
$LK,"ICQueInsRev",A="FL:::/Compiler/BackC.CPP.Z,379",BI=57$
$LK,"LexExpression",A="FL:::/Compiler/PrsExp.CPP.Z,1161",BI=58$
$LK,"PrsExpression",A="FL:::/Compiler/PrsExp.CPP.Z,264",BI=59$
$LK,"PrsClassNew",A="FL:::/Compiler/PrsLib.CPP.Z,40",BI=60$
$LK,"LexInStr",A="FL:::/Compiler/Lex.CPP.Z,372",BI=61$
$LK,"LexInStr",A="FL:::/Compiler/Lex.CPP.Z,373",BI=61$
$LK,"internal_types_table",A="FL:::/Compiler/CInit.CPP.Z,6"$
$LK,"OptPass3",A="FL:::/Compiler/OptPass3.CPP.Z,1",BI=62$
$LK,"OptPass4",A="FL:::/Compiler/OptPass4.CPP.Z,171",BI=63$
$LK,"OptPass4",A="FL:::/Compiler/OptPass4.CPP.Z,163",BI=63$
$LK,"OptPass5",A="FL:::/Compiler/OptPass5.CPP.Z,1",BI=64$
$LK,"OptPass6",A="FL:::/Compiler/OptPass6.CPP.Z,111",BI=65$
$LK,"OptPass6",A="FL:::/Compiler/OptPass6.CPP.Z,96",BI=65$
$LK,"MODR_REG",A="FL:::/Compiler/BackLib.CPP.Z,130"$
$LK,"Echo",A="FL:::/Compiler/CMisc.CPP.Z,24",BI=66$
$LK,"PrsGlblVarLst",A="FL:::/Compiler/PrsStmt.CPP.Z,201",BI=67$
$LK,"ICQueInit",A="FL:::/Compiler/BackC.CPP.Z,398",BI=68$
$LK,"ICCmp",A="FL:::/Compiler/BackB.CPP.Z,136",BI=69$
$LK,"ICQueInit",A="FL:::/Compiler/BackC.CPP.Z,341",BI=68$
$LK,"ICCmp",A="FL:::/Compiler/BackB.CPP.Z,102",BI=69$
$LK,"ICAddRSP",A="FL:::/Compiler/BackLib.CPP.Z,69",BI=70$
$LK,"ICDiv",A="FL:::/Compiler/BackA.CPP.Z,428",BI=71$
$LK,"ICDeref",A="FL:::/Compiler/BackLib.CPP.Z,647",BI=72$
$LK,"ICLea",A="FL:::/Compiler/BackLib.CPP.Z,615",BI=73$
$LK,"ICDiv",A="FL:::/Compiler/BackA.CPP.Z,391",BI=71$
$LK,"ICDeref",A="FL:::/Compiler/BackLib.CPP.Z,645",BI=72$
$LK,"ICLea",A="FL:::/Compiler/BackLib.CPP.Z,613",BI=73$
$LK,"CmpBuf",A="FL:::/Compiler/CMain.CPP.Z,157",BI=74$
$LK,"CMP_TEMPLATES_DONT_PUSH_POP",A="FL:::/Compiler/Templates.CPP.Z,394"$
$LK,"ICAddEct",A="FL:::/Compiler/BackA.CPP.Z,1",BI=75$
$LK,"ICToF64",A="FL:::/Compiler/BackB.CPP.Z,372",BI=76$
$LK,"PrsBinFile",A="FL:::/Compiler/Asm.CPP.Z,885",BI=77$
$LK,"ICToF64",A="FL:::/Compiler/BackB.CPP.Z,283",BI=76$
$LK,"PrsBinFile",A="FL:::/Compiler/Asm.CPP.Z,883",BI=77$
$LK,"HashTableSize2",A="FL:::/Compiler/CHash.CPP.Z,72",BI=78$
$LK,"HashEntrySize2",A="FL:::/Compiler/CHash.CPP.Z,33",BI=79$
$LK,"Ui",A="FL:::/Compiler/UAsm.CPP.Z,238",BI=80$
$LK,"ICSlashOp",A="FL:::/Compiler/BackLib.CPP.Z,275",BI=81$
$LK,"OptBrZero",A="FL:::/Compiler/OptLib.CPP.Z,231",BI=82$
$LK,"Un",A="FL:::/Compiler/UAsm.CPP.Z,664",BI=83$
$LK,"ICSlashOp",A="FL:::/Compiler/BackLib.CPP.Z,269",BI=81$
$LK,"OptBrZero",A="FL:::/Compiler/OptLib.CPP.Z,230",BI=82$
$LK,"Un",A="FL:::/Compiler/UAsm.CPP.Z,660",BI=83$
$LK,"PrsSizeOf",A="FL:::/Compiler/PrsExp.CPP.Z,298",BI=84$
$LK,"ICToI64",A="FL:::/Compiler/BackB.CPP.Z,366",BI=85$
$LK,"ICMod",A="FL:::/Compiler/BackA.CPP.Z,521",BI=86$
$LK,"ICToI64",A="FL:::/Compiler/BackB.CPP.Z,277",BI=85$
$LK,"ICMod",A="FL:::/Compiler/BackA.CPP.Z,461",BI=86$
$LK,"OptSetNOP1",A="FL:::/Compiler/OptLib.CPP.Z,17",BI=87$
$LK,"OptPass789A",A="FL:::/Compiler/OptPass789A.CPP.Z,1",BI=88$
$LK,"OptSetNOP2",A="FL:::/Compiler/OptLib.CPP.Z,25",BI=89$
$LK,"FBO1_F64",A="FL:::/Compiler/OptLib.CPP.Z,94"$
$LK,"ICXorEqu",A="FL:::/Compiler/BackC.CPP.Z,737",BI=90$
$LK,"ICToUpper",A="FL:::/Compiler/BackB.CPP.Z,355",BI=91$
$LK,"AsmLexExpression",A="FL:::/Compiler/AsmLib.CPP.Z,129",BI=92$
$LK,"ICMov",A="FL:::/Compiler/BackLib.CPP.Z,435",BI=93$
$LK,"ICXorEqu",A="FL:::/Compiler/BackC.CPP.Z,582",BI=90$
$LK,"ICToUpper",A="FL:::/Compiler/BackB.CPP.Z,266",BI=91$
$LK,"AsmLexExpression",A="FL:::/Compiler/AsmLib.CPP.Z,127",BI=92$
$LK,"ICMov",A="FL:::/Compiler/BackLib.CPP.Z,430",BI=93$
$LK,"ICNot",A="FL:::/Compiler/BackB.CPP.Z,10",BI=94$
$LK,"ICMul",A="FL:::/Compiler/BackA.CPP.Z,286",BI=95$
$LK,"ICMul",A="FL:::/Compiler/BackA.CPP.Z,263",BI=95$
$LK,"ICRex",A="FL:::/Compiler/BackLib.CPP.Z,22",BI=96$
$LK,"ICPop",A="FL:::/Compiler/BackLib.CPP.Z,354",BI=97$
$LK,"MDR_RIP_REL",A="FL:::/Compiler/BackLib.CPP.Z,139"$
$LK,"SLASH_OP_FADD",A="FL:::/Compiler/BackLib.CPP.Z,264"$
$LK,"ICPop",A="FL:::/Compiler/BackLib.CPP.Z,348",BI=97$
$LK,"SLASH_OP_FADD",A="FL:::/Compiler/BackLib.CPP.Z,258"$
$LK,"MODR_RIP_REL",A="FL:::/Compiler/BackLib.CPP.Z,137"$
$LK,"LexStmt2Bin",A="FL:::/Compiler/CMain.CPP.Z,1",BI=98$
$LK,"ICSub",A="FL:::/Compiler/BackA.CPP.Z,207",BI=99$
$LK,"ICSub",A="FL:::/Compiler/BackA.CPP.Z,205",BI=99$
$LK,"COCFloatConstFind",A="FL:::/Compiler/PrsLib.CPP.Z,164",BI=100$
$LK,"ICPut",A="FL:::/Compiler/CExcept.CPP.Z,186",BI=101$
$LK,"ICPut",A="FL:::/Compiler/CExcept.CPP.Z,184",BI=101$
$LK,"PrsArrayDims",A="FL:::/Compiler/PrsVar.CPP.Z,247",BI=102$
$LK,"ICSqr",A="FL:::/Compiler/BackC.CPP.Z,582",BI=103$
$LK,"ICSqr",A="FL:::/Compiler/BackC.CPP.Z,457",BI=103$
$LK,"FBO1_NOT_CONST",A="FL:::/Compiler/OptLib.CPP.Z,92"$
$LK,"CMP_TEMPLATES_DONT_POP",A="FL:::/Compiler/Templates.CPP.Z,178"$
$LK,"PrsClass",A="FL:::/Compiler/PrsStmt.CPP.Z,1",BI=104$
$LK,"MemberMetaData",A="FL:::/Compiler/LexLib.CPP.Z,45",BI=105$
$LK,"ICSwitch",A="FL:::/Compiler/BackC.CPP.Z,758",BI=106$
$LK,"OptBrNotZero",A="FL:::/Compiler/OptLib.CPP.Z,358",BI=107$
$LK,"ICSwitch",A="FL:::/Compiler/BackC.CPP.Z,603",BI=106$
$LK,"OptBrNotZero",A="FL:::/Compiler/OptLib.CPP.Z,357",BI=107$
$LK,"LexPutToken",A="FL:::/Compiler/CExcept.CPP.Z,1",BI=108$
$LK,"SLASH_OP_FDIV",A="FL:::/Compiler/BackLib.CPP.Z,268"$
$LK,"SLASH_OP_FDIV",A="FL:::/Compiler/BackLib.CPP.Z,262"$
$LK,"AsmHashLoad",A="FL:::/Compiler/AsmInit.CPP.Z,50",BI=109$
$LK,"UAsmHashLoad",A="FL:::/Compiler/UAsm.CPP.Z,188",BI=110$
$LK,"UnusedExternWarning",A="FL:::/Compiler/CExcept.CPP.Z,104",BI=111$
$LK,"SLASH_OP_FILD",A="FL:::/Compiler/BackLib.CPP.Z,273"$
$LK,"ICXorXor",A="FL:::/Compiler/BackB.CPP.Z,98",BI=112$
$LK,"SLASH_OP_FILD",A="FL:::/Compiler/BackLib.CPP.Z,267"$
$LK,"ICXorXor",A="FL:::/Compiler/BackB.CPP.Z,75",BI=112$
$LK,"PrsTryBlk",A="FL:::/Compiler/PrsStmt.CPP.Z,838",BI=113$
$LK,"CInit",A="FL:::/Compiler/CMain.CPP.Z,684",BI=114$
$LK,"CInit",A="FL:::/Compiler/CMain.CPP.Z,683",BI=114$
$LK,"MemberMetaFind",A="FL:::/Compiler/LexLib.CPP.Z,56",BI=115$
$LK,"ExePrint2",A="FL:::/Compiler/CMain.CPP.Z,646",BI=116$
$LK,"FBO1_INT",A="FL:::/Compiler/OptLib.CPP.Z,93"$
$LK,"PE_DO_UNARY_OP",A="FL:::/Compiler/PrsExp.CPP.Z,8"$
$LK,"PrsVarInit",A="FL:::/Compiler/PrsVar.CPP.Z,1",BI=117$
$LK,"ICOrEqu",A="FL:::/Compiler/BackC.CPP.Z,716",BI=118$
$LK,"ICModr1",A="FL:::/Compiler/BackLib.CPP.Z,141",BI=119$
$LK,"ICModr2",A="FL:::/Compiler/BackLib.CPP.Z,223",BI=120$
$LK,"SLASH_OP_FMUL",A="FL:::/Compiler/BackLib.CPP.Z,267"$
$LK,"ICPreIncDec",A="FL:::/Compiler/BackB.CPP.Z,393",BI=121$
$LK,"PrsAsmInstruction",A="FL:::/Compiler/Asm.CPP.Z,390",BI=122$
$LK,"PrsUnaryTerm",A="FL:::/Compiler/PrsExp.CPP.Z,588",BI=123$
$LK,"MemberLstDel",A="FL:::/Compiler/LexLib.CPP.Z,157",BI=124$
$LK,"SLASH_OP_FSUB",A="FL:::/Compiler/BackLib.CPP.Z,265"$
$LK,"ICAndAnd",A="FL:::/Compiler/BackB.CPP.Z,31",BI=125$
$LK,"InstEntriesCompare",A="FL:::/Compiler/UAsm.CPP.Z,1",BI=126$
$LK,"SLASH_OP_IMUL",A="FL:::/Compiler/BackLib.CPP.Z,259"$
$LK,"SLASH_OP_FSTP",A="FL:::/Compiler/BackLib.CPP.Z,271"$
$LK,"COCDel",A="FL:::/Compiler/PrsLib.CPP.Z,186",BI=127$
$LK,"ICOrEqu",A="FL:::/Compiler/BackC.CPP.Z,561",BI=118$
$LK,"ICModr1",A="FL:::/Compiler/BackLib.CPP.Z,139",BI=119$
$LK,"ICModr2",A="FL:::/Compiler/BackLib.CPP.Z,217",BI=120$
$LK,"SLASH_OP_FMUL",A="FL:::/Compiler/BackLib.CPP.Z,261"$
$LK,"ICPreIncDec",A="FL:::/Compiler/BackB.CPP.Z,304",BI=121$
$LK,"PrsUnaryTerm",A="FL:::/Compiler/PrsExp.CPP.Z,588",BI=122$
$LK,"MemberLstDel",A="FL:::/Compiler/LexLib.CPP.Z,157",BI=123$
$LK,"SLASH_OP_FSUB",A="FL:::/Compiler/BackLib.CPP.Z,259"$
$LK,"ICAndAnd",A="FL:::/Compiler/BackB.CPP.Z,30",BI=124$
$LK,"InstEntriesCompare",A="FL:::/Compiler/UAsm.CPP.Z,1",BI=125$
$LK,"SLASH_OP_IMUL",A="FL:::/Compiler/BackLib.CPP.Z,253"$
$LK,"SLASH_OP_FSTP",A="FL:::/Compiler/BackLib.CPP.Z,265"$
$LK,"COCDel",A="FL:::/Compiler/PrsLib.CPP.Z,186",BI=126$
$LK,"PE_UNARY_TERM1",A="FL:::/Compiler/PrsExp.CPP.Z,1"$
$LK,"ICFAdd",A="FL:::/Compiler/BackFB.CPP.Z,602",BI=128$
$LK,"ICFAdd",A="FL:::/Compiler/BackFB.CPP.Z,502",BI=127$
$LK,"PE_UNARY_TERM2",A="FL:::/Compiler/PrsExp.CPP.Z,2"$
$LK,"CmdLinePmt",A="FL:::/Compiler/CMisc.CPP.Z,88",BI=129$
$LK,"AsmMakeArgMask",A="FL:::/Compiler/Asm.CPP.Z,172",BI=130$
$LK,"COCHeaderPut",A="FL:::/Compiler/PrsLib.CPP.Z,229",BI=131$
$LK,"PrsGlblInit",A="FL:::/Compiler/PrsVar.CPP.Z,206",BI=132$
$LK,"ICAndEqu",A="FL:::/Compiler/BackC.CPP.Z,695",BI=133$
$LK,"LexD2I32",A="FL:::/Compiler/CMisc.CPP.Z,52",BI=134$
$LK,"MemberLstNew",A="FL:::/Compiler/LexLib.CPP.Z,150",BI=135$
$LK,"LexD3I32",A="FL:::/Compiler/CMisc.CPP.Z,68",BI=136$
$LK,"OptClassFwd",A="FL:::/Compiler/OptLib.CPP.Z,9",BI=137$
$LK,"ICFCmp",A="FL:::/Compiler/BackFA.CPP.Z,545",BI=138$
$LK,"PrsSwitch",A="FL:::/Compiler/PrsStmt.CPP.Z,575",BI=139$
$LK,"ICFDiv",A="FL:::/Compiler/BackFB.CPP.Z,590",BI=140$
$LK,"AOTStoreCodeU8At",A="FL:::/Compiler/AsmLib.CPP.Z,108",BI=141$
$LK,"CmdLinePmt",A="FL:::/Compiler/CMisc.CPP.Z,88",BI=128$
$LK,"AsmMakeArgMask",A="FL:::/Compiler/Asm.CPP.Z,172",BI=129$
$LK,"COCHeaderPut",A="FL:::/Compiler/PrsLib.CPP.Z,229",BI=130$
$LK,"PrsGlblInit",A="FL:::/Compiler/PrsVar.CPP.Z,206",BI=131$
$LK,"ICAndEqu",A="FL:::/Compiler/BackC.CPP.Z,540",BI=132$
$LK,"LexD2I32",A="FL:::/Compiler/CMisc.CPP.Z,52",BI=133$
$LK,"MemberLstNew",A="FL:::/Compiler/LexLib.CPP.Z,150",BI=134$
$LK,"LexD3I32",A="FL:::/Compiler/CMisc.CPP.Z,68",BI=135$
$LK,"OptClassFwd",A="FL:::/Compiler/OptLib.CPP.Z,9",BI=136$
$LK,"ICFCmp",A="FL:::/Compiler/BackFA.CPP.Z,515",BI=137$
$LK,"PrsSwitch",A="FL:::/Compiler/PrsStmt.CPP.Z,574",BI=138$
$LK,"ICFDiv",A="FL:::/Compiler/BackFB.CPP.Z,491",BI=139$
$LK,"AOTStoreCodeU8At",A="FL:::/Compiler/AsmLib.CPP.Z,106",BI=140$
$LK,"PE_PUSH_LOWER",A="FL:::/Compiler/PrsExp.CPP.Z,11"$
$LK,"OptPass6Lag",A="FL:::/Compiler/OptPass6.CPP.Z,28",BI=142$
$LK,"OptLag1",A="FL:::/Compiler/OptLib.CPP.Z,51",BI=143$
$LK,"OptLag2",A="FL:::/Compiler/OptLib.CPP.Z,62",BI=144$
$LK,"StreamPrint",A="FL:::/Compiler/CMisc.CPP.Z,29",BI=145$
$LK,"ICFCvt",A="FL:::/Compiler/BackFA.CPP.Z,121",BI=146$
$LK,"StreamDir",A="FL:::/Compiler/CMisc.CPP.Z,43",BI=147$
$LK,"PrsOffsetOf",A="FL:::/Compiler/PrsExp.CPP.Z,348",BI=148$
$LK,"MDR_REG",A="FL:::/Compiler/BackLib.CPP.Z,132"$
$LK,"GetOption",A="FL:::/Compiler/CMisc.CPP.Z,6",BI=149$
$LK,"PrsDoWhile",A="FL:::/Compiler/PrsStmt.CPP.Z,503",BI=150$
$LK,"ICShift",A="FL:::/Compiler/BackA.CPP.Z,694",BI=151$
$LK,"ICFMod",A="FL:::/Compiler/BackFA.CPP.Z,249",BI=152$
$LK,"COCPop",A="FL:::/Compiler/PrsLib.CPP.Z,121",BI=153$
$LK,"PrsExpression2",A="FL:::/Compiler/PrsExp.CPP.Z,65",BI=154$
$LK,"SLASH_OP_PUSH",A="FL:::/Compiler/BackLib.CPP.Z,262"$
$LK,"OptPass6Lag",A="FL:::/Compiler/OptPass6.CPP.Z,28",BI=141$
$LK,"OptLag1",A="FL:::/Compiler/OptLib.CPP.Z,51",BI=142$
$LK,"OptLag2",A="FL:::/Compiler/OptLib.CPP.Z,62",BI=143$
$LK,"StreamPrint",A="FL:::/Compiler/CMisc.CPP.Z,29",BI=144$
$LK,"ICFCvt",A="FL:::/Compiler/BackFA.CPP.Z,123",BI=145$
$LK,"StreamDir",A="FL:::/Compiler/CMisc.CPP.Z,43",BI=146$
$LK,"PrsOffsetOf",A="FL:::/Compiler/PrsExp.CPP.Z,348",BI=147$
$LK,"GetOption",A="FL:::/Compiler/CMisc.CPP.Z,6",BI=148$
$LK,"PrsDoWhile",A="FL:::/Compiler/PrsStmt.CPP.Z,502",BI=149$
$LK,"ICShift",A="FL:::/Compiler/BackA.CPP.Z,609",BI=150$
$LK,"ICFMod",A="FL:::/Compiler/BackFA.CPP.Z,242",BI=151$
$LK,"COCPop",A="FL:::/Compiler/PrsLib.CPP.Z,121",BI=152$
$LK,"PrsExpression2",A="FL:::/Compiler/PrsExp.CPP.Z,65",BI=153$
$LK,"SLASH_OP_PUSH",A="FL:::/Compiler/BackLib.CPP.Z,256"$
$LK,"PE_DEREFERENCE",A="FL:::/Compiler/PrsExp.CPP.Z,5"$
$LK,"LexPopRestore",A="FL:::/Compiler/LexLib.CPP.Z,23",BI=155$
$LK,"ICUnaries",A="FL:::/Compiler/BackB.CPP.Z,1",BI=156$
$LK,"ICFMul",A="FL:::/Compiler/BackFB.CPP.Z,572",BI=157$
$LK,"ICShiftEqu",A="FL:::/Compiler/BackA.CPP.Z,727",BI=158$
$LK,"LexExpression2Bin",A="FL:::/Compiler/PrsExp.CPP.Z,1112",BI=159$
$LK,"ICFPow",A="FL:::/Compiler/BackFA.CPP.Z,280",BI=160$
$LK,"MapFileWrite",A="FL:::/Compiler/CHash.CPP.Z,90",BI=161$
$LK,"ICFSub",A="FL:::/Compiler/BackFB.CPP.Z,638",BI=162$
$LK,"ICFModEqu",A="FL:::/Compiler/BackFA.CPP.Z,585",BI=163$
$LK,"CmpF1PushPop",A="FL:::/Compiler/OptLib.CPP.Z,529",BI=164$
$LK,"OptFree",A="FL:::/Compiler/OptLib.CPP.Z,33",BI=165$
$LK,"LexPopRestore",A="FL:::/Compiler/LexLib.CPP.Z,23",BI=154$
$LK,"ICUnaries",A="FL:::/Compiler/BackB.CPP.Z,1",BI=155$
$LK,"ICFMul",A="FL:::/Compiler/BackFB.CPP.Z,475",BI=156$
$LK,"ICShiftEqu",A="FL:::/Compiler/BackA.CPP.Z,639",BI=157$
$LK,"LexExpression2Bin",A="FL:::/Compiler/PrsExp.CPP.Z,1110",BI=158$
$LK,"ICFPow",A="FL:::/Compiler/BackFA.CPP.Z,266",BI=159$
$LK,"MapFileWrite",A="FL:::/Compiler/CHash.CPP.Z,90",BI=160$
$LK,"ICFSub",A="FL:::/Compiler/BackFB.CPP.Z,538",BI=161$
$LK,"ICFModEqu",A="FL:::/Compiler/BackFA.CPP.Z,545",BI=162$
$LK,"CmpF1PushPop",A="FL:::/Compiler/OptLib.CPP.Z,528",BI=163$
$LK,"OptFree",A="FL:::/Compiler/OptLib.CPP.Z,33",BI=164$
$LK,"CMP_TEMPLATES_DONT_PUSH2",A="FL:::/Compiler/Templates.CPP.Z,458"$
$LK,"CInternalType",A="FL:::/Compiler/CInit.CPP.Z,3"$
$LK,"LexDollar",A="FL:::/Compiler/Lex.CPP.Z,93",BI=166$
$LK,"AsmUnresolvedAdd",A="FL:::/Compiler/AsmResolve.CPP.Z,189",BI=167$
$LK,"AOTStoreCodeU8",A="FL:::/Compiler/AsmLib.CPP.Z,1",BI=168$
$LK,"MDR_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,133"$
$LK,"ICBitOps",A="FL:::/Compiler/BackB.CPP.Z,256",BI=169$
$LK,"LexDollar",A="FL:::/Compiler/Lex.CPP.Z,93",BI=165$
$LK,"AsmUnresolvedAdd",A="FL:::/Compiler/AsmResolve.CPP.Z,188",BI=166$
$LK,"AOTStoreCodeU8",A="FL:::/Compiler/AsmLib.CPP.Z,1",BI=167$
$LK,"ICBitOps",A="FL:::/Compiler/BackB.CPP.Z,202",BI=168$
$LK,"lex_zeros",A="FL:::/Compiler/Lex.CPP.Z,91"$
$LK,"CSwitchCase",A="FL:::/Compiler/PrsStmt.CPP.Z,568"$
$LK,"AsmResolve",A="FL:::/Compiler/AsmResolve.CPP.Z,1",BI=170$
$LK,"CSwitchCase",A="FL:::/Compiler/PrsStmt.CPP.Z,567"$
$LK,"AsmResolve",A="FL:::/Compiler/AsmResolve.CPP.Z,1",BI=169$
$LK,"PrsAsmInst",A="FL:::/Compiler/Asm.CPP.Z,390",BI=170$
$LK,"COCCompile",A="FL:::/Compiler/PrsLib.CPP.Z,249",BI=171$
$LK,"Cmp",A="FL:::/Compiler/CMain.CPP.Z,419",BI=172$
$LK,"PrsPush2",A="FL:::/Compiler/PrsLib.CPP.Z,11",BI=173$
@@ -222,164 +220,188 @@ $LK,"ICArgPut",A="FL:::/Compiler/CExcept.CPP.Z,141",BI=174$
$LK,"UndefinedExtern",A="FL:::/Compiler/CExcept.CPP.Z,98",BI=175$
$LK,"OptIC4",A="FL:::/Compiler/OptPass4.CPP.Z,1",BI=176$
$LK,"OptIC6",A="FL:::/Compiler/OptPass6.CPP.Z,1",BI=177$
$LK,"ICCmpAndBranch",A="FL:::/Compiler/BackB.CPP.Z,556",BI=178$
$LK,"ICDivEqu",A="FL:::/Compiler/BackA.CPP.Z,452",BI=179$
$LK,"PrsWhile",A="FL:::/Compiler/PrsStmt.CPP.Z,483",BI=180$
$LK,"ICFCmpAndBranch",A="FL:::/Compiler/BackFB.CPP.Z,309",BI=181$
$LK,"Lex",A="FL:::/Compiler/Lex.CPP.Z,442",BI=182$
$LK,"ICTestAndBranch",A="FL:::/Compiler/BackB.CPP.Z,736",BI=183$
$LK,"ICCmpAndBranch",A="FL:::/Compiler/BackB.CPP.Z,468",BI=178$
$LK,"ICDivEqu",A="FL:::/Compiler/BackA.CPP.Z,408",BI=179$
$LK,"PrsWhile",A="FL:::/Compiler/PrsStmt.CPP.Z,482",BI=180$
$LK,"ICFCmpAndBranch",A="FL:::/Compiler/BackFB.CPP.Z,217",BI=181$
$LK,"Lex",A="FL:::/Compiler/Lex.CPP.Z,443",BI=182$
$LK,"ICTestAndBranch",A="FL:::/Compiler/BackB.CPP.Z,634",BI=183$
$LK,"uasm",A="FL:::/Compiler/Compiler.PRJ.Z,21"$
$LK,"MDR_SIB_D32_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,138"$
$LK,"MODR_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,131"$
$LK,"PE_MAYBE_MODIFIERS",A="FL:::/Compiler/PrsExp.CPP.Z,3"$
$LK,"PE_UNARY_MODIFIERS",A="FL:::/Compiler/PrsExp.CPP.Z,4"$
$LK,"AOTLocalsResolve",A="FL:::/Compiler/AsmResolve.CPP.Z,42",BI=184$
$LK,"PE_DO_BINARY_OP",A="FL:::/Compiler/PrsExp.CPP.Z,9"$
$LK,"CmpFixUpAOTAsm",A="FL:::/Compiler/CMain.CPP.Z,302",BI=185$
$LK,"OptLabelFwd",A="FL:::/Compiler/OptLib.CPP.Z,1",BI=186$
$LK,"ICOrOr",A="FL:::/Compiler/BackB.CPP.Z,63",BI=187$
$LK,"ICOrOr",A="FL:::/Compiler/BackB.CPP.Z,51",BI=187$
$LK,"LexExcept",A="FL:::/Compiler/CExcept.CPP.Z,81",BI=188$
$LK,"cmp_templates",A="FL:::/Compiler/CExts.CPP.Z,42"$
$LK,"CmpF2PushPop",A="FL:::/Compiler/OptLib.CPP.Z,536",BI=189$
$LK,"MDR_D32_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,135"$
$LK,"CmpF2PushPop",A="FL:::/Compiler/OptLib.CPP.Z,535",BI=189$
$LK,"CmpJoin",A="FL:::/Compiler/CMain.CPP.Z,35",BI=190$
$LK,"MDR_SIB_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,136"$
$LK,"PrsPop2",A="FL:::/Compiler/PrsLib.CPP.Z,16",BI=191$
$LK,"CMP_TEMPLATES",A="FL:::/Compiler/Templates.CPP.Z,4"$
$LK,"PrsAsmBlk",A="FL:::/Compiler/Asm.CPP.Z,901",BI=192$
$LK,"MODR_D8_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,132"$
$LK,"PrsAsmBlk",A="FL:::/Compiler/Asm.CPP.Z,899",BI=192$
$LK,"PrsAsmArg",A="FL:::/Compiler/Asm.CPP.Z,35",BI=193$
$LK,"LexFirstRem",A="FL:::/Compiler/Lex.CPP.Z,276",BI=194$
$LK,"LexFirstRem",A="FL:::/Compiler/Lex.CPP.Z,277",BI=194$
$LK,"MemberClassBaseFind",A="FL:::/Compiler/LexLib.CPP.Z,87",BI=195$
$LK,"MemberFind",A="FL:::/Compiler/LexLib.CPP.Z,67",BI=196$
$LK,"cmp",A="FL:::/Compiler/Compiler.PRJ.Z,16"$
$LK,"OptLag",A="FL:::/Compiler/OptLib.CPP.Z,40",BI=197$
$LK,"ICPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,434",BI=198$
$LK,"ICFPostIncDec",A="FL:::/Compiler/BackFB.CPP.Z,680",BI=199$
$LK,"ICTest",A="FL:::/Compiler/BackLib.CPP.Z,403",BI=200$
$LK,"ICModU64",A="FL:::/Compiler/BackC.CPP.Z,589",BI=201$
$LK,"ICPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,345",BI=198$
$LK,"ICFPostIncDec",A="FL:::/Compiler/BackFB.CPP.Z,580",BI=199$
$LK,"ICTest",A="FL:::/Compiler/BackLib.CPP.Z,398",BI=200$
$LK,"ICModU64",A="FL:::/Compiler/BackC.CPP.Z,464",BI=201$
$LK,"ICLastIns",A="FL:::/Compiler/BackLib.CPP.Z,59",BI=202$
$LK,"PrsAsmImm",A="FL:::/Compiler/Asm.CPP.Z,1",BI=203$
$LK,"LexExtStr",A="FL:::/Compiler/LexLib.CPP.Z,218",BI=204$
$LK,"ICAddSubEctEqu",A="FL:::/Compiler/BackA.CPP.Z,545",BI=205$
$LK,"ICAddSubEctImm",A="FL:::/Compiler/BackA.CPP.Z,57",BI=206$
$LK,"ICPush",A="FL:::/Compiler/BackLib.CPP.Z,303",BI=207$
$LK,"ICSwap",A="FL:::/Compiler/BackC.CPP.Z,633",BI=208$
$LK,"ICAddSubEctEqu",A="FL:::/Compiler/BackA.CPP.Z,478",BI=205$
$LK,"ICAddSubEctImm",A="FL:::/Compiler/BackA.CPP.Z,56",BI=206$
$LK,"ICPush",A="FL:::/Compiler/BackLib.CPP.Z,297",BI=207$
$LK,"ICSwap",A="FL:::/Compiler/BackC.CPP.Z,491",BI=208$
$LK,"CMP_TEMPLATES_DONT_PUSH",A="FL:::/Compiler/Templates.CPP.Z,267"$
$LK,"intermediate_code_table",A="FL:::/Compiler/CInit.CPP.Z,16"$
$LK,"ICZero",A="FL:::/Compiler/BackLib.CPP.Z,394",BI=209$
$LK,"ICZero",A="FL:::/Compiler/BackLib.CPP.Z,389",BI=209$
$LK,"CmpCtrlDel",A="FL:::/Compiler/Lex.CPP.Z,58",BI=210$
$LK,"ICClassPut",A="FL:::/Compiler/CExcept.CPP.Z,117",BI=211$
$LK,"ICAssign",A="FL:::/Compiler/BackC.CPP.Z,159",BI=212$
$LK,"ICFTemplateFun",A="FL:::/Compiler/BackFB.CPP.Z,704",BI=213$
$LK,"ICFTemplateFun",A="FL:::/Compiler/BackFB.CPP.Z,604",BI=213$
$LK,"MemberAdd",A="FL:::/Compiler/LexLib.CPP.Z,103",BI=214$
$LK,"PrsPush",A="FL:::/Compiler/PrsLib.CPP.Z,1",BI=215$
$LK,"SLASH_OP_FDIVR",A="FL:::/Compiler/BackLib.CPP.Z,269"$
$LK,"SLASH_OP_FISTTP",A="FL:::/Compiler/BackLib.CPP.Z,272"$
$LK,"SLASH_OP_FDIVR",A="FL:::/Compiler/BackLib.CPP.Z,263"$
$LK,"SLASH_OP_FISTTP",A="FL:::/Compiler/BackLib.CPP.Z,266"$
$LK,"CmpCtrlSize",A="FL:::/Compiler/Lex.CPP.Z,70",BI=216$
$LK,"ICLocalVarInit",A="FL:::/Compiler/BackC.CPP.Z,924",BI=217$
$LK,"PrsFor",A="FL:::/Compiler/PrsStmt.CPP.Z,526",BI=218$
$LK,"ICLocalVarInit",A="FL:::/Compiler/BackC.CPP.Z,762",BI=217$
$LK,"PrsFor",A="FL:::/Compiler/PrsStmt.CPP.Z,525",BI=218$
$LK,"PassTrace",A="FL:::/Compiler/CMisc.CPP.Z,11",BI=219$
$LK,"PrsPopDeref",A="FL:::/Compiler/PrsLib.CPP.Z,21",BI=220$
$LK,"ICCopyTemplate",A="FL:::/Compiler/BackFA.CPP.Z,75",BI=221$
$LK,"ICCopyTemplate",A="FL:::/Compiler/BackFA.CPP.Z,77",BI=221$
$LK,"PrsStmt",A="FL:::/Compiler/PrsStmt.CPP.Z,900",BI=222$
$LK,"PrsFun",A="FL:::/Compiler/PrsStmt.CPP.Z,132",BI=223$
$LK,"LexIncludeStr",A="FL:::/Compiler/Lex.CPP.Z,298",BI=224$
$LK,"LexIncludeStr",A="FL:::/Compiler/Lex.CPP.Z,299",BI=224$
$LK,"PrsType",A="FL:::/Compiler/PrsVar.CPP.Z,287",BI=225$
$LK,"CmpCtrlNew",A="FL:::/Compiler/Lex.CPP.Z,28",BI=226$
$LK,"cmp_type_flags_src_code",A="FL:::/Compiler/Lex.CPP.Z,327"$
$LK,"MODR_SIB_D8_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,135"$
$LK,"cmp_type_flags_src_code",A="FL:::/Compiler/Lex.CPP.Z,328"$
$LK,"PrsVarInit2",A="FL:::/Compiler/PrsVar.CPP.Z,123",BI=227$
$LK,"PrsPop",A="FL:::/Compiler/PrsLib.CPP.Z,6",BI=228$
$LK,"asm_seg_prefixes",A="FL:::/Compiler/Asm.CPP.Z,388"$
$LK,"ICMinMax",A="FL:::/Compiler/BackC.CPP.Z,510",BI=229$
$LK,"ICMinMax",A="FL:::/Compiler/BackC.CPP.Z,419",BI=229$
$LK,"CmpLoadDefines",A="FL:::/Compiler/CInit.CPP.Z,205",BI=230$
$LK,"PrsIf",A="FL:::/Compiler/PrsStmt.CPP.Z,456",BI=231$
$LK,"ICBuiltInFloatConst",A="FL:::/Compiler/BackLib.CPP.Z,413",BI=232$
$LK,"ICFUnaryMinus",A="FL:::/Compiler/BackFA.CPP.Z,198",BI=233$
$LK,"LexDocRead",A="FL:::/Compiler/Lex.CPP.Z,310",BI=234$
$LK,"PrsIf",A="FL:::/Compiler/PrsStmt.CPP.Z,455",BI=231$
$LK,"ICBuiltInFloatConst",A="FL:::/Compiler/BackLib.CPP.Z,408",BI=232$
$LK,"ICFUnaryMinus",A="FL:::/Compiler/BackFA.CPP.Z,194",BI=233$
$LK,"LexDocRead",A="FL:::/Compiler/Lex.CPP.Z,311",BI=234$
$LK,"CmpFixUpJITAsm",A="FL:::/Compiler/CMain.CPP.Z,174",BI=235$
$LK,"COCPopNoFree",A="FL:::/Compiler/PrsLib.CPP.Z,114",BI=236$
$LK,"ParenWarning",A="FL:::/Compiler/CExcept.CPP.Z,110",BI=237$
$LK,"PrsFunCall",A="FL:::/Compiler/PrsExp.CPP.Z,378",BI=238$
$LK,"ICDerefPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,473",BI=239$
$LK,"ICDerefPostIncDec",A="FL:::/Compiler/BackB.CPP.Z,384",BI=239$
$LK,"Option",A="FL:::/Compiler/CMisc.CPP.Z,1",BI=240$
$LK,"ExeFile2",A="FL:::/Compiler/CMain.CPP.Z,655",BI=241$
$LK,"COptMemberVar",A="FL:::/Compiler/OptLib.CPP.Z,550"$
$LK,"COptMemberVar",A="FL:::/Compiler/OptLib.CPP.Z,549"$
$LK,"PE_CHECK_BINARY_OPS1",A="FL:::/Compiler/PrsExp.CPP.Z,6"$
$LK,"PE_CHECK_BINARY_OPS2",A="FL:::/Compiler/PrsExp.CPP.Z,7"$
$LK,"LexBackupLastChar",A="FL:::/Compiler/LexLib.CPP.Z,1",BI=242$
$LK,"Trace",A="FL:::/Compiler/CMisc.CPP.Z,19",BI=243$
$LK,"ICBrBitOps",A="FL:::/Compiler/BackC.CPP.Z,212",BI=244$
$LK,"ICBrBitOps",A="FL:::/Compiler/BackC.CPP.Z,210",BI=244$
$LK,"MODR_D32_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,133"$
$LK,"LexGetChar",A="FL:::/Compiler/Lex.CPP.Z,107",BI=245$
$LK,"LexSkipEol",A="FL:::/Compiler/Lex.CPP.Z,269",BI=246$
$LK,"ICFlagBranch",A="FL:::/Compiler/BackB.CPP.Z,785",BI=247$
$LK,"SLASH_OP_FSUBR",A="FL:::/Compiler/BackLib.CPP.Z,266"$
$LK,"ICFPreIncDec",A="FL:::/Compiler/BackFB.CPP.Z,660",BI=248$
$LK,"LexSkipEol",A="FL:::/Compiler/Lex.CPP.Z,270",BI=246$
$LK,"ICFlagBranch",A="FL:::/Compiler/BackB.CPP.Z,682",BI=247$
$LK,"SLASH_OP_FSUBR",A="FL:::/Compiler/BackLib.CPP.Z,260"$
$LK,"ICFPreIncDec",A="FL:::/Compiler/BackFB.CPP.Z,560",BI=248$
$LK,"MODR_SIB_INDIRECT_REG",A="FL:::/Compiler/BackLib.CPP.Z,134"$
$LK,"ExeFile",A="FL:::/Compiler/CMain.CPP.Z,616",BI=249$
$LK,"COCMiscNew",A="FL:::/Compiler/PrsLib.CPP.Z,143",BI=250$
$LK,"cmp_templates_dont_pop",A="FL:::/Compiler/CExts.CPP.Z,43"$
$LK,"CmpOffset2Reg",A="FL:::/Compiler/OptLib.CPP.Z,83",BI=251$
$LK,"PrsFunNew",A="FL:::/Compiler/PrsLib.CPP.Z,62",BI=252$
$LK,"StreamExePrint",A="FL:::/Compiler/CMain.CPP.Z,666",BI=253$
$LK,"StreamExePrint",A="FL:::/Compiler/CMain.CPP.Z,665",BI=253$
$LK,"COCGoToLabelFind",A="FL:::/Compiler/PrsLib.CPP.Z,152",BI=254$
$LK,"OptMVCompare",A="FL:::/Compiler/OptLib.CPP.Z,556",BI=255$
$LK,"ICToBool",A="FL:::/Compiler/BackB.CPP.Z,378",BI=256$
$LK,"OptMVCompare",A="FL:::/Compiler/OptLib.CPP.Z,555",BI=255$
$LK,"ICToBool",A="FL:::/Compiler/BackB.CPP.Z,289",BI=256$
$LK,"PrsFunJoin",A="FL:::/Compiler/PrsStmt.CPP.Z,68",BI=257$
$LK,"PrsNoUnusedWarn",A="FL:::/Compiler/PrsStmt.CPP.Z,787",BI=258$
$LK,"OptFixSizeOf",A="FL:::/Compiler/OptLib.CPP.Z,485",BI=259$
$LK,"OptFixSizeOf",A="FL:::/Compiler/OptLib.CPP.Z,484",BI=259$
$LK,"cmp_templates_dont_push",A="FL:::/Compiler/CExts.CPP.Z,45"$
$LK,"cmp_templates_dont_push_pop",A="FL:::/Compiler/CExts.CPP.Z,46"$
$LK,"LexAttachDoc",A="FL:::/Compiler/Lex.CPP.Z,330",BI=260$
$LK,"LexAttachDoc",A="FL:::/Compiler/Lex.CPP.Z,331",BI=260$
$LK,"PrsStreamBlk",A="FL:::/Compiler/PrsStmt.CPP.Z,801",BI=261$
$LK,"cmp_templates_dont_push2",A="FL:::/Compiler/CExts.CPP.Z,44"$
$LK,"InstEntryFind",A="FL:::/Compiler/UAsm.CPP.Z,66",BI=262$
$LK,"PrsDotDotDot",A="FL:::/Compiler/PrsVar.CPP.Z,381",BI=263$
$LK,"ICMulEqu",A="FL:::/Compiler/BackA.CPP.Z,344",BI=264$
$LK,"ICMulEqu",A="FL:::/Compiler/BackA.CPP.Z,322",BI=264$
$LK,"AsmPrsInsFlags",A="FL:::/Compiler/AsmInit.CPP.Z,1",BI=265$
H2@÷#÷#$$!$&$Q$S$†$p$–$�$®$Á$¨+>k>kTk\kgksk~k�k€k©k¯k¯kÖkãkl'l'lQlsl‹lxl—l½lªlÑlŞl m mm.mAmAmAmKmH<Jöö0ö:ö>öBöGöIöeö�ö�ö‹ö|ªÅ.ú.úXúZúaúgúmúoúuú{ú‚ú�úœú¯ú½úÌúÑúÓúØúâúòúûû3ûEû8şßşßà àà à'à)à.àd`µîÓîÓ ÔÔÔ Ô,Ô.Ô:Ô:ÔGÔIÔVÔXÔdÔdÔzÔƒÔƒÔ�Ô•Ô¤Ô¯ÔµÔºÔ¼ÔÈÔÏÔŞÔéÔïÔôÔöÔÕ2ÕXÕhÕxÕˆÕŠÕšÕªÕºÕºÕ¿ÕÙÕàÕçÕçÕçÕçÕîÕÖÖÖÖ"Ö&Ö&Ö&ÖSÖZÖpÖ|Ö‚ÖˆÖ�Ö�Ö�Ö�ÖDÃ�Ö�Ö´Ö·ÖºÖÇÖÍÖÚÖİÖàÖæÖèÖòÖ,cj¨‡¨‡¶‡À‡Ë‡Ö‡Ü‡â‡ jnÖÖäùÿ
P o6o6}6Œ6¤6ª6¼6¼6Ç6Ğ6Ö6İ6ã6 œ;^öEöEşEFF.FAF^FFˆF™FÀF×F×FùFGGG%GWGdGhGpGpGƒG“G—G›G Œ×öFFfnr€†ŒŒ¹Ïãñ -LUegnntt„ |1W#W#m#v#�#š#š#�#¬#²#»#½#Ã#Ì#Î#Ô#Ş#å#è#è#ò#0 'ğ…ğ…ş…†$†*†*†0†„•²@�@�T�[�b�f�Š���¤�µ�Ú�å�ğ�ò�ı�"�-�8�:�A�J�L�W�^�ˆ�("ÆÜÆÜÕÜèÜİİİ nÜnÜ}Ü�ܖ܃�¯�¯µ¯¼¯Ó¯ß¯ê¯ü¯ °ş¯ü¯-°H°T°[°a°m°w°~°…°‰°‹°‘°�°§°®°µ°¹°¹°Ã°È°Ó°å°ö°ç°å°±7±C±J±P±\±f±m±t±x±z±€±Œ±–±�±¤±¨±¨±µ±Ã±Ó±å±ö±ç±å±²7²C²J²P²\²f²m²t²x²z²€²Œ²–²�²¤²¨²¨²²²Â²Ô²å²Ö²Ô²³ ³³³(³/³6³:³<³B³N³X³_³f³j³j³t³‚³‹³¤³°³´³´³·³À³6´ìÆ{Æ{ã{�¡ë{ı{|$|6|=|N|V|^|a|o|›|›|°|²|²|¾|Æ|Ê|×|×|ã|ë|ï|ü|ü|ü|}#}4}4}9}Q}`}e}k}v}{}{}€}˜}§}¬}²}½}Â}Â}Ğ}Ù}å}í}õ}ı}~~ ~~&~/~@~P~P~U~]~e~h~n~n~s~s~s~y~|~ƒ~�~£~È~ß~ì~ô~ü~!*.1=CJOO]mmzz‚Š“¢§§®¹¿ÇÍØİİì÷ €€€€"€-€?€E€M€S€X€X€l€r€}€ƒ€…€•€›€›€½€ä€é€é€ı€��*�0�5�N�T�d�l�t�z���“�™�¯�À�Æ�Ë�ä�ê�ú�‚
‚‚‚‚+‚1‚G‚X‚^‚c‚r‚x‚‰‚‘‚™‚Ÿ‚¦‚«‚«‚Á‚ǂ݂î‚ô‚ö‚ƒ ƒƒƒ%ƒ+ƒ2ƒ2ƒ2ƒDƒMƒ^ƒnƒnƒsƒsƒ�ƒ‰ƒšƒ­ƒ´ƒºƒƒȃ؃ރæƒìƒìƒìƒñƒñƒñƒñƒñƒ„„!„!„7„@„K„T„_„j„o„o„…„‹„¡„²„¸„½„τՄڄ󄅅……"…*…-…3…9…>…>…b…j…r…‚…ˆ…�…�…Ÿ…½…½…Â…Â…Î…Ö…Ù…à…æ…ë…ë… ††#†)†0†N†]†e†}†…†ˆ†�†•†­†µ†͆Õ†؆߆å†å†å†‡‡ ‡(‡+‡2‡8‡H‡W‡c‡~‡†‡‰‡�‡–‡®‡º‡Õ‡݇à‡ç‡í‡í‡í‡í‡ò‡ò‡û‡ ˆ!ˆ'ˆ?ˆRˆXˆ]ˆoˆuˆzˆ–ˆœˆ¨ˆ°ˆ³ˆºˆÀˆéˆñˆ‰‰‰‰‰‰‰‰4‰J‰P‰h‰{‰�‰†‰±‰·‰ʉŠŠ/Š7Š=ŠBŠBŠ\ŠhŠtŠŠŠ„Š„Š�ŠªŠ¶ŠÁŠÁŠÆŠÆŠàŠìŠøŠ‹‹‹‹‹$‹0‹6‹;‹M‹S‹X‹g‹s‹‹…‹‹‹’‹¥‹°‹¹‹Å‹Í‹Ğ‹Ö‹Ü‹á‹õ‹Œ Œ$Œ,Œ/Œ5Œ;ŒSŒ[Œ{Œ•Œ�Œ Œ¦Œ¬Œ¬Œ½ŒÆŒÒŒÚŒİŒäŒêŒïŒ���0�8�;�B�H�`�h�‡�¡�©�¬�³�¹�¹�É�Ò�Ş�æ�é�ï�õ�ú���%�?�G�J�P�V�n�v�˜�´�¼�¿�Å�Ë�Ë�Ü�å�ñ�ù�ü�� �� �/�7�R�Z�]�d�j�‚�Š�¬�É�Ñ�Ô�Û�á�á�á�á�á�æ�æ�ü�����+�1�6�D�P�Y�e�m�p�w�}�‚�”�£�«�Ã�Ë�Î�Õ�Û�ó�û�‘4‘<‘?‘F‘L‘L‘L‘]‘f‘r‘z‘}‘„‘Š‘�‘¡‘°‘¼‘בß‘â‘é‘ï‘’’5’R’Z’]’d’j’j’j’j’j’o’o’‚’�’£’®’³’³’Æ’Ü’â’í’ï’ï’“%“+“6“6“H“Q“b“g“y“‰“‰“�“�“¡“·“½“˓ړߓߓò“”””+”0”0”F”L”i”�”�”«”±”¶””˔ڔڔߔߔõ”û”•0•0•Z•`•e•q•z•‰•‰•�•�•¤•ª•Ǖߕߕ ––– –)–8–8–=–=–S–Y–v–�–�–¸–¾–À–Ì–Õ–à–à–à–à–å–ó–ü– ——!—.—.—.—>—N—S—w—ƒ—„—‰—�—»—Ë—ï—ÿ—˜˜˜
˜˜$˜7˜u˜…˜‹˜�˜’˜£˜²˜ä˜ì˜ò˜ô˜ù˜™™ ™™.™7™F™F™K™P™_™h™s™u™~™‰™‰™ª™±™·™¿™Ê™Ğ™à™æ™î™ù™ÿ™ÿ™š šššš%š.š=š=š=šBšBšBšTšYšYškšvš~š†šŒšŒšŒš‘š‘šœš­š°š¼šÅšÑšØšŞšãšãšîšÿš›››#›*›0›5›5›5›5›:›?›?›F›J›J›V›_›b›b›m›o›�›ˆ›�›�›¨›³›¹››Æ›Æ›Ò›Û›Ş›Ş›é›ë›ı›œ
œœœ(œ.œ8œ;œ?œ?œGœNœQœSœ^œbœkœnœnœyœ{œ“œšœ¥œ°œ³œ¹œ¾œ¾œÅœÉœÉœÕœŞœáœáœìœîœ�� ��'�2�8�A�E�E�Q�Z�]�]�h�j�|�ƒ�‰�‘�œ�§�­�·�º�¾�¾�Æ�Í�Ğ�Ò�İ�á�ê�í�í�ø�ú���$�/�2�8�=�=�O�S�S�_�h�k�k�v�x�Š�‘�—�©�´�¿�Å�Ê�Ê�Õ�Ú�Ú�å�ê�ê�õ�ø�ü�ŸŸ ŸŸŸ&Ÿ+Ÿ+Ÿ8Ÿ<ŸMŸUŸYŸmŸtŸxŸxŸ…Ÿ‘Ÿ™ŸŸŸ¯Ÿ³ŸÄŸÖŸáŸåŸåŸòŸúŸ      
H2@_#_#h#n#‰#�#¹#»#î#Ø#ş#$$)$¨­Ó¾\¾\Ô\Ü\ç\ó\]õ\"](](]R]Y]„]’]’]¿]á]ù]æ]^4^!^K^R^}^}^„^¨^¾^¾^¾^È^H>L6ø6øPøZø^øbøgøiø‚ø›ø›ø¥øp©ÁFüFüpürüyüü…ü‡ü�ü“ü©ü¼üËüĞüÒü×üáüöü ı ı/ıAı8ãããã'ã0ã7ã9ã>ãd`µVÖVÖtÖxÖ…Ö‡Ö”Ö–Ö¢Ö¢Ö¯Ö±Ö¾ÖÀÖÌÖÌÖâÖëÖëÖöÖıÖ ×××"×$×0×7×F×Q×W×\×^×jך×À×Ğ×à×ğ×òרØ"Ø"Ø'ØAØHØOØOØOØOØVØlØxØ~؄؊Ø�Ø�Ø�Ø»ØÂØØØäØêØğØöØøØøØÙDÃÙÙÙ Ù"Ù/Ù5ÙBÙEÙHÙNÙPÙZÙ,cjЈЈވèˆóˆşˆ‰
‰ hl&&4IO
P ï5ï5ı5 6$6*6<6<6G6P6V6]6c6 œ;^®I®I¶IºIÓIæIùIJ7J@JQJuJŒJŒJ«JºJÃJĞJ×J KKK&K&K9KIKMKQK Œ×ö––¾ÂĞÖÜÜ  3AX^jo}™¢²´»»ÁÁÑ |1¿"¿"Õ"Ş"é"#####$#&#,#5#7#=#G#N#Q#Q#[#0 '‡‡&‡F‡L‡R‡R‡X‡„“°pŸpŸ„Ÿ‹Ÿ’Ÿ–ŸºŸÍŸÔŸåŸ
    " - R ] h j q z | ‡ � ¸ ("�Ş�Ş­ŞÄŞߪߪåŞ >Ş>ŞMŞcŞiރббõ±ü±² ²*²<²M²>²<²m²ˆ²”²›²¡²­²·²¾²Å²É²Ë²Ñ²İ²ç²î²õ²ù²ù²³³³%³6³'³%³V³w³ƒ³Š³�³œ³¦³­³´³¸³º³À³Ì³Ö³İ³ä³è³è³õ³´´%´6´'´%´V´w´ƒ´Š´�´œ´¦´­´´´¸´º´À´Ì´Ö´İ´ä´è´è´ò´µµ%µµµEµLµRµ^µhµoµvµzµ|µ‚µ�µ˜µŸµ¦µªµªµ´µÂµËµäµğµôµôµ÷µv¶Ôîî €T¦€%€A€L€^€e€v€~€†€‰€—€ÀÀØ€Ú€Ú€æ€î€õ€�����*�*�*�F�Q�b�b�g����“�™�¤�©�©�®�Æ�Õ�Ú�à�ë�ğ�ğ�ş�‚‚‚#‚+‚.‚4‚9‚B‚T‚]‚n‚~‚~‚ƒ‚‹‚“‚–‚œ‚œ‚¡‚¡‚¡‚§‚ª‚±‚¼‚Ñ‚ö‚ ƒƒ"ƒ*ƒ6ƒBƒHƒOƒXƒ\ƒ_ƒkƒqƒxƒ}ƒ}ƒ‹ƒ›ƒ›ƒ¨ƒ¨ƒ°ƒ¸ƒÁƒЃÕƒÕƒ܃çƒíƒõƒûƒ„ „ „„%„7„=„E„K„P„[„m„s„{„�„†„†„š„ „«„±„³„ÄɄɄ…….…4…J…[…a…f…………•…�…¥…«…°…°…Ä…Ê…à…ñ…÷…ü…††+†3†;†A†F†F†\†b†x†‰†�†”†£†©†º††ʆІ׆܆܆ò†ø†‡ ‡%‡'‡6‡<‡F‡N‡V‡\‡c‡c‡c‡u‡~‡�‡Ÿ‡Ÿ‡¤‡¤‡²‡º‡ˇއå‡ë‡ó‡ù‡ ˆˆˆˆˆˆ"ˆ"ˆ"ˆ"ˆ"ˆAˆMˆRˆRˆhˆqˆ|ˆ…ˆ�ˆ›ˆ ˆ ˆ¶ˆ¼ˆÒˆãˆéˆîˆ‰‰ ‰$‰B‰B‰G‰G‰S‰[‰^‰d‰j‰o‰o‰“‰›‰£‰³‰¹‰¿‰¿‰Љî‰î‰ó‰ó‰ÿ‰Š
ŠŠŠŠŠ<ŠDŠTŠZŠaŠŠ‘Š™Š´Š¼Š¿ŠÆŠÌŠçŠïŠ
‹‹‹‹"‹"‹"‹A‹Q‹]‹e‹h‹o‹u‹…‹—‹£‹Á‹É‹Ì‹Ó‹Ù‹ô‹ŒŒ&Œ)Œ0Œ6Œ6Œ6Œ6Œ;Œ;ŒDŒTŒjŒpŒˆŒ›Œ¡Œ¦Œ¸Œ¾ŒÃŒߌåŒñŒùŒüŒ� �2�:�J�P�W�W�W�\�\�e�}�“�™�±�Ä�Ê�Ï�ú���J�\�y���‡�Œ�Œ�¦�²�¾�É�É�Î�Î�è�ô�� � ���*�6�B�M�M�R�R�h�n�z�€�…�—���¢�±�½�É�Ï�Õ�Ü�ï�ú����� �&�+�?�Q�Y�t�|��…�‹�¦�®�Ñ�î�ö�ù�ÿ�‘‘‘ ‘+‘3‘6‘=‘C‘H‘Z‘l‘t‘�‘—‘š‘¡‘§‘‘Ê‘ì‘ ’’’’!’!’1’:’F’N’Q’W’]’b’v’ˆ’�’­’µ’¸’¾’Ä’ß’ç’ “+“3“6“<“B“B“S“\“h“p“s“z“€“…“—“©“±“Ï“דÚ“á“ç“”
”/”O”W”Z”a”g”g”g”g”g”l”l”‚”ˆ”””š”Ÿ”±”·”¼”ʔ֔ߔë”ó”ö”ı”•••,•4•O•W•Z•a•g•‚•Š•¬•ɕѕԕەá•á•á•ò•û•–––– –6–H–T–r–z–}–„–Š–¥–±–Ö–ö–ş–—————————&—A—G—R—W—W—j—€—†—‘—“—“—¦—É—Ï—Ú—Ú—ì—õ—˜ ˜˜-˜-˜2˜2˜E˜[˜a˜o˜~˜ƒ˜ƒ˜–˜¬˜²˜À˜ϘÔ˜Ô˜ê˜ğ˜ ™%™%™O™U™Z™f™o™~™~™ƒ™ƒ™™™Ÿ™¼™Ô™Ô™ş™š ššš-š-š2š2šHšNškšƒšƒš­š³š¸šÄšÍšÜšÜšášáš÷šıš›2›2›\›b›d›p›y›„›„›„›„›‰›—› ›±›³›Å›Ò›Ò›Ò›â›ò›÷›œ'œ(œ-œBœ_œoœ“œ£œ©œ©œ©œ®œ³œÈœÛœ�)�/�1�6�G�V�ˆ���–�˜���¤�¤�­�¿�Ò�Û�ê�ê�ï�ô�� ���"�-�-�N�U�[�c�n�t�„�Š�’���£�£�¨�­�´�»�Â�É�Ò�á�á�á�æ�æ�æ�ø�ı�ı�ŸŸ"Ÿ*Ÿ0Ÿ0Ÿ0Ÿ5Ÿ5Ÿ@ŸQŸTŸ`ŸiŸuŸ|Ÿ‚Ÿ‡Ÿ‡Ÿ’Ÿ£Ÿ¦Ÿ²Ÿ»ŸÇŸΟԟٟٟٟٟޟãŸãŸîŸòŸòŸşŸ 
 
    , 8 F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F H H _ g s s ” ¢ º ¼ È Õ Õ ø ¡¡¡"¡-¡4¡4¡>¡>¡A¡S¡q¡}¡}¡¬£x¿Ù_4_4q4s4w4€4Œ4˜4­4­4Ù4İ4â4î45 5555$5.5°œÄ¾Œ¾ŒÔŒÛŒìŒñŒ�óŒ���$�<�)�H�K�M�[�`�u�b���„�„���¥�’�±�·�·�Ê�İ�ğ��� �„�^x^x|x�x”x›x¢x¤x§x®xµxµxÑxÕxÛxÛxóxyyy yDydy…yŠy«y°y¼yÇyÌyÙyÜyz$z)z/z1z7z:zKzPzSz[zdzzŸz¶zÉzÎzÒzôz{ {#{6{;{?{a{|{œ{¯{´{Å{Ê{Í{Ï{Õ{Û{ì{ñ{÷{ÿ{ÿ{ ||)|<|A|E|g|‚|¢|µ|º|Õ|õ| } }$}(}J}]}]}x}x}x}†}�} } } }®}Æ}È}È}Ö}î}î}~~ ~~,~L~f~m~w~Š~�~�~�~•~›~µ~¼~Æ~Ş~à~æ~ **DH‰—HƒHƒ_ƒuƒ…ƒŒƒ£ƒ¾ƒĞƒÔƒ„Lîı����¢�®�Ä�°�Ğ�Ò�å�ø����4IRvÓvÓÓÓ‚Ó�Ó�Ó¡Ó¦Óä;ôô.ô1ôOôfôwôwô’ô˜ô�ô�ô¸ô¾ôÃôÃôÌôÚôæôíôóôøô;õEõLõRõTõTõgõmõmõmõ}õrõ�õ�õ¯õ´õ´õ´õ»õÂõÉõŞõåõöööĞL¼ø¡ø¡¢¢(¢1¢9¢<¢C¢G¢P¢a¢e¢k¢y¢–¢£¢²¢·¢Ã¢È¢Ï¢Û¢à¢ã¢í¢å¢ı¢£££ £%£.£4£4£B£E£Y£b£k£r£v£{£’£ª£³£Á£İ£é£é£¤¤¤¤5¤A¤I¤\¤c¤w¤€¤‡¤‹¤–¤›¤¢¤¿¤ì¤ó¤÷¤ù¤¥¥¥)¥+¥<¥F¥Q¥[¥j¥y¥•¥•¥˜¥ ¥¥¥'¦Xs…nHnH‹HœH©H³HÊHçHI II"I(I+I7IŒ Ø_Ø_è_ ` ````` ` `'`A`R`Z`Z`e`e`s`ƒ`ƒ`‘`—`—`¯`¯`µ`Û`(kqè‡è‡ö‡ˆˆˆ ˆ @UaŞæŞæìæôæûæç'ç'ç*ç,ç2ç $/4^İ^İkİyİ~İ„İ!$).6İ6İCİQİVİ\İ"$#(İİİ$İ)İ/İ#4ğy__k{‘™£»ÀĞæîø  % 5 K S ] u � ‰ “ £ ¨ ¾ È Ò Ü æ ğ ú    " , 6 @ V ` j t ~ ˆ ’ œ ¦ ¼ Æ Ğ æ ğ ú !!!"!,!6!@!J!T!^!h!r!|!†!�!š!¤!®!¸!Â!Ì!Ö!à!ê!ô!ş!""""$¨D@™@™V™]™d™r™ƒ™•™—™�™¤™´™¿™É™Ô™ë™î™ğ™ššš"š,š3š>šSš[š[šqšqšqš…š%$5:†İ†İ”ݣݨݮİ&¨Ekˆšˆš�š¥š¬šºšËšİšßšæšìšüš›››3›6›8›J›Q›a›k›u›|›‡›››£›£›¹›¹›¹›Î›'(&,0000&0,020(0_g�G�G´GÇGÖGÜGßGçG)  ß– – ¸ À Æ Ó Ú ö ü ü ü     ' 3 > D N U f f q { { � “ £ © ® µ µ Ö Ü ë ş !! ! !!!!!!!.!8!=!=!R!\!\!p!y!!…!›! !§!º!¾!¾!Æ!Ì!Ò!Ü!ã!ê!ó!""*"."4":"I"\"b"f"l"r"x"x"z"~"„"Š"�"•"•"•"•"À"Ñ"Ñ"è"õ"ù"##6#6#<#?#C#I#I#[#l#�#•#�#®#²#Ã#Ç#Í#æ#è#î#û#ı# $'$-$8$[$f$l$r$x$�$‡$œ$ª$²$¶$Ç$Ë$Ñ$ê$ì$ò$ÿ$% %+%1%7%=%F%L%i%\%ƒ%Line truncated
''''+'F'V'c'r'�'�'¬'¬'³'È'Í'Ö'ã'è'î'ó'ó'ú'ş'((((!(%(/(;(B(F(N(V(^(m({(€(Œ(Œ(”(”(·(·(Å(Ë(Ğ(Ô(Ù(Ù(Ù(Ù(ß(á(á()
)))-)/)/)/):):):)?)h**4+t>Å>ÅXÅ\ÅtÅ|Å„Å�ŒřşųŻÅÀÅÃÅÎÅÙÅáÅìÅ÷ÅùÅÆÆÆ(Æ3Æ5Æ@ÆKÆMÆYÆbÆbÆxƂƙƟƥƶƼÆÅÆ×ÆİÆİÆåÆéÆôÆùÆ ÇÇÇ(Ç*Ç.Ç=Ç=Ç=ÇNÇNÇSÇeÇkÇÙÇ+Ô@.á.áDáKáNárárá�á¢áµáÈáÍáÍáëáùá â â'â'â)â)â)â<â>â>â>âEâXâkâkâkâ~â‰âœâ²â·â»âÂâ×âêâñâñâôâã,LAPÇ$Ç$Õ$æ$ò$ %%2%4%O%j%j%r%y% %-P~�pˆpˆ~ˆ‹ˆ™ˆ«ˆ¶ˆÄˆÑˆßˆñˆüˆ
‰‰‰.4
66%616B6T6]6g6m6/|¼Wææ)OOXZZaˆ���­ÉÔÔàç÷ı&(AGRbt}ˆ�“š¿ÄÒÛÛâñ18?DOU]ƒŒ“˜£¯¾Ò×ßëıı  # 3 E K T T c i } † – ¥ · À Ğ ã ë ÿ 
7
;
G
^
z
Œ
’
�
©
¹
É
Î
×
×
é
í
ù
 , > D O [ k { � “ “ ˜ š š Ÿ Ÿ ® ´ º º ¾ 70�ÄäöÖöÖ××"×&×-×4×C×N×T×Y×[×g×n×v×|ׂ׆׆ולפתװײײ׾×18 ?/?/M/S/_/j/{/…/Œ/’/2@}‰&è&è4è?èFèeèrèrèuèwè}è3ğh ffŒŸ§®µ»½ÄËÎÎààóşBJS[`q‡—©®Èàääé*Fnv‡Œ�¯¿ÑÓí  %MU^fk|’¢´¹Óëï:'GSYq‰�£¿çïø(8JLf~‚‚�ÆÎ×ßäõ -2Ldh{{{€ ÀÌÒê *<Lcz‘¨¨¼ØØØù    + 9 T c j z | ‚ ™ ¨ ¡ ¾ Ï ê ê 
4D}Š^^n‚‹‘££§ª²5\Ob‡‡ ‡/‡8‡A‡E‡I‡U‡Z‡_‡_‡p‡t‡{‡“‡–‡¢‡60ıÖßÖßßßäßíßôßößûß7Ü4nnŒ“𥭯ÆÚóóş 5AWe{„–¾ÕÚâæ ë(,,<yX…¢¢ÁÌÒèùş8OT\`ƒb‰Ÿ£¿çïôøı$2FKduy‹‹‹‹�¬ìËø &<MRn–�£§¬½Ïİñó !!3[rwƒ¦…¬ÂÆÓÓÓÓæìöı''CSaaw‡•¬¿ÄÊàïè)G?l•••¢Ûàëñü2">Tbz�”¤Ãïßû7BH^otŠ ¤Àèğõùş%3GLevzŒŒŒŒ‘­Ìûë$/5K\a}¥­²»ÌŞì,00Oe{ŒŒŒŸ¥¯Éàààü 0@UNi|�‡�¬¥ÁÑßüü%EEEe8Do|*39KKORZ9°Åí&�&�<�C�T�Y�n�[�z�€�€�Œ�¤�‘�°�³�µ�Ã�È�İ�Ê�é�ì�ì�ø� �ú�� � �2�E�X�k�~�ˆ�:<‹–Æ×àæêõ;”)ŞéŞéæéêéöéê êê$ê6êAêLê[êlêsêŒê�ê�ê�ê§ê®êÁêÊêØêìêë ë*ë<d(=0†0†<†P†S†g†o†s†}†‡†�†’†˜†=$t¹ÀEÀEäEçEëEøEF FF F*FRFRF^F`F`FlFqFqF}F‚F‚F�F“F“FŸF¤F¤F°FµFµFÁFÆFÆFÒF×F×F×FÚFÚFóFGG%G%G'G'G3G9G>G>GDGPGPG[GgGtG‰G‘G—G—G¨G¨G±G´GH>è w®£®£Ë£Ó£Ö£ä£ò£¤¤(¤>¤P¤[¤l¤p¤‚¤…¤�¤™¤¥¤¸¤é¤ޤĤù¤ ¥¥*¥8¥V¥h¥Œ¥�¥Ÿ¥À¥¦¥Û¥Û¥Ş¥ã¥æ¥æ¥í¥¦ ¦¦¦,¦9¦L¦L¦`¦d¦‘¦‘¦©¦®¦®¦¾¦ƦÖ¦à¦ğ¦ú¦
§§§§+§3§C§M§]§g§w§ƒ§ˆ§ˆ§ˆ§ª§¸§§ǧÔ§é§é§î§ø§¨ ¨¨¨¨¨&¨5¨:¨@¨E¨E¨K¨Q¨V¨V¨e¨x¨„¨‘¨�¨°¨¸¨¾¨Ǩިò¨©©©-©@©W©d©l©©‡©�©–©Ÿ©Ÿ©¤©¤©¤©¤©¤©°©°©°©¹©Ò©ç©ï©
ªª(ª*ª>ªCªCªCªNª\ªaªaªhªvª{ª“ªŸª±ª½ªêÒªÖªߪ誫«««0«8«@«m«~«‹«�«›«›« « «§«µ«º«Í«Ù«å«ë«ï«ø«ı«ı«ı«ı«ı«¬¬¬¬¬¬+¬+¬+¬+¬+¬+¬+¬+¬+¬+¬4¬M¬b¬j¬…¬–¬£¬¥¬¹¬ŬʬʬʬÓ¬í¬ù¬ş¬ ­,­,­1­1­1­1­1­1­1­1­F­K­K­K­\­g­l­l­w­‰­¡­³­Ô­ô­ÿ­®®®®®@®I®Z®^®v®†®�®–®¡®Ë®Ô®Ø®ğ®¯¯¯¯¯"¯[¯d¯h¯n¯s¯|¯…¯НННН™¯­¯˯Ö¯Û¯á¯æ¯æ¯ù¯ °3°>°F°L°L°Q°Q°`°t°’°�°¢°¨°­°­°À°Ô°ú°± ±±±±±±!±:±O±W±r±ƒ±�±’±¡±£±£±£±£±£±·±·±·±·±·±·±·±·±·±·±·±·±·±·±·±·±ƱÕ±à±â±â±ë±í±í±²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²"².².²2²7²G²b²w²†²’²¨²²ŲϲÛ²³!³A³e³g³z³¨³€³óóƳÖ³޳ù³
´ ´'´5´A´Y´Y´„´‡´–´ª´Ë´Ü´ø´ä´µ&µDµwµuµjµ_µPµ…µ…µ…µˆµ�µ�µªµ¸µæµ3¶6¶E¶Y¶z¶‹¶§¶“¶ööá¶···ü¶í¶"·"·"·%·*·*·1·A·b·n·ú?°«Ó–À–À¬À°À»ÀÂÀÍÀáÀáÀìÀıÀÁÁÁ*Á2ÁCÁCÁLÁQÁYÁiÁwÁ†Á‘Á¤Á¤Á·Á·ÁÍÁùÁùÁ ÂÂÂÂ!Â!Â+Â3Â3Â3ÂDÂDÂDÂHÂPÂVÂ[Â[Â_ÂgÂkÂqÂvÂv‚—§±ÂÄÂÉÂÑÂÑÂÖÂÖÂİÂéÂşÂÃà Ã&Ã9Ã>ÃFÃLÃLÃQÃXÃcËÖåï÷ýÃÏÃÕÃÚÃÚÃÚÃÚÃÚÃÚÃÚÃÚÃÚÃåÃñÃşÃÄÄÄ/Ä4Ä<ÄAÄIÄNÄNÄNÄVÄ^ÄgÄoÄtÄ|Ä�ÄˆÄ“Ä»ÄÆÄÎÄİÄçÄùÄşÄÅ Å ÅÅ"Å*Å=ÅEÅMÅbÅdÅoÅwŌŌŔŨŰŷŽÅÁÅÅÅÔÅÙÅåÅûÅÆÆ$Æ0Æ5ÆAÆLÆQÆQÆQÆrƌƑƙƨưƸÆÍÆÒÆİÆåÆúÆÿÆÿÆ Ç!Ç-Ç5ÇJÇVÇ[ÇgÇrÇwÇwÇwÇwÇwÇwǂǂǂǂǂǂǂǂǂǂǂǂÇ�Ç­ÇÊÇÚÇàÇèÇûÇÈÈÈÈÈ-È3È;ÈCÈEÈeÈmÈvÈ~ȆȋÈ�È—È¢ÈÊÈÕÈİÈìÈöÈÉÉÉ!É!É!É*É3É6É@ÉNÉ`ÉbÉtɆɆɆɑɖɳɸɸÉÁÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÆÉÑÉİÉéÉ ÊÊ$ÊDÊIÊQÊXÊeÊmÊvÊ~ʅʊʊʒʚʶʾÊÁÊÃÊÓÊİÊİÊİÊßÊòÊËË ËËËË Ë$Ë,Ë3Ë@ËYË`ËeË}ˇˢ˻ËÃËĞËéËğËğËõËõËõËõËõËõËõËıËÌÌ"Ì'Ì'Ì/Ì7ÌDÌIÌIÌIÌMÌRÌRÌbÌgÌgÌgÌsÌzÌ€Ì�̡̽ÌĞÌÖÌŞÌóÌúÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Í)Í7Í7Í<ÍGÍNÍjÍwÍwÍwÍ{͆ͤͲͪÏ@ü|®Ï®ÏÄÏÏÏÖÏáÏìÏĞĞĞ%Ğ8ĞBĞBĞ^ĞxĞЈĞ�Ğ’Ğ�ЧЮбжĞÌĞÖĞèĞîĞúĞÑÑÑ*Ñ?ÑFÑFÑFÑTÑbÑlÑoÑ}чъќѡѦѶѹѾÑÎÑÑÑÕÑŞÑæÑøÑÒÒÒÒ Ò2Ò8ÒDÒYÒ`ÒhÒzÒ€Ò�Ò Ò Ò§Ò§Ò§ÒµÒÃÒÍÒĞÒŞÒèÒëÒıÒÓÓÓÓ Ó/Ó2Ó6Ó?ÓGÓYÓaÓaÓmÓzÓ‚Ó‚Ó…Ó�Ó®Ó¼ÓÔAhoÅfØf؀ؚؓءجؿØÂØËØÒØÕØåØóØşØ Ù Ù"Ù.ÙCÙNÙYÙdÙoÙzÙ‘Ù�ٴټÙÅÙÍÙÚÙõÙøÙşÙÚÚÚ$Ú7Ú=ÚEÚEÚSÚeÚrÚ…Ú‹Ú“Ú¦Ú¬Ú´Ú´ÚİÚâÚÛÛÛ ÛÛÛ'ÛAÛMÛ]Û}Û™Û­ÛµÛ¿ÛŞÛòÛòÛhÜB 6+6+@+H+M+CÉÇfSfSƒS�S¡S�S»SÉSÉSÙSâSéSíSöSöSşST T,T8T>TITkTkT~T‰T�T–T›T›T®T¹TÄTËTÓTàTàTòT÷T÷TU U U U U$U7U=UDUYUmUmUrUrU‚U‡U‡UŒU“U›U¢U¤U¬U³U³UÂUÈUÕUÜUßUVV VV#V*V,V@VOVTVYVYVYVlVqV€V‡V�V£V·V·V¼V¼VÄVÚVßVóVúVÿVÿV WW,W;WNWRWaWoW}WŒW©W´W¹WÈWÜWãWêWúWüW
XXX*X7XGXNXcXjXvX‡X�X X¬X·X¹X¹XÄXØXåXíXïXYYY,Y8YYY`YlYŠYŠYŠY’Y�Y¡Y©Y­YµY¼YÌY×YñYöYıYZZZZZ-Z:ZHZSZ^ZlZrZxZ~Z‡Z�ZœZ©Z±Z½ZËZâZäZíZøZúZ[$[*[0[6[?[P[w[[‰[–[®[µ[Á[Ğ[å[å[ò[÷[ \\\\\Ë\DD�›NŒNŒbŒnŒ„ŒpŒ�Œ’Œ¤Œ¶Œ¾ŒEìˆÿ&Z&ZHZRZ…Z”ZªZÎZÓZ×ZßZèZ÷ZşZ[ [![2[Q[Y[[[z[‚[‘[˜[¤[©[°[¸[¾[À[Ü[á[÷[ã[\ \ \\\)\H\O\Q\p\w\w\w\‹\Ÿ\£\±\Ä\¼\Ü\á\ì\ó\û\]] ]$]:]&]F]L]L]h]m]†]r]’]˜]�]¹]¾]Ô]À]à]æ]í]õ]û]ı]^^4^ ^@^F^F^F^N^W^W^a^a^y^©^½^Á^Ï^â^Ú^ú^ú^ _FüE€îİîİ Ş)Ş.ŞOŞmŞ|ŞšŞ®ŞÆŞÍŞÒŞóŞß ß=ßNßeßißißmßrßwß�ß„ß�ߔ߱ߴߴߴ߹߿ßÛßéßõßşßàà#à?àJàVà_àsàsà‚à‡à‡à•àGl¬Ã¦D¦D´DÎD»DíDÚDùDEûD-EE9EGEOEZE\EgErErE‘E—EHP‡—FóFóZógóvó‚óˆó²óÈó´óßóÔó÷óÿóIŒg†ÖñÖñò+ò+ò>òBòaòuòzòzò‡ò�ò—ò¬ò¸òÉòÎòßòóòøòúòúòúòó+ó+óEóJP�­.7.7W7Y7g7m7‹7š7©7¸7Æ7Ñ7Ô7ä7Kì8n0n0˜0›0�0¤0©0À0×0î01&1M1P1i1€1’1Ÿ1²1Å1Ê1Ò1Ü1ä1ä1ë1ô1ô1ÿ1'2A2G2`2y2{2•2›2´2Í2Õ2à2à2ê2ê2ü2:3O3a3L$ty¶d¶dádÊdëdódMLu„ŞÇŞÇğÇÈÈ'È.È6ÈFÈNÈ_ÈeÈ—ÈNTHYˆbˆbšbœb¥b®b¼bÁbÊbÍbÒbàbêbíb÷bO¨!Gà`à`ğ`ù` aa%a1a=aIa`a`aoazaƒaŠa“aªa½aÂaÔaãaïabb
b*b*b,b?bAb[bgbjb�bPxîˆ(m(mAmLm\m¥m¬mÀmÇmÏm×màmèmğmòmúmn nn/nGnPnPn…n¯n¸nÚnôno;oGoiokoroyoyoœoµoÜoõop5p\pupœpµpÜpõpqq+q8q=q=qLqYq^q^qeqpq‚q›q´qÍqÏqÏqÏqÖqÖqãqèqèqèqùqrr/rirprprprxr•r£rÁrÊrÓràrîrs$s$s$s7sEsassssŠs�sºs¼sÓsÙsêsósõstttt t tDtFtMt^tgtitwtyt‡t‰t—t—t·t·t·t·tÄt×têt uu1u9u=uEuIuWueuguousuwuu�u›u›uµuÀuÖuèuv v*v4v;vTv`vgv€v€v’v—v™vŸv°vÁvĞv×vèvñvóvwwww!w!w!wEwEwbwiwpwsww‚w�w”w¢w¦w´w¸w¸wÑwØwİwëwüwxx9xLx[x]xlxnx}x‡x‡x•x�x´x»xàxåxy>yCyQySyayjy„y†yˆy�y y©y«y¹y»yÉyËyÙyÙyùyùyùyùyùyzzz#z?zdz}z‚z‚z‚z¤z©z©z©zÉzÎzÎzÎzízòzòzùzûzûz{{{ { {{{3{I{n{Š{�{£{£{¾{Ë{Í{Ü{å{ÿ{||||'|)|)|1|,|j|j|j|‰|‰|‰|ª|¯|¯|¯|Ñ|Ö|Ö|Ö|ö|û|û|û|} } }:}H}J}Y}b}|}~}~}ƒ}~}¤}¦}¦}®}©}ç}ç}ç}ò}ò}~~F~^~v~�~—~§~¼~Ô~è~/FMEƒQ|.>ä>äbävä�ä–ä´ä¿äİäİäİäêäååååå)å+å+å9åFå^å^åoåƒåRçe¾×¾×Ø×á×ØØØØØ Ø'Ø-Ø:Ø:ØWØ\Ø\ØbØgØgØmØrØrØxØ}Ø}ؕبخسسؼØÜØÜØÜØãØåØåØìØîØîØôØôØûØıØıØÙÙ
Ù Ù ÙÙÙÙÙ!Ù'Ù-Ù5Ù5Ù5Ù5ÙAÙIÙQÙYÙaÙiÙqÙwÙ�Ù�٨٫٫ٵٻÙÁÙÁÙÅÙÍÙÔÙØÙàÙèÙîÙöÙıÙÚ ÚÚÚ"Ú(Ú5ÚAÚGÚOÚSÚZÚbÚjÚnÚtÚ|ÚƒÚ‹Ú“Ú—Ú�Ú¨Ú­ÚÃÚÔÚÙÚÜÚ‚ÛSL˜§„„1„3„:„P„`„f„~„–„™„«„ó„TÔ*[.ë.ëBëWëfëjëxë~ë�ë�ëœë§ë²ë½ëÄëÔëëëşëì ì ììì3ì5ì?ì`ìkìmì†ìŠì˜ì�ì�ì¤ì°ì¸ìËì5íU$nsvdvd¡dŠd«d³dVl  ~H~HŒH¦H“HÅH²HÑHæHÓHIòHI I'I2I4I?IJIJIiIoIW,6Ò6Ò?ÒEÒMÒ\ÒkÒpÒXTÒΡΡï¡¢ ¢¢7¢A¢O¢i¢v¢v¢€¢€¢‡¢š¢˜¢¨¢¨¢³¢½¢âɢ̢ڢá¢ù¢££££%£0£J£e£y£–£¸£½£ãÉ£Ô£á£ÿ£ç£¤ ¤¤¤ ¤?¤'¤H¤L¤R¤Z¤_¤_¤l¤r¤�¤y¤™¤�¤£¤«¤°¤°¤ѤÕ¤Û¤ã¤ò¤ ¥ù¤¥¥#¥+¥0¥0¥Q¥U¥[¥c¥c¥h¥u¥“¥{¥œ¥ ¥¦¥®¥Î¥¶¥×¥Û¥á¥é¥é¥ö¥¦ü¥¦!¦'¦/¦O¦7¦X¦\¦b¦j¦j¦j¦€¦€¦€¦€¦‹¦•¦�¦¾¦ʦئݦë¦ÿ¦§§§§ §(§4§H§U§d§s§�§’§’§�§¥§²§½§ʧէ裡¨¨#¨#¨.¨D¨Q¨Y¨e¨s¨x¨†¨š¨š¨¢¨š¨º¨¿¨¿¨ΨÓ¨Ó¨â¨ç¨ç¨ø¨ı¨ı¨©©©&©5©:©:©M©\©a©o©a©ƒ©ˆ©–©ˆ©ª©¯©½©¯©Ñ©Ö©ä©Ö©ø©ı©ı©ª ªAªFªTªFªhªmªmªŠª�ª±ª¶ªĪ¶ªتݪݪúªÿª!«&«4«&«H«M«M«j«o«‘«–«¤«–«¸«½«½«Ø«İ«İ«ø«ı«ı«¬¬¬8¬=¬=¬X¬]¬]¬x¬}¬}¬˜¬�¬�¬¸¬½¬½¬άÓ¬Ó¬ä¬é¬é¬õ¬­­­­&­?­D­g­n­x­}­�­˜­­­¸­½­έÙ­á­æ­æ­ê­î­õ­ÿ­ ® ®®!®!®!®%®;®D®D®g®l®l®t®ˆ®‘®«®¸®îήÙ®ë®÷®¯¯¯¯¯3¯>¯H¯S¯X¯c¯k¯p¯p¯{¯ƒ¯Œ¯—¯§¯¿¯ׯë¯ğ¯ğ¯û¯°°#°D°P°^°c°q°u°z°z°а•°�°¢°­°º°Űß°ñ°±±±±&±+±6±C±N±h±z±Œ±Œ±Œ±Œ±‘±–±–±¢±³±³±Ù±Û±÷±÷±²² ²!²-²5²R²c²m²x²›²¬²½²βÙ²ñ²³³³³³³³)³.³.³6³A³F³F³N³l³V³„³‰³‰³‘³¯³™³dz̳à³̳ø³ı³ı³
´´´´´´(´9´K´P´P´d´P´|´�´�´‰´�´�´¡´¦´¦´¹´¾´¾´Ø´è´í´í´µµµµ6µFµKµKµeµuµzµ‘µzµ©µ®µ®µ¹µ¾µúµèµÖµ¾µS¶A¶/¶k¶p¶p¶�”¶”¶£¶³¶¸¶¸¶ǶÕ¶Ú¶·ğ¶Ú¶· ·G·5· ·_·d·Œ·z·d·¤·©·©·Æ·°·ğ·¸¸¸ ¸ ¸J¸Z¸_¸_¸k¸p¸p¸|¸�¸�¸”¸¤¸©¸©¸¼¸̸ѸѸä¸ô¸ù¸ù¸ ¹¹!¹!¹)¹.¹.¹6¹;¹;¹C¹H¹H¹P¹U¹U¹h¹m¹m¹€¹…¹Ó¹Á¹¯¹�¹…¹à¹å¹3º!ººı¹å¹@ºEºEºTºoºtºtº…º º¥º¥º¶ºĺɺɺѺÖºÖº޺ãºãºëºğºğº(»»»÷ºG»b»g»g»Ÿ»�»{»n»¾»Ù»Ş»¼ş»ö»Ş»(¼-¼_¼M¼E¼-¼w¼|¼–¼€¼|¼®¼³¼мº¼³¼è¼í¼í¼ù¼½"½3½3½Y½[½q½w½w½“½ ½ѽ¾¾ğ½ ¾'¾'¾'¾3¾8¾8¾K¾V¾`¾e¾p¾z¾¾¾™¾�¾�¾¦¾«¾¿¾«¾˾Ö¾Û¾ï¾Û¾û¾¿ ¿ ¿¿$¿)¿)¿4¿?¿D¿D¿U¿Z¿Z¿k¿p¿p¿Š¿•¿š¿¢¿š¿®¿³¿Ç¿³¿Ó¿Ø¿à¿Ø¿ì¿ñ¿Àñ¿ÀÀÀ*ÀÀ6À6À6À;ÀGÀ;ÀZÀ_À_ÀkÀ_À~ÀƒÀƒÀ�ÀƒÀ¢À§À§À³À§ÀÆÀËÀßÀËÀëÀ÷ÀÁ ÁÁ&ÁÁ2Á>ÁIÁTÁYÁmÁYÁ�ÁyÁŠÁ�Á�Á—ÁœÁœÁ¥ÁªÁªÁ³Á¸Á¸ÁÁÁÆÁÆÁÑÁÖÁÖÁáÁæÁæÁñÁöÁöÁÂÂÂÂÂÂ!Â&Â&Â1Â6ÂJÂ6ÂVÂaÂlÂwÂ|Â|†‹‹•šš¤©©³¸¸ÂÀÂÅÂÅÂÒÂ×Â×ÂäÂéÂéÂéÂéÂéÂñÂöÂöÂşÂÃà ÃÃÃÃÃÃ%Ã*Ã>Ã*ÃJÃ[Ã`Ã`ÃrÃ}Ã�âøÃÃÃÜÃÈÃèÃóÃşÃÄÄÄ Ä@ÄEÄ[ÄfÄÄkċĖġĦĦĸÄÃÄãÄèÄşÄ Å"ÅÅ.Å9ÅDÅIÅIÅoÅ[Å{śŠŶÅÁÅÆÅáÅÍÅÆíÅ Æ#ÆÆCÆ/ÆOÆZÆ_Æ_Æ…ÆqƑƱƶÆÌÆׯÜÆ÷ÆãÆÇÇ#Ç9Ç%ÇYÇEÇeÇpÇuÇuǛLJǧÇÇÇÌÇâÇíÇòÇ ÈùÇ-ÈÈ9ÈOÈ;ÈoÈ[È{ȆȋȋȚȟȟȮȳȳȳȹȾȾȾÈÈÈÊÈÊÈÔÈáÈÉÉÉ É É É É ÉÉÉ&É-É8É8ÉEÉKÉRÉ]ÉhÉsÉ~ɉɃɬɤÉÄÉÒÉÌÉõÉíÉ Ê Ê ÊÊÊ1Ê7ÊEÊXÊXÊpÊzÊ�ʨʨʨÊÉÊÙÊîÊËËË8Ë?ËNË`Ë`ËdËiËpˀ˟˟ˣ˺ËÁËÆËÆËÊËÕËáËïËÌ%Ì6ÌDÌw̃̈Ì�̲̾ÌÌÌÑÌßÌûÌ&ÍLÍOÍ_ÍaÍaÍeÍ„Í�Í�Í’Í ÍËÍëÍëÍëÍîÍĞY, vÒvÒ„ÒŠÒ�Ò�Ò¬Ò²ÒZ`áõ^™^™t™–™£™§™¶™Ï™Ó™Ù™ì™ š š š<š*š š[šeš[8cmdd'dd3d>dIdTd_dkdqd\\�”ˆœˆœ–œ˜œ£œ«œ¶œÁœÌœÎœäœäœöœ� ��=�]ܳfîéîé ê)ê7êYêYêjêwê•ê�êÊêÏêøêë1ë7ë;ë^ë„ë‰ë²ëÌëòë ììì,ì4ì9ìJìRìqìwì{ì”ìœì»ìÀìÑìÙìøìıìí ííí%í-í9íOíTífíkí|í�í“íœí°í»íàíî5î:î:î:îJîQî_îlî�î�î¥îªîªîÁîÃîÃî×îÙîÙîğîòîòî ï ï ï"ï"ï3ï8ï8ïHïmïï„ï„ï„ï„ïœï¿ïÒïğïğïğïıïğğğğ#ğ:ğ<ğ<ğIğ`ğ`ğwğyğ“ğ±ğ±ğ±ğµğ·ğ·ğ·ğ¼ğ¾ğ¾ğÃğÃğÍğÒğÒğğğğğğğøğúğúğúğñññ ñ ñññ3ñ5ñHñ^ñ^ñ^ñ^ñ^ñqñ‰ñ‘ñ‘ñÔñ^`
UU(U4URUnU{U’U¥U°UÅU²UÑUÙUäU÷UğUVV_ôWæ=æ=>>> >'>,>.>5><>@>R>„>�>‹>¶>»>Ü>Ü>è>ğ>ÿ>9?>?k?s?x?�?Œ?”?›?º?À?ß?á?@ @"@A@G@N@N@T@W@[@l@Œ@�@`$–ܖܥܽܽÜÃÜaxb|6ç6çVçxçxç‚ç‡ç‡ç¦ç³çµçµçµçµçÂçÊçİçñçóçóçûçèè èb”"~/~/ /ª/¶/»/Ë/Ñ/æ/ú/ 00%0<0D0N0]0e0r0z0}0}0}00�0˜0¡0©0¬0¾0cHÏî9î9:#:&:/:5:L:c:z:Œ:º:Ö:ğ:õ:ú:;;.;;;N;d;x;};ˆ;¨;­;°;Ê;ä;ì;ô;ù;<-<5<=<B<\<d<i<‰<�<‘<«<Å<Í<Õ<×<ñ< ====7=?=?=D=I=T=T=_=_=k=k=}=½=Ó=Ó=ã=dd¤¹È‰È‰Ø‰ß‰ë‰ñ‰ù‰ŠŠ&Š=ŠJŠJŠMŠ[ŠkЂІŠ�Šeºû++-+2+F+u+�+�+˜+¨+¨+¿+Æ+İ+ä+í+,,,,0,0,F,F,\,\,r,r,ˆ,ˆ,�,�,´,´,Ë,Ë,â,â,ù,ù,--'-'->->-U-U-m-m-…-�-˜-©-´-Å-È-Ê-á-è-ô.f¬÷†† ¦­µ½ÀËİİñøûı"8;ILOVZbp‚’•äg(FLÆ’Æ’í’Ú’ù’““hCFKFKiK~KƒK‹K“K›K¨K®K·K½KÂKÊKæKìKîKğKıKıK
LÿKL!L#L%L2L2L2L7L@LHLQLYL[LcLkLsL€L†L‘L˜L¨L³L¿LİLäLïLõLM
MMM&M6M>MAM§Mi8-77070K0O0T0_0j0m0q0y0j¤ö›fšfš„š¨š®šµšµš¼šÜšáš÷š›ÿš ›2›D›M›U›_›}›�›˜› ›ª›Û¯›Ï›á›ë›ó›ø›œÿ›3œ œ?œUœAœuœaœ�œ“œ�œ¥œ¥œ®œ¶œÌœåœ÷œ�
�
���4�6�;�F�\�\�\�`�l���›�¥�²�Ó�á�ë�í�í���(�+�K�O�n�r�•�™�¸�¼�¼�¼�Â�Ğ�Ú�ó�ù�ŸŸŸŸ Ÿ9ŸDŸRŸ\ŸuŸxŸ€ŸŒŸ�Ÿ–Ÿ™Ÿ²Ÿ´ŸÀŸŸÊŸĞŸéŸ   " ' 9 H a r r } ˆ   ¬ Á Æ Ø ç ¡¡¡¡"¡*¡8¡?¡Q¡kfä†Û†Û Û©ÛÉÛÉÛÏÛ×ÛßÛçÛïÛõÛÜÜÜÜÜÜ Ü Ü&Ü+Ü+Ü1Ü6Ü6ÜNÜaÜgÜlÜlÜuܕܕܕܜÜ�Ü�ܥܧܧܭܭܴܼܼܶܶÜÃÜÅÜÅÜËÜËÜÒÜÒÜÚÜàÜæÜîÜîÜîÜîÜúÜİ
İİİ"İ*İ0İHİWİaİdİdİnİtİzİzİ~݆İ�İ•İ�İ¡İ§İ¯İ¶İ¾İÆİÊİĞİÛİáİîİúİŞŞ ŞŞŞ#Ş'Ş-Ş5Ş<ŞDŞLŞPŞVŞaŞfŞ|Ş�Ş’Ş•Ş;ßl`'"'"0"7"K"_"d"‚"‡"¥"§"Å"Ç"Ş"ò"û"ı"#!#R#m|2ÍББæ‘÷‘’’*’;’N’V’d’‚’�’“’ ’µ’µ’È’Ù’ß’ô’““$“)“1“9“?“W“j“u“y“ƒ“˜“�“ “­“¯“Á“Á“ȓГâ“â“ñ“ÿ“”” ”$”0”4”@”D”P”T”T”g”z”€”„”�”’”¡”¥”´”¸”˔ϔϔϔϔԔæ”õ”••-•=•M•R•R•R•^•f•n•t•‰•‘•Ÿ•©•·•½•¿•¿•¿•¿•¿•¿•¿•¿•¿•˕ӕەá•ö•ş•–
–––––0–6–B–H–U–p–€–Œ–’–Ÿ–±–¿–Ş–8˜nÔ¼íHkHkZkkkvk�k—k©kÁkÆkÏkÖkãkêkøkÿkll l ll+lEl[lslxl�lˆl•l©lÄlËlÍlĞlÕlølm"mo$hm×&×&å&ù&''p¤b‡ÎXÎXâXéXYûXY Y'Y'YGY]YIYiY�Y{Y›Y Y§Y§Y¯Y¶YÁYÌYÔYÜYçYòYZıYZ%ZqFƒælælm m!m9mCmNmNmSm^mjmumƒm“m£mªm°mÅmÚmÚmîmömnn"n/n@nQn_nmntnzn�n¤n¤n¸nÅnÖnænìnınınoo"o/o?o¡or8¬öJöJúJÿJKK#K,K1K6K8Ks88B00“0—0œ0§0±0´0¸0À0t0†�>I>ITIgItIzI}I…IuÜtöö#.7GY_ek�p•¢¥­¿ÅÊí
!'7=IW\jƒ‘šª¬³¸Àßíù29CRX^dj€¡µÁØãòÿ+9P\ao� ·ÀÆÑÖÜóş  /1?N``h‹–Êv`ÌàN˜N˜d˜†˜“˜—˜¦˜ŘɘϘâ˜ÿ˜™™2™ ™™Q™[™wT�Ş–à–à®à¶àÃàãàõàüàá áááá<á<áCáFáKáZá^á‹á�á”á”á›á�á£á¯á½áÁáÒáááåáçáöáúáâ â%â%â9â<âHâRâYââŠâ�â“âÉâàâëâïâã ãããã ã ã:ã>ã@ã@ãKãOãiãmãmãmãqã”ãxˆßı–ã–ãªãÀãÀãÀãÂãÂãÉãËãËãÒãÔãÔãáãããããğã÷ãùãùãä äää'ä,ä,ä<äy°‰±nene†e�e™eóeŞeÓe¾e§eùe fûe&f&f?f3flfqf}fˆf�fŠf©f¯f¶f×fÉf½fëfífggg:g:g:gFgz †*>´>´[´b´j´u´Œ´–´–´­´·´Ò´è´ö´ú´µ.µBµIµMµfµpµ�µ�µ�µ•µœµ¡µ¦µ«µ²µ¹µÓµÚµêµîµîµøµ#¶6¶I¶I¶O¶Z¶a¶i¶t¶{¶ƒ¶�•¶•¶ ¶¾¶Â¶Ú¶Ë¶õ¶õ¶û¶···'·.·2·4·F·F·F·X·`·†·”·”·˜·­·µ·Å·Ğ·å·ê·ø·¸¸¸(¸,¸1¸9¸=¸L¸N¸]¸_¸n¸p¸¸†¸Š¸�¸¦¸´¸»¸¿¸Ï¸Ú¸ß¸ı¸¹¹¹¹&¹4¹;¹?¹G¹[¹c¹n¹r¹r¹r¹}¹ˆ¹˜¹¤¹º¹Â¹Í¹Ü¹ä¹ï¹ô¹ü¹ººº"º'º9ºAºLºLºLºLºZºiº†º’ºšºªºººØºÜº »»ñº»»%»,»;»J»R»`»g»k»m»|»„»’»™»�»�»Ÿ»±»±»Ã»Ã»Ã»É»Õ»ç»ï»¼3¼A¼E¼c¼j¼q¼|¼’¼”¼›¼®¼¶¼Ä¼Ë¼Ï¼Ñ¼ä¼ì¼ú¼½½½½½½½-½5½C½N½R½R½W½_½c½r½t½ƒ½…½”½–½¥½¬½°½Ä½Ì½Ú½á½å½õ½¾¾#¾+¾9¾@¾D¾L¾Z¾a¾e¾m¾�¾‰¾”¾˜¾˜¾˜¾£¾ª¾¸¾Ò¾â¾í¾¿¿¿"¿.¿D¿L¿W¿f¿n¿y¿~¿†¿‘¿�¿¡¿¬¿±¿Ã¿Ë¿Ö¿Ö¿Ö¿Ö¿ê¿ú¿ÀÀ À4ÀEÀZÀgÀkÀyÀ�À�ÀµÀÎÀçÀéÀôÀüÀüÀÁ"Á3ÁJÁcÁqÁ|ÁˆÁ�Á’Á�Á¥Á¥Á¥Á¿ÁÍÁÛÁğÁÂÂ#ÂAÂHÂHÂXÂl††Š ¯ÂÊÂÕÂìÂôÂôÂÃÃ)ÃDÃMÃbÃ|ËØöÃÄÃÚÃóÃÄÄÄ3Ä3Ä?ÄWÄoÄxÄxÄxĄĕĭĶĶĽįÄÌÄØÄ>Å{ÌL»®ö®öÌö×öâö÷÷
÷÷"÷(÷9÷H÷W÷d÷d÷j÷o÷t÷‡÷š÷¥÷©÷»÷È÷Ğ÷Û÷×÷ò÷øøø ø&øø7ø.øAøCø_øKøgøuøuøwø“ø“øšø ø©ø°ø³øÕøéøÜøñø÷øùùùùùù ù ù+ù@ùIùIùIùIùeù|ù‚ù‡ù‡ùœù¢ù§ù§ù³ùĞùğùõùúùúùú#ú2úAúIúNúTúYúYú`úgúŠú§ú©úÆúÛúÛúáúáúîú÷ú÷úû$û/û4ûAûLûTû\ûlûƒûƒû“û“û¥û«ûÓûÜûÜûŞûåûêûêû÷ûüüüü$ü1üCüNü\üeüjü‘üšü¥üªü±ü¹üÌüáüæüíüúüıı(ı/ı5ı>ı>ıGıaıhımı{ı‹ı™ı™ıŸı¦ı¯ı¯ıÂıÔı×ı×ıèığıøış!ş(ş5ş7ş>şRşaşaşaşˆşˆşˆş•ş•şªşµşÇşÔşßşíşøşÿÿÿ(ÿ;ÿ=ÿLÿaÿcÿqÿ†ÿ†ÿŒÿ•ÿ•ÿ¢ÿ¨ÿºÿºÿÇÿÊÿÕÿçÿîÿùÿşÿ 24Ncccelrƒ‘££©°¹¾ßèèî÷÷#&,5=HZ`kkx{�Š’�¯µÀÀÍĞÖßá+1<NT\\\\gà|”�¾g3g3{33ˆ3‹3”3�3¯3¯3Ø3Ü3á3ä3í3ı34444 4'4/474>4N4N4Z4}Œ >VV*V1VaVMVmVrVyVyV™V¯V›V»VëV×V÷VüVWW WWW%W0WCW;W[WcW~À-ee.e>eHeHeReRe\ene{e~e€e‰e–e–e¤e¸e¸eÜeéeéeùeff)f6f6fLfof…f¨f±f¾f¾fáfëfëfgQgWgWgWgig¸ºä�Š�Š¨ŠªŠ¶ŠºŠÇŠÊŠäŠäŠäŠêŠîŠöŠ‹‹!‹#‹#‹,‹.‹.‹7‹9‹9‹B‹D‹D‹M‹M‹V‹\‹_‹i‹z‹€‹Œ‹Œ‹ô‹€œZ}.*.*L*]*€*‡* *˜*¸*Ø*Ä*ä*õ*ú*++3+[+b+{+s+“+³+Ÿ+¿+Ğ+æ+Ò+ş+ , ,#,#,-,�œX{Î-Î-Ú-ê-õ- .O.\.m..†.�.¡.¨.¶.Î.İ.ê.í./ //%/1/=/A/H/~/‚x¬h¬h¬~¬…¬Œ¬«¬º¬É¬Ø¬ç¬ö¬­­­ ­ ­.­3­N­h­h­~­�­”­¢­©­®­®­µ­Ç­Ğ­Ò­à­ò­ò­ò­®®!®,®9®>®N®S®c®o®t®�®†®–®›®«®­®½®¿®Ï®Ñ®â®ë®ë®í®ı®¯¯¯/¯A¯S¯e¯u¯u¯u¯x¯‹¯ƒ\åøø‹ø‹ŒŒ Œ-ŒBŒIŒSŒaŒdŒfŒpŒ‚Œ‚Œ‰Œ¿Œ„0ÎÖÎÎæ(ğî<D…`·Ë>—>—T—v—ƒ—�—œ—µ—¹—¿—Ò—ï—ñ—ñ—"˜˜ñ—A˜K˜†L4CF,F,T,f,l,t,†,Œ,•,§,­,°,ì,‡(–œ7373E3T3X3[3a3ˆ\DWî,î,ü,---.-4-=-O-U-^-p-v-y-Ç-‰, ÒÒÒ#Ò+Ò0Ò6ÒŠ¬!H
   - 4 : I T _ e q u u � Š � � ˜ š ° · ½ Å Ğ Û á ë î ò ò ú ¡¡¡¡¡¡!¡!¡,¡.¡L¡S¡^¡i¡l¡r¡w¡w¡‚¡†¡†¡’¡›¡�¡�¡©¡«¡Á¡È¡Ρİ¡è¡ó¡ù¡¢ ¢ ¢¢¢!¢!¢,¢.¢D¢K¢Q¢Y¢d¢o¢u¢¢‚¢†¢†¢�¢•¢˜¢š¢¥¢©¢²¢µ¢µ¢À¢¢à¢ç¢ò¢ı¢££ £ ££!£!£-£6£9£9£D£F£\£c£i£{£†£‘£—£œ£œ£§£¬£¬£·£¼£¼£Ç£Ê£ΣÕ£Ú£ߣä£ä£ø£ı£ı£
¤¤ ¤'¤+¤?¤F¤J¤J¤W¤c¤k¤q¤�¤…¤–¤¨¤³¤·¤·¤Ĥ̤Ô¤Ú¤Ú¤Ú¤Ú¤Ú¤ܤܤê¤ñ¤ş¤
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥1¥9¥E¥E¥f¥u¥�¥�¥›¥¨¥¨¥Ë¥Ø¥ã¥ì¥õ¥¦¦¦¦¦¦&¦D¦P¦P¦¨x¿ÙÏ3Ï3á3ã3ç3ğ3ü3444L4P4U4a4t4~4�4Œ4�4—4¡4lcz¶x¶xÌxÛxàxõxâxyyyy)yy8y>yWypy‰y¢y»yÅy„�ÎhÎhìhôhúhii
i iiii,i0i6i6iKiUiUi]ivi™iºi¿iàiåiñiüijjj(j.j3j9j;jAjDjJjOjRjZjcjsj–j¤j¼jÁjÅjêjıjkk(k-k1kVkfk‰kœk¡k§k¬k¯k±k·k½kÃkÈkÎkÖkÖkàkék÷klll=lMlplƒlˆl˜l»lÉlálælêlm"m"m=m=m=mKmcmemememsm‹m�m�m›m³m³mÅmÅmÎmÛmñmn+n3n>nQnUnUnUn\nbn|n„n�nªn¬n²nÌnÔnßnínønønoH…“h„h„„•„¥„¬„Äބğ„ô„7…L“¢ÖzÖzêz÷z {ùz{{7{P{[{f{n{4IRŞÕŞÕçÕçÕêÕøÕÖ ÖÖì=öö>öAö_övö‡ö‡ö¢ö¨ö­ö­öÈöÎöÓöÓöÜöêö÷ ÷$÷+÷1÷3÷P÷`÷e÷l÷r÷t÷t÷‡÷�÷�÷�÷�÷’÷®÷¾÷Ğ÷Õ÷Õ÷Õ÷Ü÷ã÷ê÷ÿ÷ø"ø"ø4øÌL»0¤0¤J¤U¤`¤i¤q¤t¤{¤¤ˆ¤›¤Ÿ¤¥¤³¤Ğ¤İ¤ì¤ñ¤ı¤¥ ¥¥¥¥'¥ ¥7¥@¥Q¥O¥G¥_¥h¥n¥n¥|¥¥“¥œ¥¥¥¬¥°¥µ¥Ì¥ä¥í¥û¥¦#¦#¦;¦L¦L¦S¦l¦x¦€¦“¦š¦®¦·¦¾¦Â¦Í¦Ò¦Ù¦ö¦#§*§.§0§;§G§K§`§b§s§}§ˆ§’§¡§°§É§É§Ì§Ô§Ù§[¨Xs…&L&LCLTLaLkL‚LŸLºLÀLÉL×LİLàLìLŒ ````p`”`”`¢`¢`¢`¢`«`«`²`Í`â`ê`ê`õ`õ`aaa!a'a'a?a?aEaka(kq‰‰‰*‰:‰A‰G‰ @O[¶è¶èÄèÌèÓèòèÿèÿèéé
é $/4FßFßSßhßmßsß!$).ßß#ß8ß=ßCß"$#(æŞæŞõŞ ßßß#€ğLWWaq‡�™´¹Éßçñ  ' 1 ; E O Y c m w � ‹ • Ÿ © ¿ É Ó İ ç ñ û  % / 9 O Y c m w � ‹ • Ÿ © ³ ½ Ç Ñ Û å ï ù ! !!!!+!5!?!I!S!]!g!q!{!‰!$¤Cp›p›†›�›¢›³›Å›Ç›Î›Ô›ä›ï›ù›œœœ œ2œ8œHœRœ\œcœnœƒœ‹œ‹œ¡œ¡œ¡œµœ%$5:vßv߄ߙß�ߤß&¤Di¸œ¸œÎœÕœêœûœ ����,�7�A�L�c�f�h�z���‘�›�¥�¬�·�Ë�Ó�Ó�é�é�é�ş�'(&,w/w/…/Œ/–/œ/¢/(0_gVKVKlKK�K”K—KŸK)  ßö"ö"# #&#3#:#V#\#\#\#i#k#v#€#‡#–#¡#§#±#»#Ì#Ì#×#á#á#ó#ù# $$$$$<$B$T$g$m$p$v$v$x$~$„$†$†$†$—$¡$¦$¦$»$Å$Å$Ù$â$è$î$% %%'%+%+%3%9%?%I%P%W%`%r%r%—%›%¡%§%¹%Ì%Ò%Ö%Ü%â%è%è%ê%î%ô%ú%&&&&&0&A&A&X&e&i&q&ƒ&£&£&©&¬&°&¶&¶&È&Ù&î&'
'' '0'4':'S'U'['h'j'v'”'š'¥'È'Ó'Ù'ß'å'î'ô'(( (#(4(8(>(W(Y(_(l(n(z(˜(�(¤(ª(³(¹(Ö(É(ğ(ù(ÿ(ÿ())) )*)?)D)D)D)a)c)€)‚)Ÿ)¥)­)±)¸)Û)á)ç)ó)
***"*'*'*.*2*<*J*L*T*Y*a*l*r*�*†*Œ*‘*™*�*­*È*Ø*å*ô*++.+.+5+J+O+X+e+j+p+u+u+|+€+Š+˜+š+¢+¦+ª+´+À+Ç+Ë+Ó+Û+ã+õ+,,,,,,?,?,M,S,X,\,a,a,a,a,g,i,i,Œ,’,˜,Ÿ,µ,·,·,·,Â,Â,Â,Ç,ğ-*4)r¶Ç¶ÇĞÇÔÇìÇôÇüÇÈ
ÈÈÈ+È3È8È;ÈFÈQÈYÈdÈoÈqȇÈ�ȕȠȫȭȸÈÃÈÅÈÑÈÚÈÚÈğÈûÈÉÉ"É3É9ÉBÉTÉZÉZÉbÉfÉqÉvɈɓɗɥɧɫɺɺɺÉËÉËÉĞÉâÉèÉVÊ+Ô@>ä>äTä[ä^ä‚ä‚äŸä²äÅäØäİäİäûä åå/å7å7å9å9å9åLåNåNåNåUåhå{å{å{å�å™å¬åÂåÇåËåÒåçåúåæææ)æ,LAP/$/$=$N$Z$u$z$š$œ$·$Ò$Ò$Ú$á$%-P~�˜‰˜‰¦‰³‰Á‰Ó‰Ş‰ì‰ù‰ŠŠ$Š2Š8Š>Š.4
—5—5¥5±5Â5Ô5İ5ç5í5/|ºU. . P W f q — —   ¢ ¢ © Ğ × × æ õ 


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

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

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

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

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

¡

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

ä 
H†H†Q†e†j†å¤£Èn{n{Š{�{¢{§{­{°{´{´{×{Ü{ |õ{|1||@|V|B|e|m|r|x|{||�|š|†|©|©|©|Ä|ó|ÿ|æ˜Íï /*>9HWWffuu„„““¢±ÀÀÏŞíVçxÇá¶`¶`Ô`æ`ì`ø`aa!a'a2aBaNaWa]acana|a‰a•a£a²a²aâaèd˜­ëë"ë5ë5ëOëVëbëbëyëyë�ë�ë§ë§ë¾ë¾ëÕë×ë×ëÛëéÌÂñFıFıhıoızı�ı�ı¢ı­ıÁıÅıÊıÎıĞıÖıèıôı ş ş$ş3ş7ş7ş7şJş_ş_şkşqş{ş†ş”ş›şªş¬şÅşßşßşñşêP7GtCtCŠC–C�C¢C³CÁCÇCÓCÛCæCìCïCùCë ®-�;�;¨;³;·;À;Ç;Î;ä;õ;<<*<9<H<Y<h<h<o<s<|<‰<�<™< <¤<Ä<Ä<Ä<Ä<Ä<Ğ<Ô<×<ß<í<õ<=
==#=.=3=3=@=F=U=l=n=y=†=•=˜=�=š=²=É=Ë=Ù=Û=æ=ì=ì=ô=ô=> >#>#>#>(>(>@>N>Y>^>^>a>f>f>…>“> >¢>¢>¦>¨>¨>Ç>Õ>á>ã>ã>æ>è>è>õ>÷>÷>ú>ú>ú>ú>ú>? ? ??9?F?T?[?#@ì(rxH‰H‰V‰]‰m‰p‰v‰í(nt‡&‡&�&š&«&¶&¶&Ô&îTzK®ñ®ñÌñÒñÕñŞñèñòòò ò"ò&ò(ò@òPò]òcògòmòoòròvòvò™ò�ò£ò£òªòÌòáòôòó óó ó)ó-ó0ó7ó=óAóGóXó^ócóhóuówó‰ó‹ó’óŸó¡ó³ó³ó³ó³ó³ó×óâóîóôôô&ôCôgô�ô†ô�ô¢ô°ôÇôÌôÒôãôøôşôõõ3õ:õFõ^õjõjõjõpõsõvõ�õ•õ©õ¯õ´õ¿õ¿õÄõÑõŞõŞõäõòõ ööööö%ö,ö,ö1ö>öKöKöQö_övö|öö‚ö‰ö‰öšö¡ö®ö»ö»öÂöÌöÓöÙöàöëöÿöÿö÷÷%÷-÷4÷D÷H÷Q÷i÷n÷u÷—÷¢÷¨÷°÷É÷İ÷İ÷ø÷ø÷ø ø'ø.øPøcø‡ø‰ø“øµøµøµøÎøÚøëøùùİùïÀ€¬ÆZÆZŞZâZçZöZ[ [.[[=[B[B[g[˜[{[n[»[À[é[î[ú[\ü[*\/\H\O\r\ˆ\ˆ\®\®\º\ğ ö-ö-..$.ñ4�˜6M6MOMrMM…M‹M�M¯Mò8 g.g.u.|.‡.�.–.œ.¢.¢.¨.ó ®.®.¸.À.Å.ôÒTîqîq rr'r=rZrir�r»rÁrÇrÏrÑrÙrîrñrürss;sJsnsœs¢s¨s°sµs½sÒsÕsàsìsñs÷sıst tt%t=tKtytt„tŒtœtÂtğtötûtût uu"u?uWucukuyuyu~u‘u¨uªuÇußuëuóuvvvv&v0vGv^vwv‰v–v¸vÏvævôvöv w$w$w-w9wOwhw{w†w™w�w�w�w¤w©w¼wÇwáwãwèwûwxxxx/xõ˜k ô8ô8
999,97999X9X9X9_9i9m9q9t9t9}9�9—9—9Í9Ù9ä9ô9: : ::::&:-:::A:I:N:N:c:o:w:|:|:‘:�:¦:«:«:À:Ì:Õ:İ:å:ñ:;;5;9;G;O;T;T;i;ƒ;�;™;¡;¦;¦;Å;Ñ;Ü;á;ö;<<<%<2<7<7<7<7<:<?<?<?<^<j<u<w<z<<<<‰<‘<˜< <©<´<º<È<Ö<Ö<à<é<ñ<&=,=3=B=X=]=]=p=x=x=z=z=z===†=Œ=�=—=›=›=›=›=ª=ª=Ï=Ø=Ø=Ü=÷Aö(üAüA
BB!B'B÷�ªÊ¾g¾gÜgägğghh)h4hChIhIhIhNhShahlh…h‡hŒhšh¥h²h¹hÇhø\0C.&.&H&m&O&|&˜&�&°&Å&²&Ô&í&ÿ&'' 'A'A'K'ù8hr¦K¦K¿KÎKâKñK÷KıKL!Lú0�—@Š@ŠTŠ`ŠnŠqŠ‰ŠŒŠ”Šû0S[ÖÖ"Ö*Ö7ÖAÖTÖüP>NÀ‡À‡Ì‡à‡ã‡÷‡ÿ‡ˆ ˆˆ ˆ"ˆ(ˆıT™ª¶M¶MĞMãMæMğMıMNN&N0NDNDNJNMN¡Nş<˜£˜Š˜Š¬Š³Š¿ŠËŠÛŠàŠãŠçŠïŠÿ +/ää,ä8äH!/nVnV‚V�V¤V�V³VµV¼VÇVÓVÛV DƒfQfQŠQ‘Q–Q�Q¸QÁQÃQĞQĞQÒQìQòQôQöQRRRRRR R'R0R8R?RERGRcRgRyRŒR’R¦R«R¸R¸RÌRÓRÚRãRñRúRS#S'S,S1S4S>SASQSD ®n®n¼nÆnĞnànånînúnünooo@oläû6â6âJâgâxâ†âŠâ‘â•â�â°â²â²âÉâËâ×âİâİâİâİâåâ´KtDD.D?DDDKDUDUD]DpDtDyD�D�D“D—D�D²D¶D¾DÊDÑDÕDİDßDçDõDıDÿDEE E'E5E9EGE !EFoFoVobono~o–oœoªo»oÃoÊoàop p-p:pJpPpRpcp…pŒp’p p¨p¾pÉpÏpÕpøpôB»hhhh$h/h>h@hKhZhZhghuhxhzhzhh„h�h˜h�h§hºh¿hÔhßhéhéhÿhÿh,i@iWi]ibiiioivi{i{i�i‡iŒiŒiŸi­iÅiËiĞiäiîiõiõij-j3j8j8jcjhjhj“jºj¿j¿j¿jÂjÉjÏjÖjÛjÛjájçjìjìjkkk@kFkVkbkhkvk}kk“k™k k k¢k¢k¢k§k­k²k¶k¸k»kÆkÕkØkÚkŞkŞkãkãkñkl˜}ŸŞ!Ş!ú!ÿ!"""!"1"9"A"F"Q"["a"l"|"„"”"›"£"«"³"»"À"Ë"Ù"Ù"ï" B†®8®8Æ8Í8à899 9.9"9W9W9c9k9z9´9¶9ã9ë9ë9 :8:%:Y:G:h:n:}:’:”:Ÿ:§:§:È:Í:Ö:â:ê:;õ:=;#;;L;i;T;‰;¡;�;Ã;°;ä;Ò;ó;<û;<<<E<E<Q< Ğ1È�È�Ü�Ü�‘‘"‘&‘+‘+‘+‘7‘<‘L‘Q‘Q‘Q‘V‘V‘o‘v‘…‘“‘œ‘¬‘µ‘·‘·‘·‘·‘¾‘ő̑ӑڑá‘è‘ï‘ï‘ñ‘ñ‘÷‘ü‘“
+1 -1
View File
@@ -17,7 +17,7 @@ public extern I64 PassTrace(I64 i=0b1001111101);
extern U0 StreamDir();
public extern I64 StreamExePrint(U8 *fmt,...);
public extern U0 StreamPrint(U8 *fmt,...);
public extern Bool Trace(Bool val);
public extern Bool Trace(Bool val=ON);
#help_index "Compiler/Lex"
#help_file "::/Doc/Lex"
+4 -3
View File
@@ -200,6 +200,7 @@ lgc_start2:
goto lgc_done;
}
break;
case DOCT_MARKER:
case DOCT_CURSOR:
doc_e=doc_e->next;
goto lgc_start2;
@@ -529,7 +530,7 @@ lex_ident:
} else {
cc->cur_i64=i;
cc->flags|=CCF_USE_LAST_U16;
cc->token=TK_INTEGER;
cc->token=TK_INT;
goto lex_end;
}
}
@@ -543,7 +544,7 @@ lex_ident:
else {
cc->cur_i64=i;
cc->flags|=CCF_USE_LAST_U16;
cc->token=TK_INTEGER;
cc->token=TK_INT;
goto lex_end;
}
}
@@ -556,7 +557,7 @@ lex_ident:
lex_is_int:
cc->cur_i64=i;
cc->flags|=CCF_USE_LAST_U16;
cc->token=TK_INTEGER;
cc->token=TK_INT;
goto lex_end;
}
ch=LexGetChar(cc);
+190 -340
View File
@@ -19,6 +19,8 @@ forms. Get an Intel datasheet and learn
which forms are valid.
{Lock|Rep}{Seg|2E=NotBr|3E=Br}{OP}{ADD}{REX}
':' is start of alias list. Marked with OCF_ALIAS.
*/
R8 AL 0;
@@ -498,126 +500,70 @@ OPCODE XOR
0x31,/R 32 RM32 R32
0x31,/R 32 ^ RM64 R64;
OPCODE CMOVA
0x0F 0x47,/R 16 R16 RM16
0x0F 0x47,/R 32 R32 RM32
0x0F 0x47,/R 32 R64 RM64;
OPCODE CMOVAE
0x0F 0x43,/R 16 R16 RM16
0x0F 0x43,/R 32 R32 RM32
0x0F 0x43,/R 32 R64 RM64;
OPCODE CMOVB
0x0F 0x42,/R 16 R16 RM16
0x0F 0x42,/R 32 R32 RM32
0x0F 0x42,/R 32 R64 RM64;
OPCODE CMOVBE
0x0F 0x46,/R 16 R16 RM16
0x0F 0x46,/R 32 R32 RM32
0x0F 0x46,/R 32 R64 RM64;
OPCODE CMOVC
0x0F 0x42,/R 16 R16 RM16
0x0F 0x42,/R 32 R32 RM32
0x0F 0x42,/R 32 R64 RM64;
OPCODE CMOVE
0x0F 0x44,/R 16 R16 RM16
0x0F 0x44,/R 32 R32 RM32
0x0F 0x44,/R 32 R64 RM64;
OPCODE CMOVG
0x0F 0x4F,/R 16 R16 RM16
0x0F 0x4F,/R 32 R32 RM32
0x0F 0x4F,/R 32 R64 RM64;
OPCODE CMOVGE
0x0F 0x4D,/R 16 R16 RM16
0x0F 0x4D,/R 32 R32 RM32
0x0F 0x4D,/R 32 R64 RM64;
OPCODE CMOVL
0x0F 0x4C,/R 16 R16 RM16
0x0F 0x4C,/R 32 R32 RM32
0x0F 0x4C,/R 32 R64 RM64;
OPCODE CMOVLE
0x0F 0x4E,/R 16 R16 RM16
0x0F 0x4E,/R 32 R32 RM32
0x0F 0x4E,/R 32 R64 RM64;
OPCODE CMOVNA
0x0F 0x46,/R 16 R16 RM16
0x0F 0x46,/R 32 R32 RM32
0x0F 0x46,/R 32 R64 RM64;
OPCODE CMOVNAE
0x0F 0x42,/R 16 R16 RM16
0x0F 0x42,/R 32 R32 RM32
0x0F 0x42,/R 32 R64 RM64;
OPCODE CMOVNB
0x0F 0x43,/R 16 R16 RM16
0x0F 0x43,/R 32 R32 RM32
0x0F 0x43,/R 32 R64 RM64;
OPCODE CMOVNBE
0x0F 0x47,/R 16 R16 RM16
0x0F 0x47,/R 32 R32 RM32
0x0F 0x47,/R 32 R64 RM64;
OPCODE CMOVNC
0x0F 0x43,/R 16 R16 RM16
0x0F 0x43,/R 32 R32 RM32
0x0F 0x43,/R 32 R64 RM64;
OPCODE CMOVNE
0x0F 0x45,/R 16 R16 RM16
0x0F 0x45,/R 32 R32 RM32
0x0F 0x45,/R 32 R64 RM64;
OPCODE CMOVNG
0x0F 0x4E,/R 16 R16 RM16
0x0F 0x4E,/R 32 R32 RM32
0x0F 0x4E,/R 32 R64 RM64;
OPCODE CMOVNGE
0x0F 0x4C,/R 16 R16 RM16
0x0F 0x4C,/R 32 R32 RM32
0x0F 0x4C,/R 32 R64 RM64;
OPCODE CMOVNL
0x0F 0x4D,/R 16 R16 RM16
0x0F 0x4D,/R 32 R32 RM32
0x0F 0x4D,/R 32 R64 RM64;
OPCODE CMOVNLE
0x0F 0x4F,/R 16 R16 RM16
0x0F 0x4F,/R 32 R32 RM32
0x0F 0x4F,/R 32 R64 RM64;
OPCODE CMOVNO
0x0F 0x41,/R 16 R16 RM16
0x0F 0x41,/R 32 R32 RM32
0x0F 0x41,/R 32 R64 RM64;
OPCODE CMOVNP
0x0F 0x4B,/R 16 R16 RM16
0x0F 0x4B,/R 32 R32 RM32
0x0F 0x4B,/R 32 R64 RM64;
OPCODE CMOVNS
0x0F 0x49,/R 16 R16 RM16
0x0F 0x49,/R 32 R32 RM32
0x0F 0x49,/R 32 R64 RM64;
OPCODE CMOVNZ
0x0F 0x45,/R 16 R16 RM16
0x0F 0x45,/R 32 R32 RM32
0x0F 0x45,/R 32 R64 RM64;
OPCODE CMOVO
0x0F 0x40,/R 16 R16 RM16
0x0F 0x40,/R 32 R32 RM32
0x0F 0x40,/R 32 R64 RM64;
OPCODE CMOVP
0x0F 0x4A,/R 16 R16 RM16
0x0F 0x4A,/R 32 R32 RM32
0x0F 0x4A,/R 32 R64 RM64;
OPCODE CMOVPE
0x0F 0x4A,/R 16 R16 RM16
0x0F 0x4A,/R 32 R32 RM32
0x0F 0x4A,/R 32 R64 RM64;
OPCODE CMOVPO
0x0F 0x4B,/R 16 R16 RM16
0x0F 0x4B,/R 32 R32 RM32
0x0F 0x4B,/R 32 R64 RM64;
OPCODE CMOVNO
0x0F 0x41,/R 16 R16 RM16
0x0F 0x41,/R 32 R32 RM32
0x0F 0x41,/R 32 R64 RM64;
OPCODE CMOVB
0x0F 0x42,/R 16 R16 RM16
0x0F 0x42,/R 32 R32 RM32
0x0F 0x42,/R 32 R64 RM64 :CMOVC CMOVNAE;
OPCODE CMOVAE
0x0F 0x43,/R 16 R16 RM16
0x0F 0x43,/R 32 R32 RM32
0x0F 0x43,/R 32 R64 RM64 :CMOVNB CMOVNC;
OPCODE CMOVE
0x0F 0x44,/R 16 R16 RM16
0x0F 0x44,/R 32 R32 RM32
0x0F 0x44,/R 32 R64 RM64 :CMOVZ;
OPCODE CMOVNE
0x0F 0x45,/R 16 R16 RM16
0x0F 0x45,/R 32 R32 RM32
0x0F 0x45,/R 32 R64 RM64 :CMOVNZ;
OPCODE CMOVBE
0x0F 0x46,/R 16 R16 RM16
0x0F 0x46,/R 32 R32 RM32
0x0F 0x46,/R 32 R64 RM64 :CMOVNA;
OPCODE CMOVA
0x0F 0x47,/R 16 R16 RM16
0x0F 0x47,/R 32 R32 RM32
0x0F 0x47,/R 32 R64 RM64 :CMOVNBE;
OPCODE CMOVS
0x0F 0x48,/R 16 R16 RM16
0x0F 0x48,/R 32 R32 RM32
0x0F 0x48,/R 32 R64 RM64;
OPCODE CMOVZ
0x0F 0x44,/R 16 R16 RM16
0x0F 0x44,/R 32 R32 RM32
0x0F 0x44,/R 32 R64 RM64;
OPCODE CMOVNS
0x0F 0x49,/R 16 R16 RM16
0x0F 0x49,/R 32 R32 RM32
0x0F 0x49,/R 32 R64 RM64;
OPCODE CMOVP
0x0F 0x4A,/R 16 R16 RM16
0x0F 0x4A,/R 32 R32 RM32
0x0F 0x4A,/R 32 R64 RM64 :CMOVPE;
OPCODE CMOVNP
0x0F 0x4B,/R 16 R16 RM16
0x0F 0x4B,/R 32 R32 RM32
0x0F 0x4B,/R 32 R64 RM64 :CMOVPO;
OPCODE CMOVL
0x0F 0x4C,/R 16 R16 RM16
0x0F 0x4C,/R 32 R32 RM32
0x0F 0x4C,/R 32 R64 RM64 :CMOVNGE;
OPCODE CMOVGE
0x0F 0x4D,/R 16 R16 RM16
0x0F 0x4D,/R 32 R32 RM32
0x0F 0x4D,/R 32 R64 RM64 :CMOVNL;
OPCODE CMOVLE
0x0F 0x4E,/R 16 R16 RM16
0x0F 0x4E,/R 32 R32 RM32
0x0F 0x4E,/R 32 R64 RM64 :CMOVNG;
OPCODE CMOVG
0x0F 0x4F,/R 16 R16 RM16
0x0F 0x4F,/R 32 R32 RM32
0x0F 0x4F,/R 32 R64 RM64 :CMOVNLE;
OPCODE CALL
0xE8, 16 !&CW REL16
@@ -639,132 +585,74 @@ OPCODE JMP
0xFF,/4 16 ! RM16
0xFF,/4 32 ! RM32
0xFF,/4 32 ! RM64;
OPCODE JA
0x77, &CB REL8
0x0F 0x87, 16 !CW REL16
0x0F 0x87, 32 !CD REL32;
OPCODE JAE
0x73, &CB REL8
0x0F 0x83, 16 !CW REL16
0x0F 0x83, 32 !CD REL32;
OPCODE JB
0x72, &CB REL8
0x0F 0x82, 16 !CW REL16
0x0F 0x82, 32 !CD REL32;
OPCODE JBE
0x76, &CB REL8
0x0F 0x86, 16 !CW REL16
0x0F 0x86, 32 !CD REL32;
OPCODE JC
0x72, &CB REL8
0x0F 0x82, 16 !CW REL16
0x0F 0x82, 32 !CD REL32;
OPCODE JCXZ
0xE3, CB REL8;
OPCODE JECXZ
0xE3, CB REL8;
OPCODE JRCXZ
0xE3, CB REL8;
OPCODE JE
0x74, &CB REL8
0x0F 0x84, 16 !CW REL16
0x0F 0x84, 32 !CD REL32;
OPCODE JG
0x7F, &CB REL8
0x0F 0x8F, 16 !CW REL16
0x0F 0x8F, 32 !CD REL32;
OPCODE JGE
0x7D, &CB REL8
0x0F 0x8D, 16 !CW REL16
0x0F 0x8D, 32 !CD REL32;
OPCODE JL
0x7C, &CB REL8
0x0F 0x8C, 16 !CW REL16
0x0F 0x8C, 32 !CD REL32;
OPCODE JLE
0x7E, &CB REL8
0x0F 0x8E, 16 !CW REL16
0x0F 0x8E, 32 !CD REL32;
OPCODE JNA
0x76, &CB REL8
0x0F 0x86, 16 !CW REL16
0x0F 0x86, 32 !CD REL32;
OPCODE JNAE
0x72, &CB REL8
0x0F 0x82, 16 !CW REL16
0x0F 0x82, 32 !CD REL32;
OPCODE JNB
0x73, &CB REL8
0x0F 0x83, 16 !CW REL16
0x0F 0x83, 32 !CD REL32;
OPCODE JNBE
0x77, &CB REL8
0x0F 0x87, 16 !CW REL16
0x0F 0x87, 32 !CD REL32;
OPCODE JNC
0x73, &CB REL8
0x0F 0x83, 16 !CW REL16
0x0F 0x83, 32 !CD REL32;
OPCODE JNE
0x75, &CB REL8
0x0F 0x85, 16 !CW REL16
0x0F 0x85, 32 !CD REL32;
OPCODE JNG
0x7E, &CB REL8
0x0F 0x8E, 16 !CW REL16
0x0F 0x8E, 32 !CD REL32;
OPCODE JNGE
0x7C, &CB REL8
0x0F 0x8C, 16 !CW REL16
0x0F 0x8C, 32 !CD REL32;
OPCODE JNL
0x7D, &CB REL8
0x0F 0x8D, 16 !CW REL16
0x0F 0x8D, 32 !CD REL32;
OPCODE JNLE
0x7F, &CB REL8
0x0F 0x8F, 16 !CW REL16
0x0F 0x8F, 32 !CD REL32;
OPCODE JNO
0x71, &CB REL8
0x0F 0x81, 16 !CW REL16
0x0F 0x81, 32 !CD REL32;
OPCODE JNP
0x7B, &CB REL8
0x0F 0x8B, 16 !CW REL16
0x0F 0x8B, 32 !CD REL32;
OPCODE JNS
0x79, &CB REL8
0x0F 0x89, 16 !CW REL16
0x0F 0x89, 32 !CD REL32;
OPCODE JNZ
0x75, &CB REL8
0x0F 0x85, 16 !CW REL16
0x0F 0x85, 32 !CD REL32;
OPCODE JO
0x70, &CB REL8
0x0F 0x80, 16 !CW REL16
0x0F 0x80, 32 !CD REL32;
OPCODE JP
0x7A, &CB REL8
0x0F 0x8A, 16 !CW REL16
0x0F 0x8A, 32 !CD REL32;
OPCODE JPE
0x7A, &CB REL8
0x0F 0x8A, 16 !CW REL16
0x0F 0x8A, 32 !CD REL32;
OPCODE JPO
0x7B, &CB REL8
0x0F 0x8B, 16 !CW REL16
0x0F 0x8B, 32 !CD REL32;
OPCODE JNO
0x71, &CB REL8
0x0F 0x81, 16 !CW REL16
0x0F 0x81, 32 !CD REL32;
OPCODE JB
0x72, &CB REL8
0x0F 0x82, 16 !CW REL16
0x0F 0x82, 32 !CD REL32 :JC JNAE;
OPCODE JAE
0x73, &CB REL8
0x0F 0x83, 16 !CW REL16
0x0F 0x83, 32 !CD REL32 :JNB JNC;
OPCODE JE
0x74, &CB REL8
0x0F 0x84, 16 !CW REL16
0x0F 0x84, 32 !CD REL32 :JZ;
OPCODE JNE
0x75, &CB REL8
0x0F 0x85, 16 !CW REL16
0x0F 0x85, 32 !CD REL32 :JNZ;
OPCODE JBE
0x76, &CB REL8
0x0F 0x86, 16 !CW REL16
0x0F 0x86, 32 !CD REL32 :JNA;
OPCODE JA
0x77, &CB REL8
0x0F 0x87, 16 !CW REL16
0x0F 0x87, 32 !CD REL32 :JNBE;
OPCODE JS
0x78, &CB REL8
0x0F 0x88, 16 !CW REL16
0x0F 0x88, 32 !CD REL32;
OPCODE JZ
0x74, &CB REL8
0x0F 0x84, 16 !CW REL16
0x0F 0x84, 32 !CD REL32;
OPCODE JNS
0x79, &CB REL8
0x0F 0x89, 16 !CW REL16
0x0F 0x89, 32 !CD REL32;
OPCODE JP
0x7A, &CB REL8
0x0F 0x8A, 16 !CW REL16
0x0F 0x8A, 32 !CD REL32 :JPE;
OPCODE JNP
0x7B, &CB REL8
0x0F 0x8B, 16 !CW REL16
0x0F 0x8B, 32 !CD REL32 :JPO;
OPCODE JL
0x7C, &CB REL8
0x0F 0x8C, 16 !CW REL16
0x0F 0x8C, 32 !CD REL32 :JNGE;
OPCODE JGE
0x7D, &CB REL8
0x0F 0x8D, 16 !CW REL16
0x0F 0x8D, 32 !CD REL32 :JNL;
OPCODE JLE
0x7E, &CB REL8
0x0F 0x8E, 16 !CW REL16
0x0F 0x8E, 32 !CD REL32 :JNG;
OPCODE JG
0x7F, &CB REL8
0x0F 0x8F, 16 !CW REL16
0x0F 0x8F, 32 !CD REL32 :JNLE;
OPCODE JCXZ
0xE3, CB REL8 :JECXZ JRCXZ;
OPCODE INC
0x40,+R 16 % R16
@@ -979,10 +867,8 @@ OPCODE LODSW 0xAD, 16;
OPCODE LODSD 0xAD, 32;
OPCODE LODSQ 0xAD, 32=;
OPCODE LOOP 0xE2, CB REL8;
OPCODE LOOPE 0xE1, CB REL8;
OPCODE LOOPZ 0xE1, CB REL8;
OPCODE LOOPNE 0xE0, CB REL8;
OPCODE LOOPNZ 0xE0, CB REL8;
OPCODE LOOPE 0xE1, CB REL8 :LOOPZ;
OPCODE LOOPNE 0xE0, CB REL8 :LOOPNZ;
OPCODE LSL
0x0F 0x03,/R 16 R16 RM16
0x0F 0x03,/R 32 R32 RM32
@@ -1072,36 +958,22 @@ OPCODE SEGDS 0x3E;
OPCODE SEGES 0x26;
OPCODE SEGFS 0x64;
OPCODE SEGGS 0x65;
OPCODE SETA 0x0F 0x97, RM8;
OPCODE SETAE 0x0F 0x93, RM8;
OPCODE SETB 0x0F 0x92, RM8;
OPCODE SETBE 0x0F 0x96, RM8;
OPCODE SETC 0x0F 0x92, RM8;
OPCODE SETE 0x0F 0x94, RM8;
OPCODE SETG 0x0F 0x9F, RM8;
OPCODE SETGE 0x0F 0x9D, RM8;
OPCODE SETL 0x0F 0x9C, RM8;
OPCODE SETLE 0x0F 0x9E, RM8;
OPCODE SETNA 0x0F 0x96, RM8;
OPCODE SETNAE 0x0F 0x92, RM8;
OPCODE SETNB 0x0F 0x93, RM8;
OPCODE SETNBE 0x0F 0x97, RM8;
OPCODE SETNC 0x0F 0x93, RM8;
OPCODE SETNE 0x0F 0x95, RM8;
OPCODE SETNG 0x0F 0x9E, RM8;
OPCODE SETNGE 0x0F 0x9C, RM8;
OPCODE SETNL 0x0F 0x9D, RM8;
OPCODE SETNLE 0x0F 0x9F, RM8;
OPCODE SETNO 0x0F 0x91, RM8;
OPCODE SETNP 0x0F 0x9B, RM8;
OPCODE SETNS 0x0F 0x99, RM8;
OPCODE SETNZ 0x0F 0x95, RM8;
OPCODE SETO 0x0F 0x90, RM8;
OPCODE SETP 0x0F 0x9A, RM8;
OPCODE SETPE 0x0F 0x9A, RM8;
OPCODE SETPO 0x0F 0x9B, RM8;
OPCODE SETNO 0x0F 0x91, RM8;
OPCODE SETB 0x0F 0x92, RM8 :SETC SETNAE;
OPCODE SETAE 0x0F 0x93, RM8 :SETNC SETNB;
OPCODE SETE 0x0F 0x94, RM8 :SETZ;
OPCODE SETNE 0x0F 0x95, RM8 :SETNZ;
OPCODE SETBE 0x0F 0x96, RM8 :SETNA;
OPCODE SETA 0x0F 0x97, RM8 :SETNBE;
OPCODE SETS 0x0F 0x98, RM8;
OPCODE SETZ 0x0F 0x94, RM8;
OPCODE SETNS 0x0F 0x99, RM8;
OPCODE SETP 0x0F 0x9A, RM8 :SETPE;
OPCODE SETNP 0x0F 0x9B, RM8 :SETPO;
OPCODE SETL 0x0F 0x9C, RM8 :SETNGE;
OPCODE SETGE 0x0F 0x9D, RM8 :SETNL;
OPCODE SETLE 0x0F 0x9E, RM8 :SETNG;
OPCODE SETG 0x0F 0x9F, RM8 :SETNLE;
OPCODE SHLD
0x0F 0xA5,/R 16 RM16 R16
0x0F 0xA5,/R 32 RM32 R32
@@ -1138,42 +1010,6 @@ OPCODE XADD
0x0F 0xC1,/R 32 RM64 R64;
OPCODE XLATB 0xD7;
OPCODE RCL
0xD2,/2 RM8 CL
0xD3,/2 16 RM16 CL
0xD3,/2 32 RM32 CL
0xD3,/2 32 RM64 CL
0xC0,/2 IB &RM8 UIMM8
0xC0,/2 IB RM8 IMM8
0xC1,/2 16 IB &RM16 UIMM8
0xC1,/2 16 IB RM16 IMM8
0xC1,/2 32 IB &RM32 UIMM8
0xC1,/2 32 IB RM32 IMM8
0xC1,/2 32 IB &RM64 UIMM8
0xC1,/2 32 IB RM64 IMM8;
OPCODE RCL1
0xD0,/2 RM8
0xD1,/2 16 RM16
0xD1,/2 32 RM32
0xD1,/2 32 RM64;
OPCODE RCR
0xD2,/3 RM8 CL
0xD3,/3 16 RM16 CL
0xD3,/3 32 RM32 CL
0xD3,/3 32 RM64 CL
0xC0,/3 IB &RM8 UIMM8
0xC0,/3 IB RM8 IMM8
0xC1,/3 16 IB &RM16 UIMM8
0xC1,/3 16 IB RM16 IMM8
0xC1,/3 32 IB &RM32 UIMM8
0xC1,/3 32 IB RM32 IMM8
0xC1,/3 32 IB &RM64 UIMM8
0xC1,/3 32 IB RM64 IMM8;
OPCODE RCR1
0xD0,/3 RM8
0xD1,/3 16 RM16
0xD1,/3 32 RM32
0xD1,/3 32 RM64;
OPCODE ROL
0xD2,/0 RM8 CL
0xD3,/0 16 RM16 CL
@@ -1210,45 +1046,42 @@ OPCODE ROR1
0xD1,/1 16 RM16
0xD1,/1 32 RM32
0xD1,/1 32 RM64;
OPCODE SAL
0xD2,/4 RM8 CL
0xD3,/4 16 RM16 CL
0xD3,/4 32 RM32 CL
0xD3,/4 32 RM64 CL
0xC0,/4 IB &RM8 UIMM8
0xC0,/4 IB RM8 IMM8
0xC1,/4 16 IB &RM16 UIMM8
0xC1,/4 16 IB RM16 IMM8
0xC1,/4 32 IB &RM32 UIMM8
0xC1,/4 32 IB RM32 IMM8
0xC1,/4 32 IB &RM64 UIMM8
0xC1,/4 32 IB RM64 IMM8;
OPCODE SAL1
0xD0,/4 RM8
0xD1,/4 16 RM16
0xD1,/4 32 RM32
0xD1,/4 32 RM64;
OPCODE SAR
0xD2,/7 RM8 CL
0xD3,/7 16 RM16 CL
0xD3,/7 32 RM32 CL
0xD3,/7 32 RM64 CL
0xC0,/7 IB &RM8 UIMM8
0xC0,/7 IB RM8 IMM8
0xC1,/7 16 IB &RM16 UIMM8
0xC1,/7 16 IB RM16 IMM8
0xC1,/7 32 IB &RM32 UIMM8
0xC1,/7 32 IB RM32 IMM8
0xC1,/7 32 IB &RM64 UIMM8
0xC1,/7 32 IB RM64 IMM8;
OPCODE SAR1
0xD0,/7 RM8
0xD1,/7 16 RM16
0xD1,/7 32 RM32
0xD1,/7 32 RM64;
OPCODE RCL
0xD2,/2 RM8 CL
0xD3,/2 16 RM16 CL
0xD3,/2 32 RM32 CL
0xD3,/2 32 RM64 CL
0xC0,/2 IB &RM8 UIMM8
0xC0,/2 IB RM8 IMM8
0xC1,/2 16 IB &RM16 UIMM8
0xC1,/2 16 IB RM16 IMM8
0xC1,/2 32 IB &RM32 UIMM8
0xC1,/2 32 IB RM32 IMM8
0xC1,/2 32 IB &RM64 UIMM8
0xC1,/2 32 IB RM64 IMM8;
OPCODE RCL1
0xD0,/2 RM8
0xD1,/2 16 RM16
0xD1,/2 32 RM32
0xD1,/2 32 RM64;
OPCODE RCR
0xD2,/3 RM8 CL
0xD3,/3 16 RM16 CL
0xD3,/3 32 RM32 CL
0xD3,/3 32 RM64 CL
0xC0,/3 IB &RM8 UIMM8
0xC0,/3 IB RM8 IMM8
0xC1,/3 16 IB &RM16 UIMM8
0xC1,/3 16 IB RM16 IMM8
0xC1,/3 32 IB &RM32 UIMM8
0xC1,/3 32 IB RM32 IMM8
0xC1,/3 32 IB &RM64 UIMM8
0xC1,/3 32 IB RM64 IMM8;
OPCODE RCR1
0xD0,/3 RM8
0xD1,/3 16 RM16
0xD1,/3 32 RM32
0xD1,/3 32 RM64;
OPCODE SHL
0xD2,/4 RM8 CL
0xD3,/4 16 RM16 CL
@@ -1261,13 +1094,12 @@ OPCODE SHL
0xC1,/4 32 IB &RM32 UIMM8
0xC1,/4 32 IB RM32 IMM8
0xC1,/4 32 IB &RM64 UIMM8
0xC1,/4 32 IB RM64 IMM8;
0xC1,/4 32 IB RM64 IMM8 :SAL;
OPCODE SHL1
0xD0,/4 RM8
0xD1,/4 16 RM16
0xD1,/4 32 RM32
0xD1,/4 32 RM64;
0xD1,/4 32 RM64 :SAL1;
OPCODE SHR
0xD2,/5 RM8 CL
0xD3,/5 16 RM16 CL
@@ -1286,6 +1118,24 @@ OPCODE SHR1
0xD1,/5 16 RM16
0xD1,/5 32 RM32
0xD1,/5 32 RM64;
OPCODE SAR
0xD2,/7 RM8 CL
0xD3,/7 16 RM16 CL
0xD3,/7 32 RM32 CL
0xD3,/7 32 RM64 CL
0xC0,/7 IB &RM8 UIMM8
0xC0,/7 IB RM8 IMM8
0xC1,/7 16 IB &RM16 UIMM8
0xC1,/7 16 IB RM16 IMM8
0xC1,/7 32 IB &RM32 UIMM8
0xC1,/7 32 IB RM32 IMM8
0xC1,/7 32 IB &RM64 UIMM8
0xC1,/7 32 IB RM64 IMM8;
OPCODE SAR1
0xD0,/7 RM8
0xD1,/7 16 RM16
0xD1,/7 32 RM32
0xD1,/7 32 RM64;
OPCODE FILD
0xDF,/0 M16 //Load I16
+9 -10
View File
@@ -18,16 +18,16 @@ U0 OptSetNOP1(CIntermediateCode *tempi)
{
tempi->ic_code=IC_NOP1;
tempi->ic_flags=0;
tempi->a1.type=TY_NULL+tempi->a1.type&RT_MASK;
tempi->r.type =TY_NULL+tempi->r.type &RT_MASK;
tempi->a1.type=MDF_NULL+tempi->a1.type.raw_type;
tempi->r.type =MDF_NULL+tempi->r.type.raw_type;
}
U0 OptSetNOP2(CIntermediateCode *tempi,I64 stk_delta=1)
{
tempi->ic_code=IC_NOP2;
tempi->ic_data=stk_delta;
tempi->a1.type=TY_NULL+tempi->a1.type&RT_MASK;
tempi->r.type =TY_NULL+tempi->r.type &RT_MASK;
tempi->a1.type=MDF_NULL+tempi->a1.type.raw_type;
tempi->r.type =MDF_NULL+tempi->r.type.raw_type;
}
CIntermediateCode *OptFree(CIntermediateCode *tempi)
@@ -168,7 +168,7 @@ fb_here2:
return FBO1_NOT_CONST;
}
}
*is_unsigned=tempc1->raw_type&1 || tempc2->raw_type&1;
*is_unsigned=tempc1->raw_type&RTF_UNSIGNED || tempc2->raw_type&RTF_UNSIGNED;
if (tempi1->ic_code==IC_IMM_I64 && tempi2->ic_code==IC_IMM_I64 &&
!(tempi->ic_flags&(ICF_PUSH_CMP|ICF_POP_CMP))) {
tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags;
@@ -193,8 +193,7 @@ Bool OptFixupBinaryOp2(CIntermediateCode **tempi1,CIntermediateCode **tempi2)
return FALSE;
}
Bool OptFixupUnaryOp(CIntermediateCode *tempi,
CIntermediateCode *tempi1,
Bool OptFixupUnaryOp(CIntermediateCode *tempi, CIntermediateCode *tempi1,
Bool *is_unsigned)
{
CHashClass *tempc,*tempc1;
@@ -217,7 +216,7 @@ Bool OptFixupUnaryOp(CIntermediateCode *tempi,
} else
return FBO1_NOT_CONST;
}
*is_unsigned=tempc1->raw_type&1;
*is_unsigned=tempc1->raw_type&RTF_UNSIGNED;
if (tempi1->ic_code==IC_IMM_I64) {
tempi->ic_flags|=tempi1->ic_flags;
OptSetNOP1(tempi1);
@@ -305,7 +304,7 @@ CIntermediateCode *OptBrZero(CCmpCtrl *cc,CIntermediateCode *tempi)
!(tempi->ic_flags&ICF_USE_F64)) {
tempi->ic_code+=IC_BR_EQU_EQU2-IC_BR_EQU_EQU;
tempi->ic_flags&=~ICF_PUSH_CMP;
tempii=tempi->next; //IC_PUSH_CMP instruction
tempii=tempi->next; //IC_PUSH_CMP inst
while (tempii->ic_code!=IC_PUSH_CMP)
tempii=tempii->next;
tempii->t.a1t=tempi;
@@ -432,7 +431,7 @@ CIntermediateCode *OptBrNotZero(CCmpCtrl *cc,CIntermediateCode *tempi)
!(tempi->ic_flags&ICF_USE_F64)) {
tempi->ic_code+=IC_BR_EQU_EQU2-IC_BR_EQU_EQU;
tempi->ic_flags&=~ICF_PUSH_CMP;
tempii=tempi->next; //IC_PUSH_CMP instruction
tempii=tempi->next; //IC_PUSH_CMP inst
while (tempii->ic_code!=IC_PUSH_CMP)
tempii=tempii->next;
tempii->t.a1t=tempi;
+7 -13
View File
@@ -186,7 +186,7 @@ args.
tempi->ic_code=IC_IMM_F64;
}
}
if (tempc1->type&HTT_INTERNAL_TYPE && tempc1->raw_type& 1)
if (tempc1->type&HTT_INTERNAL_TYPE && tempc1->raw_type&RTF_UNSIGNED)
tempi->ic_class=cmp.internal_types[tempc1->raw_type-1];
break;
case IC_SHL_CONST:
@@ -449,7 +449,7 @@ args.
} else if (cc->pass==2 && tempi2->ic_code==IC_IMM_I64 &&
(i=tempi2->ic_data) && Bsf(i)==Bsr(i) &&
tempi_push->ic_class->raw_type!=RT_F64 &&
tempi_push->ic_class->raw_type&1) {//do only unsigned
tempi_push->ic_class->raw_type&RTF_UNSIGNED) {//do only unsigned
tempi2->ic_data=i-1;
tempi->ic_code=IC_AND;
}
@@ -665,8 +665,7 @@ args.
OptSetNOP1(tempi2);
OptSetNOP1(tempi);
} else
if (tempi1->ic_code==IC_ADD ||
tempi1->ic_code==IC_SUB) {
if (tempi1->ic_code==IC_ADD || tempi1->ic_code==IC_SUB) {
if (tempi1->t.a1t->ic_code==IC_IMM_F64) {
tempi1->ic_flags|=tempi->ic_flags|tempi2->ic_flags;
tempi1->t.a1t->ic_data(F64)-=tempi2->ic_data(F64);
@@ -826,8 +825,7 @@ args.
LexWarn(cc,"Assign U0 ");
sub_switch_start:
case IC_MUL_EQU:
if (tempi2->ic_code==IC_IMM_I64 &&
tempc->raw_type!=RT_F64 &&
if (tempi2->ic_code==IC_IMM_I64 && tempc->raw_type!=RT_F64 &&
tempc2->raw_type!=RT_F64) {
if (i=tempi2->ic_data) {
if (Bsf(i)==Bsr(i)) {
@@ -838,8 +836,7 @@ args.
}
break;
case IC_DIV_EQU:
if (tempi2->ic_code==IC_IMM_I64 &&
tempc->raw_type!=RT_F64 &&
if (tempi2->ic_code==IC_IMM_I64 && tempc->raw_type!=RT_F64 &&
tempc2->raw_type!=RT_F64 &&
(i=tempi2->ic_data) && Bsf(i)==Bsr(i)) {
tempi2->ic_data=Bsf(i);
@@ -847,8 +844,7 @@ args.
}
break;
case IC_MOD_EQU:
if (tempi2->ic_code==IC_IMM_I64 &&
tempc->raw_type!=RT_F64 &&
if (tempi2->ic_code==IC_IMM_I64 && tempc->raw_type!=RT_F64 &&
tempc2->raw_type!=RT_F64 &&
(i=tempi2->ic_data) && Bsf(i)==Bsr(i)) {
tempi2->ic_data=i-1;
@@ -1286,9 +1282,7 @@ args.
"Pass:%d Stk:%08X\n",cc->pass,ps->ptr;
LexExcept(cc,"Compiler Optimization Error at ");
}
/*This is for determining type conversions
for passing args to funs.
*/
//This is for determining type conversions for passing args to funs.
return last_with_class;
}
+25 -31
View File
@@ -40,12 +40,10 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
mv[member_cnt].offset_start=tempm->offset;
mv[member_cnt].offset_end=tempm->offset+MaxI64(1,tempm->size);
mv[member_cnt++].m=tempm;
} else {
if (tempm->reg==REG_ALLOC)
} else if (tempm->reg==REG_ALLOC)
PrintWarn("Can't reg var\n $$LK,\"FL:%s,%d\"$$ '%s' in '%s'\n",
cc->lex_include_stk->full_name,
cc->lex_include_stk->line_num,tempm->str,cc->htc.fun->str);
}
tempm=tempm->next;
}
} else
@@ -75,7 +73,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempc2=cmp.internal_types[RT_I64];
else
tempc2=tempi->t.a2c;
tempi->a2.type=TY_STK+CmpRawType(tempc2);
tempi->a2.type=MDF_STK+CmpRawType(tempc2);
tempi->a2.type_pointed_to=CmpRawTypePointed(tempc2);
tempi->ic_flags|=ICF_A2_WAS_STK;
case IS_1_ARG:
@@ -86,7 +84,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempc1=cmp.internal_types[RT_I64];
else
tempc1=tempi->t.a1c;
tempi->a1.type=TY_STK+CmpRawType(tempc1);
tempi->a1.type=MDF_STK+CmpRawType(tempc1);
tempi->a1.type_pointed_to=CmpRawTypePointed(tempc1);
tempi->ic_flags|=ICF_A1_WAS_STK;
break;
@@ -94,7 +92,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
break;
}
if (intermediate_code_table[code].result_cnt) {
tempi->r.type=TY_STK+CmpRawType(tempc);
tempi->r.type=MDF_STK+CmpRawType(tempc);
tempi->r.type_pointed_to=CmpRawTypePointed(tempc);
tempi->ic_flags|=ICF_R_WAS_STK;
PrsPush(ps,tempi);
@@ -121,12 +119,12 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempi->a1.reg=REG_RBP;
break;
case IC_DEREF:
tempi->a1.type_pointed_to=tempi->r.type&RT_MASK;
tempi->a1.type_pointed_to=tempi->r.type.raw_type;
if (tempi1->ic_code==IC_LEA) {
tempi->ic_flags|=tempi1->ic_flags;
tempi->a1.reg=tempi1->a1.reg;
tempi->a1.disp=tempi1->a1.disp;
tempi->a1.type=TY_DISP+tempi->r.type&RT_MASK;
tempi->a1.type=MDF_DISP+tempi->r.type.raw_type;
tempi->a1.type_pointed_to=tempi->r.type_pointed_to;
tempi->ic_code=IC_MOV;
OptFree(tempi1);
@@ -142,7 +140,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempi->ic_flags|=tempil2->ic_flags|tempil1->ic_flags;
tempi->a1.reg=tempil2->a1.reg;
tempi->a1.disp=tempi->ic_data;
tempi->a1.type=TY_DISP+tempi->r.type&RT_MASK;
tempi->a1.type=MDF_DISP+tempi->r.type.raw_type;
tempi->a1.type_pointed_to=tempi->r.type_pointed_to;
tempi->ic_code=IC_MOV;
OptFree(tempil2);
@@ -157,8 +155,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempi->r.type_pointed_to=CmpRawTypePointed(tempi->t.a1c);
case IC_DEREF_PP:
case IC_DEREF_MM:
if (tempi1->ic_code==IC_LEA &&
tempi1->a1.type&TY_MASK==TY_DISP &&
if (tempi1->ic_code==IC_LEA && tempi1->a1.type&MDF_DISP &&
tempi1->a1.reg==REG_RBP)
for (i=0;i<member_cnt;i++)
if (mv[i].offset_start==tempi1->a1.disp) {
@@ -166,7 +163,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
mv[i].score++;
break;
}
tempi->a1.type_pointed_to=tempi->r.type&RT_MASK;
tempi->a1.type_pointed_to=tempi->r.type.raw_type;
break;
case IC_MUL:
case IC_DIV:
@@ -186,15 +183,14 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempi->t.a1c=tempi->t.a2c;
tempi->ic_data=tempi1->ic_data;
tempi->ic_code=IC_ADD_CONST;
tempi->a1.type_pointed_to=tempi->r.type&RT_MASK;
tempi->a2.type=TY_NULL;
tempi->a1.type_pointed_to=tempi->r.type.raw_type;
tempi->a2.type=MDF_NULL;
OptFree(tempi1);
if (tempil2->ic_code==IC_REG &&
tempil2->a1.reg==REG_RBP) {
if (tempil2->ic_code==IC_REG && tempil2->a1.reg==REG_RBP) {
tempi->ic_flags|=tempil2->ic_flags;
tempi->ic_code=IC_LEA;
tempi->a1.reg=REG_RBP;
tempi->a1.type=TY_DISP+tempi->a1.type&RT_MASK;
tempi->a1.type=MDF_DISP+tempi->a1.type.raw_type;
tempi->a1.disp=tempi->ic_data;
for (i=0;i<member_cnt;i++)
if (mv[i].offset_start<=tempi->ic_data<mv[i].offset_end) {
@@ -215,7 +211,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempi->ic_flags|=tempi2->ic_flags;
tempi->ic_data=tempi2->ic_data;
tempi->ic_code=IC_SUB_CONST;
tempi->a2.type=TY_NULL;
tempi->a2.type=MDF_NULL;
OptFree(tempi2);
}
break;
@@ -241,8 +237,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
case IC_AND_EQU:
case IC_OR_EQU:
case IC_XOR_EQU:
if (tempi1->ic_code==IC_LEA &&
tempi1->a1.type&TY_MASK==TY_DISP &&
if (tempi1->ic_code==IC_LEA && tempi1->a1.type&MDF_DISP &&
tempi1->a1.reg==REG_RBP)
for (i=0;i<member_cnt;i++)
if (mv[i].offset_start==tempi1->a1.disp) {
@@ -250,7 +245,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
mv[i].score++;
break;
}
tempi->a1.type_pointed_to=tempi->r.type&RT_MASK;
tempi->a1.type_pointed_to=tempi->r.type.raw_type;
tempi->r.type_pointed_to=CmpRawTypePointed(tempi->t.a1c);
break;
case IC_RETURN_VAL:
@@ -295,7 +290,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
tempi1->ic_code==IC_IMM_F64) && !tempi1->ic_data) {
OptFree(tempi1);
MemCpy(&tempi->a1,&tempi->a2,sizeof(CICArg));
tempi->a2.type=TY_NULL;
tempi->a2.type=MDF_NULL;
if (code==IC_BR_EQU_EQU)
code=tempi->ic_code=IC_BR_ZERO;
else
@@ -305,7 +300,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
} else if ((tempi2->ic_code==IC_IMM_I64 ||
tempi2->ic_code==IC_IMM_F64) && !tempi2->ic_data) {
OptFree(tempi2);
tempi->a2.type=TY_NULL;
tempi->a2.type=MDF_NULL;
if (code==IC_BR_EQU_EQU)
code=tempi->ic_code=IC_BR_ZERO;
else
@@ -317,7 +312,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
if (tempi1->ic_code==IC_IMM_I64 || tempi1->ic_code==IC_IMM_F64) {
if (code==IC_BR_ZERO ^^ tempi1->ic_data) {
OptFree(tempi1);
tempi->a1.type=TY_NULL;
tempi->a1.type=MDF_NULL;
tempi->ic_code=IC_JMP;
} else {
OptFree(tempi1);
@@ -331,7 +326,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
i=Bsr(tempi1->ic_data);
if (0<=i==Bsf(tempi1->ic_data)) {
tempi1->ic_data=i;
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_flags|=ICF_BY_VAL;
tempi->ic_code=IC_BR_NOT_BT;
goto here1;
}
@@ -340,7 +335,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
i=Bsr(tempi2->ic_data);
if (0<=i==Bsf(tempi2->ic_data)) {
tempi2->ic_data=i;
tempi->ic_flags|=ICF_SWAP|ICF_NOT_ADDR;
tempi->ic_flags|=ICF_SWAP|ICF_BY_VAL;
tempi->ic_code=IC_BR_NOT_BT;
}
}
@@ -350,7 +345,7 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
i=Bsr(tempi1->ic_data);
if (0<=i==Bsf(tempi1->ic_data)) {
tempi1->ic_data=i;
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_flags|=ICF_BY_VAL;
tempi->ic_code=IC_BR_BT;
goto here1;
}
@@ -359,15 +354,14 @@ U0 OptPass3(CCmpCtrl *cc,COptReg *reg_offsets)
i=Bsr(tempi2->ic_data);
if (0<=i==Bsf(tempi2->ic_data)) {
tempi2->ic_data=i;
tempi->ic_flags|=ICF_SWAP|ICF_NOT_ADDR;
tempi->ic_flags|=ICF_SWAP|ICF_BY_VAL;
tempi->ic_code=IC_BR_BT;
}
}
goto here1;
case IC_BR_MM_ZERO:
case IC_BR_MM_NOT_ZERO:
if (tempi1->ic_code==IC_LEA &&
tempi1->a1.type&TY_MASK==TY_DISP &&
if (tempi1->ic_code==IC_LEA && tempi1->a1.type&MDF_DISP &&
tempi1->a1.reg==REG_RBP)
for (i=0;i<member_cnt;i++)
if (mv[i].offset_start==tempi1->a1.disp) {
@@ -541,7 +535,7 @@ R12 and R13 as non-pointer register variables, such as index variables i,j,k.
*/
if (cc->htc.fun) {
cc->htc.fun->used_reg_mask=cc->htc.fun->used_reg_mask&
~(REGG_C_LOCAL_VARS|REGG_C_LOCAL_NON_PTR_VARS)|used_reg_mask;
~(REGG_LOCAL_VARS|REGG_LOCAL_NON_PTR_VARS)|used_reg_mask;
if (!Bt(&cc->opts,OPTf_NO_REG_VAR) &&
!(cc->flags & CCF_NO_REG_OPT)) {
QSort(mv,member_cnt,sizeof(COptMemberVar),&OptMVCompare);
+93 -108
View File
@@ -9,33 +9,28 @@ Bool OptIC4(CIntermediateCode *tempi)
if (!(tempil2=OptLag1(tempil1)))
return FALSE;
if (tempil2->r.type&TY_MASK==TY_STK &&
!(tempil2->ic_flags&ICF_PUSH_RESULT)) {
if (tempil1->ic_code==IC_ADD_CONST &&
tempil1->a1.type&TY_MASK==TY_STK) {
if ((tempil2->ic_code==IC_REG ||
tempil2->ic_code==IC_MOV) &&
tempil2->a1.type&TY_MASK==TY_REG) {
if (tempil2->r.type&MDF_STK && !(tempil2->ic_flags&ICF_PUSH_RESULT)) {
if (tempil1->ic_code==IC_ADD_CONST && tempil1->a1.type&MDF_STK) {
if ((tempil2->ic_code==IC_REG || tempil2->ic_code==IC_MOV) &&
tempil2->a1.type&MDF_REG) {
i=tempil1->ic_data;
if (MIN_I32<=i<=MAX_I32 &&
!Bt(&cmp.non_ptr_vars_mask,tempil2->a1.reg)) {
tempil1->ic_flags|=tempil2->ic_flags&ICG_NO_CVT_MASK;
tempil1->ic_code=IC_LEA;
tempil1->a1.type=TY_DISP+tempil1->a1.type&RT_MASK;
tempil1->a1.type=MDF_DISP+tempil1->a1.type.raw_type;
tempil1->a1.reg=tempil2->a1.reg;
tempil1->a1.disp=i;
OptFree(tempil2);
return TRUE;
}
} else if (tempil2->ic_code==IC_SHL_CONST &&
tempil2->a1.type&TY_MASK==TY_REG) {
} else if (tempil2->ic_code==IC_SHL_CONST && tempil2->a1.type&MDF_REG) {
i=tempil1->ic_data;
if (MIN_I32<=i<=MAX_I32 &&
tempil2->a1.reg!=REG_RSP &&
if (MIN_I32<=i<=MAX_I32 && tempil2->a1.reg!=REG_RSP &&
1<=tempil2->ic_data<=3) {
tempil1->ic_flags|=tempil2->ic_flags&ICG_NO_CVT_MASK;
tempil1->ic_code=IC_LEA;
tempil1->a1.type=TY_SIB+tempil1->a1.type&RT_MASK;
tempil1->a1.type=MDF_SIB+tempil1->a1.type.raw_type;
tempil1->a1.reg=tempil2->a1.reg<<8+REG_NONE;
if (tempil2->ic_data==1)
tempil1->a1.reg|=0x4000;
@@ -49,29 +44,28 @@ Bool OptIC4(CIntermediateCode *tempi)
}
}
}
if (tempil2->ic_code==IC_MOV ||
tempil2->ic_code==IC_REG) {
if (tempil1->a2.type&TY_MASK==TY_STK) {
if (tempil2->ic_code==IC_MOV || tempil2->ic_code==IC_REG) {
if (tempil1->a2.type&MDF_STK) {
if (tempil2->ic_flags & ICF_R_TO_INT) {
if (tempil2->a1.type&TY_MASK==TY_IMM)
if (tempil2->a1.type&MDF_IMM)
tempil2->a1.disp=tempil2->a1.disp(F64);
else
tempil1->ic_flags|=ICF_A2_TO_INT;
} else if (tempil2->ic_flags&ICF_R_TO_F64) {
if (tempil2->a1.type&TY_MASK==TY_IMM)
if (tempil2->a1.type&MDF_IMM)
tempil2->a1.disp(F64)=tempil2->a1.disp;
else
tempil1->ic_flags|=ICF_A2_TO_F64;
}
ty=tempil1->a2.type&RT_MASK;
ty1=tempil2->a1.type&RT_MASK;
ty=tempil1->a2.type.raw_type;
ty1=tempil2->a1.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
ty1=tempil2->r.type&RT_MASK;
ty1=tempil2->r.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
tempil1->a2.type=tempil2->a1.type&TY_MASK+ty;
tempil1->a2.type=tempil2->a1.type&MDG_MASK+ty;
pt=tempil1->a2.type_pointed_to;
pt1=tempil2->a1.type_pointed_to;
@@ -88,15 +82,15 @@ Bool OptIC4(CIntermediateCode *tempi)
OptSetNOP2(tempil2);
return TRUE;
}
if (tempil1->a1.type&TY_MASK==TY_STK) {
if (tempil1->a1.type&MDF_STK) {
if (tempil2->ic_flags & ICF_R_TO_INT) {
if (tempil2->a1.type&TY_MASK==TY_IMM)
if (tempil2->a1.type&MDF_IMM)
tempil2->a1.disp=tempil2->a1.disp(F64);
else
tempil1->ic_flags|=ICF_A1_TO_INT;
} else if (tempil2->ic_flags&ICF_R_TO_F64) {
if (tempil2->a1.type&TY_MASK==TY_IMM) {
if (tempil2->a1.type&1) //signed/unsigned
if (tempil2->a1.type&MDF_IMM) {
if (tempil2->a1.type&RTF_UNSIGNED)
tempil2->a1.disp(F64)=tempil2->a1.disp(U64);
else
tempil2->a1.disp(F64)=tempil2->a1.disp(I64);
@@ -104,14 +98,14 @@ Bool OptIC4(CIntermediateCode *tempi)
tempil1->ic_flags|=ICF_A1_TO_F64;
}
ty=tempil1->a1.type&RT_MASK;
ty1=tempil2->a1.type&RT_MASK;
ty=tempil1->a1.type.raw_type;
ty1=tempil2->a1.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
ty1=tempil2->r.type&RT_MASK;
ty1=tempil2->r.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
tempil1->a1.type=tempil2->a1.type&TY_MASK+ty;
tempil1->a1.type=tempil2->a1.type&MDG_MASK+ty;
pt=tempil1->a1.type_pointed_to;
pt1=tempil2->a1.type_pointed_to;
@@ -130,26 +124,24 @@ Bool OptIC4(CIntermediateCode *tempi)
}
}
if (tempil1->ic_code==IC_DEREF) {
if (tempil2->ic_code==IC_ADD_CONST &&
tempil2->a1.type&TY_MASK==TY_REG &&
tempil1->a1.type&TY_MASK==TY_STK) {
if (tempil2->ic_code==IC_ADD_CONST && tempil2->a1.type&MDF_REG &&
tempil1->a1.type&MDF_STK) {
i=tempil2->ic_data;
if (MIN_I32<=i<=MAX_I32 &&
!Bt(&cmp.non_ptr_vars_mask,tempil2->a1.reg)) {
tempil1->ic_flags|=tempil2->ic_flags;
tempil1->ic_code=IC_MOV;
tempil1->a1.type=TY_DISP+tempil1->a1.type_pointed_to;
tempil1->a1.type=MDF_DISP+tempil1->a1.type_pointed_to;
tempil1->a1.reg=tempil2->a1.reg;
tempil1->a1.disp=i;
OptSetNOP2(tempil2,-1);
return TRUE;
}
}
if (tempil2->ic_code==IC_LEA &&
tempil1->a1.type&TY_MASK==TY_STK) {
if (tempil2->ic_code==IC_LEA && tempil1->a1.type&MDF_STK) {
tempil1->ic_flags|=tempil2->ic_flags;
tempil1->ic_code=IC_MOV;
tempil1->a1.type=tempil2->a1.type&TY_MASK+tempil1->a1.type_pointed_to;
tempil1->a1.type=tempil2->a1.type&MDG_MASK+tempil1->a1.type_pointed_to;
tempil1->a1.reg=tempil2->a1.reg;
tempil1->a1.disp=tempil2->a1.disp;
OptFree(tempil2);
@@ -158,8 +150,8 @@ Bool OptIC4(CIntermediateCode *tempi)
}
}
if (tempil1->ic_code==IC_DEREF) {
if (tempil1->a1.type&TY_MASK==TY_REG) {
tempil1->a1.type=TY_DISP+tempil1->a1.type_pointed_to;
if (tempil1->a1.type&MDF_REG) {
tempil1->a1.type=MDF_DISP+tempil1->a1.type_pointed_to;
tempil1->a1.disp=0;
tempil1->ic_code=IC_MOV;
return TRUE;
@@ -221,22 +213,21 @@ U0 OptPass4(CCmpCtrl *cc,COptReg *reg_offsets,I64 *_type)
switch [code] {
case IC_IMM_I64:
case IC_TYPE:
tempi->a1.type=TY_IMM+RT_I64;
tempi->a1.type=MDF_IMM+RT_I64;
tempi->a1.disp=tempi->ic_data;
tempi->ic_code=IC_MOV;
break;
case IC_IMM_F64:
tempi->a1.type=TY_IMM+RT_I64;
tempi->a1.type=MDF_IMM+RT_I64;
tempi->a1.disp=tempi->ic_data;
tempi->a1.type_pointed_to=RT_F64;
tempi->ic_code=IC_MOV;
break;
case IC_MOV:
if (tempi->a1.type&TY_MASK==TY_DISP &&
tempi->a1.reg==REG_RBP) {
if (tempi->a1.type&MDF_DISP && tempi->a1.reg==REG_RBP) {
i=CmpOffset2Reg(tempi->a1.disp,reg_offsets);
if (i>=0) {
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
tempi->a1.type=MDF_REG+tempi->a1.type.raw_type;
tempi->a1.reg=i;
tempi->a1.disp=0;
}
@@ -244,30 +235,27 @@ U0 OptPass4(CCmpCtrl *cc,COptReg *reg_offsets,I64 *_type)
break;
case IC_DEREF:
if (tempi1->ic_code==IC_LEA) {
if (tempi1->a1.type&TY_MASK==TY_DISP &&
tempi1->a1.reg==REG_RBP) {
if (tempi1->a1.type&MDF_DISP && tempi1->a1.reg==REG_RBP) {
i=CmpOffset2Reg(tempi1->a1.disp,reg_offsets);
if (i>=0) {
tempi->ic_flags|=tempi1->ic_flags;
tempi->ic_code=IC_REG;
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
tempi->a1.type=MDF_REG+tempi->a1.type.raw_type;
tempi->a1.reg=i;
tempi->a1.disp=0;
OptFree(tempi1);
}
}
} else if ((tempi1->ic_code==IC_ABS_ADDR ||
tempi1->ic_code==IC_MOV &&
tempi1->a1.type==TY_IMM+RT_I64 &&
0<=tempi1->a1.disp<=MAX_I32) &&
!(tempi1->ic_flags&ICF_NO_RIP)) {
} else if ((tempi1->ic_code==IC_ABS_ADDR || tempi1->ic_code==IC_MOV &&
tempi1->a1.type==MDF_IMM+RT_I64 &&
0<=tempi1->a1.disp<=MAX_I32)&& !(tempi1->ic_flags&ICF_NO_RIP)) {
if (tempi1->ic_code==IC_ABS_ADDR)
tempi->a1.disp=tempi1->ic_data;
else
tempi->a1.disp=tempi1->a1.disp;
tempi->ic_flags|=tempi1->ic_flags;
tempi->ic_code=IC_MOV;
tempi->a1.type=TY_RIP_DISP32+tempi->a1.type_pointed_to;
tempi->a1.type=MDF_RIP_DISP32+tempi->a1.type_pointed_to;
tempi->a1.reg=REG_RIP;
OptFree(tempi1);
}
@@ -282,15 +270,14 @@ U0 OptPass4(CCmpCtrl *cc,COptReg *reg_offsets,I64 *_type)
case IC_PP_:
case IC_MM_:
if (tempi1->ic_code==IC_LEA) {
if (tempi1->a1.type&TY_MASK==TY_DISP &&
tempi1->a1.reg==REG_RBP) {
if (tempi1->a1.type&MDF_DISP && tempi1->a1.reg==REG_RBP) {
i=CmpOffset2Reg(tempi1->a1.disp,reg_offsets);
if (i>=0) {
tempi->ic_flags|=tempi1->ic_flags;
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
tempi->a1.type=MDF_REG+tempi->a1.type.raw_type;
tempi->a1.reg=i;
tempi->a1.disp=0;
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_flags|=ICF_BY_VAL;
OptSetNOP2(tempi1);
} else
goto p4_lea_gone;
@@ -300,29 +287,27 @@ p4_lea_gone:
tempi->a1.type=tempi1->a1.type;
tempi->a1.reg=tempi1->a1.reg;
tempi->a1.disp=tempi1->a1.disp;
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_flags|=ICF_BY_VAL;
OptSetNOP2(tempi1);
}
} else if ((tempi1->ic_code==IC_ABS_ADDR ||
tempi1->ic_code==IC_MOV &&
tempi1->a1.type==TY_IMM+RT_I64 &&
0<=tempi1->a1.disp<=MAX_I32) &&
!(tempi1->ic_flags&ICF_NO_RIP)) {
} else if ((tempi1->ic_code==IC_ABS_ADDR || tempi1->ic_code==IC_MOV &&
tempi1->a1.type==MDF_IMM+RT_I64 &&
0<=tempi1->a1.disp<=MAX_I32)&& !(tempi1->ic_flags&ICF_NO_RIP)) {
tempi->ic_flags|=tempi1->ic_flags;
if (tempi1->ic_code==IC_ABS_ADDR)
tempi->a1.disp=tempi1->ic_data;
else
tempi->a1.disp=tempi1->a1.disp;
tempi->a1.type=TY_RIP_DISP32+tempi->a1.type_pointed_to;
tempi->a1.type=MDF_RIP_DISP32+tempi->a1.type_pointed_to;
tempi->a1.reg=REG_RIP;
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_flags|=ICF_BY_VAL;
OptFree(tempi1);
}
break;
case IC_ADD:
if (tempi1->ic_code==IC_MOV && tempi1->a1.type==TY_REG+RT_I64 ||
if (tempi1->ic_code==IC_MOV && tempi1->a1.type==MDF_REG+RT_I64 ||
tempi1->ic_code==IC_REG) {
if (tempi2->ic_code==IC_MOV && tempi2->a1.type==TY_REG+RT_I64 ||
if (tempi2->ic_code==IC_MOV && tempi2->a1.type==MDF_REG+RT_I64 ||
tempi2->ic_code==IC_REG) {
if (tempi2->a1.reg!=REG_RSP) {
tempi->a1.disp=0;
@@ -338,14 +323,13 @@ p4_sib:
OptFree(tempi2);
tempi->ic_code=IC_LEA;
tempi->a1.type=TY_SIB+RT_I64;
tempi->a1.type=MDF_SIB+RT_I64;
tempi->a1.type_pointed_to=RT_I64;
tempi->a2.type=TY_NULL+tempi->a2.type&RT_MASK;
tempi->a2.type=MDF_NULL+tempi->a2.type.raw_type;
}
} else if (tempi2->ic_code==IC_SHL_CONST &&
tempi2->a1.type==TY_REG+RT_I64 &&
tempi2->ic_data<=3) {
tempi2->a1.type==MDF_REG+RT_I64 && tempi2->ic_data<=3) {
if (tempi2->a1.reg!=REG_RSP) {
tempi->a1.disp=0;
tempi->a1.reg=tempi1->a1.reg+tempi2->a1.reg<<8;
@@ -359,11 +343,11 @@ p4_sib:
}
}
} else if (tempi1->ic_code==IC_LEA &&
tempi1->a1.type&TY_MASK==TY_DISP) {
tempi1->a1.type&MDF_DISP) {
if (tempi1->a1.reg==REG_RBP &&
CmpOffset2Reg(tempi1->a1.disp,reg_offsets)>=0)
break;
if (tempi2->ic_code==IC_MOV && tempi2->a1.type==TY_REG+RT_I64 ||
if (tempi2->ic_code==IC_MOV && tempi2->a1.type==MDF_REG+RT_I64 ||
tempi2->ic_code==IC_REG) {
if (tempi2->a1.reg!=REG_RSP) {
tempi->a1.disp=tempi1->a1.disp;
@@ -375,8 +359,7 @@ p4_sib:
goto p4_sib;
}
} else if (tempi2->ic_code==IC_SHL_CONST &&
tempi2->a1.type==TY_REG+RT_I64 &&
tempi2->ic_data<=3) {
tempi2->a1.type==MDF_REG+RT_I64 && tempi2->ic_data<=3) {
if (tempi2->a1.reg!=REG_RSP) {
tempi->a1.disp=tempi1->a1.disp;
tempi->a1.reg=tempi1->a1.reg+tempi2->a1.reg<<8;
@@ -407,44 +390,42 @@ p4_sib:
case IC_ADD_EQU:
case IC_SUB_EQU:
if (tempi1->ic_code==IC_LEA) {
if (TY_DISP<=tempi1->a1.type&TY_MASK<=TY_SIB) {
if (tempi1->a1.type&TY_MASK==TY_DISP && tempi1->a1.reg==REG_RBP) {
if (tempi1->a1.type&(MDF_DISP|MDF_SIB)) {
if (tempi1->a1.type&MDF_DISP && tempi1->a1.reg==REG_RBP) {
i=CmpOffset2Reg(tempi1->a1.disp,reg_offsets);
if (i>=0) {
tempi->ic_flags|=tempi1->ic_flags;
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
tempi->a1.type=MDF_REG+tempi->a1.type.raw_type;
tempi->a1.reg=i;
tempi->a1.disp=0;
OptSetNOP2(tempi1);
} else {
tempi->ic_flags|=tempi1->ic_flags;
tempi->a1.type=TY_DISP+tempi->a1.type&RT_MASK;
tempi->a1.type=MDF_DISP+tempi->a1.type.raw_type;
tempi->a1.reg=REG_RBP;
tempi->a1.disp=tempi1->a1.disp;
OptSetNOP2(tempi1);
}
} else {
tempi->a1.type=tempi1->a1.type&TY_MASK+tempi->a1.type&RT_MASK;
tempi->a1.type=tempi1->a1.type&MDG_MASK+tempi->a1.type.raw_type;
tempi->ic_flags|=tempi1->ic_flags;
tempi->a1.reg=tempi1->a1.reg;
tempi->a1.disp=tempi1->a1.disp;
OptSetNOP2(tempi1);
}
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_flags|=ICF_BY_VAL;
}
} else if ((tempi1->ic_code==IC_ABS_ADDR ||
tempi1->ic_code==IC_MOV &&
tempi1->a1.type==TY_IMM+RT_I64 &&
0<=tempi1->a1.disp<=MAX_I32) &&
!(tempi1->ic_flags&ICF_NO_RIP)) {
tempi1->ic_code==IC_MOV && tempi1->a1.type==MDF_IMM+RT_I64 &&
0<=tempi1->a1.disp<=MAX_I32)&& !(tempi1->ic_flags&ICF_NO_RIP)) {
tempi->ic_flags|=tempi1->ic_flags;
if (tempi1->ic_code==IC_ABS_ADDR)
tempi->a1.disp=tempi1->ic_data;
else
tempi->a1.disp=tempi1->a1.disp;
tempi->a1.type=TY_RIP_DISP32+tempi->a1.type&RT_MASK;
tempi->a1.type=MDF_RIP_DISP32+tempi->a1.type.raw_type;
tempi->a1.reg=REG_RIP;
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_flags|=ICF_BY_VAL;
OptSetNOP2(tempi1);
}
break;
@@ -486,18 +467,18 @@ p4_sib:
case IC_LBTS:
case IC_LBTR:
case IC_LBTC:
if (!(tempi->ic_flags&ICF_NOT_ADDR)) {
if (!(tempi->ic_flags&ICF_BY_VAL)) {
if (tempi2->ic_code==IC_ADDR) {
if (tempi2->a1.type&TY_MASK==TY_STK &&
tempi2->r.type&TY_MASK==TY_STK) {
if (tempi2->a1.type&MDF_STK &&
tempi2->r.type&MDF_STK) {
if (tempil2=OptLag1(tempi2)) {
if (tempil2->ic_code==IC_LEA) {
if (TY_IMM<=tempil2->a1.type&TY_MASK<TY_STK) {
if (tempil2->a1.type&(MDF_IMM|MDG_REG_DISP_SIB_RIP)) {
if (tempi2) {
tempi->ic_flags|=tempi2->ic_flags;
OptFree(tempi2);
}
tempi->ic_flags|=tempil2->ic_flags|ICF_NOT_ADDR;
tempi->ic_flags|=tempil2->ic_flags|ICF_BY_VAL;
tempi->a2.type=tempil2->a1.type;
tempi->a2.reg =tempil2->a1.reg;
tempi->a2.disp=tempil2->a1.disp;
@@ -506,7 +487,7 @@ p4_sib:
break;
} else if (tempil2->ic_code!=IC_ABS_ADDR &&
!(tempil2->ic_code==IC_MOV &&
tempil2->a1.type==TY_IMM+RT_I64 &&
tempil2->a1.type==MDF_IMM+RT_I64 &&
0<=tempil2->a1.disp<=MAX_I32) ||
tempil2->ic_flags&ICF_NO_RIP)
tempil2=NULL;
@@ -518,7 +499,7 @@ p4_sib:
}
}
} else {
if (tempi2->a1.type==TY_IMM+RT_I64 &&
if (tempi2->a1.type==MDF_IMM+RT_I64 &&
0<=tempi2->a1.disp<=MAX_I32 &&
!(tempi2->ic_flags&ICF_NO_RIP)) {
tempil2=tempi2;
@@ -532,19 +513,18 @@ p4_sib:
tempi->ic_flags|=tempi2->ic_flags;
OptFree(tempi2);
}
tempi->ic_flags|=tempil2->ic_flags|ICF_NOT_ADDR;
tempi->a2.type=TY_RIP_DISP32+tempi->a2.type&RT_MASK;
tempi->ic_flags|=tempil2->ic_flags|ICF_BY_VAL;
tempi->a2.type=MDF_RIP_DISP32+tempi->a2.type.raw_type;
tempi->a2.reg=REG_RIP;
OptFree(tempil2);
}
} else if (tempi2->ic_code==IC_MOV &&
tempi2->r.type&TY_MASK==TY_STK &&
tempi2->a1.type==TY_IMM+RT_I64 &&
} else if (tempi2->ic_code==IC_MOV && tempi2->r.type&MDF_STK &&
tempi2->a1.type==MDF_IMM+RT_I64 &&
0<=tempi2->a1.disp<=MAX_I32 &&
!(tempi2->ic_flags&ICF_NO_RIP)) {
tempi->a2.disp=tempi2->a1.disp;
tempi->ic_flags|=tempi2->ic_flags|ICF_NOT_ADDR;
tempi->a2.type=TY_RIP_DISP32+tempi->a2.type&RT_MASK;
tempi->ic_flags|=tempi2->ic_flags|ICF_BY_VAL;
tempi->a2.type=MDF_RIP_DISP32+tempi->a2.type.raw_type;
tempi->a2.reg=REG_RIP;
OptFree(tempi2);
}
@@ -579,15 +559,20 @@ p4_sib:
if (!(tempil1->ic_flags&ICF_PUSH_RESULT)) {
if (tempi->ic_flags&ICF_NO_DEPEND_RESULT) {
tempil1->ic_flags|=ICF_NO_DEPEND_RESULT;
tempil1->r.type=TY_NULL+tempil1->r.type&RT_MASK;
} else if (tempi->a1.type&TY_MASK==TY_STK &&
tempil1->r.type&TY_MASK==TY_STK) {
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
tempi->a1.reg=REG_RAX;
tempil1->r.type=MDF_NULL+tempil1->r.type.raw_type;
} else if (tempi->a1.type&MDF_STK &&
tempil1->r.type&MDF_STK) {
tempi->a1.type=MDF_REG+tempi->a1.type.raw_type;
tempi->a1.disp=0;
tempil1->r.type=TY_REG+tempil1->r.type&RT_MASK;
tempil1->r.reg=REG_RAX;
tempil1->r.type=MDF_REG+tempil1->r.type.raw_type;
tempil1->r.disp=0;
if (intermediate_code_table[tempi->ic_code].arg_cnt==IS_2_ARG) {
tempi->a1.reg=REG_R8;
tempil1->r.reg=REG_R8;
} else {
tempi->a1.reg=REG_RAX;
tempil1->r.reg=REG_RAX;
}
}
}
break;
+18 -20
View File
@@ -26,30 +26,29 @@ U0 OptPass5(CCmpCtrl *cc)
if (Bt(&tempi->ic_data,i))
ps->ptr--;
}
if (tempi->a2.type&TY_MASK==TY_STK) {
if (tempi->a2.type&MDF_STK) {
tempi1=PrsPop(ps);
if (tempi1->ic_code==IC_MOV ||
tempi1->ic_code==IC_REG) {
if (tempi1->ic_code==IC_MOV || tempi1->ic_code==IC_REG) {
if (tempi1->ic_flags & ICF_R_TO_INT) {
if (tempi1->a1.type&TY_MASK==TY_IMM)
if (tempi1->a1.type&MDF_IMM)
tempi1->a1.disp=tempi1->a1.disp(F64);
else
tempi->ic_flags|=ICF_A2_TO_INT;
} else if (tempi1->ic_flags&ICF_R_TO_F64) {
if (tempi1->a1.type&TY_MASK==TY_IMM)
if (tempi1->a1.type&MDF_IMM)
tempi1->a1.disp(F64)=tempi1->a1.disp;
else
tempi->ic_flags|=ICF_A2_TO_F64;
}
ty=tempi->a2.type&RT_MASK;
ty1=tempi1->a1.type&RT_MASK;
ty=tempi->a2.type.raw_type;
ty1=tempi1->a1.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
ty1=tempi1->r.type&RT_MASK;
ty1=tempi1->r.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
tempi->a2.type=tempi1->a1.type&TY_MASK+ty;
tempi->a2.type=tempi1->a1.type&MDG_MASK+ty;
pt=tempi->a2.type_pointed_to;
pt1=tempi1->a1.type_pointed_to;
@@ -67,18 +66,17 @@ U0 OptPass5(CCmpCtrl *cc)
}
}
if (tempi->a1.type&TY_MASK==TY_STK) {
if (tempi->a1.type&MDF_STK) {
tempi1=PrsPop(ps);
if (tempi1->ic_code==IC_MOV ||
tempi1->ic_code==IC_REG) {
if (tempi1->ic_code==IC_MOV || tempi1->ic_code==IC_REG) {
if (tempi1->ic_flags & ICF_R_TO_INT) {
if (tempi1->a1.type&TY_MASK==TY_IMM)
if (tempi1->a1.type&MDF_IMM)
tempi1->a1.disp=tempi1->a1.disp(F64);
else
tempi->ic_flags|=ICF_A1_TO_INT;
} else if (tempi1->ic_flags&ICF_R_TO_F64) {
if (tempi1->a1.type&TY_MASK==TY_IMM) {
if (tempi1->a1.type & 1) //signed/unsigned
if (tempi1->a1.type&MDF_IMM) {
if (tempi1->a1.type&RTF_UNSIGNED)
tempi1->a1.disp(F64)=tempi1->a1.disp(U64);
else
tempi1->a1.disp(F64)=tempi1->a1.disp(I64);
@@ -86,14 +84,14 @@ U0 OptPass5(CCmpCtrl *cc)
tempi->ic_flags|=ICF_A1_TO_F64;
}
ty=tempi->a1.type&RT_MASK;
ty1=tempi1->a1.type&RT_MASK;
ty=tempi->a1.type.raw_type;
ty1=tempi1->a1.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
ty1=tempi1->r.type&RT_MASK;
ty1=tempi1->r.type.raw_type;
if (ty1 && ty1<ty)
ty=ty1;
tempi->a1.type=tempi1->a1.type&TY_MASK+ty;
tempi->a1.type=tempi1->a1.type&MDG_MASK+ty;
pt=tempi->a1.type_pointed_to;
pt1=tempi1->a1.type_pointed_to;
@@ -110,7 +108,7 @@ U0 OptPass5(CCmpCtrl *cc)
OptSetNOP2(tempi1);
}
}
if (tempi->r.type&TY_MASK==TY_STK &&
if (tempi->r.type&MDF_STK &&
!(tempi->ic_flags&ICF_NO_DEPEND_RESULT))
PrsPush(ps,tempi);
}
+62 -72
View File
@@ -4,20 +4,20 @@ Bool OptIC6(CIntermediateCode *tempi)
if (tempi->ic_code<IC_IMM_I64 || !(tempil1=OptLag1(tempi)))
return FALSE;
if (tempil1->ic_code==IC_ADD_CONST && tempi->ic_code==IC_DEREF &&
tempi->ic_flags&ICF_A1_WAS_STK && tempi->a1.type&TY_MASK==TY_REG &&
tempil1->r.type&TY_MASK==TY_REG && MIN_I32<=tempil1->ic_data<=MAX_I32 &&
tempi->ic_flags&ICF_A1_WAS_STK && tempi->a1.type&MDF_REG &&
tempil1->r.type&MDF_REG && MIN_I32<=tempil1->ic_data<=MAX_I32 &&
!Bt(&cmp.non_ptr_vars_mask,tempil1->a1.reg)) {
if (tempil1->a1.type&TY_MASK==TY_REG) {
if (tempil1->a1.type&MDF_REG) {
tempi->ic_flags=tempi->ic_flags&~ICF_A1_WAS_STK | tempil1->ic_flags;
tempi->ic_code=IC_MOV;
tempi->a1.type=TY_DISP+tempi->a1.type_pointed_to;
tempi->a1.type=MDF_DISP+tempi->a1.type_pointed_to;
tempi->a1.reg=tempil1->a1.reg;
tempi->a1.disp=tempil1->ic_data;
OptSetNOP2(tempil1,-1);
} else {
tempil1->ic_code=IC_MOV;
tempi->ic_code=IC_MOV;
tempi->a1.type=TY_DISP+tempi->a1.type_pointed_to;
tempi->a1.type=MDF_DISP+tempi->a1.type_pointed_to;
tempi->a1.disp=tempil1->ic_data;
}
return TRUE;
@@ -26,99 +26,85 @@ Bool OptIC6(CIntermediateCode *tempi)
}
U0 OptPass6Lag(CCmpCtrl *cc,CPrsStk *ps,CIntermediateCode *tempi,
I64 *i_,I64 num_stk,I64 *_clobbered_reg_mask,I64 fun_num)
I64 *_stk_ptr,I64 reg_stk_size,I64 *_clobbered_reg_mask)
{
I64 i=*i_,j,k,l,code,clobbered_reg_mask=*_clobbered_reg_mask;
I64 stk_ptr=*_stk_ptr,code,
clobbered_stk_temp_mask,clobbered_reg_mask=*_clobbered_reg_mask;
CHashFun *tempf;
code=tempi->ic_code;
if (tempi->ic_flags&ICF_PASS_TRACE && Bt(&cc->saved_pass_trace,6)) {
"%2d:",i;
"%2d:",stk_ptr;
ICPut(cc,tempi);
}
if (code==IC_CALL_START) {
k=MinI64(i,num_stk);
j=0;
//See $LK,"STK TEMP ALLOCATION",A="FF:::/Compiler/CInit.CPP,STK TEMP ALLOCATION"$
if (fun_num&1)
for (l=0;l<k;l++)
Bts(&j,cmp.to_stk_temps_map_odd[l]);
if (reg_stk_size==1 && stk_ptr>0)
clobbered_stk_temp_mask=REGG_STK_TEMP;
else
for (l=0;l<k;l++)
Bts(&j,cmp.to_stk_temps_map_even[l]);
clobbered_stk_temp_mask=0;
if (tempf=tempi->ic_data) {
if (Bt(&tempf->flags,Ff_INTERNAL))
j=0;
clobbered_stk_temp_mask=0;
else {
j&=tempf->clobbered_reg_mask;
clobbered_stk_temp_mask&=tempf->clobbered_reg_mask;
clobbered_reg_mask|=tempf->clobbered_reg_mask;
}
}
tempi->ic_data=j;
PrsPush(ps,i);
PrsPush(ps,j);
tempi->ic_data=clobbered_stk_temp_mask;
PrsPush(ps,stk_ptr);
PrsPush(ps,clobbered_stk_temp_mask);
} else if (code==IC_CALL_END) {
tempi->ic_data=PrsPop(ps);
i=PrsPop(ps);
stk_ptr=PrsPop(ps);
} else if (code==IC_CALL_END2) {
ps->ptr--;
i=PrsPop(ps);
stk_ptr=PrsPop(ps);
}
if (intermediate_code_table[code].arg_cnt==IS_V_ARG)
i-=tempi->ic_data>>3;
if (tempi->a2.type&TY_MASK==TY_STK) {
i--;
if (i<num_stk) {
tempi->a2.type=TY_REG+tempi->a2.type&RT_MASK;
if (fun_num&1)
tempi->a2.reg=cmp.to_stk_temps_map_odd[i];
else
tempi->a2.reg=cmp.to_stk_temps_map_even[i];
stk_ptr-=tempi->ic_data>>3;
if (tempi->a2.type&MDF_STK) {
stk_ptr--;
if (stk_ptr<reg_stk_size) {
tempi->a2.type=MDF_REG+tempi->a2.type.raw_type;
tempi->a2.reg=Bsf(REGG_STK_TEMP);
tempi->a2.disp=0;
}
}
if (tempi->a1.type&TY_MASK==TY_STK) {
i--;
if (i<num_stk) {
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
if (fun_num&1)
tempi->a1.reg=cmp.to_stk_temps_map_odd[i];
else
tempi->a1.reg=cmp.to_stk_temps_map_even[i];
if (tempi->a1.type&MDF_STK) {
stk_ptr--;
if (stk_ptr<reg_stk_size) {
tempi->a1.type=MDF_REG+tempi->a1.type.raw_type;
tempi->a1.reg=Bsf(REGG_STK_TEMP);
tempi->a1.disp=0;
}
}
if (tempi->r.type&TY_MASK==TY_STK && !(tempi->ic_flags & ICF_PUSH_RESULT)) {
i++;
if (i<=num_stk) {
tempi->r.type=TY_REG+tempi->r.type&RT_MASK;
if (fun_num&1) {
tempi->r.reg=cmp.to_stk_temps_map_odd[i-1];
Bts(&clobbered_reg_mask,cmp.to_stk_temps_map_odd[i-1]);
} else {
tempi->r.reg=cmp.to_stk_temps_map_even[i-1];
Bts(&clobbered_reg_mask,cmp.to_stk_temps_map_even[i-1]);
}
if (tempi->r.type&MDF_STK && !(tempi->ic_flags & ICF_PUSH_RESULT)) {
stk_ptr++;
if (stk_ptr<=reg_stk_size) {
tempi->r.type=MDF_REG+tempi->r.type.raw_type;
tempi->r.reg=Bsf(REGG_STK_TEMP);
clobbered_reg_mask|=REGG_STK_TEMP;
tempi->r.disp=0;
}
}
while (OptIC6(tempi));
if (tempi->r.type&RT_MASK!=RT_F64 && !(tempi->ic_flags&ICF_USE_F64))
if (tempi->r.type.raw_type!=RT_F64 && !(tempi->ic_flags&ICF_USE_F64))
tempi->ic_flags|=ICF_USE_INT;
*i_=i;
*_stk_ptr=stk_ptr;
*_clobbered_reg_mask=clobbered_reg_mask;
}
U0 OptPass6(CCmpCtrl *cc)
{
CIntermediateCode *tempi,*tempi_next,*tempil1,*tempil2,*old_tempil2;
I64 i=0,num_stk,clobbered_reg_mask=REGG_C_CLOBBERED,fun_num=0;
I64 stk_ptr=0,reg_stk_size,clobbered_reg_mask=REGG_CLOBBERED;
CPrsStk *ps=cc->ps;
ps->ptr=0;
ps->ptr2=0;
if (Bt(&cc->opts,OPTf_NO_REG_VAR) || cc->flags&CCF_NO_REG_OPT)
num_stk=0;
reg_stk_size=0;
else
num_stk=cmp.num_stk_temps;
reg_stk_size=1;
#assert REGG_STK_TEMP==1<<9
tempi=cc->coc.coc_root.next;
old_tempil2=NULL;
tempil1=tempil2=&cmp.ic_nop;
@@ -127,50 +113,54 @@ U0 OptPass6(CCmpCtrl *cc)
if (tempil1->ic_code>IC_NOP2)
tempil2=tempil1;
tempil1=tempi;
if (tempi->a2.type&TY_MASK==TY_STK) {
if (tempil2->r.type&TY_MASK==TY_STK &&
if (tempi->a2.type&MDF_STK) {
if (tempil2->r.type&MDF_STK &&
!(tempil2->ic_flags&ICF_PUSH_RESULT)) {
if (tempi->ic_code==IC_ASSIGN && tempi->ic_flags&ICF_NOT_ADDR &&
if (tempi->ic_code==IC_ASSIGN && tempi->ic_flags&ICF_BY_VAL &&
tempi->ic_flags&ICF_NO_DEPEND_RESULT &&
tempil2->ic_code!=IC_CALL_END &&
tempil2->ic_code!=IC_CALL_END2 &&
tempil2->ic_code!=IC_SET_RAX &&
!(tempi->ic_flags&(ICF_A2_TO_F64|ICF_A2_TO_INT)) &&
!(tempil2->ic_flags&(ICF_R_TO_F64|ICF_R_TO_INT))) {
tempil2->r.type =tempi->a1.type&TY_MASK+tempi->a1.type_pointed_to;
tempil2->r.type =tempi->a1.type&MDG_MASK+tempi->a1.type_pointed_to;
tempil2->r.type_pointed_to=tempi->a1.type_pointed_to;
tempil2->r.reg =tempi->a1.reg;
tempil2->r.disp =tempi->a1.disp;
tempil2->ic_flags=tempil2->ic_flags
&~(ICF_NO_DEPEND_RESULT|ICF_R_WAS_STK)
|tempi->ic_flags&~(ICF_NOT_ADDR|ICF_A1_WAS_STK|ICF_A2_WAS_STK)
|tempi->ic_flags&~(ICF_BY_VAL|ICF_A1_WAS_STK|ICF_A2_WAS_STK)
|ICF_DEPEND_RESULT;
old_tempil2=NULL;
OptSetNOP1(tempi);
} else {
tempi->a2.type=TY_REG+tempi->a2.type&RT_MASK;
tempi->a2.type=MDF_REG+tempi->a2.type.raw_type;
tempi->a2.reg=REG_RAX;
tempi->a2.disp=0;
tempil2->r.type=TY_REG+tempil2->r.type&RT_MASK;
tempil2->r.type=MDF_REG+tempil2->r.type.raw_type;
tempil2->r.reg=REG_RAX;
tempil2->r.disp=0;
}
}
} else if (tempi->a1.type&TY_MASK==TY_STK &&
tempil2->r.type&TY_MASK==TY_STK &&
} else if (tempi->a1.type&MDF_STK && tempil2->r.type&MDF_STK &&
!(tempil2->ic_flags&ICF_PUSH_RESULT)) {
tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK;
tempi->a1.reg=REG_RAX;
tempi->a1.type=MDF_REG+tempi->a1.type.raw_type;
tempi->a1.disp=0;
tempil2->r.type=TY_REG+tempil2->r.type&RT_MASK;
tempil2->r.reg=REG_RAX;
tempil2->r.type=MDF_REG+tempil2->r.type.raw_type;
tempil2->r.disp=0;
if (intermediate_code_table[tempi->ic_code].arg_cnt==IS_2_ARG) {
tempi->a1.reg=REG_R8;
tempil2->r.reg=REG_R8;
} else {
tempi->a1.reg=REG_RAX;
tempil2->r.reg=REG_RAX;
}
}
if (tempi->ic_flags & ICF_PUSH_RESULT)
tempi->r.type==TY_STK+tempi->r.type&RT_MASK;
tempi->r.type==MDF_STK+tempi->r.type.raw_type;
if (old_tempil2!=tempil2) {
if (tempil2->ic_code>IC_NOP2)
OptPass6Lag(cc,ps,tempil2,&i,num_stk,&clobbered_reg_mask,fun_num);
OptPass6Lag(cc,ps,tempil2,&stk_ptr,reg_stk_size,&clobbered_reg_mask);
old_tempil2=tempil2;
}
}
@@ -184,7 +174,7 @@ U0 OptPass6(CCmpCtrl *cc)
LexExcept(cc,"Compiler Optimization Error at ");
}
if (cc->htc.fun) {
cc->htc.fun->used_reg_mask&=~REGG_C_TEMP_CLOBBERED;
cc->htc.fun->used_reg_mask&=~REGG_STK_TEMP;
cc->htc.fun->used_reg_mask|=clobbered_reg_mask;
cc->htc.fun->clobbered_reg_mask=clobbered_reg_mask;
if (Bt(&cc->flags,CCf_PASS_TRACE_PRESENT) &&
+66 -143
View File
@@ -61,92 +61,38 @@ cc->pass==10 is final pass, code is placed into buf.
if (cc->pass==7)
cc->dont_push_float=Btr(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0);
MemCpy(saved_p123,&tempi->a1,3*sizeof(CICArg));
if (intermediate_code_table[tempi->ic_code].arg_cnt==IS_2_ARG &&
tempi->a1.type&TY_MASK==TY_REG && tempi->a1.reg==REG_RAX)
tempi->ic_flags|=ICF_A1_FIRST;
tempi->ic_cnt=0;
tempi->ic_last_cnt=-1;
if (tempi->ic_flags & ICF_A1_FIRST) {
if (tempi->a1.type&TY_MASK) {
if (tempi->ic_flags & ICF_A1_TO_F64) {
ICFCvt(cc,tempi,REG_RDX,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,FALSE,CN_A1,ip2);
tempi->a1.type=TY_REG+RT_I64;
tempi->a1.reg=REG_RDX;
tempi->a1.disp=0;
tempi->ic_flags&=~ICF_A1_FIRST;
} else if (tempi->ic_flags & ICF_A1_TO_INT) {
ICFCvt(cc,tempi,REG_RDX,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,TRUE,CN_A1,ip2);
tempi->a1.type=TY_REG+RT_I64;
tempi->a1.reg=REG_RDX;
tempi->a1.disp=0;
tempi->ic_flags&=~ICF_A1_FIRST;
}
}
if (tempi->a2.type&TY_MASK) {
if (tempi->ic_flags & ICF_A2_TO_F64) {
if (tempi->ic_flags&ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
tempi->a1.type=TY_REG+RT_I64;
tempi->a1.reg=REG_RDX;
tempi->a1.disp=0;
tempi->ic_flags&=~ICF_A1_FIRST;
}
ICFCvt(cc,tempi,REG_RAX,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,FALSE,CN_A2,ip2);
tempi->a2.type=TY_REG+RT_I64;
tempi->a2.reg=REG_RAX;
tempi->a2.disp=0;
} else if (tempi->ic_flags & ICF_A2_TO_INT) {
if (tempi->ic_flags&ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
tempi->a1.type=TY_REG+RT_I64;
tempi->a1.reg=REG_RDX;
tempi->a1.disp=0;
tempi->ic_flags&=~ICF_A1_FIRST;
}
ICFCvt(cc,tempi,REG_RAX,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,TRUE,CN_A2,ip2);
tempi->a2.type=TY_REG+RT_I64;
tempi->a2.reg=REG_RAX;
tempi->a2.disp=0;
}
}
} else {
if (tempi->a2.type&TY_MASK) {
if (tempi->a2.type.mode) {
if (tempi->ic_flags & ICF_A2_TO_F64) {
ICFCvt(cc,tempi,REG_RAX,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,FALSE,CN_A2,ip2);
tempi->a2.type=TY_REG+RT_I64;
tempi->a2.type=MDF_REG+RT_I64;
tempi->a2.reg=REG_RAX;
tempi->a2.disp=0;
} else if (tempi->ic_flags & ICF_A2_TO_INT) {
ICFCvt(cc,tempi,REG_RAX,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,TRUE,CN_A2,ip2);
tempi->a2.type=TY_REG+RT_I64;
tempi->a2.type=MDF_REG+RT_I64;
tempi->a2.reg=REG_RAX;
tempi->a2.disp=0;
}
}
if (tempi->a1.type&TY_MASK) {
if (tempi->a1.type.mode) {
if (tempi->ic_flags & ICF_A1_TO_F64) {
ICFCvt(cc,tempi,REG_RDX,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,FALSE,CN_A1,ip2);
tempi->a1.type=TY_REG+RT_I64;
tempi->a1.type=MDF_REG+RT_I64;
tempi->a1.reg=REG_RDX;
tempi->a1.disp=0;
} else if (tempi->ic_flags & ICF_A1_TO_INT) {
ICFCvt(cc,tempi,REG_RDX,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,TRUE,CN_A1,ip2);
tempi->a1.type=TY_REG+RT_I64;
tempi->a1.type=MDF_REG+RT_I64;
tempi->a1.reg=REG_RDX;
tempi->a1.disp=0;
}
}
}
switch [tempi->ic_code] {
sub_switch_start:
sub_switch_start:
@@ -191,8 +137,7 @@ cc->pass==10 is final pass, code is placed into buf.
case IC_RIP:
ICU16(tempi,0xB848);
ICU64(tempi,ip2+tempi->ic_cnt-2);
if (cc->flags&CCF_AOT_COMPILE && buf &&
!(cc->flags&CCF_NO_ABSS)) {
if (cc->flags&CCF_AOT_COMPILE && buf &&!(cc->flags&CCF_NO_ABSS)) {
tempa=CAlloc(sizeof(CAOTAbsAddr));
tempa->next=aotc->abss;
tempa->type=AAT_ADD_U64;
@@ -202,7 +147,7 @@ cc->pass==10 is final pass, code is placed into buf.
break;
sub_switch_end:
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip2);
MDF_REG+RT_I64,REG_RAX,0,ip2);
break;
case IC_BR_CARRY:
ICFlagBranch(tempi,ip,0x72820F,buf);
@@ -356,7 +301,7 @@ cc->pass==10 is final pass, code is placed into buf.
else
i=lb->addr+buf;
ICLea(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_RIP_DISP32+RT_PTR,0,i,cc,buf,ip2);
MDF_RIP_DISP32+RT_PTR,0,i,cc,buf,ip2);
break;
case IC_ASM:
tempaot=tempi->ic_data;
@@ -442,12 +387,11 @@ cc->pass==10 is final pass, code is placed into buf.
case IC_LEAVE:
if (cc->htc.fun) {
if (Bt(&cc->htc.fun->flags,Ff_INTERRUPT))
ICPopRegs(tempi,REGG_C_CLOBBERED|cc->htc.fun->used_reg_mask&
(REGG_C_LOCAL_VARS|REGG_C_LOCAL_NON_PTR_VARS|
REGG_C_TEMP_CLOBBERED));
ICPopRegs(tempi,REGG_CLOBBERED|cc->htc.fun->used_reg_mask&
(REGG_LOCAL_VARS|REGG_LOCAL_NON_PTR_VARS|REGG_STK_TEMP));
else
ICPopRegs(tempi,cc->htc.fun->used_reg_mask&
(REGG_C_LOCAL_VARS|REGG_C_LOCAL_NON_PTR_VARS));
(REGG_LOCAL_VARS|REGG_LOCAL_NON_PTR_VARS));
}
if (tempi->ic_data<=MAX_I16) {
if (tempi->ic_data)
@@ -487,14 +431,16 @@ cc->pass==10 is final pass, code is placed into buf.
ICU8(tempi,0x64);
//It's ugly to use ic_class here
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+CmpRawType(tempi->ic_class),REG_RAX,tempi->ic_data,ip2);
MDF_DISP+CmpRawType(tempi->ic_class),REG_RAX,tempi->ic_data,
ip2);
break;
case IC_MOV_GS:
ICZero(tempi,REG_RAX);
ICU8(tempi,0x65);
//It's ugly to use ic_class here
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_DISP+CmpRawType(tempi->ic_class),REG_RAX,tempi->ic_data,ip2);
MDF_DISP+CmpRawType(tempi->ic_class),REG_RAX,tempi->ic_data,
ip2);
break;
case IC_HOLYC_TYPECAST:
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
@@ -507,7 +453,7 @@ cc->pass==10 is final pass, code is placed into buf.
ICNot(tempi,ip2);
break;
case IC_UNARY_MINUS:
if (tempi->r.type&RT_MASK==RT_F64)
if (tempi->r.type.raw_type==RT_F64)
ICFUnaryMinus(cc,tempi,buf,ip2);
else
ICUnaries(tempi,SLASH_OP_NEG,ip2);
@@ -730,13 +676,13 @@ cc->pass==10 is final pass, code is placed into buf.
case IC_SHL_CONST:
ICShift(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
TY_IMM+RT_I64,0,tempi->ic_data,
MDF_IMM+RT_I64,0,tempi->ic_data,
0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2);
break;
case IC_SHR_CONST:
ICShift(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,
TY_IMM+RT_I64,0,tempi->ic_data,
MDF_IMM+RT_I64,0,tempi->ic_data,
0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2);
break;
case IC_ADD_CONST:
@@ -755,20 +701,18 @@ cc->pass==10 is final pass, code is placed into buf.
ICAddRSP(tempi,-tempi->ic_data,FALSE);
if (cc->htc.fun) {
if (Bt(&cc->htc.fun->flags,Ff_INTERRUPT))
ICPushRegs(tempi,REGG_C_CLOBBERED|cc->htc.fun->used_reg_mask&
(REGG_C_LOCAL_VARS|REGG_C_LOCAL_NON_PTR_VARS|
REGG_C_TEMP_CLOBBERED));
ICPushRegs(tempi,REGG_CLOBBERED|cc->htc.fun->used_reg_mask&
(REGG_LOCAL_VARS|REGG_LOCAL_NON_PTR_VARS|REGG_STK_TEMP));
else {
if (sys_var_init_flag&1 && i)
if (sys_var_init_flag && i)
ICLocalVarInit(tempi);
ICPushRegs(tempi,cc->htc.fun->used_reg_mask
&(REGG_C_LOCAL_VARS|REGG_C_LOCAL_NON_PTR_VARS));
&(REGG_LOCAL_VARS|REGG_LOCAL_NON_PTR_VARS));
}
for (i=0;i<NUM_REGS;i++)
if (reg_offsets[i]>0 && reg_offsets[i].offset!=MAX_I64) {
tempc=OptClassFwd(reg_offsets[i].m->member_class);
ICMov(tempi,TY_REG+RT_I64,i,0,
TY_DISP+tempc->raw_type,
ICMov(tempi,MDF_REG+RT_I64,i,0,MDF_DISP+tempc->raw_type,
REG_RBP,reg_offsets[i].offset,ip2);
}
}
@@ -792,18 +736,18 @@ cc->pass==10 is final pass, code is placed into buf.
ICU8(tempi,0x58);
break;
case IC_INVLPG:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU24(tempi,0x38010F);
break;
case IC_CLFLUSH:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU24(tempi,0x38AE0F);
break;
case IC_GET_RFLAGS:
ICU8(tempi,0x9C);
ICPop(tempi,TY_REG+RT_I64,REG_RAX,0,ip2);
ICPop(tempi,MDF_REG+RT_I64,REG_RAX,0,ip2);
break;
case IC_CARRY:
ICU24(tempi,0xC0920F); //SETC AL
@@ -820,24 +764,24 @@ cc->pass==10 is final pass, code is placed into buf.
ICU8(tempi,0x9D);
break;
case IC_GET_RBP:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_REG+RT_I64,REG_RBP,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
MDF_REG+RT_I64,REG_RBP,0,ip2);
break;
case IC_SET_RBP:
ICMov(tempi,TY_REG+RT_I64,REG_RBP,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RBP,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
break;
case IC_GET_RSP:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
TY_REG+RT_I64,REG_RSP,0,ip2);
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
MDF_REG+RT_I64,REG_RSP,0,ip2);
break;
case IC_SET_RSP:
ICMov(tempi,TY_REG+RT_I64,REG_RSP,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RSP,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
break;
case IC_RETURN_VAL:
case IC_SET_RAX:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
break;
case IC_RETURN_VAL2:
@@ -863,21 +807,21 @@ cc->pass==10 is final pass, code is placed into buf.
0xBB0F,0x38BA0F,ip2);
break;
case IC_BSF:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU32(tempi,0xC0BC0F48);
ICU16(tempi,0x0375);
ICU24(tempi,0xD0F748);
break;
case IC_BSR:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU32(tempi,0xC0BD0F48);
ICU16(tempi,0x0375);
ICU24(tempi,0xD0F748);
break;
case IC_SIGN_I64:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_SIGN_I64,
TRUE,FALSE,FALSE,CN_MAIN);
@@ -916,7 +860,7 @@ cc->pass==10 is final pass, code is placed into buf.
ICFTemplateFun(cc,tempi,CMP_TEMPLATE_ATAN,ip2);
break;
case IC_ABS_I64:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU24(tempi,0xC08548);
ICU16(tempi,0x0379);
@@ -962,12 +906,12 @@ cc->pass==10 is final pass, code is placed into buf.
ICQueRem(tempi,ip2);
break;
case IC_STRLEN:
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICCopyTemplate(cc,tempi,CMP_TEMPLATE_STRLEN,TRUE,FALSE,FALSE,CN_MAIN);
break;
case IC_IN_U32:
if (tempi->a1.type&TY_MASK==TY_IMM) {
if (tempi->a1.type&MDF_IMM) {
ICU16(tempi,0xC033);
if (tempi->a1.disp<=MAX_U8)
ICU16(tempi,0xE5+tempi->a1.disp<<8);
@@ -976,14 +920,14 @@ cc->pass==10 is final pass, code is placed into buf.
ICU8(tempi,0xED);
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU16(tempi,0xC033);
ICU8(tempi,0xED);
}
break;
case IC_IN_U16:
if (tempi->a1.type&TY_MASK==TY_IMM) {
if (tempi->a1.type&MDF_IMM) {
ICU16(tempi,0xC033);
if (tempi->a1.disp<=MAX_U8)
ICU24(tempi,0xE500+OC_OP_SIZE_PREFIX+tempi->a1.disp<<16);
@@ -992,14 +936,14 @@ cc->pass==10 is final pass, code is placed into buf.
ICU16(tempi,0xED00+OC_OP_SIZE_PREFIX);
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU16(tempi,0xC033);
ICU16(tempi,0xED00+OC_OP_SIZE_PREFIX);
}
break;
case IC_IN_U8:
if (tempi->a1.type&TY_MASK==TY_IMM) {
if (tempi->a1.type&MDF_IMM) {
ICU16(tempi,0xC033);
if (tempi->a1.disp<=MAX_U8)
ICU16(tempi,0xE4+tempi->a1.disp<<8);
@@ -1008,15 +952,15 @@ cc->pass==10 is final pass, code is placed into buf.
ICU8(tempi,0xEC);
}
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICU16(tempi,0xC033);
ICU8(tempi,0xEC);
}
break;
case IC_OUT_U32:
if (tempi->a2.type&TY_MASK==TY_IMM) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
if (tempi->a2.type&MDF_IMM) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
if (tempi->a2.disp<=MAX_U8)
ICU16(tempi,0xE7+tempi->a2.disp<<8);
@@ -1025,23 +969,16 @@ cc->pass==10 is final pass, code is placed into buf.
ICU8(tempi,0xEF);
}
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
ICU8(tempi,0xEF);
}
break;
case IC_OUT_U16:
if (tempi->a2.type&TY_MASK==TY_IMM) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
if (tempi->a2.type&MDF_IMM) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
if (tempi->a2.disp<=MAX_U8)
ICU24(tempi,0xE700+OC_OP_SIZE_PREFIX+tempi->a2.disp<<16);
@@ -1050,23 +987,16 @@ cc->pass==10 is final pass, code is placed into buf.
ICU16(tempi,0xEF00+OC_OP_SIZE_PREFIX);
}
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
ICU16(tempi,0xEF00+OC_OP_SIZE_PREFIX);
}
break;
case IC_OUT_U8:
if (tempi->a2.type&TY_MASK==TY_IMM) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
if (tempi->a2.type&MDF_IMM) {
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
if (tempi->a2.disp<=MAX_U8)
ICU16(tempi,0xE6+tempi->a2.disp<<8);
@@ -1075,17 +1005,10 @@ cc->pass==10 is final pass, code is placed into buf.
ICU8(tempi,0xEE);
}
} else {
if (tempi->ic_flags & ICF_A1_FIRST) {
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
} else {
ICMov(tempi,TY_REG+RT_I64,REG_RDX,0,
tempi->a2.type,tempi->a2.reg,tempi->a2.disp,ip2);
ICMov(tempi,TY_REG+RT_I64,REG_RAX,0,
ICMov(tempi,MDF_REG+RT_I64,REG_RAX,0,
tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2);
}
ICU8(tempi,0xEE);
}
break;
@@ -1105,9 +1028,9 @@ cc->pass==10 is final pass, code is placed into buf.
break;
case IC_CALL_END:
ICPopRegs(tempi,tempi->ic_data);
if (tempi->r.type&TY_MASK)
if (tempi->r.type.mode)
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip2);
MDF_REG+RT_I64,REG_RAX,0,ip2);
break;
case IC_POP_REGS:
ICPopRegs(tempi,tempi->ic_data);
@@ -1122,24 +1045,24 @@ cc->pass==10 is final pass, code is placed into buf.
ICPut(cc,tempi);
LexExcept(cc,"Compiler Optimization Error at ");
}
if (tempi->r.type&TY_MASK) {
if (tempi->r.type.mode) {
if (tempi->ic_flags & ICF_R_TO_F64) {
if (tempi->ic_code==IC_PUSH_CMP) {
ICU24(tempi,0xDC8B48);
ICU24(tempi,0x2BDF48);
ICU24(tempi,0x1BDD48);
ICU8(tempi,0x9B);
ICU24(tempi,0x242CDF); //FILD U64 [RSP]
ICU24(tempi,0x241CDD); //FSTP U64 [RSP]
} else {
ICFCvt(cc,tempi,REG_RAX,tempi->r.type,tempi->r.reg,tempi->r.disp,
FALSE,CN_R,ip2);
if (!Bt(&tempi->ic_flags,ICf_DONT_POP_FLOAT0+
cc->cur_ic_float_op_num-1))
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip2);
MDF_REG+RT_I64,REG_RAX,0,ip2);
}
} else if (tempi->ic_flags & ICF_R_TO_INT) {
ICFCvt(cc,tempi,REG_RAX,tempi->r.type,tempi->r.reg,tempi->r.disp,
TRUE,CN_R,ip2);
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
TY_REG+RT_I64,REG_RAX,0,ip2);
MDF_REG+RT_I64,REG_RAX,0,ip2);
}
}
}
+32 -34
View File
@@ -203,7 +203,7 @@ pe_do_binary_op:
tempc=OptClassFwd(tempi->ic_class);
if (intermediate_code_table[tempi->ic_code].type!=IST_DEREF ||
!tempc->ptr_stars_cnt && !Bt(&tempc->flags,Cf_INTERNAL_TYPE))
LexExcept(cc,"invalid lval at ");
LexExcept(cc,"Invalid lval at ");
tempi->ic_code=IC_NOP1; //Important for setting class (pretty sure)
cur_op.u8[2]=PREC_ASSIGN|ASSOCF_RIGHT;
}
@@ -302,7 +302,7 @@ U0 PrsSizeOf(CCmpCtrl *cc)
CDbgInfo *dbg_info;
I64 i;
if (cc->token!=TK_IDENT)
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
if (tempm=cc->local_var_entry) {
tempc=tempm->member_class;
i=tempc->size*tempm->dim.total_cnt;
@@ -312,7 +312,7 @@ U0 PrsSizeOf(CCmpCtrl *cc)
if (!(tempc=cc->hash_entry) || !(tempc->type &
(HTT_CLASS|HTT_INTERNAL_TYPE|HTT_GLBL_VAR|
HTT_FUN|HTT_EXPORT_SYS_SYM)))
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
if (tempc->type&(HTT_FUN|HTT_EXPORT_SYS_SYM)) {
if (!(dbg_info=tempc(CHashFun *)->dbg_info))
LexExcept(cc,"Size not defined at ");
@@ -324,11 +324,11 @@ U0 PrsSizeOf(CCmpCtrl *cc)
while (Lex(cc)=='.') {
pu_sizeof_member:
if (!(tempc->type & (HTT_CLASS|HTT_GLBL_VAR)))
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
else if (tempc->type & HTT_GLBL_VAR)
tempc=tempc(CHashGlblVar *)->var_class;
if (Lex(cc)!=TK_IDENT || !(tempm=MemberFind(cc->cur_str,tempc)))
LexExcept(cc,"invalid member at ");
LexExcept(cc,"Invalid member at ");
else if (cc->local_var_entry)
cc->local_var_entry->use_cnt--;
tempc=tempm->member_class;
@@ -351,22 +351,22 @@ U0 PrsOffsetOf(CCmpCtrl *cc)
CMemberLst *tempm;
I64 i;
if (cc->token!=TK_IDENT)
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
if (tempm=cc->local_var_entry)
tempc=tempm->member_class;
else {
tempc=cc->hash_entry;
if (!tempc || !(tempc->type & (HTT_CLASS|HTT_GLBL_VAR)))
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
else if (tempc->type & HTT_GLBL_VAR)
tempc=tempc(CHashGlblVar *)->var_class;
}
if (Lex(cc)!='.')
LexExcept(cc,"expecting '.' at ");
LexExcept(cc,"Expecting '.' at ");
i=0;
do {
if (Lex(cc)!=TK_IDENT || !(tempm=MemberFind(cc->cur_str,tempc)))
LexExcept(cc,"invalid member at ");
LexExcept(cc,"Invalid member at ");
else if (cc->local_var_entry)
cc->local_var_entry->use_cnt--;
i+=tempm->offset;
@@ -437,13 +437,13 @@ I64 PrsFunCall(CCmpCtrl *cc,CPrsStk *ps,Bool indirect,CHashFun *tempf)
if (cc->token==',')
Lex(cc);
else if (cc->token!=';')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
} else {
if (needs_right_paren) {
if (cc->token==',')
Lex(cc);
else if (cc->token!=')')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
}
}
}
@@ -494,7 +494,7 @@ I64 PrsFunCall(CCmpCtrl *cc,CPrsStk *ps,Bool indirect,CHashFun *tempf)
if (cc->token==',')
Lex(cc);
else
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
}
COCInit(cc);
if (!PrsExpression(cc,NULL,FALSE,ps))
@@ -511,7 +511,7 @@ I64 PrsFunCall(CCmpCtrl *cc,CPrsStk *ps,Bool indirect,CHashFun *tempf)
if (cc->token==',')
Lex(cc);
else
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
}
COCInit(cc);
if (!PrsExpression(cc,NULL,FALSE,ps))
@@ -528,7 +528,7 @@ I64 PrsFunCall(CCmpCtrl *cc,CPrsStk *ps,Bool indirect,CHashFun *tempf)
if (cc->token==')')
Lex(cc);
else
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
}
tempcbh1=tempcbh->coc_next;
tempcbh->coc_next=cc->coc.coc_next;
@@ -622,8 +622,7 @@ I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
if (Bt(&tempf->flags,Cf_EXTERN)) {
if (cc->flags&CCF_AOT_COMPILE) {
if (cc->flags&CCF_ASM_EXPRESSIONS) {
if (tempex=HashFind(
tempf->str,cc->htc.hash_table_lst,
if (tempex=HashFind(tempf->str,cc->htc.hash_table_lst,
HTT_EXPORT_SYS_SYM))
goto pu_export_sys_sym;
else
@@ -634,8 +633,7 @@ I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
cc->abs_cnts.externs++;
ICAdd(cc,IC_IMM_I64,
&tempf->executable_addr,cmp.internal_types[RT_PTR]);
ICAdd(cc,IC_DEREF,0,
cmp.internal_types[RT_PTR]);
ICAdd(cc,IC_DEREF,0,cmp.internal_types[RT_PTR]);
} else {
if (cc->flags&CCF_AOT_COMPILE) {
ICAdd(cc,IC_ABS_ADDR,
@@ -673,7 +671,7 @@ I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
return PE_UNARY_TERM2;
sub_switch_start:
case TK_INTEGER:
case TK_INT:
case TK_CHAR_CONST:
case TK_INS_BIN_SIZE:
if (cc->cur_i64<0)
@@ -737,7 +735,7 @@ I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
if (!paren_warn)
*paren_prec=PREC_NULL;
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc); //skip )
cc->flags= cc->flags & ~CCF_ARRAY | CCF_RAX | CCF_PAREN;
return PE_UNARY_MODIFIERS;
@@ -782,7 +780,7 @@ I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
i=PrsPop(ps);
ps->ptr--;
if (i.u16[0]!=IC_ADDR)
LexExcept(cc,"expecting '&' at ");
LexExcept(cc,"Expecting '&' at ");
ICAdd(cc,IC_IMM_I64,tempm->offset,cmp.internal_types[RT_PTR]);
*_local_var=tempm;
Lex(cc);
@@ -805,7 +803,7 @@ I64 PrsUnaryTerm(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
pu_ident_but_not_local_var:
if (!(tempex=cc->hash_entry)) {
if (!(cc->flags & CCF_ASM_EXPRESSIONS))
LexExcept(cc,"invalid lval at ");
LexExcept(cc,"Invalid lval at ");
tempc=NULL;
pu_new_sys_sym:
tempex=CAlloc(sizeof(CHashExport),Fs->code_heap);
@@ -912,7 +910,7 @@ pu_export_sys_sym:
PrsSizeOf(cc);
while (j--) {
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc);
}
return PE_MAYBE_MODIFIERS;
@@ -925,7 +923,7 @@ pu_export_sys_sym:
PrsOffsetOf(cc);
while (j--) {
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc);
}
return PE_MAYBE_MODIFIERS;
@@ -943,14 +941,14 @@ pu_export_sys_sym:
Lex(cc);
while (j--) {
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc);
}
return PE_MAYBE_MODIFIERS;
}
}
}
LexExcept(cc,"missing expression at ");
LexExcept(cc,"Missing expression at ");
}
I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
@@ -987,10 +985,10 @@ I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
if (!(cc->flags & CCF_RAX))
tempc--;
if (!(tempc->type & HTT_CLASS))
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
if (Lex(cc)!=TK_IDENT ||
!(tempm=MemberFind(cc->cur_str,tempc)))
LexExcept(cc,"invalid member at ");
LexExcept(cc,"Invalid member at ");
else if (cc->local_var_entry)
cc->local_var_entry->use_cnt--;
Lex(cc); //skip member name
@@ -1017,7 +1015,7 @@ I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
if (!*unary_post_prec)
*unary_post_prec=PREC_TERM;
if (Lex(cc)!=TK_IDENT)
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
if (Btr(&cc->flags,CCf_FUN_EXP))
ps->ptr2--;
cc->flags&=~CCF_ARRAY;
@@ -1044,7 +1042,7 @@ I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
tempi->ic_class=tempc;
ICAdd(cc,IC_HOLYC_TYPECAST,was_paren,tempc);
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc);
return PE_UNARY_MODIFIERS;
case '[':
@@ -1053,11 +1051,11 @@ I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
Lex(cc);
tempc=OptClassFwd(cc->coc.coc_root.last->ic_class);
if (!tempc->ptr_stars_cnt)
LexExcept(cc,"not array or ptr ");
LexExcept(cc,"Not array or ptr ");
if (!(cc->flags & (CCF_ARRAY | CCF_RAX))) {
tempc=OptClassFwd(tempc-1);
if (!tempc->ptr_stars_cnt)
LexExcept(cc,"not array or ptr ");
LexExcept(cc,"Not array or ptr ");
ICAdd(cc,IC_DEREF+PREC_UNARY_PRE<<16,0,tempc);
}
tempc1=tempc-1;
@@ -1069,7 +1067,7 @@ I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
throw('Compiler');
cc->flags=cc->flags&~CCF_FUN_EXP|old_flags&CCF_FUN_EXP;
if (cc->token!=']')
LexExcept(cc,"missing ']' at ");
LexExcept(cc,"Missing ']' at ");
Lex(cc); //skip ]
tempi1=cc->coc.coc_root.last;
tempi1->ic_flags|=ICF_R_TO_INT;
@@ -1085,7 +1083,7 @@ I64 PrsUnaryModifier(CCmpCtrl *cc,CPrsStk *ps,CMemberLst **_local_var,
throw('Compiler');
cc->flags=cc->flags&~CCF_FUN_EXP|old_flags&CCF_FUN_EXP;
if (cc->token!=']')
LexExcept(cc,"missing ']' at ");
LexExcept(cc,"Missing ']' at ");
Lex(cc); //skip ]
tempi1=cc->coc.coc_root.last;
tempi1->ic_flags|=ICF_R_TO_INT;
+49 -49
View File
@@ -2,7 +2,7 @@ CHashClass *PrsClass(CCmpCtrl *cc,I64 keyword,I64 fsp_flags,Bool is_extern)
{
CHashClass *tempc,*base_class;
if (cc->token!=TK_IDENT)
LexExcept(cc,"expecting identifier at ");
LexExcept(cc,"Expecting identifier at ");
if (is_extern) {
tempc=PrsClassNew;
tempc->str=cc->cur_str;
@@ -50,7 +50,7 @@ CHashClass *PrsClass(CCmpCtrl *cc,I64 keyword,I64 fsp_flags,Bool is_extern)
if (Lex(cc)==':') {
if (Lex(cc)!=TK_IDENT || !(base_class=cc->hash_entry) ||
!(base_class->type&HTT_CLASS))
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
if (Lex(cc)==',')
LexExcept(cc,"Only one base class allowed at this time at ");
tempc->base_class=base_class;
@@ -91,7 +91,7 @@ CHashFun *PrsFunJoin(CCmpCtrl *cc,
} else
tempf=NULL;
if (tempf) {
tempf->used_reg_mask=REGG_C_CLOBBERED+REGG_SAVED+REGG_C_TEMP_CLOBBERED;
tempf->used_reg_mask=REGG_CLOBBERED+REGG_SAVED+REGG_STK_TEMP;
Free(tempf->src_link);
tempf->src_link=NULL;
Free(tempf->index);
@@ -100,8 +100,8 @@ CHashFun *PrsFunJoin(CCmpCtrl *cc,
MemberLstDel(tempf);
} else {
tempf=PrsFunNew;
tempf->used_reg_mask=REGG_C_CLOBBERED+REGG_SAVED+REGG_C_TEMP_CLOBBERED;
tempf->clobbered_reg_mask=REGG_C_CLOBBERED+REGG_C_TEMP_CLOBBERED;
tempf->used_reg_mask=REGG_CLOBBERED+REGG_SAVED+REGG_STK_TEMP;
tempf->clobbered_reg_mask=REGG_CLOBBERED+REGG_STK_TEMP;
tempf->str=name;
if (cc->flags&CCF_AOT_COMPILE)
tempf->executable_addr=aotc->ip;
@@ -214,9 +214,8 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tempc,
while (TRUE) {
tempc=PrsType(cc,&saved_tempc,&saved_mode,NULL,&st,
&tempf_fun_ptr,&tempex,&tempad,fsp_flags);
if (!st)
return;
if (!st) return;
if (tempad.next)
is_array=TRUE;
else if (tempad.total_cnt<0) {
@@ -352,7 +351,7 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tempc,
tempg->type=HTT_GLBL_VAR | HTF_EXPORT;
if (tempex && tempex->type & HTT_GLBL_VAR)
has_alias=TRUE;
if (sys_var_init_flag&1)
if (sys_var_init_flag)
for (k=0;k<j;k++)
AOTStoreCodeU8(cc,sys_var_init_val);
else
@@ -373,7 +372,7 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tempc,
tempex->type&HTF_UNRESOLVED &&
MHeapCtrl(tempex)==MHeapCtrl(tempg))
has_alias=TRUE;
if (sys_var_init_flag&1)
if (sys_var_init_flag)
MemSet(tempg->data_addr,sys_var_init_val,j);
}
}
@@ -413,14 +412,14 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tempc,
if (temphg)
temphg->size=tempg->size;
if (cc->flags&CCF_AOT_COMPILE) {
if (sys_var_init_flag&1)
if (sys_var_init_flag)
for (k=0;k<tempg->size;k++)
AOTStoreCodeU8(cc,sys_var_init_val);
else
for (k=0;k<tempg->size;k++)
AOTStoreCodeU8(cc,0);
} else
if (sys_var_init_flag&1)
if (sys_var_init_flag)
MemSet(tempg->data_addr,sys_var_init_val,k);
LexPopRestore(cc);
}
@@ -445,7 +444,7 @@ U0 PrsGlblVarLst(CCmpCtrl *cc,I64 saved_mode,CHashClass *saved_tempc,
Lex(cc);
else {
if (cc->token!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc);
return;
}
@@ -458,12 +457,12 @@ U0 PrsIf(CCmpCtrl *cc,I64 try_cnt,CCodeMisc *lb_break)
CCodeMisc *lb,*lb1;
I64 k;
if (cc->token!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
Lex(cc);
if (!PrsExpression(cc,NULL,FALSE))
throw('Compiler');
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc);
lb=COCMiscNew(cc,CMT_LABEL);
ICAdd(cc,IC_BR_ZERO,lb,0);
@@ -484,14 +483,14 @@ U0 PrsWhile(CCmpCtrl *cc,I64 try_cnt)
{
CCodeMisc *lb,*lb_done;
if (cc->token!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
Lex(cc);
lb=COCMiscNew(cc,CMT_LABEL);
ICAdd(cc,IC_LABEL,lb,0);
if (!PrsExpression(cc,NULL,FALSE))
throw('Compiler');
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc);
lb_done=COCMiscNew(cc,CMT_LABEL);
ICAdd(cc,IC_BR_ZERO,lb_done,0);
@@ -508,18 +507,18 @@ U0 PrsDoWhile(CCmpCtrl *cc,I64 try_cnt)
ICAdd(cc,IC_LABEL,lb,0);
PrsStmt(cc,try_cnt,lb_done);
if (PrsKeyWord(cc)!=KW_WHILE)
LexExcept(cc,"missing 'while' at");
LexExcept(cc,"Missing 'while' at");
if (Lex(cc)!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
Lex(cc);
if (!PrsExpression(cc,NULL,FALSE))
throw('Compiler');
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
ICAdd(cc,IC_BR_NOT_ZERO,lb,0);
ICAdd(cc,IC_LABEL,lb_done,0);
if (Lex(cc)!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc);
}
@@ -529,7 +528,7 @@ U0 PrsFor(CCmpCtrl *cc,I64 try_cnt)
CCodeMisc *lb,*lb_done;
if (cc->token!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
Lex(cc);
PrsStmt(cc,try_cnt);
@@ -540,7 +539,7 @@ U0 PrsFor(CCmpCtrl *cc,I64 try_cnt)
lb_done=COCMiscNew(cc,CMT_LABEL);
ICAdd(cc,IC_BR_ZERO,lb_done,0);
if (cc->token!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc);
COCPush(cc);
@@ -551,7 +550,7 @@ U0 PrsFor(CCmpCtrl *cc,I64 try_cnt)
tempcbh=COCPopNoFree(cc);
COCPop(cc);
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
Lex(cc);
PrsStmt(cc,try_cnt,lb_done);
@@ -586,7 +585,7 @@ U0 PrsSwitch(CCmpCtrl *cc,I64 try_cnt)
else if (cc->token=='[')
nobound=TRUE;
else
LexExcept(cc,"expecting '(' or '[' at ");
LexExcept(cc,"Expecting '(' or '[' at ");
Lex(cc);
QueInit(&root);
@@ -605,14 +604,14 @@ U0 PrsSwitch(CCmpCtrl *cc,I64 try_cnt)
if (nobound) {
ICAdd(cc,IC_NOBOUND_SWITCH,mc_jt,0);
if (cc->token!=']')
LexExcept(cc,"missing ']' at ");
LexExcept(cc,"Missing ']' at ");
} else {
ICAdd(cc,IC_SWITCH,mc_jt,0);
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
}
if (Lex(cc)!='{')
LexExcept(cc,"expecting '{' at ");
LexExcept(cc,"Expecting '{' at ");
Lex(cc);
ICAdd(cc,IC_LABEL,mc_jt->begin,0);
while (TRUE) {
@@ -625,7 +624,7 @@ sw_cont:
if (Lex(cc)==':')
Lex(cc);
else
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
tempss=MAlloc(sizeof(CSubSwitch));
QueIns(tempss,root.last);
root.last->lb_break=COCMiscNew(cc,CMT_LABEL);
@@ -707,10 +706,11 @@ sw_cont:
temps->next=header;
header=temps;
}
k_start=k_end;
} else
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
} else
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
break;
case KW_DFT:
if (root.next!=&root) {
@@ -722,7 +722,7 @@ sw_cont:
if (cc->token==':')
Lex(cc);
else
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
if (root.next!=&root) {
tempss=root.next;
while (tempss!=&root) {
@@ -743,18 +743,18 @@ sw_sub_end:
ICAdd(cc,IC_LABEL,tempss->lb_break,0);
if (tempss==&root) {
if (cc->token!='}')
LexExcept(cc,"missing '}' at ");
LexExcept(cc,"Missing '}' at ");
Lex(cc);
break;
} else {
QueRem(tempss);
Free(tempss);
if (PrsKeyWord(cc)!=KW_SUB_SWITCH_END)
LexExcept(cc,"missing 'sub_switch_end' at ");
LexExcept(cc,"Missing 'sub_switch_end' at ");
if (Lex(cc)==':')
Lex(cc);
else
LexExcept(cc,"expecting ':' at ");
LexExcept(cc,"Expecting ':' at ");
}
}
if (!dft_found)
@@ -789,12 +789,12 @@ U0 PrsNoUnusedWarn(CCmpCtrl *cc)
CMemberLst *tempm;
while (cc->token==TK_IDENT) {
if (!(tempm=cc->local_var_entry))
LexExcept(cc,"expecting local var at ");
LexExcept(cc,"Expecting local var at ");
tempm->flags|=MLF_NO_UNUSED_WARN;
if (Lex(cc)==',')
Lex(cc);
else if (cc->token!=';')
LexExcept(cc,"expecting ',' at ");
LexExcept(cc,"Expecting ',' at ");
}
}
@@ -817,7 +817,7 @@ U0 PrsStreamBlk(CCmpCtrl *cc)
if (cc->token=='{')
Lex(cc);
else
LexExcept(cc,"missing '}' at ");
LexExcept(cc,"Missing '}' at ");
while (cc->token && cc->token!='}')
ExeCmdLine(cc);
@@ -888,7 +888,7 @@ U0 PrsTryBlk(CCmpCtrl *cc,I64 try_cnt)
ICAdd(cc,IC_JMP,lb_done,0);
if (PrsKeyWord(cc)!=KW_CATCH)
LexExcept(cc,"missing 'catch' at");
LexExcept(cc,"Missing 'catch' at");
Lex(cc);
ICAdd(cc,IC_LABEL,lb_catch,0);
@@ -995,26 +995,26 @@ Bool PrsStmt(CCmpCtrl *cc,I64 try_cnt=0,
if (cc->flags&CCF_AOT_COMPILE) {
if (cc->token!=TK_IDENT || !(tempex=cc->hash_entry) ||
!(tempex->type & HTT_EXPORT_SYS_SYM))
LexExcept(cc,"expecting System sym at ");
LexExcept(cc,"Expecting System sym at ");
i=tempex->val;
Lex(cc);
} else
i=LexExpressionI64(cc);
if (cc->token!=TK_IDENT || !(tempex=cc->hash_entry) ||
!(tempex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
Lex(cc);
PrsGlblVarLst(cc,PRS0__EXTERN|PRS1_NULL,tempex,i,fsp_flags);
break;
case KW__IMPORT:
sm_underscore_import:
if (cc->token!=TK_IDENT)
LexExcept(cc,"expecting System sym at ");
LexExcept(cc,"Expecting System sym at ");
import_name=cc->cur_str;
cc->cur_str=0;
if (Lex(cc)!=TK_IDENT || !(tempex=cc->hash_entry) ||
!(tempex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
Lex(cc);
PrsGlblVarLst(cc,PRS0__IMPORT|PRS1_NULL,tempex,
import_name,FALSE);
@@ -1022,7 +1022,7 @@ sm_underscore_import:
break;
case KW_EXTERN:
if (cc->token!=TK_IDENT)
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
tempex=cc->hash_entry;
i=PrsKeyWord(cc);
if (i==KW_CLASS||i==KW_UNION) {
@@ -1033,7 +1033,7 @@ sm_underscore_import:
}
if (!tempex ||
!(tempex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
if (Bt(&cc->opts,OPTf_EXTERNS_TO_IMPORTS))
goto sm_import;
Lex(cc);
@@ -1042,7 +1042,7 @@ sm_underscore_import:
case KW_IMPORT:
if (cc->token!=TK_IDENT || !(tempex=cc->hash_entry) ||
!(tempex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
sm_import:
Lex(cc);
PrsGlblVarLst(cc,PRS0_IMPORT|PRS1_NULL,tempex,0,FALSE);
@@ -1051,7 +1051,7 @@ sm_import:
i=LexExpressionI64(cc);
if (cc->token!=TK_IDENT || !(tempex=cc->hash_entry) ||
!(tempex->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
Lex(cc);
PrsGlblVarLst(cc,PRS0__INTERN|PRS1_NULL,tempex,i,fsp_flags);
break;
@@ -1115,7 +1115,7 @@ sm_import:
goto sm_semicolon;
case KW_GOTO:
if (Lex(cc)!=TK_IDENT)
LexExcept(cc,"expecting identifier at ");
LexExcept(cc,"Expecting identifier at ");
if (!(g_lb=COCGoToLabelFind(cc,cc->cur_str))) {
g_lb=COCMiscNew(cc,CMT_GOTO_LABEL);
g_lb->str=cc->cur_str;
@@ -1188,7 +1188,7 @@ sm_not_keyword_afterall:
if (Lex(cc)==':') //skip cur_str
Lex(cc); //skip colon
else
LexExcept(cc,"undefined identifier at ");
LexExcept(cc,"Undefined identifier at ");
if (!cc->htc.fun)
LexExcept(cc,"No global labels at ");
if (cc->token!=',') goto sm_done;
@@ -1205,7 +1205,7 @@ sm_semicolon:
if (cc->token==';')
Lex(cc);
else if (cc->token!=',')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
}
if (cc->token!=',') goto sm_done;
} else
+17 -17
View File
@@ -13,7 +13,7 @@ U0 PrsVarInit(CCmpCtrl *cc,U8 **_dst,CHashClass *tempc,CArrayDim *tempad,
tempc=OptClassFwd(tempc);
if (tempm=tempc->member_lst_and_root) {
if (cc->token!='{')
LexExcept(cc,"expecting '{' at ");
LexExcept(cc,"Expecting '{' at ");
LexPopNoRestore(cc);
LexPush(cc);
Lex(cc);
@@ -26,7 +26,7 @@ U0 PrsVarInit(CCmpCtrl *cc,U8 **_dst,CHashClass *tempc,CArrayDim *tempad,
}
LexPopNoRestore(cc);
if (cc->token!='}')
LexExcept(cc,"missing '}' at ");
LexExcept(cc,"Missing '}' at ");
Lex(cc);
} else {
if (tempc->ptr_stars_cnt==1 &&
@@ -278,7 +278,7 @@ Bool PrsArrayDims(CCmpCtrl *cc,I64 mode,CArrayDim *dim)
tempad->total_cnt=1;
dim->total_cnt*=j;
if (cc->token!=']')
LexExcept(cc,"missing ']' at ");
LexExcept(cc,"Missing ']' at ");
} while (Lex(cc)=='[');
}
return result;
@@ -296,7 +296,7 @@ CHashClass *PrsType(CCmpCtrl *cc,CHashClass **_tempc1,
pt_start:
if (!tempc1 || !(tempc1->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"invalid class at ");
LexExcept(cc,"Invalid class at ");
ptr_stars_cnt=0;
while (cc->token=='*') {
@@ -323,7 +323,7 @@ CHashClass *PrsType(CCmpCtrl *cc,CHashClass **_tempc1,
if (cc->token=='(') {
if (Lex(cc)!='*')
LexExcept(cc,"expecting '*' at ");
LexExcept(cc,"Expecting '*' at ");
ptr_stars_cnt=1; //fun_ptr
while (Lex(cc)=='*')
ptr_stars_cnt++; //fun_ptr
@@ -346,15 +346,15 @@ CHashClass *PrsType(CCmpCtrl *cc,CHashClass **_tempc1,
*_ident=StrNew("_anon_");
tempm->flags|=MLF_NO_UNUSED_WARN;
} else
LexExcept(cc,"expecting identifier at ");
LexExcept(cc,"Expecting identifier at ");
}
}
if (ptr_stars_cnt>=0) { //fun_ptr
if (cc->token!=')')
LexExcept(cc,"missing ')' at ");
LexExcept(cc,"Missing ')' at ");
if (Lex(cc)!='(')
LexExcept(cc,"expecting '(' at ");
LexExcept(cc,"Expecting '(' at ");
fun_ptr=PrsFunJoin(cc,tempc1,NULL,fsp_flags)+ptr_stars_cnt;
tempc1=cmp.internal_types[RT_PTR]+ptr_stars_cnt;
}
@@ -437,7 +437,7 @@ U0 PrsVarLst(CCmpCtrl *cc,CHashClass *tempc,I64 mode,I64 union_base=0)
cc->class_ip=tempc->size;
while (cc->token=='$$') {
if (Lex(cc)!='=') //skip $$
LexExcept(cc,"expecting '=' at ");
LexExcept(cc,"Expecting '=' at ");
Lex(cc); //skip =
cc->class_ip=LexExpression(cc);
if (-cc->class_ip>tempc->neg_offset)
@@ -447,7 +447,7 @@ U0 PrsVarLst(CCmpCtrl *cc,CHashClass *tempc,I64 mode,I64 union_base=0)
else
tempc->size=cc->class_ip;
if (cc->token!=';')
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
Lex(cc); //skip ;
}
if (cc->token==')' || cc->token=='}') {
@@ -482,14 +482,14 @@ pvl_restart1:
else
temph=NULL;
if (!temph)
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
k=PrsKeyWord(cc);
if (k==KW_UNION) {
Lex(cc);
PrsVarLst(cc,tempc,mode|PRSF_UNION,tempc->size);
} else {
if (!(temph->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
LexExcept(cc,"expecting type at ");
LexExcept(cc,"Expecting type at ");
first=TRUE;
pvl_restart2:
tempc1=temph;
@@ -555,7 +555,7 @@ pvl_restart3:
if (cc->flags&CCF_AOT_COMPILE) {
tempm->static_data_ip=cc->aotc->ip;
k>>=3;
if (sys_var_init_flag&1) {
if (sys_var_init_flag) {
k<<=3;
while (k--)
AOTStoreCodeU8(cc,sys_var_init_val);
@@ -563,7 +563,7 @@ pvl_restart3:
while (k--)
AOTStoreCodeU64(cc,0);
} else
if (sys_var_init_flag&1)
if (sys_var_init_flag)
MemSet(tempm->static_data,sys_var_init_val,k);
LexPopNoRestore(cc);
if (cc->token=='=') {
@@ -579,7 +579,7 @@ pvl_restart3:
k=(i+7)&~7;
if (cc->flags&CCF_AOT_COMPILE) {
k>>=3;
if (sys_var_init_flag&1) {
if (sys_var_init_flag) {
k<<=3;
while (k--)
AOTStoreCodeU8(cc,sys_var_init_val);
@@ -587,7 +587,7 @@ pvl_restart3:
while (k--)
AOTStoreCodeU64(cc,0);
} else
if (sys_var_init_flag&1)
if (sys_var_init_flag)
MemSet(tempm->static_data,sys_var_init_val,k);
LexPopRestore(cc);
}
@@ -724,7 +724,7 @@ pvl_restart3:
goto pvl_done;
break;
default:
LexExcept(cc,"missing ';' at");
LexExcept(cc,"Missing ';' at");
}
}
}
+23 -27
View File
@@ -1,4 +1,4 @@
I64 InstEntriesCompare(CInstruction *tempi1,CInstruction *tempi2)
I64 InstEntriesCompare(CInst *tempi1,CInst *tempi2)
{
I64 i1,i2,j=0,result=0,oc_cnt1=tempi1->opcode_cnt,oc_cnt2=tempi2->opcode_cnt;
if (tempi1->flags&IEF_STI_LIKE)
@@ -44,9 +44,9 @@ I64 InstEntriesCompare(CInstruction *tempi1,CInstruction *tempi2)
}
/*
U0 DumpUAsmIns(CInstruction *tempi)
U0 DumpUAsmIns(CInst *tempi)
{
CHashOpcode *tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInstruction)
CHashOpcode *tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInst)
-offset(CHashOpcode.ins);
"%10s:%02d,%02d SV:%02d\n",tempo->str,
tempi->arg1,tempi->arg2,tempi->slash_val;
@@ -63,10 +63,10 @@ U0 DumpUAsmTables()
}
*/
CInstruction *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
CInst *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
{//Binary Search
I64 i,j,n,m,k,a1,a2,o1,o2,oc_cnt;
CInstruction *tempi,**table;
CInst *tempi,**table;
i=0;
if (seg_size==64) {
table=uasm.table_64;
@@ -123,7 +123,9 @@ CInstruction *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
tempi->flags&IEF_48_REX)
m=-1;
}
}
} else if ((Bt(&uasm.mem_arg_mask,a1)||Bt(&uasm.mem_arg_mask,a2)) &&
ip[n]&0xC0==0xC0)
m=1;
goto ief_compare_done;
case SV_I_REG:
m=ip[n]>>3-tempi->opcode[tempi->opcode_cnt-1]>>3;
@@ -147,10 +149,8 @@ CInstruction *InstEntryFind(U8 *ip,I64 opsize,I64 seg_size)
}
}
if (opsize==64 || a1==ARGT_M64 || a2==ARGT_M64) {
if (!Bt(&uasm.ins64_arg_mask,a1) &&
!Bt(&uasm.ins64_arg_mask,a2) &&
!(tempi->flags&IEF_48_REX)&&
!(a2==ARGT_NO &&
if (!Bt(&uasm.ins64_arg_mask,a1) &&!Bt(&uasm.ins64_arg_mask,a2) &&
!(tempi->flags&IEF_48_REX)&& !(a2==ARGT_NO &&
(ARGT_UIMM8<=a1<=ARGT_UIMM64 || ARGT_IMM8<=a1<=ARGT_IMM64)))
m=1;
else if (tempi->arg2==ARGT_IMM64 || tempi->arg2==ARGT_UIMM64) {
@@ -188,7 +188,7 @@ ief_compare_done:
U0 UAsmHashLoad()
{
CHashOpcode *temph;
CInstruction *tempi;
CInst *tempi;
I64 i,j1,j2,k;
uasm.ins64_arg_mask=0x0880888880+1<<ARGT_ST0+1<<ARGT_STI;
@@ -200,9 +200,9 @@ U0 UAsmHashLoad()
for (i=0;i<=cmp.asm_hash->mask;i++) {
temph=cmp.asm_hash->body[i];
while (temph) {
if (temph->type==HTT_OPCODE) {
if (temph->type==HTT_OPCODE && !(temph->oc_flags&OCF_ALIAS)) {
tempi=&temph->ins;
for (k=0;k<temph->instruction_entry_cnt;k++) {
for (k=0;k<temph->inst_entry_cnt;k++) {
uasm.table_16_32_entries++;
if (!(tempi->flags&IEF_NOT_IN_64_BIT))
uasm.table_64_entries++;
@@ -219,9 +219,9 @@ U0 UAsmHashLoad()
for (i=0;i<=cmp.asm_hash->mask;i++) {
temph=cmp.asm_hash->body[i];
while (temph) {
if (temph->type==HTT_OPCODE) {
if (temph->type==HTT_OPCODE && !(temph->oc_flags&OCF_ALIAS)) {
tempi=&temph->ins;
for (k=0;k<temph->instruction_entry_cnt;k++) {
for (k=0;k<temph->inst_entry_cnt;k++) {
uasm.table_16_32[j1++]=tempi;
if (!(tempi->flags&IEF_NOT_IN_64_BIT))
uasm.table_64[j2++]=tempi;
@@ -236,14 +236,14 @@ U0 UAsmHashLoad()
}
U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
{//Unassembles one instruction
{//Unassembles one inst
I64 i,disp,imm,opsize,opadd,
a1,a2,reloced_a1,reloced_a2,
a1_size=0,a2_size=0,reloced_a1_size,reloced_a2_size,
ModrM=-1,SIB=-1,scale,r1,r2,
Mod=-1,RM1=-1,RM2=-1,REX=-1,REX_r=0,REX_x=0,REX_b=0;
Bool cont;
CInstruction *tempi,*tempi2;
CInst *tempi,*tempi2;
CHashOpcode *tempo;
U8 *ip=*_ip,*ptr,*reloced_a1_st,*reloced_a2_st,
*bin_data_area1,*bin_data_area2,
@@ -328,14 +328,13 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
tempi=InstEntryFind(ip,opsize,seg_size);
if (opsize==32 && seg_size==64) {
tempi2=InstEntryFind(ip,64,seg_size);
if (tempi2!=tempi &&
tempi2->flags&IEF_REX_ONLY_R8_R15 ||
if (tempi2!=tempi && tempi2->flags&IEF_REX_ONLY_R8_R15 ||
tempi2->flags&IEF_REX_XOR_LIKE&& ip[1]>>3&7==ip[1]&7)
tempi=tempi2;
}
ip+=tempi->opcode_cnt;
tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInstruction)
tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInst)
-offset(CHashOpcode.ins);
if (just_ins)
*line1=0;
@@ -393,12 +392,9 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
}
}
if (ARGT_RM8<=a1<=ARGT_RM64 ||
ARGT_M8<=a1<=ARGT_M64 ||
ARGT_RM8<=a2<=ARGT_RM64 ||
ARGT_M8<=a2<=ARGT_M64) {
if (ARGT_RM8<=a2<=ARGT_RM64 ||
ARGT_M8<=a2<=ARGT_M64) {
if (ARGT_RM8<=a1<=ARGT_RM64 || ARGT_M8<=a1<=ARGT_M64 ||
ARGT_RM8<=a2<=ARGT_RM64 || ARGT_M8<=a2<=ARGT_M64) {
if (ARGT_RM8<=a2<=ARGT_RM64 || ARGT_M8<=a2<=ARGT_M64) {
reloced_a1=a2;
reloced_a2=a1;
reloced_a1_size=a2_size;
@@ -647,7 +643,7 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE)
}
U8 *U(U8 *ip,I64 cnt=20,I64 seg_size=64)
{//Unassembles a num of instructions.
{//Unassembles a num of insts.
I64 i;
U8 buf[1024];
if (seg_size==16)
+1 -1
View File
@@ -7,7 +7,7 @@ Option(OPTf_WARN_DUP_TYPES,ON);
KbdTypeMatic(0);
// Las Vegas is -7 during summer, -8 during winter
local_time_offset=-8*60*60*CDATE_FREQ; //Pacific
local_time_offset=-7*60*60*CDATE_FREQ; //Pacific
// Remember you can set the time in the BIOS.
//$AN,"",A="mouse_move_scale"$adjust these to set mouse move scale
+10 -5
View File
@@ -1,5 +1,5 @@
$WW,1$$FG,5$$TX+CX,"TODO"$$FG$
* Investigate why packet loss $LK,"Training Sleep(1)",A="FF:::/Adam/Training.CPP,Sleep(1)"$.
* Add AVL or red/black binary tree library support. We have fixed-size stack. Auto-balancing binary tree is very needed. I've done everything myself. I don't want to ruin a perfect record. I'm in no hurry.
@@ -37,7 +37,6 @@ $WW,1$$FG,5$$TX+CX,"TODO"$$FG$
* Bug: Find-and-replace text on $$PT$$ line before it.
* 12/25/2015 Copy-Paste index.html glitch if source window 40 columns.
* 01/10/2016 find-replace editor hung on $LK,"CounterRenaissance",A="FI:::/Home/Web/TAD/CounterRenaissance.TXT"$ "Rennaisance"
* 01/06/2016 Editor filter "str" applied to output from LineRep looks broken.
* Document, perhaps with video, $LK,"GetStr",A="MN:GetStr"$() all the way down into $LK,"PutKey",A="MN:PutKey"$() code.
@@ -104,6 +103,8 @@ $FG,5$$TX+CX,"TODO: Too Hard, or Not Worth Doing."$$FG$
* Log-to-file is inefficient because we load and save whole file.
* $LK,"ICMov",A="MN:ICMov"$() $LK,"PUSH_CMP",A="FF:::/Compiler/BackLib.CPP,PUSH_CMP"$ and $LK,"MDf_STK",A="MN:MDf_STK"$? Perhaps, it's okay.
* Short FAT32 ~ names.
* Compiler: Inline functions?
@@ -368,7 +369,7 @@ and blotted at the end.
* static var off of data heap.
* could add "const" to not set CCF_NOT_CONST flag for trig, etc.
* could make glblvar imports use TY_RIP_DISP32.
* could make glblvar imports use MDF_RIP_DISP32.
* PUSH_CMP allocs reg R9 or whatever
* Might be problem with NOP in OPT pass1 for NO_PUSH in expressions besides
assignments. Is ShiftNoPush fully implemented?
@@ -387,14 +388,16 @@ Lord does not repeat $TX,"Job 33:14",HTML="http://www.biblegateway.com/verse/e
Offer only in approved place $TX,"Deuteronomy 12:13-18",HTML="http://www.biblegateway.com/passage/?search=Deuteronomy%2012:13-18&version=NIV"$
Jesus' zeal for the Temple $TX,"John 2:14-19",HTML="http://www.biblegateway.com/passage/?search=John%202:14-19&version=NIV"$
Famine not for bread $TX,"Amos 8:11-12",HTML="http://www.biblegateway.com/passage/?search=Amos%208:11-12&version=NIV"$
To the honest, you are honest $TX,"Psalm 18:26",HTML="http://www.biblegateway.com/verse/en/Psalm%2018:26"$
Meek and humble of heart $TX,"Matthew 11:29",HTML="http://www.biblegateway.com/verse/en/Matthew%2011:29"$
MOses hgets Aaron $TX,"Exodus 4:10-16",HTML="http://www.biblegateway.com/passage/?search=Exodus%204:10-16&version=NIV"$
There is no council against the Lord $TX,"Proverbs 21:30",HTML="http://www.biblegateway.com/verse/en/Proverbs%2021:30"$
Human help is worthless $TX,"Psalm 108:12",HTML="http://www.biblegateway.com/verse/en/Psalm%20108:12"$
$FG,5$$TX+CX,"Misc Notes"$$FG$
Intel CEO's name: Brian Krzanich
>$FG,2$lspci -v$FG$
Size:$TX,"17364 KB",D="DD_TEMPLEOSCD_K_SIZE"$
Size:$TX,"17362 KB",D="DD_TEMPLEOSCD_K_SIZE"$
$FG,5$$TX+CX,"My Web Bookmarks"$$FG$$WW,0$
$TX,"My FireFox Bookmarks",HTML="http://www.templeos.org/Wb/Home/Downloads/Blog/Bookmarks"$
@@ -407,6 +410,7 @@ Pew Pew Pew $HC,"<center><img src=\"http://i.imgur.com/sMpJ0ch.jpg\" width=\"640
Iceberg $HC,"<center><img src=\"https://upload.wikimedia.org/wikipedia/commons/3/38/Blue_ice_in_South_Greenland_-_Visit_Greenland.jpg\" width=\"640\" height=\"480\" alt=\"\"></center>"$
I made dis $HC,"<center><img src=\"http://i.imgur.com/cZKkxTX.jpg\" width=\"640\" height=\"800\" alt=\"\"></center>"$
NIST Beacon $HC,"<center><img src=\"http://www.nist.gov/itl/csd/ct/images/beacon_architecture_2013.jpg\" width=\"550\" height=\"278\" alt=\"\"></center>"$
Purple Frog $HC,"<center><img src=\"https://s-media-cache-ak0.pinimg.com/736x/fb/08/2a/fb082a53bd798f5957a474ff9095e6d4.jpg\" width=\"640\" height=\"420\" alt=\"\"></center>"$
$TX,"SimStructure",HTML="http://www.templeos.org/files/SimStrSetUp.zip"$
$TX,"ASU_Transcripts",HTML="http://www.templeos.org/files/ASU_Transcripts.pdf"$ $TX,"ASU Course Catalog (See page 261)",HTML="https://catalog.asu.edu/files/shared/archives/1994-1996/general/UG1994-1996.pdf/1994-1996-UG-241-267.pdf"$
$TX,"Dr. David Pheanis",HTML="https://webapp4.asu.edu/directory/person/77201"$ $TX,"Dr. Konstantinos S. Tsakalis",HTML="http://ecee.engineering.asu.edu/directory/tenured-and-tenure-track-faculty/kostantinos-s-tsakalis"$ $TX,"Dr. Walter Higgins",HTML="https://webapp4.asu.edu/directory/directorysearch?cn=Walter+Higgins"$
@@ -430,6 +434,7 @@ $TX,"Higgs 5-Sigma Proof",HTML="http://understandinguncertainty.org/explaining-5
$TX,"Dwight: Nerd torture",HTML="http://www.noob.us/humor/the-office-dwight-faces-nerd-torture-of-the-highest-form"$
$TX,"TOSZ Compression",HTML="http://www.templeos.org/Wb/Linux/TOSZ.CPP"$
$TX,"ATA/ATAPI spec",HTML="http://www.t13.org/Documents/UploadedDocuments/docs2007/D1532v1r4b-AT_Attachment_with_Packet_Interface_-_7_Volume_1.pdf"$
$TX,"Streaming Terry A. Davis",HTML="https://www.youtube.com/channel/UCdX4uJUwSFwiY3XBvu-F_-Q/live"$
$TX,"WWW.OSDEV.ORG",HTML="http://www.osdev.org"$
$TX,"NIST Beacon",HTML="http://www.nist.gov/itl/csd/ct/nist_beacon.cfm"$
+5 -5
View File
@@ -2,7 +2,7 @@ $TR-UL,"Adam"$
$ID,2$$TR,"SysMsgFlags"$
$ID,2$sys_msg_flags[0]=0xFF;
$ID,-2$$TR,"SysRegVer"$
$ID,2$registry_version=4.040;
$ID,2$registry_version=4.050;
$ID,-2$$ID,-2$$TR-UL,"TempleOS"$
$ID,2$$TR,"TOS"$
$ID,2$I64 tos_code_walk_thru=105,tos_after_egypt_in_action=46;
@@ -26,8 +26,6 @@ $ID,-2$$TR,"FlapBat"$
$ID,2$F64 best_score=16.4090;
$ID,-2$$TR,"TimeOut"$
$ID,2$I64 best_score=22202;
$ID,-2$$TR,"RawHide"$
$ID,2$F64 best_score=96.1279;
$ID,-2$$TR,"KeepAway"$
$ID,2$I64 best_score0=0,best_score1=9999;
$ID,-2$$TR,"XCaliber"$
@@ -37,9 +35,11 @@ $ID,-2$$TR,"Wenceslas"$
$ID,2$F64 best_score=49.8074;
$ID,-2$$TR,"BomberGolf"$
$ID,2$I64 best_score=175;
$ID,-2$$TR,"RawHide"$
$ID,2$F64 best_score=96.1279;
$ID,-2$$ID,-2$$TR,"DemoCompany"$
$ID,2$$TR,"Game1"$
$ID,2$F64 best_score=1344.86889;
$ID,2$F64 best_score=481.84264;
$TR,"SimpleVal"$
$ID,2$1300;
$ID,2$1309;
$ID,-2$$ID,-2$$ID,-2$
+6 -6
View File
@@ -245,7 +245,7 @@ U0 MakeTOSDistro()
ISOFileCreate(TOS_ISO_NAME,TOS_DISTRO_DIR "/*",,
TOS_DISTRO_DIR BOOT_DIR_KERNEL_BIN_C);
DefinePrint("DD_TEMPLEOSTS_SIZE",
"Download $TX,"TempleOS V4.04",D="DD_OS_NAME_VERSION"$ - T.S. Company Internal Distro (%0.1f MB)",
"Download $TX,"TempleOS V4.05",D="DD_OS_NAME_VERSION"$ - T.S. Company Internal Distro (%0.1f MB)",
0.1*(10*Size(TOS_ISO_NAME,"+s")/1024/1024));
Drv('C');
}
@@ -280,7 +280,7 @@ U0 MakeDbgDistro()
ISOFileCreate(TOS_ISO_NAME,TOS_DISTRO_DIR "/*",,
TOS_DISTRO_DIR BOOT_DIR_KERNEL_BIN_C);
DefinePrint("DD_TEMPLEOSDBG_SIZE",
"Download $TX,"TempleOS V4.04",D="DD_OS_NAME_VERSION"$ - Debug Distro (%0.1f MB)",
"Download $TX,"TempleOS V4.05",D="DD_OS_NAME_VERSION"$ - Debug Distro (%0.1f MB)",
0.1*(10*Size(TOS_ISO_NAME,"+s")/1024/1024));
Drv('C');
}
@@ -328,7 +328,7 @@ U0 MakeLiteDistro()
ISOFileCreate(TOS_ISO_NAME,TOS_DISTRO_DIR "/*",,
TOS_DISTRO_DIR BOOT_DIR_KERNEL_BIN_C);
DefinePrint("DD_TEMPLEOSLITE_SIZE",
"Download $TX,"TempleOS V4.04",D="DD_OS_NAME_VERSION"$ - Lite Distro (%0.1f MB)",
"Download $TX,"TempleOS V4.05",D="DD_OS_NAME_VERSION"$ - Lite Distro (%0.1f MB)",
0.1*(10*Size(TOS_ISO_NAME,"+s")/1024/1024));
Drv('C');
}
@@ -361,7 +361,7 @@ U0 MakeUltraDistro()
ISOFileCreate(TOS_ISO_NAME,TOS_DISTRO_DIR "/*",,
TOS_DISTRO_DIR BOOT_DIR_KERNEL_BIN_C);
DefinePrint("DD_TEMPLEOSULTRA_SIZE",
"Download $TX,"TempleOS V4.04",D="DD_OS_NAME_VERSION"$ - UltraLite Distro (%0.1f MB)",
"Download $TX,"TempleOS V4.05",D="DD_OS_NAME_VERSION"$ - UltraLite Distro (%0.1f MB)",
0.1*(10*Size(TOS_ISO_NAME,"+s")/1024/1024));
Drv('C');
}
@@ -370,12 +370,12 @@ U0 UpdateISODocDefines()
{
try {
DefinePrint("DD_TEMPLEOSCD_SIZE",
"Download $TX,"TempleOS V4.04",D="DD_OS_NAME_VERSION"$ - Standard Distro (%0.1f MB)",
"Download $TX,"TempleOS V4.05",D="DD_OS_NAME_VERSION"$ - Standard Distro (%0.1f MB)",
0.1*(10*Size("D:/Wb/TempleOSCD.ISO","+s")/1024/1024));
DefinePrint("DD_TEMPLEOSCD_K_SIZE",
"%d KB",Size("D:/Wb/TempleOSCD.ISO","+s")/1024);
DefinePrint("DD_TEMPLEOSULTRA_SIZE",
"Download $TX,"TempleOS V4.04",D="DD_OS_NAME_VERSION"$ - UltraSmall Distro (%0.1f MB)",
"Download $TX,"TempleOS V4.05",D="DD_OS_NAME_VERSION"$ - UltraSmall Distro (%0.1f MB)",
0.1*(10*Size("D:/Wb/TempleOSUltra.ISO","+s")/1024/1024));
DefinePrint("DD_TEMPLEOSULTRA_K_SIZE",
"%d KB",Size("D:/Wb/TempleOSUltra.ISO","+s")/1024);
+13 -15
View File
@@ -132,7 +132,7 @@ class CMetallicaForm
class CWebBookMarkForm
{
U8 tag[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,A=\"Tag Text:%s\"$$\n";
U8 tag[STR_LEN] fmtstr "$$DA-P,A=\"Tag Text:%s\"$$\n";
U8 special[STR_LEN];
I64 timestamp;
I64 cert;
@@ -142,8 +142,8 @@ class CWebBookMarkForm
class CWebBibleForm
{
U8 tag[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,A=\"Tag Text:%s\"$$\n";
U8 special[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,A=\"Bible Passage:%s\"$$\n";
U8 tag[STR_LEN] fmtstr "$$DA-P,A=\"Tag Text:%s\"$$\n";
U8 special[STR_LEN] fmtstr "$$DA-P,A=\"Bible Passage:%s\"$$\n";
I64 timestamp;
I64 cert;
I64 min;
@@ -152,7 +152,7 @@ class CWebBibleForm
class CYouTubeForm
{
U8 tag[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,A=\"Title:%s\"$$\n";
U8 tag[STR_LEN] fmtstr "$$DA-P,A=\"Title:%s\"$$\n";
U8 special[STR_LEN] fmtstr "$$DA-P-TRM,LEN=11,A=\"SerialNum:%11s\"$$\n";
I64 timestamp;
I64 cert;
@@ -163,7 +163,7 @@ class CYouTubeForm
class CImgurForm
{
U8 tag[STR_LEN];
U8 special[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,A=\"SerialNum:%s\"$$\n";
U8 special[STR_LEN] fmtstr "$$DA-P,A=\"SerialNum:%s\"$$\n";
I64 timestamp;
I64 cert;
I64 min fmtstr "$$DA,A=\"Width :%d\"$$\n";
@@ -172,8 +172,8 @@ class CImgurForm
class CWikipediaForm
{
U8 tag[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,A=\"Tag Text:%s\"$$\n";
U8 special[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,A=\"Index :%s\"$$\n";
U8 tag[STR_LEN] fmtstr "$$DA-P,A=\"Tag Text:%s\"$$\n";
U8 special[STR_LEN] fmtstr "$$DA-P,A=\"Index :%s\"$$\n";
I64 timestamp;
I64 cert;
I64 min;
@@ -183,7 +183,7 @@ class CWikipediaForm
class CRandDecForm
{
U8 tag[STR_LEN];
U8 special[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,A=\"Line (Dec):%s\"$$\n";
U8 special[STR_LEN] fmtstr "$$DA-P,A=\"Line (Dec):%s\"$$\n";
I64 timestamp;
I64 cert;
I64 min;
@@ -193,7 +193,7 @@ class CRandDecForm
class CRandHexForm
{
U8 tag[STR_LEN];
U8 special[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,A=\"Line (Hex):%s\"$$\n";
U8 special[STR_LEN] fmtstr "$$DA-P,A=\"Line (Hex):%s\"$$\n";
I64 timestamp;
I64 cert;
I64 min;
@@ -203,7 +203,7 @@ class CRandHexForm
class CRandCertForm
{
U8 tag[STR_LEN];
U8 special[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,A=\"Line (Dec) :%s\"$$\n";
U8 special[STR_LEN] fmtstr "$$DA-P,A=\"Line (Dec) :%s\"$$\n";
I64 timestamp;
I64 cert fmtstr "$$DA,A=\"Certificate:%d\"$$\n";
I64 min;
@@ -213,8 +213,7 @@ class CRandCertForm
class CRandHexBeacon5Form
{
U8 tag[STR_LEN];
U8 special[STR_LEN]
fmtstr "$$DA-P-TRM,LEN=5,"
U8 special[STR_LEN] fmtstr "$$DA-P-TRM,LEN=5,"
"A=\"Line (5-Digit Hex):%5s\"$$\n";
I64 timestamp fmtstr "$$DA,A=\"TimeStamp :%d\"$$\n";
I64 cert;
@@ -225,8 +224,7 @@ class CRandHexBeacon5Form
class CRandHexBeacon8Form
{
U8 tag[STR_LEN];
U8 special[STR_LEN]
fmtstr "$$DA-P-TRM,LEN=8,"
U8 special[STR_LEN] fmtstr "$$DA-P-TRM,LEN=8,"
"A=\"Line (8-Digit Hex):%8s\"$$\n";
I64 timestamp fmtstr "$$DA,A=\"TimeStamp :%d\"$$\n";
I64 cert;
@@ -427,7 +425,7 @@ public U0 GodBooksPassage(U8 *files_find_mask,I64 len=512,
DirTreeDel(tempde1);
}
#define NIST_TIME_OFFSET (-7900-local_time_offset/CDATE_FREQ)
#define NIST_TIME_OFFSET (-7916-local_time_offset/CDATE_FREQ)
#define NIST_TIME_TO_SWITCH 3
public U0 NISTSync()
+1 -1
View File
@@ -241,7 +241,7 @@ U0 TOSRegWrite()
class CYouTubeForm2
{
U8 special[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,A=\"SerialNum:%s\"$$\n";
U8 special[STR_LEN] fmtstr "$$DA-P,A=\"SerialNum:%s\"$$\n";
};
U8 *TOSYouTube()
+2 -2
View File
@@ -150,7 +150,7 @@ public CDoc *Doc2Html(CDoc *doc_in,U8 *html_header=NULL,U8 *body_header=NULL,
"<head>\n"
"<meta http-equiv=\"Content-Type\" "
"content=\"text/html;charset=US-ASCII\">\n"
"<meta name=\"generator\" content=\"$TX,"TempleOS V4.04",D="DD_OS_NAME_VERSION"$\">\n";
"<meta name=\"generator\" content=\"$TX,"TempleOS V4.05",D="DD_OS_NAME_VERSION"$\">\n";
if (!body_header) body_header=
"<body>\n"
"<pre style=\"font-family:courier;font-size:10pt\">\n";
@@ -372,7 +372,7 @@ U0 TOSWebFile(U8 *name)
"<meta name=\"keywords\" "
"content=\"Operating System,64-Bit,64 Bit,"
"Temple,OS,TempleOS,Free,Open Source,Public Domain,x86_64\">\n"
"<meta name=\"generator\" content=\"$TX,"TempleOS V4.04",D="DD_OS_NAME_VERSION"$\">\n",
"<meta name=\"generator\" content=\"$TX,"TempleOS V4.05",D="DD_OS_NAME_VERSION"$\">\n",
"<body style=\"background-color:#55FFFF; border-style:solid;
border-width:8px; border-color:#0000AA;
+1 -1
View File
@@ -13,7 +13,7 @@ asm {
_BEEPS::
//You can always clobber RAX,RBX,RCX,RDX,R8,R9. The compiler expects that.
//See $LK,"REGG_C_CLOBBERED",A="MN:REGG_C_CLOBBERED"$ and $LK,"REGG_C_TEMP_CLOBBERED",A="MN:REGG_C_TEMP_CLOBBERED"$.
//See $LK,"REGG_CLOBBERED",A="MN:REGG_CLOBBERED"$ and $LK,"REGG_STK_TEMP",A="MN:REGG_STK_TEMP"$.
PUSH RBP
MOV RBP,RSP
MOV RCX,U64 SF_ARG1[RBP] //$LK,"SF_ARG1",A="FF:::/Kernel/KernelA.HPP,SF_ARG1"$
+2 -2
View File
@@ -19,7 +19,7 @@ JIFFIES_MSG: DU8 "Jiffies:",0;
_BEEPS2::
//You can clobber RAX,RBX,RCX,RDX,R8,R9. The compiler expects that.
//See $LK,"REGG_C_CLOBBERED",A="MN:REGG_C_CLOBBERED"$ and $LK,"REGG_C_TEMP_CLOBBERED",A="MN:REGG_C_TEMP_CLOBBERED"$.
//See $LK,"REGG_CLOBBERED",A="MN:REGG_CLOBBERED"$ and $LK,"REGG_STK_TEMP",A="MN:REGG_STK_TEMP"$.
PUSH RBP
MOV RBP,RSP
MOV RCX,U64 SF_ARG1[RBP] //$LK,"SF_ARG1",A="FF:::/Kernel/KernelA.HPP,SF_ARG1"$
@@ -34,7 +34,7 @@ _BEEPS2::
POP RCX
LOOP @@05
PUSH RSI //See $LK,"REGG_C_LOCAL_VARS",A="MN:REGG_C_LOCAL_VARS"$ & $LK,"REGG_C_LOCAL_NON_PTR_VARS",A="MN:REGG_C_LOCAL_NON_PTR_VARS"$
PUSH RSI //See $LK,"REGG_LOCAL_VARS",A="MN:REGG_LOCAL_VARS"$ & $LK,"REGG_LOCAL_NON_PTR_VARS",A="MN:REGG_LOCAL_NON_PTR_VARS"$
MOV RSI,JIFFIES_MSG
CALL PUT_STR
POP RSI
+1 -1
View File
@@ -31,7 +31,7 @@ MY_WORLD_MSG:
//My convention is to put an underscore
//on C callable asm routines.
_HELLO_WORLD::
PUSH RSI //See $LK,"REGG_C_LOCAL_VARS",A="MN:REGG_C_LOCAL_VARS"$ & $LK,"REGG_C_LOCAL_NON_PTR_VARS",A="MN:REGG_C_LOCAL_NON_PTR_VARS"$
PUSH RSI //See $LK,"REGG_LOCAL_VARS",A="MN:REGG_LOCAL_VARS"$ & $LK,"REGG_LOCAL_NON_PTR_VARS",A="MN:REGG_LOCAL_NON_PTR_VARS"$
MOV RCX,10
@@05: MOV RAX,RCX
CALL PUT_HEX_U8
+2 -2
View File
@@ -8,7 +8,7 @@ asm {
_BUZZ_FIZZ::
PUSH RBP
MOV RBP,RSP //Always set-up stk frame. (Stack Gets Traced)
PUSH RSI //See $LK,"REGG_C_LOCAL_VARS",A="MN:REGG_C_LOCAL_VARS"$ & $LK,"REGG_C_LOCAL_NON_PTR_VARS",A="MN:REGG_C_LOCAL_NON_PTR_VARS"$
PUSH RSI //See $LK,"REGG_LOCAL_VARS",A="MN:REGG_LOCAL_VARS"$ & $LK,"REGG_LOCAL_NON_PTR_VARS",A="MN:REGG_LOCAL_NON_PTR_VARS"$
PUSH RDI
MOV RSI,FIZZ_SPAN-RANGE_START%FIZZ_SPAN+1
MOV RDI,BUZZ_SPAN-RANGE_START%BUZZ_SPAN+1
@@ -35,7 +35,7 @@ _BUZZ_FIZZ::
CALL PUT_CHARS
POP RAX
INC RAX
CMP RAX,RANGE_END //Actually only a 32-bit instruction.
CMP RAX,RANGE_END //Actually only a 32-bit inst.
JBE @@05
POP RDI
+1 -1
View File
@@ -1,5 +1,5 @@
/*When I was a kid with a Commodore 64,
the 6502 chip had no multiply instruction
the 6502 chip had no multiply inst
and this is how we had to do it, except,
I used more regs in this example.
*/
+1 -1
View File
@@ -10,7 +10,7 @@ PUT_DEC_U64::
//but this function will be nice for ASM callers if it saves all regs.
PUSH_C_REGS
PUSH RSI //See $LK,"REGG_C_LOCAL_VARS",A="MN:REGG_C_LOCAL_VARS"$&$LK,"REGG_C_LOCAL_NON_PTR_VARS",A="MN:REGG_C_LOCAL_NON_PTR_VARS"$
PUSH RSI //See $LK,"REGG_LOCAL_VARS",A="MN:REGG_LOCAL_VARS"$&$LK,"REGG_LOCAL_NON_PTR_VARS",A="MN:REGG_LOCAL_NON_PTR_VARS"$
LEA RSI,-1[RBP] //Load addr of end of buffer.
//We picked RSI because of PUT_STR
//We'll move bwd
+2 -2
View File
@@ -6,8 +6,8 @@ U0 Directives()
"Dir :%s\n",__DIR__;
"Line :%d\n",__LINE__;
"Depth:%d\n",__DEPTH__;
"Instruction1:%P:%08X\n",$$,$$;
"Instruction2:%P:%08X\n",$$,$$;
"Inst1:%P:%08X\n",$$,$$;
"Inst2:%P:%08X\n",$$,$$;
}
Directives;
+7 -6
View File
@@ -20,7 +20,7 @@ U0 ClickCallBack()
//Flags are explained here:
//$LK,"::/Doc/DolDocOverview.TXT"$ $LK,"::/Doc/Widget.TXT"$
//$LK,"Dollar Flags",A="MN:DOCEf_TAG"$ $LK,"ST_DOC_FLAGS",A="FF:::/Adam/DolDoc/DocInit.CPP,ST_DOC_FLAGS"$
"(Not preserved when <CTRL-t> and back.)\n\n";
"(Not preserved if you press <CTRL-t>.)\n\n";
doc_e->left_cb=&MyLeftCB1;
DocUnlock(DocPut);
}
@@ -32,15 +32,16 @@ I64 MyLeftCB2(CDoc *,CDocEntry *)
return cnts.jiffies;
}
U0 PopUpJiffiesCallBack()
U0 PopUpJiffiesCallBack(I64 i)
{
CDoc *doc=DocNew;
CDocEntry *doc_e=DocPrint(doc,"\n\n\n$$BT+LC,\"Jiffies\"$$\n\n\n");
CDocEntry *doc_e=DocPrint(doc,
"Click %d more times\n\n\n$$BT+LC,\"Jiffies\"$$\n\n\n",i);
doc_e->left_cb=&MyLeftCB2;
"Current Jiffies:%d\n",PopUpMenu(doc);
DocDel(doc);
}
PopUpJiffiesCallBack;
PopUpJiffiesCallBack;
PopUpJiffiesCallBack;
PopUpJiffiesCallBack(3);
PopUpJiffiesCallBack(2);
PopUpJiffiesCallBack(1);
+7 -10
View File
@@ -1,15 +1,12 @@
class FDStruct
{//Use <CTRL-l> and select "Data" to generate the fmtstrs
//The number is the field from after the ':' to the end.
//See $LK,"Data Tag Width",A="FA:::/Adam/DolDoc/DocPlain.CPP,DataTagWidth"$.
F64 num1 fmtstr "$$DA-TRM,RT=F64,A=\"F64 1:%12.8f\"$$\n";
F64 num2 fmtstr "$$DA-TRM,RT=F64,A=\"F64 2:%12e\"$$\n";
I64 num3 fmtstr "$$DA-TRM,A=\"I64 1:0x%016X\"$$\n";
I64 num4 fmtstr "$$DA-TRM,A=\"I64 2:%12d\"$$\n";
{//Use <CTRL-l> and select "Data", "List" or "Check Box"
//to generate the fmtstrs.
F64 num1 fmtstr "$$DA-TRM,A=\"Float 1:%12.8f\"$$\n";
F64 num2 fmtstr "$$DA-TRM,A=\"Float 2:%12e\"$$\n";
I64 num3 fmtstr "$$DA-TRM,A=\"Int 1:0x%016X\"$$\n";
I64 num4 fmtstr "$$DA-TRM,A=\"Int 2:%12d\"$$\n";
I64 type fmtstr "$$LS,D=\"ST_PERSON_TYPE\"$$\n";
U8 name[32] fmtstr "$$DA-P,LEN=31,A=\"Name :%s\"$$\n";
U8 name[32] fmtstr "$$DA-P,A=\"Name :%s\"$$\n";
U8 *address1 fmtstr "$$DA+M,A=\"Address:%s\"$$\n"; //+M is unlimited len U8 *.
U8 *address2 fmtstr "$$DA+M,A=\"Address:%s\"$$\n"; //+M is unlimited len U8 *.
CDate datetime fmtstr "$$DA-TRM,A=\"Date :%8D\"$$\n";
+2 -2
View File
@@ -30,7 +30,7 @@ U0 SrcExample()
}
SrcExample;
//See $LK,"::/Demo/ScreenCodes.CPP"$, $LK,"::/Demo/Graphics/CharGraphics.CPP"$,
//and $LK,"::/Demo/Graphics/FontEd.CPP"$.
//See $LK,"::/Demo/ScreenCodes.CPP"$, $LK,"::/Demo/Graphics/CharAnimation.CPP"$,
//$LK,"::/Demo/Games/CharDemo.CPP"$ and $LK,"::/Demo/Graphics/FontEd.CPP"$.
//See $LK,"chars_bmp_alpha",A="MN:chars_bmp_alpha"$ and $LK,"chars_bmp_alpha_numeric",A="MN:chars_bmp_alpha_numeric"$.
Binary file not shown.
+191
View File
@@ -0,0 +1,191 @@
/*
Char graphics are how games on the C64 were made. You don't need to do it
this way, unless for fun. You can just make device context bigger than
the screen and scroll around.
See $LK,"::/Demo/Games/RawHide.CPP"$ or $LK,"::/Demo/Games/BigGuns.CPP"$.
The nice thing about character graphics are the animations.
*/
#define MAP_WIDTH (TEXT_COLS*2)
#define MAP_HEIGHT (TEXT_ROWS*2)
#define CH_WATER '^'
#define CH_LAND CH_SPACE
#define CH_TREE '*'
U16 map[MAP_HEIGHT][MAP_WIDTH];
I64 screen_pix_x,screen_pix_y;
U0 DrawIt(CTask *task,CDC *)
{
U16 *ptr;
I64 i,j,y=screen_pix_y>>3;
gr.hide_col=gr.hide_row=TRUE;
gr.pan_text_x=7-screen_pix_x&7;
gr.pan_text_y=7-screen_pix_y&7;
for (i=0;i<task->win_height;i++) {
ptr=&map[y++][screen_pix_x>>3];
for (j=0;j<task->win_width;j++)
//By the time you clip to window and handle Fs->scroll_x,Fs->scroll_y,
//it is too much trouble to do raw access to gr.text_base like we do
//in $LK,"::/Demo/Games/Maze.CPP"$.
TextChar(task,FALSE,j,i,*ptr++);
}
}
U8 *old_font=text.font;
U64 waves[4]={
0x0011AA440011AA44,0x0022558800225588,
0x0044AA110044AA11,0x0088552200885522};
U0 AnimateEndCB()
{
text.font=old_font;
Exit;
}
U0 AnimateTask(I64)
{
I64 i;
U64 *font=MAlloc(256*8);
Fs->task_end_cb=&AnimateEndCB;
MemCpy(font,text.font,256*8);
text.font=font;
font[CH_TREE]=0x18187E7E3C3C18;
while (TRUE) {
font[CH_WATER]=waves[i++&0x3];
Sleep(200);
WinMgrSync;
}
}
U0 ScrollTaskX(I64 sign)
{
I64 i;
for (i=0;i<32;i++) {
screen_pix_x=ClampI64(screen_pix_x+sign,0,
(MAP_WIDTH-TEXT_COLS+1)*FONT_WIDTH);
WinMgrSync;
}
}
U0 ScrollTaskY(I64 sign)
{
I64 i;
for (i=0;i<32;i++) {
screen_pix_y=ClampI64(screen_pix_y+sign,0,
(MAP_HEIGHT-TEXT_ROWS+2)*FONT_HEIGHT);
WinMgrSync;
}
}
U0 Init()
{
I64 i,j,x,y;
screen_pix_x=(MAP_WIDTH-TEXT_COLS)>>1*FONT_WIDTH;
screen_pix_y=(MAP_HEIGHT-TEXT_ROWS)>>1*FONT_HEIGHT;
MemSetU16(map,CH_WATER+(BLUE<<4+LTBLUE)<<8,MAP_WIDTH*MAP_HEIGHT);
for (i=1;i<MAP_WIDTH-1;i++)
map[0][i]=map[MAP_HEIGHT-1][i]='Í'+(BLUE<<4+RED)<<8;
for (i=1;i<MAP_HEIGHT-1;i++)
map[i][0]=map[i][MAP_WIDTH-1]='º'+(BLUE<<4+RED)<<8;
map[0][0] ='É'+(BLUE<<4+RED)<<8;
map[0][MAP_WIDTH-1] ='»'+(BLUE<<4+RED)<<8;
map[MAP_HEIGHT-1][0] ='È'+(BLUE<<4+RED)<<8;
map[MAP_HEIGHT-1][MAP_WIDTH-1]='¼'+(BLUE<<4+RED)<<8;
for (i=0;i<20;i++) {
x=MAP_WIDTH*Rand;
y=MAP_HEIGHT*Rand;
for (j=0;j<1000;j++) {
map[y][x]=CH_LAND+(YELLOW<<4+BLACK)<<8;
x=ClampI64(x+RandU16%3-1,0,MAP_WIDTH-1);
y=ClampI64(y+RandU16%3-1,0,MAP_HEIGHT-1);
}
}
for (i=0;i<100;i++) {
do {
x=MAP_WIDTH*Rand;
y=MAP_HEIGHT*Rand;
} while (map[y][x].u8[0]!=CH_LAND);
for (j=0;j<100;j++) {
map[y][x]=CH_TREE+(YELLOW<<4+GREEN)<<8;
x=ClampI64(x+RandU16%3-1,0,MAP_WIDTH-1);
y=ClampI64(y+RandU16%3-1,0,MAP_HEIGHT-1);
}
}
}
U0 CleanUp()
{
gr.pan_text_x=gr.pan_text_y=0;
gr.hide_col=gr.hide_row=FALSE;
}
U0 CharDemo()
{
I64 sc;
SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$
Fs->text_attr=YELLOW<<4+BLUE;
AutoComplete;
WinBorder;
WinMax;
DocCursor;
MenuPush(
"File {"
" Abort(,CH_SHIFT_ESC);"
" Exit(,CH_ESC);"
"}"
"Play {"
" Restart(,'\n');"
" Left(,,SC_CURSOR_LEFT);"
" Right(,,SC_CURSOR_RIGHT);"
" Up(,,SC_CURSOR_UP);"
" Down(,,SC_CURSOR_DOWN);"
"}"
);
Init;
Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs);
Fs->draw_it=&DrawIt;
try {
while (TRUE) {
switch (GetKey(&sc)) {
case 0:
switch (sc.u8[0]) {
case SC_CURSOR_LEFT:
Spawn(&ScrollTaskX,-1,"Scroll",,Fs);
break;
case SC_CURSOR_RIGHT:
Spawn(&ScrollTaskX,1,"Scroll",,Fs);
break;
case SC_CURSOR_UP:
Spawn(&ScrollTaskY,-1,"Scroll",,Fs);
break;
case SC_CURSOR_DOWN:
Spawn(&ScrollTaskY,1,"Scroll",,Fs);
break;
}
break;
case '\n':
CleanUp;
Init;
break;
case CH_SHIFT_ESC:
case CH_ESC:
goto sq_done;
}
}
sq_done: //Don't goto out of try
} catch
PutExcept;
SettingsPop;
CleanUp;
MenuPop;
}
CharDemo;
+7 -14
View File
@@ -49,15 +49,6 @@ $SP,"<1>",BI=1$
I64 critical_section_flag;
U0 CriticalSectionStart()
{
while (LBts(&critical_section_flag,0))
Yield;
}
U0 CriticalSectionEnd()
{
LBtr(&critical_section_flag,0);
}
/*These are $BK,1$NOT$BK,0$ dealloced after the program ends,
but I did them this way for your benefit
@@ -181,9 +172,10 @@ U0 MPDoPanels(CTask *task)
tempf->p.x=(i+w/2)*MAP_SCALE;
tempf->p.y=(j+h/2)*MAP_SCALE;
tempf->p.z=l;
CriticalSectionStart;
while (LBts(&critical_section_flag,0))
Yield;
QueIns(tempf,fish_root.last);
CriticalSectionEnd;
LBtr(&critical_section_flag,0);
}
} else {
if (RandI16&1) {
@@ -242,11 +234,12 @@ U0 MPDoPanels(CTask *task)
}
}
if (end_ptr) {
CriticalSectionStart;
while (LBts(&critical_section_flag,0))
Yield;
if (end_ptr)
end_ptr->next=panel_root;
panel_root=start_ptr;
CriticalSectionEnd;
LBtr(&critical_section_flag,0);
}
LBtr(&mp.init_not_done_flags,Gs->num);
}
@@ -443,7 +436,7 @@ U0 MPDrawIt(CTask *task,CDC *dc)
yy+=y3;
}
if (Gs->num&1) {//alternate left-right,right-left
if (Gs->num&1) {//alt left-right,right-left
yh2=-yh;
xh2=-xh;
} else {
@@ -3,11 +3,9 @@ U8 *old_font=text.font;
// See $LK,"::/Kernel/Font8x8.CPP"$, $LK,"::/Demo/ScreenCodes.CPP"$,
//$LK,"::/Demo/ExtendedChars.CPP"$, and $LK,"::/Demo/Graphics/FontEd.CPP"$.
U8 waves[8*4]={
0x00,0x11,0xAA,0x44,0x00,0x11,0xAA,0x44,
0x00,0x22,0x55,0x88,0x00,0x22,0x55,0x88,
0x00,0x44,0xAA,0x11,0x00,0x44,0xAA,0x11,
0x00,0x88,0x55,0x22,0x00,0x88,0x55,0x22};
U64 waves[4]={
0x0011AA440011AA44,0x0022558800225588,
0x0044AA110044AA11,0x0088552200885522};
U0 AnimateEndCB()
{
@@ -18,12 +16,12 @@ U0 AnimateEndCB()
U0 AnimateTask(I64)
{
I64 i;
U8 *font=MAlloc(256*8);
U64 *font=MAlloc(256*8);
Fs->task_end_cb=&AnimateEndCB;
MemCpy(font,text.font,256*8);
text.font=font;
while (TRUE) {
MemCpy(font+CH_SPACE*FONT_HEIGHT,waves+8*(i++&0x3),8);
font[CH_SPACE]=waves[i++&0x3];
Sleep(100);
}
}
+2 -1
View File
@@ -14,7 +14,8 @@ save to a file with this font editor program
and cut and paste the code into $LK,"::/Kernel/Font8x8.CPP"$.
You will need to recompile Kernel by calling $LK,"MakeOSDrvBootInstall",A="MN:MakeOSDrvBootInstall"$().
See $LK,"::/Demo/ExtendedChars.CPP"$ and $LK,"::/Demo/ScreenCodes.CPP"$.
See $LK,"::/Demo/ExtendedChars.CPP"$, $LK,"::/Demo/Games/CharDemo.CPP"$,
$LK,"::/Demo/Graphics/CharAnimation.CPP"$ and $LK,"::/Demo/ScreenCodes.CPP"$.
*/
#define BLOW_UP_CHAR_X (18*FONT_WIDTH)
+1 -1
View File
@@ -33,7 +33,7 @@ U0 SunMoon()
gr.dc->dither_probability_u16=2*i; //U16 can be [0,65535]
GrFloodFill(gr.dc,x-0.75*radius,y);
WinMgrSync; //Typically 30 fps or 33S
WinMgrSync; //Typically 30 fps
DCFill;
}
+5 -5
View File
@@ -1,4 +1,4 @@
/*"Fixed point" means you use integers
/*"Fixed point" means you use ints
that are scaled by a value. A common
example would be using number of pennies
instead of dollars with a float.
@@ -10,7 +10,7 @@ and my compiler used to do floats poorly.
It's a little better.
I often use 64-bit ints with upper 32-bits
as integer and lower 32-bits as fraction.
as int and lower 32-bits as fraction.
See $LK,"::/Demo/SubIntAccess.CPP"$ for how
to access upper or lower 32-bits.
@@ -29,7 +29,7 @@ U0 Main()
t0=tS;
for (i=1000000000;i;i--)
i_sum+=i_val;
"Integer Sum:%.9f Time:%7.3fs\n",i_sum/ToF64(0x100000000),tS-t0;
"Int Sum:%.9f Time:%7.3fs\n",i_sum/ToF64(0x100000000),tS-t0;
f_val= 2.0000002;
t0=tS;
@@ -47,7 +47,7 @@ U0 DoIt2()
"i&0xFFFFFFFF=%X\n",i&0xFFFFFFFF;
"i>>32 =%X\n",i>>32;
/* Standard integer types are declared
/* Standard int types are declared
with a special compiler feature which
allows a structure to be accessed as a
whole. That's why the i variable can
@@ -87,7 +87,7 @@ DoIt2;
/*Program Output$HL,0$$WW+H,1$$FD,1$
8 Cores 2.660GHz
Integer Sum:2000000199.768689408 Time: 0.787s
Int Sum:2000000199.768689408 Time: 0.787s
Float Sum:2000000225.656126208 Time: 3.918s
i =123456789ABCDEF0
+2 -2
View File
@@ -1,4 +1,4 @@
/*"Fixed point" means you use integers
/*"Fixed point" means you use ints
that are scaled by a value. A common
example would be using number of pennies
instead of dollars with a float.
@@ -9,7 +9,7 @@ floats. It also depends on the compiler
and my compiler used to do floats poorly.
I often use 64-bit ints with upper 32-bits
as integer and lower 32-bits as fraction.
as int and lower 32-bits as fraction.
See $LK,"::/Demo/SubIntAccess.CPP"$ for how
to access upper or lower 32-bits.
+3 -3
View File
@@ -11,7 +11,7 @@ $ID,-2$
$TR,"Mini Compiler"$
$ID,2$For this mini compiler, some things you should know about 64-bit asm:
* Putting a 0x48, known as the REX byte, in front of an instruction makes it 64-bit size.
* Putting a 0x48, known as the REX byte, in front of an inst makes it 64-bit size.
* "PUSH EAX", "POP EAX" and "XOR EAX,EAX" will behave as 64-bit even without REX because the stk is always 64 bit and because the XOR clears the upper 32-bits.
@@ -112,7 +112,7 @@ U0 PrsTerm(U8 **_src,U8 **_dst,I64 prec)
I64 Parse(U8 **_src,U8 **_dst)
{//See $LK,"PrsExpression",A="MN:PrsExpression"$().
//See $LK,"Opcode Fmts",A="FF:::/Compiler/OpCodes.TXT,IDIV"$ for details on asm instructions.
//See $LK,"Opcode Fmts",A="FF:::/Compiler/OpCodes.TXT,IDIV"$ for details on asm insts.
I64 i;
U8 *dst=*_dst;
switch (Lex(_src,&i)) {
@@ -204,7 +204,7 @@ U0 Main()
while (TRUE) {
"This will compile an expression\n"
"consisting of integers, parentheses\n"
"consisting of ints, parentheses\n"
"and the operators +,-,* and /.\n";
src=GetStr;
if (*src) {
+4 -4
View File
@@ -1,8 +1,8 @@
/*The moral of this story is simple
instruction level optimizations
inst level optimizations
don't matter much on a modern Intel CPU
because they convert complex instructions
to a stream of RISC instructions.
because they convert complex insts
to a stream of RISC insts.
I learned this the hard way when I thought
I was greatly improving my compiler by
@@ -61,7 +61,7 @@ _WELL_OPTIMIZED3::
XOR RAX,RAX
MOV RCX,SAMPLES-1
@@05: ADD RAX,RCX
LOOP @@05 //Instruction sucks in speed, but saves code size.
LOOP @@05 //Inst sucks in speed, but saves code size.
RET
}
+2 -2
View File
@@ -1,8 +1,8 @@
/*lock{} is a compiler stmt
which places asm LOCK instruction
which places asm LOCK inst
prefixes on code. Only use it on
read-modify-write stmts.
It will generate invalid instructions
It will generate invalid insts
if you misuse it and it will crash.
$LK,"U",A="MN:U"$() to see what code was generated.
*/
+1 -1
View File
@@ -1 +1 @@
8ý!/Û ˜?"v¬ùâ°»?äÌq¡À?jAÊ?õŸƒ¶3Í?¬ax “Ø?]¦"Þ?L–o`öÞ?ŠìÁxÅß? Ñ”ìžë?
Кь'^╩≥?ЪS■aтд?┤u∙кj^о?*П╗╔y╖р?Пe╒Щё┴з?аhYВвъ?mКc|≤Д?┴-еiU╟Е?в│v÷WбХ?ч/PдAК?
+10 -10
View File
@@ -1,11 +1,11 @@
//This is sorted.
0.256505
0.347373
0.349509
0.367545
0.563530
0.626343
0.703852
0.753115
0.897487
0.941150
0.014631
0.073055
0.074138
0.078977
0.245686
0.393559
0.554134
0.570852
0.856893
0.981828
+1 -1
View File
@@ -1 +1 @@
jAÊ?¬ax “Ø?]¦"Þ?"v¬ùâ°»?äÌq¡À?ŠìÁxÅß?õŸƒ¶3Í?8ý!/Û ˜?L–o`öÞ? Ñ”ìžë?
Þ/PÄAë?‰-ÅiU°å?ðe¢ý£‰Ú?ÁhY÷×ß?×�vŸWÂè?mëc|˜ä?‡u•Ëj^Ï?ëØ'^»™?ÿS”aÔÄ?*ð¨¥y§Ò?
+10 -10
View File
@@ -1,11 +1,11 @@
//This is unsorted.
0.941150
0.347373
0.626343
0.256505
0.753115
0.367545
0.897487
0.563530
0.703852
0.349509
0.981828
0.554134
0.570852
0.393559
0.014631
0.856893
0.245686
0.074138
0.073055
0.078977
+1 -1
View File
@@ -1,6 +1,6 @@
/*TempleOS has a feature that allows
access to bytes and words of larger
integers.
ints.
See $LK,"U64i union",A="FF:::/Kernel/KernelA.HPP,U64i union"$.
+2 -2
View File
@@ -1,4 +1,4 @@
/*Allows you to time instructions.
/*Allows you to time insts.
Results vary because the CPU does
parallel and out-of-order execution.
*/
@@ -20,7 +20,7 @@ U0 TimeIns()
start=GetTSC;
for (i=0;i<SAMPLE_SIZE;i++) {
#exe {PassTrace(0b10000000000);};
//Time these instructions
//Time these insts
d*=1.00001;
#exe {PassTrace(0);};
}
+1 -1
View File
@@ -148,7 +148,7 @@ public CDoc *Doc2Html(CDoc *doc_in,U8 *html_header=NULL,U8 *body_header=NULL,
"<head>\n"
"<meta http-equiv=\"Content-Type\" "
"content=\"text/html;charset=US-ASCII\">\n"
"<meta name=\"generator\" content=\"$TX,"TempleOS V4.04",D="DD_OS_NAME_VERSION"$\">\n";
"<meta name=\"generator\" content=\"$TX,"TempleOS V4.05",D="DD_OS_NAME_VERSION"$\">\n";
if (!body_header) body_header=
"<body>\n"
"<pre style=\"font-family:courier;font-size:10pt\">\n";
+1
View File
@@ -182,6 +182,7 @@ U0 BlockIPNums(LogStruct *root)
BlockedStructAdd(&blocked_root,68<<24+96<<16+100<<8+126);
BlockedStructAdd(&blocked_root,68<<24+96<<16+110<<8+213);
BlockedStructAdd(&blocked_root,68<<24+96<<16+242<<8+108);
BlockedStructAdd(&blocked_root,68<<24+227<<16+61<<8+11);
//pass 1: collect robot lst
while (templg!=root) {
+1 -1
View File
@@ -584,7 +584,7 @@
52.53.176.137 - - [10/Feb/2015:13:44:27 -0800] "GET /files/?D=A HTTP/1.1" 200 1522 "-" "Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)" "www.templeos.org"
52.81.208.207 - - [10/Feb/2015:13:45:31 -0800] "GET /Wb/Adam/Gr/GrPrimatives.html HTTP/1.1" 200 743387 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0" "www.templeos.org"
130.158.66.124 - - [10/Feb/2015:13:47:09 -0800] "GET /files/BIBLE.TXT HTTP/1.1" 200 4345143 "http://www.templeos.org/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36" "www.templeos.org"
150.176.164.55 - - [10/Feb/2015:13:47:55 -0800] "GET /Wb/Demo/Graphics/CharGraphics.html HTTP/1.1" 200 15754 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0" "www.templeos.org"
150.176.164.55 - - [10/Feb/2015:13:47:55 -0800] "GET /Wb/Demo/Graphics/CharAnimation.html HTTP/1.1" 200 15754 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0" "www.templeos.org"
150.176.164.55 - - [10/Feb/2015:13:51:30 -0800] "GET / HTTP/1.1" 200 6329 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0" "www.templeos.org"
150.176.164.55 - - [10/Feb/2015:13:51:58 -0800] "GET /Wb/Home/Web/History.html HTTP/1.1" 200 7745 "http://www.templeos.org/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0" "www.templeos.org"
210.63.49.147 - - [10/Feb/2015:13:53:23 -0800] "GET /test/wp-admin/ HTTP/1.1" 404 89 "-" "-" "templeos.org"
+3 -3
View File
@@ -1,12 +1,12 @@
$WW,1$$FG,5$$TX+CX,"Assembler"$$FG$
See $LK,"::/Compiler/OpCodes.TXT"$ for opcodes. They're not standard. Some invalid instructions are not flagged and some valid instructions are not implemented. 16-bit asm support is limited.
See $LK,"::/Compiler/OpCodes.TXT"$ for opcodes. They're not standard. Some invalid insts are not flagged and some valid insts are not implemented. 16-bit asm support is limited.
Here are example instruction formats:
Here are example inst formats:
$HL,1$ ADD RAX,I64 FS:DISP[RSI+RDI*8]
$HL,0$$HL,1$ ADD RAX,I64 [DISP]
$HL,0$
$FG,2$$$$FG$ Current compiler output pos (instruction ptr). Even works in HolyC expressions.
$FG,2$$$$FG$ Current compiler output pos (inst ptr). Even works in HolyC expressions.
$FG,2$$$$FG$ works in $FG,2$class$FG$es.
$FG,2$class MyFun
+34 -1
View File
@@ -2,6 +2,39 @@ $WW,1$$FG,5$$TX+CX,"Change Log"$$FG$
Use $LK,"R",A="MN:R"$() to rename if I change a label.
$IV,1$----03/29/16 17:59:14----$IV,0$
$IV,1$----03/29/16 05:53:45----$IV,0$
* $BK,1$TempleOS version 4.05 Released$BK,0$
$IV,1$----03/24/16 16:26:50----$IV,0$
* Added $LK,"::/Demo/Games/CharDemo.CPP"$.
$IV,1$----03/22/16 16:58:25----$IV,0$
* Added $LK,"DOCEF_DFT_RAW_TYPE",A="MN:DOCEF_DFT_RAW_TYPE"$. Modified $LK,"DocForm",A="MN:DocForm"$() to look-up raw type automatically from the compiler's class information.
* Added $LK,"DOCEF_DFT_LEN",A="MN:DOCEF_DFT_LEN"$. Modified $LK,"DocForm",A="MN:DocForm"$() to look-up string length automatically from the compiler's class information.
$IV,1$----03/21/16 07:28:35----$IV,0$
* Added $LK,"OCF_ALIAS",A="MN:OCF_ALIAS"$.
* $LK,"R",A="MN:R"$("Integer","Int");
* Added aliases to $LK,"::/Compiler/OpCodes.TXT"$.
$IV,1$----03/21/16 02:12:08----$IV,0$
* Added $LK,"DOCT_MARKER",A="MN:DOCT_MARKER"$.
* Added $LK,"CICType",A="MN:CICType"$.
* Optimized $LK,"MDG_MASK",A="MN:MDG_MASK"$ and $LK,"RTG_MASK",A="MN:RTG_MASK"$ values.
$IV,1$----03/19/16 09:15:11----$IV,0$
* Fixed bug in $LK,"EdFindReplace",A="MN:EdFindReplace"$().
$IV,1$----03/19/16 06:22:36----$IV,0$
* Fixed $LK,"UAsm",A="MN:Ui"$() bug.
* Got rids of $FG,4$ICF_A1_FIRST$FG$.
* Cleaned-up compiler $LK,"REGG_CLOBBERED",A="MN:REGG_CLOBBERED"$ and $LK,"REGG_STK_TEMP",A="MN:REGG_STK_TEMP"$.
$IV,1$----03/18/16 09:53:33----$IV,0$
* Made $LK,"SpriteEd",A="MN:SpriteEd"$() select foreground elem.
$IV,1$----03/14/16 05:57:27----$IV,0$
* $BK,1$TempleOS version 4.04 Released$BK,0$
* Changed $FG,2$nobound_switch$FG$ so it uses [].
@@ -123,7 +156,7 @@ $IV,1$----01/06/16 11:01:57----$IV,0$
$IV,1$----01/03/16 17:15:41----$IV,0$
* Updated $LK,"::/Misc/PCIDevices.TXT"$.
* Added null case option. Next higher integer with "$FG,2$case:$FG$" in $FG,2$switch$FG$ stmts. See $LK,"::/Demo/NullCase.CPP"$.
* Added null case option. Next higher int with "$FG,2$case:$FG$" in $FG,2$switch$FG$ stmts. See $LK,"::/Demo/NullCase.CPP"$.
$IV,1$----12/31/15 00:44:44----$IV,0$
* Made $LK,"ASM_KEYWORD",A="FF:::/Compiler/OpCodes.TXT,ASM_KEYWORD"$s usable in HolyC outside asm{} blocks.
+1 -1
View File
@@ -6,7 +6,7 @@ There are a few places where I cut corners in the interest of not junking-up cod
* TempleOS does not figure-out $FG,2$FAT32$FG$ short name alias numbers. $LK,"FAT32DirNew",A="MN:FAT32DirNew"$(). It can cause hard drive corruption, so I might have to do it. It would really take a lot of junky code for this hatefully, detestable, legacy issue. "Please don't make me ruin my beautiful shiny-new TempleOS with that!" I am also not enthused about $FG,2$FAT32$FG$ because it is in patent limbo. $FG,2$FAT32$FG$ might get removed from TempleOS. There is the $LK,"RedSea",A="FI:::/Doc/RedSea.TXT"$ 64-bit file system that works perfectly well. $FG,2$FAT32$FG$ is useful, however, because it assists in transferring between dual booted operating systems.
* I changed the $LK,"asm opcodes",A="FI:::/Compiler/OpCodes.TXT"$ names to remove the ambiguity between instructions with different numbers of arguments, making my $LK,"assembler",A="FI:::/Compiler/Asm.CPP"$ simpler and I did minimal 16-bit asm support, since 64-bit is what you should be using, unless you're doing a $LK,"boot loader",A="FI:::/Adam/Opt/Boot/BootDVD.CPP"$.
* I changed the $LK,"asm opcodes",A="FI:::/Compiler/OpCodes.TXT"$ names to remove the ambiguity between insts with different numbers of arguments, making my $LK,"assembler",A="FI:::/Compiler/Asm.CPP"$ simpler and I did minimal 16-bit asm support, since 64-bit is what you should be using, unless you're doing a $LK,"boot loader",A="FI:::/Adam/Opt/Boot/BootDVD.CPP"$.
* There are no user-controlled file-sharing locks. However, the drive and file system have locks and concurrent operations should be fine.
+1 -1
View File
@@ -1 +1 @@
$WW,1$Dates are 32-bit signed integers representing the number of days since the birth of Christ. Negative values represent B.C.E. dates.
$WW,1$Dates are 32-bit signed ints representing the number of days since the birth of Christ. Negative values represent B.C.E. dates.
+1 -1
View File
@@ -6,7 +6,7 @@ $WW,1$$FG,5$$TX+CX,"Debugging Overview"$$FG$
* While debugging, you specify addresses of assembly routines with just the label, as in $FG,2$_MALLOC+0x20$FG$. You specify $LK,"HolyC",A="FI:::/Doc/HolyC.TXT"$ function names with $FG,2$&$FG$ before functions as in $FG,2$&Print+0x10$FG$.
* I use $LK,"progress1",A="MN:progress1"$-$LK,"progress4",A="MN:progress4"$ for debugging because they show on the wallpaper. They're just global integer vars.
* I use $LK,"progress1",A="MN:progress1"$-$LK,"progress4",A="MN:progress4"$ for debugging because they show on the wallpaper. They're just global int vars.
* You can use $LK,"AdamLog",A="MN:AdamLog"$() to send text to the Adam task window. It works like $LK,"Print",A="MN:Print"$(). I never use that. Instead, I use $LK,"RawPrint",A="MN:RawPrint"$().
+6 -6
View File
@@ -6,9 +6,9 @@ $HC,"<object width=\"640\" height=\"520\"><param name=\"movie\" value=\"http://w
* Windows, Linux and VMware (because of mounted drives) must support $LK,"RedSea",A="FI:::/Doc/RedSea.TXT"$ file system so I can get rid of 2,000 lines of redundant, blemished code -- FAT32 and ISO9660. God's temple must be perfect. Redundant code for multiple file systems is imperfect. For this operating system, we want low line count. More than one file system type is actually bad, just as more than one driver for the same type of device is bad.
$LK,"::/Kernel/BlkDev/FileSysRedSea.CPP"$
$LK,"::/Kernel/BlkDev/FileSysFAT.CPP"$ :965 lines for FAT32 gets eliminated.
$LK,"::/Kernel/BlkDev/FileSysISO.CPP"$ :284 lines for ISO9660 gets eliminated.
$LK,"::/Adam/Opt/Boot/DskISOFile.CPP"$ :536 lines for making ISO files gets reduced.
$LK,"::/Kernel/BlkDev/FileSysFAT.CPP"$ :973 lines for FAT32 gets eliminated.
$LK,"::/Kernel/BlkDev/FileSysISO.CPP"$ :293 lines for ISO9660 gets eliminated.
$LK,"::/Adam/Opt/Boot/DskISOFile.CPP"$ :535 lines for making ISO files gets reduced.
$LK,"::/Kernel/BlkDev/DskCluster.CPP"$ :152 All the cluster operations become blk.
* Microsoft must cancel SecureBoot because it makes dual booting impossible. TempleOS is an additional operating system that must be used along-side Windows or Linux, not as a replacement. It must dual boot because it has no networking. Real hardware as opposed to VMware is like the difference between looking in a telescope eye piece vs just looking at an off-line image. God said the C64/Apple II generation owned ancestral lands. VMware is like being taken off of our land and moved onto a reservation. In this case, however, it will not stand.
@@ -17,19 +17,19 @@ $LK,"::/Kernel/BlkDev/DskCluster.CPP"$ :152 All the cluster operations become bl
* VMware has a bug stretching 640x480 16 color to full screen.
* VMware has a bug starting-up multicore, sometimes. $LK,"APIC MP Start",A="FF:::/Kernel/MultiProc.CPP,IPI"$
* VMware has a bug starting-up multicore, sometimes. $LK,"APIC MP Start",A="FF:::/Kernel/MultiProc.CPP,IPI"$ Fixed?
* VMware PC speaker's distortion is a good idea, but it is too much for hymns.
* VMware and others must list TempleOS as an official 64-bit operating system.
* Until super simple block devices are available, hard disk should be placed at IDE primary master 1F0/3F6 and CD/DVD/Blu-ray should be placed at the IDE secondary master 170/376.
$LK,"/Kernel/BlkDev/DskATAId.CPP",A="FI:::/Kernel/BlkDev/DskATAId.CPP"$ :280 lines to figure-out I/O ports is gone.
$LK,"/Kernel/BlkDev/DskATAId.CPP",A="FI:::/Kernel/BlkDev/DskATAId.CPP"$ :285 lines to figure-out I/O ports is gone.
$LK,"/Kernel/PCIBIOS.CPP",A="FI:::/Kernel/PCIBIOS.CPP"$ :290 could be eliminated, but maybe we will keep it so people can play with PCI devices.
* Until super simple serial ports are available, PS/2 emulated keyboard and mouse must work. The BIOS must enable these.
* The x86 IN/OUT port instructions, normally have a delay. Perhaps, VMware & Intel can enable faster x86 IN/OUT instruction timing for ATA/ATAPI PIO, so bandwidth isn't bad when doing port I/O. See $LK,"ATAGetResult",A="MN:ATAGetResult"$(). Perhaps, x86 CPU chips need a new TempleOS mode for fast IN/OUT instructions?
* The x86 IN/OUT port instructions, normally have a delay. Perhaps, VMware & Intel can enable faster x86 IN/OUT instruction timing for ATA/ATAPI PIO, so bandwidth isn't bad when doing port I/O. See $LK,"ATAGetResult",A="MN:ATAGetResult"$(). We don't want to do DMA. Perhaps, x86 CPU chips need a new TempleOS mode for fast IN/OUT instructions?
* Perhaps, a new interrupt descriptor table entry type or a new x86 CPU mode can be made that cause fast software interrupts, doing exactly what the CALL REL32 does, but with IDT as indirection. We don't need to change privilege levels or stacks.
+2 -1
View File
@@ -59,8 +59,9 @@ $LK,"::/Demo/Graphics/RotateTank.CPP"$
$LK,"::/Demo/Games/Wenceslas.CPP"$
$LK,"::/Demo/ScreenCodes.CPP"$
$LK,"::/Demo/Graphics/PanText.CPP"$
$LK,"::/Demo/Graphics/CharGraphics.CPP"$
$LK,"::/Demo/Graphics/CharAnimation.CPP"$
$LK,"::/Demo/Games/Maze.CPP"$
$LK,"::/Demo/Games/CharDemo.CPP"$
$LK,"::/Demo/Graphics/FontEd.CPP"$
$LK,"::/Demo/ExtendedChars.CPP"$
$LK,"::/Demo/TimeIns.CPP"$
+22 -10
View File
@@ -123,21 +123,29 @@ Examples: <CTRL-t> to see
$ID,-2$$TR,"BT Button"$
$ID,2$See $LK,"::/Demo/DolDoc/MenuButton.CPP"$.
$ID,-2$$TR,"DA Data"$
$ID,2$Used for forms that prompt for data. Use $FG,2$<CTRL-l>$FG$ as a text widgets editor to help you generate the text you need in your "$FG,2$fmtstr$FG$" cmd in a $FG,2$class$FG$. If you add it directly with $LK,"DocPrint",A="MN:DocPrint"$(), you'll need to fill-in the data addr. See $LK,"DocForm",A="MN:DocForm"$() and $LK,"::/Demo/DolDoc/Form.CPP"$.
$ID,2$Used for forms that prompt for data or just displaying a value. Use $FG,2$<CTRL-l>$FG$ to help you generate the DolDoc command text you need in your $LK,"HolyC",A="FI:::/Doc/HolyC.TXT"$ $FG,2$class$FG$ member's $FG,2$fmtstr$FG$ meta-data for $LK,"DocForm",A="MN:DocForm"$(). See $LK,"::/Demo/DolDoc/Form.CPP"$, $LK,"::/Demo/Dsk/DataBase.CPP"$, and $LK,"::/Adam/DolDoc/DocWidgetWiz.CPP"$.
The default data-type for the $FG,2$$$DA...$$$FG$ command is $FG,2$I64$FG$. You can change it to $FG,2$I8$FG$, $FG,2$U8$FG$, $FG,2$I16$FG$, $FG,2$U16$FG$, $FG,2$I32$FG$, $FG,2$U32$FG$, $FG,2$I64$FG$, $FG,2$U64$FG$, or $FG,2$F64$FG$. See $LK,"DocDataFmt",A="MN:DocDataFmt"$() and $LK,"DocDataScan",A="MN:DocDataScan"$().
If you are not using $LK,"DocForm",A="MN:DocForm"$(), make a $FG,2$$$DA...$$$FG$ statement with $LK,"DocPrint",A="MN:DocPrint"$() and fill-in the $FG,2$->data$FG$ addr. See $LK,"task_title",A="FF:::/Adam/DolDoc/DocEd.CPP,&Fs->task_title"$.
The $LK,"CDocEntry",A="MN:CDocEntry"$.aux_str arg $FG,2$A=""$FG$ is used for the format string.
The default raw data type for the $FG,2$$$DA...$$$FG$ command is $FG,2$RT=I64$FG$. $LK,"DocForm",A="MN:DocForm"$() will automatically reset the raw type to the value from the $LK,"HolyC",A="FI:::/Doc/HolyC.TXT"$ $FG,2$class$FG$ member's definition if you leave it set to the default. Or, if not using $LK,"DocForm",A="MN:DocForm"$(), specify a raw data type of $FG,2$I8$FG$, $FG,2$U8$FG$, $FG,2$I16$FG$, $FG,2$U16$FG$, $FG,2$I32$FG$, $FG,2$U32$FG$, $FG,2$I64$FG$, $FG,2$U64$FG$, or $FG,2$F64$FG$. See $LK,"DocDataFmt",A="MN:DocDataFmt"$() and $LK,"DocDataScan",A="MN:DocDataScan"$().
If there is a ':', the space after the first ':' in the format string marks the first valid cursor pos. See $LK,"Data Tag Width",A="FA:::/Adam/DolDoc/DocPlain.CPP,DataTagWidth"$.
The $LK,"CDocEntry",A="MN:CDocEntry"$.aux_str arg $FG,2$A=""$FG$ is used for the print/scan format string.
The default field length is $FG,2$LEN=64$FG$ characters. For U8 arrays[], $LK,"DocForm",A="MN:DocForm"$() will automatically reset the field length to the string length from the $LK,"HolyC",A="FI:::/Doc/HolyC.TXT"$ $FG,2$class$FG$ member's definition. The length measures starting after the ':' in the $FG,2$A=""$FG$ format string.
The space after the first ':' in the format string marks the first valid cursor pos. See $LK,"Data Tag Width",A="FA:::/Adam/DolDoc/DocPlain.CPP,DataTagWidth"$.
$ID,-2$$TR,"CB Check Box"$
$ID,2$Used for forms. Use $FG,2$<CTRL-l>$FG$ as a text widgets editor to help you generate the text you need in your "$FG,2$fmtstr$FG$" cmd in a $FG,2$class$FG$. If you add it directly with $LK,"DocPrint",A="MN:DocPrint"$(), you'll need to fill-in the data addr. See $LK,"DocForm",A="MN:DocForm"$(), $LK,"CEdFindText",A="MN:CEdFindText"$ and $LK,"::/Demo/DolDoc/Form.CPP"$.
$ID,2$Used for forms. Use $FG,2$<CTRL-l>$FG$ to help you generate the DolDoc command text you need in your $LK,"HolyC",A="FI:::/Doc/HolyC.TXT"$ $FG,2$class$FG$ member's $FG,2$fmtstr$FG$ meta-data for $LK,"DocForm",A="MN:DocForm"$(). See $LK,"::/Demo/DolDoc/Form.CPP"$$FG$ and $LK,"CEdFindText",A="MN:CEdFindText"$.
The default data-type for the $FG,2$$$CB...$$$FG$ command is $FG,2$I8$FG$ which is $FG,2$Bool$FG$. You can change it to $FG,2$I8$FG$, $FG,2$U8$FG$, $FG,2$I16$FG$, $FG,2$U16$FG$, $FG,2$I32$FG$, $FG,2$U32$FG$, $FG,2$I64$FG$, or $FG,2$U64$FG$. See $LK,"DocDataFmt",A="MN:DocDataFmt"$() and $LK,"DocDataScan",A="MN:DocDataScan"$().
If you are not using $LK,"DocForm",A="MN:DocForm"$(), make a $FG,2$$$CB...$$$FG$ statement with $LK,"DocPrint",A="MN:DocPrint"$() and fill-in the $FG,2$->data$FG$ addr. See $LK,"task_title",A="FF:::/Adam/DolDoc/DocEd.CPP,&Fs->task_title"$.
The default raw data type for the $FG,2$$$CB...$$$FG$ command is $FG,2$RT=I8$FG$ which is $FG,2$Bool$FG$$FG$. $LK,"DocForm",A="MN:DocForm"$() will automatically reset the raw type to the value from the $LK,"HolyC",A="FI:::/Doc/HolyC.TXT"$ $FG,2$class$FG$ member's definition if you leave it set to the default. Or, if not using $LK,"DocForm",A="MN:DocForm"$(), specify a raw data type of $FG,2$I8$FG$, $FG,2$U8$FG$, $FG,2$I16$FG$, $FG,2$U16$FG$, $FG,2$I32$FG$, $FG,2$U32$FG$, $FG,2$I64$FG$, $FG,2$U64$FG$, or $FG,2$F64$FG$. See $LK,"DocDataFmt",A="MN:DocDataFmt"$() and $LK,"DocDataScan",A="MN:DocDataScan"$().
$ID,-2$$TR,"LS List Widget"$
$ID,2$Used for forms that prompt for data. You must specify a define list, $FG,2$D=""$FG$. Use $FG,2$<CTRL-l>$FG$ as a text widgets editor to help you generate the text you need in your "$FG,2$fmtstr$FG$" cmd in a $FG,2$class$FG$. If you add it directly with $LK,"DocPrint",A="MN:DocPrint"$(), you'll need to fill-in the data addr. See $LK,"DocForm",A="MN:DocForm"$() and $LK,"::/Demo/DolDoc/Form.CPP"$.
$ID,2$Used for forms that prompt for data. You must specify a define list, $FG,2$D=""$FG$. Use $FG,2$<CTRL-l>$FG$ to help you generate the DolDoc command text you need in your $LK,"HolyC",A="FI:::/Doc/HolyC.TXT"$ $FG,2$class$FG$ member's $FG,2$fmtstr$FG$ meta-data for $LK,"DocForm",A="MN:DocForm"$(). See $LK,"::/Demo/DolDoc/Form.CPP"$.
The default data-type for the $FG,2$$$LS...$$$FG$ command is $FG,2$I64$FG$. You can change it to $FG,2$I8$FG$, $FG,2$U8$FG$, $FG,2$I16$FG$, $FG,2$U16$FG$, $FG,2$I32$FG$, $FG,2$U32$FG$, $FG,2$I64$FG$, or $FG,2$U64$FG$. See $LK,"DocDataFmt",A="MN:DocDataFmt"$() and $LK,"DocDataScan",A="MN:DocDataScan"$().
If you are not using $LK,"DocForm",A="MN:DocForm"$(), make a $FG,2$$$LS...$$$FG$ statement with $LK,"DocPrint",A="MN:DocPrint"$() and fill-in the data addr. See $LK,"task_title",A="FF:::/Adam/DolDoc/DocEd.CPP,&Fs->task_title"$.
The default raw data type for the $FG,2$$$LS...$$$FG$ command is $FG,2$RT=I64$FG$. $LK,"DocForm",A="MN:DocForm"$() will automatically reset the raw type to the value from the $LK,"HolyC",A="FI:::/Doc/HolyC.TXT"$ $FG,2$class$FG$ member's definition if you leave it set to the default. Or, if not using $LK,"DocForm",A="MN:DocForm"$(), specify a raw data type of $FG,2$I8$FG$, $FG,2$U8$FG$, $FG,2$I16$FG$, $FG,2$U16$FG$, $FG,2$I32$FG$, $FG,2$U32$FG$, $FG,2$I64$FG$, $FG,2$U64$FG$, or $FG,2$F64$FG$. See $LK,"DocDataFmt",A="MN:DocDataFmt"$() and $LK,"DocDataScan",A="MN:DocDataScan"$().
$ID,-2$$TR,"MA Macro"$
$ID,2$A left macro arg, $FG,2$LM=""$FG$, will send text when the left mouse is clicked.
@@ -215,6 +223,10 @@ $ID,-2$
<$LK,"ArgCode",A="FF:::/Adam/DolDoc/DocInit.CPP,ST_DOC_FLAGS"$> See $LK,"Arg Defines",A="MN:DOCEf_TAG"$.
$TR,"T=\"\" Tag Str"$
$ID,2$Some cmds have a tag by default. See $LK,"TX+T",A="FF:::/Adam/DolDoc/DocInit.CPP,TX+T"$. You can code $FG,2$T="tag_text"$FG$ as just $FG,2$"tag_text"$FG$ with no $FG,2$T=$FG$.
$ID,-2$$TR,"LEN=\"\" Field Length"$
$ID,2$The default field length for $FG,2$$$DA...$$$FG$ commands is $FG,2$LEN=64$FG$ characters. For U8 arrays[], $LK,"DocForm",A="MN:DocForm"$() will automatically reset the field length to the string length from the $LK,"HolyC",A="FI:::/Doc/HolyC.TXT"$ $FG,2$class$FG$ member's definition. The length measures starting after the ':' in the $FG,2$A=""$FG$ format string.
The space after the first ':' in the format string marks the first valid cursor pos. See $LK,"Data Tag Width",A="FA:::/Adam/DolDoc/DocPlain.CPP,DataTagWidth"$.
$ID,-2$$TR,"A=\"\" Auxilliary Str"$
$ID,2$Some cmds need auxilliary strings. $FG,2$A="str"$FG$ means an $LK,"CDocEntry",A="MN:CDocEntry"$.aux_str is present. aux_str is used for song note text, link text, anchor text, and $FG,2$$$DA...$$$FG$ format string text.
$ID,-2$$TR,"D=\"\" Define Str"$
@@ -245,9 +257,9 @@ $ID,2$The BinPtrLink flags lets you specify a filename and bin num to import a b
$FG,2$$$SP,"<tag>",BI=1,BP="filename,1"$$$FG$ will import bin num "1" from filename.
$FG,2$$$SP,"<1>",BI=1,BP="::/Demo/Graphics/Mountain.CPP.Z,Mountain"$$$FG$ will import bin with tag name "Mountain" from "::/Demo/Graphics/Mountain.CPP.Z".
$ID,-2$$TR,"RT=<raw_data_type>"$
$ID,2$The default data-type for the $FG,2$$$DA...$$$FG$ command is $FG,2$I64$FG$. The default for the $FG,2$$$CB...$$$FG$ command is $FG,2$I8$FG$ which is $FG,2$Bool$FG$.
$ID,2$The default data-type for the $FG,2$$$DA...$$$FG$ and $FG,2$$$LS...$$$FG$ commands is $FG,2$RT=I64$FG$. If you do not specify a raw type and are using $LK,"DocForm",A="MN:DocForm"$(), it will use the $FG,2$class$FG$ member's raw type, automatically. The default for the $FG,2$$$CB...$$$FG$ command is $FG,2$RT=I8$FG$ which is $FG,2$Bool$FG$.
You can change it to $FG,2$I8$FG$, $FG,2$U8$FG$, $FG,2$I16$FG$, $FG,2$U16$FG$, $FG,2$I32$FG$, $FG,2$U32$FG$, $FG,2$I64$FG$, $FG,2$U64$FG$, or $FG,2$F64$FG$. See $LK,"DocDataFmt",A="MN:DocDataFmt"$() and $LK,"DocDataScan",A="MN:DocDataScan"$().
If not using $LK,"DocForm",A="MN:DocForm"$(), change it to $FG,2$I8$FG$, $FG,2$U8$FG$, $FG,2$I16$FG$, $FG,2$U16$FG$, $FG,2$I32$FG$, $FG,2$U32$FG$, $FG,2$I64$FG$, $FG,2$U64$FG$, or $FG,2$F64$FG$. See $LK,"DocDataFmt",A="MN:DocDataFmt"$() and $LK,"DocDataScan",A="MN:DocDataScan"$().
$ID,-2$$TR,"SX=<Exp> Shift X"$
$ID,2$Shift tag text $FG,2$+$FG$/$FG,2$- 7$FG$ X pixels off the grid.
$ID,-2$$TR,"SY=<Exp> Shift Y"$
+3 -3
View File
@@ -17,7 +17,7 @@ $ID,2$TempleOS compiles, doesn't $FG,2$interpret$FG$, and uses no $FG,2$byte cod
$ID,-2$$TR,"Are you a Creationist?"$
$ID,2$I am an evolutionist. $FG,2$Adam$FG$ is a better term for the first father of all tasks than $FG,2$root$FG$ was!
$ID,-2$$TR,"Is 'Bt()' in the code Bit Torrent?"$
$ID,2$$LK,"Bt",A="MN:Bt"$() is $FG,2$bit test$FG$, like the $FG,2$x86$FG$ instruction, not $FG,2$bit torrent$FG$.
$ID,2$$LK,"Bt",A="MN:Bt"$() is $FG,2$bit test$FG$, like the $FG,2$x86$FG$ inst, not $FG,2$bit torrent$FG$.
$ID,-2$$TR,"Is 'Fs->' in the code file system?"$
$ID,2$$LK,"Fs",A="MN:Fs"$ is a segment reg, not $FG,2$file system$FG$. ($LK,"Fs",A="MN:Fs"$ is kept pointing to the current task's record.) There is no memory segmentation. It is 64-bit and flat. FS and GS are used as general purpose regs, more or less.
$ID,-2$$TR,"Is it Pascal?"$
@@ -49,7 +49,7 @@ $ID,2$TempleOS identity-maps all memory, all the time. It is like paging is not
$ID,-2$$TR,"Why does it run code from stack addresses?"$
$ID,2$TempleOS puts all code in the lowest 2 Gig, known as the $LK,"Code Heap",A="FF:::/Doc/Glossary.TXT,Code and Data Heaps"$, so that the $FG,2$REL32$FG$ addressing mode can be used. TempleOS is 64-bit, but $FG,2$2 Gig$FG$ is enough for code. It actually puts global variables there, too, but you can turn that off with $LK,"OPTf_GLBLS_ON_DATA_HEAP",A="MN:OPTf_GLBLS_ON_DATA_HEAP"$. $LK,"MAlloc",A="MN:MAlloc"$() allocs higher memory.
$ID,-2$$TR,"How does it SYSCALL?"$
$ID,2$TempleOS doesn't use software interrupts or $FG,2$SYSCALL$FG$ instructions because it never needs to change out of ring-0, even running user programs. Calls are always $FG,2$CALL REL32$FG$ instructions.
$ID,2$TempleOS doesn't use software interrupts or $FG,2$SYSCALL$FG$ insts because it never needs to change out of ring-0, even running user programs. Calls are always $FG,2$CALL REL32$FG$ insts.
$ID,-2$$TR,"How do you fault-in stack?"$
$ID,2$The stack does not grow, so do not do deep recursion. In theory, memory gets fragmented, too.
$ID,-2$$TR,"How do I set the PATH?"$
@@ -62,7 +62,7 @@ $ID,-2$$TR,"Why is there some 16-Bit code?"$
$ID,2$TempleOS is 64-bit. Like all PC operating systems, the boot-loader starts in 16-bit real-mode. TempleOS calls a few $FG,2$BIOS$FG$ info routines, switches to VGA-640x480x4bit, switches to 32-bit, then, 64-bit mode. There is an odd thing called a $FG,2$$TX,"PCI BIOS",HTML="http://www.o3one.org/hwdocs/bios_doc/pci_bios_21.pdf"$$FG$ which is 32-bit used for $FG,2$PCI$FG$ config space access. TempleOS calls $LK,"that",A="FI:::/Kernel/PCIBIOS.CPP"$ a couple times. It must temporarily drop-out-of 64-bit mode for that and stop multi-tasking.
$ID,-2$$TR,"Why are you pushing 32-bit values on the stack?"$
$ID,2$$FG,2$PUSH EAX$FG$ : All stack operations in 64-bit mode are 64-bits.
$ID,-2$$TR,"Why are you using 32-bit instructions and not setting high 32-bits?"$
$ID,-2$$TR,"Why are you using 32-bit insts and not setting high 32-bits?"$
$ID,2$$FG,2$XOR EAX,EAX$FG$ : Operations on 32-bit regs clear the high 32-bits.
$ID,-2$$TR,"How do you use the FS and GS segment registers."$
$ID,2$$FG,2$MOV RAX,FS:[RAX]$FG$ : FS can be set with a $FG,2$WRMSR$FG$, but displacement is RIP relative, so it's tricky to use. FS is used for the current $LK,"CTask",A="MN:CTask"$, GS for $LK,"CCPU",A="MN:CCPU"$.
+1 -1
View File
@@ -30,7 +30,7 @@
* $FG,2$64-bit pointers$FG$. All memory, even more than 4 Gig, can be directly accessed by all tasks on all cores at all times.
* $FG,2$Ring-0-only$FG$. Highest CPU privileged mode at all times. No off-limits instructions. No time lost changing modes or address maps. Switches tasks in half a microsecond.
* $FG,2$Ring-0-only$FG$. Highest CPU privileged mode at all times. No off-limits insts. No time lost changing modes or address maps. Switches tasks in half a microsecond.
* $FG,2$2D/3D$FG$ graphics library
+1 -1
View File
@@ -9,7 +9,7 @@ $FG,2$"/*.TXT*;~*/Bible*"$FG$ BaseDir: $FG,2$Root$FG$ Mask: $FG,2$*.TXT*$FG$ bu
See $LK,"FilesFindMatch",A="MN:FilesFindMatch"$().
Flags are either text or integer values.
Flags are either text or int values.
$LK,"FUF_RECURSE",A="MN:FUF_RECURSE"$ $FG,2$+r$FG$ Recurse
$LK,"FUF_SINGLE",A="MN:FUF_SINGLE"$ $FG,2$+s$FG$ Single File (Optimization for one file in mask.)
Loaded 100 of 118 files, more files were not shown because too many files have changed in this diff. Show more