LTCD_070816.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:45:20 +02:00
1 parent d14bbc24f9
commit 0e9364ff4c
506 files changed
+157705 -41812

No files matched your search

File diff suppressed because it is too large. Load diff
+281
View File
@@ -0,0 +1,281 @@
ALIGN 4,OC_NOP
CMP_INTERNAL_TYPES_TABLE::
DU4 HTT_INTERNAL_TYPE,IT_I8,8;
DU1 "void",0;
DU4 HTT_INTERNAL_TYPE,IT_DOUBLE,8;
DU1 "double",0;
DU4 HTT_INTERNAL_TYPE,IT_I0,0;
DU1 "I0i",0;
DU4 HTT_INTERNAL_TYPE,IT_U0,0;
DU1 "U0i",0;
DU4 HTT_INTERNAL_TYPE,IT_I0,0;
DU1 "I0",0;
DU4 HTT_INTERNAL_TYPE,IT_U0,0;
DU1 "U0",0;
DU4 HTT_INTERNAL_TYPE,IT_I1,1;
DU1 "I1i",0;
DU4 HTT_INTERNAL_TYPE,IT_U1,1;
DU1 "U1i",0;
DU4 HTT_INTERNAL_TYPE,IT_I1,1;
DU1 "I1",0;
DU4 HTT_INTERNAL_TYPE,IT_U1,1;
DU1 "U1",0;
DU4 HTT_INTERNAL_TYPE,IT_I2,2;
DU1 "I2i",0;
DU4 HTT_INTERNAL_TYPE,IT_U2,2;
DU1 "U2i",0;
DU4 HTT_INTERNAL_TYPE,IT_I4,4;
DU1 "I4i",0;
DU4 HTT_INTERNAL_TYPE,IT_U4,4;
DU1 "U4i",0;
DU4 HTT_INTERNAL_TYPE,IT_I8,8;
DU1 "I8i",0;
DU4 HTT_INTERNAL_TYPE,IT_U8,8;
DU1 "U8i",0;
DU4 HTT_INVALID;
//*******************************************************
ALIGN 8,OC_NOP
CMP_OPT_NOP:
DU4 EC_NOP; //Must be at IC_CODE offset
DU1 256 DUP(0);
/**********
void OptNext(IntermediateCode *tempi,
IntermediateCode **temp_lag)
{
I8 i,j=0;
for (i=3;i>0;i--)
temp_lag[i]=temp_lag[i-1];
temp_lag[0]=tempi;
for (i=0;i<4;i++)
if (temp_lag[i]->opcode>EC_END_EXP)
temp_lag[j++]=temp_lag[i];
while (j<4)
temp_lag[j++]=&opt_nop;
}
************/
ALIGN 8,OC_NOP
CP_OPTNEXT::
PUSH RBP
MOV RBP,RSP
PUSH RDI
MOV RCX,U8 SF_PARAM1[RBP]
MOV RDX,U8 SF_PARAM2[RBP]
MOV RAX,U8 16[RDX]
MOV U8 24[RDX],RAX
MOV RAX,U8 8[RDX]
MOV U8 16[RDX],RAX
MOV RAX,U8 [RDX]
MOV U8 8[RDX],RAX
MOV U8 [RDX],RCX
MOV RDI,RDX
MOV RAX,RCX
CMP U2 IC_CODE[RAX],EC_END_EXP
JBE @@10
STOSQ
@@10: MOV RAX,U8 8[RDX]
CMP U2 IC_CODE[RAX],EC_END_EXP
JBE @@11
STOSQ
@@11: MOV RAX,U8 16[RDX]
CMP U2 IC_CODE[RAX],EC_END_EXP
JBE @@12
STOSQ
@@12: MOV RAX,U8 24[RDX]
CMP U2 IC_CODE[RAX],EC_END_EXP
JBE @@13
STOSQ
@@13: MOV RAX,CMP_OPT_NOP
ADD RDX,32
JMP @@15
@@14: STOSQ
@@15: CMP RDI,RDX
JB @@14
POP RDI
POP RBP
RET
/**********
void OptNext2(IntermediateCode *tempi,
IntermediateCode **temp_lag)
{
I8 i,j=0;
for (i=3;i>0;i--)
temp_lag[i]=temp_lag[i-1];
temp_lag[0]=tempi;
for (i=0;i<4;i++)
if (temp_lag[i]->opcode>=EC_END_EXP)
temp_lag[j++]=temp_lag[i];
while (j<4)
temp_lag[j++]=&opt_nop;
}
************/
ALIGN 8,OC_NOP
CP_OPTNEXT2::
PUSH RBP
MOV RBP,RSP
PUSH RDI
MOV RCX,U8 SF_PARAM1[RBP]
MOV RDX,U8 SF_PARAM2[RBP]
MOV RAX,U8 16[RDX]
MOV U8 24[RDX],RAX
MOV RAX,U8 8[RDX]
MOV U8 16[RDX],RAX
MOV RAX,U8 [RDX]
MOV U8 8[RDX],RAX
MOV U8 [RDX],RCX
MOV RDI,RDX
MOV RAX,RCX
CMP U2 IC_CODE[RAX],EC_END_EXP
JB @@10
STOSQ
@@10: MOV RAX,U8 8[RDX]
CMP U2 IC_CODE[RAX],EC_END_EXP
JB @@11
STOSQ
@@11: MOV RAX,U8 16[RDX]
CMP U2 IC_CODE[RAX],EC_END_EXP
JB @@12
STOSQ
@@12: MOV RAX,U8 24[RDX]
CMP U2 IC_CODE[RAX],EC_END_EXP
JB @@13
STOSQ
@@13: MOV RAX,CMP_OPT_NOP
ADD RDX,32
JMP @@15
@@14: STOSQ
@@15: CMP RDI,RDX
JB @@14
POP RDI
POP RBP
RET
ALIGN 8,OC_NOP
CP_OPTNEXT3::
PUSH RBP
MOV RBP,RSP
PUSH RDI
MOV RCX,U8 SF_PARAM1[RBP]
MOV RDX,U8 SF_PARAM2[RBP]
MOV RAX,U8 16[RDX]
MOV U8 24[RDX],RAX
MOV RAX,U8 8[RDX]
MOV U8 16[RDX],RAX
MOV RAX,U8 [RDX]
MOV U8 8[RDX],RAX
MOV U8 [RDX],RCX
MOV RDI,RDX
MOV RAX,RCX
CMP U2 IC_CODE[RAX],EC_END_EXP
JB @@10
CMP U2 IC_CODE[RAX],EC_NOP1
JE @@10
STOSQ
@@10: MOV RAX,U8 8[RDX]
CMP U2 IC_CODE[RAX],EC_END_EXP
JB @@11
CMP U2 IC_CODE[RAX],EC_NOP1
JE @@11
STOSQ
@@11: MOV RAX,U8 16[RDX]
CMP U2 IC_CODE[RAX],EC_END_EXP
JB @@12
CMP U2 IC_CODE[RAX],EC_NOP1
JE @@12
STOSQ
@@12: MOV RAX,U8 24[RDX]
CMP U2 IC_CODE[RAX],EC_END_EXP
JB @@13
CMP U2 IC_CODE[RAX],EC_NOP1
JE @@13
STOSQ
@@13: MOV RAX,CMP_OPT_NOP
ADD RDX,32
JMP @@15
@@14: STOSQ
@@15: CMP RDI,RDX
JB @@14
POP RDI
POP RBP
RET
//*******************************************************
/****
void PrsPush(ParseStack *ps,I8 val)
{
ps->stk[ps->ptr++]=val;
}
I8 PrsPop(ParseStack *ps)
{
return ps->stk[--ps->ptr];
}
******/
ALIGN 8,OC_NOP
CP_PRSPUSH::
PUSH RBP
MOV RBP,RSP
MOV RCX,U8 SF_PARAM1[RBP]
MOV RAX,U8 [RCX]
INC RAX
MOV RDX,U8 SF_PARAM2[RBP]
MOV U8 [RCX+RAX*8],RDX
MOV U8 [RCX],RAX
POP RBP
RET
ALIGN 8,OC_NOP
CP_PRSPOP::
PUSH RBP
MOV RBP,RSP
MOV RCX,U8 SF_PARAM1[RBP]
MOV RBX,U8 [RCX]
MOV RAX,U8 [RCX+RBX*8]
DEC RBX
MOV U8 [RCX],RBX
POP RBP
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_HI_CALL::
PUSH RBP
MOV RBP,RSP
MOV RAX,U8 SF_PARAM1[RBP]
OR RAX,RAX
JZ @@100
CALL RAX
@@100: POP RBP
RET
+254
View File
@@ -0,0 +1,254 @@
//Intermediate compiler codes
#define EC_NULL 0x000
#define EC_NOP 0x001
#define EC_END_EXP 0x002
#define EC_LABEL 0x003
#define EC_CALL_START 0x004
#define EC_CALL_END 0x005
#define EC_RETURN_START 0x006
#define EC_RETURN_END 0x007
#define EC_NOP1 0x008
#define EC_IMM 0x009
#define EC_DOUBLE 0x00A
#define EC_STR_CONST 0x00B
#define EC_ABSOLUTE_ADDRESS 0x00C
#define EC_TYPE 0x00D //not used (yet)
#define EC_GET_LABEL 0x00E
#define EC_RBP 0x00F
#define EC_REG 0x010
#define EC_FS 0x011
#define EC_GS 0x012
#define EC_LEA 0x013
#define EC_MOV 0x014
#define EC_ADDRESS 0x015
#define EC_COM 0x016
#define EC_NOT 0x017
#define EC_UNARY_MINUS 0x018
#define EC_DEREF 0x019
#define EC__PP 0x01A
#define EC__MM 0x01B
#define EC_PP_ 0x01C
#define EC_MM_ 0x01D
#define EC_SHL 0x01E
#define EC_SHR 0x01F
#define EC_POWER 0x020
#define EC_MUL 0x021
#define EC_DIV 0x022
#define EC_MOD 0x023
#define EC_AND 0x024
#define EC_OR 0x025
#define EC_XOR 0x026
#define EC_ADD 0x027
#define EC_SUB 0x028
#define EC_EQUAL_EQUAL 0x029
#define EC_NOT_EQUAL 0x02A
#define EC_LESS 0x02B
#define EC_GREATER 0x02C
#define EC_LESS_EQUAL 0x02D
#define EC_GREATER_EQUAL 0x02E
#define EC_AND_AND 0x02F
#define EC_OR_OR 0x030
#define EC_XOR_XOR 0x031
#define EC_COLON 0x032
#define EC_QUESTION 0x033
#define EC_ASSIGN 0x034
#define EC_SHL_EQUAL 0x035
#define EC_SHR_EQUAL 0x036
#define EC_MUL_EQUAL 0x037
#define EC_DIV_EQUAL 0x038
#define EC_AND_EQUAL 0x039
#define EC_OR_EQUAL 0x03A
#define EC_XOR_EQUAL 0x03B
#define EC_ADD_EQUAL 0x03C
#define EC_SUB_EQUAL 0x03D
#define EC_ADD_RSP 0x03E
#define EC_ENTER 0x03F
#define EC_LEAVE 0x040
#define EC_RET 0x041
#define EC_CALL 0x042
#define EC_CALL_INDIRECT 0x043
#define EC_CALL_INDIRECT2 0x044
#define EC_IRQ 0x045
#define EC_CLI 0x046
#define EC_STI 0x047
#define EC_DISABLE_CACHE 0x048
#define EC_ENABLE_CACHE 0x049
#define EC_WBINVD 0x04A
#define EC_INVD 0x04B
#define EC_GET_FLAGS 0x04C
#define EC_SET_FLAGS 0x04D
#define EC_GET_BASE_PTR 0x04E
#define EC_SET_BASE_PTR 0x04F
#define EC_GET_STACK_PTR 0x050
#define EC_SET_STACK_PTR 0x051
#define EC_SET_RAX 0x052
#define EC_BT 0x053
#define EC_BTS 0x054
#define EC_BTR 0x055
#define EC_BTC 0x056
#define EC_BSF 0x057
#define EC_BSR 0x058
#define EC_INSQUE 0x059
#define EC_INSQUE_REV 0x05A
#define EC_REMQUE 0x05B
#define EC_STRLEN 0x05C
#define EC_MEMCPY 0x05D
#define EC_MEMSET 0x05E
#define EC_INPD 0x05F
#define EC_INPW 0x060
#define EC_INP 0x061
#define EC_OUTPD 0x062
#define EC_OUTPW 0x063
#define EC_OUTP 0x064
#define EC_RDTSC 0x065
#define EC_JMP 0x066
#define EC_SWITCH 0x067
#define EC_BR_ZERO 0x068
#define EC_BR_NOT_ZERO 0x069
//ADDED DURING PASS1
#define EC_BR_NOT_EQUAL 0x06A
#define EC_BR_EQUAL_EQUAL 0x06B
#define EC_BR_GREATER_EQUAL 0x06C
#define EC_BR_LESS_EQUAL 0x06D
#define EC_BR_GREATER 0x06E
#define EC_BR_LESS 0x06F
#define EC_BR_OR_OR_ZERO 0x070
#define EC_BR_OR_OR_NOT_ZERO 0x071
#define EC_SHL_CONST 0x072
#define EC_SHR_CONST 0x073
#define EC_ADD_CONST 0x074
#define EC_SUB_CONST 0x075
#define EC_PUSH_REGS 0x076
#define EC_POP_REGS 0x077
#define EC_BR_BT 0x078
#define EC_BR_BTS 0x079
#define EC_BR_BTR 0x07A
#define EC_BR_BTC 0x07B
#define EC_BR_NOT_BT 0x07C
#define EC_BR_NOT_BTS 0x07D
#define EC_BR_NOT_BTR 0x07E
#define EC_BR_NOT_BTC 0x07F
#define EC_CALL_END2 0x080
#define EC_LBTS 0x081
#define EC_LBTR 0x082
#define EC_LBTC 0x083
#define EC_BR_LBTS 0x084
#define EC_BR_LBTR 0x085
#define EC_BR_LBTC 0x086
#define EC_BR_NOT_LBTS 0x087
#define EC_BR_NOT_LBTR 0x088
#define EC_BR_NOT_LBTC 0x089
#define EC_BR_AND_AND_ZERO 0x08A
#define EC_BR_AND_AND_NOT_ZERO 0x08B
#define EC_BR_AND_ZERO 0x08C
#define EC_BR_AND_NOT_ZERO 0x08D
#define EC_MOD_EQUAL 0x08E
#define EC_CALL_EXTERN 0x08F
#define EC_ABSI8 0x090
#define EC_PUSH_CMP 0x091
#define EC_PREEMPT 0x092
#define EC_NUM_ENTRIES 0x093
#define KW_INCLUDE 0
#define KW_DEFINE 1
#define KW_UNION 2
#define KW_CATCH 3
#define KW_CLASS 4
#define KW_TRY 5
#define KW_IF 6
#define KW_ELSE 7
#define KW_FOR 8
#define KW_WHILE 9
#define KW_EXTERN 10
#define KW_LTEXTERN 11
#define KW_RETURN 12
#define KW_SIZEOF 13
#define KW_INTERNAL 14
#define KW_FMTSTR 15
#define KW_FMTDATA 16
#define KW_OUTPUT_FUN 17
#define KW_INPUT_FUN 18
#define KW_COUT 19
#define KW_DO 20
#define KW_ASM 21
#define KW_GOTO 22
#define KW_EXE 23
#define KW_BREAK 24
#define KW_CONTINUE 25
#define KW_SWITCH 26
#define KW_CASE 27
#define KW_DEFAULT 28
#define KW_PUBLIC 29
#define KW_OFFSET 30
#define KW_TYPEOF 31
#define KW_IMPORT 32
#define KW_LTIMPORT 33
#define KW_COUTLN 34
#define KW_IFDEF 35
#define KW_IFNDEF 36
#define KW_ENDIF 37
#define KW_ASSERT 38
#define KW_REG 39
#define KW_NOREG 40
#define KW_NOUNUSEDWARN 41
#define KW_HELP_INDEX 42
#define KW_HELP_FILE 43
#define AKW_ALIGN 64
#define AKW_END 65
#define AKW_U1 66
#define AKW_U2 67
#define AKW_U4 68
#define AKW_U8 69
#define AKW_DU1 70
#define AKW_DU2 71
#define AKW_DU4 72
#define AKW_DU8 73
#define AKW_DUP 74
#define AKW_ORG 75
#define AKW_STRUC 76
#define AKW_ENDS 77
#define AKW_USE16 78
#define AKW_USE32 79
#define AKW_USE64 80
#define AKW_IMPORT 81
#define AKW_EXPORT 82
#define AKW_INSERT 83
#define AKW_LIST 84
#define AKW_NOLIST 85
#define AKW_INSERT_COMPRESSED 86
+21
View File
@@ -0,0 +1,21 @@
extern I8 Expression(LexStruct *lx);
extern BoolU8 GetExpression(LexStruct *lx,U1 **exp);
extern U8 PrsUnaryTerm(LexStruct *lx,ParseStack *ps,MemberListStruct **local_var,ArrayDimStruct **tempad);
extern U8 PrsUnaryModifier(LexStruct *lx,ParseStack *ps,MemberListStruct **local_var,ArrayDimStruct **tempad);
extern U8 PrsDereferrence(LexStruct *lx,ParseStack *ps);
extern void PrsExcept(LexStruct *lx,I1 *name=NULL,I1 *msg=NULL);
extern BoolU8 CmpParseStatement(LexStruct *lx,ClassStruct *locals,I8 try_count=0,
CbMiscStruct *break_label=NULL,CbMiscStruct *continue_label=NULL,
BoolU4 saved_prs_semicolon=TRUE);
extern I8 ExecuteCmdLine(LexStruct *lx);
extern IntermediateCode *CmpOptPass1(LexStruct *lx,ClassStruct *fun_class,BoolU4 combined);
extern void CmpOptPass2(LexStruct *lx,ClassStruct *fun_class,I8 *register_offsets);
extern void CmpOptPass3(LexStruct *lx,I8 *register_offsets,U8 *type);
extern void CmpOptPass4(LexStruct *lx);
extern void CmpOptPass5(LexStruct *lx,ClassStruct *fun_class);
extern U8 CmpOptPass678(LexStruct *lx,ClassStruct *fun_class,I8 *register_offsets,U1 *buf,I8 pass,DbgInfo **dbg_info,I8 *min_line,I8 *max_line);
extern I8 CmpKeyWord(LexStruct *lx);
extern void PutLexWarning(LexStruct *lx,I1 *name=NULL,I1 *msg=NULL);
LTextern CMP_INTERNAL_TYPES_TABLE U1 internal_types_table[1];
+13
View File
@@ -0,0 +1,13 @@
SysHashTable *asm_hash;
BoolU4 is_first_compiler,cmp_do_not_write_to_disk;
SysHashEntry *sys_internal_types[IT_NUM_IT];
U2 *duel_I1_tokens1,*duel_I1_tokens2,*duel_I1_tokens3;
U4 *binary_ops_table,*unary_ops_table;
U1 *cmp_param_cnt,*cmp_result_cnt;
U1 *deref_bitmap,*assign_bitmap,*not_constant_bitmap,*cmp_bitmap;
I8 num_stk_temps,num_reg_vars,num_non_ptr_vars;
U8 stk_temps_mask,reg_vars_mask,non_ptr_vars_mask;
U1 *to_stk_temps_map_odd;
U1 *to_stk_temps_map_even;
U1 *to_reg_vars_map,*to_non_ptr_vars_map;
+603
View File
@@ -0,0 +1,603 @@
void LoadAsmHash(BoolU4 first)
{
U8 i,j,type;
U4 *dd;
LexStruct *lx;
I8 size,size1;
SysHashEntry *temph;
OpcodeHashEntry *tempo,*tempo1;
InstructionEntry *tempi;
ClassStruct *tempc;
asm_hash=NewHashTable(2048);
size1=offset(OpcodeHashEntry.ins)+sizeof(InstructionEntry)<<5;
tempo=MAlloc(size1);
lx=LexNew(ReadTextFile("OpCodes.TXZ"),0,NewStr("OpCodes.TXZ"));
lx->hash_table_list=NULL;
Lex(lx);
while (lx->token) {
if (lx->token!=TK_IDENT)
PutAsmError(lx,"ST_EXPECTING_IDENTIFIER");
else {
i=MatchListEntry(lx->ident,"OPCODE\0KEYWORD\0R8\0R16\0R32\0R64\0SEG\0\0",MLE_IGNORE_CASE);
Lex(lx); //skip keyword
if (!i) { //OPCODE
MemSet(tempo,0,size1);
tempo->type=HTT_OPCODE;
tempo->instruction_entry_cnt=0;
tempo->str=lx->ident;
lx->ident=0;
Lex(lx); //Skip OPCODE
while (lx->token && lx->token!=';') {
tempi=&tempo->ins[tempo->instruction_entry_cnt];
tempi->ins_entry_num=tempo->instruction_entry_cnt++;
tempi->opcode_cnt=0;
while (lx->token==TK_INTEGER) {
tempi->opcode[tempi->opcode_cnt++]=lx->cur_i;
Lex(lx);
}
tempi->flags=0;
if (lx->token=='+') {
tempi->flags|=IEF_PLUS_OPCODE;
Lex(lx);
}
if (lx->token=='/') {
if (Lex(lx)==TK_INTEGER) {
tempi->slash_value=lx->cur_i;
Lex(lx);
} else if (lx->token==TK_IDENT) {
tempi->slash_value=SV_REGISTER;
Lex(lx);
}
} else
tempi->slash_value=SV_NONE;
if (lx->token=='*') {
tempi->flags|=IEF_OP_SIZE16;
Lex(lx);
}
if (lx->token==TK_MOD_EQUAL) {
tempi->flags|=IEF_OP_SIZE32|IEF_48_REX;
Lex(lx);
}
if (lx->token=='%') {
tempi->flags|=IEF_OP_SIZE32;
Lex(lx);
}
if (lx->token=='!') {
tempi->flags|=IEF_DONT_SWITCH_MODES;
Lex(lx);
}
if (lx->token=='&') {
tempi->flags|=IEF_DEFAULT;
Lex(lx);
}
if (lx->token=='-') {
tempi->flags|=IEF_NO_REX;
Lex(lx);
}
if (lx->token=='~') {
tempi->flags|=IEF_40_REX;
Lex(lx);
}
if (lx->token=='~') {
tempi->flags|=IEF_40_REX;
Lex(lx);
} else if (lx->token=='=') {
tempi->flags|=IEF_48_REX;
Lex(lx);
}
if (lx->token!=TK_IDENT)
PutAsmError(lx,"ST_EXPECTING_IDENTIFIER");
else {
tempi->opcode_modifier=MatchSysTextEntry(lx->ident,
"ST_OPCODE_MODIFIERS",MLE_IGNORE_CASE);
tempi->arg1=0;
tempi->arg2=0;
if (Lex(lx)==TK_IDENT) {
j=MatchSysTextEntry(lx->ident,
"ST_ARGUMENT_TYPES",MLE_IGNORE_CASE);
tempi->arg1=j;
if (j>=ARGT_REL8 && j<=ARGT_REL32 ||
j>=ARGT_MOFFS8 && j<=ARGT_MOFFS64)
tempi|=IEF_NO_REX;
if (Lex(lx)==TK_IDENT) {
j=MatchSysTextEntry(lx->ident,
"ST_ARGUMENT_TYPES",MLE_IGNORE_CASE);
Lex(lx);
tempi->arg2=j;
if (j>=ARGT_REL8 && j<=ARGT_REL32 ||
j>=ARGT_MOFFS8 && j<=ARGT_MOFFS64)
tempi|=IEF_NO_REX;
}
}
}
}
if (lx->token==';') {
Lex(lx); //Skip ';'
size=offset(OpcodeHashEntry.ins)+
sizeof(InstructionEntry)*tempo->instruction_entry_cnt;
tempo1=MAlloc(size);
MemCpy(tempo1,tempo,size);
tempo1->use_cnt=0;
SetSourceFileInfo(lx,tempo1);
AddSysHashEntry(tempo1,asm_hash);
} else
PutAsmError(lx,"ST_MISSING_SEMICOLON");
} else if (i>=1 && i<=6) { //KEYWORD,R8,R16,R32,R64,SEG
if (lx->token!=TK_IDENT)
PutAsmError(lx,"ST_EXPECTING_IDENTIFIER");
else {
temph=MAllocZ(sizeof(SysHashEntry));
temph->str=lx->ident;
lx->ident=NULL;
temph->use_cnt=0;
SetSourceFileInfo(lx,temph);
Lex(lx); //skip keyword name
if (lx->token!=TK_INTEGER)
PutAsmError(lx,"ST_EXPECTING_INTEGER");
else {
temph->user_data0=lx->cur_i;
if (Lex(lx)!=';')
PutAsmError(lx,"ST_MISSING_SEMICOLON");
else {
Lex(lx); //skip ';'
AddSysHashEntry(temph,asm_hash);
}
}
switch (i) {
case 1:
temph->type=HTT_KEYWORD;
if (first) {
temph=MAllocIdentical(temph);
AddSysHashEntry(temph,adam_tss->hash_table);
}
break;
case 2: temph->type=HTT_R8; break;
case 3: temph->type=HTT_R16; break;
case 4: temph->type=HTT_R32; break;
case 5: temph->type=HTT_R64; break;
case 6: temph->type=HTT_SEG; break;
}
}
} else
PutAsmError(lx,"Unknown Statement");
}
}
Free(tempo);
LexDel(lx);
dd=internal_types_table;
while (*dd!=HTT_INVALID) {
tempc=CmpClassNew;
tempc->type=*dd; dd+=4;
tempc->use_cnt=0;
tempc->source_link=NULL;
tempc->index=NULL;
tempc->sub_type=*dd; dd+=4;
tempc->size=*dd; dd+=4;
tempc->str=ANewStr(dd);
dd+=StrLen(tempc->str)+1;
AddSysHashEntry(tempc,asm_hash);
sys_internal_types[tempc->sub_type]=tempc;
if (first) {
tempc=MAllocIdentical(tempc);
AddSysHashEntry(tempc,adam_tss->hash_table);
}
}
}
void LoadCompileSysText()
{
LoadStr("ST_ERROR",ST_ERROR);
LoadStr("ST_WARNING",ST_WARNING);
LoadStr("ST_MISSING_SEMICOLON","missing ';' at");
LoadStr("ST_MISSING_EXPRESSION","missing Expression at ");
LoadStr("ST_MISSING_RIGHT_PAREN","missing ')' at ");
LoadStr("ST_MISSING_RIGHT_BRACKET","missing ']' at ");
LoadStr("ST_UNDEFINED_SYMBOL","undefined symbol at ");
LoadStr("ST_UNDEFINED_IDENTIFIER","undefined identifier at ");
LoadStr("ST_INVALID_CLASS","invalid class at ");
LoadStr("ST_INVALID_MEMBER","invalid member at ");
LoadStr("ST_EXPECTING_TYPE","expecting type at ");
LoadStr("ST_EXPECTING_IDENTIFIER","expecting identifier at ");
LoadStr("ST_EXPECTING_RIGHT_PAREN","expecting ')' at ");
LoadStr("ST_EXPECTING_LEFT_BRACE","expecting '{' at ");
LoadStr("ST_MISSING_RIGHT_BRACE","missing '}' at ");
LoadStr("ST_INVALID_LVALUE","invalid lvalue at ");
LoadStr("ST_EXPECTING_EQUAL","expecting '=' at ");
LoadStr("ST_NOT_POINTER_TYPE","not pointer type at ");
LoadStr("ST_EXPECTING_COMMA","expecting ',' at ");
LoadStr("ST_EXPECTING_SYS_SYMBOL","expecting System symbol at ");
LoadStr("ST_EXPECTING_STR","expecting str at ");
LoadStr("ST_MISSING_WHILE","missing 'while' at");
LoadStr("ST_UNKNOWN_STATEMENT","unknown statement at ");
LoadStr("ST_ALREADY_ONE_IMMEDIATE","already one immediate at ");
LoadStr("ST_SYNTAX_ERROR","syntax error at ");
LoadStr("ST_EXPECTING_SCALE_FACTOR","expecting scale factor at ");
LoadStr("ST_QUESTION_NOT_ALLOWED","'?' not allowed at ");
LoadStr("ST_EXPECTING_LEFT_PAREN","expecting '(' at ");
LoadStr("ST_UNDEFINED_DUP_CNT","undefined DUP cnt at ");
LoadStr("ST_EXPECTING_COLON","expecting ':' at ");
LoadStr("ST_EXPECTING_DOUBLE_COLON","expecting '::' at ");
LoadStr("ST_EXPECTING_DOT","expecting '.' at ");
LoadStr("ST_EXPECTING_LOCAL_VARIABLE","expecting local variable at ");
LoadStr("ST_REDEFINITION","redefinition at ");
LoadStr("ST_INVALID_INSTRUCTION","invalid instruction at ");
LoadStr("ST_INTERNAL_ERROR","LTintern error at ");
LoadStr("ST_BRANCH_OUT_OF_RANGE","branch out of range at ");
LoadStr("ST_ATTEMPT_DEFINE_IMPORT","attempt to define import at ");
LoadStr("ST_COULD_USE_U1_DISP","could use U1 displacement at ");
LoadStr("ST_LINE","line: ");
LoadStr("ST_NO_SIZE_SPECIFIED","no size specified at ");
LoadList("ST_IT_TYPES","I0\0U0\0I1\0U1\0I2\0U2\0I4\0U4\0I8\0U8\0double\0udouble\0");
LoadList("ST_TY_TYPES","NULL\0IMM\0REG\0DISP\0RIP\0STK\0\0");
LoadList("ST_U1_REGS","AL\0CL\0DL\0BL\0AH\0CH\0DH\0BH\0"
"R8u1\0R9u1\0R10u1\0R11u1\0R12u1\0R13u1\0R14u1\0R15u1\0");
LoadList("ST_U2_REGS","AX\0CX\0DX\0BX\0SP\0BP\0SI\0DI\0"
"R8u2\0R9u2\0R10u2\0R11u2\0R12u2\0R13u2\0R14u2\0R15u2\0");
LoadList("ST_U4_REGS","EAX\0ECX\0EDX\0EBX\0ESP\0EBP\0ESI\0EDI\0"
"R8u4\0R9u4\0R10u4\0R11u4\0R12u4\0R13u4\0R14u4\0R15u4\0");
LoadList("ST_U8_REGS","RAX\0RCX\0RDX\0RBX\0RSP\0RBP\0RSI\0RDI\0"
"R8\0R9\0R10\0R11\0R12\0R13\0R14\0R15\0");
LoadList("ST_OPCODE_MODIFIERS","NO\0R\0CB\0CW\0CD\0CP\0IB\0IW\0ID\0RB\0RW\0RD\0");
LoadList("ST_ARGUMENT_TYPES",
"NO\0REL8\0REL16\0REL32\0UIMM8\0UIMM16\0UIMM32\0UIMM64\0"
"R8\0R16\0R32\0R64\0"
"IMM8\0IMM16\0IMM32\0IMM64\0RM8\0RM16\0RM32\0RM64\0"
"M8\0M16\0M32\0"
"M1616\0M1632\0M16N32\0M16N16\0M32N32\0"
"MOFFS8\0MOFFS16\0MOFFS32\0MOFFS64\0"
"AL\0AX\0EAX\0RAX\0CL\0DX\0 \0SREG\0"
"SS\0DS\0ES\0FS\0GS\0CS\0");
LoadList("ST_SEG_REGS","ES\0CS\0SS\0DS\0FS\0GS\0");
LoadStr("ST_EXPECTING_INTEGER","expecting integer at ");
LoadStr("ST_DIVIDE_BY_ZERO","Divide by zero at ");
LoadStr("ST_OPT_INTERNAL_ERROR","Compiler Optimization Error at ");
LoadStr("ST_UNRESOLVED_REFERENCE","Unresolved Reference:");
LoadStr("ST_NOT_DEFINED","Not Defined");
LoadStr("ST_SCANNING_DIRECTORY","Scanning Directory:");
LoadStr("ST_ASM_NOT_ALLOWED","ASM not allowed");
LoadStr("ST_UNUSED_VAR","Unused Var");
LoadStr("ST_UNUSED_EXTERN","Unused extern");
LoadStr("ST_NOT_ALLOWED_IN_FUNCTION","Not allowed in function");
LoadStr("ST_MISSING_CATCH","missing 'catch' at");
LoadStr("ST_UNDEFINED_GOTO_LABEL","Undefined goto label:");
LoadStr("ST_BREAK_NOT_ALLOWED","'break' not allowed\r\n");
LoadStr("ST_CONTINUE_NOT_ALLOWED","'continue' not allowed\r\n");
LoadStr("ST_ERRORS_WARNINGS","Errors:%04d Warnings:%04d Size:%08X\r\n");
LoadStr("ST_IMPORT_NOT_NEEDED","import not needed at ");
LoadStr("ST_EXPECTING_CASE","expecting 'case' at ");
LoadStr("ST_CASE_RANGE_ERROR","switch range error at ");
LoadStr("ST_LEX_STACK_OVERFLOW","Lex Stack overflow");
LoadStr("ST_STR_DEFAULT","Str defaults not implemented in static mode at ");
LoadStr("ST_ASSERT_FAILED","Assert Failed ");
LoadStr("ST_ADDRESS_EXTERN","Can't take address of extern function");
$AN,"Anchor for inserting Compiler systext","COMPILE_SYSTEXT"$
LoadList("ST_INTERMEDIATE_CODE",
// '*' means it is a dereferrence instruction
// '=' means it is an assignment instruction
// '^' means it is a compare instruction
// '9' param count means variable
// 'N' means not constant
// param cnt,result cnt,push prior,deref/assign
"00..NULL\0"
"00..NOP\0"
"10..END_EXP\0"
"00..LABEL\0"
"00..CALL_START\0"
"01..CALL_END\0"
"00..RETURN_START\0"
"00..RETURN_END\0"
"00..NOP1\0"
"01..IMM\0"
"01..DOUBLE\0"
"01.NSTR_CONST\0"
"01.NABSOLUTE_ADDRESS\0"
"01.NTYPE\0"
"01.NGET_LABEL\0"
"01.NRBP\0"
"01.NREG\0"
"00.NFS\0"
"00.NGS\0"
"01.NLEA\0"
"01.NMOV\0"
"11.NADDRESS\0"
"11..COM\0"
"11..NOT\0"
"11..UNARY_MINUS\0"
"11*NDEREF\0"
"11*N_PP\0"
"11*N_MM\0"
"11*NPP_\0"
"11*NMM_\0"
"21..SHL\0"
"21..SHR\0"
"21..POWER\0"
"21..MUL\0"
"21..DIV\0"
"21..MOD\0"
"21..AND\0"
"21..OR\0"
"21..XOR\0"
"21..ADD\0"
"21..SUB\0"
"21^.EQUAL_EQUAL\0"
"21^.NOT_EQUAL\0"
"21^.LESS\0"
"21^.GREATER\0"
"21^.LESS_EQUAL\0"
"21^.GREATER_EQUAL\0"
"21..AND_AND\0"
"21..OR_OR\0"
"21..XOR_XOR\0"
"31..COLON\0"
"00..QUESTION\0"
"21=NASSIGN\0"
"21=NSHL_EQUAL\0"
"21=NSHR_EQUAL\0"
"21=NMUL_EQUAL\0"
"21=NDIV_EQUAL\0"
"21=NAND_EQUAL\0"
"21=NOR_EQUAL\0"
"21=NXOR_EQUAL\0"
"21=NADD_EQUAL\0"
"21=NSUB_EQUAL\0"
"90..ADD_RSP\0"
"00..ENTER\0"
"00..LEAVE\0"
"00..RET\0"
"00.NCALL\0"
"00.NCALL_INDIRECT\0"
"00.NCALL_INDIRECT2\0"
"00.NIRQ\0"
"00..CLI\0"
"00..STI\0"
"00..DISABLE_CACHE\0"
"00..ENABLE_CACHE\0"
"00..WBINVD\0"
"00..INVD\0"
"00.NGET_FLAGS\0"
"10.NSET_FLAGS\0"
"00.NGET_BASE_PTR\0"
"10.NSET_BASE_PTR\0"
"00.NGET_STACK_PTR\0"
"10.NSET_STACK_PTR\0"
"10.NSET_RAX\0"
"20.NBT\0"
"20.NBTS\0"
"20.NBTR\0"
"20.NBTC\0"
"10.NBSF\0"
"10.NBSR\0"
"20.NINSQUE\0"
"20.NINSQUE_REV\0"
"10.NREMQUE\0"
"10.NSTRLEN\0"
"30.NMEMCPY\0"
"30.NMEMSET\0"
"10.NINPD\0"
"10.NINPW\0"
"10.NINP\0"
"20.NOUTPD\0"
"20.NOUTPW\0"
"20.NOUTP\0"
"00.NRDTSC\0"
"00..JMP\0"
"20..SWITCH\0"
"10..BR_ZERO\0"
"10..BR_NOT_ZERO\0"
"20..BR_NOT_EQUAL\0"
"20..BR_EQUAL_EQUAL\0"
"20..BR_GREATER_EQUAL\0"
"20..BR_LESS_EQUAL\0"
"20..BR_GREATER\0"
"20..BR_LESS\0"
"20..BR_OR_OR_ZERO\0"
"20..BR_OR_OR_NOT_ZERO\0"
"11=.SHL_CONST\0"
"11=.SHR_CONST\0"
"11=.ADD_CONST\0"
"11=.SUB_CONST\0"
"00=.PUSH_REGS\0"
"00=.POP_REGS\0"
"20..BR_BT\0"
"20..BR_BTS\0"
"20..BR_BTR\0"
"20..BR_BTC\0"
"20..BR_NOT_BT\0"
"20..BR_NOT_BTS\0"
"20..BR_NOT_BTR\0"
"20..BR_NOT_BTC\0"
"00..CALL_END2\0"
"20.NLBTS\0"
"20.NLBTR\0"
"20.NLBTC\0"
"20.NBR_LBTS\0"
"20.NBR_LBTR\0"
"20.NBR_LBTC\0"
"20.NBR_NOT_LBTS\0"
"20.NBR_NOT_LBTR\0"
"20.NBR_NOT_LBTC\0"
"20..BR_AND_AND_ZERO\0"
"20..BR_AND_AND_NOT_ZERO\0"
"20..BR_AND_ZERO\0"
"20..BR_AND_NOT_ZERO\0"
"21=NMOD_EQUAL\0"
"00.NCALL_EXTERN\0"
"10.NABSI8\0"
"01..PUSH_CMP\0"
"10.NPREEMPT\0"
);
}
void FillCompilerTables()
{
I1 *st;
U8 i,k;
U2 *u;
U4 *d4;
assign_bitmap=MAllocZ((EC_NUM_ENTRIES+7)>>3);
deref_bitmap=MAllocZ((EC_NUM_ENTRIES+7)>>3);
cmp_bitmap=MAllocZ((EC_NUM_ENTRIES+7)>>3);
not_constant_bitmap=MAllocZ((EC_NUM_ENTRIES+7)>>3);
cmp_param_cnt=MAllocZ(EC_NUM_ENTRIES);
cmp_result_cnt=MAllocZ(EC_NUM_ENTRIES);
st=SysText("ST_INTERMEDIATE_CODE");
for (i=0;i<EC_NUM_ENTRIES;i++) {
cmp_param_cnt[i]=st[0]-'0';
cmp_result_cnt[i]=st[1]-'0';
if (st[2]=='*')
Bts(deref_bitmap,i);
else if (st[2]=='=')
Bts(assign_bitmap,i);
else if (st[2]=='^')
Bts(cmp_bitmap,i);
if (st[3]=='N')
Bts(not_constant_bitmap,i);
st+=StrLen(st)+1;
}
to_reg_vars_map=MAllocZ(NUM_REGS*sizeof(U1));
num_reg_vars=0;
reg_vars_mask=CREG_VARS_MASK;
for (i=0;i<NUM_REGS;i++)
if (Bt(&reg_vars_mask,i))
to_reg_vars_map[num_reg_vars++]=i;
to_non_ptr_vars_map=MAllocZ(NUM_REGS*sizeof(U1));
num_non_ptr_vars=0;
non_ptr_vars_mask=CREG_NON_PTR_MASK;
for (i=0;i<NUM_REGS;i++)
if (Bt(&non_ptr_vars_mask,i))
to_non_ptr_vars_map[num_non_ptr_vars++]=i;
to_stk_temps_map_odd=MAllocZ(NUM_REGS*sizeof(U1));
to_stk_temps_map_even=MAllocZ(NUM_REGS*sizeof(U1));
num_stk_temps=0;
stk_temps_mask=CSTK_TEMPS_MASK;
for (i=0;i<NUM_REGS;i++)
if (Bt(&stk_temps_mask,i))
to_stk_temps_map_even[num_stk_temps++]=i;
k=num_stk_temps;
for (i=0;i<NUM_REGS;i++)
if (Bt(&stk_temps_mask,i))
to_stk_temps_map_odd[--k]=i;
u=MAllocZ(sizeof(U2)*TK_NUM_TK);
duel_I1_tokens1=u;
u['!']=256*TK_NOT_EQUAL+'=';
u['&']=256*TK_AND_AND+'&';
u['*']=256*TK_MUL_EQUAL+'=';
u['+']=256*TK_PLUS_PLUS+'+';
u['-']=256*TK_DEREFERRENCE+'>';
u['/']='*';
u[':']=256*TK_DOUBLE_COLON+':';
u['<']=256*TK_LESS_EQUAL+'=';
u['=']=256*TK_EQUAL_EQUAL+'=';
u['>']=256*TK_GREATER_EQUAL+'=';
u['^']=256*TK_XOR_EQUAL+'=';
u['|']=256*TK_OR_OR+'|';
u['%']=256*TK_MOD_EQUAL+'=';
u=MAllocZ(sizeof(U2)*TK_NUM_TK);
duel_I1_tokens2=u;
u['&']=256*TK_AND_EQUAL+'=';
u['+']=256*TK_ADD_EQUAL+'=';
u['-']=256*TK_MINUS_MINUS+'-';
u['/']='/';
u['<']=256*TK_SHL+'<';
u['>']=256*TK_SHR+'>';
u['^']=256*TK_XOR_XOR+'^';
u['|']=256*TK_OR_EQUAL+'=';
u=MAllocZ(sizeof(U2)*TK_NUM_TK);
duel_I1_tokens3=u;
u['-']=256*TK_SUB_EQUAL+'=';
u['/']=256*TK_DIV_EQUAL+'=';
u['>']=256*TK_CAST+'<';
//$AN,"","OP_Precidence"$Here the operator precidences are
//defined.
d4=MAllocZ(sizeof(U4)*TK_NUM_TK);
unary_ops_table=d4;
d4['~']=0x10000+EC_COM;
d4['!']=0x10000+EC_NOT;
d4['-']=0x10000+EC_UNARY_MINUS;
d4['&']=0x10000+EC_ADDRESS;
d4['*']=0x10000+EC_DEREF;
d4=MAllocZ(sizeof(U4)*TK_NUM_TK);
binary_ops_table=d4;
//There is an exponential operator and
//shift instructions are rightfully
//the precidence of exponentials.
d4['`'] =0x20000+EC_POWER;
d4[TK_SHL] =0x20000+EC_SHL;
d4[TK_SHR] =0x20000+EC_SHR;
d4['*'] =0x30000+EC_MUL;
d4['/'] =0x30000+EC_DIV;
d4['%'] =0x30000+EC_MOD;
//$FG,2$&$FG$ is higher precidence $FG,2$|$FG$, like in logic
d4['&'] =0x40000+EC_AND;
d4['|'] =0x50000+EC_OR;
d4['^'] =0x50000+EC_XOR;
d4['+'] =0x60000+EC_ADD;
d4['-'] =0x60000+EC_SUB;
d4[TK_EQUAL_EQUAL] =0x70000+EC_EQUAL_EQUAL;
d4[TK_NOT_EQUAL] =0x70000+EC_NOT_EQUAL;
d4['<'] =0x70000+EC_LESS;
d4['>'] =0x70000+EC_GREATER;
d4[TK_LESS_EQUAL] =0x70000+EC_LESS_EQUAL;
d4[TK_GREATER_EQUAL]=0x70000+EC_GREATER_EQUAL;
//$FG,2$&&$FG$ is higher precidence $FG,2$||$FG$, like in logic
d4[TK_AND_AND] =0x80000+EC_AND_AND;
d4[TK_OR_OR] =0x90000+EC_OR_OR;
d4[TK_XOR_XOR] =0x90000+EC_XOR_XOR;
d4[':'] =0xA0000+EC_COLON;
d4['?'] =0xA0000+EC_QUESTION;
d4['='] =0x100000+EC_ASSIGN;
d4[TK_SHL_EQUAL]=0x100000+EC_SHL_EQUAL;
d4[TK_SHR_EQUAL]=0x100000+EC_SHR_EQUAL;
d4[TK_MUL_EQUAL]=0x100000+EC_MUL_EQUAL;
d4[TK_DIV_EQUAL]=0x100000+EC_DIV_EQUAL;
d4[TK_MOD_EQUAL]=0x100000+EC_MOD_EQUAL;
d4[TK_AND_EQUAL]=0x100000+EC_AND_EQUAL;
d4[TK_OR_EQUAL] =0x100000+EC_OR_EQUAL;
d4[TK_XOR_EQUAL]=0x100000+EC_XOR_EQUAL;
d4[TK_ADD_EQUAL]=0x100000+EC_ADD_EQUAL;
d4[TK_SUB_EQUAL]=0x100000+EC_SUB_EQUAL;
}
void InitCompiler(BoolU4 first)
{
is_first_compiler=first;
cmp_do_not_write_to_disk=FALSE;
if (first)
ext[EXT_CMP_EXE_BLK]=&CmpParseExeBlk;
LoadCompileSysText;
FillCompilerTables;
MemSet(&opt_nop,0,sizeof(IntermediateCode));
opt_nop.ic_class=sys_internal_types[IT_I8];
opt_nop.ic_opcode=EC_NOP;
LoadAsmHash(first);
}
+422
View File
@@ -0,0 +1,422 @@
void CatchAll()
{
I8 i;
if (Fs->except_argc>0) {
if (Fs->except_argv[0]<SysTextSubCount("ST_EXCEPT_TYPES")) {
PrintF("Exception Type :%Z\r\n",Fs->except_argv[0],"ST_EXCEPT_TYPES");
if (Fs->except_argv[0]==EXCEPT_UNDEF_SYSTEXT)
PrintF("Name:'%s'\r\n",Fs->except_argv[1]);
else if (Fs->except_argv[0]==EXCEPT_ARITHMETIC)
PrintF("Address:%P\r\n",Fs->except_argv[1]);
else if (Fs->except_argv[0]==EXCEPT_FLOATING)
PrintF("Address:%P\r\n",Fs->except_argv[1]);
else {
for (i=1;i<Fs->except_argc;i++)
cout Fs->except_argv[i]," ";
CrLf;
}
} else {
cout "Exception:";
for (i=1;i<Fs->except_argc;i++)
cout Fs->except_argv[i]," ";
CrLf;
}
} else
coutln "Generic Exception";
Fs->catch_except=TRUE;
}
void ExePutS(I1 *st)
//Inserts text into the stream of
//characters being compiled. Called
//from withing $FG,2$#exe{}$FG$ block.
{
LexStruct *lx=Fs->last_lex;
ExeBlkStruct *tempe=lx->last_exe_blk;
if (tempe!=&lx->next_exe_blk)
tempe->body=Add2Str(tempe->body,st);
else
PrintFErr("No exe{} blk\r\n");
}
void ExePrintF(I1 *src,...)
//Inserts text into the stream of
//characters being compiled. Called
//from withing $FG,2$#exe{}$FG$ block.
{
I1 *buf=SPrintFJoin(NULL,src,argc,argv);
ExePutS(buf);
Free(buf);
}
U1 *CompileStatement(LexStruct *lx,U8 *type=NULL)
{
U8 *result=INVALID_PTR;
AsmCtrlStruct *a=lx->a;
U8 size,i,j,k;
DbgInfo *dbg=NULL;
IntermediateCode *tempi;
if (type) *type=IT_I8;
Btr(&lx->flags,LFf_OPT_TRACE_PRESENT);
CbInitOutPtrs(&lx->cb);
CbAddIc(lx,EC_RETURN_START,0,sys_internal_types[IT_I8]);
tempi=lx->cb.cb_last_out_ptr;
if (!CmpParseStatement(lx,NULL)) {
if (tempi!=lx->cb.cb_last_out_ptr) {
CbAddIc(lx,EC_RETURN_END,0,sys_internal_types[IT_I8]);
CbAddIc(lx,EC_RET,0,0);
CbAddIc(lx,EC_NULL,0,0);
if (result=CbCompile(lx,NULL,&size,&dbg,type)) {
if (a) {
j=a->ip;
k=(size+7)>>3;
for (i=0;i<k;i++)
AsmStoreCodeU8(lx,result[i]);
Free(result);
result=j;
}
}
} else
DelLinkedList(lx->cb.cb_out_first);
} else
DelLinkedList(lx->cb.cb_out_first);
Free(dbg);
return result;
}
ExeStruct *CompileBuf(U1 *buf,I1 *map_name=NULL,
I8 *error_cnt=NULL, I8 *warning_cnt=NULL,I1 mapfile_drive=0)
{
BoolU4 okay=TRUE;
LexStruct *lx;
AsmCtrlStruct *a;
U8 i,j;
ExeStruct *result=NULL;
AsmCodeBlk *tempc;
ExeImportExportStruct *tempe,*tempe1;
if (!is_first_compiler)
coutln "$$FG PURPLE$$**** Not First Compiler ****$$FG$$";
result=MAllocZ(sizeof(ExeStruct));
lx=LexNew(buf,LF_DONT_FREE_BUFFER,NULL);
InsQue(lx,Fs->last_lex);
a=MAllocZ(sizeof(AsmCtrlStruct));
a->code=MAllocZ(sizeof(AsmCodeBlk));
a->local_hash=NewHashTable(16);
a->glbl_hash=NewHashTable(2048);
a->glbl_hash->next=asm_hash;
a->local_hash->next=a->glbl_hash;
lx->a=a;
lx->hash_table_list=a->local_hash;
lx->define_hash_table=a->glbl_hash;
lx->local_hash_table=a->local_hash;
lx->glbl_hash_table=a->glbl_hash;
Lex(lx);
try {
while (lx->token!=TK_EOF) {
i=CompileStatement(lx);
if (i!=INVALID_PTR) {
tempe=MAlloc(sizeof(ExeImportExportStruct));
tempe->type=EIE_MAIN;
tempe->ip=i;
tempe->str=NULL;
tempe->next=NULL;
tempe1=&result->ie;
while (tempe1->next) //TODO:This could be optimized
tempe1=tempe1->next;
tempe1->next=tempe;
}
}
ResolveGlbls(lx,result);
} catch {
if (Fs->except_argc>0)
if (Fs->except_argv[0]==EXCEPT_COMPILER)
Fs->catch_except=TRUE;
okay=FALSE;
}
RemQue(lx);
if (error_cnt) *error_cnt=lx->error_cnt;
if (warning_cnt) *warning_cnt=lx->warning_cnt;
if (!okay) {
//TODO free debug info and possibly classes
if (error_cnt)
if (*error_cnt<1) *error_cnt=1;
result=NULL;
} else {
if (map_name)
CallExtStr("HashRep",a->glbl_hash,HTT_ALL,map_name,"-r-p",mapfile_drive,NULL,NULL);
LexDel(lx);
DelHashTable(a->local_hash);
DelHashTable(a->glbl_hash);
if (!a->num_code_U1s)
result->code=NULL;
else {
result->code=MAlloc(a->num_code_U1s);
result->code_U1s=a->num_code_U1s;
tempc=a->code;
j=0;
lx=a->num_code_U1s;
while (tempc) {
i=lx;
if (i>ASM_CODE_BLK_SIZE)
i=ASM_CODE_BLK_SIZE;
MemCpy(result->code+j,tempc->body,i);
j+=i;
lx-=i;
tempc=tempc->next;
}
}
DelLinkedList(a->code);
result->absolutes=a->absolutes;
Free(a);
}
return result;
}
I8 CompileFile(I1 *filename,I1 *map_name=NULL,I1 *out_name=NULL,I1 mapfile_drive=0)
{
I1 *fbuf=NULL,*fbuf2=NULL,*fbuf3=NULL;
ExeStruct *e;
U4 *dd;
U8 size=0;
U1 *header=MAlloc(0x20000),*ptr;
BinFileHeaderStruct *bfh;
U8 i,cnt=0,error_cnt=0,warning_cnt=0;
ExeImportExportStruct *tempe,*tempe1;
ExeAbsoluteAddressStruct *tempa,*tempa1;
fbuf=DefaultExtension(filename,"SPZ");
fbuf2=MSPrintF("#include \"%s\"",fbuf);
if (map_name)
fbuf3=DefaultExtension(map_name,"MPZ");
e=CompileBuf(fbuf2,fbuf3,&error_cnt,&warning_cnt,mapfile_drive);
if (e) {
ptr=header;
tempa=e->absolutes;
while (tempa) {
cnt++;
tempa=tempa->next;
}
if (cnt) {
*ptr++=EIE_ABSOLUTE_ADDRESS;
dd=ptr;
*dd=cnt;
ptr+=sizeof(U4);
*ptr++=0;
tempa=e->absolutes;
while (tempa) {
tempa1=tempa->next;
dd=ptr;
*dd=tempa->ip;
ptr+=sizeof(U4);
Free(tempa);
tempa=tempa1;
}
}
tempe=e->ie;
while (tempe) {
tempe1=tempe->next;
*ptr++=tempe->type;
dd=ptr;
*dd=tempe->ip;
ptr+=sizeof(U4);
if (tempe->str) {
i=StrLen(tempe->str);
MemCpy(ptr,tempe->str,i+1);
Free(tempe->str);
ptr+=i+1;
} else
*ptr++=0;
Free(tempe);
tempe=tempe1;
}
*ptr++=EIE_END;
i=(ptr-header+15) & -0x10;
size=i+e->code_U1s+sizeof(BinFileHeaderStruct);
bfh=MAlloc(size);
MemCpy(bfh+e->code_U1s+sizeof(BinFileHeaderStruct),header,i);
MemCpy(bfh+sizeof(BinFileHeaderStruct),e->code,e->code_U1s);
bfh->jmp=0xE9+256*(16-3);
bfh->type=0;
bfh->header_offset=e->code_U1s+sizeof(BinFileHeaderStruct);
bfh->file_size=size;
bfh->xsum=LT_XSUM;
bfh->xsum=ArcCheckSum(bfh,size);
Free(fbuf2);
if (out_name)
fbuf2=DefaultExtension(out_name,"BIZ");
else
fbuf2=ChangeExtension(fbuf,"BIZ");
if (!cmp_do_not_write_to_disk)
WriteFile(fbuf2,bfh,size);
Free(bfh);
Free(e->code);
Free(e);
}
Free(header);
Free(fbuf);
Free(fbuf2);
Free(fbuf3);
PrintF(SysText("ST_ERRORS_WARNINGS"),error_cnt,warning_cnt,size);
return error_cnt;
}
I8 ExecuteCmdLine(LexStruct *lx)
{
I8 result=0,i,type;
I1 *ptr,*ptr2,*ptr3;
U1 *code;
LtfEntry *cl;
Ltf *l;
while (lx->token &&
(lx->token!='}' || !(lx->flags & LF_EXE_BLK)) ) {
if (!Bt(&Fs->task_flags,TSSf_DONT_CHANGE_DESC)) {
ptr2=&Fs->task_descriptor;
ptr3=ptr2+TSS_DESC_LENGTH;
if (lx->cur_lfn->flags & LFSF_IS_LTF) {
cl=lx->cur_lfn->line_start;
l=lx->cur_lfn->l;
while (cl!=l && ptr2<ptr3) {
switch (cl->btype && ptr2<ptr3) {
case LTFT_TEXT:
ptr=cl->display;
while (*ptr && ptr2<ptr3)
*ptr2++=*ptr++;
break;
case LTFT_TAB:
case LTFT_CR:
*ptr2++='.';
break;
}
cl=cl->next;
}
} else
if (ptr=lx->cur_lfn->line_start)
MemCpy(ptr2,ptr,TSS_DESC_LENGTH);
}
code=CompileStatement(lx,&type);
if (code!=INVALID_PTR) {
result=Call(code);
for (i=6;i>=0;i--) {
Fs->answers[i+1]=Fs->answers[i];
Fs->double_answers[i+1]=Fs->double_answers[i];
Fs->answers_types[i+1]=Fs->answers_types[i];
}
Fs->answers[0]=result;
Fs->double_answers[0]=result><(double);
Fs->answers_types[0]=type;
Free(code);
}
}
return result;
}
void ContinueUserTask()
{
LexStruct *lx;
while (TRUE) {
lx=LexNew(NULL,LF_PROMPT,NULL);
InsQue(lx,Fs->last_lex);
try {
Lex(lx);
ExecuteCmdLine(lx);
RemQue(lx);
LexDel(lx); //TODO: Sometimes crashes on BREAK
} catch
CatchAll;
}
}
I1 *CmpMGetS()
{
I1 buf[512];
GetS(buf,512,FALSE);
return NewStr(buf);
}
void CmpDebugger()
{
LBts(&sys_semas[SYS_SEMA_IN_DEBUGGER],0);
Fs->task_flags&=~(1<<TSSf_AWAITING_MSG);
InitUserTask;
sys_cur_focus_task=Fs;
sys_cur_scan_code=0;
ext[EXT_MGETS]=&CmpMGetS;
ContinueUserTask;
}
I8 ExecuteStr(I1 *buf,I1 *filename=NULL)
{
I8 result;
BoolU4 okay=TRUE;
LexStruct *lx;
if (!filename)
filename=sys_temp_filename;
lx=LexNew(buf,LF_DONT_FREE_BUFFER,AbsoluteFileName(filename));
InsQue(lx,Fs->last_lex);
try {
Lex(lx);
result=ExecuteCmdLine(lx);
} catch {
if (Fs->except_argc>0) {
if (Fs->except_argv[0]==EXCEPT_COMPILER ||
Fs->except_argv[0]==EXCEPT_BREAK) {
Fs->catch_except=TRUE;
okay=FALSE;
result=0;
}
}
}
RemQue(lx);
if (okay)
LexDel(lx); //TODO: can crash
return result;
}
I8 ExecuteFile(I1 *name)
{
I8 result;
I1 *name2=DefaultExtension(name,"CPZ");
I1 *st=MSPrintF("#include \"%s\";",name2);
result=ExecuteStr(st,name);
Free(st);
Free(name2);
return result;
}
#define ADAM_STARTUP_NAME "/LT/OSMain/AdamK.APZ"
void AdamStartUpFile()
{
BoolU4 okay=TRUE;
LexStruct *lx=LexNew(ReadTextFile(ADAM_STARTUP_NAME),0,
NewStr(ADAM_STARTUP_NAME));
InsQue(lx,Fs->last_lex);
ext[EXT_SPRINTF_JOIN]=&SPrintFJoin2;
ext[EXT_GETF_JOIN]=&GetFJoin2;
ext[EXT_EXECUTE_FILE]=&ExecuteFile;
ext[EXT_EXECUTE_STR]=&ExecuteStr;
ext[EXT_DEBUGGER]=&CmpDebugger;
InitCompiler(TRUE);
Bts(&lx->flags,LF_ECHO);
//Continues Here $LK,"/LT/OSMain/AdamK.APZ","FL:/LT/OSMain/AdamK.APZ,1"$
try {
Lex(lx);
ExecuteCmdLine(lx);
RemQue(lx);
LexDel(lx); //TODO
} catch {
CatchAll;
okay=FALSE;
}
if (!okay)
Debugger;
}
+2452
View File
File diff suppressed because it is too large. Load diff
+431
View File
@@ -0,0 +1,431 @@
void CbPutClass(ClassStruct *c)
{
I8 i;
if (!c) return;
if (c->ptr_cnt>4) {
PrintFErr("put_class ptrcnt=%d\r\n",c->ptr_cnt);
while (TRUE)
//TODO:
SwapInNext;
}
for (i=0;i<c->ptr_cnt;i++)
PutChar('*');
c-=sizeof(ClassStruct)*c->ptr_cnt;
if (c->str)
PutS(c->str);
else {
PrintFErr("put_class str=NULL\r\n");
while (TRUE)
//TODO:
SwapInNext;
}
PutChar(CH_SPACE);
}
void CbPutIcParam(IcParam *p)
{
if (p->ptype)
PrintF("%Z %Z %Z ",
p->type&IT_MASK,"ST_IT_TYPES",
p->ptype&IT_MASK,"ST_IT_TYPES",
p->type>>4,"ST_TY_TYPES");
else
PrintF("%Z %Z ",
p->type&IT_MASK,"ST_IT_TYPES",
p->type>>4,"ST_TY_TYPES");
switch (p->type>>4) {
case TY_IMM>>4:
PrintF("#%X",p->disp);
break;
case TY_REG>>4:
PrintF("%Z",p->reg,"ST_U8_REGS");
break;
case TY_DISP>>4:
PrintF("%X[%Z]",p->disp,p->reg,"ST_U8_REGS");
break;
case TY_RIP_DISP32>>4:
PrintF("[%X]",p->disp);
break;
}
}
void CbPutIc(IntermediateCode *tempi)
{
U8 opcode=tempi->ic_opcode;
if (opcode>=EC_END_EXP && opcode!=EC_NOP1) {
PrintF("%15ts %016X ",
SysTextSub(opcode,"ST_INTERMEDIATE_CODE")+4,
tempi->ic_data);
if (tempi->r.type&TY_MASK) {
CbPutIcParam(&tempi->r);
cout "<-";
}
if (tempi->p1.type&TY_MASK)
CbPutIcParam(&tempi->p1);
cout ",";
if (tempi->p2.type&TY_MASK)
CbPutIcParam(&tempi->p2);
cout ",";
if (tempi->p3.type&TY_MASK)
CbPutIcParam(&tempi->p3);
cout " ";
CbPutClass(tempi->ic_class);
if (tempi->ic_flags & ICF_P3_TO_DOUBLE)
PutS("$$FG,LTBLUE$$p3d$$FG$$ ");
if (tempi->ic_flags & ICF_P3_TO_INT)
PutS("$$FG,GREEN$$p3i$$FG$$ ");
if (tempi->ic_flags & ICF_P2_TO_DOUBLE)
PutS("$$FG,LTBLUE$$p2d$$FG$$ ");
if (tempi->ic_flags & ICF_P2_TO_INT)
PutS("$$FG,GREEN$$p2i$$FG$$ ");
if (tempi->ic_flags & ICF_P1_TO_DOUBLE)
PutS("$$FG,LTBLUE$$p1d$$FG$$ ");
if (tempi->ic_flags & ICF_P1_TO_INT)
PutS("$$FG,GREEN$$p1i$$FG$$ ");
if (tempi->ic_flags & ICF_R_TO_DOUBLE)
PutS("$$FG,LTBLUE$$rd$$FG$$ ");
if (tempi->ic_flags & ICF_R_TO_INT)
PutS("$$FG,GREEN$$ri$$FG$$ ");
if (tempi->ic_flags & ICF_USE_DOUBLE)
PutS("[double] ");
if (tempi->ic_flags & ICF_USE_UNSIGNED)
PutS("[unsigned] ");
if (tempi->ic_flags & ICF_USE_INT)
PutS("[int] ");
if (tempi->ic_flags & ICF_NO_DEPEND_RESULT)
PutS("-DEP ");
if (tempi->ic_flags & ICF_DEPEND_RESULT)
PutS("+DEP ");
if (tempi->ic_flags & ICF_NOT_ADDRESS)
PutS("(NOT_ADDRESS) ");
if (tempi->ic_flags & ICF_PUSH_RESULT)
PutS("(PUSH) ");
if (tempi->ic_flags & ICF_PUSH_CMP)
PutS("(PUSH_CMP) ");
if (tempi->ic_flags & ICF_POP_CMP)
PutS("(POP_CMP) ");
if (tempi->ic_flags & ICF_RCX_CMP)
PutS("(RCX_CMP) ");
if (tempi->ic_flags & ICF_RCX_CMP2)
PutS("(RCX_CMP2) ");
CrLf;
}
}
void CbInitOutPtrs(LexCbStack *ll)
{
CodeBlk *cb=MAllocZ(sizeof(CodeBlk));
cb->next=NULL;
ll->cb_out_first=cb;
ll->cb_out_last=cb;
ll->cb_misc_list=NULL;
ll->cb_misc_list_end=&ll->cb_misc_list;
ll->cb_out_ptr=&cb->data;
ll->cb_out_end=ll->cb_out_ptr+sizeof(IntermediateCode)*CB_IC_CNT;
ll->cb_last_out_ptr=&cb->data;
}
void CbInitInPtrs(LexCbStack *ll)
{
CodeBlk *cb=ll->cb_out_first;
ll->cb_in_first=cb;
ll->cb_in_ptr=&cb->data;
ll->cb_in_end=ll->cb_in_ptr+sizeof(IntermediateCode)*CB_IC_CNT;
}
void CbPutAllIc(LexStruct *lx)
{
IntermediateCode *tempi;
CbInitInPtrs(&lx->cb);
tempi=lx->cb.cb_in_ptr;
while (tempi->ic_opcode) {
if (tempi->ic_flags&ICF_TRACE)
CbPutIc(tempi);
tempi+=sizeof(IntermediateCode);
}
}
void CbAddIc(LexStruct *lx,
U8 opcode_and_precidence,U8 arg, ClassStruct *c,U8 flags=0)
{
IntermediateCode *tempi=lx->cb.cb_out_ptr;
CodeBlk *cb,*cb1;
lx->cb.cb_last_out_ptr=tempi;
tempi->ic_opcode=opcode_and_precidence.u2[0];
tempi->ic_precidence=opcode_and_precidence.u2[1];
tempi->ic_data=arg;
tempi->ic_class=c;
if (Bt(&lx->flags,LFf_OPT_TRACE)) {
Bts(&lx->flags,LFf_OPT_TRACE_PRESENT);
flags|=ICF_TRACE;
}
tempi->ic_flags=flags;
tempi->ic_line=lx->lag_line_num;
if (lx->flags & LF_PARSE_TRACE)
CbPutIc(tempi);
tempi+=sizeof(IntermediateCode);
if (tempi>=lx->cb.cb_out_end) {
cb=MAllocZ(sizeof(CodeBlk));
cb->next=NULL;
cb1=lx->cb.cb_out_last;
cb1->next=cb;
lx->cb.cb_out_last=cb;
tempi=&cb->data;
lx->cb.cb_out_end=tempi+sizeof(IntermediateCode)*CB_IC_CNT;
}
lx->cb.cb_out_ptr=tempi;
}
IntermediateCode *CbGetIc1(LexCbStack *lx)
{
IntermediateCode *tempi=lx->cb_in_ptr,
*tempi1=tempi+sizeof(IntermediateCode);
CodeBlk *cb;
if (tempi1>=lx->cb_in_end) {
cb=tempi1-sizeof(IntermediateCode)*CB_IC_CNT-offset(CodeBlk.data);
cb=cb->next;
tempi1=&cb->data;
lx->cb_in_end=tempi1+sizeof(IntermediateCode)*CB_IC_CNT;
}
lx->cb_in_ptr=tempi1;
return tempi;
}
void CbPush(LexStruct *lx)
{
LexCbStack *templ=MAlloc(sizeof(LexCbStack));
MemCpy(templ,&lx->cb,sizeof(LexCbStack));
if (lx->cb.cb_misc_list_end==&lx->cb.cb_misc_list)
templ->cb_misc_list_end=&templ->cb_misc_list;
lx->cb.cb_next=templ;
}
void CbPop(LexStruct *lx)
{
LexCbStack *templ=lx->cb.cb_next;
MemCpy(&lx->cb,templ,sizeof(LexCbStack));
if (templ->cb_misc_list_end==&templ->cb_misc_list)
lx->cb.cb_misc_list_end=&lx->cb.cb_misc_list;
Free(templ);
}
CbMiscStruct *CbFindGotoLabel(LexStruct *lx,I1 *name)
{
CbMiscStruct *templ=lx->cb.cb_misc_list;
while (templ) {
if (templ->type==CBMT_GOTO_LABEL) {
if (!StrCmp(templ->str,name))
return templ;
}
templ=templ->next;
}
return NULL;
}
CbMiscStruct *CbMiscNew(LexStruct *lx,U8 t)
{
CbMiscStruct *result=MAllocZ(sizeof(CbMiscStruct));
lx->cb.cb_misc_list_end->next=result;
lx->cb.cb_misc_list_end=result;
result->address=INVALID_PTR;
result->type=t;
return result;
}
void DelCbMiscList(LexStruct *lx)
{
CbMiscStruct *mc=lx->cb.cb_misc_list,*mc1;
while (mc) {
mc1=mc->next;
if (mc->type==CBMT_GOTO_LABEL &&
!mc->address) {
lx->cb.cb_misc_list=NULL; //prevent recursion
PrintFErr("%S%s\r\n","ST_UNDEFINED_GOTO_LABEL",mc->str);
throw(EXCEPT_COMPILER,1);
}
Free(mc->str);
Free(mc->jmp_table);
Free(mc);
mc=mc1;
}
}
LexStruct *CbPopNoFree(LexStruct *lx)
{
LexCbStack *templ=lx->cb.cb_next;
MemCpy(&lx->cb,templ,sizeof(LexCbStack));
if (templ->cb_misc_list_end==&templ->cb_misc_list)
lx->cb.cb_misc_list_end=&lx->cb.cb_misc_list;
return templ;
}
void CbAppend(LexStruct *lx, LexCbStack *ll)
{
IntermediateCode *tempi;
CbInitInPtrs(ll);
do {
tempi=CbGetIc1(ll);
if (tempi->ic_opcode) {
CbAddIc(lx,tempi->ic_opcode+tempi->ic_precidence<<16,tempi->ic_data,
tempi->ic_class,tempi->ic_flags);
}
} while (tempi->ic_opcode);
DelLinkedList(ll->cb_out_first);
if (ll->cb_misc_list_end!=&ll->cb_misc_list) {
lx->cb.cb_misc_list_end->next=ll->cb_misc_list;
lx->cb.cb_misc_list_end=ll->cb_misc_list_end;
}
Free(ll);
}
void CbCombine(LexStruct *lx)
{
CodeBlk *cb=lx->cb.cb_out_first,*cb1,*cb2;
I8 i=0,j=sizeof(IntermediateCode)*CB_IC_CNT;
void *ptr;
while (cb) {
i++;
cb=cb->next;
}
if (i>1) {
cb1=MAlloc(i*j+offset(CodeBlk.data));
cb1->next=NULL;
cb=lx->cb.cb_out_first;
ptr=&cb1->data;
while (cb) {
cb2=cb->next;
MemCpy(ptr,&cb->data,j);
ptr+=j;
Free(cb);
cb=cb2;
}
lx->cb.cb_out_first=cb1;
}
}
U1 *CbCompile(LexStruct *lx,ClassStruct *fun_class,
U8 *code_size,DbgInfo **dbg_info,U8 *type=NULL)
{
U1 *result;
I8 register_offsets[NUM_REGS],min_line=MAX_I8,max_line=0;
if (dbg_info)
*dbg_info=NULL;
CbCombine(lx);
if (Bt(&lx->flags,LFf_OPT_TRACE_PRESENT)) {
if (Bt(&lx->pass_trace_mask,0)) {
coutln "$$IV 1$$Before Pass 1:$$IV 0$$";
CbPutAllIc(lx);
}
}
CmpOptPass1(lx,fun_class,TRUE);
if (Bt(&lx->flags,LFf_OPT_TRACE_PRESENT)) {
if (Bt(&lx->pass_trace_mask,1)) {
coutln "$$IV 1$$After Pass 1:$$IV 0$$";
CbPutAllIc(lx);
}
}
CmpOptPass2(lx,fun_class,register_offsets);
if (Bt(&lx->flags,LFf_OPT_TRACE_PRESENT)) {
if (Bt(&lx->pass_trace_mask,2)) {
coutln "$$IV 1$$After Pass 2:$$IV 0$$";
CbPutAllIc(lx);
}
}
CmpOptPass3(lx,register_offsets,type);
if (Bt(&lx->flags,LFf_OPT_TRACE_PRESENT)) {
if (Bt(&lx->pass_trace_mask,3)) {
coutln "$$IV 1$$After Pass 3:$$IV 0$$";
CbPutAllIc(lx);
}
}
CmpOptPass4(lx);
if (Bt(&lx->flags,LFf_OPT_TRACE_PRESENT)) {
if (Bt(&lx->pass_trace_mask,4)) {
coutln "$$IV 1$$After Pass 4:$$IV 0$$";
CbPutAllIc(lx);
}
}
CmpOptPass5(lx,fun_class);
if (Bt(&lx->flags,LFf_OPT_TRACE_PRESENT)) {
if (Bt(&lx->pass_trace_mask,5)) {
coutln "$$IV 1$$After Pass 5:$$IV 0$$";
CbPutAllIc(lx);
}
}
if (Bt(&lx->flags,LFf_OPT_TRACE_PRESENT))
if (Bt(&lx->pass_trace_mask,6))
coutln "$$IV 1$$Pass 6:$$IV 0$$";
CmpOptPass678(lx,fun_class,register_offsets,NULL,6,dbg_info,&min_line,&max_line);
if (Bt(&lx->flags,LFf_OPT_TRACE_PRESENT))
if (Bt(&lx->pass_trace_mask,7))
coutln "$$IV 1$$Pass 7:$$IV 0$$";
*code_size=CmpOptPass678(lx,fun_class,register_offsets,NULL,7,dbg_info,&min_line,&max_line);
result=MAlloc(*code_size);
if (Bt(&lx->flags,LFf_OPT_TRACE_PRESENT))
if (Bt(&lx->pass_trace_mask,8))
coutln "$$IV 1$$Pass 8:$$IV 0$$";
*code_size=CmpOptPass678(lx,fun_class,register_offsets,result,8,dbg_info,&min_line,&max_line);
DelLinkedList(lx->cb.cb_out_first);
DelCbMiscList(lx);
if (Bt(&lx->flags,LFf_COMPILE_TRACE)) {
if (lx->a) {
if (lx->a->seg_size==16)
CallExtStr("Dasm2",result,*code_size,16);
else if (lx->a->seg_size==64)
CallExtStr("Dasm2",result,*code_size,64);
else
CallExtStr("Dasm2",result,*code_size,32);
} else
CallExtStr("Dasm2",result,*code_size,64);
}
return result;
}
void DelHashTable(SysHashTable *tempht)
{
I8 i;
SysHashEntry *temph,*temph1;
ClassStruct *tempc;
GlblVarStruct *tempg;
if (!tempht) return;
for (i=0;i<=tempht->mask;i++) {
temph=tempht->body[i];
while (temph) {
temph1=temph->next;
if (!(temph->type&HTT_DICT_WORD))
Free(temph->str);
if (temph->type & (HTT_FUNCTION | HTT_CLASS |
HTT_STR_CONST | HTT_GLBL_VAR |
HTT_SYS_SYMBOL)) {
Free(temph->source_link);
Free(temph->index);
if (temph->type & (HTT_FUNCTION | HTT_CLASS)) {
tempc=temph;
Free(tempc->debug);
Free(tempc->import_name);
DelMemberList(tempc);
//assumes code not on heap
} else if (temph->type&HTT_STR_CONST)
Free(temph><(StrConstStruct *)->data);
else if (temph->type&HTT_GLBL_VAR) {
tempg=temph;
DelLinkedList(tempg->dim_list);
Free(tempg->import_name);
}
}
Free(temph);
temph=temph1;
}
}
Free(tempht);
}
Binary file not shown.
+53
View File
@@ -0,0 +1,53 @@
#help_index "Char/Conversion"
public extern double A2Double(I1 *src,I1 **end_ptr=NULL);
#help_index "Char/Conversion;Time/LTDate"
public extern LTDate A2LTDate(I1 *src2);
#help_index "Hash"
public extern SysHashEntry *FindPSect(U8 *add,I8 *offset);
public extern void DelHashTable(SysHashTable *table);
#help_index "Compiler/Lex"
public extern LexStruct *LexNew(I1 *buf,U8 flags,I1 *filename);
public extern void LexDel(LexStruct *lx);
public extern void SetSourceFileInfo(LexStruct *lx,SysHashEntry *h);
public extern void LexPutToken(LexStruct *lx);
public extern U8 LexGetChar(LexStruct *lx);
public extern void LexSkipEol(LexStruct *lx);
public extern U8 EvalExpression(LexStruct *lx);
public extern void LexPush(LexStruct *lx);
public extern void LexPop(LexStruct *lx);
//public extern void LexSubStackPtr(LexStruct *lx);
public extern I8 Lex(LexStruct *lx);
public extern I1 *LexExtendStr(LexStruct *lx,U8 *size=NULL);
public extern void LexPutLine(LexStruct *lx,I1 *start);
public extern I8 LexLineNum(LexStruct *lx);
public extern void LexPutLink(LexStruct *lx);
public extern void PutLexError(LexStruct *lx,I1 *name=NULL,I1 *msg=NULL);
public extern void PutLexWarning(LexStruct *lx,I1 *name=NULL,I1 *msg=NULL);
public extern U8 GetExpression(LexStruct *lx,U1 **e); //FALSE=no err
public extern I8 Expression(LexStruct *lx);
public extern void DelExpression(void *code);
public extern MemberListStruct *FindMember(I1 *st,ClassStruct *c);
#help_index "Compiler/Directive"
public extern void ExePutS(I1 *st);
public extern void ExePrintF(I1 *src,...);
#help_index "Compiler"
public extern I8 CompileFile(I1 *filename,I1 *map_name=NULL,I1 *out_name=NULL,I1 mapfile_drive=0);
public extern I8 ExecuteStr(I1 *buf,I1 *filename=NULL);
public extern I8 ExecuteFile(I1 *name);
public extern void ContinueUserTask();
extern SysHashTable *asm_hash;
extern void InitCompiler(BoolU4 first);
//The following is for benchmarking
extern BoolU4 cmp_do_not_write_to_disk;
LTextern CP_HI_CALL U8 HiCall(void *s);
extern I8 ExecuteCmdLine(LexStruct *lx);
#help_index "Exceptions"
public extern void CatchAll();
#help_index ""
+552
View File
@@ -0,0 +1,552 @@
$LK+BI,"A2Double ","FL:::/LT/Compiler/SPrintF2.CPZ,730",1$0000AA60 0001 Funct Export
$LK+BI,"A2LTDate ","FL:::/LT/Compiler/SPrintF2.CPZ,807",2$0000AD38 0001 Funct Export
$LK,"ADAM_STARTUP_NAME ","FL:::/LT/Compiler/CmpMain.CPZ,396"$\"/LT/OSMain/AdamK.APZ\" 0002 StrConst
$LK,"AKW_ALIGN ","FL:::/LT/Compiler/CmpDefs.HPZ,232"$64 0001 StrConst
$LK,"AKW_DU1 ","FL:::/LT/Compiler/CmpDefs.HPZ,238"$70 0001 StrConst
$LK,"AKW_DU2 ","FL:::/LT/Compiler/CmpDefs.HPZ,239"$71 0001 StrConst
$LK,"AKW_DU4 ","FL:::/LT/Compiler/CmpDefs.HPZ,240"$72 0001 StrConst
$LK,"AKW_DU8 ","FL:::/LT/Compiler/CmpDefs.HPZ,241"$73 0001 StrConst
$LK,"AKW_DUP ","FL:::/LT/Compiler/CmpDefs.HPZ,242"$74 0001 StrConst
$LK,"AKW_END ","FL:::/LT/Compiler/CmpDefs.HPZ,233"$65 0001 StrConst
$LK,"AKW_ENDS ","FL:::/LT/Compiler/CmpDefs.HPZ,245"$77 0001 StrConst
$LK,"AKW_EXPORT ","FL:::/LT/Compiler/CmpDefs.HPZ,250"$82 0002 StrConst
$LK,"AKW_IMPORT ","FL:::/LT/Compiler/CmpDefs.HPZ,249"$81 0002 StrConst
$LK,"AKW_INSERT ","FL:::/LT/Compiler/CmpDefs.HPZ,251"$83 0001 StrConst
$LK,"AKW_INSERT_COMPRESSED ","FL:::/LT/Compiler/CmpDefs.HPZ,254"$86 0001 StrConst
$LK,"AKW_LIST ","FL:::/LT/Compiler/CmpDefs.HPZ,252"$84 0001 StrConst
$LK,"AKW_NOLIST ","FL:::/LT/Compiler/CmpDefs.HPZ,253"$85 0001 StrConst
$LK,"AKW_ORG ","FL:::/LT/Compiler/CmpDefs.HPZ,243"$75 0001 StrConst
$LK,"AKW_STRUC ","FL:::/LT/Compiler/CmpDefs.HPZ,244"$76 0001 StrConst
$LK,"AKW_U1 ","FL:::/LT/Compiler/CmpDefs.HPZ,234"$66 0001 StrConst
$LK,"AKW_U2 ","FL:::/LT/Compiler/CmpDefs.HPZ,235"$67 0001 StrConst
$LK,"AKW_U4 ","FL:::/LT/Compiler/CmpDefs.HPZ,236"$68 0001 StrConst
$LK,"AKW_U8 ","FL:::/LT/Compiler/CmpDefs.HPZ,237"$69 0001 StrConst
$LK,"AKW_USE16 ","FL:::/LT/Compiler/CmpDefs.HPZ,246"$78 0001 StrConst
$LK,"AKW_USE32 ","FL:::/LT/Compiler/CmpDefs.HPZ,247"$79 0001 StrConst
$LK,"AKW_USE64 ","FL:::/LT/Compiler/CmpDefs.HPZ,248"$80 0001 StrConst
$LK+BI,"AdamStartUpFile ","FL:::/LT/Compiler/CmpMain.CPZ,397",3$00031BF0 0000 Funct Export
$LK+BI,"AddUnresolved ","FL:::/LT/Compiler/AsmMain.CPZ,37",4$0000BBC0 0008 Funct Export
$LK+BI,"AsmCodeInstruction ","FL:::/LT/Compiler/AsmMain.CPZ,804",5$0000E3B0 0001 Funct Export
$LK+BI,"AsmEvalExpression ","FL:::/LT/Compiler/AsmMain.CPZ,215",6$0000C380 0003 Funct Export
$LK+BI,"AsmListLine ","FL:::/LT/Compiler/AsmMain.CPZ,65",7$0000BCE8 0004 Funct Export
$LK+BI,"AsmMakeArgMask ","FL:::/LT/Compiler/AsmMain.CPZ,623",8$0000D958 0002 Funct Export
$LK+BI,"AsmStoreCodeU1 ","FL:::/LT/Compiler/AsmMain.CPZ,90",9$0000BE20 0018 Funct Export
$LK+BI,"AsmStoreCodeU1At ","FL:::/LT/Compiler/AsmMain.CPZ,197",10$0000C2B8 000D Funct Export
$LK+BI,"AsmStoreCodeU4 ","FL:::/LT/Compiler/AsmMain.CPZ,119",11$0000BF78 0001 Funct Export
$LK+BI,"AsmStoreCodeU8 ","FL:::/LT/Compiler/AsmMain.CPZ,158",12$0000C118 0005 Funct Export
$LK+BI,"AsmStoreNum ","FL:::/LT/Compiler/AsmMain.CPZ,694",13$0000DDD0 0004 Funct Export
$LK,"CMP_INTERNAL_TYPES_TABLE ","FL:::/LT/Compiler/CmpAsm.ASZ,2"$00000E50 0001 SysSym Export
$LK,"CMP_OPT_NOP ","FL:::/LT/Compiler/CmpAsm.ASZ,40"$00000F58 0003 SysSym
$LK,"COMPILER_END ","FL:::/LT/Compiler/Compiler.SPZ,27"$00031E18 0000 SysSym Export
$LK,"COMPILER_START ","FL:::/LT/Compiler/Compiler.SPZ,5"$00000E50 0000 SysSym Export
$LK,"CP_HI_CALL ","FL:::/LT/Compiler/CmpAsm.ASZ,272"$00001220 0000 SysSym Export
$LK,"CP_OPTNEXT ","FL:::/LT/Compiler/CmpAsm.ASZ,60"$00001060 0001 SysSym Export
$LK,"CP_OPTNEXT2 ","FL:::/LT/Compiler/CmpAsm.ASZ,124"$000010D8 0001 SysSym Export
$LK,"CP_OPTNEXT3 ","FL:::/LT/Compiler/CmpAsm.ASZ,175"$00001150 0001 SysSym Export
$LK,"CP_PRSPOP ","FL:::/LT/Compiler/CmpAsm.ASZ,258"$00001200 0001 SysSym Export
$LK,"CP_PRSPUSH ","FL:::/LT/Compiler/CmpAsm.ASZ,245"$000011E0 0001 SysSym Export
$LK+BI,"CatchAll ","FL:::/LT/Compiler/CmpMain.CPZ,1",14$00030368 0002 Funct Export
$LK+BI,"CbAddIc ","FL:::/LT/Compiler/CodeGen.CPZ,149",15$00005700 00A9 Funct Export
$LK+BI,"CbAppend ","FL:::/LT/Compiler/CodeGen.CPZ,265",16$00005BA8 0003 Funct Export
$LK+BI,"CbCombine ","FL:::/LT/Compiler/CodeGen.CPZ,285",17$00005C78 0001 Funct Export
$LK+BI,"CbCompile ","FL:::/LT/Compiler/CodeGen.CPZ,310",18$00005D60 0004 Funct Export
$LK+BI,"CbFindGotoLabel ","FL:::/LT/Compiler/CodeGen.CPZ,214",19$00005960 0002 Funct Export
$LK+BI,"CbGetIc1 ","FL:::/LT/Compiler/CodeGen.CPZ,181",20$00005808 0003 Funct Export
$LK+BI,"CbInitInPtrs ","FL:::/LT/Compiler/CodeGen.CPZ,129",21$00005660 0003 Funct Export
$LK+BI,"CbInitOutPtrs ","FL:::/LT/Compiler/CodeGen.CPZ,116",22$000055E0 0008 Funct Export
$LK+BI,"CbMiscNew ","FL:::/LT/Compiler/CodeGen.CPZ,227",23$000059C8 0017 Funct Export
$LK+BI,"CbPop ","FL:::/LT/Compiler/CodeGen.CPZ,205",24$000058E8 0007 Funct Export
$LK+BI,"CbPopNoFree ","FL:::/LT/Compiler/CodeGen.CPZ,256",25$00005B48 0001 Funct Export
$LK+BI,"CbPush ","FL:::/LT/Compiler/CodeGen.CPZ,196",26$00005868 000C Funct Export
$LK+BI,"CbPutAllIc ","FL:::/LT/Compiler/CodeGen.CPZ,137",27$000056A0 0006 Funct Export
$LK+BI,"CbPutClass ","FL:::/LT/Compiler/CodeGen.CPZ,1",28$00004CC0 0001 Funct Export
$LK+BI,"CbPutIc ","FL:::/LT/Compiler/CodeGen.CPZ,53",29$00005060 0006 Funct Export
$LK+BI,"CbPutIcParam ","FL:::/LT/Compiler/CodeGen.CPZ,26",30$00004E18 0004 Funct Export
$LK+BI,"CmpClassNew ","FL:::/LT/Compiler/AsmMain.CPZ,1",31$0000BB00 0004 Funct Export
$LK+BI,"CmpDebugger ","FL:::/LT/Compiler/CmpMain.CPZ,346",32$00031930 0001 Funct Export
$LK+BI,"CmpKeyWord ","FL:::/LT/Compiler/StmtParser.CPZ,1",33$00013DB0 000B Funct Export
$LK+BI,"CmpMGetS ","FL:::/LT/Compiler/CmpMain.CPZ,339",34$000318D0 0001 Funct Export
$LK+BI,"CmpOffsetToReg ","FL:::/LT/Compiler/OptPass1.CPZ,122",35$000215B0 0004 Funct Export
$LK+BI,"CmpOptIc3 ","FL:::/LT/Compiler/OptPass3.CPZ,1",36$00026A58 0001 Funct Export
$LK+BI,"CmpOptIc5 ","FL:::/LT/Compiler/OptPass5.CPZ,1",37$00028818 0001 Funct Export
$LK+BI,"CmpOptPass1 ","FL:::/LT/Compiler/OptPass1.CPZ,479",38$000226B8 0000 Funct Export
$LK+BI,"CmpOptPass2 ","FL:::/LT/Compiler/OptPass2.CPZ,23",39$00025520 0000 Funct Export
$LK+BI,"CmpOptPass3 ","FL:::/LT/Compiler/OptPass3.CPZ,201",40$000272B8 0000 Funct Export
$LK+BI,"CmpOptPass4 ","FL:::/LT/Compiler/OptPass4.CPZ,1",41$00028078 0000 Funct Export
$LK+BI,"CmpOptPass5 ","FL:::/LT/Compiler/OptPass5.CPZ,153",42$00028E50 0000 Funct Export
$LK+BI,"CmpOptPass5Lag ","FL:::/LT/Compiler/OptPass5.CPZ,43",43$000289B0 0001 Funct Export
$LK+BI,"CmpOptPass678 ","FL:::/LT/Compiler/OptPass6.CPZ,1",44$000293A8 0000 Funct Export
$LK+BI,"CmpPType ","FL:::/LT/Compiler/OptPass2.CPZ,11",45$000254E0 0006 Funct Export
$LK+BI,"CmpParseAsmBlk ","FL:::/LT/Compiler/AsmMain.CPZ,1388",46$0000FFC0 0001 Funct Export
$LK+BI,"CmpParseClass ","FL:::/LT/Compiler/StmtParser.CPZ,269",47$000149D0 0006 Funct Export
$LK+BI,"CmpParseCout ","FL:::/LT/Compiler/StmtParser.CPZ,994",48$00016ED8 0002 Funct Export
$LK+BI,"CmpParseDoWhile ","FL:::/LT/Compiler/StmtParser.CPZ,824",49$00016498 0001 Funct Export
$LK+BI,"CmpParseExeBlk ","FL:::/LT/Compiler/StmtParser.CPZ,1038",50$00017138 0001 Funct Export
$LK+BI,"CmpParseFor ","FL:::/LT/Compiler/StmtParser.CPZ,848",51$00016678 0001 Funct Export
$LK+BI,"CmpParseFunction ","FL:::/LT/Compiler/StmtParser.CPZ,401",52$00014F20 0001 Funct Export
$LK+BI,"CmpParseFunctionJoin ","FL:::/LT/Compiler/StmtParser.CPZ,331",53$00014C78 0005 Funct Export
$LK+BI,"CmpParseGlblVarList ","FL:::/LT/Compiler/StmtParser.CPZ,582",54$00015848 0006 Funct Export
$LK+BI,"CmpParseIf ","FL:::/LT/Compiler/StmtParser.CPZ,773",55$00016150 0001 Funct Export
$LK+BI,"CmpParseNoUnusedWarn ","FL:::/LT/Compiler/StmtParser.CPZ,977",56$00016E18 0001 Funct Export
$LK+BI,"CmpParseStatement ","FL:::/LT/Compiler/StmtParser.CPZ,1142",57$000177A0 0002 Funct Export
$LK+BI,"CmpParseSwitch ","FL:::/LT/Compiler/StmtParser.CPZ,895",58$000168F8 0001 Funct Export
$LK+BI,"CmpParseTryBlk ","FL:::/LT/Compiler/StmtParser.CPZ,1081",59$000173A0 0001 Funct Export
$LK+BI,"CmpParseVarList ","FL:::/LT/Compiler/StmtParser.CPZ,16",60$00013E00 0004 Funct Export
$LK+BI,"CmpParseWhile ","FL:::/LT/Compiler/StmtParser.CPZ,802",61$00016320 0001 Funct Export
$LK+BI,"CmpPmt ","FL:::/LT/Compiler/Lex.CPZ,1",62$0000134C 0001 Funct Export
$LK+BI,"CmpType ","FL:::/LT/Compiler/OptPass2.CPZ,1",63$000254B0 0004 Funct Export
$LK+BI,"CompileBuf ","FL:::/LT/Compiler/CmpMain.CPZ,89",64$00030990 0001 Funct Export
$LK+BI,"CompileExpression ","FL:::/LT/Compiler/ExpParser.CPZ,796",65$00013BB8 0004 Funct Export
$LK+BI,"CompileFile ","FL:::/LT/Compiler/CmpMain.CPZ,183",66$00030F90 0000 Funct Export
$LK+BI,"CompileStatement ","FL:::/LT/Compiler/CmpMain.CPZ,53",67$00030780 0002 Funct Export
$LK+BI,"ContinueUserTask ","FL:::/LT/Compiler/CmpMain.CPZ,322",68$000317F0 0001 Funct Export
$LK+BI,"DefineU1s ","FL:::/LT/Compiler/AsmMain.CPZ,1304",69$0000FBE8 0004 Funct Export
$LK+BI,"DelCbMiscList ","FL:::/LT/Compiler/CodeGen.CPZ,238",70$00005A30 0001 Funct Export
$LK+BI,"DelExpression ","FL:::/LT/Compiler/Lex.CPZ,315",71$00002368 000A Funct Export
$LK+BI,"DelHashTable ","FL:::/LT/Compiler/CodeGen.CPZ,393",72$00006328 0003 Funct Export
$LK+BI,"DelMemberList ","FL:::/LT/Compiler/Lex.CPZ,453",73$000028A0 0002 Funct Export
$LK,"EC_ABSI8 ","FL:::/LT/Compiler/CmpDefs.HPZ,179"$0x090 0004 StrConst
$LK,"EC_ABSOLUTE_ADDRESS ","FL:::/LT/Compiler/CmpDefs.HPZ,14"$0x00C 000E StrConst
$LK,"EC_ADD ","FL:::/LT/Compiler/CmpDefs.HPZ,51"$0x027 0011 StrConst
$LK,"EC_ADDRESS ","FL:::/LT/Compiler/CmpDefs.HPZ,26"$0x015 0007 StrConst
$LK,"EC_ADD_CONST ","FL:::/LT/Compiler/CmpDefs.HPZ,145"$0x074 0007 StrConst
$LK,"EC_ADD_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,78"$0x03C 0005 StrConst
$LK,"EC_ADD_RSP ","FL:::/LT/Compiler/CmpDefs.HPZ,81"$0x03E 000B StrConst
$LK,"EC_AND ","FL:::/LT/Compiler/CmpDefs.HPZ,46"$0x024 0008 StrConst
$LK,"EC_AND_AND ","FL:::/LT/Compiler/CmpDefs.HPZ,61"$0x02F 000E StrConst
$LK,"EC_AND_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,75"$0x039 0006 StrConst
$LK,"EC_ASSIGN ","FL:::/LT/Compiler/CmpDefs.HPZ,69"$0x034 0007 StrConst
$LK,"EC_BR_AND_AND_NOT_ZERO ","FL:::/LT/Compiler/CmpDefs.HPZ,171"$0x08B 0003 StrConst
$LK,"EC_BR_AND_AND_ZERO ","FL:::/LT/Compiler/CmpDefs.HPZ,170"$0x08A 0003 StrConst
$LK,"EC_BR_AND_NOT_ZERO ","FL:::/LT/Compiler/CmpDefs.HPZ,174"$0x08D 0005 StrConst
$LK,"EC_BR_AND_ZERO ","FL:::/LT/Compiler/CmpDefs.HPZ,173"$0x08C 0005 StrConst
$LK,"EC_BR_BT ","FL:::/LT/Compiler/CmpDefs.HPZ,151"$0x078 0005 StrConst
$LK,"EC_BR_BTC ","FL:::/LT/Compiler/CmpDefs.HPZ,154"$0x07B 0005 StrConst
$LK,"EC_BR_BTR ","FL:::/LT/Compiler/CmpDefs.HPZ,153"$0x07A 0005 StrConst
$LK,"EC_BR_BTS ","FL:::/LT/Compiler/CmpDefs.HPZ,152"$0x079 0005 StrConst
$LK,"EC_BR_EQUAL_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,135"$0x06B 0006 StrConst
$LK,"EC_BR_GREATER ","FL:::/LT/Compiler/CmpDefs.HPZ,138"$0x06E 0006 StrConst
$LK,"EC_BR_GREATER_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,136"$0x06C 0006 StrConst
$LK,"EC_BR_LBTC ","FL:::/LT/Compiler/CmpDefs.HPZ,166"$0x086 0005 StrConst
$LK,"EC_BR_LBTR ","FL:::/LT/Compiler/CmpDefs.HPZ,165"$0x085 0005 StrConst
$LK,"EC_BR_LBTS ","FL:::/LT/Compiler/CmpDefs.HPZ,164"$0x084 0005 StrConst
$LK,"EC_BR_LESS ","FL:::/LT/Compiler/CmpDefs.HPZ,139"$0x06F 0006 StrConst
$LK,"EC_BR_LESS_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,137"$0x06D 0006 StrConst
$LK,"EC_BR_NOT_BT ","FL:::/LT/Compiler/CmpDefs.HPZ,155"$0x07C 0005 StrConst
$LK,"EC_BR_NOT_BTC ","FL:::/LT/Compiler/CmpDefs.HPZ,158"$0x07F 0005 StrConst
$LK,"EC_BR_NOT_BTR ","FL:::/LT/Compiler/CmpDefs.HPZ,157"$0x07E 0005 StrConst
$LK,"EC_BR_NOT_BTS ","FL:::/LT/Compiler/CmpDefs.HPZ,156"$0x07D 0005 StrConst
$LK,"EC_BR_NOT_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,134"$0x06A 0006 StrConst
$LK,"EC_BR_NOT_LBTC ","FL:::/LT/Compiler/CmpDefs.HPZ,169"$0x089 0005 StrConst
$LK,"EC_BR_NOT_LBTR ","FL:::/LT/Compiler/CmpDefs.HPZ,168"$0x088 0005 StrConst
$LK,"EC_BR_NOT_LBTS ","FL:::/LT/Compiler/CmpDefs.HPZ,167"$0x087 0005 StrConst
$LK,"EC_BR_NOT_ZERO ","FL:::/LT/Compiler/CmpDefs.HPZ,131"$0x069 000B StrConst
$LK,"EC_BR_OR_OR_NOT_ZERO ","FL:::/LT/Compiler/CmpDefs.HPZ,141"$0x071 0003 StrConst
$LK,"EC_BR_OR_OR_ZERO ","FL:::/LT/Compiler/CmpDefs.HPZ,140"$0x070 0003 StrConst
$LK,"EC_BR_ZERO ","FL:::/LT/Compiler/CmpDefs.HPZ,130"$0x068 000D StrConst
$LK,"EC_BSF ","FL:::/LT/Compiler/CmpDefs.HPZ,111"$0x057 0004 StrConst
$LK,"EC_BSR ","FL:::/LT/Compiler/CmpDefs.HPZ,112"$0x058 0004 StrConst
$LK,"EC_BT ","FL:::/LT/Compiler/CmpDefs.HPZ,107"$0x053 0006 StrConst
$LK,"EC_BTC ","FL:::/LT/Compiler/CmpDefs.HPZ,110"$0x056 0006 StrConst
$LK,"EC_BTR ","FL:::/LT/Compiler/CmpDefs.HPZ,109"$0x055 0006 StrConst
$LK,"EC_BTS ","FL:::/LT/Compiler/CmpDefs.HPZ,108"$0x054 0006 StrConst
$LK,"EC_CALL ","FL:::/LT/Compiler/CmpDefs.HPZ,87"$0x042 0008 StrConst
$LK,"EC_CALL_END ","FL:::/LT/Compiler/CmpDefs.HPZ,7"$0x005 000D StrConst
$LK,"EC_CALL_END2 ","FL:::/LT/Compiler/CmpDefs.HPZ,159"$0x080 0014 StrConst
$LK,"EC_CALL_EXTERN ","FL:::/LT/Compiler/CmpDefs.HPZ,177"$0x08F 0005 StrConst
$LK,"EC_CALL_INDIRECT ","FL:::/LT/Compiler/CmpDefs.HPZ,88"$0x043 0005 StrConst
$LK,"EC_CALL_INDIRECT2 ","FL:::/LT/Compiler/CmpDefs.HPZ,89"$0x044 000C StrConst
$LK,"EC_CALL_START ","FL:::/LT/Compiler/CmpDefs.HPZ,6"$0x004 000A StrConst
$LK,"EC_CLI ","FL:::/LT/Compiler/CmpDefs.HPZ,92"$0x046 0004 StrConst
$LK,"EC_COLON ","FL:::/LT/Compiler/CmpDefs.HPZ,66"$0x032 0006 StrConst
$LK,"EC_COM ","FL:::/LT/Compiler/CmpDefs.HPZ,27"$0x016 0005 StrConst
$LK,"EC_DEREF ","FL:::/LT/Compiler/CmpDefs.HPZ,31"$0x019 0012 StrConst
$LK,"EC_DISABLE_CACHE ","FL:::/LT/Compiler/CmpDefs.HPZ,94"$0x048 0004 StrConst
$LK,"EC_DIV ","FL:::/LT/Compiler/CmpDefs.HPZ,43"$0x022 0005 StrConst
$LK,"EC_DIV_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,74"$0x038 0005 StrConst
$LK,"EC_DOUBLE ","FL:::/LT/Compiler/CmpDefs.HPZ,12"$0x00A 0019 StrConst
$LK,"EC_ENABLE_CACHE ","FL:::/LT/Compiler/CmpDefs.HPZ,95"$0x049 0004 StrConst
$LK,"EC_END_EXP ","FL:::/LT/Compiler/CmpDefs.HPZ,4"$0x002 001F StrConst
$LK,"EC_ENTER ","FL:::/LT/Compiler/CmpDefs.HPZ,83"$0x03F 0005 StrConst
$LK,"EC_EQUAL_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,54"$0x029 0007 StrConst
$LK,"EC_FS ","FL:::/LT/Compiler/CmpDefs.HPZ,19"$0x011 0004 StrConst
$LK,"EC_GET_BASE_PTR ","FL:::/LT/Compiler/CmpDefs.HPZ,101"$0x04E 0005 StrConst
$LK,"EC_GET_FLAGS ","FL:::/LT/Compiler/CmpDefs.HPZ,99"$0x04C 0004 StrConst
$LK,"EC_GET_LABEL ","FL:::/LT/Compiler/CmpDefs.HPZ,16"$0x00E 0006 StrConst
$LK,"EC_GET_STACK_PTR ","FL:::/LT/Compiler/CmpDefs.HPZ,103"$0x050 0004 StrConst
$LK,"EC_GREATER ","FL:::/LT/Compiler/CmpDefs.HPZ,57"$0x02C 0007 StrConst
$LK,"EC_GREATER_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,59"$0x02E 0007 StrConst
$LK,"EC_GS ","FL:::/LT/Compiler/CmpDefs.HPZ,20"$0x012 0004 StrConst
$LK,"EC_IMM ","FL:::/LT/Compiler/CmpDefs.HPZ,11"$0x009 0054 StrConst
$LK,"EC_INP ","FL:::/LT/Compiler/CmpDefs.HPZ,121"$0x061 0004 StrConst
$LK,"EC_INPD ","FL:::/LT/Compiler/CmpDefs.HPZ,119"$0x05F 0004 StrConst
$LK,"EC_INPW ","FL:::/LT/Compiler/CmpDefs.HPZ,120"$0x060 0004 StrConst
$LK,"EC_INSQUE ","FL:::/LT/Compiler/CmpDefs.HPZ,113"$0x059 0004 StrConst
$LK,"EC_INSQUE_REV ","FL:::/LT/Compiler/CmpDefs.HPZ,114"$0x05A 0004 StrConst
$LK,"EC_INVD ","FL:::/LT/Compiler/CmpDefs.HPZ,97"$0x04B 0004 StrConst
$LK,"EC_IRQ ","FL:::/LT/Compiler/CmpDefs.HPZ,90"$0x045 0006 StrConst
$LK,"EC_JMP ","FL:::/LT/Compiler/CmpDefs.HPZ,127"$0x066 000F StrConst
$LK,"EC_LABEL ","FL:::/LT/Compiler/CmpDefs.HPZ,5"$0x003 001E StrConst
$LK,"EC_LBTC ","FL:::/LT/Compiler/CmpDefs.HPZ,163"$0x083 0006 StrConst
$LK,"EC_LBTR ","FL:::/LT/Compiler/CmpDefs.HPZ,162"$0x082 0006 StrConst
$LK,"EC_LBTS ","FL:::/LT/Compiler/CmpDefs.HPZ,161"$0x081 0006 StrConst
$LK,"EC_LEA ","FL:::/LT/Compiler/CmpDefs.HPZ,22"$0x013 000B StrConst
$LK,"EC_LEAVE ","FL:::/LT/Compiler/CmpDefs.HPZ,84"$0x040 0005 StrConst
$LK,"EC_LESS ","FL:::/LT/Compiler/CmpDefs.HPZ,56"$0x02B 0007 StrConst
$LK,"EC_LESS_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,58"$0x02D 0007 StrConst
$LK,"EC_MEMCPY ","FL:::/LT/Compiler/CmpDefs.HPZ,117"$0x05D 0004 StrConst
$LK,"EC_MEMSET ","FL:::/LT/Compiler/CmpDefs.HPZ,118"$0x05E 0004 StrConst
$LK,"EC_MM_ ","FL:::/LT/Compiler/CmpDefs.HPZ,35"$0x01D 0005 StrConst
$LK,"EC_MOD ","FL:::/LT/Compiler/CmpDefs.HPZ,44"$0x023 0005 StrConst
$LK,"EC_MOD_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,176"$0x08E 0005 StrConst
$LK,"EC_MOV ","FL:::/LT/Compiler/CmpDefs.HPZ,24"$0x014 0013 StrConst
$LK,"EC_MUL ","FL:::/LT/Compiler/CmpDefs.HPZ,42"$0x021 0007 StrConst
$LK,"EC_MUL_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,73"$0x037 0005 StrConst
$LK,"EC_NOP ","FL:::/LT/Compiler/CmpDefs.HPZ,3"$0x001 0055 StrConst
$LK,"EC_NOP1 ","FL:::/LT/Compiler/CmpDefs.HPZ,10"$0x008 001C StrConst
$LK,"EC_NOT ","FL:::/LT/Compiler/CmpDefs.HPZ,28"$0x017 0007 StrConst
$LK,"EC_NOT_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,55"$0x02A 0007 StrConst
$LK,"EC_NULL ","FL:::/LT/Compiler/CmpDefs.HPZ,2"$0x000 000E StrConst
$LK,"EC_NUM_ENTRIES ","FL:::/LT/Compiler/CmpDefs.HPZ,183"$0x093 0007 StrConst
$LK,"EC_OR ","FL:::/LT/Compiler/CmpDefs.HPZ,48"$0x025 0005 StrConst
$LK,"EC_OR_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,76"$0x03A 0005 StrConst
$LK,"EC_OR_OR ","FL:::/LT/Compiler/CmpDefs.HPZ,63"$0x030 000B StrConst
$LK,"EC_OUTP ","FL:::/LT/Compiler/CmpDefs.HPZ,124"$0x064 0004 StrConst
$LK,"EC_OUTPD ","FL:::/LT/Compiler/CmpDefs.HPZ,122"$0x062 0004 StrConst
$LK,"EC_OUTPW ","FL:::/LT/Compiler/CmpDefs.HPZ,123"$0x063 0004 StrConst
$LK,"EC_POP_REGS ","FL:::/LT/Compiler/CmpDefs.HPZ,149"$0x077 0005 StrConst
$LK,"EC_POWER ","FL:::/LT/Compiler/CmpDefs.HPZ,40"$0x020 0005 StrConst
$LK,"EC_PP_ ","FL:::/LT/Compiler/CmpDefs.HPZ,34"$0x01C 0005 StrConst
$LK,"EC_PREEMPT ","FL:::/LT/Compiler/CmpDefs.HPZ,181"$0x092 0004 StrConst
$LK,"EC_PUSH_CMP ","FL:::/LT/Compiler/CmpDefs.HPZ,180"$0x091 0006 StrConst
$LK,"EC_PUSH_REGS ","FL:::/LT/Compiler/CmpDefs.HPZ,148"$0x076 0006 StrConst
$LK,"EC_QUESTION ","FL:::/LT/Compiler/CmpDefs.HPZ,67"$0x033 0006 StrConst
$LK,"EC_RBP ","FL:::/LT/Compiler/CmpDefs.HPZ,17"$0x00F 0004 StrConst
$LK,"EC_RDTSC ","FL:::/LT/Compiler/CmpDefs.HPZ,125"$0x065 0004 StrConst
$LK,"EC_REG ","FL:::/LT/Compiler/CmpDefs.HPZ,18"$0x010 000B StrConst
$LK,"EC_REMQUE ","FL:::/LT/Compiler/CmpDefs.HPZ,115"$0x05B 0004 StrConst
$LK,"EC_RET ","FL:::/LT/Compiler/CmpDefs.HPZ,85"$0x041 0008 StrConst
$LK,"EC_RETURN_END ","FL:::/LT/Compiler/CmpDefs.HPZ,9"$0x007 000D StrConst
$LK,"EC_RETURN_START ","FL:::/LT/Compiler/CmpDefs.HPZ,8"$0x006 0009 StrConst
$LK,"EC_SET_BASE_PTR ","FL:::/LT/Compiler/CmpDefs.HPZ,102"$0x04F 0004 StrConst
$LK,"EC_SET_FLAGS ","FL:::/LT/Compiler/CmpDefs.HPZ,100"$0x04D 0004 StrConst
$LK,"EC_SET_RAX ","FL:::/LT/Compiler/CmpDefs.HPZ,105"$0x052 0007 StrConst
$LK,"EC_SET_STACK_PTR ","FL:::/LT/Compiler/CmpDefs.HPZ,104"$0x051 0005 StrConst
$LK,"EC_SHL ","FL:::/LT/Compiler/CmpDefs.HPZ,37"$0x01E 0005 StrConst
$LK,"EC_SHL_CONST ","FL:::/LT/Compiler/CmpDefs.HPZ,143"$0x072 0006 StrConst
$LK,"EC_SHL_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,71"$0x035 0006 StrConst
$LK,"EC_SHR ","FL:::/LT/Compiler/CmpDefs.HPZ,38"$0x01F 0005 StrConst
$LK,"EC_SHR_CONST ","FL:::/LT/Compiler/CmpDefs.HPZ,144"$0x073 0006 StrConst
$LK,"EC_SHR_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,72"$0x036 0006 StrConst
$LK,"EC_STI ","FL:::/LT/Compiler/CmpDefs.HPZ,93"$0x047 0004 StrConst
$LK,"EC_STRLEN ","FL:::/LT/Compiler/CmpDefs.HPZ,116"$0x05C 0004 StrConst
$LK,"EC_STR_CONST ","FL:::/LT/Compiler/CmpDefs.HPZ,13"$0x00B 0006 StrConst
$LK,"EC_SUB ","FL:::/LT/Compiler/CmpDefs.HPZ,52"$0x028 0008 StrConst
$LK,"EC_SUB_CONST ","FL:::/LT/Compiler/CmpDefs.HPZ,146"$0x075 0003 StrConst
$LK,"EC_SUB_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,79"$0x03D 0005 StrConst
$LK,"EC_SWITCH ","FL:::/LT/Compiler/CmpDefs.HPZ,128"$0x067 0005 StrConst
$LK,"EC_TYPE ","FL:::/LT/Compiler/CmpDefs.HPZ,15"$0x00D 0004 StrConst
$LK,"EC_UNARY_MINUS ","FL:::/LT/Compiler/CmpDefs.HPZ,29"$0x018 0005 StrConst
$LK,"EC_WBINVD ","FL:::/LT/Compiler/CmpDefs.HPZ,96"$0x04A 0004 StrConst
$LK,"EC_XOR ","FL:::/LT/Compiler/CmpDefs.HPZ,49"$0x026 0005 StrConst
$LK,"EC_XOR_EQUAL ","FL:::/LT/Compiler/CmpDefs.HPZ,77"$0x03B 0005 StrConst
$LK,"EC_XOR_XOR ","FL:::/LT/Compiler/CmpDefs.HPZ,64"$0x031 0005 StrConst
$LK,"EC__MM ","FL:::/LT/Compiler/CmpDefs.HPZ,33"$0x01B 0005 StrConst
$LK,"EC__PP ","FL:::/LT/Compiler/CmpDefs.HPZ,32"$0x01A 0005 StrConst
$LK+BI,"EvalExpression ","FL:::/LT/Compiler/Lex.CPZ,321",74$00002398 0000 Funct Export
$LK+BI,"ExePrintF ","FL:::/LT/Compiler/CmpMain.CPZ,43",75$00030710 0000 Funct Export
$LK+BI,"ExePutS ","FL:::/LT/Compiler/CmpMain.CPZ,30",76$00030678 0001 Funct Export
$LK+BI,"ExecuteCmdLine ","FL:::/LT/Compiler/CmpMain.CPZ,272",77$000314F0 0003 Funct Export
$LK+BI,"ExecuteFile ","FL:::/LT/Compiler/CmpMain.CPZ,385",78$00031B28 0001 Funct Export
$LK+BI,"ExecuteStr ","FL:::/LT/Compiler/CmpMain.CPZ,357",79$000319C0 0002 Funct Export
$LK+BI,"Expression ","FL:::/LT/Compiler/ExpParser.CPZ,827",80$00013D48 0003 Funct Export
$LK,"FBO1_DOUBLE ","FL:::/LT/Compiler/OptPass1.CPZ,4"$2 0002 StrConst
$LK,"FBO1_INT ","FL:::/LT/Compiler/OptPass1.CPZ,3"$1 0011 StrConst
$LK,"FBO1_NOT_CONST ","FL:::/LT/Compiler/OptPass1.CPZ,2"$0 0004 StrConst
$LK+BI,"FillCompilerTables ","FL:::/LT/Compiler/CmpInit.CPZ,441",81$0002FC50 0001 Funct Export
$LK+BI,"FindMember ","FL:::/LT/Compiler/Lex.CPZ,440",82$00002840 0003 Funct Export
$LK+BI,"FindPSect ","FL:::/LT/Compiler/SPrintF2.CPZ,42",83$000066D8 0001 Funct Export
$LK+BI,"FixupBinaryOp1 ","FL:::/LT/Compiler/OptPass1.CPZ,7",84$000211D0 0013 Funct Export
$LK+BI,"FixupBinaryOp2 ","FL:::/LT/Compiler/OptPass1.CPZ,67",85$00021428 0001 Funct Export
$LK+BI,"FixupUnaryOp ","FL:::/LT/Compiler/OptPass1.CPZ,83",86$00021490 0001 Funct Export
$LK+BI,"GetExpression ","FL:::/LT/Compiler/ExpParser.CPZ,818",87$00013D08 0000 Funct Export
$LK+BI,"GetFJoin2 ","FL:::/LT/Compiler/SPrintF2.CPZ,872",88$0000B218 0001 Funct Export
$LK+BI,"Ic66Rex ","FL:::/LT/Compiler/Code.CPZ,99",89$00018A68 0005 Funct Export
$LK+BI,"IcAddConst ","FL:::/LT/Compiler/Code.CPZ,725",90$0001AA90 0004 Funct Export
$LK+BI,"IcAddEct ","FL:::/LT/Compiler/Code.CPZ,683",91$0001A818 0005 Funct Export
$LK+BI,"IcAddSubEctEqual ","FL:::/LT/Compiler/Code.CPZ,1160",92$0001C580 0005 Funct Export
$LK+BI,"IcAndAnd ","FL:::/LT/Compiler/Code.CPZ,1411",93$0001D550 0001 Funct Export
$LK+BI,"IcAndBranch ","FL:::/LT/Compiler/Code.CPZ,2103",94$0001FCA8 0002 Funct Export
$LK+BI,"IcAssign ","FL:::/LT/Compiler/Code.CPZ,2168",95$0001FFD0 0001 Funct Export
$LK+BI,"IcBitOps ","FL:::/LT/Compiler/Code.CPZ,1678",96$0001E5C8 0007 Funct Export
$LK+BI,"IcBrBitOps ","FL:::/LT/Compiler/Code.CPZ,2416",97$00020D58 000E Funct Export
$LK+BI,"IcCmp ","FL:::/LT/Compiler/Code.CPZ,1553",98$0001DE88 0006 Funct Export
$LK+BI,"IcCmpAndBranch ","FL:::/LT/Compiler/Code.CPZ,1825",99$0001EDE8 0006 Funct Export
$LK+BI,"IcColon ","FL:::/LT/Compiler/Code.CPZ,1517",100$0001DBB8 0001 Funct Export
$LK+BI,"IcCopyIrq ","FL:::/LT/Compiler/Code.CPZ,188",101$00018F38 001C Funct Export
$LK+BI,"IcDeref ","FL:::/LT/Compiler/Code.CPZ,665",102$0001A730 0001 Funct Export
$LK+BI,"IcDiv ","FL:::/LT/Compiler/Code.CPZ,1068",103$0001BF38 0001 Funct Export
$LK+BI,"IcDivEqual ","FL:::/LT/Compiler/Code.CPZ,1087",104$0001C078 0002 Funct Export
$LK+BI,"IcFCmp ","FL:::/LT/Compiler/Code.CPZ,2229",105$00020388 0004 Funct Export
$LK+BI,"IcFCmpAndBranch ","FL:::/LT/Compiler/Code.CPZ,2300",106$000207E8 0004 Funct Export
$LK+BI,"IcFOp1 ","FL:::/LT/Compiler/Code.CPZ,2200",107$00020200 0001 Funct Export
$LK+BI,"IcFOp2 ","FL:::/LT/Compiler/Code.CPZ,2210",108$00020280 0006 Funct Export
$LK+BI,"IcFOp2Equal ","FL:::/LT/Compiler/Code.CPZ,2256",109$000204E0 0005 Funct Export
$LK+BI,"IcFPostIncDec ","FL:::/LT/Compiler/Code.CPZ,2388",110$00020BC8 0002 Funct Export
$LK+BI,"IcFPreIncDec ","FL:::/LT/Compiler/Code.CPZ,2366",111$00020A88 0002 Funct Export
$LK+BI,"IcLea ","FL:::/LT/Compiler/Code.CPZ,644",112$0001A5F0 0003 Funct Export
$LK+BI,"IcMod ","FL:::/LT/Compiler/Code.CPZ,1141",113$0001C440 0001 Funct Export
$LK+BI,"IcModr ","FL:::/LT/Compiler/Code.CPZ,207",114$00019050 000C Funct Export
$LK+BI,"IcMov ","FL:::/LT/Compiler/Code.CPZ,431",115$00019A18 0141 Funct Export
$LK+BI,"IcMul ","FL:::/LT/Compiler/Code.CPZ,943",116$0001B6C8 0001 Funct Export
$LK+BI,"IcMulEqual ","FL:::/LT/Compiler/Code.CPZ,1000",117$0001BA08 0001 Funct Export
$LK+BI,"IcNot ","FL:::/LT/Compiler/Code.CPZ,1400",118$0001D4A8 0001 Funct Export
$LK+BI,"IcOr ","FL:::/LT/Compiler/Code.CPZ,420",119$000199B8 000D Funct Export
$LK+BI,"IcOrOr ","FL:::/LT/Compiler/Code.CPZ,1444",120$0001D768 0001 Funct Export
$LK+BI,"IcPop ","FL:::/LT/Compiler/Code.CPZ,381",121$000197E8 0003 Funct Export
$LK+BI,"IcPopRegs ","FL:::/LT/Compiler/Code.CPZ,398",122$000198C8 000F Funct Export
$LK+BI,"IcPostIncDec ","FL:::/LT/Compiler/Code.CPZ,1798",123$0001EC60 0002 Funct Export
$LK+BI,"IcPreIncDec ","FL:::/LT/Compiler/Code.CPZ,1773",124$0001EAF8 0002 Funct Export
$LK+BI,"IcPreempt ","FL:::/LT/Compiler/Code.CPZ,1742",125$0001E948 0001 Funct Export
$LK+BI,"IcPush ","FL:::/LT/Compiler/Code.CPZ,295",126$000193B8 0007 Funct Export
$LK+BI,"IcPushRegs ","FL:::/LT/Compiler/Code.CPZ,368",127$00019768 000A Funct Export
$LK+BI,"IcRex ","FL:::/LT/Compiler/Code.CPZ,85",128$000189B8 000D Funct Export
$LK+BI,"IcShift ","FL:::/LT/Compiler/Code.CPZ,1303",129$0001CE68 0004 Funct Export
$LK+BI,"IcShiftEqual ","FL:::/LT/Compiler/Code.CPZ,1325",130$0001CFE0 0002 Funct Export
$LK+BI,"IcSlashOp ","FL:::/LT/Compiler/Code.CPZ,267",131$00019220 0008 Funct Export
$LK+BI,"IcSubEct ","FL:::/LT/Compiler/Code.CPZ,900",132$0001B448 0001 Funct Export
$LK+BI,"IcTestAndBranch ","FL:::/LT/Compiler/Code.CPZ,2062",133$0001FB00 0002 Funct Export
$LK+BI,"IcU1 ","FL:::/LT/Compiler/Code.CPZ,73",134$00018910 0042 Funct Export
$LK+BI,"IcU2 ","FL:::/LT/Compiler/Code.CPZ,125",135$00018BE0 0073 Funct Export
$LK+BI,"IcU3 ","FL:::/LT/Compiler/Code.CPZ,140",136$00018CC0 0076 Funct Export
$LK+BI,"IcU4 ","FL:::/LT/Compiler/Code.CPZ,157",137$00018DD8 005D Funct Export
$LK+BI,"IcU8 ","FL:::/LT/Compiler/Code.CPZ,173",138$00018E88 0002 Funct Export
$LK+BI,"IcUnaries ","FL:::/LT/Compiler/Code.CPZ,1391",139$0001D420 0002 Funct Export
$LK+BI,"IcXorXor ","FL:::/LT/Compiler/Code.CPZ,1480",140$0001D980 0001 Funct Export
$LK+BI,"IcZero ","FL:::/LT/Compiler/Code.CPZ,411",141$00019948 0018 Funct Export
$LK+BI,"InitCompiler ","FL:::/LT/Compiler/CmpInit.CPZ,590",142$000302C0 0001 Funct Export
$LK,"KW_ASM ","FL:::/LT/Compiler/CmpDefs.HPZ,208"$21 0001 StrConst
$LK,"KW_ASSERT ","FL:::/LT/Compiler/CmpDefs.HPZ,225"$38 0001 StrConst
$LK,"KW_BREAK ","FL:::/LT/Compiler/CmpDefs.HPZ,211"$24 0001 StrConst
$LK,"KW_CASE ","FL:::/LT/Compiler/CmpDefs.HPZ,214"$27 0001 StrConst
$LK,"KW_CATCH ","FL:::/LT/Compiler/CmpDefs.HPZ,190"$3 0001 StrConst
$LK,"KW_CLASS ","FL:::/LT/Compiler/CmpDefs.HPZ,191"$4 0003 StrConst
$LK,"KW_CONTINUE ","FL:::/LT/Compiler/CmpDefs.HPZ,212"$25 0001 StrConst
$LK,"KW_COUT ","FL:::/LT/Compiler/CmpDefs.HPZ,206"$19 0001 StrConst
$LK,"KW_COUTLN ","FL:::/LT/Compiler/CmpDefs.HPZ,221"$34 0001 StrConst
$LK,"KW_DEFAULT ","FL:::/LT/Compiler/CmpDefs.HPZ,215"$28 0001 StrConst
$LK,"KW_DEFINE ","FL:::/LT/Compiler/CmpDefs.HPZ,188"$1 0001 StrConst
$LK,"KW_DO ","FL:::/LT/Compiler/CmpDefs.HPZ,207"$20 0001 StrConst
$LK,"KW_ELSE ","FL:::/LT/Compiler/CmpDefs.HPZ,194"$7 0005 StrConst
$LK,"KW_ENDIF ","FL:::/LT/Compiler/CmpDefs.HPZ,224"$37 0005 StrConst
$LK,"KW_EXE ","FL:::/LT/Compiler/CmpDefs.HPZ,210"$23 0001 StrConst
$LK,"KW_EXTERN ","FL:::/LT/Compiler/CmpDefs.HPZ,197"$10 0001 StrConst
$LK,"KW_FMTDATA ","FL:::/LT/Compiler/CmpDefs.HPZ,203"$16 0002 StrConst
$LK,"KW_FMTSTR ","FL:::/LT/Compiler/CmpDefs.HPZ,202"$15 0002 StrConst
$LK,"KW_FOR ","FL:::/LT/Compiler/CmpDefs.HPZ,195"$8 0001 StrConst
$LK,"KW_GOTO ","FL:::/LT/Compiler/CmpDefs.HPZ,209"$22 0001 StrConst
$LK,"KW_HELP_FILE ","FL:::/LT/Compiler/CmpDefs.HPZ,230"$43 0001 StrConst
$LK,"KW_HELP_INDEX ","FL:::/LT/Compiler/CmpDefs.HPZ,229"$42 0001 StrConst
$LK,"KW_IF ","FL:::/LT/Compiler/CmpDefs.HPZ,193"$6 0006 StrConst
$LK,"KW_IFDEF ","FL:::/LT/Compiler/CmpDefs.HPZ,222"$35 0006 StrConst
$LK,"KW_IFNDEF ","FL:::/LT/Compiler/CmpDefs.HPZ,223"$36 0006 StrConst
$LK,"KW_IMPORT ","FL:::/LT/Compiler/CmpDefs.HPZ,219"$32 0001 StrConst
$LK,"KW_INCLUDE ","FL:::/LT/Compiler/CmpDefs.HPZ,187"$0 0001 StrConst
$LK,"KW_INPUT_FUN ","FL:::/LT/Compiler/CmpDefs.HPZ,205"$18 0000 StrConst
$LK,"KW_INTERNAL ","FL:::/LT/Compiler/CmpDefs.HPZ,201"$14 0001 StrConst
$LK,"KW_LTEXTERN ","FL:::/LT/Compiler/CmpDefs.HPZ,198"$11 0001 StrConst
$LK,"KW_LTIMPORT ","FL:::/LT/Compiler/CmpDefs.HPZ,220"$33 0001 StrConst
$LK,"KW_NOREG ","FL:::/LT/Compiler/CmpDefs.HPZ,227"$40 0001 StrConst
$LK,"KW_NOUNUSEDWARN ","FL:::/LT/Compiler/CmpDefs.HPZ,228"$41 0001 StrConst
$LK,"KW_OFFSET ","FL:::/LT/Compiler/CmpDefs.HPZ,217"$30 0001 StrConst
$LK,"KW_OUTPUT_FUN ","FL:::/LT/Compiler/CmpDefs.HPZ,204"$17 0000 StrConst
$LK,"KW_PUBLIC ","FL:::/LT/Compiler/CmpDefs.HPZ,216"$29 0001 StrConst
$LK,"KW_REG ","FL:::/LT/Compiler/CmpDefs.HPZ,226"$39 0001 StrConst
$LK,"KW_RETURN ","FL:::/LT/Compiler/CmpDefs.HPZ,199"$12 0001 StrConst
$LK,"KW_SIZEOF ","FL:::/LT/Compiler/CmpDefs.HPZ,200"$13 0001 StrConst
$LK,"KW_SWITCH ","FL:::/LT/Compiler/CmpDefs.HPZ,213"$26 0001 StrConst
$LK,"KW_TRY ","FL:::/LT/Compiler/CmpDefs.HPZ,192"$5 0001 StrConst
$LK,"KW_TYPEOF ","FL:::/LT/Compiler/CmpDefs.HPZ,218"$31 0000 StrConst
$LK,"KW_UNION ","FL:::/LT/Compiler/CmpDefs.HPZ,189"$2 0004 StrConst
$LK,"KW_WHILE ","FL:::/LT/Compiler/CmpDefs.HPZ,196"$9 0002 StrConst
$LK+BI,"Lex ","FL:::/LT/Compiler/Lex.CPZ,542",143$00002CA0 00F4 Funct Export
$LK+BI,"LexBackupLastChar ","FL:::/LT/Compiler/Lex.CPZ,119",144$00001A70 0003 Funct Export
$LK+BI,"LexDel ","FL:::/LT/Compiler/Lex.CPZ,68",145$00001788 0005 Funct Export
$LK+BI,"LexExtendStr ","FL:::/LT/Compiler/Lex.CPZ,1113",146$000046A0 0004 Funct Export
$LK+BI,"LexGetChar ","FL:::/LT/Compiler/Lex.CPZ,130",147$00001AD0 0026 Funct Export
$LK+BI,"LexInStr ","FL:::/LT/Compiler/Lex.CPZ,477",148$000029C0 0001 Funct Export
$LK+BI,"LexIncludeLtf ","FL:::/LT/Compiler/Lex.CPZ,356",149$000024D0 0001 Funct Export
$LK+BI,"LexIncludeStr ","FL:::/LT/Compiler/Lex.CPZ,334",150$00002408 0003 Funct Export
$LK+BI,"LexLineNum ","FL:::/LT/Compiler/Lex.CPZ,1155",151$000048B8 0008 Funct Export
$LK+BI,"LexNew ","FL:::/LT/Compiler/Lex.CPZ,38",152$00001630 0005 Funct Export
$LK+BI,"LexPop ","FL:::/LT/Compiler/Lex.CPZ,428",153$00002790 0002 Funct Export
$LK+BI,"LexPush ","FL:::/LT/Compiler/Lex.CPZ,416",154$000026C8 000A Funct Export
$LK+BI,"LexPutLine ","FL:::/LT/Compiler/Lex.CPZ,1139",155$000047D0 0003 Funct Export
$LK+BI,"LexPutLink ","FL:::/LT/Compiler/Lex.CPZ,1160",156$000048D8 0002 Funct Export
$LK+BI,"LexPutToken ","FL:::/LT/Compiler/Lex.CPZ,100",157$00001948 0003 Funct Export
$LK+BI,"LexSkipEol ","FL:::/LT/Compiler/Lex.CPZ,308",158$00002328 0007 Funct Export
$LK+BI,"LoadAsmHash ","FL:::/LT/Compiler/CmpInit.CPZ,1",159$0002D2F8 0001 Funct Export
$LK+BI,"LoadCompileSysText ","FL:::/LT/Compiler/CmpInit.CPZ,191",160$0002DCD0 0001 Funct Export
$LK+BI,"MSPrintFDate ","FL:::/LT/Compiler/SPrintF2.CPZ,175",161$00007518 0001 Funct Export
$LK+BI,"MSPrintFTime ","FL:::/LT/Compiler/SPrintF2.CPZ,96",162$000068F8 0001 Funct Export
$LK+BI,"OptBrNotZero ","FL:::/LT/Compiler/OptPass1.CPZ,343",163$00022000 0004 Funct Export
$LK+BI,"OptBrZero ","FL:::/LT/Compiler/OptPass1.CPZ,206",164$00021948 0006 Funct Export
$LK+BI,"OptEnd ","FL:::/LT/Compiler/OptPass1.CPZ,161",165$000217D0 0005 Funct Export
$LK+BI,"OptLag ","FL:::/LT/Compiler/OptPass1.CPZ,171",166$00021878 0004 Funct Export
$LK+BI,"OptLag1 ","FL:::/LT/Compiler/OptPass1.CPZ,182",167$000218B8 0002 Funct Export
$LK+BI,"OptLead1 ","FL:::/LT/Compiler/OptPass1.CPZ,193",168$00021900 0002 Funct Export
$LK+BI,"OptMissing ","FL:::/LT/Compiler/OptPass1.CPZ,131",169$00021600 0004 Funct Export
$LK,"OptNext ","FL:::/LT/Compiler/OptPass1.CPZ,152"$00001060 0002 Funct
$LK,"OptNext2 ","FL:::/LT/Compiler/OptPass1.CPZ,155"$000010D8 0002 Funct
$LK,"OptNext3 ","FL:::/LT/Compiler/OptPass1.CPZ,158"$00001150 0001 Funct
$LK+BI,"OptStart ","FL:::/LT/Compiler/OptPass1.CPZ,141",170$00021740 0005 Funct Export
$LK+BI,"OutChar ","FL:::/LT/Compiler/SPrintF2.CPZ,1",171$000064F8 0026 Funct Export
$LK+BI,"OutStr ","FL:::/LT/Compiler/SPrintF2.CPZ,19",172$000065B8 0008 Funct Export
$LK,"PG_EXTERN ","FL:::/LT/Compiler/StmtParser.CPZ,579"$4 0007 StrConst
$LK,"PG_IMPORT ","FL:::/LT/Compiler/StmtParser.CPZ,580"$5 0004 StrConst
$LK,"PG_LTEXTERN ","FL:::/LT/Compiler/StmtParser.CPZ,576"$1 0004 StrConst
$LK,"PG_LTIMPORT ","FL:::/LT/Compiler/StmtParser.CPZ,578"$3 0006 StrConst
$LK,"PG_LTINTERN ","FL:::/LT/Compiler/StmtParser.CPZ,577"$2 0002 StrConst
$LK,"PG_NULL ","FL:::/LT/Compiler/StmtParser.CPZ,575"$0 0001 StrConst
$LK,"PRST_CHECK_BINARY_OPS ","FL:::/LT/Compiler/ExpParser.CPZ,7"$3 000E StrConst
$LK,"PRST_DEREFERRENCE ","FL:::/LT/Compiler/ExpParser.CPZ,6"$2 0004 StrConst
$LK,"PRST_UNARY_MODIFIERS ","FL:::/LT/Compiler/ExpParser.CPZ,5"$1 000A StrConst
$LK,"PRST_UNARY_TERM ","FL:::/LT/Compiler/ExpParser.CPZ,4"$0 0005 StrConst
$LK,"PVLM_CLASS ","FL:::/LT/Compiler/StmtParser.CPZ,14"$2 0001 StrConst
$LK,"PVLM_FUNCTION_PARAM ","FL:::/LT/Compiler/StmtParser.CPZ,13"$1 0004 StrConst
$LK,"PVLM_LOCAL_VAR ","FL:::/LT/Compiler/StmtParser.CPZ,12"$0 0005 StrConst
$LK,"PVLM_UNION ","FL:::/LT/Compiler/StmtParser.CPZ,15"$3 0000 StrConst
$LK+BI,"ParseAsmArg ","FL:::/LT/Compiler/AsmMain.CPZ,491",173$0000D3A8 0002 Funct Export
$LK+BI,"ParseAsmImm ","FL:::/LT/Compiler/AsmMain.CPZ,454",174$0000D238 0006 Funct Export
$LK+BI,"PrsDereferrence ","FL:::/LT/Compiler/ExpParser.CPZ,757",175$00013A88 0000 Funct Export
$LK+BI,"PrsExcept ","FL:::/LT/Compiler/Lex.CPZ,1215",176$00004C50 006E Funct Export
$LK+BI,"PrsParseExpression ","FL:::/LT/Compiler/ExpParser.CPZ,9",177$00010CF0 0011 Funct Export
$LK+BI,"PrsParseGlblInit ","FL:::/LT/Compiler/StmtParser.CPZ,551",178$00015738 0001 Funct Export
$LK,"PrsPop ","FL:::/LT/Compiler/ExpParser.CPZ,2"$00001200 001B Funct
$LK,"PrsPush ","FL:::/LT/Compiler/ExpParser.CPZ,1"$000011E0 0015 Funct
$LK+BI,"PrsUnaryModifier ","FL:::/LT/Compiler/ExpParser.CPZ,571",179$00013098 0000 Funct Export
$LK+BI,"PrsUnaryTerm ","FL:::/LT/Compiler/ExpParser.CPZ,175",180$00011630 0000 Funct Export
$LK+BI,"PrsVarInit ","FL:::/LT/Compiler/StmtParser.CPZ,458",181$00015240 0002 Funct Export
$LK+BI,"PutAsmError ","FL:::/LT/Compiler/Lex.CPZ,1201",182$00004BD0 0023 Funct Export
$LK+BI,"PutAsmWarning ","FL:::/LT/Compiler/Lex.CPZ,1208",183$00004C10 0003 Funct Export
$LK+BI,"PutLexError ","FL:::/LT/Compiler/Lex.CPZ,1171",184$000049E0 0002 Funct Export
$LK+BI,"PutLexWarning ","FL:::/LT/Compiler/Lex.CPZ,1192",185$00004B48 0001 Funct Export
$LK+BI,"ResolveGlbls ","FL:::/LT/Compiler/AsmMain.CPZ,303",186$0000C8F8 0001 Funct Export
$LK+BI,"ResolveLocals ","FL:::/LT/Compiler/AsmMain.CPZ,234",187$0000C448 0004 Funct Export
$LK,"SLASH_OP_DEC ","FL:::/LT/Compiler/Code.CPZ,261"$0xFFFE01 0002 StrConst
$LK,"SLASH_OP_INC ","FL:::/LT/Compiler/Code.CPZ,260"$0xFFFE00 0002 StrConst
$LK,"SLASH_OP_MOV ","FL:::/LT/Compiler/Code.CPZ,265"$0x898800 0001 StrConst
$LK,"SLASH_OP_MUL ","FL:::/LT/Compiler/Code.CPZ,264"$0xF7F604 0000 StrConst
$LK,"SLASH_OP_NEG ","FL:::/LT/Compiler/Code.CPZ,263"$0xF7F603 0001 StrConst
$LK,"SLASH_OP_NOT ","FL:::/LT/Compiler/Code.CPZ,262"$0xF7F602 0001 StrConst
$LK+BI,"SPrintFJoin2 ","FL:::/LT/Compiler/SPrintF2.CPZ,295",188$00008818 0001 Funct Export
$LK+BI,"SPrintFPSect ","FL:::/LT/Compiler/SPrintF2.CPZ,77",189$000067C8 0002 Funct Export
$LK+BI,"SetSourceFileInfo ","FL:::/LT/Compiler/Lex.CPZ,88",190$00001898 000B Funct Export
$LK,"SwitchCaseEntry ","FL:::/LT/Compiler/StmtParser.CPZ,889"$1800000003 0003 Class
$LK,"TEMP_BUF_LEN ","FL:::/LT/Compiler/SPrintF2.CPZ,293"$256 0008 StrConst
$LK+BI,"UndefinedExtern ","FL:::/LT/Compiler/StmtParser.CPZ,257",191$00014908 0001 Funct Export
$LK+BI,"UnusedExternWarning ","FL:::/LT/Compiler/StmtParser.CPZ,263",192$00014960 0004 Funct Export
$LK,"asm_hash ","FL:::/LT/Compiler/CmpGlbls.CPZ,1"$00001234 0005 GlbVar Export
$LK,"assign_bitmap ","FL:::/LT/Compiler/CmpGlbls.CPZ,8"$000012E4 0005 GlbVar Export
$LK,"binary_ops_table ","FL:::/LT/Compiler/CmpGlbls.CPZ,6"$000012BC 0002 GlbVar Export
$LK,"cmp_bitmap ","FL:::/LT/Compiler/CmpGlbls.CPZ,8"$000012F4 0004 GlbVar Export
$LK,"cmp_do_not_write_to_disk ","FL:::/LT/Compiler/CmpGlbls.CPZ,2"$00001240 0002 GlbVar Export
$LK,"cmp_param_cnt ","FL:::/LT/Compiler/CmpGlbls.CPZ,7"$000012CC 0008 GlbVar Export
$LK,"cmp_result_cnt ","FL:::/LT/Compiler/CmpGlbls.CPZ,7"$000012D4 0005 GlbVar Export
$LK,"deref_bitmap ","FL:::/LT/Compiler/CmpGlbls.CPZ,8"$000012DC 0005 GlbVar Export
$LK,"duel_I1_tokens1 ","FL:::/LT/Compiler/CmpGlbls.CPZ,5"$000012A4 0002 GlbVar Export
$LK,"duel_I1_tokens2 ","FL:::/LT/Compiler/CmpGlbls.CPZ,5"$000012AC 0002 GlbVar Export
$LK,"duel_I1_tokens3 ","FL:::/LT/Compiler/CmpGlbls.CPZ,5"$000012B4 0002 GlbVar Export
$LK,"internal_types_table ","FL:::/LT/Compiler/CmpDefs2.HPZ,20"$00000E50 0001 GlbVar Export
$LK,"is_first_compiler ","FL:::/LT/Compiler/CmpGlbls.CPZ,2"$0000123C 0002 GlbVar Export
$LK,"lex_line_feed ","FL:::/LT/Compiler/Lex.CPZ,117"$00001A6C 0001 GlbVar Export
$LK,"lex_zeros ","FL:::/LT/Compiler/Lex.CPZ,117"$00001A68 0009 GlbVar Export
$LK,"non_ptr_vars_mask ","FL:::/LT/Compiler/CmpGlbls.CPZ,10"$00001324 0006 GlbVar Export
$LK,"not_constant_bitmap ","FL:::/LT/Compiler/CmpGlbls.CPZ,8"$000012EC 0003 GlbVar Export
$LK,"num_non_ptr_vars ","FL:::/LT/Compiler/CmpGlbls.CPZ,9"$0000130C 0003 GlbVar Export
$LK,"num_reg_vars ","FL:::/LT/Compiler/CmpGlbls.CPZ,9"$00001304 0003 GlbVar Export
$LK,"num_stk_temps ","FL:::/LT/Compiler/CmpGlbls.CPZ,9"$000012FC 0004 GlbVar Export
$LK,"opt_nop ","FL:::/LT/Compiler/OptPass1.CPZ,138"$000216A0 0007 GlbVar Export
$LK,"reg_vars_mask ","FL:::/LT/Compiler/CmpGlbls.CPZ,10"$0000131C 0002 GlbVar Export
$LK,"stk_temps_mask ","FL:::/LT/Compiler/CmpGlbls.CPZ,10"$00001314 0003 GlbVar Export
$LK,"sys_internal_types ","FL:::/LT/Compiler/CmpGlbls.CPZ,3"$00001244 0089 GlbVar Export
$LK,"to_non_ptr_vars_map ","FL:::/LT/Compiler/CmpGlbls.CPZ,13"$00001344 0003 GlbVar Export
$LK,"to_reg_vars_map ","FL:::/LT/Compiler/CmpGlbls.CPZ,13"$0000133C 0003 GlbVar Export
$LK,"to_stk_temps_map_even ","FL:::/LT/Compiler/CmpGlbls.CPZ,12"$00001334 0008 GlbVar Export
$LK,"to_stk_temps_map_odd ","FL:::/LT/Compiler/CmpGlbls.CPZ,11"$0000132C 0008 GlbVar Export
$LK,"unary_ops_table ","FL:::/LT/Compiler/CmpGlbls.CPZ,6"$000012C4 0002 GlbVar Export
ØÚ`ªyªƒª‹ª’ª¤ª°ª¶ª½ªÇªÕªâªöªøª « «%«/«1«7«A«O«\«p«s«x«¬¬¬!¬&¬0¬5¬;¬B¬L¬O¬]¬j¬~¬ƒ¬Ò¬Ô¬Ş¬ã¬÷¬%­8­'f8­M­U­t­‘­•­›­¡­¸­Ï­ù­ş­®3®8®>®m®r®x®¤®©®¯®Å®È®ä® ¯5¯:¯^¯~¯£¯Ç¯ç¯ °°"°'°L°Š°‘°°°Å°Ê°è°ò°±±8±?±]±y±¢±¼±Ö±í±²à�¦ğùV{�¿á%1Ahu‚”¡´¹ÀÁËæà&?À»é»¼ ¼¼¼¼ ¼&¼.¼6¼>¼H¼R¼Y¼o¼–¼¬¼³¼µ¼¿¼Æ¼Ğ¼ã¼˜%°ãÌãÚãåãìãä ää*ä4äUäkä�äˆä´ä»ä¿äÆäÉäÓäÚäääîäåå#å,å2å=å@åEåqå�å³åÉåÔåêåõåşåæ æææ4æ?æKæRæeæxæ‚æ”æ¨æ¼æÃæÎæÙæåæğæûæççç(çXç_çlç¿çÌçàçççëç÷çûçèè#è*èQèUè`èkèvè�èŒè—è¥è°èµèËè×èâèæèëèïèùèéééé*é1é=éDéOéVéxééƒé�é™é¤é¯éºéÅéÊé÷éêêêê<ê@êKêRê`ênêyê„ê�êšê¥êÓê×êâêõêüêë ëëë1ë;ëBëGëRëVëaëzë�ë¢ë·ë»ëÆëÑëÜëçëòëì2ì9ìVì©ì¶ìÌìàìëìïìíí8íMíQílí€í‹í�í¤í¹í½íçíõíÿíîî&î.î=îUîcîhî}î�î˜îœî¡î¾îÓî×îíîøîïïïïï&ï1ï8ïHïOï_ïfïvï}ïˆï�ï±ï¼ïÀïËïÖïáïìï÷ïğğ4ğ?ğCğNğRğyğ}ğˆğ�ğ�ğÄğÓğŞğéğôğÿğ
ññ#ñ.ñ3ñAñLñWñbñmñxñ¦ñªñµñÈñÏñÚñßñæñññòòòò%ò)ò4òMòXòcònòyò„ò’ò�ò­ò·òÒòäòöòóó,ó:óEóUó_óxóŒó—ó¢ó­ó¸óÃóâóô*ô/ô:ô>ôTôjô|ô�ô ô²ôÄôåô õ1õ6õAõEõeõzõ’õ õµõĞõÓõçõôõö!ö,ö3ö>öEöSöaöhövö„ö’ö ö®ö¼öÊöØöæöôö÷÷÷,÷:÷H÷V÷d÷r÷~÷�÷ ÷°÷à÷ğ÷ø÷"ø-øVø^øiøtø„ø”ø¤ø´øÄøÔøäøôøùù'ùAùjù�ù¤ùÕùìùıùú%ú<úLúkúÈúÏúßúñúNûUû_ûuûwûæû ×è€Ã‘ÔßçòÃÈÃÓÃÕÃàÃüÃ Ä Ä"ÄAÄĞAXè¼û¼ ½½½B½U½b½o½‹½–½¾½Ğ½Õ½Ü½å½ç½ò½ù½¾ ¾@o´XÙiÙwÙ�Ù�٬ٻÙÊÙÙÙæÙëÙÚÚ!Ú0Ú?ÚLÚfÚxÚÚ�Ú¢Ú§ÚµÚ¿ÚÕÚïÚôÚşÚÛ+Û1ÛGÛRÛ\ÛrÛŠÛŸÛ¾ÛÓÛõÛ
Ü,ÜAÜgÜ|ܨܽÜ×ÜòÜùÜİİ0İ;İQİĞİ ğZu ¾;¾B¾M¾T¾_¾j¾v¾€¾‹¾“¾´¾·¾¹¾»¾½¾ã¾ğ¾¿ ¿*¿5¿@¿P¿[¿r¿
�ÅÔ¸ÂÙÂàÂëÂõÂÃÃ)Ã3Ã6Ã8ÃNÃ]ÃkÃ~à @wœx¿‘¿˜¿£¿²¿¹¿¾¿Ç¿ê¿ï¿ö¿À ÀÀ"À-À5ÀVÀYÀ[À]À_ÀvÀ~ÀƒÀ�À¸ÀÀÀÊÀÕÀàÀğÀûÀÁ @�ÃÁ1Á8ÁCÁRÁYÁ^ÁgÁŠÁ�Á–Á¡Á¬Á¸ÁÂÁÍÁÕÁöÁùÁûÁıÁÿÁÂÂ"Â/ÂTÂ\ÂfÂqÂ|Œ—±Â␍X¹!ĞİıİŞŞ'Ş2Ş7ŞnŞxޯޱŞÄŞØŞßŞæŞğŞ÷Şßß#ßZßdß›ß�ß¶ßÊßÏßÖßàßåßçßùß à&àEàYà`àpàuà¬à¶àíàá!á/á:áIáSáXálá‡á¦áºáÁáÑáÚáâ âVâkâŠâ˜â£â²â¼âÁâÒâíâããã(ã-ã­ãèhsŠÅÿGb”¯áæş7HMd|µÆßòw–³W!W(W/W7W@WDWLWZWfWmWqWyW�WŒW“WœW½WÄWËWÎWÕWÜWêWñWX¨ ¨[¿[Ê[Ø[á[
\\,\6\D\O\i\v\Ğ4x\‘\˜\¤\©\¬\¯\±\»\â\é\ğ\÷\ü\]#]&]@]D]F]M]`]˜7‡`]€]œ]¥]°]»]É]Ú]ñ]ü] ^^+^B^M^c^q^‚^™^¤^¼^Ê^Û^ò^ı^__'_>_I_V_d_u_Œ_—_¥_¶_Í_ÿ_ ``5`j`ˆ`–`§`¾`ò`aa+a;aRa{a›aÄaòa b#b&cpÖá`YwY~YƒY�Y®Y³Y¶Y¸YºYÇY€µÂXX!X(X.X9X<XCXNXRXUXdXH�‡`VqVuVyV�V‘VœVptàUñUVVV!V)V1V9VIVQV\VXãëÈYßYıYZZZZZ*ZPÍÔèXùXY Y)Y7YQY\YPH[Y[`[[‰[—[š[¥[PÄËhXyX—X¼XÌXÔXÛXæXh‰“ V±VÃVÊVÓVŞVéVğVòVıVÈÀLÑLÛLæLMM+M8MUMaMjMƒM…M¦M°MÃMÛMN5r`PqPuP‰PÔPİPìPQ QQ2Q;QJQaQjQyQ�Q�Q¥QÃQËQéQñQRR5R=R[RcR�R‰R§R¯RÍR×RõRÿRS'SESOSmSxS–S S¾SÉSçSòSTT9TDTbTmT‹TœTÚUà3N#N-N�N’NİNO'O,O]O_O”O–O»OYP (#» ».»1»9»@»D»H»L»S»W»^»b»f»m»q»x»|»€»‡»‹»’»–»š»¡»¥»¬»°»³»¾» `Zc05Ldu…“±¹!ˆ°=Ã=Ê=Ñ=à=ë=ï=ò=ÿ="@SXĞÜ$.#Pz�°ÇĞâìó$HÇXjmj‚j†j�j¤j»jÊjØjïjùjkk&kBk^kwk|kŒkœk¡kµk½kÅkÏkÙkçkõk ll'l=lGlQldlzl�l‘l¡l«l®l¾lÈlËlälélîlşlmmmmm%m-mFmKmSmcmsm}m”m m³mÉmÓmäm÷m nn$n4n>nAnQn[n^nwn|n�n•n˜n�nµn¸n¼nÄnÌnånênònooo3o?oVolovo‡o�o´oÇoÌoÜoìoşopp#p&p?pDpIpephpmp‰pŒp�pLine truncated
‰&‰3‰A‰F‰N‰V‰f‰v‰{‰‡‰�‰“‰š‰œ‰¯‰&0!߸&Ğ&Û&ø&''+';'O'W'_'b'�'«'°'Ä'Ó'Ş'õ'(((+(>(F(M(a(n(„(�(£(§(±(µ(½(Å(Í(ã(ë(ğ())) ),)2):)?)I)T)Y)e)k)s)ˆ)š)¬)Ã)È)Ú)è)ú)ÿ) ****(*:*?*K*Q*Y*n*€*’*©*®*Í*Ó*Ş*ã*è*ò*++ +7+<+_+‰+�+°+Â+Ù+Ş+ã+ø+
,,3,8,U,],g,o,�,†,˜,�,¯,·,Ì,Ş,ğ,- ---7-A-P-a-f-k-z--’-�-£-«-³-¸-Í-ß-ñ-. ...8.B.Q.e.j.o.~.ƒ.–.¢.§.¯.·.¼.Ñ.ç.ù.//6/@/N/]/q/v/{/‰/½/Â/Ç/í/ò/÷/0 0000(060:0T0Y0l0r0z00‡0�0�0¥0¨0­0Ñ0İ0å0ë0ó011131E1X1j1�1†1§1Í1×1å1ö1 222<2A2F2T2X2r2‹2�2£2¨2°2µ2½2Å2Ó2Û2Ş2ã2333 30353J3`3r3…3—3®3³3Ô3ú344#494>4C4w4|4�4�4“4­4Æ4Ë4õ4ı455-5?5R5d5{5€5¡5­5³5¸5Â5×5í5ÿ56$6;6@6a6m6w6|6†6›6±6Ã6Ö6è6ÿ67%717;7@7J7_7u7‡7š7¬7Ã7È7é7ó7ÿ78 88K8P8U8{8€8…8“8¡8¯8Ä8Ğ8Ş8ù89 9'9,949<9J9R9U9o9{9‰9¤9Ä9Ê9Ò9×9ß9ç9õ9ı9::!:/:D:P:^:y:™:�:¦:«:³:»:É:Ñ:Ô:î:ú:;#;C;H;P;U;];e;s;{;~;“;©;»;Î;à;÷;ü;<'<3<8<=<c<h<m<ˆ<›< <¨<­<µ<½<Ë<Ó<Ö<ë<==&=8=O=T=r=ˆ=�=¨=°=Å=Û=í=>>)>8>@>W>\>z>�>•>°>¸>Í>ã>õ>??1?@?H?_?d?…?�?�?³?Î?Ó?@ @@@$@:@B@W@m@@’@¤@»@Ê@Ò@é@î@AA'A=AXA]A�A“A˜A¦A®AÄAÌAáA÷A BB.BEBTB\BsBxB™B£B±BÇBâBçBCC"C0C8CNCVCkC�C“C¦C¸CÏCŞCæCıCD#D-D;DQDlDqD¢D§D¬DºDÂDØDàDõD EE0EBEYEhEpE‡EŒEªEÅEÊEßEõEFF,FCFUFZFxF�FLine truncated
zzz+zLzbzvzzz z«z­z½zÛzìzız{ {{{){1{H{U{\{a{j{q{x€)¸µx€�€¤€«€¹€΀߀õ€��=�H�`�x��’�£�³�¼�Ë�Ü�ì�‚‚!‚+‚9‚A‚T‚j‚w‚�‚”‚ª‚±‚Á‚Ñ‚Û‚Ş‚î‚ø‚û‚ƒƒƒ.ƒ1ƒ6ƒFƒIƒMƒUƒ]ƒvƒ{ƒƒƒ“ƒ£ƒºƒʃ؃âƒğƒüƒ„)„3„D„[„q„x„ˆ„˜„¢„¥„µ„ÄÆ„ß„ä„é„……␍…)…,…0…8…@…Y…^…f…v…†…�…­…»…É…×…ã…ú…††+†B†X†k†p†€†�†¢†¥†µ†džʆã†è†í† ‡ ‡‡-‡0‡4‡<‡D‡]‡b‡j‡z‡Ї•‡œ‡¬‡³‡ʇÙ‡à‡å‡ˆ*�™P�p�x�����¥�ª�»�É�Ô�×�à�ç�÷�� ��*�5�<�R�t�|�Œ�œ�¡�®�Å�Ü�ë�ÿ���� �7�N�]�e�s����� �®�º�Æ�à�ü�‘ ‘%‘@‘H‘P‘X‘‹‘“‘�‘ª‘¾‘‘Ö‘Ú‘ò‘’’$’(’<’@’K’n’t’�’¡’¨’­’¿’È’Ğ’á’é’û’“9“¤“+h-—°‰щ؉ã‰ç‰ó‰ø‰ŠŠ;ŠFŠPŠUŠYŠ_ŠgŠoŠwŠ˜Š¢ŠÊØŠêŠòŠôŠ‹(‹0‹=‹L‹W‹f‹t‹‚‹ˆ‹–‹�‹¨‹°‹º‹Ñ‹Ü‹ó‹ö‹ÿ‹ŒŒ/ŒEŒ\Œ_ŒhŒ|Œ„Œ˜Œ®ŒÅŒÈŒÑŒåŒíŒ��.�=�@�I�]�i�€�Ÿ�¤�»�Ú�ú�␍� �&�1�I�,X%ª¨“ēǓדß“ñ“ú“1”r”€”’”›”¦”´”ɔԔߔ÷”•••-•2•@•H•n•†•™•£•«•±•¿•̕ԕü•
––––'–O–]–a–e–m–z–†–�–¸–¼–À–È–ğ–ş–——— —)—Q—U—Y—a—‰———›—Ÿ—¤—±—¹—á—ï—ó—÷—˜,˜:˜>˜B˜N˜[˜g˜�˜�˜¡˜¥˜²˜Ú˜è˜ì˜ğ˜ü˜ ™™=™K™O™S™d™Œ™š™�™¢™§™´™À™è™ö™ú™ş™š7šEšIšMšTšYšfšrššš¨š¬š°šÁšéš÷šûšÿš ››@›N›R›V›g›�›�›¡›¥›À›Ñ›à›ì›œ7œLœ^œ}œ¥œ­œ²œ¶œ¿œÑœİœ� �� �0�X�]�k�|�¤�©�¼�Á�Î�Ó�æ�ö���D�I�V�[�e�x���’�œ�¯�Ä�É�Ó�æ�û�Ÿ
ŸŸ2Ÿ7ŸhŸmŸ}Ÿ‚ŸÑŸÖŸ% * 4 A V [ e r ‡ Œ – £ ¸ ½ ¡¡N¡S¡™¡�¡¬¡ò¡¢ ¢¢`¢u¢z¢�¢’¢¥¢ª¢¸¢Ë¢à¢å¢ó¢££ £.£A£V£[£i£|£‘£–£££¨£µ£º£Ç£Ì£Ù£Ş£ë£ğ£F¤K¤¡¤¦¤´¤Á¤Ö¤Û¤é¤ù¤¥¥!¥1¥F¥K¥¡¥¦¥ü¥¦W¦\¦j¦·¦̦Ѧߦ/§D§I§�§•§ܧ᧨¨Y¨^¨t¨“¨£¨º¨˨بݨî¨û¨©3©?©x©¦©«©»©Ò©ã©ğ©õ©ªªª)ª:ªGªOªTªeªsª|ª‡ª©ªÁªÖªêªòª÷ª««(«-«>«R«a«o«€«‘«¢«Ϋí«¬¬ ¬'¬,¬=¬B¬S¬X¬i¬n¬¬„¬›¬¬¬½¬Ô¬Ù¬ğ¬­­)­.­?­U­Z­k­|­�­¤­©­È­Ù­Ş­ı­®*®/®N®S®{®€®…®­®²®ήÓ®ï®ô®¯¯1¯6¯R¯W¯s¯x¯”¯™¯Á¯دé¯ú¯ÿ¯'°>°O°`°e°r°w°Ÿ°°°Á°Ò°×°å° ±5±:±b±б›±¬±½±αß±ä±ò±²B²G²o²—²¨²¹²ʲÛ²ì²ñ²³*³;³L³]³b³y³‡³¯³׳ÿ³´)´Q´y´¡´¦´δö´µ/µNµmµ~µ�µ”µ«µ¹µáµ1¶M¶[¶ƒ¶«¶Ó¶ض·(·P·a·€·Ÿ·°·Á·Æ·î·ÿ·¸!¸2¸C¸T¸e¸j¸�¸ ¸¼¸Á¸é¸ú¸ ¹¹5¹F¹b¹g¹�¹ ¹±¹¶¹Û¹ì¹º º5ºFºWº\º�º©ºźʺغ»(»-»U»}»�»“»¸»à»ü»¼¼7¼_¼d¼Œ¼´¼żʼï¼½3½8½F½n½–½›½ýë½ü½¾¾7¾_¾d¾Œ¾´¾žÖ¾í¾ñ¾ş¾¿ ¿O¿\¿ˆ¿§¿¼¿οİ¿å¿ê¿À ÀÀLine truncated


&
.
9
D
O
T
h
„
�
·
¼
Ç
Ï
Ú
é /ø␍IĞIñIøIÿIJ J%J)J2J:JBJJJcJoJ|J‡JŒJ‘J¹JÇJÉJÖJãJçJìJöJK/K=K?KLKVKcKmKtKyK�K‰K‘KªK¬KÈKäKğKõKıK
LLLDLGLrL0hâ Ønñnôn ooo,oJodooozoo‰o’o˜o›o¥o·o¿oàoúoppp#p:p?p`p‚pŒp£p¼pÙpûpq8q1È8N˜d·dÈdÙdïdee-e>eUe`ese‘e˜e¯eÅeÛeìefftf2X68qQqXq_qgqnq~qœq§q²q×qòqıqrr-r:rMrXr_rjrƒr“r r§r®r¶rÁrÈrârírşr
s%sCs]shsšs3HPvxf—f�fµfÀfØféfÿfg0gAgWg^gug€g‹g�g¯gÇgÎgægıghh"h)h@hKhchrhˆh�hóh4À’Ç O9O@OHOPOpOwO‚O�O O·OÂO×OğO PP.PEPJPSP[PcPƒP‹P˜P§P¯PÍPÕPèPQQ&Q.Q:QEQPQTQ]QyQ¿QğQóQøQ;R50L�xL™L L¥LĞLÜLŞLëLøLüLM MMGMUMWMdMnM{M…MŒM•M�M¤M«M²MºM¿MÇMÌMÚMêMöMNNN7NSNoNzNN‡N‘N™N N­NÃNÌNÔNİNõNOO O O O6øGHXdXkXyX„XŒX”X˜XŸXªX¯X±X¸XÏXñXYYY*Y5YZYbYgYxYƒY¨Y°YµY½YÅYÚYàYZZZ Z%Z+ZKZSZ_ZdZjZ‡ZŒZœZ¡Z¸Z½ZİZåZëZ [-[2[L[Q[Y[_[g[r[ƒ[ˆ[�[›[£[¯[É[Ô[Ö[õ[\ \\+\9\@\W\b\g\r\ˆ\’\°\¸\½\Ä\Ğ\å\ê\]]$]+]5]U]z]‚]�]Ÿ]½]Å]Ê]Ñ]İ]â]ë]ö]^A^I^P^p^x^‡^™^°^µ^İ^å^ì^_&_._=_E_O_W_]_c_k_s_w_~_…_’_�_£_©_®_·_Ò_õ_` ``#`,`4`N`z`„`�`š`±`¼`Á`Æ`La7è Paqaxa�aša­aËaÒaéaôabb5bCbMbXbibb•b¯bÅbİb c8�Ñàn)n0n?nVn[nfnmnxnzn�n˜nšnÔn9¸ x¬ wÁwÈwÖwİwàwçwîwõwüw xxx"x)xExLxSx^xjxvxx†x‘x–x¡x´xÁxÉxëxöx␍yyy y/y2y7yByQyTyYydysyvy{y†y•y˜y�y¨y¶y»yÂyÙyèyÿyz z'z8zOz^zuz~z•zšz±zÌzÏzÕzÚzåzìz{ {{${;{J{a{j{�{†{�{´{Ğ{Ó{Ù{Ş{é{ğ{|| |7|F|]|f|}|‚|™|´|·|½|Â|Í|Ô|ë|ò|÷|}#}.}F}`}k}ƒ}ˆ}š}±}¿}Ä}Ş}á}ç}ì}÷}~~"~9~L~c~p~‡~�~ ~¦~«~¶~Á~Ä~Ë~Ğ~Û~ê~í~ò~ı~
!9>IVm…Š¡¬·Îìõ €1€S€j€s€|€�€½€Ï€å€õ€��9�^�v�‚�š�£�¾�Ú�ß�ê�õ� ‚(‚:‚I‚Q‚i‚t‚y‚„‚�‚”‚Ÿ‚­‚²‚½‚Ë‚Ğ‚Û‚ó‚ø‚ƒƒ ƒ+ƒ2ƒ8ƒ;ƒ@ƒGƒYƒbƒxƒƒ‚ƒ�ƒ’ƒ¬ƒ²ƒµƒÁƒƃÖƒ݃âƒşƒ„ „'„?„T„_„{„~„Š„˜„¯„̈́Ԅۄï„ú„…!…)…=… ‰:˜Ïøhii'i.iFiMidioi�i’i¤i·iÕi÷ij$jFjQjijj†j�j®jÅjĞjèjöjk k)k;kSk^klkskŠk•k�k§k«k²k¶kÁkÒkİkókúkl!l+lAlYl`lwl‚l�lŸl¶lÛlélm mmm m'm@mZm^m`momzmn;è9s s»sÉs÷s%t-t?tQtctzt‘t«tÂtÜtêtöt␍u(uAuWumu„u‰u©uËuãuúuvv+vFv_vuvŒv¤vµvÌv×vïvôvw9wOwgw™w<ˆÿ>!>1>?>J>X>l>z>…>Š>•>ª>¿>Ê>è>ì>ò>?)?1?8?<?C?H?f?j?p?‚?§?®?¶?½?Á?È?Í?Û?æ?ë?@@#@*@5@C@L@c@i@t@‹@�@˜@«@Â@Í@Ø@à@ş@AA"A(A-A7ABAMAUAZAdAoAzA�A‹A–A¥A¨AªA±AÈAĞAØAàAèAïAóAúABB)B/B6B=BCBNBPB[BaBlB�B„B‰B˜B B°BËBÖBØB÷BC␍CC,C3CJCUCZCqC~C†C�C¥C°CËCØCãCğCDDD'DBDQDlD{D–D¦D­D¸DÃDÎDåDEE"E/E3EGEPEREYE^EiEtE|E„E–E£EÁEŞEíEúEF&F+FCFMFRF_FcFvF€F…FŒFšF¢F°FºFÏFæFûF
G G6GKG_GiGtGŒG—GœG³G¾GÃGÎGÙGñGöGûGH H%HI=¸"6 c?cFc]chcyc�c¢cÀcÇcŞcécúcd&d<dRd’d>0$La£úüS[o† ¸ÌÕí03hmp‰•¡­Õïò)?X °T»TÀTÉTÏTÖTØTİT@èZ´� ™   ¨ µ Ì ë 
'
I
y
Ÿ
Ì
á
ú
 % ? U r  ¦ º Î Ø ÷    + 7 C P [ ` q „ — ­ À Ç È Ú ø   ) A I N W   ­ ½ Ñ ä ï ô %BT\n{ƒ•ÆÒŞéî.JN�A¸0¸;Ñ;Ù;î;ù; <"<5<W<n<…<¤<¨<³<Ï<ò<õ<=BĞ·�¨ÀÃåı#LU{¢«¯·ÄÇÒÔáêîøü $(9=Ydfjsz‡‹•™¢»Û÷ %).7U`}ŸºÀÇÔØàı"Hp}£½Øò*Fb¤¨ïC 5V€�¦­µÁÍß /Ce|“»ÄÈØáş  9 W s v ‰ DˆBPğùBivƒ•¢¸¾ÃÊE¨jèûüü ü"ü)ü1ü8üCücünüsüvü}üˆü�ü•ü ü¥ü°üÁü×üâüçüòüıüııı'ı.ı9ı;ıWıdıı±ı¶ıÊıÏıÖıçıûışşş"ş3ş:şNş[şişsş‡şÀşõşÿ ÿÿÿ"ÿ8ÿ¾ÿF˜îş0ZCZJZSZVZaZjZuZ£ZÁZİZùZ[[[G0;>h#s#�#’#H8‰­(c?cIcVcgcpcwc‚c�c«cÇcãcìcïc d'd2d@d\dgdjdƒdŸd¹d½dÂdÊdõdIÀÅÚ (³(·(À(Ã(ß(û()0)9)Q)m)‡)Š)�)–)�)¦)¬)²)¿)JpAL˜#©#¬#Â#Í#Ï#ë#ø#û#$KX+3'LWq~Lp)x‹˜Ÿ«Êí M˜@ğ  /GW_uƒ•©åéø  8Shv’¡ÛS[k{�ª¯²ğNp�Œ(=`†–°ÊÍïOèeÀÉĞÙä8_l}�£¹Ïâéñò &P`;DH=[=l=q=‹=–=›=«=Q°¹LPücü…ü§üÉüëüı5ıVıfı�ı�ı¨ı³ıÀıËıØıãıîıùışş>şLine truncated
%/9Cdku|ƒ�—¡«µ¿ÉÓÚáëõü
",6@JT^hr|†�šÀRp¸Ã@(W([(`(€(†(‹(�(�(’(Ÿ(S *KØfífğfıfg$g+g2g;gDgUgZgcgggrgxg‚g‹g�g“g–g™g›g g£g¥g¬g¯gÂgTØ AĞíõù 1GKU]s�‹¡³¸ÅÊÔêü$.9LQY^fp¹ÇÑÜïôü !UˆCQ(ADGQY`jrux��V0Ux�©­¼ÀÄÓİçı!&0<AIP\oy…Š’™›ªWP29==*=2=9=;=B=XXhğ²5²<²G²L²j²€²�²�² ²£²¥²¯²¶²¹²Â²Ê²Ş²ı²³
³³.³B³O³b³j³Œ³‘³�³¢³±³¹³Í³ì³ö³ù³ÿ³´1´>´b´w´�´¨´Ë´Ñ´ï´µ!µ&µ,µJµ^µhµmµsµ‘µ¥µÆµËµ×µõµ5¶:¶F¶d¶t¶¤¶©¶¯¶Í¶İ¶ä¶ñ¶·!·&·0·N·^·e·r·†·°·¼·Ğ·Õ·Ú·ä·¸¸¸&¸:¸]¸b¸l¸Š¸�¸³¸¸¸Â¸à¸ğ¸ş¸¹$¹»YØc{hŠyŠ‚Š–ŠŸŠÁŠáŠöŠ‹‹0‹9‹[‹{‹�‹¥‹§‹¿‹׋Ş‹ZxÖ‚�ª½ªȪЪÙªëªúª«« «$«-«3«;«E«J«`«v«{«Œ«Å«Ê«Û«¬¬¬W¬d¬i¬†¬¿¬̬Ѭı¬­*­/­W­b­o­­Œ­™­¹­Á­Æ­ë­ü­® ®"®&®/®I®_®d®m®~®†®¥®¼®â®ô®¯¯(¯E¯J¯\¯y¯„¯‘¯¥¯²¯Ưæ¯î¯ó¯°°*°A°g°y°–°›°­°ʰϰá°ş°␍±±.±;±O±o±w±„±‰±¦±¸±ϱõ±²$²)²;²X²g²t²ˆ²•²©²»²Ͳí²³³,³>³K³]³b³g³�³�³¢³гH´[P¬Ó¨A¨G¨Y¨k¨t¨–¨œ¨Ÿ¨£¨¨¨Ш䨩 ©%©T©a©f©p©Œ©’©´©¹©Û©÷©ªª ª"ª&ªUªwªŠª\x‰€Å©Å·ÅÆÅëÅóÅÆÆ Æ=ÆLÆ[ÆnÆ|ÆÆ�ƇƶÆáÆóÆÇ Ç.Ç>ÇMÇZÇzǂǰǷÇÅÇÓÇæÇéÇ
È*È,È2ÈaȃȈȪÈÁÈÄÈåÈÉÉ␍É<ÉBÉPÉ`ɈɶɻÉÂÉãÉòÉıÉ ÊÊAÊgÊvÊ{ʙʻʾÊÈÊâÊñÊËË,Ë.ËHËWËxË˒ˠ˽ËãËòË÷ËÌ7Ì:ÌHÌbÌq̵̡̰̄ÌÏÌŞÌÿÌÍÍ"Í@ÍbÍg͉ͧÍÉÍÏÍİÍÎ&Î.ÎOÎbÎ]ƒ¢PÕiÕnÕ|Õ�Õ¢Õ¿ÕÉÕñÕ÷ÕşÕ&Ö+ÖSÖfÖyÖ–Ö ÖÈÖÎÖÕÖãÖğÖ×× ×1×Y×h×^7v¨üÅüÌüßüæüíüõü÷üşüı ı;ıbıkıƒı‘ı¬ı±ı¿ıÌıÑıÛış)ş+şRşyşŠşšş�ş¯şµş¿şÊşÔşØşêşñşúşÿ*ÿ2ÿDÿNÿRÿqÿvÿ~ÿ�ÿšÿ�ÿ°ÿ½ÿĞÿ_x–Ğÿáÿïÿ3@S—œÍÒé*[`ˆ¸Áòù`�ËÈåååìåõåææFæPæUæjæ’æ˜æ«æÛæåæêæïæçç"ç5çeçoçtçvç�ç¤ç»çëçõçúçè:è@èJèXè^èaèeèkèoèsè}è‡è˜è¥è¼è×èæèéé.éAéaÈp Æ X␍u␍~␍…␍“␍¦␍Ö␍à␍å␍ú␍$*=mw|�«±Éù
4:Q�‹�¨ÒØŞáåëïóı%<Wf“›Ÿ°ÄÎ×Ûíô#19GPTsx€�—›­ÍbğŒˆŞ¥Ş¯ŞãŞòŞ ß.ß3ß;ßIßOßRßaßhßqßzߙ߱ß×ßæßèßàà,à9àKàPà[àiàoàtà‡à·àÁàÆàÈàğàöàá
á␍á áFáSáXá~á‹á–á«áÅáÍáåáöáâ#â1â<âJâPâUâlâœâ¦â«â°âØâŞâõâ)ã3ã8ã=ãeãkãpã‡ã¿ãÉãÎãÓãûãäää$ä)ä@äxä‚ä‡äŒä´äºäÈäÎäÑä×äÛäêäå:å\ådå|å�åµåÈåc`# èíî␍îî"î-î0î4î<î@îgîrîzî‚îœî¤î¨îÛîêîïïï#ï-ï0ï4ïCïKïUï^ïyï‘ï³ïÂïÄïæïõïğğ#ğ(ğ3ğAğGğLğbğ‘ğ–ğ›ğÂğÈğÑğÜğéğñğñññ1ñ>ñCñMñPñwñ„ñ‰ñ“ñ–ñ­ñÔñáñæñ␍òò)ò6òKòeòyò†ò¤òÇòÌòÓòéòÿòó$ó3óEó[ó€ó’ó¬ó·óÆóÚóéóıóô%ô,ôGô]ôsô‰ô®ôÀôÚôéôøô õõ/õOõWõfõ€õ”õ·õ¾õÌõÚõéõ÷õúõÿõöHöMöRöyö|ö’öÉöÒö×öşö÷ ÷!÷X÷a÷f÷�÷•÷¤÷²÷¸÷½÷Ó÷ø øø7ø=øHøKøUøZø”ø£ø¼øĞøğøùù ù*ùBùXùoù~ùƒù�ù«ù²ù¿ùáùïù÷ùú+ú:ú?úIúiúnúvú“úªú¹ú¾úÈúÚúéúüúd(í¸ÛÑÛÖÛíÛûÛ#Ü)ÜQÜyܕܣÜËÜóÜİİ6İ^İdİnİsİ›İÃİÖİéİŞŞŞ+Ş<ŞMŞuŞ„Şe�¼Ë8�Q�f���Ÿ�¨�Ê�ê� �0�?�N�f˜™©0§G§W§a§f§y§¬§®§Ö§¨¨g ,=8¿I¿S¿{¿£¿¥¿Í¿õ¿ÀÀ$À&À7ÀHÀpÀwÀh¸?sxÀ�À�À§ÀâÀ
Á Á4ÁoÁÁ�Á�Á Á±ÁÂÁÇÁÂÂBÂGÂQÂy¡²´ÂÜÂÃ+Ã;ÃIÃZÃ\ÃmÃ~ÃêÃÓÃàÃåÃ␍Ä7Ä@ÄiàµÎˆŸ©´ÂÄìALZ\„��ªÒÛjü< è  !/1Y�†®¹ÇÉñü
 ' / 3 D J T ^ g r v | � ” � ¿ È Ğ á ê õ ù ÿ 

$
5
>
I
M
S
d
q
„
kX˜ ?Lt}l ¢³€—¡ÉñóCPx�mhĞúà÷Jrtœ×ä ,puƒ«Óúÿ'Ovƒª³ÛänèT n È ß í ! * I V ~ ƒ « Ê Ó ò ÿ ␍'␍O␍X␍o¸> R ˆ
Ÿ
©
İ
ê
  ? ^ k Š “ » Ä p°„—ğ¥¦/¦F¦K¦s¦~¦‹¦›¦¨¦¸¦צߦá¦ÿ¦§0§q u†@ÄQÄ[ăīĭÄÕÄıÄ␍ÅÅ,Å.Å?ÅPÅxÅÅrèÏ P�q�y�‡�‹�‘�—�œ� �®�¼�À�Ï�İ�ç�ë�ğ�ú�ü�‘‘(‘,‘;‘I‘]‘a‘x‘}‘�‘”‘¨‘¿‘Ñőߑã‘î‘ü‘’’
’’s°¯‚šEšNšsš…šŠš—š²š¿šÅšöš'›C›I›M›y›ª›¯›Û› œ.œ4œ8œWœdœ‰œ�œ­œºœßœúœ�␍�1�>�C�b�o�q�y�ƒ�†�Š�¢�¯�Â�Ù�Ş�ã�ñ�ÿ��!�&�8�U�Z�l�u�–��ï�HŸMŸbŸtŸyŸ†Ÿ�Ÿ�Ÿ�Ÿ¤ŸºŸÄŸÖŸüŸ  ; @ Z _ | � � £ À Ë Ø è õ ¡%¡-¡;¡A¡a¡~¡†¡ˆ¡¥¡°¡½¡Í¡Ú¡î¡¢¢¢7¢b¢|¢�¢“¢¢Ú¢££/£4£F£c£h£z£—£¢£±£Á£Ğ£ä£ü£"¤)¤.¤3¤5¤:¤I¤Q¤w¤„¤‰¤–¤›¤¨¤­¤¿¤ߤ䤥"¥*¥ğ¥tЯæȶå¶è¶û¶· ····!·%·9·l·w·§·¬·Õ·Û·ã·í·ü·E¸J¸ƒ¸�¸•¸¥¸®¸¹¸Ǹî¸ö¸¹"¹I¹[¹m¹”¹œ¹§¹®¹±¹¶¹ιõ¹ºu è)º#º*º>ºrº€º‹º�ºͺÓºܺçºöº>»@»u»‚»¼»Á»é»¼¼%¼@¼B¼S¼`¼‡¼Œ¼œ¼¥¼°¼¾¼̼½/½4½\½—½¤½ß½ä½ò½¾B¾G¾o¾—¾¾¾˾ò¾û¾"¿3¿v`x�¨Ô¹ÔáÔïÔıÔÕ ÕGÕNÕwX¤¬¸™Ï™Ø™Ş™â™æ™
ššx(¤Æh×�׆הק׺×××á× ØØØ>ØCØkØ~ؑخظØàØæØíØóØöØúØÙ&Ù7ÙHÙpÙÙy�}Œè— ˜)˜/˜O˜l˜n˜p˜�˜�˜Șzp�™ȘÙ˜ä˜ñ˜÷˜™4™9™D™{à `ì}ì‹ì”ìØì íí$íFíKíMíuí{í„í³íÒíáí|Èíøêë#ëWëdë¨ë­ëÀëÅëÇëïëõëììLì[ì}ÎëHé_éfé}é‹éœé¦é´é½éÎéáéòé÷é ê)ê7êEêVêdêuê†ê—ê¨ê¹êÊêÔêåêòê~P'n¸“á“í“” ”;”L”Q”W”w”—”œ”«”Æ”à”ñ”ş”• •0•5•;•a•g•j•n•s•—•«•ϕܕᕖ––3–D–I–l–}–œ–¤–©–Å–Ö–Ø–ô–—h—pp{h—y—‚—�—•—µ—Ò—×—â—€xUa¸‰ɉÒ‰æ‰ï‰Š1ŠFŠ`ŠgŠ�°+hΑΫγÎÁÎİÎùÎÏ␍ÏÏ3ÏSÏUÏuϑϭÏÏÏŞÏ‚.màÏ Ğ#Ğ+Ğ9ĞGĞUĞYĞvЖИЛĞÌĞŞĞşĞÑÑ1Ñ?ÑCÑ`ртхѶѼÑÊÑÚÑèÑ ÒÒAÒqÒvÒ„Ò¤Ò¶ÒÖÒÛÒéÒ Ó)ÓKÓNÓ\ÓjÓ�Ó�ÓÃÓäÓìÓ␍Ô Ôƒè % ’G’a’„’–’·’¹’Ë’ì’î’“!“,“9“F“S“`““‡“¸“„X…­H´q´v´ˆ´š´¼´´Å´É´δú´µ:µGµLµxµ…µе”µ¶µÖµòµõµúµ2¶5¶W¶]¶`¶d¶�²¶Ŷ…P5ûû û3û]ûkûû‡û‹û—ûœû¦û°û¹û½ûÏûÕûŞûüü␍üü'ü+üJüLüTüeünürü„ü‘ü¤ü†hIS‰!‰5‰>‰`‰€‰•‰¯‰¶‰‡€}Šà‹ë‹Œ Œ.ŒNŒgŒ€Œ‚Œ�ŒºŒ¿Œˆ�Œ›ÀŒËŒãŒìŒ�.�G�`�y�{�—�³�Ï�Ô�‰ˆ�«Ø�ï�� �.�N�Z�\�n�q�v�ƒ�Š€­ºˆ�Ÿ�³�¼�Ş�ş�
��!�&�3�‹Pov Ô7Ô_ÔwÔŸÔ¨ÔŒ0Èë€Ù™Ù�٬ٿÙÒÙïÙÚÚ$ÚLÚQÚyڌڟڼÚäÚêÚñÚÿÚ ÛÛ.Û<ÛJÛ[ÛlÛ}Û¥Û´Û�P›¢H™Y™_™c™ˆ™¯™¶™�xNZÀËÒÜáÿ 0OTg�àW ,¼,Î,Ü,ï,ú, ----7-<-O-Q-e-x-z-�-‘-¢-µ-·-Ã-ã-ğ-.7.<.C.H.W.‡.Œ.“.¯.Ô.Ü.ä.é.ÿ.//&/4/Y/j/p/Š/¦/«/³/È/Ğ/Õ/Ú/ê/ø/0 00 00020:0O0W0\0^0l0y0“0˜0·0¿0Ô0Ü0á0ï0ô0ú01 11!121J1M1R1İ1ò1ú1222*2/2=2E2K2S2a2d2r2ƒ2—2œ2î2ö2 333&3+3:3B3E3M3p3•3�3¹3Ó3×3û344$4/4=4Y4y4”4®4¶4¾4Æ4Ë4Õ4ã4ö4555!50585G5O5^5f5u5}5Œ5”5£5«5º5Â5Ğ5õ566*6F6M6R6g6€6‰6—6«6Å6Ñ6æ6ë6777%7-777L7U7c7m7‚7Š7’7—7¡7¶7»7Î7Ó7à7å7 8 8%848Y8z8Ÿ8É8ã8ğ8!9;9@9E9Z9x9€9ˆ9�9–9£9«9¹9Ü9ú9 ::,:::D:R:\:j:€:…:Œ:Ÿ:´:Ş:ñ:û:;;;?;Z;_;d;p;x;};ƒ;š;¤;¸;½;Ì;í;ğ;<<<<<<#</<7<<<A<U<Z<_<s<x<‚<„<’<—<¥<ª<¸<½<Ë<Ğ<Õ<Ú<ß<û< =%=0=G=Q=e=j=y=š=�=­=°=Ê=Ï=Ô=Ü=á=ê=ï=û=>> >!>&>+>0>;>@>P>U>[>r>|>�>•>¤>Å>È>Ø>Û>õ>ú>ÿ>? ???&?.?3?8?L?Q?V?[?f?k?{?€?†?�?§?»?À?Ï?ğ?ó?@@ @%@*@2@7@@@E@Q@Y@^@c@w@|@�@§@¬@À@Å@â@ç@ü@AA%A-A2AGALAjA‡A�A›A¹AËAØAåAéAîAøABB"B'B<BDBIB]BvBƒB�B›BªB¯B³B¸B½BËBÙBåBòBøBCC$C;CFCLCOCVCeC|C‡C�C�CšC£C¨C°CµC×CåCLine truncated
(4GQ]eo|�™¬ÂÊÔÚİèí÷ % A I K P W g ƒ ‹ ¦ ­ ± ¼ Ç Ú ï ö # ( 0 K i n v „ ‹ � • œ ¤ ª ´ ¼ ¾ Å Ï Ó Û ò ø ÿ !!(#”ŞÀ)á)ä)ë)û) ** *(*2*@*F*R*Z*f*q*}*ˆ*”*Ÿ*«*¶*Â*Í*Ù*è*ê*ø*+*+0+D+Z+^+`+l+�+š+¡+¯+»+Ï+Û+ç+ü+ş+, ,.,<,H,R,g,x,},„,‡,š,•èd�Ğ$ç$ò$ı$%%(%P%p%t%w%€%Š%�%š%œ%§%©%´%¶%Á%Ã%Î%Ğ%Ó%Õ%Ş%â%î%ø%ü%& &␍&&"&0&3&;&X&a&i&‡&•&�&§&«&¶&Ç&–°Ob$+$6$A$H$K$O$W$[$_$d$$‡$‰$¬$´$»$Ì$—0ƒ†¸HÃHÎHÓH˜ø&B0Opz”—›Ÿ§²½Ñâé÷
-3:X[_ckru†™h¬�'£'ª'È'Ó'æ'û'(-(:(šh ªÈ&Û&â&'␍'$'/'9'N'i'Œ'›ˆs�ĞGçGñGH+H.HKHnHH�HŸH·Hœ`ˆ‘ØHãHùH6I;IoI¬IÊIßI��dsHSky’�¼Èæö/Mb�@49(#9#G#X#c#Ÿğ¼øÒ␍Ó2Ó:ÓZÓ¯ÓºÓÅÓÒÓÙÓíÓïÓÔ&Ô3ÔIÔWÔbÔqÔyԄԜԺÔÊÔÎÔÕÔïÔúÔüÔÕÕ ÕÕÕ/Õ6ÕAÕJÕNÕYÕ_ÕfÕkÕvÕ€ÕˆÕ“ÕšÕŸÕªÕ±Õ¶ÕÁÕÈÕÍÕØÕßÕäÕïÕöÕûÕÖ␍ÖÖÖ&Ö.Ö9Ö@ÖTÖYքֈ֌֡ÖÌÖĞÖÜÖèÖìÖ×,×7×;×G×S×W×\×g×r׋׫×Ç×Õ×äרØ8ØCØWØ\Øz؂؊ؒ؟تصØÉØÎØÖØëØÿØÙÙ-ÙNÙVÙdÙ�٩ٮٻÙÈÙÕÙâÙêÙÚÚ$Ú/Ú=ÚNÚVÚgÚoÚwÚÚ�Ú Ú½ÚáÚ ÛÛ)ÛFÛnÛsÛÊÜ Ø¿·ĞÜÕÜüÜ#İJİqİ˜İ¿İæİ␍Ş4Ş[ނީŞĞŞ÷ŞßEßlߓߺßáßà/àVà}à¤àËàòàá@ágá�áµáÜáâ*âQâxâŸâÆâíâã;ãbã‰ã°ã×ãşã%äLäsäšäÁäèäå6å]å„å«åÒåùå æGænæ•æ¼æãæ
ç1çXçç¦çÍçôçNü¡È¯%u-uWuwu«uïuIvƒvÍv w]w£wùw9x‰xÏx%yoy£yçyAz{zÅz{U{›{ñ{1|�|Ç|}g}¡}ë}%~o~©~ß~N‡Æ€T€£€â€!�p�¿�ø�!‚f‚ˆ¢€`­øhi'iRi†i±i¼iûi6jajlj¤jØjkkMkˆk³k¾kök*lIl’l±lm mZmymºmÙm!n@n—n¶n)oHo¬oËo"pAp‰p¨pÿpq‘q°qr3r‡r²rèru£HWİ  ) K P X d l z  ‡ ™ � £ ¨ ­ ² · ¼ Á Æ Ë Ğ Õ Ú ß ä é î ó !%!+!3!8!=!E!K!S!X!]!e!k!s!x!}!…!‹!“!˜!�!¥!«!³!¸!½!Å!Ë!Ó!Ø!İ!å!ë!ó!ø!ı!"""'"/"7"E"S"X"`"h"v"{"ƒ"‘"Ÿ"§"¯"´"Á"Ï"İ"å"í"ò"##'#,#4#<#J#X#`#h#m#z#ˆ#–#�#¦#«#º#½#¸&¤HÎTHaq“˜ ¬´ÂÇÏáæëğõúÿ "',16;Kms{€…�“› ¥­³»ÀÅÍÓÛàåíóû  %-3;@EM[cow�› ¨°ÁÆÎÜäòúÿLine truncated
ÖÖ Ö(Ö3Ö>ÖFÖQÖ\ÖdÖfÖzÖÖ�Ö’Ö�Ö¤Ö©Ö®Ö¿ÖÊÖÕÖÚÖêÖñÖüÖ× ×/×J×eׄ׋×�×±×¼×Á×Ò×İ×â×ó׺ר Ø3Ø8Ø@ØKØVØZØbØfØrØ}؂ؓØ�أتصغØÎØÓØäØïØúØüØÙWÙ®0Æé8ÒUÒ_ÒsÒzÒ�Ò‰Ò‘Ò•Ò Ò«Ò³ÒÉÒÔÒÙÒäÒÓ ÓÓ$Ó,Ó.Ó9ÓDÓOÓZÓgÓrÓ}Ó‚Ó¦Ó¯@õˆ:£:®:´:Â:Í:×:Ş:æ:ñ:õ:ÿ:
;;;(;0;6;C;K;Q;^;f;l;t;};ƒ;¢;§;¸;°8¿ÃPLgLvL”L»L±0 ¬ğ ù ␍␍;␍C␍N␍^␍n␍•␍¬␍Í␍Ô␍Û␍ş␍'8Tfo~ ¥µÆÎÓÚìø "+0KRWhyˆ¢¸Üçîû␍ '.3@Vhwƒ”­Æ×Ûìı$6HO`gu�³Îàí(L^u‹¡¸ÜşAFWhz‰š«²¹»É×åó"<`{ˆš±Õù ").D[u„“š­®Êæÿ/²'D8WUW]WaWdWmWsW„W�W™W¤W¾WËWêWõWX␍XX#X.XAX³Ø;ó˜0±0¼0Æ0Í0Ô0ß0ç01111'131>1P1W1[1f1j1s1Š1›1²1Ê1á1ì12"2*2>2P2U2]2m2…2 2¨2À2Ê2Ø2é233(3/3=3T3e3k3o3v3z3�3˜3£3­3¸3Ã3Ê3Ù3á3ó3ù34444(4,454I4w4�4¥4Ã4Ê4á4ì4ó45
5 5/5E5T5\5f5‹5¢5À5Ë5â5í5ô56 6!606F6U6]6g6�6ˆ6�6Ÿ6Á6Ç6é6 7!777G7W7Z7e7p7{7†7•7œ7§7¹7Ğ7î7888 878B8M8[8f8q8|8‡8”8Ÿ8®8È8Ğ8Ò8î89$9D9N9Y9d9l9v9�9Œ9”9�9£9…:´h ¯90LWy€£ÈÓİå  4?fhz£²½ÅÏÓÛãîù "4]lw‰¬·ÁÌßı&FPjxƒ�°½ÏÚìø6X]iŒ�±»ÊÛâéôû␍ '.9AH^iŒ–­ÀÈĞÙáò$(>Wmx‰œ§¾Üäìô ,4OQYw…’Ÿ©ºÙäòı
Ach‰¬Ôßé÷ş   * - 6 : = D K M X _ u | ‡ ¥ ¼ Î Û ğ  % C H O Z q † ‘   ´ Å Í á ò !!*!E!W!c!z!…!ˆ!�!£!µ!Í!Ø!ï!ú!""")"<"S"e"|"š"¡"¸"Ã"Æ"Ñ"â"ğ"û"##+#9#D#O#Z#h#~#‹#™#¨#º#Ô#ß#á#ó# $#$3$C$\${$›$¾$Ã$Ü$ÿ$%6%@%N%R%a%i%�%“%—%Ÿ%¯%·%Ç%Û%ø%&&'&I&_&‚&‡&›&¸&Î&ñ&ü&''+'6'b'w'�'¡'¥'­'¼'Í'Ò'Ù'ï'((#(6(>(a(l(ƒ(�(˜(£(Ï(ä(û())))4)K)])a)v)�)¢)¹)Ô)ë)*%*<*G*Q*h*‘0µğÊ%@RaRlRoRxR~R�R•R¬R¶RÁRÌRÕRçRñRüRS$S+SJSnSyS€S‹S”S¦S±S´S¹SÃSÊSáSìSñSşST/T:TDTXTsT~T„T‰T‘T™T­TËTÖTìT÷TU$ULUfUyU—U¢U°U¹UÏUåUêUôUùUV2V=VHVOVZVpVyV„VšV¼VËVãVîVñV3W@±ĞKáKñKüKLL·@¸½L!L1L<LGLNL¸°“¦àI÷IJJ(JQJVJmJƒJ¦J«JÂJØJûJKK*KEK¹P¨¯HK_K„K�K™K¤K½KËKºÀ/ÄøÈÉ"É0É8ÉAÉIÉLÉSÉ[ÉhɆɠÉ×ÉÊÊÊ)Ê4Ê9ÊBÊJÊhʆʘʠʲʺÊÁÊÆÊãÊïÊûÊË3Ëj˅˖ˤËÓË
ÌÌLÌgÌxÌ�Ì—Ì´Ì»ÌÙÌ÷ÌÍÍ7Í;Í@ÍKÍSÍXÍsÍ�Í˜Í¸ÍÆÍäÍèÍìÍ÷Í[ÎjÎmÎp΃ΡΥΩιÎàÎ ÏÏÏÏ#Ï'Ï0Ï3ÏSÏ[Ï`ÏvχϵÏÃÏÈÏæÏêÏøÏüÏ ĞĞ'Ğ2ĞVĞuЙоĞãĞÿĞÑ ÑÑÑ+Ñ5ÑBÑHÑKÑRÑUÑuÑxÑ}Ñ…Ñ3Ò»0ê-HÄ_ÄfÄmÄuÄ}ÄŠÄ�ĘěĢĦįÄÉÄÅ-ÅFÅPÅVÅgÅjÅoÅxŕšŭÅÂÅåÅÆ(ÆPÆkÆ|ƆƵÆìÆøÆ Ç;ÇLÇbÇiDŽNjǧÇÃÇĞÇéÇÈÈ ÈÈ6È@ÈJÈQÈ\ÈfÈ÷ȼ ␍'؈0ˆ3ˆ<ˆZˆcˆeˆmˆoˆ‘ˆ˜ˆ ˆ§ˆÅˆĞˆŞˆéˆìˆõˆ‰‰‰‰"‰>‰e‰w‰z‰€‰�‰³‰»‰Ñ‰Ô‰ğ‰Š)Š,Š2ŠPŠeŠwŠzŠ�ŠŠŠ’Š¨Š«ŠÇŠîŠ‹‹␍‹+‹@‹G‹J‹y‹‹�‹²‹Õ‹Ú‹à‹ş‹(ŒKŒPŒVŒtŒ¡ŒÄŒàŒåŒëŒ �'�E�P�a�r����Ÿ�¬�¼�Ì�Ü�ì�ü��� �1�B�G�W�}�£�¿�Ä�É�Ó�ñ��-�9�D�O�c�f�s�‡�Š�š�®�±�Á�Õ�Ø�è�ü�ÿ��#�&�6�J�M�h�y�|�‘�§�Â�Ğ�á�÷�‘'‘*‘@‘E‘J‘Z‘x‘°‘´‘בܑì‘
’B’F’i’n’x’–’´’¹’Ã’á’““%“C“e“ˆ“¤“©“³“Ñ“ó“”2”7”A”_”m”””¿”ç”ì”ö”•)•4•;•F•l•�•¢•¤•²•º•Ǖҕñ•ü• ––– –3–L–e–~–Œ–œ–¯–Ü–á–ë– ——H—l—~—€—…—�—­—¾—ñ—ø—˜#˜n˜ˆ˜²˜+™l™q™…™‘™˜™šRšhšmš‚šŒšªš»šîšõš ››E›M›„›·›Í›Ô›à›é›$œNœ\œ†œµœõœ �-�W�†���•��O�|�‘�¤�°�Ñ�Ö�ë�õ�Ÿ$ŸWŸ^ŸtŸ}Ÿ®Ÿ¶ŸO T Y n x – § Ú á ÷ ¡|¡„¡»¡î¡¢ ¢¢ ¢[¢…¢“¢½¢ì¢,£V£d£�£½£Å£Ì£E¤†¤³¤È¤Û¤ç¤¥␍¥¥5¥J¥t¥�¥Ï¥Ò¥Ş¥ã¥è¥ò¥¦%¦O¦k¦ª¦­¦¹¦¾¦Ã¦Í¦ë¦§*§F§R§T§Y§i§§„§”§˜§`ª½ M^Ègågh hhFhshuhzh¡hÈhñh¾hXb˜¯ãñù",B¿8I␍I+IFI]IÀ8 `IqIŸI©IËI
Binary file not shown.
+837
View File
@@ -0,0 +1,837 @@
LTextern CP_PRSPUSH void PrsPush(ParseStack *ps,I8 val);
LTextern CP_PRSPOP I8 PrsPop(ParseStack *ps);
#define PRST_UNARY_TERM 0
#define PRST_UNARY_MODIFIERS 1
#define PRST_DEREFERRENCE 2
#define PRST_CHECK_BINARY_OPS 3
BoolU8 PrsParseExpression(LexStruct *lx,BoolU4 end_exp=FALSE)
{
BoolU4 result=TRUE,question_clause=FALSE,
cont_unary,cont_check_binary_ops,is_lower;
I8 i,j,k;
IntermediateCode *tempi,*tempi_first=lx->cb.cb_out_ptr,*tempi2;
ClassStruct *tempc;
ParseStack *ps=MAlloc(sizeof(ParseStack));
MemberListStruct *local_var;
ArrayDimStruct *tempad=NULL;
ps->ptr=0;
PrsPush(ps,0); //terminate
PrsPush(ps,0); //terminate
try {
do {
lx->flags&=~(LF_PREINC+LF_PREDEC+LF_POSTINC+LF_POSTDEC+LF_FUNCTION);
do i=PrsUnaryTerm(lx,ps,&local_var,&tempad);
while (i==PRST_UNARY_TERM);
while (i==PRST_UNARY_MODIFIERS)
i=PrsUnaryModifier(lx,ps,&local_var,&tempad);
if (i==PRST_DEREFERRENCE)
PrsDereferrence(lx,ps);
//Check for binary Ops
do {
i=PrsPop(ps);
tempc=PrsPop(ps);
if (i && i.u1[2]<=1) {
tempi=lx->cb.cb_last_out_ptr;
i=i.u2[0];
tempc=tempi->ic_class;
if (Bt(deref_bitmap,i) && tempc->ptr_cnt) {
tempc-=sizeof(ClassStruct);
while (tempc->return_class)
tempc=tempc->return_class;
i=EC_DEREF+0x10000;
} else {
if (i==EC_ADDRESS) {
if (!(lx->flags & (LF_RAX|LF_ARRAY))) {
j=tempi->ic_opcode;
if (!Bt(deref_bitmap,j))
PrsExcept(lx,"ST_INVALID_LVALUE");
tempi->ic_opcode=EC_NOP;
tempc+=sizeof(ClassStruct);
}
}
}
CbAddIc(lx,i,0,tempc);
cont_check_binary_ops=TRUE;
} else {
PrsPush(ps,tempc);
PrsPush(ps,i);
i=lx->token;
k=binary_ops_table[i];
if (k.u2[0]==EC_AND_AND || k.u2[0]==EC_OR_OR)
CbAddIc(lx,EC_NOP,0,sys_internal_types[IT_I8]);
if (k.u2[0]==EC_QUESTION)
question_clause=TRUE;
else if (k.u2[0]==EC_COLON) {
if (!question_clause)
k=0;
else
question_clause=FALSE;
}
if (!k.u1[2]) {
cont_check_binary_ops=FALSE;
cont_unary=FALSE; //DONE
} else {
Lex(lx); //skip op
if (Bt(assign_bitmap,k.u2[0])) {
tempi=lx->cb.cb_last_out_ptr;
tempc=tempi->ic_class;
j=tempi->ic_opcode;
if (!Bt(deref_bitmap,j))
PrsExcept(lx,"ST_INVALID_LVALUE");
tempi->ic_opcode=EC_NOP;
while (tempc->return_class)
tempc=tempc->return_class;
k.u1[2]=0x10;
}
do {
i=PrsPop(ps); //pop ops of higher prec
tempc=PrsPop(ps);
is_lower=FALSE;
if (i) {
if (k.u1[2]==i.u1[2]) {
if (!Bt(assign_bitmap,k.u2[0]) ||
!Bt(assign_bitmap,i.u2[0]))
is_lower=TRUE;
} else if (k.u1[2]>i.u1[2])
is_lower=TRUE;
}
if (is_lower) {
if (i.u2[0]==EC_AND_AND || i.u2[0]==EC_OR_OR)
CbAddIc(lx,EC_NOP,0,sys_internal_types[IT_I8]);
CbAddIc(lx,i,0,tempc);
tempi2=lx->cb.cb_last_out_ptr;
if (i.u1[3]&ECF_HAS_PUSH_CMP) {
tempi2->ic_flags|=ICF_POP_CMP;
CbAddIc(lx,EC_NOP,0,sys_internal_types[IT_I8]);
CbAddIc(lx,EC_AND_AND,0,sys_internal_types[IT_I8]);
tempi=lx->cb.cb_last_out_ptr;
tempi->ic_flags|=ICF_POP_CMP;
}
if (Bt(cmp_bitmap,k.u2[0]) &&
Bt(cmp_bitmap,i.u2[0])) {
tempi2->ic_flags|=ICF_PUSH_CMP;
CbAddIc(lx,EC_NOP,0,sys_internal_types[IT_I8]);
CbAddIc(lx,EC_PUSH_CMP,0,tempc);
k.u1[3]|=ECF_HAS_PUSH_CMP;
} else if (k.u2[0]==EC_AND_AND || k.u2[0]==EC_OR_OR)
CbAddIc(lx,EC_NOP,0,sys_internal_types[IT_I8]);
} else {
PrsPush(ps,tempc);
PrsPush(ps,i);
tempi=lx->cb.cb_last_out_ptr;
tempc=tempi->ic_class;
PrsPush(ps,tempc);
PrsPush(ps,k);
cont_check_binary_ops=FALSE;
cont_unary=TRUE;
break;
}
} while (TRUE);
}
}
} while (cont_check_binary_ops);
} while (cont_unary);
while (TRUE) {
i=PrsPop(ps);
tempc=PrsPop(ps);
if (i) {
if (i.u2[0]==EC_AND_AND || i.u2[0]==EC_OR_OR)
CbAddIc(lx,EC_NOP,0,sys_internal_types[IT_I8]);
CbAddIc(lx,i,0,tempc);
if (i.u1[3]&ECF_HAS_PUSH_CMP) {
tempi=lx->cb.cb_last_out_ptr;
tempi->ic_flags|=ICF_POP_CMP;
CbAddIc(lx,EC_NOP,0,sys_internal_types[IT_I8]);
CbAddIc(lx,EC_AND_AND,0,sys_internal_types[IT_I8]);
tempi=lx->cb.cb_last_out_ptr;
tempi->ic_flags|=ICF_POP_CMP;
}
} else
break;
}
} catch {
if (Fs->except_argc>0) {
if (Fs->except_argv[0]==EXCEPT_COMPILER) {
lx->statement_cnt=0;
lx->braces_cnt=0;
result=FALSE;
Fs->catch_except=TRUE;
}
}
}
Free(ps);
if (end_exp && result)
CbAddIc(lx,EC_END_EXP,0,0);
return result;
}
U8 PrsUnaryTerm(LexStruct *lx,ParseStack *ps,MemberListStruct **local_var,ArrayDimStruct **tempad)
{
I8 i,*i_ptr;
I8 argc_cnt,size;
U8 d;
SysHashEntry *temph;
ClassStruct *tempc,*tempc1,*tempc2;
GlblVarStruct *tempg;
MemberListStruct *tempm;
LexUndefEntry *templu;
CbMiscStruct *tempmc;
IntermediateCode *tempi;
BoolU4 needs_right_paren,is_first_param;
LexCbStack *templ,*templ1;
*local_var=NULL;
switch (lx->token) {
case TK_INTEGER:
if (lx->cur_i<0)
CbAddIc(lx,EC_IMM,lx->cur_i,sys_internal_types[IT_U8]);
else
CbAddIc(lx,EC_IMM,lx->cur_i,sys_internal_types[IT_I8]);
Lex(lx);
return PRST_CHECK_BINARY_OPS;
case TK_DOUBLE:
i_ptr=&lx->cur_d;
CbAddIc(lx,EC_DOUBLE,*i_ptr,sys_internal_types[IT_DOUBLE]);
Lex(lx);
return PRST_CHECK_BINARY_OPS;
case TK_STR:
d=LexExtendStr(lx,&size);
if (lx->flags & LF_ASM_EXPRESSIONS)
CbAddIc(lx,EC_IMM,d,sys_internal_types[IT_I1]+sizeof(ClassStruct));
else {
tempmc=CbMiscNew(lx,CBMT_STR_CONST);
CbAddIc(lx,EC_STR_CONST,tempmc,sys_internal_types[IT_I1]+sizeof(ClassStruct));
tempmc->st_len=size;
tempmc->str=d;
lx->flags|=LF_HAS_MISC_DATA;
}
return PRST_CHECK_BINARY_OPS;
case TK_INSERT_BINARY:
d=lx->ident;
size=lx->ident_len;
lx->ident=NULL;
Lex(lx);
if (lx->flags & LF_ASM_EXPRESSIONS)
CbAddIc(lx,EC_IMM,d,sys_internal_types[IT_I1]+sizeof(ClassStruct));
else {
tempmc=CbMiscNew(lx,CBMT_STR_CONST);
CbAddIc(lx,EC_STR_CONST,tempmc,sys_internal_types[IT_I1]+sizeof(ClassStruct));
tempmc->st_len=size;
tempmc->str=d;
lx->flags|=LF_HAS_MISC_DATA;
}
return PRST_CHECK_BINARY_OPS;
case TK_INSERT_BINARY_TYPE:
case TK_INSERT_BINARY_SIZE:
CbAddIc(lx,EC_IMM,lx->cur_i,sys_internal_types[IT_U8]);
Lex(lx);
return PRST_CHECK_BINARY_OPS;
case '(':
Lex(lx); //Skip (
if (!PrsParseExpression(lx))
throw(EXCEPT_COMPILER,2);
if (lx->token!=')')
PrsExcept(lx,"ST_MISSING_RIGHT_PAREN");
Lex(lx); //skip )
lx->flags=(lx->flags & ~(LF_ARRAY+LF_FUNCTION)) | LF_RAX;
return PRST_UNARY_MODIFIERS;
}
i=unary_ops_table[lx->token];
if (i.u1[2]) {
Lex(lx); //Skip op
if (i.u2[0]==EC_ADDRESS && lx->token==TK_IDENT) {
if (tempc=lx->hash_entry) {
if (tempc->type & HTT_FUNCTION) {
if (!Bt(&tempc->flags,Cf_INTERNAL)) {
Lex(lx); //skip fun name
if (Bt(&tempc->flags,Cf_EXTERN)) {
if (lx->a)
PrsExcept(lx,"ST_ADDRESS_EXTERN");
else
CbAddIc(lx,EC_IMM,
&tempc->executable_address,sys_internal_types[IT_PTR]);
CbAddIc(lx,EC_DEREF,0,
sys_internal_types[IT_PTR]);
} else {
if (lx->a)
CbAddIc(lx,EC_ABSOLUTE_ADDRESS,
tempc->executable_address,sys_internal_types[IT_PTR]);
else
CbAddIc(lx,EC_IMM,
tempc->executable_address,sys_internal_types[IT_PTR]);
}
return PRST_CHECK_BINARY_OPS;
}
}
}
}
PrsPush(ps,tempc);
PrsPush(ps,i);
return PRST_UNARY_TERM;
}
if (lx->token=='+') {
Lex(lx);
return PRST_UNARY_TERM;
}
if (lx->token!=TK_IDENT) {
if (lx->token==TK_PLUS_PLUS) {
Lex(lx);
lx->flags|=LF_PREINC;
return PRST_UNARY_TERM;
}
if (lx->token==TK_MINUS_MINUS) {
Lex(lx);
lx->flags|=LF_PREDEC;
return PRST_UNARY_TERM;
}
if (lx->token=='$$' && lx->flags & LF_ASM_EXPRESSIONS) {
Lex(lx);
CbAddIc(lx,EC_IMM,lx->instruction_pointer,sys_internal_types[IT_I8]);
return PRST_CHECK_BINARY_OPS;
}
PrsExcept(lx,"ST_MISSING_EXPRESSION");
}
if (tempm=lx->local_var_entry) {
lx->flags&=~(LF_RAX+LF_ARRAY+LF_FUNCTION);
tempc=tempm->member_class+sizeof(ClassStruct);
if (tempm->flags & MLF_FUNCTION) {
lx->flags|=LF_FUNCTION;
PrsPush(ps,tempm->return_class);
PrsPush(ps,tempm->parameter_cnt);
}
if (tempm->cnt) {
*tempad=tempm->dim_list;
lx->flags|=LF_ARRAY;
tempc+=sizeof(ClassStruct);
}
CbAddIc(lx,EC_RBP,0,tempc);
CbAddIc(lx,EC_IMM,tempm->offset,tempc);
CbAddIc(lx,EC_ADD,0,tempc);
Lex(lx); //skip var name
*local_var=tempm;
return PRST_UNARY_MODIFIERS;
}
if (!(temph=lx->hash_entry)) {
if (!(lx->flags & LF_ASM_EXPRESSIONS))
PrsExcept(lx,"ST_INVALID_LVALUE");
temph=MAllocZ(sizeof(SysHashEntry));
temph->str=lx->ident;
lx->ident=NULL;
temph->use_cnt=0;
SetSourceFileInfo(lx,temph);
temph->user_data0=0;
if (temph->str[0]=='@' &&
temph->str[1]=='@') {
temph->type=HTT_SYS_SYMBOL | HTT_UNRESOLVED_LOCAL;
AddSysHashEntry(temph,lx->local_hash_table);
} else {
temph->type=HTT_SYS_SYMBOL | HTT_UNRESOLVED_GLBL;
AddSysHashEntry(temph,lx->glbl_hash_table);
}
}
if (temph->type & HTT_SYS_SYMBOL) {
if (!(temph->type & HTT_LITERAL) &&
!(temph->type & HTT_IMPORT))
lx->absolute_address_cnt++;
if (temph->type & (HTT_UNRESOLVED_LOCAL|HTT_UNRESOLVED_GLBL)) {
templu=MAlloc(sizeof(LexUndefEntry));
templu->hash=temph;
templu->next=lx->undef_hash_entry;
lx->undef_hash_entry=templu;
if (temph->type & HTT_UNRESOLVED_LOCAL)
lx->flags|=LF_UNRESOLVED_LOCAL;
else
lx->flags|=LF_UNRESOLVED_GLBL;
CbAddIc(lx,EC_IMM,&temph->user_data0,sys_internal_types[IT_PTR]);
CbAddIc(lx,EC_DEREF,0,sys_internal_types[IT_PTR]);
} else {
if (lx->a && !(temph->type & HTT_LITERAL))
CbAddIc(lx,EC_ABSOLUTE_ADDRESS,temph->user_data0,sys_internal_types[IT_PTR]);
else
CbAddIc(lx,EC_IMM,temph->user_data0,sys_internal_types[IT_PTR]);
}
Lex(lx);
return PRST_CHECK_BINARY_OPS;
}
if (temph->type & HTT_FUNCTION) {
is_first_param=TRUE;
Lex(lx); //skip fun name
CbPush(lx);
templ=lx->cb.cb_next;
lx->cb.cb_next=NULL;
tempc=temph;
i=tempc->parameter_cnt;
tempm=tempc->member_list;
argc_cnt=0;
if (lx->token!='(')
needs_right_paren=FALSE;
else {
Lex(lx);
needs_right_paren=TRUE;
}
while (i--) {
if (lx->token==',')
Lex(lx);
else if (!is_first_param && lx->token!=')')
PrsExcept(lx,"ST_EXPECTING_COMMA");
CbInitOutPtrs(&lx->cb);
if (tempm->flags & MLF_DEFAULT_AVAILABLE &&
(lx->token==')' || !needs_right_paren))
CbAddIc(lx,EC_IMM,tempm->default_value,tempm->member_class);
else
if (!PrsParseExpression(lx))
throw(EXCEPT_COMPILER,3);
else {
is_first_param=FALSE;
CbPush(lx);
CbAddIc(lx,EC_NULL,0,0);
tempi=CmpOptPass1(lx,NULL,FALSE);
CbPop(lx);
tempc1=tempi->ic_class;
while (tempc1->return_class)
tempc1=tempc1->return_class;
tempc2=tempm->member_class;
while (tempc2->return_class)
tempc2=tempc2->return_class;
if (tempc2->sub_type==IT_DOUBLE &&
tempc1->sub_type!=IT_DOUBLE)
tempi->ic_flags|=ICF_R_TO_DOUBLE;
else
if (tempc2->sub_type!=IT_DOUBLE &&
tempc1->sub_type==IT_DOUBLE)
tempi->ic_flags|=ICF_R_TO_INT;
}
CbAddIc(lx,EC_NULL,0,0);
CbPush(lx);
tempm=tempm->next;
}
if (tempm && tempm->flags & MLF_DOT_DOT_DOT) {
CbInitOutPtrs(&lx->cb);
CbAddIc(lx,EC_IMM,0,tempm->member_class);
tempi=lx->cb.cb_last_out_ptr;
CbAddIc(lx,EC_NULL,0,0);
CbPush(lx);
if (needs_right_paren) {
if (lx->token!=')') {
do {
if (lx->token==',')
Lex(lx);
else if (!is_first_param)
PrsExcept(lx,"ST_EXPECTING_COMMA");
CbInitOutPtrs(&lx->cb);
if (!PrsParseExpression(lx))
throw(EXCEPT_COMPILER,4);
is_first_param=FALSE;
CbAddIc(lx,EC_NULL,0,0);
CbPush(lx);
argc_cnt++;
} while (lx->token==',');
}
}
tempi->ic_data=argc_cnt++; //++ so add_esp latter works
}
if (needs_right_paren) {
if (lx->token!=')')
PrsExcept(lx,"ST_MISSING_RIGHT_PAREN");
Lex(lx);
}
templ1=templ->cb_next;
templ->cb_next=lx->cb.cb_next;
lx->cb.cb_next=templ;
CbPop(lx);
templ=lx->cb.cb_next;
lx->cb.cb_next=templ1;
CbAddIc(lx,EC_CALL_START,tempc,0);
while (templ) {
templ1=templ->cb_next;
CbAppend(lx,templ);
if (!Bt(&tempc->flags,Cf_INTERNAL))
lx->cb.cb_last_out_ptr->ic_flags|=ICF_PUSH_RESULT;
templ=templ1;
}
if (Bt(&tempc->flags,Cf_INTERNAL))
CbAddIc(lx,tempc->executable_address,0,tempc->return_class);
else if (Bt(&tempc->flags,Cf_EXTERN)) {
if (lx->a) {
if (tempc->type&HTT_IMPORT)
CbAddIc(lx,EC_CALL_INDIRECT2,tempc->executable_address,tempc->return_class);
else
CbAddIc(lx,EC_CALL_EXTERN,tempc,tempc->return_class);
} else
CbAddIc(lx,EC_CALL_INDIRECT2,&tempc->executable_address,tempc->return_class);
CbAddIc(lx,EC_ADD_RSP,(argc_cnt+tempc->parameter_cnt)<<3,tempc->return_class);
} else {
CbAddIc(lx,EC_CALL,tempc->executable_address,tempc->return_class);
CbAddIc(lx,EC_ADD_RSP,(argc_cnt+tempc->parameter_cnt)<<3,tempc->return_class);
}
CbAddIc(lx,EC_CALL_END,tempc,tempc->return_class);
lx->flags=(lx->flags|LF_RAX) & ~(LF_ARRAY|LF_FUNCTION);
return PRST_UNARY_MODIFIERS;
}
if (temph->type & HTT_GLBL_VAR) {
tempg=temph;
tempc=tempg->var_class+sizeof(ClassStruct);
lx->flags&=~(LF_RAX|LF_ARRAY|LF_FUNCTION);
if (tempg->cnt) {
*tempad=tempg->dim_list;
tempc+=sizeof(ClassStruct);
lx->flags|=LF_ARRAY;
}
if (tempg->flags & GVAF_FUNCTION) {
//TODO:Not implemented
lx->flags|=LF_FUNCTION;
}
if (lx->a) {
if (tempg->flags & GVAF_EXTERN) {
CbAddIc(lx,EC_IMM,&tempg->data_address,tempc);
CbAddIc(lx,EC_DEREF,0,tempc);
} else {
if (tempg->flags & GVAF_IMPORT) {
CbAddIc(lx,EC_ABSOLUTE_ADDRESS,tempg->data_address,tempc+sizeof(ClassStruct));
CbAddIc(lx,EC_DEREF,0,tempc);
} else
CbAddIc(lx,EC_ABSOLUTE_ADDRESS,tempg->data_address,tempc);
}
} else {
if (tempg->flags & GVAF_EXTERN) {
CbAddIc(lx,EC_IMM,&tempg->data_address,tempc);
CbAddIc(lx,EC_DEREF,0,tempc);
} else
CbAddIc(lx,EC_IMM,tempg->data_address,tempc);
}
Lex(lx);
return PRST_UNARY_MODIFIERS;
}
if (!(temph->type & HTT_KEYWORD))
PrsExcept(lx,"ST_MISSING_EXPRESSION");
if (temph->user_data0==KW_SIZEOF) {
if (Lex(lx)!='(') PrsExcept(lx,"ST_EXPECTING_LEFT_PAREN");
if (Lex(lx)!=TK_IDENT)
PrsExcept(lx,"ST_INVALID_CLASS");
if (tempm=lx->local_var_entry) {
tempc=tempm->member_class;
i=tempc->size;
if (tempm->cnt)
i*=tempm->cnt;
} else {
tempc=lx->hash_entry;
if (!tempc || !(tempc->type & (HTT_CLASS|HTT_INTERNAL_TYPE|HTT_GLBL_VAR)))
PrsExcept(lx,"ST_INVALID_CLASS");
i=tempc->size;
} //TODO: should allow '.member', etc;
if (Lex(lx)=='*') {
while (Lex(lx)=='*');
i=sizeof(void *);
}
CbAddIc(lx,EC_IMM,i,sys_internal_types[IT_I8]);
if (lx->token!=')')
PrsExcept(lx,"ST_MISSING_RIGHT_PAREN");
Lex(lx);
return PRST_CHECK_BINARY_OPS;
} else if (temph->user_data0==KW_OFFSET) {
if (Lex(lx)!='(') PrsExcept(lx,"ST_EXPECTING_LEFT_PAREN");
if (Lex(lx)!=TK_IDENT)
PrsExcept(lx,"ST_INVALID_CLASS");
if (tempm=lx->local_var_entry)
tempc=tempm->member_class;
else {
tempc=lx->hash_entry;
if (!tempc || !(tempc->type & (HTT_CLASS|HTT_GLBL_VAR)))
PrsExcept(lx,"ST_INVALID_CLASS");
else if (tempc->type & HTT_GLBL_VAR)
tempc=tempc><(GlblVarStruct *)->var_class;
}
if (Lex(lx)!='.')
PrsExcept(lx,"ST_EXPECTING_DOT");
if (Lex(lx)!=TK_IDENT)
PrsExcept(lx,"ST_INVALID_MEMBER");
if (!(tempm=FindMember(lx->ident,tempc)))
PrsExcept(lx,"ST_INVALID_MEMBER");
CbAddIc(lx,EC_IMM,tempm->offset,sys_internal_types[IT_I8]);
if (Lex(lx)!=')')
PrsExcept(lx,"ST_MISSING_RIGHT_PAREN");
Lex(lx);
return PRST_CHECK_BINARY_OPS;
}
PrsExcept(lx,"ST_MISSING_EXPRESSION");
}
U8 PrsUnaryModifier(LexStruct *lx,ParseStack *ps,MemberListStruct **local_var,ArrayDimStruct **tempad)
{
I8 i,j;
LexCbStack *templ,*templ2,*templl;
ClassStruct *tempc,*tempc1;
MemberListStruct *tempm;
IntermediateCode *tempi,*tempi1;
ArrayDimStruct *tempad1;
if (lx->flags & LF_ASM_EXPRESSIONS)
return PRST_CHECK_BINARY_OPS;
if (lx->token==TK_DEREFERRENCE) {
tempi=lx->cb.cb_last_out_ptr;
if (!(lx->flags & (LF_RAX | LF_ARRAY))) {
tempc=tempi->ic_class-sizeof(ClassStruct);
CbAddIc(lx,EC_DEREF+0x10000,0,tempc);
} else
tempi->ic_class-=sizeof(ClassStruct);
} else if (lx->token=='.') {
if (*local_var) {
tempm=*local_var;
tempm->flags|=MLF_NO_REG_VARIABLE;
}
}
*local_var=NULL;
if (lx->token=='.' || lx->token==TK_DEREFERRENCE) {
tempi=lx->cb.cb_last_out_ptr;
tempc=tempi->ic_class;
if (!(lx->flags & LF_RAX))
tempc-=sizeof(ClassStruct);
if (!(tempc->type & HTT_CLASS))
PrsExcept(lx,"ST_INVALID_CLASS");
if (Lex(lx)!=TK_IDENT)
PrsExcept(lx,"ST_INVALID_MEMBER");
if (!(tempm=FindMember(lx->ident,tempc)))
PrsExcept(lx,"ST_INVALID_MEMBER");
Lex(lx); //skip member name
tempc1=tempm->member_class+sizeof(ClassStruct);
CbAddIc(lx,EC_IMM,tempm->offset,tempc1);
lx->flags&=~(LF_RAX|LF_ARRAY|LF_FUNCTION);
if (tempm->cnt) {
*tempad=tempm->dim_list;
tempc1+=sizeof(ClassStruct);
lx->flags|=LF_ARRAY;
}
if(tempm->flags & MLF_FUNCTION) {
PrsPush(ps,tempm->return_class);
PrsPush(ps,tempm->parameter_cnt);
lx->flags|=LF_FUNCTION;
}
CbAddIc(lx,EC_ADD,0,tempc1);
return PRST_UNARY_MODIFIERS;
}
if (lx->token==TK_CAST) {
if (Lex(lx)!='(')
PrsExcept(lx,"ST_EXPECTING_LEFT_PAREN");
if (Lex(lx)!=TK_IDENT)
PrsExcept(lx,"ST_INVALID_CLASS");
tempc=lx->hash_entry;
if (!tempc || !(tempc->type & (HTT_CLASS|HTT_INTERNAL_TYPE)))
PrsExcept(lx,"ST_INVALID_CLASS");
while (Lex(lx)=='*')
tempc+=sizeof(ClassStruct);
tempc+=sizeof(ClassStruct);
tempi=lx->cb.cb_last_out_ptr;
tempi->ic_class=tempc;
if (lx->token!=')')
PrsExcept(lx,"ST_MISSING_RIGHT_PAREN");
Lex(lx);
return PRST_UNARY_MODIFIERS;
}
if (lx->token=='[') {
Lex(lx);
tempi=lx->cb.cb_last_out_ptr;
if (!(lx->flags & (LF_ARRAY | LF_RAX))) {
tempc=tempi->ic_class-sizeof(ClassStruct);
while (!(tempc->type & HTT_INTERNAL_TYPE) && tempc->return_class)
tempc=tempc->return_class;
i=EC_DEREF+0x10000;
CbAddIc(lx,i,0,tempc);
} else {
tempc=tempi->ic_class;
if (!(lx->flags & LF_RAX))
tempc-=sizeof(ClassStruct);
}
tempc1=tempc-sizeof(ClassStruct);
if (tempad1=*tempad) {
CbAddIc(lx,EC_IMM,tempad1->cnt*tempc1->size,tempc);
if (*tempad=tempad1->next) {
if (!PrsParseExpression(lx))
throw(EXCEPT_COMPILER,5);
if (lx->token!=']')
PrsExcept(lx,"ST_MISSING_RIGHT_BRACKET");
Lex(lx); //skip ]
tempi1=lx->cb.cb_last_out_ptr;
if (tempi1->ic_class->sub_type==IT_DOUBLE)
tempi1->ic_flags|=ICF_R_TO_INT;
CbAddIc(lx,EC_MUL,0,tempc);
tempi1=lx->cb.cb_last_out_ptr;
tempi1->ic_flags|=ICF_USE_INT;
CbAddIc(lx,EC_ADD,0,tempc);
tempi1=lx->cb.cb_last_out_ptr;
tempi1->ic_flags|=ICF_USE_INT;
lx->flags|=LF_RAX;
return PRST_UNARY_MODIFIERS;
}
} else
CbAddIc(lx,EC_IMM,tempc1->size,tempc);
if (!PrsParseExpression(lx))
throw(EXCEPT_COMPILER,5);
if (lx->token!=']')
PrsExcept(lx,"ST_MISSING_RIGHT_BRACKET");
Lex(lx); //skip ]
tempi1=lx->cb.cb_last_out_ptr;
if (tempi1->ic_class->sub_type==IT_DOUBLE)
tempi1->ic_flags|=ICF_R_TO_INT;
CbAddIc(lx,EC_MUL,0,tempc);
tempi1=lx->cb.cb_last_out_ptr;
tempi1->ic_flags|=ICF_USE_INT;
CbAddIc(lx,EC_ADD,0,tempc);
tempi1=lx->cb.cb_last_out_ptr;
tempi1->ic_flags|=ICF_USE_INT;
lx->flags&=~(LF_RAX|LF_ARRAY);
return PRST_UNARY_MODIFIERS;
}
if (lx->token=='(' && lx->flags & LF_FUNCTION) {
tempi=lx->cb.cb_last_out_ptr;
tempc=tempi->ic_class-sizeof(ClassStruct);
if (!(lx->flags & (LF_RAX | LF_ARRAY)))
CbAddIc(lx,EC_DEREF,0,sys_internal_types[IT_PTR]);
else
tempi->ic_class=tempc;
CbAddIc(lx,EC_SET_RAX,0,sys_internal_types[IT_PTR]);
CbAddIc(lx,EC_NOP1,1,sys_internal_types[IT_PTR]); //balance the books
CbAddIc(lx,EC_CALL_START,0,tempc);
CbAddIc(lx,EC_PUSH_REGS,1<<CREG_RAX,tempc);
i=PrsPop(ps);
tempc=PrsPop(ps);
j=i;
Lex(lx); //skip '('
CbPush(lx);
templ=lx->cb.cb_next;
lx->cb.cb_next=NULL;
while (i--) {
if (lx->token==',')
Lex(lx);
CbInitOutPtrs(&lx->cb);
if (!PrsParseExpression(lx))
throw(EXCEPT_COMPILER,6);
CbAddIc(lx,EC_NULL,0,0);
CbPush(lx);
}
if (lx->token!=')')
PrsExcept(lx,"ST_MISSING_RIGHT_PAREN");
Lex(lx); //skip ')'
templl=templ->cb_next;
templ->cb_next=lx->cb.cb_next;
lx->cb.cb_next=templ;
CbPop(lx);
templ=lx->cb.cb_next;
lx->cb.cb_next=templl;
while (templ) {
templ2=templ->cb_next;
CbAppend(lx,templ);
lx->cb.cb_last_out_ptr->ic_flags|=ICF_PUSH_RESULT;
templ=templ2;
}
CbAddIc(lx,EC_CALL_INDIRECT,j<<3,tempc);
CbAddIc(lx,EC_ADD_RSP,j<<3+8,tempc);
CbAddIc(lx,EC_CALL_END,0,tempc);
lx->flags=(lx->flags | LF_RAX)&~(LF_ARRAY | LF_FUNCTION);
return PRST_UNARY_MODIFIERS;
}
if (lx->token==TK_PLUS_PLUS) {
Lex(lx);
lx->flags|=LF_POSTINC;
return PRST_DEREFERRENCE;
}
if (lx->token==TK_MINUS_MINUS) {
Lex(lx);
lx->flags|=LF_POSTDEC;
return PRST_DEREFERRENCE;
}
return PRST_DEREFERRENCE;
}
U8 PrsDereferrence(LexStruct *lx,ParseStack *ps)
{
I8 i;
ClassStruct *tempc;
IntermediateCode *tempi;
if (lx->flags & LF_FUNCTION) {
ps->ptr--;
tempc=PrsPop(ps);
}
if (lx->flags & LF_RAX)
return PRST_CHECK_BINARY_OPS;
tempi=lx->cb.cb_last_out_ptr;
tempc=tempi->ic_class-sizeof(ClassStruct);
if (lx->flags & LF_ARRAY) {
tempi->ic_class=tempc;
return PRST_CHECK_BINARY_OPS;
}
if (lx->flags & LF_PREINC) {
lx->flags&=~LF_PREINC;
i=EC_PP_;
} else if (lx->flags & LF_PREDEC) {
lx->flags&=~LF_PREDEC;
i=EC_MM_;
} else if (lx->flags & LF_POSTINC) {
lx->flags&=~LF_POSTINC;
i=EC__PP;
} else if (lx->flags & LF_POSTDEC) {
lx->flags&=~LF_POSTDEC;
i=EC__MM;
} else
i=EC_DEREF;
while (tempc->return_class)
tempc=tempc->return_class;
CbAddIc(lx,i+0x10000,0,tempc);
return PRST_CHECK_BINARY_OPS;
}
void *CompileExpression(LexStruct *lx,U8 *type=NULL)
{
void *result;
U8 size;
DbgInfo *dbg=NULL;
BoolU4 old_trace=Btr(&lx->flags,LFf_OPT_TRACE_PRESENT);
CbPush(lx);
CbInitOutPtrs(&lx->cb);
CbAddIc(lx,EC_RETURN_START,0,0);
if (PrsParseExpression(lx,TRUE)) {
CbAddIc(lx,EC_RETURN_END,0,sys_internal_types[IT_I8]);
CbAddIc(lx,EC_RET,0,0);
CbAddIc(lx,EC_NULL,0,0);
result=CbCompile(lx,NULL,&size,&dbg,type);
} else
result=NULL;
CbPop(lx);
Free(dbg);
AssignBit(&lx->flags,LFf_OPT_TRACE_PRESENT,old_trace);
return result;
}
BoolU8 GetExpression(LexStruct *lx,void **e) //FALSE=no err
{
*e=CompileExpression(lx);
if (*e)
return TRUE;
else
return FALSE;
}
I8 Expression(LexStruct *lx) //FALSE=no err
{
I8 result;
void *e=CompileExpression(lx);
if (e) {
result=Call(e);
DelExpression(e);
} else
result=0;
return result;
}
+1222
View File
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+447
View File
@@ -0,0 +1,447 @@
I8 CmpType(ClassStruct *tempc)
{
if (tempc) {
while (tempc->return_class)
tempc=tempc->return_class;
return tempc->sub_type;
}
return 0;
}
I8 CmpPType(ClassStruct *tempc)
{
if (tempc) {
if (tempc->ptr_cnt)
tempc-=sizeof(ClassStruct);
while (tempc->return_class)
tempc=tempc->return_class;
return tempc->sub_type;
}
return 0;
}
void CmpOptPass2(LexStruct *lx,ClassStruct *fun_class,I8 *register_offsets)
{
ClassStruct *tempc,*tempc1,*tempc2,*tempc3;
CbMiscStruct *lb;
IntermediateCode *tempi,*tempi1,*tempi2,*tempi3,*tempii,
*tempil1,*tempil2,
*temp_lag[4],*last_with_class=NULL;
I8 code,i,j,k,l,o[NUM_REGS],c[NUM_REGS],lea_s[NUM_REGS];
MemberListStruct *tempm,*m[NUM_REGS];
ParseStack *ps=OptStart(lx,temp_lag);
for (i=0;i<NUM_REGS;i++) {
c[i]=0;
o[i]=MAX_I8;
m[i]=NULL;
lea_s[i]=0;
}
if (fun_class) {
tempm=fun_class->member_list;
while (tempm) {
if (!(tempm->flags & MLF_NO_REG_VARIABLE)) {
k=tempm->use_cnt;
if (tempm->flags & MLF_USE_REG_VARIABLE)
k+=MAX_I8/2; //big but not too big
if (k>c[NUM_REGS-1]) {
for (i=0;i<NUM_REGS;i++)
if (k>c[i]) {
for (j=NUM_REGS-2;j>=i;j--) {
c[j+1]=c[j];
o[j+1]=o[j];
m[j+1]=m[j];
}
c[i]=k;
o[i]=tempm->offset;
m[i]=tempm;
break;
}
}
}
tempm=tempm->next;
}
}
tempi=lx->cb.cb_in_ptr;
while (code=tempi->ic_opcode) {
OptNext(tempi,temp_lag);
if (code!=EC_NOP) {
tempil1=temp_lag[1];
tempil2=temp_lag[2];
tempc=tempi->ic_class;
switch (cmp_param_cnt[code]) {
case 9:
ps->ptr-=tempi->ic_data>>3;
break;
case 3:
tempi3=PrsPop(ps);
if (tempi3->ic_flags&ICF_R_TO_DOUBLE)
tempc3=sys_internal_types[IT_DOUBLE];
else if (tempi3->ic_flags & ICF_R_TO_INT)
tempc3=sys_internal_types[IT_I8];
else
tempc3=tempi->p3c;
tempi->p3.type=TY_STK+CmpType(tempc3);
tempi->p3.ptype=CmpPType(tempc3);
tempi->ic_flags|=ICF_P3_WAS_STK;
case 2:
tempi2=PrsPop(ps);
if (tempi2->ic_flags&ICF_R_TO_DOUBLE)
tempc2=sys_internal_types[IT_DOUBLE];
else if (tempi2->ic_flags & ICF_R_TO_INT)
tempc2=sys_internal_types[IT_I8];
else
tempc2=tempi->p2c;
tempi->p2.type=TY_STK+CmpType(tempc2);
tempi->p2.ptype=CmpPType(tempc2);
tempi->ic_flags|=ICF_P2_WAS_STK;
case 1:
tempi1=PrsPop(ps);
if (tempi1->ic_flags&ICF_R_TO_DOUBLE)
tempc1=sys_internal_types[IT_DOUBLE];
else if (tempi1->ic_flags & ICF_R_TO_INT)
tempc1=sys_internal_types[IT_I8];
else
tempc1=tempi->p1c;
tempi->p1.type=TY_STK+CmpType(tempc1);
tempi->p1.ptype=CmpPType(tempc1);
tempi->ic_flags|=ICF_P1_WAS_STK;
break;
}
if (cmp_result_cnt[code]) {
tempi->r.type=TY_STK+CmpType(tempc);
tempi->r.ptype=CmpPType(tempc);
tempi->ic_flags|=ICF_R_WAS_STK;
PrsPush(ps,tempi);
}
switch (code) {
case EC_IMM:
case EC_DOUBLE:
case EC_STR_CONST:
case EC_FS:
case EC_GS:
case EC_PUSH_CMP:
break;
case EC_RBP:
tempi->ic_opcode=EC_REG;
tempi->p1.reg=CREG_RBP;
break;
case EC_REG:
case EC_COM:
case EC_NOT:
case EC_UNARY_MINUS:
break;
case EC_DEREF:
tempi->p1.ptype=tempi->r.type&IT_MASK;
if (tempi1->ic_opcode==EC_LEA) {
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=EC_NOP;
tempi->p1.reg=tempi1->p1.reg;
tempi->p1.disp=tempi1->p1.disp;
tempi->p1.type=TY_DISP+tempi->r.type&IT_MASK;
tempi->p1.ptype=tempi->r.ptype;
tempi->ic_opcode=EC_MOV;
if (tempi->p1.reg==CREG_RBP)
for (i=0;i<NUM_REGS;i++)
if (o[i]==tempi->p1.disp)
lea_s[i]--;
} else if (tempil1->ic_opcode==EC_ADD_CONST) {
if (tempil2->ic_opcode==EC_REG) {
tempi->ic_flags|=tempil2->ic_flags|tempil1->ic_flags;
tempil2->ic_opcode=EC_NOP;
tempil1->ic_opcode=EC_NOP;
tempi->p1.reg=tempil2->p1.reg;
tempi->p1.disp=tempi->ic_data;
tempi->p1.type=TY_DISP+tempi->r.type&IT_MASK;
tempi->p1.ptype=tempi->r.ptype;
tempi->ic_opcode=EC_MOV;
}
}
break;
case EC__PP:
case EC__MM:
case EC_PP_:
case EC_MM_:
if (tempi1->ic_opcode==EC_LEA &&
tempi1->p1.type&TY_MASK==TY_DISP &&
tempi1->p1.reg==CREG_RBP)
for (i=0;i<NUM_REGS;i++)
if (o[i]==tempi1->p1.disp)
lea_s[i]--;
tempi->p1.ptype=tempi->r.type&IT_MASK;
tempi->r.ptype=CmpPType(tempi->p1c);
break;
case EC_POWER:
case EC_SHL:
case EC_SHR:
case EC_MUL:
case EC_DIV:
case EC_MOD:
case EC_AND:
case EC_OR:
case EC_XOR:
break;
case EC_ADD:
if (tempi->ic_class->sub_type==IT_DOUBLE)
break;
if (FixupBinaryOp2(&tempi1,&tempi2)) {
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=EC_NOP;
if (tempi->p1t!=tempi2)
tempi->p1c=tempi->p2c;
tempi->ic_data=tempi1->ic_data;
tempi->ic_opcode=EC_ADD_CONST;
tempi->p1.ptype=tempi->r.type&IT_MASK;
tempi->p2.type=TY_NULL;
if (tempil2->ic_opcode==EC_REG &&
tempil2->p1.reg==CREG_RBP) {
tempi->ic_flags|=tempil2->ic_flags;
tempil2->ic_opcode=EC_NOP;
tempi->ic_opcode=EC_LEA;
tempi->p1.reg=CREG_RBP;
tempi->p1.type=TY_DISP+tempi->p1.type&IT_MASK;
tempi->p1.disp=tempi->ic_data;
for (i=0;i<NUM_REGS;i++)
if (o[i]==tempi->ic_data)
lea_s[i]++;
}
}
break;
case EC_SUB:
if (tempi->ic_class->sub_type==IT_DOUBLE)
break;
if (tempi2->ic_opcode==EC_IMM) {
tempi->ic_flags|=tempi2->ic_flags;
tempi2->ic_opcode=EC_NOP;
tempi->ic_data=tempi2->ic_data;
tempi->ic_opcode=EC_SUB_CONST;
tempi->p2.type=TY_NULL;
}
break;
case EC_EQUAL_EQUAL:
case EC_NOT_EQUAL:
case EC_LESS:
case EC_GREATER:
case EC_LESS_EQUAL:
case EC_GREATER_EQUAL:
case EC_AND_AND:
case EC_OR_OR:
case EC_XOR_XOR:
case EC_COLON:
break;
case EC_ASSIGN:
case EC_SHL_EQUAL:
case EC_SHR_EQUAL:
case EC_MUL_EQUAL:
case EC_DIV_EQUAL:
case EC_MOD_EQUAL:
case EC_AND_EQUAL:
case EC_OR_EQUAL:
case EC_XOR_EQUAL:
case EC_ADD_EQUAL:
case EC_SUB_EQUAL:
if (tempi1->ic_opcode==EC_LEA &&
tempi1->p1.type&TY_MASK==TY_DISP &&
tempi1->p1.reg==CREG_RBP)
for (i=0;i<NUM_REGS;i++)
if (o[i]==tempi1->p1.disp)
lea_s[i]--;
tempi->p1.ptype=tempi->r.type&IT_MASK;
tempi->r.ptype=CmpPType(tempi->p1c);
break;
case EC_SHL_CONST:
case EC_SHR_CONST:
case EC_ENTER:
case EC_ADD_RSP:
case EC_CALL:
case EC_CALL_INDIRECT:
case EC_CALL_INDIRECT2:
case EC_CALL_EXTERN:
case EC_CLI:
case EC_STI:
case EC_WBINVD:
case EC_INVD:
case EC_ENABLE_CACHE:
case EC_DISABLE_CACHE:
case EC_GET_FLAGS:
case EC_RDTSC:
case EC_SET_FLAGS:
case EC_GET_BASE_PTR:
case EC_SET_BASE_PTR:
case EC_GET_STACK_PTR:
case EC_SET_STACK_PTR:
case EC_SET_RAX:
case EC_RETURN_START:
case EC_RETURN_END:
case EC_ABSOLUTE_ADDRESS:
case EC_TYPE:
case EC_BT:
case EC_BTS:
case EC_BTR:
case EC_BTC:
case EC_LBTS:
case EC_LBTR:
case EC_LBTC:
case EC_BSF:
case EC_BSR:
case EC_PREEMPT:
case EC_ABSI8:
case EC_INSQUE:
case EC_INSQUE_REV:
case EC_REMQUE:
case EC_MEMCPY:
case EC_MEMSET:
case EC_INPD:
case EC_INPW:
case EC_INP:
case EC_STRLEN:
case EC_OUTPD:
case EC_OUTPW:
case EC_OUTP:
case EC_SWITCH:
break;
case EC_BR_ZERO:
case EC_BR_NOT_ZERO:
case EC_BR_NOT_EQUAL:
case EC_BR_EQUAL_EQUAL:
case EC_BR_GREATER_EQUAL:
case EC_BR_LESS_EQUAL:
case EC_BR_GREATER:
case EC_BR_LESS:
case EC_BR_AND_NOT_ZERO:
case EC_BR_AND_ZERO:
if (tempi->ic_flags&ICF_POP_CMP &&
!(tempi->ic_flags&ICF_USE_DOUBLE) &&
tempi2->ic_opcode==EC_IMM) {
tempi->ic_flags=(tempi->ic_flags&~ICF_POP_CMP)|ICF_RCX_CMP2;
temp_lag[3]->ic_flags=(temp_lag[3]->ic_flags&~ICF_PUSH_CMP)|ICF_RCX_CMP;
} //fall through
case EC_GET_LABEL:
case EC_BR_BT:
case EC_BR_BTS:
case EC_BR_BTR:
case EC_BR_BTC:
case EC_BR_NOT_BT:
case EC_BR_NOT_BTS:
case EC_BR_NOT_BTR:
case EC_BR_NOT_BTC:
case EC_BR_LBTS:
case EC_BR_LBTR:
case EC_BR_LBTC:
case EC_BR_NOT_LBTS:
case EC_BR_NOT_LBTR:
case EC_BR_NOT_LBTC:
lb=tempi->ic_data;
if (!(tempi->ic_flags&ICF_PUSH_CMP))
while (lb->forward)
lb=lb->forward;
lb->flags|=CBMF_USED;
break;
case EC_LEAVE:
case EC_RET:
if (fun_class && (tempii=last_with_class)) {
if (fun_class->return_class->sub_type==IT_DOUBLE &&
tempii->ic_class->sub_type!=IT_DOUBLE)
tempii->ic_flags|=ICF_R_TO_DOUBLE;
if (fun_class->return_class->sub_type!=IT_DOUBLE &&
tempii->ic_class->sub_type==IT_DOUBLE)
tempii->ic_flags|=ICF_R_TO_INT;
}
break;
case EC_JMP:
if (tempil1->ic_opcode==EC_LABEL) {
lb=tempil1->ic_data;
lb->forward=tempi->ic_data;
if (tempil2->ic_opcode==EC_LABEL) {
lb=tempil2->ic_data;
lb->forward=tempi->ic_data;
if (temp_lag[3]->ic_opcode==EC_LABEL) {
lb=temp_lag[3]->ic_data;
lb->forward=tempi->ic_data;
}
}
}
lb=tempi->ic_data;
while (lb->forward)
lb=lb->forward;
lb->flags|=CBMF_USED;
break;
case EC_NOP:
case EC_NULL:
case EC_LABEL:
case EC_ADDRESS:
case EC_QUESTION:
case EC_IRQ:
case EC_END_EXP:
case EC_CALL_END:
case EC_CALL_END2:
case EC_CALL_START:
case EC_PUSH_REGS:
case EC_POP_REGS:
break;
case EC_NOP1:
ps->ptr+=tempi->ic_data;
break;
default:
OptMissing(lx,2,tempi);
}
if (tempi->ic_class) {
if (code!=EC_RETURN_END)
last_with_class=tempi;
}
}
tempi+=sizeof(IntermediateCode);
}
for (i=0;i<NUM_REGS;i++)
register_offsets[i]=MAX_I8;
if (fun_class)
fun_class->used_reg_mask&=~(CREG_VARS_MASK|CREG_NON_PTR_MASK);
if (fun_class && !Bt(&lx->flags,LFf_NO_REG_VAR) &&
!(lx->flags & LF_NO_REG_OPT)) {
j=0;
for (i=0;i<NUM_REGS;i++)
if (!lea_s[i] && o[i]!=MAX_I8) { //address operator cancels
m[j]=m[i];
o[j++]=o[i];
}
if (j>0) {
l=0;
for (i=0;i<j && l<num_non_ptr_vars;i++) {
tempm=m[i];
tempc=tempm->member_class;
while (tempc->return_class)
tempc=tempc->return_class;
if (!tempc->ptr_cnt && !tempm->cnt) {
tempm->register=to_non_ptr_vars_map[l++];
register_offsets[tempm->register]=o[i];
if (Bt(&lx->flags,LFf_OPT_TRACE_PRESENT)) {
PrintF("Function:%s\r\n",fun_class->str);
PrintF("Reg %Z Var \"%s\" %08X[RBP]\r\n",tempm->register,"ST_U8_REGS",
tempm->str,register_offsets[tempm->register]);
}
o[i]=MAX_I8;
Bts(&fun_class->used_reg_mask,tempm->register);
}
}
l=0;
for (i=0;i<j && l<num_reg_vars;i++) {
if (o[i]!=MAX_I8) {
tempm=m[i];
tempm->register=to_reg_vars_map[l++];
register_offsets[tempm->register]=o[i];
if (Bt(&lx->flags,LFf_OPT_TRACE_PRESENT))
PrintF("Reg %Z Var \"%s\" %08X[RBP]\r\n",tempm->register,"ST_U8_REGS",
tempm->str,tempm->register);
Bts(&fun_class->used_reg_mask,tempm->register);
}
}
}
}
OptEnd(lx,2,ps);
}
+574
View File
@@ -0,0 +1,574 @@
BoolU8 CmpOptIc3(LexStruct *lx,IntermediateCode *tempi,BoolU4 inside_return)
{
I8 i,t,pt,t1,pt1;
IntermediateCode *tempil1,*tempil2;
if (tempi->ic_opcode<EC_IMM) return FALSE;
tempil1=tempi;
if (!(tempil2=OptLag1(lx,tempil1)))
return FALSE;
if (tempil2->r.type&TY_MASK==TY_STK &&
!(tempil2->ic_flags&ICF_PUSH_RESULT)) {
if (tempil1->ic_opcode==EC_ADD_CONST &&
tempil1->p1.type&TY_MASK==TY_STK) {
if ((tempil2->ic_opcode==EC_REG ||
tempil2->ic_opcode==EC_MOV) &&
tempil2->p1.type&TY_MASK==TY_REG) {
i=tempil1->ic_data;
if (i>=MIN_I4 && i<=MAX_I4 &&
!Bt(&non_ptr_vars_mask,tempil2->p1.reg)) {
tempil1->ic_flags|=tempil2->ic_flags&ICF_NO_CVT_MASK;
tempil2->ic_opcode=EC_NOP;
tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK;
tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK;
tempil1->ic_opcode=EC_LEA;
tempil1->p1.type=TY_DISP+tempil1->p1.type&IT_MASK;
tempil1->p1.reg=tempil2->p1.reg;
tempil1->p1.disp=i;
return TRUE;
}
}
}
if (tempil2->ic_opcode==EC_MOV ||
tempil2->ic_opcode==EC_REG) {
if (!inside_return) {
if (tempil1->p3.type&TY_MASK==TY_STK) {
if (tempil2->ic_flags & ICF_R_TO_INT) {
if (tempil2->p1.type&TY_MASK==TY_IMM)
tempil2->p1.disp=tempil2->p1.disp><(double);
else
tempil1->ic_flags|=ICF_P3_TO_INT;
} else if (tempil2->ic_flags&ICF_R_TO_DOUBLE) {
if (tempil2->p1.type&TY_MASK==TY_IMM)
tempil2->p1.disp><(double)=tempil2->p1.disp;
else
tempil1->ic_flags|=ICF_P3_TO_DOUBLE;
}
t=tempil1->p3.type&IT_MASK;
t1=tempil2->p1.type&IT_MASK;
if (t1 && t1<t)
t=t1;
t1=tempil2->r.type&IT_MASK;
if (t1 && t1<t)
t=t1;
tempil1->p3.type=tempil2->p1.type&TY_MASK+t;
pt=tempil1->p3.ptype;
pt1=tempil2->p1.ptype;
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
pt=pt1;
pt1=tempil2->r.ptype;
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
pt=pt1;
tempil1->p3.ptype=pt;
tempil1->p3.reg=tempil2->p1.reg;
tempil1->p3.disp=tempil2->p1.disp;
tempil1->ic_flags|=tempil2->ic_flags&ICF_NO_CVT_MASK;
tempil2->ic_opcode=EC_NOP1;
tempil2->ic_data=1;
tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK;
tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK;
return TRUE;
}
if (tempil1->p2.type&TY_MASK==TY_STK) {
if (tempil2->ic_flags & ICF_R_TO_INT) {
if (tempil2->p1.type&TY_MASK==TY_IMM)
tempil2->p1.disp=tempil2->p1.disp><(double);
else
tempil1->ic_flags|=ICF_P2_TO_INT;
} else if (tempil2->ic_flags&ICF_R_TO_DOUBLE) {
if (tempil2->p1.type&TY_MASK==TY_IMM)
tempil2->p1.disp><(double)=tempil2->p1.disp;
else
tempil1->ic_flags|=ICF_P2_TO_DOUBLE;
}
t=tempil1->p2.type&IT_MASK;
t1=tempil2->p1.type&IT_MASK;
if (t1 && t1<t)
t=t1;
t1=tempil2->r.type&IT_MASK;
if (t1 && t1<t)
t=t1;
tempil1->p2.type=tempil2->p1.type&TY_MASK+t;
pt=tempil1->p2.ptype;
pt1=tempil2->p1.ptype;
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
pt=pt1;
pt1=tempil2->r.ptype;
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
pt=pt1;
tempil1->p2.ptype=pt;
tempil1->p2.reg=tempil2->p1.reg;
tempil1->p2.disp=tempil2->p1.disp;
tempil1->ic_flags|=tempil2->ic_flags&ICF_NO_CVT_MASK;
tempil2->ic_opcode=EC_NOP1;
tempil2->ic_data=1;
tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK;
tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK;
return TRUE;
}
if (tempil1->p1.type&TY_MASK==TY_STK) {
if (tempil2->ic_flags & ICF_R_TO_INT) {
if (tempil2->p1.type&TY_MASK==TY_IMM)
tempil2->p1.disp=tempil2->p1.disp><(double);
else
tempil1->ic_flags|=ICF_P1_TO_INT;
} else if (tempil2->ic_flags&ICF_R_TO_DOUBLE) {
if (tempil2->p1.type&TY_MASK==TY_IMM)
tempil2->p1.disp><(double)=tempil2->p1.disp; //dbgo signed/unsigned
else if (!(tempil1->ic_flags&ICF_USE_INT))
tempil1->ic_flags|=ICF_P1_TO_DOUBLE;
}
t=tempil1->p1.type&IT_MASK;
t1=tempil2->p1.type&IT_MASK;
if (t1 && t1<t)
t=t1;
t1=tempil2->r.type&IT_MASK;
if (t1 && t1<t)
t=t1;
tempil1->p1.type=tempil2->p1.type&TY_MASK+t;
pt=tempil1->p1.ptype;
pt1=tempil2->p1.ptype;
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
pt=pt1;
pt1=tempil2->r.ptype;
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
pt=pt1;
tempil1->p1.ptype=pt;
tempil1->p1.reg=tempil2->p1.reg;
tempil1->p1.disp=tempil2->p1.disp;
tempil1->ic_flags|=tempil2->ic_flags&ICF_NO_CVT_MASK;
tempil2->ic_opcode=EC_NOP1;
tempil2->ic_data=1;
tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK;
tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK;
return TRUE;
}
}
}
if (tempil1->ic_opcode==EC_DEREF) {
if (tempil2->ic_opcode==EC_ADD_CONST &&
tempil2->p1.type&TY_MASK==TY_REG &&
tempil1->p1.type&TY_MASK==TY_STK) {
i=tempil2->ic_data;
if (i>=MIN_I4 && i<=MAX_I4 &&
!Bt(&non_ptr_vars_mask,tempil2->p1.reg)) {
tempil1->ic_flags|=tempil2->ic_flags;
tempil2->ic_opcode=EC_NOP1;
tempil2->ic_data=1;
tempil2->ic_data=-1;
tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK;
tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK;
tempil1->ic_opcode=EC_MOV;
tempil1->p1.type=TY_DISP+tempil1->p1.ptype;
tempil1->p1.reg=tempil2->p1.reg;
tempil1->p1.disp=i;
return TRUE;
}
}
if (tempil2->ic_opcode==EC_LEA &&
tempil1->p1.type&TY_MASK==TY_STK) {
tempil1->ic_flags|=tempil2->ic_flags;
tempil2->ic_opcode=EC_NOP;
tempil1->ic_opcode=EC_MOV;
tempil1->p1.type=tempil2->p1.type&TY_MASK+tempil1->p1.ptype;
tempil1->p1.reg=tempil2->p1.reg;
tempil1->p1.disp=tempil2->p1.disp;
return TRUE;
}
}
}
if (tempil1->ic_opcode==EC_DEREF) {
if (tempil1->p1.type&TY_MASK==TY_REG) {
tempil1->p1.type=TY_DISP+tempil1->p1.ptype;
tempil1->p1.disp=0;
tempil1->ic_opcode=EC_MOV;
return TRUE;
}
}
return FALSE;
}
void CmpOptPass3(LexStruct *lx,I8 *register_offsets,U8 *type_)
{
ClassStruct *tempc,*tempc1,*tempc2,*tempc3;
IntermediateCode *tempi,*tempi1,*tempi2,*tempi3,*tempil1,*tempil2,*tempil3,
*temp_lag[4];
I8 code,i,type=IT_I8;
ParseStack *ps=OptStart(lx,temp_lag);
BoolU4 inside_return=FALSE,dead_code=FALSE;
CbMiscStruct *lb;
tempi=lx->cb.cb_in_ptr;
while (code=tempi->ic_opcode) {
OptNext2(tempi,temp_lag);
if (dead_code&&code!=EC_LABEL)
tempi->ic_opcode=EC_NOP;
else {
tempc=tempi->ic_class;
tempi3=&opt_nop;
tempi2=&opt_nop;
tempi1=&opt_nop;
tempil1=temp_lag[1];
tempil2=temp_lag[2];
tempil3=temp_lag[3];
switch (cmp_param_cnt[code]) {
case 9:
ps->ptr-=tempi->ic_data>>3;
break;
case 3:
tempi3=PrsPop(ps);
tempc3=tempi3->ic_class;
case 2:
tempi2=PrsPop(ps);
tempc2=tempi2->ic_class;
case 1:
tempi1=PrsPop(ps);
tempc1=tempi1->ic_class;
break;
}
switch (code) {
case EC_IMM:
case EC_TYPE:
tempi->p1.type=TY_IMM+IT_I8;
tempi->p1.disp=tempi->ic_data;
tempi->ic_opcode=EC_MOV;
break;
case EC_DOUBLE:
tempi->p1.type=TY_IMM+IT_I8;
tempi->p1.disp=tempi->ic_data;
tempi->p1.ptype=IT_DOUBLE;
tempi->ic_opcode=EC_MOV;
break;
case EC_STR_CONST:
case EC_FS:
case EC_GS:
case EC_RBP:
case EC_REG:
case EC_COM:
case EC_NOT:
case EC_UNARY_MINUS:
case EC_PUSH_CMP:
break;
case EC_MOV:
if (tempi->p1.type&TY_MASK==TY_DISP &&
tempi->p1.reg==CREG_RBP) {
i=CmpOffsetToReg(tempi->p1.disp,register_offsets);
if (i>=0) {
tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK;
tempi->p1.reg=i;
}
}
break;
case EC_DEREF:
if (tempi1->ic_opcode==EC_LEA) {
if (tempi1->p1.type&TY_MASK==TY_DISP &&
tempi1->p1.reg==CREG_RBP) {
i=CmpOffsetToReg(tempi1->p1.disp,register_offsets);
if (i>=0) {
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=EC_NOP;
tempi->ic_opcode=EC_REG;
tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK;
tempi->p1.reg=i;
}
}
} else if ((tempi1->ic_opcode==EC_ABSOLUTE_ADDRESS ||
(tempi1->ic_opcode==EC_MOV &&
tempi1->p1.type==TY_IMM+IT_I8 &&
tempi1->p1.disp>=0 && tempi1->p2.disp<0x80000000)) &&
!(lx->flags & LF_ASM_EXPRESSIONS)) {
if (tempi1->ic_opcode==EC_ABSOLUTE_ADDRESS)
tempi->p1.disp=tempi1->ic_data;
else
tempi->p1.disp=tempi1->p1.disp;
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=EC_NOP;
tempi1->p1.type=TY_NULL+tempi1->p1.type&IT_MASK;
tempi1->r.type=TY_NULL+tempi1->r.type&IT_MASK;
tempi->ic_opcode=EC_MOV;
tempi->p1.type=TY_RIP_DISP32+tempi->p1.ptype;
tempi->p1.reg=CREG_RIP;
}
break;
case EC__PP:
case EC__MM:
case EC_PP_:
case EC_MM_:
if (tempi1->ic_opcode==EC_LEA) {
if (tempi1->p1.type&TY_MASK==TY_DISP &&
tempi1->p1.reg==CREG_RBP) {
i=CmpOffsetToReg(tempi1->p1.disp,register_offsets);
if (i>=0) {
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=EC_NOP1;
tempi1->ic_data=1;
tempi1->r.type=TY_NULL;
tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK;
tempi->p1.reg=i;
tempi->ic_flags|=ICF_NOT_ADDRESS;
}
}
} else if ((tempi1->ic_opcode==EC_ABSOLUTE_ADDRESS ||
(tempi1->ic_opcode==EC_MOV &&
tempi1->p1.type==TY_IMM+IT_I8 &&
tempi1->p1.disp>=0 && tempi1->p2.disp<0x80000000)) &&
!(lx->flags & LF_ASM_EXPRESSIONS)) {
tempi->ic_flags|=tempi1->ic_flags;
if (tempi1->ic_opcode==EC_ABSOLUTE_ADDRESS)
tempi->p1.disp=tempi1->ic_data;
else
tempi->p1.disp=tempi1->p1.disp;
tempi1->ic_opcode=EC_NOP;
tempi1->p1.type=TY_NULL+tempi1->p1.type&IT_MASK;
tempi1->r.type=TY_NULL+tempi1->r.type&IT_MASK;
tempi->p1.type=TY_RIP_DISP32+tempi->p1.ptype;
tempi->p1.reg=CREG_RIP;
tempi->ic_flags|=ICF_NOT_ADDRESS;
}
break;
case EC_LEA:
case EC_SHL_CONST:
case EC_SHR_CONST:
case EC_POWER:
case EC_SHL:
case EC_SHR:
case EC_MUL:
case EC_DIV:
case EC_MOD:
case EC_AND:
case EC_OR:
case EC_XOR:
case EC_ADD:
case EC_SUB:
case EC_EQUAL_EQUAL:
case EC_NOT_EQUAL:
case EC_LESS:
case EC_GREATER:
case EC_LESS_EQUAL:
case EC_GREATER_EQUAL:
case EC_AND_AND:
case EC_OR_OR:
case EC_XOR_XOR:
case EC_COLON:
break;
case EC_ASSIGN:
case EC_SHL_EQUAL:
case EC_SHR_EQUAL:
case EC_MUL_EQUAL:
case EC_DIV_EQUAL:
case EC_MOD_EQUAL:
case EC_AND_EQUAL:
case EC_OR_EQUAL:
case EC_XOR_EQUAL:
case EC_ADD_EQUAL:
case EC_SUB_EQUAL:
if (tempi1->ic_opcode==EC_LEA) {
if (tempi1->p1.type&TY_MASK==TY_DISP) {
if (tempi1->p1.reg==CREG_RBP) {
i=CmpOffsetToReg(tempi1->p1.disp,register_offsets);
if (i>=0) {
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=EC_NOP1;
tempi1->ic_data=1;
tempi1->p1.type=TY_NULL;
tempi1->r.type=TY_NULL;
tempi->p1.reg=i;
tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK;
} else {
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=EC_NOP1;
tempi1->ic_data=1;
tempi1->r.type=TY_NULL;
tempi1->p1.type=TY_NULL;
tempi->p1.disp=tempi1->p1.disp;
tempi->p1.reg=CREG_RBP;
tempi->p1.type=TY_DISP+tempi->p1.type&IT_MASK;
}
} else {
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=EC_NOP1;
tempi1->ic_data=1;
tempi1->r.type=TY_NULL;
tempi1->p1.type=TY_NULL;
tempi->p1.disp=tempi1->p1.disp;
tempi->p1.reg=tempi1->p1.reg;
tempi->p1.type=TY_DISP+tempi->p1.type&IT_MASK;
}
tempi->ic_flags|=ICF_NOT_ADDRESS;
}
} else if ((tempi1->ic_opcode==EC_ABSOLUTE_ADDRESS ||
(tempi1->ic_opcode==EC_MOV &&
tempi1->p1.type==TY_IMM+IT_I8 &&
tempi1->p1.disp>=0 && tempi1->p2.disp<0x80000000)) &&
!(lx->flags & LF_ASM_EXPRESSIONS)) {
tempi->ic_flags|=tempi1->ic_flags;
tempi->p1.disp=tempi1->ic_data;
tempi1->ic_opcode=EC_NOP1;
tempi1->ic_data=1;
tempi1->p1.type=TY_NULL+tempi1->p1.type&IT_MASK;
tempi1->r.type=TY_NULL+tempi1->r.type&IT_MASK;
tempi1->r.type=TY_NULL;
tempi->p1.type=TY_RIP_DISP32+tempi->p1.type&IT_MASK;
tempi->p1.reg=CREG_RIP;
tempi->ic_flags|=ICF_NOT_ADDRESS;
}
break;
case EC_ADD_CONST:
case EC_SUB_CONST:
case EC_ENTER:
case EC_ADD_RSP:
case EC_CALL:
case EC_CALL_INDIRECT:
case EC_CALL_INDIRECT2:
case EC_CALL_EXTERN:
case EC_CLI:
case EC_STI:
case EC_WBINVD:
case EC_INVD:
case EC_ENABLE_CACHE:
case EC_DISABLE_CACHE:
case EC_GET_FLAGS:
case EC_RDTSC:
case EC_SET_FLAGS:
case EC_GET_BASE_PTR:
case EC_SET_BASE_PTR:
case EC_GET_STACK_PTR:
case EC_SET_STACK_PTR:
case EC_SET_RAX:
break;
case EC_RETURN_START:
inside_return=TRUE;
break;
case EC_RETURN_END:
inside_return=FALSE;
break;
case EC_GET_LABEL:
case EC_ABSOLUTE_ADDRESS:
case EC_BT:
case EC_BTS:
case EC_BTR:
case EC_BTC:
case EC_LBTS:
case EC_LBTR:
case EC_LBTC:
case EC_BSF:
case EC_BSR:
case EC_PREEMPT:
case EC_ABSI8:
case EC_INSQUE:
case EC_INSQUE_REV:
case EC_REMQUE:
case EC_MEMCPY:
case EC_MEMSET:
case EC_INPD:
case EC_INPW:
case EC_INP:
case EC_STRLEN:
case EC_OUTPD:
case EC_OUTPW:
case EC_OUTP:
case EC_SWITCH:
case EC_RET:
case EC_NULL:
case EC_ADDRESS:
case EC_QUESTION:
case EC_IRQ:
case EC_NOP:
case EC_CALL_START:
case EC_LEAVE:
case EC_PUSH_REGS:
case EC_POP_REGS:
case EC_BR_BT:
case EC_BR_BTS:
case EC_BR_BTR:
case EC_BR_BTC:
case EC_BR_NOT_BT:
case EC_BR_NOT_BTS:
case EC_BR_NOT_BTR:
case EC_BR_NOT_BTC:
case EC_BR_LBTS:
case EC_BR_LBTR:
case EC_BR_LBTC:
case EC_BR_NOT_LBTS:
case EC_BR_NOT_LBTR:
case EC_BR_NOT_LBTC:
break;
case EC_BR_ZERO:
case EC_BR_NOT_ZERO:
case EC_BR_NOT_EQUAL:
case EC_BR_EQUAL_EQUAL:
case EC_BR_GREATER_EQUAL:
case EC_BR_LESS_EQUAL:
case EC_BR_GREATER:
case EC_BR_LESS:
case EC_BR_AND_NOT_ZERO:
case EC_BR_AND_ZERO:
lb=tempi->ic_data;
if (tempi->ic_flags&ICF_PUSH_CMP) {
lb->flags|=CBMF_POP_CMP;
lb->forward=NULL;
}
break;
case EC_LABEL:
lb=tempi->ic_data;
if (lb->flags&CBMF_USED)
dead_code=FALSE;
break;
case EC_JMP:
dead_code=TRUE;
break;
case EC_NOP1:
ps->ptr+=tempi->ic_data;
break;
case EC_CALL_END2:
break;
case EC_CALL_END:
case EC_END_EXP:
if (tempi->p1.type&TY_MASK==TY_STK) {
if (tempil1->r.type&TY_MASK==TY_STK &&
!(tempil1->ic_flags&ICF_PUSH_RESULT)) {
tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK;
tempi->p1.reg=CREG_RAX;
tempil1->r.type=TY_REG+tempil1->r.type&IT_MASK;
tempil1->r.reg=CREG_RAX;
}
}
break;
default:
OptMissing(lx,3,tempi);
}
while (CmpOptIc3(lx,tempi,inside_return));
if (inside_return) {
if (tempc=tempi->ic_class) {
if (tempi->ic_flags & ICF_R_TO_DOUBLE)
type=IT_DOUBLE;
else if (tempi->ic_flags & ICF_R_TO_INT)
type=IT_I8;
else
type=tempc->sub_type;
}
}
code=tempi->ic_opcode;
if (cmp_result_cnt[code])
PrsPush(ps,tempi);
}
tempi+=sizeof(IntermediateCode);
}
if (type_)
*type_=type;
OptEnd(lx,3,ps);
}
+182
View File
@@ -0,0 +1,182 @@
void CmpOptPass4(LexStruct *lx)
{
IntermediateCode *tempi,*tempi1,
*temp_lag[4];
I8 code,i,t,pt,t1,pt1;
ParseStack *ps=OptStart(lx,temp_lag);
BoolU4 inside_return=FALSE;
tempi=lx->cb.cb_in_ptr;
while (code=tempi->ic_opcode) {
OptNext2(tempi,temp_lag);
if (code>EC_END_EXP && code!=EC_NOP1) {
if (tempi->ic_flags&ICF_TRACE) {
if (Bt(&lx->pass_trace_mask,4)) {
PrintF("%2d:",ps->ptr);
CbPutIc(tempi);
}
}
if (cmp_param_cnt[code]==9)
ps->ptr-=tempi->ic_data>>3;
if (code==EC_PUSH_REGS) {
for (i=0;i<NUM_REGS;i++)
if (Bt(&tempi->ic_data,i))
ps->ptr++;
} else if (code==EC_POP_REGS) {
for (i=0;i<NUM_REGS;i++)
if (Bt(&tempi->ic_data,i))
ps->ptr--;
}
if (tempi->p3.type&TY_MASK==TY_STK) {
tempi1=PrsPop(ps);
if (!inside_return) {
if (tempi1->ic_opcode==EC_MOV ||
tempi1->ic_opcode==EC_REG) {
if (tempi1->ic_flags & ICF_R_TO_INT) {
if (tempi1->p1.type&TY_MASK==TY_IMM)
tempi1->p1.disp=tempi1->p1.disp><(double);
else
tempi->ic_flags|=ICF_P3_TO_INT;
} else if (tempi1->ic_flags&ICF_R_TO_DOUBLE) {
if (tempi1->p1.type&TY_MASK==TY_IMM)
tempi1->p1.disp><(double)=tempi1->p1.disp;
else
tempi->ic_flags|=ICF_P3_TO_DOUBLE;
}
t=tempi->p3.type&IT_MASK;
t1=tempi1->p1.type&IT_MASK;
if (t1 && t1<t)
t=t1;
t1=tempi1->r.type&IT_MASK;
if (t1 && t1<t)
t=t1;
tempi->p3.type=tempi1->p1.type&TY_MASK+t;
pt=tempi->p3.ptype;
pt1=tempi1->p1.ptype;
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
pt=pt1;
pt1=tempi1->r.ptype;
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
pt=pt1;
tempi->p3.ptype=pt;
tempi->p3.reg=tempi1->p1.reg;
tempi->p3.disp=tempi1->p1.disp;
tempi->ic_flags|=tempi1->ic_flags&ICF_NO_CVT_MASK;
tempi1->ic_opcode=EC_NOP1;
tempi1->ic_data=1;
tempi1->p1.type=TY_NULL+tempi1->p1.type&IT_MASK;
tempi1->r.type=TY_NULL+tempi1->r.type&IT_MASK;
}
}
}
if (tempi->p2.type&TY_MASK==TY_STK) {
tempi1=PrsPop(ps);
if (!inside_return) {
if (tempi1->ic_opcode==EC_MOV ||
tempi1->ic_opcode==EC_REG) {
if (tempi1->ic_flags & ICF_R_TO_INT) {
if (tempi1->p1.type&TY_MASK==TY_IMM)
tempi1->p1.disp=tempi1->p1.disp><(double);
else
tempi->ic_flags|=ICF_P2_TO_INT;
} else if (tempi1->ic_flags&ICF_R_TO_DOUBLE) {
if (tempi1->p1.type&TY_MASK==TY_IMM)
tempi1->p1.disp><(double)=tempi1->p1.disp;
else
tempi->ic_flags|=ICF_P2_TO_DOUBLE;
}
t=tempi->p2.type&IT_MASK;
t1=tempi1->p1.type&IT_MASK;
if (t1 && t1<t)
t=t1;
t1=tempi1->r.type&IT_MASK;
if (t1 && t1<t)
t=t1;
tempi->p2.type=tempi1->p1.type&TY_MASK+t;
pt=tempi->p2.ptype;
pt1=tempi1->p1.ptype;
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
pt=pt1;
pt1=tempi1->r.ptype;
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
pt=pt1;
tempi->p2.ptype=pt;
tempi->p2.reg=tempi1->p1.reg;
tempi->p2.disp=tempi1->p1.disp;
tempi->ic_flags|=tempi1->ic_flags&ICF_NO_CVT_MASK;
tempi1->ic_opcode=EC_NOP1;
tempi1->ic_data=1;
tempi1->p1.type=TY_NULL+tempi1->p1.type&IT_MASK;
tempi1->r.type=TY_NULL+tempi1->r.type&IT_MASK;
}
}
}
if (tempi->p1.type&TY_MASK==TY_STK) {
tempi1=PrsPop(ps);
if (!inside_return) {
if (tempi1->ic_opcode==EC_MOV ||
tempi1->ic_opcode==EC_REG) {
if (tempi1->ic_flags & ICF_R_TO_INT) {
if (tempi1->p1.type&TY_MASK==TY_IMM)
tempi1->p1.disp=tempi1->p1.disp><(double);
else
tempi->ic_flags|=ICF_P1_TO_INT;
} else if (tempi1->ic_flags&ICF_R_TO_DOUBLE) {
if (tempi1->p1.type&TY_MASK==TY_IMM)
tempi1->p1.disp><(double)=tempi1->p1.disp; //dbgo signed/unsigned
else if (!(tempi->ic_flags&ICF_USE_INT))
tempi->ic_flags|=ICF_P1_TO_DOUBLE;
}
t=tempi->p1.type&IT_MASK;
t1=tempi1->p1.type&IT_MASK;
if (t1 && t1<t)
t=t1;
t1=tempi1->r.type&IT_MASK;
if (t1 && t1<t)
t=t1;
tempi->p1.type=tempi1->p1.type&TY_MASK+t;
pt=tempi->p1.ptype;
pt1=tempi1->p1.ptype;
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
pt=pt1;
pt1=tempi1->r.ptype;
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
pt=pt1;
tempi->p1.ptype=pt;
tempi->p1.reg=tempi1->p1.reg;
tempi->p1.disp=tempi1->p1.disp;
tempi->ic_flags|=tempi1->ic_flags&ICF_NO_CVT_MASK;
tempi1->ic_opcode=EC_NOP1;
tempi1->ic_data=1;
tempi1->p1.type=TY_NULL+tempi1->p1.type&IT_MASK;
tempi1->r.type=TY_NULL+tempi1->r.type&IT_MASK;
}
}
}
if (code==EC_RETURN_START)
inside_return=TRUE;
else if (code==EC_RETURN_END)
inside_return=FALSE;
if (tempi->r.type&TY_MASK==TY_STK)
PrsPush(ps,tempi);
}
tempi+=sizeof(IntermediateCode);
}
OptEnd(lx,4,ps);
}
+267
View File
@@ -0,0 +1,267 @@
BoolU8 CmpOptIc5(LexStruct *lx,IntermediateCode *tempi,BoolU4 inside_return)
{
I8 i;
IntermediateCode *tempil1,*tempil2;
nounusedwarn inside_return;
if (tempi->ic_opcode<EC_IMM) return FALSE;
tempil1=tempi;
if (!(tempil2=OptLag1(lx,tempil1)))
return FALSE;
if (tempil2->ic_opcode==EC_ADD_CONST) {
if (tempil1->ic_opcode==EC_DEREF) {
if (tempil1->ic_flags&ICF_P1_WAS_STK) {
if (tempil1->p1.type&TY_MASK==TY_REG &&
tempil2->p1.type&TY_MASK==TY_REG &&
tempil2->r.type&TY_MASK==TY_REG &&
tempil2->r.reg==tempil1->p1.reg) {
i=tempil2->ic_data;
if (i>=MIN_I4 && i<=MAX_I4 &&
!Bt(&non_ptr_vars_mask,tempil2->p1.reg)) {
tempil1->ic_flags=(tempil1->ic_flags & ~ICF_P1_WAS_STK)|
tempil2->ic_flags;
tempil2->ic_opcode=EC_NOP1;
tempil2->ic_data=1;
tempil2->ic_data=-1;
tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK;
tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK;
tempil1->ic_opcode=EC_MOV;
tempil1->p1.type=TY_DISP+tempil1->p1.ptype;
tempil1->p1.reg=tempil2->p1.reg;
tempil1->p1.disp=i;
return TRUE;
}
}
}
}
}
return FALSE;
}
void CmpOptPass5Lag(LexStruct *lx,
ParseStack *ps,IntermediateCode *tempi,I8 *i_,I8 num_stk,BoolU4 *inside_return,
U8 *trashed_reg_mask_,U8 fun_num)
{
I8 i=*i_;
I8 j,k,l,code;
U8 trashed_reg_mask=*trashed_reg_mask_;
ClassStruct *tempc;
code=tempi->ic_opcode;
if (code<=EC_END_EXP || code==EC_NOP1)
return;
else {
if (tempi->ic_flags&ICF_TRACE) {
if (Bt(&lx->pass_trace_mask,5)) {
PrintF("%2d:",i);
CbPutIc(tempi);
}
}
if (code==EC_CALL_START) {
if (i<num_stk)
k=i;
else
k=num_stk;
j=0;
if (fun_num&1)
for (l=0;l<k;l++)
Bts(&j,to_stk_temps_map_odd[l]);
else
for (l=0;l<k;l++)
Bts(&j,to_stk_temps_map_even[l]);
if (tempc=tempi->ic_data) {
if (Bt(&tempc->flags,Cf_INTERNAL))
j=0;
else {
j&=tempc->trashed_reg_mask;
trashed_reg_mask|=tempc->trashed_reg_mask;
}
}
tempi->ic_data=j;
PrsPush(ps,i);
PrsPush(ps,j);
} else if (code==EC_CALL_END) {
tempi->ic_data=PrsPop(ps);
i=PrsPop(ps);
}
// else if (code==EC_LEAVE)
// i=0;
else if (code==EC_CALL_END2) {
ps->ptr--;
i=PrsPop(ps);
} else if (code==EC_RETURN_START)
*inside_return=TRUE;
else if (code==EC_RETURN_END)
*inside_return=FALSE;
if (cmp_param_cnt[code]==9)
i-=tempi->ic_data>>3;
if (tempi->p3.type&TY_MASK==TY_STK) {
i--;
if (i<num_stk) {
tempi->p3.type=tempi->p3.type&IT_MASK+TY_REG;
if (fun_num&1)
tempi->p3.reg=to_stk_temps_map_odd[i];
else
tempi->p3.reg=to_stk_temps_map_even[i];
}
}
if (tempi->p2.type&TY_MASK==TY_STK) {
i--;
if (i<num_stk) {
tempi->p2.type=tempi->p2.type&IT_MASK+TY_REG;
if (fun_num&1)
tempi->p2.reg=to_stk_temps_map_odd[i];
else
tempi->p2.reg=to_stk_temps_map_even[i];
}
}
if (tempi->p1.type&TY_MASK==TY_STK) {
i--;
if (i<num_stk) {
tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK;
if (fun_num&1)
tempi->p1.reg=to_stk_temps_map_odd[i];
else
tempi->p1.reg=to_stk_temps_map_even[i];
}
}
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&IT_MASK;
if (fun_num&1) {
tempi->r.reg=to_stk_temps_map_odd[i-1];
Bts(&trashed_reg_mask,to_stk_temps_map_odd[i-1]);
} else {
tempi->r.reg=to_stk_temps_map_even[i-1];
Bts(&trashed_reg_mask,to_stk_temps_map_even[i-1]);
}
}
}
while (CmpOptIc5(lx,tempi,*inside_return));
if (tempi->r.type&IT_MASK!=IT_DOUBLE &&
!(tempi->ic_flags&ICF_USE_DOUBLE))
tempi->ic_flags|=ICF_USE_INT;
}
*i_=i;
*trashed_reg_mask_=trashed_reg_mask;
}
void CmpOptPass5(LexStruct *lx,ClassStruct *fun_class)
{
IntermediateCode *tempi,*tempil1,*tempif1,*tempif2,
*temp_lag[4],*old_tempil1=NULL;
BoolU4 inside_return;
ParseStack *ps=OptStart(lx,temp_lag);
I8 code;
I8 i=0,num_stk,trashed_reg_mask=CALWAYS_TRASHED_MASK;
U8 fun_num=0;
if (fun_class)
fun_num=compiled_functions++;
if (Bt(&lx->flags,LFf_NO_REG_VAR) ||
lx->flags&LF_NO_REG_OPT)
num_stk=0;
else
num_stk=num_stk_temps;
tempi=lx->cb.cb_in_ptr;
while (code=tempi->ic_opcode) {
OptNext3(tempi,temp_lag);
tempil1=temp_lag[1];
if (tempil1->ic_opcode==EC_END_EXP) {
if (code!=EC_RETURN_END && code!=EC_NOP) {
if (!(temp_lag[2]->ic_flags&
(ICF_R_TO_DOUBLE|ICF_R_TO_INT|ICF_PUSH_RESULT|ICF_DEPEND_RESULT))) {
temp_lag[2]->ic_flags|=ICF_NO_DEPEND_RESULT;
temp_lag[2]->r.type=TY_NULL+temp_lag[2]->r.type&IT_MASK;
tempil1->ic_flags|=ICF_NO_DEPEND_RESULT;
tempil1->r.type=TY_NULL+tempil1->r.type&IT_MASK;
}
}
}
if (code<=EC_END_EXP || code==EC_NOP1) {
} else {
if (tempi->p3.type&TY_MASK) {
if (tempi->p3.type&TY_MASK==TY_STK) {
if (tempil1->r.type&TY_MASK==TY_STK &&
!(tempil1->ic_flags&ICF_PUSH_RESULT)) {
tempi->p3.type=TY_REG+tempi->p3.type&IT_MASK;
tempi->p3.reg=CREG_RAX;
tempil1->r.type=TY_REG+tempil1->r.type&IT_MASK;
tempil1->r.reg=CREG_RAX;
}
}
} else {
if (tempi->p2.type&TY_MASK==TY_STK) {
if (tempil1->r.type&TY_MASK==TY_STK &&
!(tempil1->ic_flags&ICF_PUSH_RESULT)) {
tempif2=NULL;
if (tempi->ic_opcode==EC_ASSIGN &&
tempi->ic_flags&ICF_NOT_ADDRESS &&
tempil1->ic_opcode!=EC_CALL_END &&
tempil1->ic_opcode!=EC_CALL_END2 &&
tempil1->ic_opcode!=EC_SET_RAX &&
!(tempi->ic_flags&
(ICF_P2_TO_DOUBLE|ICF_P2_TO_INT)) &&
!(tempil1->ic_flags&
(ICF_R_TO_DOUBLE|ICF_R_TO_INT))) {
if (tempif1=OptLead1(lx,tempi)) //predict NO_DEPEND
if (tempif2=OptLead1(lx,tempif1))
if (tempif1->ic_opcode==EC_END_EXP &&
tempif2->ic_opcode!=EC_RETURN_END) {
tempi->ic_opcode=EC_NOP;
tempil1->r.type =tempi->p1.type&TY_MASK+tempi->p1.ptype;
tempil1->r.ptype=tempi->p1.ptype;
tempil1->r.reg =tempi->p1.reg;
tempil1->r.disp =tempi->p1.disp;
tempil1->ic_flags=tempil1->ic_flags&~(ICF_NO_DEPEND_RESULT|ICF_R_WAS_STK)|
tempi->ic_flags&~(ICF_NOT_ADDRESS|ICF_P1_WAS_STK|ICF_P2_WAS_STK)|ICF_DEPEND_RESULT;
old_tempil1=NULL;
} else
tempif2=NULL;
}
if (!tempif2) {
tempi->p2.type=TY_REG+tempi->p2.type&IT_MASK;
tempi->p2.reg=CREG_RAX;
tempil1->r.type=TY_REG+tempil1->r.type&IT_MASK;
tempil1->r.reg=CREG_RAX;
}
}
} else if (tempi->p1.type&TY_MASK==TY_STK) {
if (tempil1->r.type&TY_MASK==TY_STK &&
!(tempil1->ic_flags&ICF_PUSH_RESULT)) {
tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK;
tempi->p1.reg=CREG_RAX;
tempil1->r.type=TY_REG+tempil1->r.type&IT_MASK;
tempil1->r.reg=CREG_RAX;
}
}
}
if (tempi->ic_flags & ICF_PUSH_RESULT)
tempi->r.type==TY_STK+tempi->r.type&IT_MASK;
}
if (old_tempil1!=tempil1) {
CmpOptPass5Lag(lx,ps,tempil1,&i,num_stk,&inside_return,&trashed_reg_mask,fun_num);
old_tempil1=tempil1;
}
tempi+=sizeof(IntermediateCode);
}
OptEnd(lx,5,ps);
if (fun_class) {
fun_class->used_reg_mask&=~CSTK_TEMPS_MASK;
fun_class->used_reg_mask|=trashed_reg_mask;
fun_class->trashed_reg_mask=trashed_reg_mask;
if (Bt(&lx->flags,LFf_OPT_TRACE_PRESENT))
if (Bt(&lx->pass_trace_mask,4)) {
PrintF("Used Reg Mask:%04X\r\n",fun_class->used_reg_mask);
PrintF("Trashed Reg Mask:%04X\r\n",trashed_reg_mask);
}
}
}
File diff suppressed because it is too large. Load diff
+27
View File
@@ -0,0 +1,27 @@
/* To run this, do a directory, right click on
this file's name and select "AutoFile".
Or, type $LK,"AutoFile","MN:AutoFile"$(filename);
See $LK,"AutoFile","FF:::/LT/Doc/OSGlossary.GLZ,AutoFile"$ in the glossary for more info.
This autofile will renumber the defines in
Demo3.TXZ. Test it by numbering a few wrong
and running this demo.
*/
U1 i;
PutS("Edit(\"CmpDefs.HPZ\");\r");
//Go to start of file
Msg(MSG_KEY_DOWN,0,SC_CURSOR_UP|SCF_CTRL);
for (i=0;i<=0x8A;i++) {
PrintF("%c0x%c",6,CH_ESC); //ctrl F
Msg(MSG_KEY_DOWN,0,SC_CURSOR_RIGHT);
Msg(MSG_KEY_DOWN,0,SC_CURSOR_RIGHT);
Msg(MSG_KEY_DOWN,0,SC_CURSOR_RIGHT);
Msg(MSG_KEY_DOWN,0,SC_CURSOR_RIGHT);
Msg(MSG_KEY_DOWN,0,SC_CURSOR_RIGHT);
PrintF("%c%c%c",CH_BACKSPACE,CH_BACKSPACE,CH_BACKSPACE);
PrintF("%03X",i);
Sleep(5);
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff