SparrowOSTS_121127.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:45:28 +02:00
1 parent 0e9364ff4c
commit e57428affb
1218 files changed
+247142 -165507

No files matched your search

File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+693
View File
@@ -0,0 +1,693 @@
asm {
USE64
CMP_OPT_NOP:
#assert CIntermediateCode.ic_opcode==0
DU16 IC_NOP; //Must be at CIntermediateCode.ic_opcode offset
DU8 sizeof(CIntermediateCode)-2 DUP(0);
// ************************************
_OPTNEXT::
ENTER 0
PUSH RDI
MOV RCX,U64 SF_ARG1[RBP]
MOV RDX,U64 SF_ARG2[RBP]
MOV RAX,U64 16[RDX]
MOV U64 24[RDX],RAX
MOV RAX,U64 8[RDX]
MOV U64 16[RDX],RAX
MOV RAX,U64 [RDX]
MOV U64 8[RDX],RAX
MOV U64 [RDX],RCX
MOV RDI,RDX
MOV RAX,RCX
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_END_EXP
JBE @@05
STOSQ
@@05: MOV RAX,U64 8[RDX]
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_END_EXP
JBE @@10
STOSQ
@@10: MOV RAX,U64 16[RDX]
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_END_EXP
JBE @@15
STOSQ
@@15: MOV RAX,U64 24[RDX]
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_END_EXP
JBE @@20
STOSQ
@@20: MOV RAX,CMP_OPT_NOP
ADD RDX,32
JMP @@30
@@25: STOSQ
@@30: CMP RDI,RDX
JB @@25
POP RDI
LEAVE
RET1 16
// ************************************
_OPTNEXT2::
ENTER 0
PUSH RDI
MOV RCX,U64 SF_ARG1[RBP]
MOV RDX,U64 SF_ARG2[RBP]
MOV RAX,U64 16[RDX]
MOV U64 24[RDX],RAX
MOV RAX,U64 8[RDX]
MOV U64 16[RDX],RAX
MOV RAX,U64 [RDX]
MOV U64 8[RDX],RAX
MOV U64 [RDX],RCX
MOV RDI,RDX
MOV RAX,RCX
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_END_EXP
JB @@05
STOSQ
@@05: MOV RAX,U64 8[RDX]
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_END_EXP
JB @@10
STOSQ
@@10: MOV RAX,U64 16[RDX]
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_END_EXP
JB @@15
STOSQ
@@15: MOV RAX,U64 24[RDX]
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_END_EXP
JB @@20
STOSQ
@@20: MOV RAX,CMP_OPT_NOP
ADD RDX,32
JMP @@30
@@25: STOSQ
@@30: CMP RDI,RDX
JB @@25
POP RDI
LEAVE
RET1 16
// ************************************
_OPTNEXT3::
ENTER 0
PUSH RDI
MOV RCX,U64 SF_ARG1[RBP]
MOV RDX,U64 SF_ARG2[RBP]
MOV RAX,U64 16[RDX]
MOV U64 24[RDX],RAX
MOV RAX,U64 8[RDX]
MOV U64 16[RDX],RAX
MOV RAX,U64 [RDX]
MOV U64 8[RDX],RAX
MOV U64 [RDX],RCX
MOV RDI,RDX
MOV RAX,RCX
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_END_EXP
JB @@05
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_NOP1
JE @@05
STOSQ
@@05: MOV RAX,U64 8[RDX]
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_END_EXP
JB @@10
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_NOP1
JE @@10
STOSQ
@@10: MOV RAX,U64 16[RDX]
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_END_EXP
JB @@15
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_NOP1
JE @@15
STOSQ
@@15: MOV RAX,U64 24[RDX]
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_END_EXP
JB @@20
CMP U16 CIntermediateCode.ic_opcode[RAX],IC_NOP1
JE @@20
STOSQ
@@20: MOV RAX,CMP_OPT_NOP
ADD RDX,32
JMP @@30
@@25: STOSQ
@@30: CMP RDI,RDX
JB @@25
POP RDI
LEAVE
RET1 16
// ************************************
CMP_TEMPLATES::
DU32 @@05,@@10,@@15,@@25,@@30,
@@35,@@40,@@45,@@55,@@60,
@@75,@@80,@@85,@@90,@@95,
@@100,@@105,@@110,@@115,@@125,
@@135;
@@05: //INC
PUSH RAX
FLD1
FADD ST0,U64 [RSP]
FSTP U64 [RSP]
POP RAX
@@10: //DEC
PUSH RAX
FLD1
FSUBR ST0,U64 [RSP]
FSTP U64 [RSP]
POP RAX
@@15: //MOD
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U64 [RBX]
FLD U64 8[RBX]
@@20: FPREM
FSTSW
TEST AX,0x400
JNZ @@20
FSTP U64 [RBX]
FFREE ST0
FINCSTP
POP RAX
ADD RSP,8
@@25: //LESS
PUSH RDX
PUSH RAX
FLD U64 [RSP]
FLD U64 8[RSP]
FCOMIP ST0,ST1
MOV RAX,0
ADC RAX,0
FFREE ST0
FINCSTP
ADD RSP,16
@@30: //GREATER
PUSH RDX
PUSH RAX
FLD U64 8[RSP]
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,0
ADC RAX,0
FFREE ST0
FINCSTP
ADD RSP,16
@@35: //LESS_EQUAL
PUSH RDX
PUSH RAX
FLD U64 8[RSP]
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,1
SBB RAX,0
FFREE ST0
FINCSTP
ADD RSP,16
@@40: //GREATER_EQUAL
PUSH RDX
PUSH RAX
FLD U64 [RSP]
FLD U64 8[RSP]
FCOMIP ST0,ST1
MOV RAX,1
SBB RAX,0
FFREE ST0
FINCSTP
ADD RSP,16
@@45: //StrLen
MOV RDX,RAX
@@50: MOV BL,U8 [RAX]
INC RAX
OR BL,BL
JNZ @@50
SUB RAX,RDX
DEC RAX
@@55: //RDTSC
RDTSC
SHL RDX,32
ADD RAX,RDX
@@60: //SignI64
OR RAX,RAX
JZ @@70
JS @@65
MOV RAX,1
JMP @@70
@@65: MOV RAX,-1
@@70:
@@75:
@@80:
@@85:
MOV EAX,HPET_MAIN_CNT
MOV RAX,U64 [RAX]
@@90: //Sqr
PUSH RAX
FLD U64 [RSP]
FMUL ST0,ST0
FSTP U64 [RSP]
POP RAX
@@95: //Abs
PUSH RAX
FLD U64 [RSP]
FABS
FSTP U64 [RSP]
POP RAX
@@100: //Sqrt
PUSH RAX
FLD U64 [RSP]
FSQRT
FSTP U64 [RSP]
POP RAX
@@105: //Sin
PUSH RAX
FLD U64 [RSP]
FSIN
FSTP U64 [RSP]
POP RAX
@@110: //Cos
PUSH RAX
FLD U64 [RSP]
FCOS
FSTP U64 [RSP]
POP RAX
@@115: //Tan
PUSH RAX
FLD U64 [RSP]
@@120: FPTAN
FSTSW
TEST AX,0x400
JNZ @@120
FFREE ST0
FINCSTP
FSTP U64 [RSP]
POP RAX
@@125: //Atan
PUSH RAX
FLD U64 [RSP]
FLD1
@@130: FPATAN
FSTSW
TEST AX,0x400
JNZ @@130
FSTP U64 [RSP]
POP RAX
@@135:
// ************************************
CMP_TEMPLATES_DONT_POP::
DU32 @@05,@@10,@@15,@@20,@@25,
@@30,@@35,@@40,@@45,@@50,
@@55,@@60,@@65,@@70,@@75,
@@80,@@85,@@90,@@95,@@105,
@@115;
@@05: //INC
PUSH RAX
FLD1
FADD ST0,U64 [RSP]
FST U64 [RSP]
POP RAX
@@10: //DEC
PUSH RAX
FLD1
FSUBR ST0,U64 [RSP]
FST U64 [RSP]
POP RAX
@@15:
@@20:
@@25:
@@30:
@@35:
@@40:
@@45:
@@50:
@@55:
@@60:
PUSH RAX
FLD U64 [RSP]
ADD RSP,8
@@65:
@@70: //Sqr
PUSH RAX
FLD U64 [RSP]
FMUL ST0,ST0
ADD RSP,8
@@75: //Abs
PUSH RAX
FLD U64 [RSP]
FABS
ADD RSP,8
@@80: //Sqrt
PUSH RAX
FLD U64 [RSP]
FSQRT
ADD RSP,8
@@85: //Sin
PUSH RAX
FLD U64 [RSP]
FSIN
ADD RSP,8
@@90: //Cos
PUSH RAX
FLD U64 [RSP]
FCOS
ADD RSP,8
@@95: //Tan
PUSH RAX
FLD U64 [RSP]
@@100: FPTAN
FSTSW
TEST AX,0x400
JNZ @@100
FFREE ST0
FINCSTP
ADD RSP,8
@@105: //Atan
PUSH RAX
FLD U64 [RSP]
FLD1
@@110: FPATAN
FSTSW
TEST AX,0x400
JNZ @@110
ADD RSP,8
@@115:
// ************************************
CMP_TEMPLATES_DONT_PUSH::
DU32 @@05,@@10,@@15,@@20,@@30,
@@35,@@40,@@50,@@55,@@60,
@@65,@@70,@@75,@@80,@@85,
@@90,@@95,@@100,@@105,@@115,
@@125;
@@05: //INC
SUB RSP,8
FLD1
FADDP ST1,ST0
FSTP U64 [RSP]
POP RAX
@@10: //DEC
SUB RSP,8
FLD1
FSUBP ST1,ST0
FSTP U64 [RSP]
POP RAX
@@15:
@@20: //LESS
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,0
JZ @@25
MOV RAX,1
SBB RAX,0
@@25: FFREE ST0
FINCSTP
ADD RSP,8
@@30: //GREATER
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,0
ADC RAX,0
FFREE ST0
FINCSTP
ADD RSP,8
@@35: //LESS_EQUAL
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,1
SBB RAX,0
FFREE ST0
FINCSTP
ADD RSP,8
@@40: //GREATER_EQUAL
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,1
JZ @@45
MOV RAX,0
ADC RAX,0
@@45: FFREE ST0
FINCSTP
ADD RSP,8
@@50:
@@55:
@@60:
@@65: //FSTP
SUB RSP,8
FSTP U64 [RSP]
POP RAX
@@70:
@@75:
@@80: //Sqr
SUB RSP,8
FMUL ST0,ST0
FSTP U64 [RSP]
POP RAX
@@85: //Abs
SUB RSP,8
FABS
FSTP U64 [RSP]
POP RAX
@@90: //Sqrt
SUB RSP,8
FSQRT
FSTP U64 [RSP]
POP RAX
@@95: //Sin
SUB RSP,8
FSIN
FSTP U64 [RSP]
POP RAX
@@100: //Cos
SUB RSP,8
FCOS
FSTP U64 [RSP]
POP RAX
@@105: //Tan
SUB RSP,8
@@110: FPTAN
FSTSW
TEST AX,0x400
JNZ @@110
FFREE ST0
FINCSTP
FSTP U64 [RSP]
POP RAX
@@115: //Atan
SUB RSP,8
FLD1
@@120: FPATAN
FSTSW
TEST AX,0x400
JNZ @@120
FSTP U64 [RSP]
POP RAX
@@125:
// ************************************
CMP_TEMPLATES_DONT_PUSH_POP::
DU32 @@05,@@10,@@15,@@20,@@25,
@@30,@@35,@@40,@@45,@@50,
@@55,@@60,@@65,@@70,@@75,
@@80,@@85,@@90,@@95,@@100,
@@110;
@@05: //INC
SUB RSP,8
FLD1
FADDP ST1,ST0
FST U64 [RSP]
POP RAX
@@10: //DEC
SUB RSP,8
FLD1
FSUBP ST1,ST0
FST U64 [RSP]
POP RAX
@@15:
@@20:
@@25:
@@30:
@@35:
@@40:
@@45:
@@50:
@@55:
@@60:
@@65:
@@70: //Sqr
FMUL ST0,ST0
@@75: //Abs
FABS
@@80: //Sqrt
FSQRT
@@85: //Sin
FSIN
@@90: //Cos
FCOS
@@95: //Tan
FPTAN
FSTSW
TEST AX,0x400
JNZ @@95
FFREE ST0
FINCSTP
@@100: //Atan
FLD1
@@105: FPATAN
FSTSW
TEST AX,0x400
JNZ @@105
@@110:
// ************************************
CMP_TEMPLATES_DONT_PUSH2::
DU32 @@05,@@10,@@15,@@20,@@25,
@@35,@@45,@@50,@@55,@@60,
@@65,@@70,@@75,@@80,@@85,
@@90,@@95,@@100,@@105,@@110,
@@115;
@@05:
@@10:
@@15:
@@20: //LESS
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,0
ADC RAX,0
FFREE ST0
FINCSTP
ADD RSP,8
@@25: //GREATER
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,0
JZ @@30
MOV RAX,1
SBB RAX,0
@@30: FFREE ST0
FINCSTP
ADD RSP,8
@@35: //LESS_EQUAL
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,1
JZ @@40
MOV RAX,0
ADC RAX,0
@@40: FFREE ST0
FINCSTP
ADD RSP,8
@@45: //GREATER_EQUAL
PUSH RAX
FLD U64 [RSP]
FCOMIP ST0,ST1
MOV RAX,1
SBB RAX,0
FFREE ST0
FINCSTP
ADD RSP,8
@@50:
@@55:
@@60:
@@65:
@@70:
@@75:
@@80:
@@85:
@@90:
@@95:
@@100:
@@105:
@@110:
@@115:
}
_extern _OPTNEXT Bool OptNext(CIntermediateCode *tempi,
CIntermediateCode **temp_lag);
_extern _OPTNEXT2 Bool OptNext2(CIntermediateCode *tempi,
CIntermediateCode **temp_lag);
_extern _OPTNEXT3 Bool OptNext3(CIntermediateCode *tempi,
CIntermediateCode **temp_lag);
+399
View File
@@ -0,0 +1,399 @@
//Intermediate compiler codes
#define IC_END 0x00
#define IC_START 0x01
#define IC_NOP 0x02
#define IC_END_EXP 0x03
#define IC_NOP1 0x04
#define IC_LABEL 0x05
#define IC_CALL_START 0x06
#define IC_CALL_END 0x07
#define IC_CALL_END2 0x08
#define IC_RETURN_VAL 0x09
#define IC_RETURN_VAL2 0x0A
#define IC_IMM 0x0B
#define IC_F64 0x0C
#define IC_STR_CONST 0x0D
#define IC_ABS_ADDR 0x0E
#define IC_ADDR_IMPORT 0x0F
#define IC_HEAP_GLBL 0x10
#define IC_SIZEOF 0x11
#define IC_TYPE 0x12
#define IC_GET_LABEL 0x13
#define IC_RBP 0x14
#define IC_REG 0x15
#define IC_FS 0x16
#define IC_MOV_FS 0x17
#define IC_GS 0x18
#define IC_MOV_GS 0x19
#define IC_LEA 0x1A
#define IC_MOV 0x1B
#define IC_TO_I64 0x1C
#define IC_TO_F64 0x1D
#define IC_TO_BOOL 0x1E
#define IC_TOUPPER 0x1F
#define IC_NATIVE_TYPECAST 0x20
#define IC_ADDR 0x21
#define IC_COM 0x22
#define IC_NOT 0x23
#define IC_UNARY_MINUS 0x24
#define IC_DEREF 0x25
#define IC_DEREF_PP 0x26
#define IC_DEREF_MM 0x27
#define IC__PP 0x28
#define IC__MM 0x29
#define IC_PP_ 0x2A
#define IC_MM_ 0x2B
#define IC_SHL 0x2C
#define IC_SHR 0x2D
#define IC_SHL_CONST 0x2E
#define IC_SHR_CONST 0x2F
#define IC_POWER 0x30
#define IC_MUL 0x31
#define IC_DIV 0x32
#define IC_MOD 0x33
#define IC_AND 0x34
#define IC_OR 0x35
#define IC_XOR 0x36
#define IC_ADD 0x37
#define IC_SUB 0x38
#define IC_ADD_CONST 0x39
#define IC_SUB_CONST 0x3A
#define IC_EQUAL_EQUAL 0x3B
#define IC_NOT_EQUAL 0x3C
#define IC_LESS 0x3D
#define IC_GREATER 0x3E
#define IC_LESS_EQUAL 0x3F
#define IC_GREATER_EQUAL 0x40
#define IC_PUSH_CMP 0x41
#define IC_AND_AND 0x42
#define IC_OR_OR 0x43
#define IC_XOR_XOR 0x44
#define IC_COLON 0x45
#define IC_QUESTION 0x46
#define IC_ASSIGN 0x47
#define IC_ASSIGN_PP 0x48
#define IC_ASSIGN_MM 0x49
#define IC_SHL_EQUAL 0x4A
#define IC_SHR_EQUAL 0x4B
#define IC_MUL_EQUAL 0x4C
#define IC_DIV_EQUAL 0x4D
#define IC_MOD_EQUAL 0x4E
#define IC_AND_EQUAL 0x4F
#define IC_OR_EQUAL 0x50
#define IC_XOR_EQUAL 0x51
#define IC_ADD_EQUAL 0x52
#define IC_SUB_EQUAL 0x53
#define IC_JMP 0x54
#define IC_SWITCH 0x55
#define IC_NOBOUND_SWITCH 0x56
#define IC_ADD_RSP 0x57
#define IC_ADD_RSP1 0x58
#define IC_ENTER 0x59
#define IC_PUSH_REGS 0x5A
#define IC_POP_REGS 0x5B
#define IC_LEAVE 0x5C
#define IC_RET 0x5D
#define IC_CALL 0x5E
#define IC_CALL_INDIRECT 0x5F
#define IC_CALL_INDIRECT2 0x60
#define IC_CALL_IMPORT 0x61
#define IC_CALL_EXTERN 0x62
#define IC_IRQ 0x63
#define IC_ASM 0x64
#define IC_CLI 0x65
#define IC_STI 0x66
#define IC_PREEMPT 0x67
#define IC_CLD 0x68
#define IC_STD 0x69
#define IC_HLT 0x6A
#define IC_PUSH 0x6B
#define IC_POP 0x6C
#define IC_PUSHFD 0x6D
#define IC_POPFD 0x6E
#define IC_PAUSE 0x6F
#define IC_CLFLUSH 0x70
#define IC_INVLPG 0x71
#define IC_INU8 0x72
#define IC_INU16 0x73
#define IC_INU32 0x74
#define IC_OUTU8 0x75
#define IC_OUTU16 0x76
#define IC_OUTU32 0x77
#define IC_GET_FLAGS 0x78
#define IC_SET_FLAGS 0x79
#define IC_GET_RAX 0x7A
#define IC_SET_RAX 0x7B
#define IC_GET_BASE_PTR 0x7C
#define IC_SET_BASE_PTR 0x7D
#define IC_GET_STK_PTR 0x7E
#define IC_SET_STK_PTR 0x7F
#define IC_RIP 0x80
#define IC_RDTSC 0x81
#define IC_HPET 0x82
#define IC_BT 0x83
#define IC_BTS 0x84
#define IC_BTR 0x85
#define IC_BTC 0x86
#define IC_BEQU 0x87
#define IC_LBTS 0x88
#define IC_LBTR 0x89
#define IC_LBTC 0x8A
#define IC_LBEQU 0x8B
#define IC_BSF 0x8C
#define IC_BSR 0x8D
#define IC_QUE_INIT 0x8E
#define IC_QUE_INS 0x8F
#define IC_QUE_INS_REV 0x90
#define IC_QUE_REM 0x91
#define IC_STRLEN 0x92
#define IC_MEMCPY 0x93
#define IC_MEMSET 0x94
#define IC_MEMSET_U16 0x95
#define IC_MEMSET_U32 0x96
#define IC_MEMSET_U64 0x97
#define IC_BR_ZERO 0x98
#define IC_BR_NOT_ZERO 0x99
#define IC_BR_NOT_EQUAL 0x9A
#define IC_BR_EQUAL_EQUAL 0x9B
#define IC_BR_GREATER_EQUAL 0x9C
#define IC_BR_LESS_EQUAL 0x9D
#define IC_BR_GREATER 0x9E
#define IC_BR_LESS 0x9F
#define IC_BR_NOT_EQUAL2 0xA0
#define IC_BR_EQUAL_EQUAL2 0xA1
#define IC_BR_GREATER_EQUAL2 0xA2
#define IC_BR_LESS_EQUAL2 0xA3
#define IC_BR_GREATER2 0xA4
#define IC_BR_LESS2 0xA5
#define IC_BR_AND_ZERO 0xA6
#define IC_BR_AND_NOT_ZERO 0xA7
#define IC_BR_MM_ZERO 0xA8
#define IC_BR_MM_NOT_ZERO 0xA9
#define IC_BR_AND_AND_ZERO 0xAA
#define IC_BR_AND_AND_NOT_ZERO 0xAB
#define IC_BR_OR_OR_ZERO 0xAC
#define IC_BR_OR_OR_NOT_ZERO 0xAD
#define IC_BR_BT 0xAE
#define IC_BR_BTS 0xAF
#define IC_BR_BTR 0xB0
#define IC_BR_BTC 0xB1
#define IC_BR_LBTS 0xB2
#define IC_BR_LBTR 0xB3
#define IC_BR_LBTC 0xB4
#define IC_BR_NOT_BT 0xB5
#define IC_BR_NOT_BTS 0xB6
#define IC_BR_NOT_BTR 0xB7
#define IC_BR_NOT_BTC 0xB8
#define IC_BR_NOT_LBTS 0xB9
#define IC_BR_NOT_LBTR 0xBA
#define IC_BR_NOT_LBTC 0xBB
#define IC_SWAP_U8 0xBC
#define IC_SWAP_U16 0xBD
#define IC_SWAP_U32 0xBE
#define IC_SWAP_U64 0xBF
#define IC_ABS_I64 0xC0
#define IC_SIGN_I64 0xC1
#define IC_MIN_I64 0xC2
#define IC_MIN_U64 0xC3
#define IC_MAX_I64 0xC4
#define IC_MAX_U64 0xC5
#define IC_LIMIT_I64 0xC6
#define IC_LIMIT_U64 0xC7
#define IC_MOD_U64 0xC8
#define IC_SQR_I64 0xC9
#define IC_SQR_U64 0xCA
#define IC_SQR 0xCB
#define IC_ABS 0xCC
#define IC_SQRT 0xCD
#define IC_SIN 0xCE
#define IC_COS 0xCF
#define IC_TAN 0xD0
#define IC_ATAN 0xD1
#define IC_NUM_ENTRIES 0xD2
//Don't forget $LK,"IC_INIT_TABLE","FA:::/SparrowOS/Compiler/CmpInit.CPP.Z,IC_INIT_TABLE"$
#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__EXTERN 11
#define KW_RETURN 12
#define KW_SIZEOF 13
#define KW__INTERN 14
#define KW_DO 15
#define KW_ASM 16
#define KW_GOTO 17
#define KW_EXE 18
#define KW_BREAK 19
#define KW_SWITCH 20
#define KW_NOBOUND_SWITCH 21
#define KW_CASE 22
#define KW_DFT 23
#define KW_PUBLIC 24
#define KW_OFFSET 25
#define KW_IMPORT 26
#define KW__IMPORT 27
#define KW_IFDEF 28
#define KW_IFNDEF 29
#define KW_IFSTATIC 30
#define KW_IFNSTATIC 31
#define KW_ENDIF 32
#define KW_ASSERT 33
#define KW_REG 34
#define KW_NOREG 35
#define KW_NOUNUSEDWARN 36
#define KW_HELP_INDEX 37
#define KW_HELP_FILE 38
#define KW_STATIC 39
#define KW_INTERRUPT 40
#define KW_LOCK 41
#define KW_DEFINED 42
#define KW_ARGPOP 43
#define KW_NOARGPOP 44
#define AKW_ALIGN 64
#define AKW_I0 65
#define AKW_I8 66
#define AKW_I16 67
#define AKW_I32 68
#define AKW_I64 69
#define AKW_U0 70
#define AKW_U8 71
#define AKW_U16 72
#define AKW_U32 73
#define AKW_U64 74
#define AKW_F64 75
#define AKW_DU8 76
#define AKW_DU16 77
#define AKW_DU32 78
#define AKW_DU64 79
#define AKW_DUP 80
#define AKW_USE16 81
#define AKW_USE32 82
#define AKW_USE64 83
#define AKW_IMPORT 84
#define AKW_LIST 85
#define AKW_NOLIST 86
#define KW_NUM_KEYWORDS 87
#define CMP_TEMPLATE_INC 0x00
#define CMP_TEMPLATE_DEC 0x01
#define CMP_TEMPLATE_MOD 0x02
#define CMP_TEMPLATE_LESS 0x03
#define CMP_TEMPLATE_GREATER 0x04
#define CMP_TEMPLATE_LESS_EQUAL 0x05
#define CMP_TEMPLATE_GREATER_EQUAL 0x06
#define CMP_TEMPLATE_STRLEN 0x07
#define CMP_TEMPLATE_RDTSC 0x08
#define CMP_TEMPLATE_SIGN_I64 0x09
#define CMP_TEMPLATE_FSTP 0x0A
#define CMP_TEMPLATE_FLD 0x0B
#define CMP_TEMPLATE_HPET 0x0C
#define CMP_TEMPLATE_SQR 0x0D
#define CMP_TEMPLATE_ABS 0x0E
#define CMP_TEMPLATE_SQRT 0x0F
#define CMP_TEMPLATE_SIN 0x10
#define CMP_TEMPLATE_COS 0x11
#define CMP_TEMPLATE_TAN 0x12
#define CMP_TEMPLATE_ATAN 0x13
#define ASSOCF_LEFT 1
#define ASSOCF_RIGHT 2
#define ASSOC_MASK 3
#define PREC_NULL 0x00
#define PREC_TERM 0x04
#define PREC_UNARY_POST 0x08
#define PREC_UNARY_PRE 0x0C
#define PREC_EXP 0x10
#define PREC_MUL 0x14
#define PREC_AND 0x18
#define PREC_XOR 0x1C
#define PREC_OR 0x20
#define PREC_ADD 0x24
#define PREC_CMP 0x28
#define PREC_CMP2 0x2C
#define PREC_AND_AND 0x30
#define PREC_XOR_XOR 0x34
#define PREC_OR_OR 0x38
#define PREC_QUEST 0x3C
#define PREC_ASSIGN 0x40
#define PREC_MAX 0x44
#define CPS_IS_PUBLIC 1
#define CPS_IS_INTERRUPT 2
#define CPS_IS_ASM 4
#define CPS_IS_STATIC 8
#define CPS_IS_ARGPOP 16
#define CPS_IS_NOARGPOP 32
#define CPS_FUN_FLAGS (CPS_IS_INTERRUPT|CPS_IS_PUBLIC|CPS_IS_ARGPOP|CPS_IS_NOARGPOP)
//Byte 0
#define PRS0_NULL 0x000000
#define PRS0__EXTERN 0x000001
#define PRS0__INTERN 0x000002
#define PRS0__IMPORT 0x000003
#define PRS0_EXTERN 0x000004
#define PRS0_IMPORT 0x000005
#define PRS0_TYPECAST 0x000006
//Byte 1
#define PRS1B_NULL 0
#define PRS1_NULL 0x000000
#define PRS1B_LOCAL_VAR 1
#define PRS1_LOCAL_VAR 0x000100
#define PRS1B_FUN_ARG 2
#define PRS1_FUN_ARG 0x000200
#define PRS1B_CLASS 3
#define PRS1_CLASS 0x000300
#define PRS1B_STATIC_LOCAL_VAR 4
#define PRS1_STATIC_LOCAL_VAR 0x000400
#define PRSF_UNION 0x010000
class COptReg
{
I64 offset;
CMemberList *m;
};
+54
View File
@@ -0,0 +1,54 @@
import Bool PutSrcLink(U8 *add,I64 cnt=1,U8 *buf=NULL);
import CDoc *DocRead(U8 *name,I64 flags=0);
import U0 DocLoad(CDoc *doc,U8 *src2,I64 size);
import U0 DocWrite(CDoc *doc,Bool prompt=FALSE);
import CDoc *DocNew(CTask *task=NULL);
import U0 DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL);
import U0 DocDel(CDoc *doc);
import U0 DocRst(CDoc *doc,Bool is_old);
import CDocEntry *DocPutLine(CDocEntry *doc_e);
import I64 DocSize(CDoc *doc);
import U8 *Doc2PlainText(CDoc *doc,CDocEntry *doc_e);
import U0 HashRep(CHashTable *h=NULL,
I64 mask=HTG_ALL,U8 *outname=NULL,U8 *flags=NULL,U8 mapfile_drv=0,U8 *index=NULL,
CDoc *_doc=NULL);
extern I64 Expression(CLex *lx);
extern Bool GetExpression(CLex *lx,U8 **_ex);
extern I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberList **_local_var,CArrayDim **_tempad,
I64 *max_prec,I64 *unary_pre_prec,I64 *paren_prec);
extern I64 PrsUnaryModifier(CLex *lx,CPrsStk *ps,CMemberList **_local_var,CArrayDim **_tempad,I64 *unary_post_prec);
extern U0 PrsDereference(CLex *lx);
extern U0 LexExcept(CLex *lx,U8 *name=NULL,CHashFun *fun_class=NULL);
extern CExe *CmpJoin(CLex *lx,CHashFun *locals,Bool first_lex,Bool asm_blk=FALSE,U8 *map_name=NULL,U8 mapfile_drv=0);
extern U0 CmpFixUpJITAsm(CLex *lx,CExe *ex,I64 ip2);
extern U0 CmpFixUpStaticAsm(CLex *lx,CExe *ex,I64 ip2);
extern CHashClass *PrsClass(CLex *lx,Bool is_union,I64 cps_flags,Bool is_extern);
extern CHashClass *PrsType(CLex *lx,CHashClass **tempc1,
I64 *_mode,CMemberList *tempm,U8 **_ident,CHashFun **_fun_ptr,
CHashExport **_tempess,CArrayDim *tempad,I64 cps_flags);
extern U0 PrsVarInit2(CLex *lx,U8 **_dst,CHashClass *tempc,CArrayDim *tempad,U8 *data_addr_ip,U8 **_base,Bool data_heap,I64 pass);
extern CHashFun *PrsFunJoin(CLex *lx,
CHashClass *temp_return,U8 *name,I64 cps_flags);
extern Bool PrsStatement(CLex *lx,CHashFun *locals,I64 try_cnt=0,
CCodeBlkMisc *lb_break=NULL,Bool saved_prs_semicolon=TRUE,Bool if_else=FALSE);
extern CIntermediateCode *OptLag1(CIntermediateCode *tempi);
extern CIntermediateCode *OptPass012(CLex *lx,CHashFun *fun_class,Bool combined);
extern U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets);
extern U0 OptPass4(CLex *lx,COptReg *register_offsets,I64 *_type);
extern U0 OptPass5(CLex *lx);
extern U0 OptPass6(CLex *lx,CHashFun *fun_class);
extern I64 OptPass789A(CLex *lx,CHashFun *fun_class,COptReg *register_offsets,U8 *buf,CDbgInfo **_dbg);
extern I64 PrsKeyWord(CLex *lx);
extern I64 HashEntrySize2(CHashSrcSym *temph);
extern U0 LexPutWarn(CLex *lx,U8 *name=NULL,CHashFun *fun_class=NULL);
extern CHashSrcSym *HashEntryImportCopy(CHashSrcSym *temph);
extern U0 HashTableImport(CHashTable *src,CHashTable *dst);
_extern CMP_TEMPLATES U32 cmp_templates[1];
_extern CMP_TEMPLATES_DONT_POP U32 cmp_templates_dont_pop[1];
_extern CMP_TEMPLATES_DONT_PUSH U32 cmp_templates_dont_push[1];
_extern CMP_TEMPLATES_DONT_PUSH_POP U32 cmp_templates_dont_push_pop[1];
_extern CMP_TEMPLATES_DONT_PUSH2 U32 cmp_templates_dont_push2[1];
+20
View File
@@ -0,0 +1,20 @@
CHashTable *asm_hash;
Bool is_first_compiler,cmp_do_not_write_to_dsk;
CHashClass *sys_internal_types[IT_NUM_IT];
U32 *dual_U16_tokens1,*dual_U16_tokens2,*dual_U16_tokens3;
U32 *binary_ops_table,*unary_ops_table;
U8 *cmp_arg_cnt,*cmp_result_cnt;
U8 *deref_bitmap,*assign_bitmap,*not_constant_bitmap,*cmp_bitmap,*fpop_bitmap;
I64 num_stk_temps,num_reg_vars,num_non_ptr_vars;
I64 stk_temps_mask,reg_vars_mask,non_ptr_vars_mask;
U8 *to_stk_temps_map_odd;
U8 *to_stk_temps_map_even;
U8 *to_reg_vars_map,*to_non_ptr_vars_map;
I64 compiled_lines,compiled_funs,compiled_bytes;
//Unassembler
CInstruction **unasm_table;
I64 unasm_table_entries;
I64 uasm_ins64_mask,uasm_signed_arg_mask,uasm_mem_mask;
+740
View File
@@ -0,0 +1,740 @@
#define NUM_INTERNAL_TYPES 16
class CInternalType
{
U8 type,size,name[8];
};
CInternalType internal_types_table[NUM_INTERNAL_TYPES]={
{IT_I0,0,"I0i"},
{IT_U0,0,"U0i"},
{IT_I0,0,"I0"},
{IT_U0,0,"U0"},
{IT_I8,1,"I8i"},
{IT_I8,1,"I8"},
{IT_U8,1,"U8i"},
{IT_U8,1,"U8"},
{IT_I16,2,"I16i"},
{IT_U16,2,"U16i"},
{IT_I32,4,"I32i"},
{IT_U32,4,"U32i"},
{IT_I64,8,"I64i"},
{IT_U64,8,"U64i"},
{IT_F64,8,"F64i"},
{IT_F64,8,"F64"},
};
U0 AsmPrsInsFlags(CLex *lx,CInstruction *tempi)
{
I64 i;
while (TRUE) {
switch (lx->token) {
case TK_IDENT:
if ((i=DefineMatch(lx->ident,"ST_OPCODE_MODIFIERS"))>=0) {
tempi->opcode_modifier=i;
break;
} else
return;
case TK_INTEGER:
if (lx->cur_i==16)
tempi->flags|=IEF_OP_SIZE16;
else if (lx->cur_i==32)
tempi->flags|=IEF_OP_SIZE32;
else
return;
break;
case '+':
tempi->flags|=IEF_PLUS_OPCODE;
case '/':
if (Lex(lx)==TK_INTEGER && lx->cur_i<8)
tempi->slash_val=lx->cur_i;
else if (lx->token==TK_IDENT) {
if (!StrCmp(lx->ident,"R"))
tempi->slash_val=SV_R_REGISTER;
else if (!StrCmp(lx->ident,"I"))
tempi->slash_val=SV_I_REGISTER;
else
return;
} else
return;
break;
case '!': tempi->flags|=IEF_DONT_SWITCH_MODES; break;
case '&': tempi->flags|=IEF_DFT; break;
case ':': tempi->flags|=IEF_STI; break;
case '-': tempi->flags|=IEF_NO_REX; break;
case '~': tempi->flags|=IEF_40_REX; break;
case '=': tempi->flags|=IEF_48_REX; break;
case '`': tempi->flags|=IEF_REX_ONLY_R8_R15; break;
case '^': tempi->flags|=IEF_REX_XOR_LIKE; break;
case '$$': tempi->flags|=IEF_ENDING_ZERO; break;
default:
return;
}
Lex(lx);
}
}
U0 AsmHashLoad(Bool first)
{
I64 i,j,size,size1;
CInternalType *tempit;
CLex *lx;
CHashGeneric *temph;
CHashReg *tempr;
CHashOpcode *tempo,*tempo1;
CInstruction *tempi;
CHashClass *tempc;
asm_hash=HashTableNew(2048);
size1=offset(CHashOpcode.ins)+sizeof(CInstruction)<<5;
tempo=MAlloc(size1);
lx=LexNew(TextFileRead("OpCodes.TXT.Z"),0,StrNew("OpCodes.TXT.Z"));
lx->hash_table_list=NULL;
Lex(lx);
while (lx->token) {
if (lx->token!=TK_IDENT)
LexExcept(lx,"ST_EXPECTING_IDENTIFIER");
i=ListEntryMatch(lx->ident,"R8\0R16\0R32\0R64\0SEG\0FSTK\0MM\0XMM\0OPCODE\0KEYWORD\0ASM_KEYWORD\0");
if (i<0)
LexExcept(lx,"Unknown Statement");
Lex(lx); //skip keyword
if (lx->token!=TK_IDENT)
LexExcept(lx,"ST_EXPECTING_IDENTIFIER");
switch (i) {
case 8: //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->slash_val=SV_NONE; //Not zero!!
while (lx->token==TK_INTEGER) {
tempi->opcode[tempi->opcode_cnt++]=lx->cur_i;
Lex(lx);
}
if (lx->token==',')
Lex(lx);
else if (lx->token!=';')
LexExcept(lx,"ST_EXPECTING_COMMA");
AsmPrsInsFlags(lx,tempi);
tempi->arg1=0;
tempi->arg2=0;
if (lx->token==TK_IDENT) {
j=DefineMatch(lx->ident,"ST_ARG_TYPES");
tempi->arg1=j;
if (ARGT_REL8<=j<=ARGT_REL32 ||
ARGT_MOFFS8<=j<=ARGT_MOFFS64)
tempi|=IEF_NO_REX;
if (Lex(lx)==TK_IDENT) {
j=DefineMatch(lx->ident,"ST_ARG_TYPES");
Lex(lx);
tempi->arg2=j;
if (ARGT_REL8<=j<=ARGT_REL32 ||
ARGT_MOFFS8<=j<=ARGT_MOFFS64)
tempi|=IEF_NO_REX;
}
}
}
size=offset(CHashOpcode.ins)+
sizeof(CInstruction)*tempo->instruction_entry_cnt;
tempo1=MAlloc(size);
MemCpy(tempo1,tempo,size);
tempo1->use_cnt=0;
if (HashFind(tempo1->str,asm_hash,HTT_OPCODE))
LexExcept(lx,"ST_DUP_OPCODE_ENTRY");
HashAdd(tempo1,asm_hash);
break;
case 9: //KEYWORD
case 10: //ASM_KEYWORD
temph=CAlloc(sizeof(CHashGeneric));
temph->str=lx->ident;
lx->ident=NULL;
Lex(lx); //skip keyword name
if (lx->token!=TK_INTEGER)
LexExcept(lx,"ST_EXPECTING_INTEGER");
temph->user_data0=lx->cur_i;
if (i==9) {//KEYWORD
temph->type=HTT_KEYWORD;
HashAdd(temph,asm_hash);
if (first) {
temph=MAllocIdentical(temph);
HashAdd(temph,adam_task->hash_table);
}
} else {
temph->type=HTT_ASM_KEYWORD;
HashAdd(temph,asm_hash);
}
Lex(lx); //Skip INT
break;
case REGT_R8:
case REGT_R16:
case REGT_R32:
case REGT_R64:
case REGT_SEG:
case REGT_FSTK:
case REGT_MM:
case REGT_XMM:
tempr=CAlloc(sizeof(CHashReg));
tempr->str=lx->ident;
lx->ident=NULL;
Lex(lx); //skip keyword name
if (lx->token!=TK_INTEGER)
LexExcept(lx,"ST_EXPECTING_INTEGER");
tempr->type=HTT_REG;
tempr->reg_type=i;
tempr->reg_num=lx->cur_i;
HashAdd(tempr,asm_hash);
Lex(lx); //Skip INT
break;
}
if (lx->token!=';')
LexExcept(lx,"ST_MISSING_SEMICOLON");
Lex(lx); //Skip ';'
}
Free(tempo);
LexDel(lx);
for (i=0;i<NUM_INTERNAL_TYPES;i++) {
tempit=&internal_types_table[i];
tempc=PrsClassNew;
tempc->type=HTT_INTERNAL_TYPE;
tempc->sub_type=tempit->type;
Bts(&tempc->flags,Cf_INTERNAL_TYPE);
tempc->size=tempit->size;
tempc->str=AStrNew(tempit->name);
HashAdd(tempc,asm_hash);
sys_internal_types[tempc->sub_type]=tempc;
if (first) {
tempc=MAllocIdentical(tempc);
HashAdd(tempc,adam_task->hash_table);
}
}
}
U0 CmpLoadDefines()
{
DefineLoad("ST_ERR",ST_ERR_ST);
DefineLoad("ST_WARN",ST_WARN_ST);
DefineLoad("ST_MISSING_SEMICOLON","missing ';' at");
DefineLoad("ST_MISSING_EXPRESSION","missing Expression at ");
DefineLoad("ST_MISSING_RIGHT_PAREN","missing ')' at ");
DefineLoad("ST_MISSING_RIGHT_BRACKET","missing ']' at ");
DefineLoad("ST_MISSING_COLON","missing ':' at");
DefineLoad("ST_UNDEFINED_SYM","undefined sym at ");
DefineLoad("ST_UNDEFINED_SYM_LINE","undefined sym at line:");
DefineLoad("ST_UNDEFINED_IDENTIFIER","undefined identifier at ");
DefineLoad("ST_INVALID_CLASS","invalid class at ");
DefineLoad("ST_INVALID_MEMBER","invalid member at ");
DefineLoad("ST_EXPECTING_TYPE","expecting type at ");
DefineLoad("ST_EXPECTING_IDENTIFIER","expecting identifier at ");
DefineLoad("ST_EXPECTING_RIGHT_PAREN","expecting ')' at ");
DefineLoad("ST_EXPECTING_LEFT_BRACE","expecting '{' at ");
DefineLoad("ST_EXPECTING_EQUAL","expecting '=' at ");
DefineLoad("ST_MISSING_RIGHT_BRACE","missing '}' at ");
DefineLoad("ST_INVALID_LVAL","invalid lval at ");
DefineLoad("ST_EXPECTING_COMMA","expecting ',' at ");
DefineLoad("ST_EXPECTING_SYS_SYM","expecting System sym at ");
DefineLoad("ST_MISSING_WHILE","missing 'while' at");
DefineLoad("ST_ALREADY_ONE_IMMEDIATE","already one immediate at ");
DefineLoad("ST_SYNTAX_ERROR","syntax error at ");
DefineLoad("ST_EXPECTING_SCALE_FACTOR","expecting scale factor at ");
DefineLoad("ST_EXPECTING_LEFT_PAREN","expecting '(' at ");
DefineLoad("ST_UNDEFINED_DUP_CNT","undefined DUP cnt at ");
DefineLoad("ST_NO_LOCAL_GLBL_EXPORT","no local glbl exports at ");
DefineLoad("ST_EXPECTING_COLON","expecting ':' at ");
DefineLoad("ST_EXPECTING_DOT","expecting '.' at ");
DefineLoad("ST_EXPECTING_LOCAL_VAR","expecting local var at ");
DefineLoad("ST_REDEFINITION","redefinition at ");
DefineLoad("ST_INVALID_INSTRUCTION","invalid instruction at ");
DefineLoad("ST_BRANCH_OUT_OF_RANGE","branch out of range at ");
DefineLoad("ST_BRANCH_OUT_OF_RANGE_LINE","branch out of range at line:");
DefineLoad("ST_ATTEMPT_DEFINE_IMPORT","attempt to define import at ");
DefineLoad("ST_COULD_USE_I8_DISP","could use I8 displacement at ");
DefineLoad("ST_COULD_USE_I8_DISP_LINE","could use I8 displacement at line:");
DefineLoad("ST_PTR_TO_U0","use \"U8 *\" instead of \"U0 *\" at ");
DefineLoad("ST_NO_SIZE_SPECIFIED","no size specified at ");
DefineListLoad("ST_IT_TYPES","I0\0U0\0I8\0U8\0I16\0U16\0I32\0U32\0I64\0U64\0F64\0uF64\0");
DefineListLoad("ST_TY_TYPES","NULL\0IMM\0REG\0DISP\0SIB\0RIP\0STK\0");
DefineListLoad("ST_U8_REGS","AL\0CL\0DL\0BL\0AH\0CH\0DH\0BH\0"
"R8u8\0R9u8\0R10u8\0R11u8\0R12u8\0R13u8\0R14u8\0R15u8\0");
DefineListLoad("ST_U8_REX_REGS","AL\0CL\0DL\0BL\0RSPu8\0RBPu8\0RSIu8\0RDIu8\0"
"R8u8\0R9u8\0R10u8\0R11u8\0R12u8\0R13u8\0R14u8\0R15u8\0");
DefineListLoad("ST_U16_REGS","AX\0CX\0DX\0BX\0SP\0BP\0SI\0DI\0"
"R8u16\0R9u16\0R10u16\0R11u16\0R12u16\0R13u16\0R14u16\0R15u16\0");
DefineListLoad("ST_U32_REGS","EAX\0ECX\0EDX\0EBX\0ESP\0EBP\0ESI\0EDI\0"
"R8u32\0R9u32\0R10u32\0R11u32\0R12u32\0R13u32\0R14u32\0R15u32\0");
DefineListLoad("ST_U64_REGS","RAX\0RCX\0RDX\0RBX\0RSP\0RBP\0RSI\0RDI\0"
"R8\0R9\0R10\0R11\0R12\0R13\0R14\0R15\0");
DefineListLoad("ST_MM_REGS","MM0\0MM1\0MM2\0MM3\0MM4\0MM5\0MM6\0MM7\0");
DefineListLoad("ST_XMM_REGS","XMM0\0XMM1\0XMM2\0XMM3\0XMM4\0XMM5\0XMM6\0XMM7\0");
DefineListLoad("ST_OPCODE_MODIFIERS","NO\0CB\0CW\0CD\0CP\0IB\0IW\0ID\0");
DefineListLoad("ST_ARG_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\0M64\0"
"M1632\0M16N32\0M16N16\0M32N32\0"
"MOFFS8\0MOFFS16\0MOFFS32\0MOFFS64\0"
"AL\0AX\0EAX\0RAX\0CL\0DX\0 \0SREG\0"
"SS\0DS\0ES\0FS\0GS\0CS\0ST0\0STI\0"
"MM\0MM32\0MM64\0XMM\0XMM32\0XMM64\0XMM128\0XMM0\0");
DefineListLoad("ST_SEG_REGS","ES\0CS\0SS\0DS\0FS\0GS\0");
DefineListLoad("ST_FSTK_REGS","ST0\0ST1\0ST2\0ST3\0ST4\0ST5\0ST6\0ST7\0");
DefineLoad("ST_EXPECTING_INTEGER","expecting integer at ");
DefineLoad("ST_USE_POSTFIX_CAST","Use SparrowOS postfix typecasting at ");
DefineLoad("ST_PRS_INTERNAL_ERROR","Compiler Parse Error at ");
DefineLoad("ST_OPT_INTERNAL_ERROR","Compiler Optimization Error at ");
DefineLoad("ST_UNRESOLVED_REFERENCE","Unresolved Reference:");
DefineLoad("ST_SCANNING_DIR","Scanning Directory:");
DefineLoad("ST_UNUSED_VAR","Unused var ");
DefineLoad("ST_UNNEEDED_NOUNUSEDWARN","Unneeded nounusedwarn ");
DefineLoad("ST_UNUSED_EXTERN","Unused extern ");
DefineLoad("ST_UNUSED_LABEL","Unused label ");
DefineLoad("ST_UNUSED_LABEL_AT","Unused label at ");
DefineLoad("ST_NOT_ALLOWED_IN_FUN","Not allowed in fun");
DefineLoad("ST_MISSING_CATCH","missing 'catch' at");
DefineLoad("ST_UNDEFINED_GOTO_LABEL","Undefined goto label ");
DefineLoad("ST_UNDEFINED_GOTO_LABEL_AT","Undefined goto label at ");
DefineLoad("ST_DUP_GOTO_LABEL","Duplicate goto label at ");
DefineLoad("ST_BREAK_NOT_ALLOWED","'break' not allowed\n");
DefineLoad("ST_ERRORS_WARNINGS","Errs:%d Warns:%d Code:%X Size:%X\n");
DefineLoad("ST_IMPORT_NOT_NEEDED","import not needed at ");
DefineLoad("ST_CASE_RANGE_ERROR","switch range error at ");
DefineLoad("ST_LEX_STK_OVERFLOW","Lex Stk overflow");
DefineLoad("ST_ASSERT_FAILED","Assert Failed ");
DefineLoad("ST_ADDR_EXTERN","Can't take addr of extern fun");
DefineLoad("ST_EXTERNS_NOT_ALLOWED","Extern Not Allowed at ");
DefineLoad("ST_UNNECESSARY_PARENTHESIS","Unnecessary parenthesis");
DefineLoad("ST_STATIC_UNION","Static unions are not implemented");
DefineLoad("ST_IMPORT_HASH_TABLE_NOT_ALLOWED","import_hash_table only allowed in static compiled #exe{} mode.");
DefineLoad("ST_CANT_INIT_GLBL_ON_HEAP","Can't init glbl var on data heap in static module");
DefineLoad("ST_INVALID_ARRAY_SIZE","Invalid array size at ");
DefineLoad("ST_NO_FUN_ASM_ALIGN","ALIGN not allowed in fun asm blk ");
DefineLoad("ST_ALIGN_MUST_BE_POWER_OF_TWO","ALIGN must be power of two at ");
DefineLoad("ST_ALIGN_TOO_LARGE","In JIT mode, max ALIGN is 8 ");
DefineLoad("ST_FUN_SIZE_NOT_DEFINED","Function size not defined at ");
DefineLoad("ST_DUP_MEMBER","Duplicate member at ");
DefineLoad("ST_DUP_TYPE","Duplicate type at ");
DefineLoad("ST_FUN_PTR_FUN_PTR","Duplicate fun pointer at ");
DefineLoad("ST_EXPECTING_STAR","Expecting '*' at ");
DefineLoad("ST_EXPECTING_AMPERSAND","Expecting '&' at ");
DefineLoad("ST_NOT_IMPLEMENTED","Feat not implemented");
DefineLoad("ST_DUP_CASE","Duplicate case at ");
DefineLoad("ST_DEREF_U0","Dereference U0 ");
DefineLoad("ST_ASSIGN_U0","Assign U0 ");
DefineLoad("ST_NO_GLBL_LABELS","No global labels at ");
DefineLoad("ST_SHOULD_RETURN_VAL","Function should return val ");
DefineLoad("ST_CANT_RETURN_VAL","Not in fun. Can't return a val ");
DefineLoad("ST_SHOULD_NOT_RETURN_VAL","Function should NOT return val ");
DefineLoad("ST_DUP_OPCODE_ENTRY","Duplicate OPCODE entry ");
DefineLoad("ST_IN_FUN","in fun ");
DefineLoad("ST_NOT_ARRAY_OR_PTR","not array or ptr ");
DefineLoad("ST_16BIT_UNASM","16-bit unassembly is not well supported.\n");
DefineLoad("ST_CANT_REG_VAR","Can't reg var ");
DefineLoad("ST_ILLEGAL_FWD_REF","Illegal fwd ref at ");
DefineLoad("ST_REG_IN_USE","Register in use ");
DefineLoad("ST_ONE_BASE_CLASS","Only one base class allowed at this time at ");
DefineLoad("ST_ADD_NOT_VAL","Must be address, not value ");
DefineLoad("ST_HEADER_FOR_PRINTF","Missing header for PrintF(), PutS() and PutChar() at ");
DefineLoad("ST_HEADER_FOR_SYSTRY","Missing header for SysTry() and SysUntry() at ");
$AN,"Anchor for inserting Compiler Defines","COMPILE_DEFINE"$
DefineListLoad("ST_INTERMEDIATE_CODE",
// '*' means it is a dereference instruction
// '=' means it is an assignment instruction
// '^' means it is a compare instruction
// '9' arg cnt means var
// 'N' means not constant. Sets LF_NOT_CONSTANT
// which means an expression contains mem
// accesses or things which might change.
// arg cnt,result cnt,deref/assign/cmp,nonconst,might not fill result
"00..END\0"
"00..START\0"
"00..NOP\0"
"10..END_EXP\0"
"00..NOP1\0"
"00..LABEL\0"
"00..CALL_START\0"
"01..CALL_END\0"
"00..CALL_END2\0"
"10..RETURN_VAL\0"
"00..RETURN_VAL2\0"
"01..IMM\0"
"01..F64\0"
"01.NSTR_CONST\0"
"01.NABS_ADDR\0"
"01.NADDR_IMPORT\0"
"01.NHEAP_GLBL\0"
"01..SIZEOF\0"
"01..TYPE\0"
"01.NGET_LABEL\0"
"01.NRBP\0"
"01.NREG\0"
"00.NFS\0"
"01.NMOV_FS\0"
"00.NGS\0"
"01.NMOV_GS\0"
"01.NLEA\0"
"01.NMOV\0"
"10..TO_I64\0"
"10..TO_F64\0"
"10..TO_BOOL\0"
"10..TOUPPER\0"
"11..NATIVE_TYPECAST\0"
"11.NADDR\0"
"11..COM\0"
"11..NOT\0"
"11..UNARY_MINUS\0"
"11*NDEREF\0"
"11*NDEREF_PP\0"
"11*NDEREF_MM\0"
"11*N_PP\0"
"11*N_MM\0"
"11*NPP_\0"
"11*NMM_\0"
"21..SHL\0"
"21..SHR\0"
"11=.SHL_CONST\0"
"11=.SHR_CONST\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"
"11=.ADD_CONST\0"
"11=.SUB_CONST\0"
"21^.EQUAL_EQUAL\0"
"21^.NOT_EQUAL\0"
"21^.LESS\0"
"21^.GREATER\0"
"21^.LESS_EQUAL\0"
"21^.GREATER_EQUAL\0"
"01..PUSH_CMP\0"
"21..AND_AND\0"
"21..OR_OR\0"
"21..XOR_XOR\0"
"31..COLON\0"
"00..QUESTION\0"
"21=NASSIGN\0"
"21=NASSIGN_PP\0"
"21=NASSIGN_MM\0"
"21=NSHL_EQUAL\0"
"21=NSHR_EQUAL\0"
"21=NMUL_EQUAL\0"
"21=NDIV_EQUAL\0"
"21=NMOD_EQUAL\0"
"21=NAND_EQUAL\0"
"21=NOR_EQUAL\0"
"21=NXOR_EQUAL\0"
"21=NADD_EQUAL\0"
"21=NSUB_EQUAL\0"
"00..JMP\0"
"20..SWITCH\0"
"20..NOBOUND_SWITCH\0"
"90..ADD_RSP\0"
"90..ADD_RSP1\0"
"00..ENTER\0"
"00=.PUSH_REGS\0"
"00=.POP_REGS\0"
"00..LEAVE\0"
"00..RET\0"
"00.NCALL\0"
"00.NCALL_INDIRECT\0"
"00.NCALL_INDIRECT2\0"
"00.NCALL_IMPORT\0"
"00.NCALL_EXTERN\0"
"00.NIRQ\0"
"00.NASM\0"
"00.NCLI\0"
"00.NSTI\0"
"10.NPREEMPT\0"
"00.NCLD\0"
"00.NSTD\0"
"00.NHLT\0"
"10.NPUSH\0"
"00.NPOP\0"
"00.NPUSHFD\0"
"00.NPOPFD\0"
"00.NPAUSE\0"
"10.NCLFLUSH\0"
"10.NINVLPG\0"
"10.NINU8\0"
"10.NINU16\0"
"10.NINU32\0"
"20.NOUTU8\0"
"20.NOUTU16\0"
"20.NOUTU32\0"
"00.NGET_FLAGS\0"
"10.NSET_FLAGS\0"
"00.NGET_RAX\0"
"10.NSET_RAX\0"
"00.NGET_BASE_PTR\0"
"10.NSET_BASE_PTR\0"
"00.NGET_STK_PTR\0"
"10.NSET_STK_PTR\0"
"01.NRIP\0"
"00.NRDTSC\0"
"00.NHPET\0"
"20.NBT\0"
"20.NBTS\0"
"20.NBTR\0"
"20.NBTC\0"
"30.NBEQU\0"
"20.NLBTS\0"
"20.NLBTR\0"
"20.NLBTC\0"
"30.NLBEQU\0"
"10.NBSF\0"
"10.NBSR\0"
"10.NQUE_INIT\0"
"20.NQUE_INS\0"
"20.NQUE_INS_REV\0"
"10.NQUE_REM\0"
"10.NSTRLEN\0"
"30.NMEMCPY\0"
"30.NMEMSET\0"
"30.NMEMSET_U16\0"
"30.NMEMSET_U32\0"
"30.NMEMSET_U64\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"
"21..BR_2NOT_EQUAL\0"
"21..BR_2EQUAL_EQUAL\0"
"21..BR_2GREATER_EQUAL\0"
"21..BR_2LESS_EQUAL\0"
"21..BR_2GREATER\0"
"21..BR_2LESS\0"
"20..BR_AND_ZERO\0"
"20..BR_AND_NOT_ZERO\0"
"10.NBR_MM_ZERO\0"
"10.NBR_MM_NOT_ZERO\0"
"20..BR_AND_AND_ZERO\0"
"20..BR_AND_AND_NOT_ZERO\0"
"20..BR_OR_OR_ZERO\0"
"20..BR_OR_OR_NOT_ZERO\0"
"20.NBR_BT\0"
"20.NBR_BTS\0"
"20.NBR_BTR\0"
"20.NBR_BTC\0"
"20.NBR_LBTS\0"
"20.NBR_LBTR\0"
"20.NBR_LBTC\0"
"20.NBR_NOT_BT\0"
"20.NBR_NOT_BTS\0"
"20.NBR_NOT_BTR\0"
"20.NBR_NOT_BTC\0"
"20.NBR_NOT_LBTS\0"
"20.NBR_NOT_LBTR\0"
"20.NBR_NOT_LBTC\0"
"20.NSWAP_U8\0"
"20.NSWAP_U16\0"
"20.NSWAP_U32\0"
"20.NSWAP_U64\0"
"10..ABS_I64\0"
"10..SIGN_I64\0"
"20..MIN_I64\0"
"20..MIN_U64\0"
"20..MAX_I64\0"
"20..MAX_U64\0"
"30..LIMIT_I64\0"
"30..LIMIT_U64\0"
"20..MOD_U64\0"
"10..SQRI64\0"
"10..SQRU64\0"
"11..SQR\0"
"11..ABS\0"
"11..SQRT\0"
"11..SIN\0"
"11..COS\0"
"11..TAN\0"
"11..ATAN\0"
);$AN,"Anchor for adding intermediate codes","IC_INIT_TABLE"$
}
U0 CmpFillTables()
{
U8 *st;
I64 i,k;
U32 *u,*d4;
assign_bitmap=CAlloc((IC_NUM_ENTRIES+7)>>3);
deref_bitmap=CAlloc((IC_NUM_ENTRIES+7)>>3);
cmp_bitmap=CAlloc((IC_NUM_ENTRIES+7)>>3);
not_constant_bitmap=CAlloc((IC_NUM_ENTRIES+7)>>3);
fpop_bitmap=CAlloc((IC_NUM_ENTRIES+7)>>3);
cmp_arg_cnt=CAlloc(IC_NUM_ENTRIES);
cmp_result_cnt=CAlloc(IC_NUM_ENTRIES);
st=Define("ST_INTERMEDIATE_CODE");
for (i=0;i<IC_NUM_ENTRIES;i++) {
cmp_arg_cnt[i]=*st-'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;
//See $LK,"ST_INTERMEDIATE_CODE","FF:::/SparrowOS/Compiler/CodeGen.CPP.Z,ST_INTERMEDIATE_CODE"$.
}
Bts(fpop_bitmap,IC_ADD);
Bts(fpop_bitmap,IC_SUB);
Bts(fpop_bitmap,IC_MUL);
Bts(fpop_bitmap,IC_DIV);
Bts(fpop_bitmap,IC__PP);
Bts(fpop_bitmap,IC__MM);
Bts(fpop_bitmap,IC_PP_);
Bts(fpop_bitmap,IC_MM_);
Bts(fpop_bitmap,IC_SQR);
Bts(fpop_bitmap,IC_ABS);
Bts(fpop_bitmap,IC_SQRT);
Bts(fpop_bitmap,IC_SIN);
Bts(fpop_bitmap,IC_COS);
Bts(fpop_bitmap,IC_TAN);
Bts(fpop_bitmap,IC_ATAN);
to_reg_vars_map=CAlloc(NUM_REGS*sizeof(U8));
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=CAlloc(NUM_REGS*sizeof(U8));
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=CAlloc(NUM_REGS*sizeof(U8));
to_stk_temps_map_even=CAlloc(NUM_REGS*sizeof(U8));
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=CAlloc(sizeof(U32)*TK_NUM_TK);
dual_U16_tokens1=u;
u['!']=TK_NOT_EQUAL<<16+'=';
u['&']=TK_AND_AND<<16+'&';
u['*']=TK_MUL_EQUAL<<16+'=';
u['+']=TK_PLUS_PLUS<<16+'+';
u['-']=TK_DEREFERENCE<<16+'>';
u['/']='*';
u[':']=TK_DBL_COLON<<16+':';
u['<']=TK_LESS_EQUAL<<16+'=';
u['=']=TK_EQUAL_EQUAL<<16+'=';
u['>']=TK_GREATER_EQUAL<<16+'=';
u['^']=TK_XOR_EQUAL<<16+'=';
u['|']=TK_OR_OR<<16+'|';
u['%']=TK_MOD_EQUAL<<16+'=';
u=CAlloc(sizeof(U32)*TK_NUM_TK);
dual_U16_tokens2=u;
u['&']=TK_AND_EQUAL<<16+'=';
u['+']=TK_ADD_EQUAL<<16+'=';
u['-']=TK_MINUS_MINUS<<16+'-';
u['/']='/';
u['<']=TK_SHL<<16+'<';
u['>']=TK_SHR<<16+'>';
u['^']=TK_XOR_XOR<<16+'^';
u['|']=TK_OR_EQUAL<<16+'=';
u=CAlloc(sizeof(U32)*TK_NUM_TK);
dual_U16_tokens3=u;
u['-']=TK_SUB_EQUAL<<16+'=';
u['/']=TK_DIV_EQUAL<<16+'=';
//$AN,"","OP_precedence"$Here the operator precedences are
//defined.
d4=CAlloc(sizeof(U32)*TK_NUM_TK);
unary_ops_table=d4;
d4['~']=PREC_UNARY_PRE<<16+IC_COM;
d4['!']=PREC_UNARY_PRE<<16+IC_NOT;
d4['-']=PREC_UNARY_PRE<<16+IC_UNARY_MINUS;
d4['&']=PREC_UNARY_PRE<<16+IC_ADDR;
d4['*']=PREC_UNARY_PRE<<16+IC_DEREF;
d4=CAlloc(sizeof(U32)*TK_NUM_TK);
binary_ops_table=d4;
d4['`'] =(PREC_EXP+ASSOCF_RIGHT)<<16+IC_POWER;
d4[TK_SHL] =(PREC_EXP+ASSOCF_LEFT)<<16+IC_SHL;
d4[TK_SHR] =(PREC_EXP+ASSOCF_LEFT)<<16+IC_SHR;
d4['*'] =PREC_MUL<<16+IC_MUL;
d4['/'] =(PREC_MUL+ASSOCF_LEFT)<<16+IC_DIV;
d4['%'] =(PREC_MUL+ASSOCF_LEFT)<<16+IC_MOD;
d4['&'] =PREC_AND<<16+IC_AND;
d4['^'] =PREC_XOR<<16+IC_XOR;
d4['|'] =PREC_OR<<16+IC_OR;
d4['+'] =PREC_ADD<<16+IC_ADD;
d4['-'] =(PREC_ADD+ASSOCF_LEFT)<<16+IC_SUB;
d4['<'] =PREC_CMP<<16+IC_LESS;
d4['>'] =PREC_CMP<<16+IC_GREATER;
d4[TK_LESS_EQUAL] =PREC_CMP<<16+IC_LESS_EQUAL;
d4[TK_GREATER_EQUAL] =PREC_CMP<<16+IC_GREATER_EQUAL;
d4[TK_EQUAL_EQUAL] =PREC_CMP2<<16+IC_EQUAL_EQUAL;
d4[TK_NOT_EQUAL] =PREC_CMP2<<16+IC_NOT_EQUAL;
d4[TK_AND_AND] =PREC_AND_AND<<16+IC_AND_AND;
d4[TK_XOR_XOR]=PREC_XOR_XOR<<16+IC_XOR_XOR;
d4[TK_OR_OR] =PREC_OR_OR<<16+IC_OR_OR;
d4[':'] =(PREC_QUEST+ASSOCF_LEFT)<<16+IC_COLON;
d4['?'] =(PREC_QUEST+ASSOCF_LEFT)<<16+IC_QUESTION;
d4['='] =(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_ASSIGN;
d4[TK_SHL_EQUAL]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_SHL_EQUAL;
d4[TK_SHR_EQUAL]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_SHR_EQUAL;
d4[TK_MUL_EQUAL]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_MUL_EQUAL;
d4[TK_DIV_EQUAL]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_DIV_EQUAL;
d4[TK_MOD_EQUAL]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_MOD_EQUAL;
d4[TK_AND_EQUAL]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_AND_EQUAL;
d4[TK_OR_EQUAL] =(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_OR_EQUAL;
d4[TK_XOR_EQUAL]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_XOR_EQUAL;
d4[TK_ADD_EQUAL]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_ADD_EQUAL;
d4[TK_SUB_EQUAL]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_SUB_EQUAL;
}
+688
View File
@@ -0,0 +1,688 @@
U0 StreamPutS(U8 *st)
//Inss text into the stream of
//characters being compiled. Called
//from withing #exe{} block.
{
CLex *lx=Fs->last_lex;
CStreamBlk *tempe=lx->last_stream_blk;
if (tempe!=&lx->next_stream_blk)
tempe->body=StrAdd(tempe->body,st);
else
PrintFErr("No exe{} blk\n");
}
U0 StreamPrintF(U8 *src,...)
//Inss text into the stream of
//characters being compiled. Called
//from withing #exe{} block.
{
U8 *buf=SPrintFJoin(NULL,src,argc,argv);
StreamPutS(buf);
Free(buf);
}
U8 *CmpStatement(CLex *lx,I64 *type)
{
I64 size,i,j,k,*result=INVALID_PTR;
CIntermediateCode *tempi;
if (type) *type=IT_I64;
Btr(&lx->flags,Lf_OPT_TRACE_PRESENT);
if (lx->a_depth==2)
CBPush(lx);
CBOutPtrsInit(lx);
CBICAdd(lx,IC_START,0,0); //So we can scan back an instruction
tempi=lx->cbh.cb_last_out_ptr;
if (!PrsStatement(lx,NULL)) {
if (tempi!=lx->cbh.cb_last_out_ptr) {
CBICAdd(lx,IC_RETURN_VAL2,0,NULL);
CBICAdd(lx,IC_RET,0,0);
CBICAdd(lx,IC_END,0,0);
if (result=CBCompile(lx,NULL,&size,NULL,NULL,type)) {
if (lx->flags&LF_STATIC_COMPILE) {
j=lx->a->ip;
k=(size+7)>>3;
for (i=0;i<k;i++)
AsmStoreCodeU64(lx,result[i]);
Free(result);
result=j;
}
}
} else
LinkedListDel(lx->cbh.cb_out_first);
} else
LinkedListDel(lx->cbh.cb_out_first);
if (lx->a_depth==2)
CBPop(lx);
return result;
}
CExe *CmpJoin(CLex *lx,CHashFun *locals,Bool first_lex,Bool asm_blk=FALSE,
U8 *map_name=NULL,U8 mapfile_drv=0)
{
CAsmCtrl *a,*old_a=lx->a;
I64 i,j,l;
CAsmCodeBlk *tempc;
CExeImportExport *tempe;
Bool okay=TRUE;
CHashTable *ht1=lx->hash_table_list,
*ht2=lx->define_hash_table,
*ht3=lx->glbl_hash_table,
*ht4=lx->local_hash_table,
*asm_hash_alias=MAllocIdentical(asm_hash);
CHashFun *old_var_list=lx->local_var_list;
CExe *result=CAlloc(sizeof(CExe));
result->parent_exe=lx->exe_struct;
lx->exe_struct=result;
result->next_ie=result->last_ie=&result->next_ie;
lx->a=a=CAlloc(sizeof(CAsmCtrl));
lx->a_depth++;
a->code=CAlloc(sizeof(CAsmCodeBlk));
a->max_align=1;
lx->local_hash_table=HashTableNew(16);
lx->glbl_hash_table =HashTableNew(2048);
asm_hash_alias->next=lx->local_hash_table;
lx->local_hash_table->next=lx->glbl_hash_table;
if (lx->flags&LF_STATIC_COMPILE)
lx->define_hash_table=lx->glbl_hash_table;
else
lx->glbl_hash_table->next=Fs->hash_table;
lx->hash_table_list =asm_hash_alias;
lx->local_var_list=locals; //C+ local vars
try {
if (first_lex)
Lex(lx);
if (lx->flags&LF_STATIC_COMPILE) {
while (lx->token!=TK_EOF) {
i=CmpStatement(lx,NULL);
if (i!=INVALID_PTR) {
tempe=CAlloc(sizeof(CExeImportExport));
tempe->type=EIE_MAIN;
tempe->ip=i;
QueIns(tempe,result->last_ie);
}
if (asm_blk)
break;
}
} else
PrsStatement(lx,NULL);
AsmGlblsResolve(lx,result);
} catch {
if (Fs->except_argc>0 && Fs->except_argv[0]==EXCEPT_COMPILER &&
!asm_blk) {
if (Fs->except_argc>1 && Fs->except_argv[1]) {
"Compiler exception #%d\n",Fs->except_argv[1];
LexPutPos(lx);
}
Fs->catch_except=TRUE;
}
okay=FALSE;
}
if (!okay) {
if (lx->error_cnt<1)
lx->error_cnt=1;
lx->exe_struct=result->parent_exe;
Free(result);
LinkedListDel(a->code);
result=NULL;
} else {
if (map_name && !cmp_do_not_write_to_dsk)
HashRep(lx->glbl_hash_table,HTG_ALL,map_name,"-r-p",mapfile_drv);
HashTableDel(lx->local_hash_table);
HashTableDel(lx->glbl_hash_table);
if (!a->num_code_U8s)
result->code=NULL;
else {
if (lx->flags&LF_STATIC_COMPILE)
result->code=MAlloc(a->num_code_U8s);
else
result->code=MAlloc(a->num_code_U8s,Fs->code_heap);
result->code_U8s=a->num_code_U8s;
tempc=a->code;
j=0;
l=a->num_code_U8s;
while (tempc) {
i=l;
if (i>ASM_CODE_BLK_SIZE)
i=ASM_CODE_BLK_SIZE;
MemCpy(result->code+j,tempc->body,i);
j+=i;
l-=i;
tempc=tempc->next;
}
}
LinkedListDel(a->code);
result->abss=a->abss;
result->heap_glbls=a->heap_glbls;
result->max_align=a->max_align;
lx->exe_struct=result->parent_exe;
}
lx->hash_table_list =ht1,
lx->define_hash_table=ht2;
lx->glbl_hash_table =ht3;
lx->local_hash_table =ht4;
lx->local_var_list=old_var_list;
Free(asm_hash_alias);
Free(a);
lx->a=old_a;
lx->a_depth--;
return result;
}
CExe *CmpBuf(U8 *buf,U8 *map_name=NULL,
I64 *error_cnt=NULL, I64 *warning_cnt=NULL,U8 mapfile_drv=0)
{
CLex *lx;
CExe *result=NULL;
if (!is_first_compiler)
"$$FG,PURPLE$$**** Not First Compiler ****$$FG$$\n";
lx=LexNew(buf,LF_DONT_FREE_BUF,NULL);
lx->flags|=LF_STATIC_COMPILE;
QueIns(lx,Fs->last_lex);
result=CmpJoin(lx,NULL,TRUE,FALSE,map_name,mapfile_drv);
if (error_cnt) *error_cnt=lx->error_cnt;
if (warning_cnt) *warning_cnt=lx->warning_cnt;
QueRem(lx);
if (result)
LexDel(lx);
return result;
}
U0 CmpFixUpJITAsm(CLex *lx,CExe *ex,I64 ip2)
{
I64 i,*str=NULL;
U8 *ptr;
CExeAbsAddr *tempa,*tempa1;
CExeImportExport *tempe,*tempe1;
CHashExport *tempess;
CHashFun *tempf;
CHashGlblVar *tempg;
tempa=ex->abss;
while (tempa) {
tempa1=tempa->next;
nobound_switch (tempa->type) {
case EAA_ADD_U8:
*(ex->code(U8 *)+tempa->ip)(U8 *)+=ip2;
break;
case EAA_SUB_U8:
*(ex->code(U8 *)+tempa->ip)(U8 *)-=ip2;
break;
case EAA_ADD_U16:
*(ex->code(U8 *)+tempa->ip)(U16 *)+=ip2;
break;
case EAA_SUB_U16:
*(ex->code(U8 *)+tempa->ip)(U16 *)-=ip2;
break;
case EAA_ADD_U32:
*(ex->code(U8 *)+tempa->ip)(U32 *)+=ip2;
break;
case EAA_SUB_U32:
*(ex->code(U8 *)+tempa->ip)(U32 *)-=ip2;
break;
case EAA_ADD_U64:
*(ex->code(U8 *)+tempa->ip)(I64 *)+=ip2;
break;
case EAA_SUB_U64:
*(ex->code(U8 *)+tempa->ip)(I64 *)-=ip2;
break;
}
Free(tempa);
tempa=tempa1;
}
tempe=ex->next_ie;
while (tempe!=&ex->next_ie) {
tempe1=tempe->next;
if (tempe->str) {
Free(str);
str=tempe->str;
}
if (tempe->type<=EIE_LIT_EXPORT) {
tempess=CAlloc(sizeof(CHashExport));
tempess->str=str;
str=NULL;
tempess->type=HTT_EXPORT_SYS_SYM|HTF_LIT;
if (tempe->type==EIE_LIT_EXPORT)
tempess->val=tempe->ip;
else
tempess->val=tempe->ip+ip2;
tempess->src_link=tempe->src_link;
tempe->src_link=NULL;
if (IsReplaceSyms)
HashReplace(tempess,Fs->hash_table);
else
HashAdd(tempess,Fs->hash_table);
SysSymImportsResolve(tempess->str);
} else if (tempe->type<EIE_MAIN) {
if (tempe->str && !(tempess=HashFind(str,Fs->hash_table,HTG_ALL-HTT_IMPORT_SYS_SYM)))
"%S%s\n","ST_UNRESOLVED_REFERENCE",str;
else {
ptr=tempe->ip+ip2;
if (tempess->type & HTT_FUN) {
tempf=tempess;
if (tempe->type & 1)
i=tempf->executable_addr;
else
i=tempf->executable_addr-ex->code;
} else if (tempess->type & HTT_GLBL_VAR) {
tempg=tempess;
if (tempe->type & 1)
i=tempg->data_addr;
else
i=tempg->data_addr-ex->code;
} else {
if (tempe->type & 1)
i=tempess->val;
else
i=tempess->val(U8 *)-ex->code;
}
if (tempe->type<=EIE_LIT_U8)
*ptr(U8 *)+=i;
else if (tempe->type<=EIE_LIT_U16)
*ptr(U16 *)+=i;
else if (tempe->type<=EIE_LIT_U32)
*ptr(U32 *)+=i;
else if (tempe->type<=EIE_LIT_U64)
*ptr(I64 *)+=i;
}
}
Free(tempe->src_link);
Free(tempe);
tempe=tempe1;
}
Free(str);
if (!lx->a_depth && Bt(&lx->opts,OPTf_COMPILE_TRACE))
Un(ex->code,ex->code_U8s,64);
Free(ex);
}
U0 CmpFixUpStaticAsm(CLex *lx,CExe *ex,I64 ip2)
{
CAsmCtrl *a=lx->a;
U8 *ptr;
CExeAbsAddr *tempa,*tempa1;
CExeImportExport *tempe,*tempe1;
tempa=ex->abss;
while (tempa) {
tempa1=tempa->next;
tempa->next=a->abss;
nobound_switch (tempa->type) {
case EAA_ADD_U8:
*(ex->code(U8 *)+tempa->ip)(U8 *)+=ip2;
break;
case EAA_SUB_U8:
*(ex->code(U8 *)+tempa->ip)(U8 *)-=ip2;
break;
case EAA_ADD_U16:
*(ex->code(U8 *)+tempa->ip)(U16 *)+=ip2;
break;
case EAA_SUB_U16:
*(ex->code(U8 *)+tempa->ip)(U16 *)-=ip2;
break;
case EAA_ADD_U32:
*(ex->code(U8 *)+tempa->ip)(U32 *)+=ip2;
break;
case EAA_SUB_U32:
*(ex->code(U8 *)+tempa->ip)(U32 *)-=ip2;
break;
case EAA_ADD_U64:
*(ex->code(U8 *)+tempa->ip)(I64 *)+=ip2;
break;
case EAA_SUB_U64:
*(ex->code(U8 *)+tempa->ip)(I64 *)-=ip2;
break;
}
a->abss=tempa;
tempa->ip+=ip2;
tempa=tempa1;
}
tempe=ex->next_ie;
while (tempe!=&ex->next_ie) {
tempe1=tempe->next;
QueRem(tempe);
if (tempe->type<=EIE_LIT_EXPORT)
tempe->ip+=ip2;
else if (tempe->type<EIE_MAIN) {
ptr=ex->code(U8 *)+tempe->ip;
if (tempe->type<=EIE_LIT_U8)
*ptr(U8 *)-=ip2;
else if (tempe->type<=EIE_LIT_U16)
*ptr(U16 *)-=ip2;
else if (tempe->type<=EIE_LIT_U32)
*ptr(U32 *)-=ip2;
else if (tempe->type<=EIE_LIT_U64)
*ptr(I64 *)-=ip2;
tempe->ip+=ip2;
}
QueIns(tempe,ex->parent_exe->last_ie);
tempe=tempe1;
}
Free(ex);
}
I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv=0)
{ //Compile file
U8 *ptr,*fbuf=NULL,*fbuf2=NULL,*fbuf3=NULL,
*patch_table=MAlloc(0x20000);
CExe *ex;
I64 i,cnt,size=0,error_cnt=0,warning_cnt=0,code_U8s=0;
CBinFile *bfh;
CExeImportExport *tempe,*tempe1;
CExeAbsAddr *tempa,*tempa1;
CExeHeapGlblRef *temphgr,*temphgr1;
CExeHeapGlbl *temphg,*temphg1;
fbuf=DftExt(filename,"PRJ.Z");
fbuf2=MSPrintF("#include \"%s\"",fbuf);
if (map_name)
fbuf3=DftExt(map_name,"MAP.Z");
ex=CmpBuf(fbuf2,fbuf3,&error_cnt,&warning_cnt,mapfile_drv);
if (ex) {
code_U8s=ex->code_U8s;
ptr=patch_table;
*ptr++=EIE_MODULE_ALIGNMENT; //See $LK,"Load","MN:Load"$() and $LK,"BinRep","MN:BinRep"$()
*ptr(U32 *)++=ex->max_align;
*ptr++=0;
cnt=0;
tempa=ex->abss;
while (tempa) {
if (!(tempa->type&1))
cnt++;
tempa=tempa->next;
}
if (cnt) {
*ptr++=EIE_ABS_ADDR;
*ptr(U32 *)++=cnt;
*ptr++=0;
tempa=ex->abss;
while (tempa) {
tempa1=tempa->next;
if (!(tempa->type&1))
*ptr(U32 *)++ =tempa->ip;
Free(tempa);
tempa=tempa1;
}
}
temphg=ex->heap_glbls;
while (temphg) {
temphg1=temphg->next;
cnt=0;
temphgr=temphg->references;
while (temphgr) {
cnt++;
temphgr=temphgr->next;
}
if (cnt) {
*ptr++=EIE_HEAP_GLBL;
*ptr(U32 *)++=cnt;
if (temphg->str) {
i=StrLen(temphg->str);
MemCpy(ptr,temphg->str,i+1);
Free(temphg->str);
ptr+=i+1;
} else
*ptr++=0;
*ptr(I64 *)++=temphg->size;
temphgr=temphg->references;
while (temphgr) {
temphgr1=temphgr->next;
*ptr(U32 *)++=temphgr->ip;
Free(temphgr);
temphgr=temphgr1;
}
}
Free(temphg);
temphg=temphg1;
}
//Do exports first
tempe=ex->next_ie;
while (tempe!=&ex->next_ie) {
tempe1=tempe->next;
if (tempe->type<=EIE_LIT_EXPORT) {
QueRem(tempe);
*ptr++=tempe->type;
*ptr(U32 *)++=tempe->ip;
if (tempe->str) {
i=StrLen(tempe->str);
MemCpy(ptr,tempe->str,i+1);
Free(tempe->str);
ptr+=i+1;
} else
*ptr++=0;
Free(tempe->src_link);
Free(tempe);
}
tempe=tempe1;
}
//Do imports second
tempe=ex->next_ie;
while (tempe!=&ex->next_ie) {
tempe1=tempe->next;
QueRem(tempe);
*ptr++=tempe->type;
*ptr(U32 *)++=tempe->ip;
if (tempe->str) {
i=StrLen(tempe->str);
MemCpy(ptr,tempe->str,i+1);
Free(tempe->str);
ptr+=i+1;
} else
*ptr++=0;
Free(tempe->src_link);
Free(tempe);
tempe=tempe1;
}
*ptr++=EIE_END;
MemSet(ptr,0,16);
i=ptr-patch_table;
//$LK,"NATIVE_XSUM","FF:::/SparrowOS/OSMain/OSStart.CPP.Z,NATIVE_XSUM"$ needs 16 ALIGN
size=(sizeof(CBinFile)+code_U8s+i+15)&-16;
bfh=MAlloc(size);
bfh->jmp=0xEB+256*(sizeof(CBinFile)-2);
#assert sizeof(CBinFile)-2<=MAX_I8
bfh->type=0;
bfh->loader_patch_table_offset=sizeof(CBinFile)+code_U8s;
bfh->file_size=size;
bfh->xsum=NATIVE_XSUM;
MemCpy(bfh(U8 *)+sizeof(CBinFile),ex->code,code_U8s);
MemCpy(bfh(U8 *)+sizeof(CBinFile)+code_U8s,patch_table,
size-code_U8s-sizeof(CBinFile));
bfh->xsum=ArcXSum(bfh,size);
Free(fbuf2);
if (out_name)
fbuf2=DftExt(out_name,"BIN.Z");
else
fbuf2=ChgExt(fbuf,"BIN.Z");
if (!cmp_do_not_write_to_dsk)
FileWrite(fbuf2,bfh,size);
Free(bfh);
Free(ex->code);
Free(ex);
}
Free(patch_table);
Free(fbuf);
Free(fbuf2);
Free(fbuf3);
PrintF(Define("ST_ERRORS_WARNINGS"),error_cnt,warning_cnt,code_U8s,size);
return error_cnt;
}
I64 ExePutS(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE)
{
I64 result;
Bool okay=TRUE;
CLex *lx;
if (!filename)
filename=sys_temp_filename;
lx=LexNew(buf,LF_DONT_FREE_BUF,FileNameAbs(filename));
if (just_load)
lx->flags|=LF_JUST_LOAD;
if (Fs->last_lex!=&Fs->next_lex)
lx->opts=Fs->last_lex->opts;
QueIns(lx,Fs->last_lex);
try {
Lex(lx);
result=ExeCmdLine(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;
}
}
}
QueRem(lx);
if (okay)
LexDel(lx); //TODO: can crash
return result;
}
I64 ExePrintF(U8 *fmt,...)
{
I64 result;
U8 *buf=SPrintFJoin(NULL,fmt,argc,argv);
result=ExePutS(buf);
Free(buf);
return result;
}
I64 ExeFile(U8 *name,Bool just_load=FALSE)
{
I64 result;
U8 *name2=DftExt(name,"CPP.Z"),
*st=MSPrintF("#include \"%s\";",name2);
result=ExePutS(st,name,just_load);
Free(st);
Free(name2);
return result;
}
I64 ExePutS2(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE)
{ //with REPLACE_SYMS
I64 result;
Bool okay=TRUE;
CLex *lx;
if (!filename)
filename=sys_temp_filename;
lx=LexNew(buf,LF_DONT_FREE_BUF,FileNameAbs(filename));
if (just_load)
lx->flags|=LF_JUST_LOAD;
if (Fs->last_lex!=&Fs->next_lex)
lx->opts=Fs->last_lex->opts|1<<OPTf_REPLACE_SYMS;
QueIns(lx,Fs->last_lex);
try {
Lex(lx);
result=ExeCmdLine(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;
}
}
}
QueRem(lx);
if (okay)
LexDel(lx); //TODO: can crash
return result;
}
I64 ExePrintF2(U8 *fmt,...)
{ //with REPLACE_SYMS
I64 result;
U8 *buf=SPrintFJoin(NULL,fmt,argc,argv);
result=ExePutS2(buf);
Free(buf);
return result;
}
I64 ExeFile2(U8 *name,Bool just_load=FALSE)
{ //with REPLACE_SYMS
I64 result;
U8 *name2=DftExt(name,"CPP.Z"),
*st=MSPrintF("#include \"%s\";",name2);
result=ExePutS2(st,name,just_load);
Free(st);
Free(name2);
return result;
}
I64 ExePutS3(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE)
{ //throws exceptions
I64 result;
CLex *lx;
if (!filename)
filename=sys_temp_filename;
lx=LexNew(buf,LF_DONT_FREE_BUF,FileNameAbs(filename));
if (just_load)
lx->flags|=LF_JUST_LOAD;
if (Fs->last_lex!=&Fs->next_lex)
lx->opts=Fs->last_lex->opts;
QueIns(lx,Fs->last_lex);
Lex(lx);
result=ExeCmdLine(lx);
QueRem(lx);
LexDel(lx);
return result;
}
I64 ExePrintF3(U8 *fmt,...)
{ //throws exceptions
I64 result;
U8 *buf=SPrintFJoin(NULL,fmt,argc,argv);
result=ExePutS3(buf);
Free(buf);
return result;
}
I64 ExeFile3(U8 *name,Bool just_load=FALSE)
{ //throws exceptions
I64 result;
U8 *name2=DftExt(name,"CPP.Z"),
*st=MSPrintF("#include \"%s\";",name2);
result=ExePutS3(st,name,just_load);
Free(st);
Free(name2);
return result;
}
U0 CmpInit()
{
if (!sys_num_installed_compilers++) {
is_first_compiler=TRUE;
fp_prs_stream_blk=&PrsStreamBlk;
} else
is_first_compiler=FALSE;
compiled_lines=0;
compiled_funs=0;
compiled_bytes=0;
cmp_do_not_write_to_dsk=FALSE;
CmpLoadDefines;
CmpFillTables;
MemSet(&opt_nop,0,sizeof(CIntermediateCode));
opt_nop.ic_class=sys_internal_types[IT_I64];
opt_nop.ic_opcode=IC_NOP;
AsmHashLoad(is_first_compiler);
UnasmHashLoad;
}
CmpInit;
+67
View File
@@ -0,0 +1,67 @@
CQueVectU8 *QueVectU8New(I64 min_index=0)
{
CQueVectU8 *result=MAlloc(sizeof(CQueVectU8));
result->next=result->last=result;
result->total_cnt=result->node_cnt=0;
result->min_index=min_index;
return result;
}
U0 QueVectU8Put(CQueVectU8 *v,I64 index,U8 ch)
{
CQueVectU8 *tempv;
index-=v->min_index;
if (index<0) return;
if (index<v->total_cnt) {
tempv=v;
do {
index-=tempv->node_cnt;
if (index<0) {
tempv->body[index+tempv->node_cnt]=ch;
return;
}
tempv=tempv->next;
} while (tempv!=v);
} else
index-=v->total_cnt;
while (TRUE) {
tempv=v->last;
if (tempv->node_cnt>=QUE_VECT_U8_CNT) {
tempv=MAlloc(sizeof(CQueVectU8));
tempv->node_cnt=0;
QueIns(tempv,v->last);
}
if (index--) {
tempv->body[tempv->node_cnt++]=0;
v->total_cnt++;
} else {
tempv->body[tempv->node_cnt++]=ch;
v->total_cnt++;
break;
}
}
}
U0 QueVectU8Del(CQueVectU8 *v)
{
if (v) {
QueDel(v);
Free(v);
}
}
I64 QueVectU8Get(CQueVectU8 *v,I64 index)
{
CQueVectU8 *tempv;
index-=v->min_index;
if (!(0<=index<v->total_cnt)) return 0;
tempv=v;
do {
index-=tempv->node_cnt;
if (index<0)
return tempv->body[index+tempv->node_cnt];
tempv=tempv->next;
} while (tempv!=v);
return 0;
}
+509
View File
@@ -0,0 +1,509 @@
U0 CBPutClass(CHashClass *c)
{
I64 i;
if (!c) return;
if (c->ptr_cnt>4) {
PrintFErr("put_class ptrcnt=%d\n",c->ptr_cnt);
while (TRUE)
//TODO:
Yield;
}
for (i=0;i<c->ptr_cnt;i++)
'*';
c-=c->ptr_cnt;
if (c->str)
"" c->str;
else {
PrintFErr("put_class str=NULL\n");
while (TRUE)
//TODO:
Yield;
}
'' CH_SPACE;
}
U0 CBPutICArg(CICArg *p)
{
if (p->ptype)
"%Z %Z %Z ",
p->type&IT_MASK,"ST_IT_TYPES",
p->ptype&IT_MASK,"ST_IT_TYPES",
p->type>>4,"ST_TY_TYPES";
else
"%Z %Z ",
p->type&IT_MASK,"ST_IT_TYPES",
p->type>>4,"ST_TY_TYPES";
switch (p->type>>4) {
case TY_STK>>4:
"STK";
break;
case TY_IMM>>4:
"#%X",p->disp;
break;
case TY_REG>>4:
"%Z",p->reg,"ST_U64_REGS";
break;
case TY_DISP>>4:
"%X[%Z]",p->disp,p->reg,"ST_U64_REGS";
break;
case TY_RIP_DISP32>>4:
"[%X]",p->disp;
break;
case TY_SIB>>4:
if (p->disp)
"%X",p->disp;
if (p->reg==CREG_RIP)
'[';
else
"[%Z+",p->reg&7,"ST_U64_REGS";
"%Z",p->reg>>8&7,"ST_U64_REGS";
switch (p->reg>>14) {
case 0: "]"; break;
case 1: "*2]"; break;
case 2: "*4]"; break;
case 3: "*8]"; break;
}
break;
}
}
U0 CBPutIC(CIntermediateCode *tempi)
{
I64 opcode=tempi->ic_opcode,i;
if (opcode>=IC_END_EXP && opcode!=IC_NOP1) {
"%15ts %016X ",
DefineSub(opcode,"ST_INTERMEDIATE_CODE")+4,
tempi->ic_data;
if (tempi->r.type&TY_MASK) {
CBPutICArg(&tempi->r);
"<-";
}
if (tempi->p1.type&TY_MASK)
CBPutICArg(&tempi->p1);
',';
if (tempi->p2.type&TY_MASK)
CBPutICArg(&tempi->p2);
',';
if (tempi->p3.type&TY_MASK)
CBPutICArg(&tempi->p3);
'' CH_SPACE;
CBPutClass(tempi->ic_class);
if (tempi->ic_flags & ICF_LOCK)
"$$FG,BROWN$$lock$$FG$$ ";
if (tempi->ic_flags & ICF_P3_TO_F64)
"$$FG,LTBLUE$$p3d$$FG$$ ";
if (tempi->ic_flags & ICF_P3_TO_INT)
"$$FG,GREEN$$p3i$$FG$$ ";
if (tempi->ic_flags & ICF_P2_TO_F64)
"$$FG,LTBLUE$$p2d$$FG$$ ";
if (tempi->ic_flags & ICF_P2_TO_INT)
"$$FG,GREEN$$p2i$$FG$$ ";
if (tempi->ic_flags & ICF_P1_TO_F64)
"$$FG,LTBLUE$$p1d$$FG$$ ";
if (tempi->ic_flags & ICF_P1_TO_INT)
"$$FG,GREEN$$p1i$$FG$$ ";
if (tempi->ic_flags & ICF_R_TO_F64)
"$$FG,LTBLUE$$rd$$FG$$ ";
if (tempi->ic_flags & ICF_R_TO_INT)
"$$FG,GREEN$$ri$$FG$$ ";
if (tempi->ic_flags & ICF_USE_F64)
"[F64] ";
if (tempi->ic_flags & ICF_USE_UNSIGNED)
"[unsigned] ";
if (tempi->ic_flags & ICF_USE_INT)
"[int] ";
if (tempi->ic_flags & ICF_NO_DEPEND_RESULT)
"-DEP ";
if (tempi->ic_flags & ICF_DEPEND_RESULT)
"+DEP ";
if (tempi->ic_flags & ICF_NOT_ADDR)
"NOT_ADDR ";
if (tempi->ic_flags & ICF_PUSH_RESULT)
"PUSH ";
if (tempi->ic_flags & ICF_PUSH_CMP)
"PUSH_CMP ";
if (tempi->ic_flags & ICF_POP_CMP)
"POP_CMP ";
if (tempi->ic_flags & ICF_DEL_PREVIOUS_INS)
"DELINS ";
for (i=0;i<4;i++) {
if (Bt(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0+i))
"DONT_PUSH#%d ",i;
if (Bt(&tempi->ic_flags,ICf_DONT_POP_FLOAT0+i))
"DONT_POP#%d ",i;
}
if (tempi->ic_flags & ICF_ALTERNATE_TEMPLATE)
"ALT_TEMP ";
NewLine;
}
}
CIntermediateCode *CBICAdd(CLex *lx,
I64 opcode_and_precedence,I64 arg, CHashClass *c,I64 flags=0)
{
CIntermediateCode *tempi=lx->cbh.cb_out_ptr;
CCodeBlk *cb,*cb1;
lx->cbh.cb_last_out_ptr=tempi;
tempi->ic_opcode=opcode_and_precedence.u16[0];
tempi->ic_precedence=opcode_and_precedence.u16[1];
tempi->ic_data=arg;
tempi->ic_class=c;
if (Bt(&lx->opts,OPTf_OPT_TRACE)) {
Bts(&lx->flags,Lf_OPT_TRACE_PRESENT);
flags|=ICF_TRACE;
}
if (lx->lock_cnt)
flags|=ICF_LOCK;
tempi->ic_flags=flags;
tempi->ic_line=lx->last_line_num;
tempi->ic_indent_level=lx->indent_level;
if (lx->opts & OPTF_PARSE_TRACE)
CBPutIC(tempi);
tempi++;
if (tempi>=lx->cbh.cb_out_end) {
cb=MAlloc(sizeof(CCodeBlk));
cb->next=NULL;
cb1=lx->cbh.cb_out_last;
cb1->next=lx->cbh.cb_out_last=cb;
tempi=&cb->data;
lx->cbh.cb_out_end=tempi+CB_IC_CNT;
}
lx->cbh.cb_out_ptr=tempi;
return lx->cbh.cb_last_out_ptr;
}
U0 CBOutPtrsInit(CLex *lx)
{
CLexCodeBlkCtrl *tempcbh=&lx->cbh;
CCodeBlk *cb=MAlloc(sizeof(CCodeBlk));
cb->next=NULL;
tempcbh->cb_out_first=tempcbh->cb_out_last=cb;
tempcbh->cb_misc_list=NULL;
tempcbh->cb_misc_list_end=&tempcbh->cb_misc_list;
tempcbh->cb_out_ptr=&cb->data;
tempcbh->cb_out_end=tempcbh->cb_out_ptr+CB_IC_CNT;
tempcbh->cb_last_out_ptr=&cb->data;
}
U0 CBInPtrsInit(CLexCodeBlkCtrl *tempcbh)
{
CCodeBlk *cb=tempcbh->cb_out_first;
tempcbh->cb_in_first=cb;
tempcbh->cb_in_ptr=&cb->data;
tempcbh->cb_in_end=tempcbh->cb_in_ptr+CB_IC_CNT;
}
U0 CBPutAllIC(CLex *lx)
{
CIntermediateCode *tempi;
CBInPtrsInit(&lx->cbh);
tempi=lx->cbh.cb_in_ptr;
while (tempi->ic_opcode) {
if (tempi->ic_flags&ICF_TRACE)
CBPutIC(tempi);
tempi++;
}
}
CIntermediateCode *CBGetIC1(CLexCodeBlkCtrl *lx)
{
CIntermediateCode *tempi=lx->cb_in_ptr,
*tempi1=tempi+1;
CCodeBlk *cb;
if (tempi1>=lx->cb_in_end) {
cb=tempi1(U8 *)-sizeof(CIntermediateCode)*CB_IC_CNT-offset(CCodeBlk.data);
cb=cb->next;
tempi1=&cb->data;
lx->cb_in_end=tempi1+CB_IC_CNT;
}
lx->cb_in_ptr=tempi1;
return tempi;
}
U0 CBPush(CLex *lx)
{
CLexCodeBlkCtrl *tempcbh=MAlloc(sizeof(CLexCodeBlkCtrl));
MemCpy(tempcbh,&lx->cbh,sizeof(CLexCodeBlkCtrl));
if (lx->cbh.cb_misc_list_end==&lx->cbh.cb_misc_list)
tempcbh->cb_misc_list_end=&tempcbh->cb_misc_list;
lx->cbh.cb_next=tempcbh;
}
U0 CBPop(CLex *lx)
{
CLexCodeBlkCtrl *tempcbh=lx->cbh.cb_next;
MemCpy(&lx->cbh,tempcbh,sizeof(CLexCodeBlkCtrl));
if (tempcbh->cb_misc_list_end==&tempcbh->cb_misc_list)
lx->cbh.cb_misc_list_end=&lx->cbh.cb_misc_list;
Free(tempcbh);
}
CCodeBlkMisc *CBGoToLabelFind(CLex *lx,U8 *name)
{
CCodeBlkMisc *mc=lx->cbh.cb_misc_list;
while (mc) {
if (mc->type==CBMT_GOTO_LABEL) {
if (!StrCmp(mc->str,name))
return mc;
}
mc=mc->next;
}
return NULL;
}
CCodeBlkMisc *CBMiscNew(CLex *lx,I64 ty)
{
CCodeBlkMisc *result=CAlloc(sizeof(CCodeBlkMisc));
lx->cbh.cb_misc_list_end->next=result;
lx->cbh.cb_misc_list_end=result;
result->addr=INVALID_PTR;
result->type=ty;
return result;
}
I64 CBFloatConstFind(CLex *lx,F64 d)
{
I64 i;
CCodeBlkMisc *mc=lx->cbh.cb_misc_list;
while (mc) {
if (mc->type==CBMT_FLOAT_CONSTS) {
for (i=0;i<mc->num_consts;i++)
if (mc->float_consts[i]==d)
return mc->addr+i*sizeof(F64);
if (mc->num_consts<CBM_MAX_CONSTS) {
mc->float_consts[mc->num_consts++]=d;
return mc->addr+i*sizeof(F64);
}
}
mc=mc->next;
}
mc=CBMiscNew(lx,CBMT_FLOAT_CONSTS);
mc->float_consts=MAlloc(CBM_MAX_CONSTS*sizeof(F64));
mc->float_consts[mc->num_consts++]=d;
return mc->addr;
}
U0 CBMiscListDel(CLex *lx)
{
CCodeBlkMisc *mc=lx->cbh.cb_misc_list,*mc1;
U8 *undef=NULL;
while (mc) {
mc1=mc->next;
switch (mc->type) {
case CBMT_GOTO_LABEL:
if (!(mc->flags&CBMF_DEFINED)) {
undef=mc->str;
mc->str=NULL;
} else if (!(mc->flags&CBMF_USED)) {
PrintFWarn("%S%s\n","ST_UNUSED_LABEL",mc->str);
LexPutWarn(lx,"ST_UNUSED_LABEL_AT");
}
break;
case CBMT_JMP_TABLE:
Free(mc->jmp_table);
break;
case CBMT_FLOAT_CONSTS:
Free(mc->float_consts);
break;
case CBMT_ARRAY_DIM:
LinkedListDel(mc->dim);
break;
case CBMT_HASH_ENTRY:
HashDel(mc->h);
break;
}
Free(mc->str);
Free(mc);
mc=mc1;
}
if (undef) {
PrintFErr("%S%s\n","ST_UNDEFINED_GOTO_LABEL",undef);
Free(undef);
LexExcept(lx,"ST_UNDEFINED_GOTO_LABEL_AT");
}
}
CLex *CBPopNoFree(CLex *lx)
{
CLexCodeBlkCtrl *tempcbh=lx->cbh.cb_next;
MemCpy(&lx->cbh,tempcbh,sizeof(CLexCodeBlkCtrl));
if (tempcbh->cb_misc_list_end==&tempcbh->cb_misc_list)
lx->cbh.cb_misc_list_end=&lx->cbh.cb_misc_list;
return tempcbh;
}
U0 CBAppend(CLex *lx, CLexCodeBlkCtrl *tempcbh)
{
CIntermediateCode *tempi,*tempi1;
CBInPtrsInit(tempcbh);
do {
tempi=CBGetIC1(tempcbh);
if (tempi->ic_opcode) {
tempi1=CBICAdd(lx,tempi->ic_opcode+tempi->ic_precedence<<16,tempi->ic_data,
tempi->ic_class,tempi->ic_flags);
tempi1->ic_line=tempi->ic_line;
}
} while (tempi->ic_opcode);
LinkedListDel(tempcbh->cb_out_first);
if (tempcbh->cb_misc_list_end!=&tempcbh->cb_misc_list) {
lx->cbh.cb_misc_list_end->next=tempcbh->cb_misc_list;
lx->cbh.cb_misc_list_end=tempcbh->cb_misc_list_end;
}
Free(tempcbh);
}
U0 CBCombine(CLex *lx)
{
CCodeBlk *cb=lx->cbh.cb_out_first,*cb1,*cb2;
I64 i=0,j=sizeof(CIntermediateCode)*CB_IC_CNT;
U8 *ptr;
while (cb) {
i++;
cb=cb->next;
}
if (i>1) {
cb1=MAlloc(i*j+offset(CCodeBlk.data));
cb1->next=NULL;
cb=lx->cbh.cb_out_first;
ptr=&cb1->data;
i--;
while (i--) {
cb2=cb->next;
MemCpy(ptr,&cb->data,j);
ptr+=j;
Free(cb);
cb=cb2;
}
MemCpy(ptr,&cb->data,lx->cbh.cb_out_ptr(I64)-(&cb->data)(I64));
Free(cb);
lx->cbh.cb_out_first=cb1;
}
}
CIndentInfo *CBIndents(CLex *lx)
{
CIndentInfo *result;
I64 i,num_lines=lx->max_line-lx->min_line+1;
result=CAlloc(offset(CIndentInfo.body)+sizeof(U8)*(num_lines+1));
result->min_line=lx->min_line;
result->max_line=lx->max_line;
for (i=0;i<num_lines;i++)
result->body[i]=QueVectU8Get(lx->indent_que_vect,i+lx->min_line);
return result;
}
U8 *CBCompile(CLex *lx,CHashFun *fun_class,
I64 *code_size,CDbgInfo **_dbg,CIndentInfo **_indent,I64 *type=NULL)
{
U8 *result;
COptReg register_offsets[NUM_REGS];
if (_dbg)
*_dbg=NULL;
if (_indent)
*_indent=NULL;
CBCombine(lx);
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT)) {
if (Bt(&lx->pass_trace_mask,0)) {
"$$IV,1$$Before Pass 1:$$IV,0$$\n";
CBPutAllIC(lx);
}
}
lx->pass=1;
OptPass012(lx,fun_class,TRUE);
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT)) {
if (Bt(&lx->pass_trace_mask,1)) {
"$$IV,1$$After Pass 1:$$IV,0$$\n";
CBPutAllIC(lx);
}
}
lx->pass=2;
OptPass012(lx,fun_class,TRUE);
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT)) {
if (Bt(&lx->pass_trace_mask,2)) {
"$$IV,1$$After Pass 2:$$IV,0$$\n";
CBPutAllIC(lx);
}
}
lx->pass=3;
OptPass3(lx,fun_class,register_offsets);
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT)) {
if (Bt(&lx->pass_trace_mask,3)) {
"$$IV,1$$After Pass 3:$$IV,0$$\n";
CBPutAllIC(lx);
}
}
lx->pass=4;
OptPass4(lx,register_offsets,type);
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT)) {
if (Bt(&lx->pass_trace_mask,4)) {
"$$IV,1$$After Pass 4:$$IV,0$$\n";
CBPutAllIC(lx);
}
}
lx->pass=5;
OptPass5(lx);
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT)) {
if (Bt(&lx->pass_trace_mask,5)) {
"$$IV,1$$After Pass 5:$$IV,0$$\n";
CBPutAllIC(lx);
}
}
lx->pass=6;
OptPass6(lx,fun_class);
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT)) {
if (Bt(&lx->pass_trace_mask,6)) {
"$$IV,1$$After Pass 6:$$IV,0$$\n";
CBPutAllIC(lx);
}
}
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT))
if (Bt(&lx->pass_trace_mask,7))
"$$IV,1$$Pass 7:$$IV,0$$\n";
lx->pass=7;
OptPass789A(lx,fun_class,register_offsets,NULL,NULL);
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT))
if (Bt(&lx->pass_trace_mask,8))
"$$IV,1$$Pass 8:$$IV,0$$\n";
lx->pass=8;
OptPass789A(lx,fun_class,register_offsets,NULL,NULL);
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT))
if (Bt(&lx->pass_trace_mask,9))
"$$IV,1$$Pass 9:$$IV,0$$\n";
lx->pass=9;
*code_size=OptPass789A(lx,fun_class,register_offsets,NULL,NULL);
if (lx->flags&LF_STATIC_COMPILE)
result=MAlloc(*code_size);
else
result=MAlloc(*code_size,Fs->code_heap);
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT))
if (Bt(&lx->pass_trace_mask,0xA))
"$$IV,1$$Pass A:$$IV,0$$\n";
lx->pass=0xA;
*code_size=OptPass789A(lx,fun_class,register_offsets,result,_dbg);
compiled_bytes+=*code_size;
if (_indent && lx->indent_que_vect)
*_indent=CBIndents(lx);
LinkedListDel(lx->cbh.cb_out_first);
CBMiscListDel(lx);
if (Bt(&lx->opts,OPTf_COMPILE_TRACE)) {
if (lx->flags&LF_STATIC_COMPILE) {
if (lx->a->seg_size==16)
Un(result,*code_size,16);
else if (lx->a->seg_size==64)
Un(result,*code_size,64);
else
Un(result,*code_size,32);
} else
Un(result,*code_size,64);
}
return result;
}
Binary file not shown.
+84
View File
@@ -0,0 +1,84 @@
#help_index "Compiler/Lex"
#help_file "::/SparrowOS/Doc/Lex"
public extern CLex *LexNew(U8 *buf,I64 flags,U8 *filename=NULL);
public extern U0 LexDel(CLex *lx);
public extern I64 LexSize(CLex *lx);
public extern U0 SetSrcFileInfo(CLex *lx,CHashSrcSym *h);
public extern U0 LexPutToken(CLex *lx);
public extern I64 LexGetChar(CLex *lx);
public extern U0 LexSkipEol(CLex *lx);
public extern U0 LexPush(CLex *lx);
public extern U0 LexPop(CLex *lx);
//public extern U0 LexSubStkPtr(CLex *lx);
public extern I64 Lex(CLex *lx);
public extern U8 *LexExtStr(CLex *lx,I64 *_size=NULL);
public extern U0 LexPutLine(CLex *lx,U8 *start);
public extern U0 LexPutPos(CLex *lx);
public extern U0 LexPutWarn(CLex *lx,U8 *name=NULL,CHashFun *fun_class=NULL);
public extern U0 LexExcept(CLex *lx,U8 *name=NULL,CHashFun *fun_class=NULL);
public extern U8 *CmpExpression(CLex *lx,I64 *type=NULL);
public extern U8 *CmpStatement(CLex *lx,I64 *type);
public extern I64 GetExpression(CLex *lx,U8 **ex); //FALSE=no err
public extern I64 Expression(CLex *lx);
public extern U0 ExpressionDel(U8 *code);
public extern I64 MemberMetaData(U8 *st,CMemberList *ml);
extern U0 MemberListDel(CHashClass *c);
public extern CMemberListMeta *MemberMetaFind(U8 *st,CMemberList *ml);
public extern CMemberList *MemberFind(U8 *st,CHashClass *c);
public extern CMemberList *MemberFind2(CHashClass *pattern,CHashClass *tempc);
public extern U0 LexIncludeDoc(CLex *lx,U8 *filename,CDoc *_doc);
#help_index "Compiler/Directive"
#help_file "::/SparrowOS/Doc/Directives"
public extern U0 StreamPutS(U8 *st);
public extern U0 StreamPrintF(U8 *src,...);
public extern Bool PTrace(Bool val);
public extern Bool OTrace(Bool val);
public extern I64 OPassTraceMask(I64 i=0b1001111101);
public extern Bool OptEqu(I64 num,Bool val);
public extern Bool OptOn(I64 num);
public extern Bool OptOff(I64 num);
public extern Bool GetOpt(I64 num);
public extern Bool CTrace(Bool val);
public extern Bool LTrace(Bool val);
public extern Bool Echo(Bool val);
public extern Bool IsReplaceSyms();
public extern U0 ImportHashTable(CHashTable *tempht);
public extern I64 IncludeDepth();
#help_index "Hash"
extern CHashSrcSym *HashEntryImportCopy(CHashSrcSym *temph);
extern U0 HashTableImport(CHashTable *src,CHashTable *dst);
public extern I64 HashEntrySize(CHashSrcSym *temph);
public extern I64 HashEntrySize2(CHashSrcSym *temph);
public extern I64 HashTableSize2(CHashTable *table);
#help_index "Compiler;Cmd Line (Typically)"
public extern I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv=0);
#help_index "Compiler"
public extern I64 ExePutS(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE);
public extern I64 ExePrintF(U8 *fmt,...);
public extern I64 ExeFile(U8 *name,Bool just_load=FALSE);
public extern I64 ExePutS2(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE);
public extern I64 ExePrintF2(U8 *fmt,...);
public extern I64 ExeFile2(U8 *name,Bool just_load=FALSE);
public extern I64 ExePutS3(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE);
public extern I64 ExePrintF3(U8 *fmt,...);
public extern I64 ExeFile3(U8 *name,Bool just_load=FALSE);
extern CHashTable *asm_hash;
extern U0 CmpInit(Bool first);
extern I64 compiled_lines,compiled_funs,compiled_bytes;
//The following is for benchmarking
extern Bool cmp_do_not_write_to_dsk;
#help_index "Debugging"
public extern U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *branch=NULL);
public extern U8 *U(U8 *ip,I64 cnt=20,I64 seg_size=64);
public extern I64 Un(U8 *ip,I64 cnt=0x80,I64 seg_size=64);
#help_index ""
+762
View File
@@ -0,0 +1,762 @@
$LK+BI,"AsmCodeInstruction ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,824",1$$LK+BI,"","AsmCodeInstruction",2$000000CCC6 0001 0000001423 Funct
$LK+BI,"AsmExpressionEval ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,202",3$$LK+BI,"","AsmExpressionEval",4$000000B2C8 0003 00000000B8 Funct
$LK+BI,"AsmGlblsResolve ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,290",5$$LK+BI,"","AsmGlblsResolve",6$000000B6B0 0001 00000005D7 Funct
$LK+BI,"AsmHashLoad ","FL:::/SparrowOS/Compiler/CmpInit.CPP.Z,77",7$$LK+BI,"","AsmHashLoad",8$0000034BD0 0001 0000000667 Funct
$LK+BI,"AsmLineList ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,29",9$$LK+BI,"","AsmLineList",10$000000ACC0 0001 0000000143 Funct
$LK+BI,"AsmLocalsResolve ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,224",11$$LK+BI,"","AsmLocalsResolve",12$000000B380 0003 0000000329 Funct
$LK+BI,"AsmMakeArgMask ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,601",13$$LK+BI,"","AsmMakeArgMask",14$000000C250 0002 000000045D Funct
$LK+BI,"AsmPrsInsFlags ","FL:::/SparrowOS/Compiler/CmpInit.CPP.Z,27",15$$LK+BI,"","AsmPrsInsFlags",16$0000034370 0001 000000085D Funct
$LK+BI,"AsmReserveCodeTo ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,185",17$$LK+BI,"","AsmReserveCodeTo",18$000000B248 0001 000000007D Funct
$LK+BI,"AsmStoreCodeU32 ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,90",19$$LK+BI,"","AsmStoreCodeU32",20$000000AF08 0001 0000000149 Funct
$LK+BI,"AsmStoreCodeU64 ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,129",21$$LK+BI,"","AsmStoreCodeU64",22$000000B058 0005 000000014A Funct
$LK+BI,"AsmStoreCodeU8 ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,61",23$$LK+BI,"","AsmStoreCodeU8",24$000000AE08 001C 00000000FF Funct
$LK+BI,"AsmStoreCodeU8At ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,168",25$$LK+BI,"","AsmStoreCodeU8At",26$000000B1A8 0016 00000000A0 Funct
$LK+BI,"AsmStoreNum ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,685",27$$LK+BI,"","AsmStoreNum",28$000000C6B0 0004 000000060E Funct
$LK+BI,"AsmUnresolvedAdd ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,1",29$$LK+BI,"","AsmUnresolvedAdd",30$000000ABE0 0008 00000000DF Funct
$LK+BI,"CBAppend ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,336",31$$LK+BI,"","CBAppend",32$0000009F28 0002 000000009D Funct
$LK+BI,"CBCombine ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,357",33$$LK+BI,"","CBCombine",34$0000009FC8 0001 00000000EA Funct
$LK+BI,"CBCompile ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,397",35$$LK+BI,"","CBCompile",36$000000A128 0006 00000004D6 Funct
$LK+BI,"CBFloatConstFind ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,265",37$$LK+BI,"","CBFloatConstFind",38$0000009C88 000F 00000000BE Funct
$LK+BI,"CBGetIC1 ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,209",39$$LK+BI,"","CBGetIC1",40$0000009AE8 0004 000000004C Funct
$LK+BI,"CBGoToLabelFind ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,242",41$$LK+BI,"","CBGoToLabelFind",42$0000009BF0 0002 0000000048 Funct
$LK+BI,"CBICAdd ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,142",43$$LK+BI,"","CBICAdd",44$00000098F8 00B9 0000000104 Funct
$LK+BI,"CBInPtrsInit ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,189",45$$LK+BI,"","CBInPtrsInit",46$0000009A70 0003 0000000030 Funct
$LK+BI,"CBIndents ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,385",47$$LK+BI,"","CBIndents",48$000000A0B8 0001 0000000069 Funct
$LK+BI,"CBMiscListDel ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,287",49$$LK+BI,"","CBMiscListDel",50$0000009D48 0001 000000018D Funct
$LK+BI,"CBMiscNew ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,255",51$$LK+BI,"","CBMiscNew",52$0000009C38 001A 000000004A Funct
$LK+BI,"CBOutPtrsInit ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,176",53$$LK+BI,"","CBOutPtrsInit",54$0000009A00 000A 000000006C Funct
$LK+BI,"CBPop ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,233",55$$LK+BI,"","CBPop",56$0000009B98 0009 0000000051 Funct
$LK+BI,"CBPopNoFree ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,327",57$$LK+BI,"","CBPopNoFree",58$0000009ED8 0001 000000004E Funct
$LK+BI,"CBPush ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,224",59$$LK+BI,"","CBPush",60$0000009B38 000E 000000005D Funct
$LK+BI,"CBPutAllIC ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,197",61$$LK+BI,"","CBPutAllIC",62$0000009AA0 0007 0000000043 Funct
$LK+BI,"CBPutClass ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,1",63$$LK+BI,"","CBPutClass",64$0000009170 0001 00000000C5 Funct
$LK+BI,"CBPutIC ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,71",65$$LK+BI,"","CBPutIC",66$0000009530 0006 00000003C7 Funct
$LK+BI,"CBPutICArg ","FL:::/SparrowOS/Compiler/CodeGen.CPP.Z,26",67$$LK+BI,"","CBPutICArg",68$0000009238 0004 00000002F3 Funct
$LK,"CInternalType ","FL:::/SparrowOS/Compiler/CmpInit.CPP.Z,4"$007FC16010 0002 000000000A Class
CMP_OPT_NOP 0000000000 0003 ExportSysSym
$LK,"CMP_TEMPLATES ","FL:::/SparrowOS/Compiler/CmpAsm.CPP.Z,164"$0000000206 0001 ExportSysSym
$LK,"CMP_TEMPLATES_DONT_POP ","FL:::/SparrowOS/Compiler/CmpAsm.CPP.Z,337"$000000039B 0001 ExportSysSym
$LK,"CMP_TEMPLATES_DONT_PUSH ","FL:::/SparrowOS/Compiler/CmpAsm.CPP.Z,426"$0000000467 0001 ExportSysSym
$LK,"CMP_TEMPLATES_DONT_PUSH2 ","FL:::/SparrowOS/Compiler/CmpAsm.CPP.Z,617"$000000063D 0001 ExportSysSym
$LK,"CMP_TEMPLATES_DONT_PUSH_POP","FL:::/SparrowOS/Compiler/CmpAsm.CPP.Z,553"$00000005AD 0001 ExportSysSym
$LK,"CN_MAIN ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,220"$0 0028 0000000008 DefineStr
$LK,"CN_P1 ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,221"$1 000A 0000000008 DefineStr
$LK,"CN_P2 ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,222"$2 0007 0000000008 DefineStr
$LK,"CN_P3 ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,223"$3 0003 0000000008 DefineStr
$LK,"CN_R ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,224"$4 0003 0000000008 DefineStr
$LK,"CSwitchCase ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,1424"$007FC374B0 0004 0000000018 Class
$LK+BI,"CTrace ","FL:::/SparrowOS/Compiler/Directives.CPP.Z,38",69$$LK+BI,"","CTrace",70$0000003AE8 0000 0000000017 Funct
$LK,"CVI2 ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,214"$007FC3A830 0003 0000000010 Class
$LK+BI,"Cmp ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,372",71$$LK+BI,"","Cmp",72$0000038E20 0000 0000000598 Funct
$LK+BI,"CmpBuf ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,179",73$$LK+BI,"","CmpBuf",74$00000386F0 0001 00000000F7 Funct
$LK+BI,"CmpExpression ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,1262",75$$LK+BI,"","CmpExpression",76$000001330E 0004 00000000BB Funct
$LK+BI,"CmpF1PushPop ","FL:::/SparrowOS/Compiler/OptPass3.CPP.Z,23",77$$LK+BI,"","CmpF1PushPop",78$000002C218 0002 0000000033 Funct
$LK+BI,"CmpF2PushPop ","FL:::/SparrowOS/Compiler/OptPass3.CPP.Z,29",79$$LK+BI,"","CmpF2PushPop",80$000002C250 0005 0000000080 Funct
$LK+BI,"CmpFillTables ","FL:::/SparrowOS/Compiler/CmpInit.CPP.Z,577",81$$LK+BI,"","CmpFillTables",82$0000037870 0001 000000064C Funct
$LK+BI,"CmpFixUpJITAsm ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,198",83$$LK+BI,"","CmpFixUpJITAsm",84$00000387E8 0000 00000003D8 Funct
$LK+BI,"CmpFixUpStaticAsm ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,306",85$$LK+BI,"","CmpFixUpStaticAsm",86$0000038BC0 0000 000000025B Funct
$LK+BI,"CmpInit ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,667",87$$LK+BI,"","CmpInit",88$0000039978 0001 00000000B9 Funct
$LK+BI,"CmpJoin ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,60",89$$LK+BI,"","CmpJoin",90$00000380A8 0001 0000000642 Funct
$LK+BI,"CmpLoadDefines ","FL:::/SparrowOS/Compiler/CmpInit.CPP.Z,222",91$$LK+BI,"","CmpLoadDefines",92$0000035238 0001 0000002634 Funct
$LK+BI,"CmpNoteFloatOp ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,226",93$$LK+BI,"","CmpNoteFloatOp",94$0000018F56 000E 0000000251 Funct
$LK+BI,"CmpOffset2Reg ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,133",95$$LK+BI,"","CmpOffset2Reg",96$000002719E 0005 0000000042 Funct
$LK+BI,"CmpPType ","FL:::/SparrowOS/Compiler/OptPass3.CPP.Z,11",97$$LK+BI,"","CmpPType",98$000002C1D8 0006 000000003F Funct
$LK+BI,"CmpPmt ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,1",99$$LK+BI,"","CmpPmt",100$0000003C28 0001 0000000209 Funct
$LK+BI,"CmpSetFloatOpPushPop ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,281",101$$LK+BI,"","CmpSetFloatOpPushPop",102$00000191AE 000E 000000007B Funct
$LK+BI,"CmpStatement ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,24",103$$LK+BI,"","CmpStatement",104$0000037F58 0001 000000014C Funct
$LK+BI,"CmpType ","FL:::/SparrowOS/Compiler/OptPass3.CPP.Z,1",105$$LK+BI,"","CmpType",106$000002C1A0 0007 0000000031 Funct
$LK+BI,"DefineU8s ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,1233",107$$LK+BI,"","DefineU8s",108$000000E0EE 0004 00000002D6 Funct
$LK+BI,"Echo ","FL:::/SparrowOS/Compiler/Directives.CPP.Z,48",109$$LK+BI,"","Echo",110$0000003B18 0000 0000000017 Funct
$LK+BI,"ExeFile ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,564",111$$LK+BI,"","ExeFile",112$0000039550 0000 0000000075 Funct
$LK+BI,"ExeFile2 ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,616",113$$LK+BI,"","ExeFile2",114$0000039770 0000 0000000075 Funct
$LK+BI,"ExeFile3 ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,656",115$$LK+BI,"","ExeFile3",116$0000039900 0000 0000000075 Funct
$LK+BI,"ExePrintF ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,555",117$$LK+BI,"","ExePrintF",118$0000039508 0000 0000000043 Funct
$LK+BI,"ExePrintF2 ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,607",119$$LK+BI,"","ExePrintF2",120$0000039728 0000 0000000043 Funct
$LK+BI,"ExePrintF3 ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,646",121$$LK+BI,"","ExePrintF3",122$00000398B8 0000 0000000043 Funct
$LK+BI,"ExePutS ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,523",123$$LK+BI,"","ExePutS",124$00000393B8 0002 000000014F Funct
$LK+BI,"ExePutS2 ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,575",125$$LK+BI,"","ExePutS2",126$00000395C8 0002 000000015F Funct
$LK+BI,"ExePutS3 ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,627",127$$LK+BI,"","ExePutS3",128$00000397E8 0002 00000000CA Funct
$LK+BI,"Expression ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,1287",129$$LK+BI,"","Expression",130$00000133FE 0007 000000003B Funct
$LK+BI,"ExpressionDel ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,370",131$$LK+BI,"","ExpressionDel",132$0000005904 000B 0000000014 Funct
$LK,"FBO1_F64 ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,3"$2 0002 0000000008 DefineStr
$LK,"FBO1_INT ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,2"$1 0013 0000000008 DefineStr
$LK,"FBO1_NOT_CONST ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,1"$0 0004 0000000008 DefineStr
$LK+BI,"GetExpression ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,1282",133$$LK+BI,"","GetExpression",134$00000133CE 0000 0000000029 Funct
$LK+BI,"GetOpt ","FL:::/SparrowOS/Compiler/Directives.CPP.Z,16",135$$LK+BI,"","GetOpt",136$0000003A50 0005 000000002B Funct
$LK+BI,"HashEntryImportCopy ","FL:::/SparrowOS/Compiler/Hash1b.CPP.Z,1",137$$LK+BI,"","HashEntryImportCopy",138$000000A600 0002 0000000167 Funct
$LK+BI,"HashEntrySize ","FL:::/SparrowOS/Compiler/Hash1b.CPP.Z,72",139$$LK+BI,"","HashEntrySize",140$000000A850 0000 0000000165 Funct
$LK+BI,"HashEntrySize2 ","FL:::/SparrowOS/Compiler/Hash1b.CPP.Z,103",141$$LK+BI,"","HashEntrySize2",142$000000A9B8 0002 00000001B6 Funct
$LK+BI,"HashTableImport ","FL:::/SparrowOS/Compiler/Hash1b.CPP.Z,41",143$$LK+BI,"","HashTableImport",144$000000A768 0000 00000000E8 Funct
$LK+BI,"HashTableSize2 ","FL:::/SparrowOS/Compiler/Hash1b.CPP.Z,142",145$$LK+BI,"","HashTableSize2",146$000000AB70 0000 000000006B Funct
$LK+BI,"ICAddConst ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,947",147$$LK+BI,"","ICAddConst",148$000001AE56 000C 00000008B6 Funct
$LK+BI,"ICAddEct ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,882",149$$LK+BI,"","ICAddEct",150$000001AAF6 0005 000000035E Funct
$LK+BI,"ICAddRSP ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,163",151$$LK+BI,"","ICAddRSP",152$0000018CCE 0016 0000000286 Funct
$LK+BI,"ICAddSubEctEqual ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2754",153$$LK+BI,"","ICAddSubEctEqual",154$0000020216 0005 000000073F Funct
$LK+BI,"ICAndAnd ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3050",155$$LK+BI,"","ICAndAnd",156$0000020FDE 0001 0000000149 Funct
$LK+BI,"ICAndBranch ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4033",157$$LK+BI,"","ICAndBranch",158$0000023BDE 0002 000000078D Funct
$LK+BI,"ICAndEqual ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4784",159$$LK+BI,"","ICAndEqual",160$0000025EB6 0001 0000000109 Funct
$LK+BI,"ICAssign ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4202",161$$LK+BI,"","ICAssign",162$000002436E 0001 000000030F Funct
$LK+BI,"ICAssignPostIncDec ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3677",163$$LK+BI,"","ICAssignPostIncDec",164$0000022CCE 0002 0000000248 Funct
$LK+BI,"ICBEqu ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3420",165$$LK+BI,"","ICBEqu",166$00000220BE 0001 0000000256 Funct
$LK+BI,"ICBitOps ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3298",167$$LK+BI,"","ICBitOps",168$0000021ADE 000B 00000005DE Funct
$LK+BI,"ICBrBitOps ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4252",169$$LK+BI,"","ICBrBitOps",170$000002467E 0008 0000000AC9 Funct
$LK+BI,"ICBuiltInFloatConst ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,607",171$$LK+BI,"","ICBuiltInFloatConst",172$0000019DEE 000F 00000000BD Funct
$LK+BI,"ICCmp ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3178",173$$LK+BI,"","ICCmp",174$00000215F6 0006 00000004E6 Funct
$LK+BI,"ICCmpAndBranch ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3719",175$$LK+BI,"","ICCmpAndBranch",176$0000022F16 000C 0000000936 Funct
$LK+BI,"ICColon ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3144",177$$LK+BI,"","ICColon",178$00000213E6 0001 000000020F Funct
$LK+BI,"ICCopyTemplate ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,293",179$$LK+BI,"","ICCopyTemplate",180$000001922E 0019 0000000286 Funct
$LK+BI,"ICDeref ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,864",181$$LK+BI,"","ICDeref",182$000001AA3E 0001 00000000B5 Funct
$LK+BI,"ICDerefPostIncDec ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3634",183$$LK+BI,"","ICDerefPostIncDec",184$0000022A9E 0002 000000022B Funct
$LK+BI,"ICDiv ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2662",185$$LK+BI,"","ICDiv",186$000001FD46 0001 00000000F2 Funct
$LK+BI,"ICDivEqual ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2681",187$$LK+BI,"","ICDivEqual",188$000001FE3E 0002 00000002E0 Funct
$LK+BI,"ICFAdd ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2533",189$$LK+BI,"","ICFAdd",190$000001F61E 0001 00000001FB Funct
$LK+BI,"ICFCmp ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,1651",191$$LK+BI,"","ICFCmp",192$000001CD1E 0004 0000000188 Funct
$LK+BI,"ICFCmpAndBranch ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2082",193$$LK+BI,"","ICFCmpAndBranch",194$000001E30E 0004 0000000A6E Funct
$LK+BI,"ICFCvt ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,1217",195$$LK+BI,"","ICFCvt",196$000001BB66 0014 0000000188 Funct
$LK+BI,"ICFCvt2 ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,1265",197$$LK+BI,"","ICFCvt2",198$000001BCEE 0010 0000000122 Funct
$LK+BI,"ICFDiv ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2509",199$$LK+BI,"","ICFDiv",200$000001F4DE 0001 000000013D Funct
$LK+BI,"ICFMod ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,1343",201$$LK+BI,"","ICFMod",202$000001BFFE 0001 0000000142 Funct
$LK+BI,"ICFModEqual ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,1691",203$$LK+BI,"","ICFModEqual",204$000001CEA6 0001 00000003FA Funct
$LK+BI,"ICFMul ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2469",205$$LK+BI,"","ICFMul",206$000001F2A6 0001 0000000235 Funct
$LK+BI,"ICFOp ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,1452",207$$LK+BI,"","ICFOp",208$000001C436 0004 00000008E5 Funct
$LK+BI,"ICFOpEqual ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,1758",209$$LK+BI,"","ICFOpEqual",210$000001D2A6 0004 0000001066 Funct
$LK+BI,"ICFPostIncDec ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2383",211$$LK+BI,"","ICFPostIncDec",212$000001EE8E 0002 0000000151 Funct
$LK+BI,"ICFPow ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,1373",213$$LK+BI,"","ICFPow",214$000001C146 0001 00000002ED Funct
$LK+BI,"ICFPreIncDec ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2361",215$$LK+BI,"","ICFPreIncDec",216$000001ED7E 0002 000000010A Funct
$LK+BI,"ICFSub ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2571",217$$LK+BI,"","ICFSub",218$000001F81E 0001 0000000120 Funct
$LK+BI,"ICFTemplateFun ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3541",219$$LK+BI,"","ICFTemplateFun",220$00000225A6 0007 00000000A8 Funct
$LK+BI,"ICFUnaryMinus ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,1292",221$$LK+BI,"","ICFUnaryMinus",222$000001BE16 0001 00000001E8 Funct
$LK+BI,"ICLastIns ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,135",223$$LK+BI,"","ICLastIns",224$0000018C26 0002 00000000A1 Funct
$LK+BI,"ICLea ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,821",225$$LK+BI,"","ICLea",226$000001A806 0004 0000000233 Funct
$LK+BI,"ICLimit ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4547",227$$LK+BI,"","ICLimit",228$0000025546 0002 0000000227 Funct
$LK+BI,"ICLocalVarInit ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4941",229$$LK+BI,"","ICLocalVarInit",230$0000026606 0001 0000000078 Funct
$LK+BI,"ICMemCpy ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4953",231$$LK+BI,"","ICMemCpy",232$000002667E 0001 000000047C Funct
$LK+BI,"ICMemSet ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,5055",233$$LK+BI,"","ICMemSet",234$0000026AFE 0001 000000032C Funct
$LK+BI,"ICMinMax ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4605",235$$LK+BI,"","ICMinMax",236$000002576E 0004 00000002B7 Funct
$LK+BI,"ICMod ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2735",237$$LK+BI,"","ICMod",238$000002011E 0001 00000000F2 Funct
$LK+BI,"ICModU64 ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4684",239$$LK+BI,"","ICModU64",240$0000025A76 0001 00000001BB Funct
$LK+BI,"ICModr ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,348",241$$LK+BI,"","ICModr",242$00000194B6 0018 0000000331 Funct
$LK+BI,"ICMov ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,630",243$$LK+BI,"","ICMov",244$0000019EAE 01DD 0000000957 Funct
$LK+BI,"ICMul ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2411",245$$LK+BI,"","ICMul",246$000001EFE6 0001 00000002BA Funct
$LK+BI,"ICMulEqual ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2594",247$$LK+BI,"","ICMulEqual",248$000001F93E 0001 0000000408 Funct
$LK+BI,"ICNot ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3021",249$$LK+BI,"","ICNot",250$0000020E6E 0001 000000016E Funct
$LK+BI,"ICOpSizeRex ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,46",251$$LK+BI,"","ICOpSizeRex",252$000001884E 0006 0000000121 Funct
$LK+BI,"ICOr ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,597",253$$LK+BI,"","ICOr",254$0000019D9E 000F 000000004A Funct
$LK+BI,"ICOrEqual ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4807",255$$LK+BI,"","ICOrEqual",256$0000025FC6 0001 0000000109 Funct
$LK+BI,"ICOrOr ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3079",257$$LK+BI,"","ICOrOr",258$000002112E 0001 000000015E Funct
$LK+BI,"ICPop ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,548",259$$LK+BI,"","ICPop",260$0000019BD6 000A 000000010B Funct
$LK+BI,"ICPopRegs ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,575",261$$LK+BI,"","ICPopRegs",262$0000019CE6 000F 0000000054 Funct
$LK+BI,"ICPostIncDec ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3594",263$$LK+BI,"","ICPostIncDec",264$0000022866 0002 0000000237 Funct
$LK+BI,"ICPreIncDec ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3557",265$$LK+BI,"","ICPreIncDec",266$000002264E 0004 0000000213 Funct
$LK+BI,"ICPreempt ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3474",267$$LK+BI,"","ICPreempt",268$0000022316 0001 0000000122 Funct
$LK+BI,"ICPush ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,497",269$$LK+BI,"","ICPush",270$00000199B6 0020 00000001C1 Funct
$LK+BI,"ICPushRegs ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,535",271$$LK+BI,"","ICPushRegs",272$0000019B7E 000A 0000000052 Funct
$LK+BI,"ICQueInit ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4435",273$$LK+BI,"","ICQueInit",274$000002514E 0001 0000000070 Funct
$LK+BI,"ICQueIns ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4449",275$$LK+BI,"","ICQueIns",276$00000251BE 0001 0000000179 Funct
$LK+BI,"ICQueInsRev ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4490",277$$LK+BI,"","ICQueInsRev",278$000002533E 0001 0000000179 Funct
$LK+BI,"ICQueRem ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4531",279$$LK+BI,"","ICQueRem",280$00000254BE 0001 0000000088 Funct
$LK+BI,"ICRex ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,32",281$$LK+BI,"","ICRex",282$00000187C6 0017 0000000088 Funct
$LK+BI,"ICShift ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2910",283$$LK+BI,"","ICShift",284$0000020956 0004 0000000196 Funct
$LK+BI,"ICShiftEqual ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,2944",285$$LK+BI,"","ICShiftEqual",286$0000020AEE 0002 000000030D Funct
$LK+BI,"ICSlashOp ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,460",287$$LK+BI,"","ICSlashOp",288$00000197EE 0027 00000001C4 Funct
$LK+BI,"ICSqr ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4677",289$$LK+BI,"","ICSqr",290$0000025A26 0002 000000004A Funct
$LK+BI,"ICSub ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,1130",291$$LK+BI,"","ICSub",292$000001B70E 0001 0000000454 Funct
$LK+BI,"ICSwap ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4726",293$$LK+BI,"","ICSwap",294$0000025C36 0001 000000027C Funct
$LK+BI,"ICSwitch ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4854",295$$LK+BI,"","ICSwitch",296$00000261DE 0002 0000000427 Funct
$LK+BI,"ICTestAndBranch ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3938",297$$LK+BI,"","ICTestAndBranch",298$000002384E 0002 0000000273 Funct
$LK+BI,"ICToBool ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3526",299$$LK+BI,"","ICToBool",300$000002252E 0001 0000000071 Funct
$LK+BI,"ICToF64 ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3521",301$$LK+BI,"","ICToF64",302$00000224EE 0001 000000003D Funct
$LK+BI,"ICToI64 ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3516",303$$LK+BI,"","ICToI64",304$00000224AE 0001 000000003D Funct
$LK+BI,"ICToUpper ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3505",305$$LK+BI,"","ICToUpper",306$000002243E 0001 000000006B Funct
$LK+BI,"ICU16 ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,72",307$$LK+BI,"","ICU16",308$0000018976 0099 00000000AF Funct
$LK+BI,"ICU24 ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,87",309$$LK+BI,"","ICU24",310$0000018A26 0067 00000000DA Funct
$LK+BI,"ICU32 ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,104",311$$LK+BI,"","ICU32",312$0000018B06 007B 0000000089 Funct
$LK+BI,"ICU64 ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,120",313$$LK+BI,"","ICU64",314$0000018B96 0009 0000000089 Funct
$LK+BI,"ICU8 ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,20",315$$LK+BI,"","ICU8",316$000001873E 0089 0000000083 Funct
$LK+BI,"ICUnaries ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3012",317$$LK+BI,"","ICUnaries",318$0000020DFE 0002 0000000069 Funct
$LK+BI,"ICXorEqual ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,4830",319$$LK+BI,"","ICXorEqual",320$00000260D6 0001 0000000103 Funct
$LK+BI,"ICXorXor ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3111",321$$LK+BI,"","ICXorXor",322$000002128E 0001 0000000153 Funct
$LK+BI,"ICZFlagBranch ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,3997",323$$LK+BI,"","ICZFlagBranch",324$0000023AC6 0002 0000000112 Funct
$LK+BI,"ICZero ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,588",325$$LK+BI,"","ICZero",326$0000019D3E 0018 000000005E Funct
$LK+BI,"ImportHashTable ","FL:::/SparrowOS/Compiler/Directives.CPP.Z,56",327$$LK+BI,"","ImportHashTable",328$0000003B40 0000 00000000B3 Funct
$LK+BI,"IncludeDepth ","FL:::/SparrowOS/Compiler/Directives.CPP.Z,75",329$$LK+BI,"","IncludeDepth",330$0000003BF8 0000 000000002C Funct
$LK+BI,"InstEntriesCompare ","FL:::/SparrowOS/Compiler/Unassembler.CPP.Z,1",331$$LK+BI,"","InstEntriesCompare",332$0000000A18 0001 0000000227 Funct
$LK+BI,"IsReplaceSyms ","FL:::/SparrowOS/Compiler/Directives.CPP.Z,52",333$$LK+BI,"","IsReplaceSyms",334$0000003B30 000A 000000000D Funct
$LK+BI,"LTrace ","FL:::/SparrowOS/Compiler/Directives.CPP.Z,43",335$$LK+BI,"","LTrace",336$0000003B00 0000 0000000017 Funct
$LK+BI,"Lex ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,794",337$$LK+BI,"","Lex",338$00000067B0 00FC 00000025F4 Funct
$LK+BI,"LexBackupLastChar ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,140",339$$LK+BI,"","LexBackupLastChar",340$000000423C 0003 000000003D Funct
$LK+BI,"LexDel ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,65",341$$LK+BI,"","LexDel",342$0000003F80 0005 000000008D Funct
$LK+BI,"LexDocRead ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,406",343$$LK+BI,"","LexDocRead",344$00000059C0 0001 0000000090 Funct
$LK+BI,"LexDollar ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,151",345$$LK+BI,"","LexDollar",346$000000427C 0003 000000006C Funct
$LK+BI,"LexExcept ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,1683",347$$LK+BI,"","LexExcept",348$00000090B0 009D 00000000B9 Funct
$LK+BI,"LexExtStr ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,1602",349$$LK+BI,"","LexExtStr",350$0000008DA8 0004 00000000DB Funct
$LK+BI,"LexGetChar ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,165",351$$LK+BI,"","LexGetChar",352$00000042EC 0030 00000015EE Funct
$LK+BI,"LexInStr ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,696",353$$LK+BI,"","LexInStr",354$0000006280 0001 000000052C Funct
$LK+BI,"LexIncludeDoc ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,424",355$$LK+BI,"","LexIncludeDoc",356$0000005A50 0001 0000000162 Funct
$LK+BI,"LexIncludeStr ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,375",357$$LK+BI,"","LexIncludeStr",358$000000591C 0003 0000000095 Funct
$LK+BI,"LexNew ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,36",359$$LK+BI,"","LexNew",360$0000003E38 0005 0000000141 Funct
$LK+BI,"LexPop ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,487",361$$LK+BI,"","LexPop",362$0000005C48 0004 000000007E Funct
$LK+BI,"LexPush ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,475",363$$LK+BI,"","LexPush",364$0000005BB8 000F 0000000090 Funct
$LK+BI,"LexPutLine ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,1627",365$$LK+BI,"","LexPutLine",366$0000008E88 0003 000000009D Funct
$LK+BI,"LexPutPos ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,1654",367$$LK+BI,"","LexPutPos",368$0000008F28 0003 00000000AF Funct
$LK+BI,"LexPutToken ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,117",369$$LK+BI,"","LexPutToken",370$0000004128 0002 0000000110 Funct
$LK+BI,"LexPutWarn ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,1667",371$$LK+BI,"","LexPutWarn",372$0000008FD8 0011 00000000D3 Funct
$LK+BI,"LexSize ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,85",373$$LK+BI,"","LexSize",374$0000004010 0000 0000000098 Funct
$LK+BI,"LexSkipEol ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,363",375$$LK+BI,"","LexSkipEol",376$00000058DC 0004 0000000026 Funct
$LK+BI,"MemberAdd ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,556",377$$LK+BI,"","MemberAdd",378$0000005DF0 0004 00000001AE Funct
$LK+BI,"MemberFind ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,521",379$$LK+BI,"","MemberFind",380$0000005D48 0005 0000000063 Funct
$LK+BI,"MemberFind2 ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,541",381$$LK+BI,"","MemberFind2",382$0000005DB0 0001 0000000040 Funct
$LK+BI,"MemberListCopy ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,641",383$$LK+BI,"","MemberListCopy",384$0000006098 0001 0000000118 Funct
$LK+BI,"MemberListDel ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,604",385$$LK+BI,"","MemberListDel",386$0000005FA0 0001 00000000F1 Funct
$LK+BI,"MemberListNew ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,81",387$$LK+BI,"","MemberListNew",388$00000135AE 0003 0000000026 Funct
$LK+BI,"MemberListSize ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,669",389$$LK+BI,"","MemberListSize",390$00000061B0 0002 00000000CB Funct
$LK+BI,"MemberMetaData ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,499",391$$LK+BI,"","MemberMetaData",392$0000005CC8 0000 000000003D Funct
$LK+BI,"MemberMetaFind ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,510",393$$LK+BI,"","MemberMetaFind",394$0000005D08 0000 000000003C Funct
$LK,"NUM_INTERNAL_TYPES ","FL:::/SparrowOS/Compiler/CmpInit.CPP.Z,1"$16 0002 0000000008 DefineStr
$LK+BI,"OPassTraceMask ","FL:::/SparrowOS/Compiler/Directives.CPP.Z,31",395$$LK+BI,"","OPassTraceMask",396$0000003AB0 0000 0000000035 Funct
$LK+BI,"OTrace ","FL:::/SparrowOS/Compiler/Directives.CPP.Z,26",397$$LK+BI,"","OTrace",398$0000003A98 0000 0000000017 Funct
$LK+BI,"OptBrNotZero ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,374",399$$LK+BI,"","OptBrNotZero",400$0000027B48 0004 00000006C3 Funct
$LK+BI,"OptBrZero ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,209",401$$LK+BI,"","OptBrZero",402$0000027480 0006 00000006C3 Funct
$LK+BI,"OptEnd ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,165",403$$LK+BI,"","OptEnd",404$0000027360 0005 000000006F Funct
$LK+BI,"OptEqu ","FL:::/SparrowOS/Compiler/Directives.CPP.Z,1",405$$LK+BI,"","OptEqu",406$00000039D8 0007 0000000045 Funct
$LK+BI,"OptFixSizeOf ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,538",407$$LK+BI,"","OptFixSizeOf",408$0000028210 0003 00000000CC Funct
$LK+BI,"OptFixupBinaryOp1 ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,6",409$$LK+BI,"","OptFixupBinaryOp1",410$0000026E2E 0013 0000000223 Funct
$LK+BI,"OptFixupBinaryOp2 ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,80",411$$LK+BI,"","OptFixupBinaryOp2",412$0000027056 0001 0000000058 Funct
$LK+BI,"OptFixupUnaryOp ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,96",413$$LK+BI,"","OptFixupUnaryOp",414$00000270AE 0003 00000000EF Funct
$LK+BI,"OptIC4 ","FL:::/SparrowOS/Compiler/OptPass4.CPP.Z,1",415$$LK+BI,"","OptIC4",416$000002DCB0 0001 0000000826 Funct
$LK+BI,"OptIC6 ","FL:::/SparrowOS/Compiler/OptPass6.CPP.Z,1",417$$LK+BI,"","OptIC6",418$00000300B0 0001 0000000162 Funct
$LK+BI,"OptLag ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,175",419$$LK+BI,"","OptLag",420$00000273D0 0004 0000000030 Funct
$LK+BI,"OptLag1 ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,186",421$$LK+BI,"","OptLag1",422$0000027400 0005 000000003A Funct
$LK+BI,"OptLead1 ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,197",423$$LK+BI,"","OptLead1",424$0000027440 0002 0000000039 Funct
$LK+BI,"OptMVCompare ","FL:::/SparrowOS/Compiler/OptPass3.CPP.Z,46",425$$LK+BI,"","OptMVCompare",426$000002C2D0 0001 000000001A Funct
$LK,"OptMemberVar ","FL:::/SparrowOS/Compiler/OptPass3.CPP.Z,41"$007FC1C8B0 0005 0000000020 Class
$LK+BI,"OptMissing ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,142",427$$LK+BI,"","OptMissing",428$00000271E6 0004 0000000070 Funct
$LK,"OptNext ","FL:::/SparrowOS/Compiler/CmpAsm.CPP.Z,686"$0000000098 0002 Funct
$LK,"OptNext2 ","FL:::/SparrowOS/Compiler/CmpAsm.CPP.Z,689"$000000010A 0001 Funct
$LK,"OptNext3 ","FL:::/SparrowOS/Compiler/CmpAsm.CPP.Z,692"$000000017C 0001 Funct
$LK+BI,"OptOff ","FL:::/SparrowOS/Compiler/Directives.CPP.Z,11",429$$LK+BI,"","OptOff",430$0000003A38 0000 0000000016 Funct
$LK+BI,"OptOn ","FL:::/SparrowOS/Compiler/Directives.CPP.Z,6",431$$LK+BI,"","OptOn",432$0000003A20 0000 0000000016 Funct
$LK+BI,"OptPass012 ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,564",433$$LK+BI,"","OptPass012",434$00000282E0 0000 0000003EB9 Funct
$LK+BI,"OptPass3 ","FL:::/SparrowOS/Compiler/OptPass3.CPP.Z,51",435$$LK+BI,"","OptPass3",436$000002C2F0 0000 00000019BF Funct
$LK+BI,"OptPass4 ","FL:::/SparrowOS/Compiler/OptPass4.CPP.Z,224",437$$LK+BI,"","OptPass4",438$000002E4D8 0000 0000001601 Funct
$LK+BI,"OptPass5 ","FL:::/SparrowOS/Compiler/OptPass5.CPP.Z,1",439$$LK+BI,"","OptPass5",440$000002FAE0 0000 00000005CF Funct
$LK+BI,"OptPass6 ","FL:::/SparrowOS/Compiler/OptPass6.CPP.Z,146",441$$LK+BI,"","OptPass6",442$00000305D0 0000 00000004E9 Funct
$LK+BI,"OptPass6Lag ","FL:::/SparrowOS/Compiler/OptPass6.CPP.Z,37",443$$LK+BI,"","OptPass6Lag",444$0000030218 0001 00000003B2 Funct
$LK+BI,"OptPass789A ","FL:::/SparrowOS/Compiler/OptPass789A.CPP.Z,1",445$$LK+BI,"","OptPass789A",446$0000030AC0 0000 000000380F Funct
$LK+BI,"OptStart ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,152",447$$LK+BI,"","OptStart",448$00000272F0 0005 000000006D Funct
$LK,"PRST_CHECK_BINARY_OPS ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,42"$4 0001 0000000008 DefineStr
$LK,"PRST_DEREFERENCE ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,41"$3 0004 0000000008 DefineStr
$LK,"PRST_MAYBE_MODIFIERS ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,39"$1 000F 0000000008 DefineStr
$LK,"PRST_UNARY_MODIFIERS ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,40"$2 0009 0000000008 DefineStr
$LK,"PRST_UNARY_TERM ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,38"$0 0005 0000000008 DefineStr
$LK+BI,"PTrace ","FL:::/SparrowOS/Compiler/Directives.CPP.Z,21",449$$LK+BI,"","PTrace",450$0000003A80 0000 0000000017 Funct
$LK+BI,"ParenWarning ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,1",451$$LK+BI,"","ParenWarning",452$000000EBEE 0004 0000000055 Funct
$LK+BI,"PrsArrayDims ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,349",453$$LK+BI,"","PrsArrayDims",454$0000014056 0001 0000000134 Funct
$LK+BI,"PrsAsmArg ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,460",455$$LK+BI,"","PrsAsmArg",456$000000BDD0 0002 000000047E Funct
$LK+BI,"PrsAsmBlk ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,1309",457$$LK+BI,"","PrsAsmBlk",458$000000E3C6 0001 0000000823 Funct
$LK+BI,"PrsAsmImm ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,425",459$$LK+BI,"","PrsAsmImm",460$000000BC88 0006 0000000145 Funct
$LK+BI,"PrsClass ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,844",461$$LK+BI,"","PrsClass",462$00000154A6 0004 0000000267 Funct
$LK+BI,"PrsClassNew ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,1",463$$LK+BI,"","PrsClassNew",464$000001343E 0003 00000000B3 Funct
$LK+BI,"PrsDereference ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,1232",465$$LK+BI,"","PrsDereference",466$0000013256 0000 00000000B8 Funct
$LK+BI,"PrsDoWhile ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,1359",467$$LK+BI,"","PrsDoWhile",468$00000168CE 0001 0000000155 Funct
$LK+BI,"PrsDotDotDot ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,387",469$$LK+BI,"","PrsDotDotDot",470$000001418E 0001 0000000100 Funct
$LK+BI,"PrsExpression ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,44",471$$LK+BI,"","PrsExpression",472$000000ED3E 0010 000000125F Funct
$LK+BI,"PrsFor ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,1383",473$$LK+BI,"","PrsFor",474$0000016A26 0001 00000001C7 Funct
$LK+BI,"PrsFun ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,981",475$$LK+BI,"","PrsFun",476$000001593E 0001 00000003CA Funct
$LK+BI,"PrsFunCall ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,444",477$$LK+BI,"","PrsFunCall",478$00000102F6 0003 00000008DF Funct
$LK+BI,"PrsFunJoin ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,910",479$$LK+BI,"","PrsFunJoin",480$000001570E 0005 0000000229 Funct
$LK+BI,"PrsFunNew ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,45",481$$LK+BI,"","PrsFunNew",482$00000134F6 0001 00000000B3 Funct
$LK+BI,"PrsGlblInit ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,303",483$$LK+BI,"","PrsGlblInit",484$0000013E5E 0002 0000000084 Funct
$LK+BI,"PrsGlblVarList ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,1057",485$$LK+BI,"","PrsGlblVarList",486$0000015D0E 0008 0000000958 Funct
$LK+BI,"PrsIf ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,1305",487$$LK+BI,"","PrsIf",488$0000016666 0001 000000015B Funct
$LK+BI,"PrsKeyWord ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,88",489$$LK+BI,"","PrsKeyWord",490$00000135D6 000B 000000003C Funct
$LK+BI,"PrsNoUnusedWarn ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,1547",491$$LK+BI,"","PrsNoUnusedWarn",492$000001712E 0001 000000008F Funct
$LK+BI,"PrsOffsetOf ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,413",493$$LK+BI,"","PrsOffsetOf",494$00000101A6 0002 0000000149 Funct
$LK+BI,"PrsPop ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,13",495$$LK+BI,"","PrsPop",496$000000EC6E 001B 0000000022 Funct
$LK+BI,"PrsPop2 ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,23",497$$LK+BI,"","PrsPop2",498$000000ECCE 0001 000000002D Funct
$LK+BI,"PrsPopDeref ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,28",499$$LK+BI,"","PrsPopDeref",500$000000ECFE 0004 000000003F Funct
$LK+BI,"PrsPush ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,8",501$$LK+BI,"","PrsPush",502$000000EC46 0017 0000000028 Funct
$LK+BI,"PrsPush2 ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,18",503$$LK+BI,"","PrsPush2",504$000000EC96 0004 0000000033 Funct
$LK+BI,"PrsSizeOf ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,365",505$$LK+BI,"","PrsSizeOf",506$000000FF9E 0001 0000000207 Funct
$LK+BI,"PrsStatement ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,1692",507$$LK+BI,"","PrsStatement",508$0000017716 0004 0000001024 Funct
$LK+BI,"PrsStaticInit ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,312",509$$LK+BI,"","PrsStaticInit",510$0000013EE6 0002 000000016E Funct
$LK+BI,"PrsStreamBlk ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,1563",511$$LK+BI,"","PrsStreamBlk",512$00000171BE 0001 0000000211 Funct
$LK+BI,"PrsSwitch ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,1430",513$$LK+BI,"","PrsSwitch",514$0000016BEE 0002 000000053B Funct
$LK+BI,"PrsTryBlk ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,1613",515$$LK+BI,"","PrsTryBlk",516$00000173D6 0001 0000000339 Funct
$LK+BI,"PrsType ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,420",517$$LK+BI,"","PrsType",518$000001428E 0002 000000039F Funct
$LK+BI,"PrsUnaryModifier ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,1070",519$$LK+BI,"","PrsUnaryModifier",520$0000012416 0000 0000000E3A Funct
$LK+BI,"PrsUnaryTerm ","FL:::/SparrowOS/Compiler/ExpParser.CPP.Z,666",521$$LK+BI,"","PrsUnaryTerm",522$0000010BD6 0000 000000183E Funct
$LK+BI,"PrsVarInit ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,99",523$$LK+BI,"","PrsVarInit",524$0000013616 0001 0000000513 Funct
$LK+BI,"PrsVarInit2 ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,220",525$$LK+BI,"","PrsVarInit2",526$0000013B2E 0004 000000032A Funct
$LK+BI,"PrsVarList ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,518",527$$LK+BI,"","PrsVarList",528$000001462E 0006 0000000DD1 Funct
$LK+BI,"PrsWhile ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,1337",529$$LK+BI,"","PrsWhile",530$00000167C6 0001 0000000105 Funct
$LK+BI,"QueVectU8Del ","FL:::/SparrowOS/Compiler/CmpQueVect.CPP.Z,46",531$$LK+BI,"","QueVectU8Del",532$0000000990 0004 0000000021 Funct
$LK+BI,"QueVectU8Get ","FL:::/SparrowOS/Compiler/CmpQueVect.CPP.Z,54",533$$LK+BI,"","QueVectU8Get",534$00000009B8 0001 000000005E Funct
$LK+BI,"QueVectU8New ","FL:::/SparrowOS/Compiler/CmpQueVect.CPP.Z,1",535$$LK+BI,"","QueVectU8New",536$0000000868 0001 0000000040 Funct
$LK+BI,"QueVectU8Put ","FL:::/SparrowOS/Compiler/CmpQueVect.CPP.Z,10",537$$LK+BI,"","QueVectU8Put",538$00000008A8 0001 00000000E3 Funct
$LK,"SLASH_OP_DEC ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,440"$0x00000000 0006 0000000018 DefineStr
$LK,"SLASH_OP_DIV ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,445"$0x00000000 0001 0000000018 DefineStr
$LK,"SLASH_OP_FADD ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,449"$0x01C1DE00 0002 0000000018 DefineStr
$LK,"SLASH_OP_FDIV ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,453"$0x01F9DE00 0002 0000000018 DefineStr
$LK,"SLASH_OP_FDIVR ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,454"$0x01F1DE00 0003 0000000018 DefineStr
$LK,"SLASH_OP_FILD ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,458"$0x01000000 0002 0000000018 DefineStr
$LK,"SLASH_OP_FISTTP ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,457"$0x01000000 0002 0000000018 DefineStr
$LK,"SLASH_OP_FLD ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,455"$0x01000000 0008 0000000018 DefineStr
$LK,"SLASH_OP_FMUL ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,452"$0x01C9DE00 0002 0000000018 DefineStr
$LK,"SLASH_OP_FSTP ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,456"$0x01000000 000D 0000000018 DefineStr
$LK,"SLASH_OP_FSUB ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,450"$0x01E9DE00 0002 0000000018 DefineStr
$LK,"SLASH_OP_FSUBR ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,451"$0x01E1DE00 0003 0000000018 DefineStr
$LK,"SLASH_OP_IMUL ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,444"$0x00000000 0001 0000000018 DefineStr
$LK,"SLASH_OP_INC ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,439"$0x00000000 000C 0000000018 DefineStr
$LK,"SLASH_OP_MOV ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,446"$0x00000000 0002 0000000018 DefineStr
$LK,"SLASH_OP_MUL ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,443"$0x00000000 0001 0000000018 DefineStr
$LK,"SLASH_OP_NEG ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,442"$0x00000000 0001 0000000018 DefineStr
$LK,"SLASH_OP_NOT ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,441"$0x00000000 0001 0000000018 DefineStr
$LK,"SLASH_OP_POP ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,448"$0x00000000 0001 0000000018 DefineStr
$LK,"SLASH_OP_PUSH ","FL:::/SparrowOS/Compiler/BackEnd.CPP.Z,447"$0x00000000 0001 0000000018 DefineStr
$LK+BI,"SetSrcFileInfo ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,105",539$$LK+BI,"","SetSrcFileInfo",540$00000040A8 0008 0000000079 Funct
$LK+BI,"StreamPrintF ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,14",541$$LK+BI,"","StreamPrintF",542$0000037F20 0000 0000000034 Funct
$LK+BI,"StreamPutS ","FL:::/SparrowOS/Compiler/CmpMain.CPP.Z,1",543$$LK+BI,"","StreamPutS",544$0000037EC0 0001 0000000060 Funct
$LK+BI,"U ","FL:::/SparrowOS/Compiler/Unassembler.CPP.Z,848",545$$LK+BI,"","U",546$0000003890 0000 0000000099 Funct
$LK+BI,"Ui ","FL:::/SparrowOS/Compiler/Unassembler.CPP.Z,111",547$$LK+BI,"","Ui",548$0000000D50 0002 0000002B3F Funct
$LK+BI,"Un ","FL:::/SparrowOS/Compiler/Unassembler.CPP.Z,864",549$$LK+BI,"","Un",550$0000003930 0009 00000000A4 Funct
$LK+BI,"UnasmHashLoad ","FL:::/SparrowOS/Compiler/Unassembler.CPP.Z,56",551$$LK+BI,"","UnasmHashLoad",552$0000000C40 0001 0000000109 Funct
$LK+BI,"UndefinedExtern ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,831",553$$LK+BI,"","UndefinedExtern",554$0000015406 0001 0000000050 Funct
$LK+BI,"UnusedExternWarning ","FL:::/SparrowOS/Compiler/StmtParser.CPP.Z,838",555$$LK+BI,"","UnusedExternWarning",556$0000015456 0004 000000004E Funct
$LK,"_OPTNEXT ","FL:::/SparrowOS/Compiler/CmpAsm.CPP.Z,10"$0000000098 0001 ExportSysSym
$LK,"_OPTNEXT2 ","FL:::/SparrowOS/Compiler/CmpAsm.CPP.Z,58"$000000010A 0001 ExportSysSym
$LK,"_OPTNEXT3 ","FL:::/SparrowOS/Compiler/CmpAsm.CPP.Z,107"$000000017C 0001 ExportSysSym
$LK,"asm_hash ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,2"$0000000708 0009 0000000008 GlbVar
$LK,"asm_seg_prefixes ","FL:::/SparrowOS/Compiler/Assembler.CPP.Z,822"$000000CCC0 0001 0000000006 GlbVar
$LK,"assign_bitmap ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,8"$00000007B8 0003 0000000008 GlbVar
$LK,"binary_ops_table ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,6"$0000000790 0003 0000000008 GlbVar
$LK,"cmp_arg_cnt ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,7"$00000007A0 0009 0000000008 GlbVar
$LK,"cmp_bitmap ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,8"$00000007C8 0004 0000000008 GlbVar
$LK,"cmp_do_not_write_to_dsk ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,3"$0000000711 0003 0000000001 GlbVar
$LK,"cmp_result_cnt ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,8"$00000007A8 0005 0000000008 GlbVar
$LK,"cmp_templates ","FL:::/SparrowOS/Compiler/CmpExts.CPP.Z,49"$0000000206 0002 0000000004 GlbVar
$LK,"cmp_templates_dont_pop ","FL:::/SparrowOS/Compiler/CmpExts.CPP.Z,50"$000000039B 0002 0000000004 GlbVar
$LK,"cmp_templates_dont_push ","FL:::/SparrowOS/Compiler/CmpExts.CPP.Z,51"$0000000467 0002 0000000004 GlbVar
$LK,"cmp_templates_dont_push2 ","FL:::/SparrowOS/Compiler/CmpExts.CPP.Z,53"$000000063D 0002 0000000004 GlbVar
$LK,"cmp_templates_dont_push_pop","FL:::/SparrowOS/Compiler/CmpExts.CPP.Z,52"$00000005AD 0002 0000000004 GlbVar
$LK,"compiled_bytes ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,15"$0000000838 0002 0000000008 GlbVar
$LK,"compiled_funs ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,14"$0000000830 0002 0000000008 GlbVar
$LK,"compiled_lines ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,14"$0000000828 0003 0000000008 GlbVar
$LK,"deref_bitmap ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,8"$00000007B0 0004 0000000008 GlbVar
$LK,"doc_stop_btypes ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,397"$00000059B8 0001 0000000008 GlbVar
$LK,"dual_U16_tokens1 ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,5"$0000000778 0002 0000000008 GlbVar
$LK,"dual_U16_tokens2 ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,5"$0000000780 0002 0000000008 GlbVar
$LK,"dual_U16_tokens3 ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,6"$0000000788 0002 0000000008 GlbVar
$LK,"fpop_bitmap ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,9"$00000007D0 0013 0000000008 GlbVar
$LK,"internal_types_table ","FL:::/SparrowOS/Compiler/CmpInit.CPP.Z,8"$00000342D0 0001 00000000A0 GlbVar
$LK,"is_first_compiler ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,2"$0000000710 0004 0000000001 GlbVar
$LK,"lex_zeros ","FL:::/SparrowOS/Compiler/Lex.CPP.Z,138"$0000004238 000B 0000000004 GlbVar
$LK,"non_ptr_vars_mask ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,11"$0000000800 0006 0000000008 GlbVar
$LK,"not_constant_bitmap ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,8"$00000007C0 0003 0000000008 GlbVar
$LK,"num_non_ptr_vars ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,10"$00000007E8 0005 0000000008 GlbVar
$LK,"num_reg_vars ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,9"$00000007E0 0006 0000000008 GlbVar
$LK,"num_stk_temps ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,9"$00000007D8 0004 0000000008 GlbVar
$LK,"opt_nop ","FL:::/SparrowOS/Compiler/OptPass012.CPP.Z,150"$0000027258 0007 0000000098 GlbVar
$LK,"reg_vars_mask ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,10"$00000007F8 0002 0000000008 GlbVar
$LK,"stk_temps_mask ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,10"$00000007F0 0003 0000000008 GlbVar
$LK,"sys_internal_types ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,4"$0000000718 00B5 0000000060 GlbVar
$LK,"to_non_ptr_vars_map ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,14"$0000000820 0004 0000000008 GlbVar
$LK,"to_reg_vars_map ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,13"$0000000818 0004 0000000008 GlbVar
$LK,"to_stk_temps_map_even ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,13"$0000000810 0008 0000000008 GlbVar
$LK,"to_stk_temps_map_odd ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,12"$0000000808 0008 0000000008 GlbVar
$LK,"uasm_ins64_mask ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,19"$0000000850 000D 0000000008 GlbVar
$LK,"uasm_mem_mask ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,20"$0000000860 0003 0000000008 GlbVar
$LK,"uasm_signed_arg_mask ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,19"$0000000858 0003 0000000008 GlbVar
$LK,"unary_ops_table ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,7"$0000000798 0002 0000000008 GlbVar
$LK,"unasm_table ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,18"$0000000840 0006 0000000008 GlbVar
$LK,"unasm_table_entries ","FL:::/SparrowOS/Compiler/CmpGlbls.CPP.Z,19"$0000000848 0003 0000000008 GlbVar
à 8ÑÆÌÆÌÜÌãÌëÌöÌöÌÍÍÍ0Í:ÍUÍkÍ�ͩͅ;ÍÅÍÈÍáÍëÍëÍşÍÎÎÎÎ)Î2Î7Î<ÎCÎJÎdÎoÎ|΀΀ΊΤΨΨκÎÎÎâÎâÎéÎôÎÿÎÏÏÏ'Ï2Ï=Ï=ÏHÏfÏjÏjÏsϢϢϪϵÏÄÏÌÏÚÏáÏåÏçÏçÏùÏùÏùÏ ĞĞ9Ğ9ĞGĞGĞKĞhĞmЌЗЗаеĞÃĞÏĞ×ĞåĞğĞôĞùĞşĞÑÑÑÑ%Ñ'Ñ6Ñ8ÑGÑRÑXÑlÑtтщÑ�ѬѷѼÑÚÑâÑğÑ÷ÑûÑÒÒÒÒ@ÒEÒPÒVÒVÒVÒ_ÒjÒ‰Ò³Ò¸ÒÃÒÖÒÛÒæÒëÒğÒûÒÓ ÓÓÓ*Ó/Ó:Ó:Ó:Ó:ÓHÓ_Ó€Ó�Ó˜Ó·ÓÇÓñÓõÓ,ÔÔAÔAÔMÔ\ÔsԂԊԜԧԫ԰ԿÔÇÔÙÔäÔèÔèÔíÔíÔÕÕÕÕÕ#Õ7ÕUÕ]Õ�Õ¹Õ¹ÕÇÕËÕùÕÖÖÖÖ-Ö2Ö=ÖMÖUÖgÖrÖvÖ{Ö‹Ö“Ö¥Ö°Ö´Ö´Ö´Ö´ÖÊÖÕÖáÖéÖûÖ×
×
×××××+×0×C×H×[×`×s×~ׄטנײ׽×Á×à×ë×ğרØ(Ø3Ø7Ø?ØQØ\Ø`؈Ø�ؘØ�Ø�Ø�اØÈØÙØøØÙÙÙ!Ù,ÙKÙyÙ~ىٜ١٬ٱٶÙÁÙÑÙÕÙİÙâÙôÙùÙÚÚÚÚ Ú?Ú?ÚXÚhÚlÚˆÚ§Ú§ÚÀÚĞÚÔÚæÚÛ&ÛEÛiÛ�Û’Û�Û¥Û¥Û²ÛÓÛòÛÜ5ÜYÜ^ÜiÜqÜqÜqÜ‹Ü�ܯÜÈÜ÷ÜİAİHİHİ\İ~ݤݤݨݾİÅİÍİôİÿİ%Ş-Ş-ŞSŞSŞjޑޚ޳ŞåŞôŞ2ß@ßZßs߃߃ߟߟ߻߻ßËßãßûß à à àà,àDàTàTà`àiàrà€àéà£8Ñ                   ÈÊàȲȲҲԲ߲ç²ò²ı²³
³
³$³$³8³:³F³O³O³R³€³ ÊàP"©°¶°¶Ä¶Ï¶Ú¶â¶ë¶ó¶ö¶ı¶·
·· · ·&·4·Q·_·n·s··�·•·ˆ·¥·°·¶·¶·Ä·Ç·Ù·Ù·è·í·ñ·¸¸¸$¸,¸4¸9¸D¸^¸†¸~¸›¸¦¸Ú¸Ç¸ï¸ï¸ï¸¹ ¹"¹-¹D¹[¹b¹y¹�¹§¹¾¹¾¹¾¹Ç¹Ğ¹Ö¹Ú¹ß¹ê¹÷¹ººº6ºGºGºNºjºvº~º�º•º®º¹ºÅºÊºÕºÙºèºóºüº» »2»H»_»v»}»�»†»˜»¢»¢»­»¼»Ë»ç»ë»ğ»‡¼‘"© MŞĞKĞKâKâKõKıK L L/L:L@LMLMLdLyLyL‹L‘L‘L¨LºLºLÍLÕLÚLâLêLğLMM&M*M4MIMOMQM^M`MtMtM{MMƒM‘M¦MªM³MÈMÌMÌMßMôMúMşMN$N(N(N(N(N-N?NNNeNsN�N N°NµNµNµNÁNÉNÑN×N×NîNöNüNOOO%O>O@OHOVO\O^O^O^O^O^O^O^O^O^OjOrOzO€O€O—OŸO£O«O¹O¿O¿O¿OÓOÙOåOëOøOPP#P/P7PDPVPdP€P‡P“P¬P¯P´P7R›MŞ =À¬À¬Ğ¬×¬Ş¬â¬­­!­2­C­N­e­p­r­}­�­™­°­»­½­Ä­Í­Ï­Ú­á­ë­®
*= (à"€³€³”³›³¢³ª³­³­³¼³Å³È³Ë³Ï³Ô³ô³á³ ´´´´)´6´A´I´c´�´ƒ´¥´¯´İ´Ğ´ò´ò´µµ#µ.µDµZµaµwµ�µ£µ¹µ¹µ¹µ¹µÂµËµÑµÔµåµåµÿµ#¶©¶ Là"␍¸Y­PÂPÂfÂmÂxÂ� ²ÂÄÂÖÂèÂõÂõÂúÂÃÃÃ)Ã.Ã@ÃOÃ^ÃmÃ|ÉÉÉééÿÃÑÃÕÃÕÃãÃòÃ÷Ã÷ÃşÃşÃÄ%Ä'Ä'Ä=ÄUÄUÄUÄkÄvÄvČģIJÄÌÄÛÄøÄÅ$Å3ÅPÅ_Å}ÅŒÅ�şŵżÅÒÅÒÅÒÅñÅñÅÆÆ+Æ+Æ­Æ^Y­¨MpCpC€C€C�C�C»C¿CÄCÄCÄCÄCĞCÕCåCêCêCêCïCïCD D D-D6DFDODQDQDQDQDXD_DfDmDtD{D‚D‰D�D�D’D’D˜D�DÍK<M ¹ÊH²H²\²c²n²x²ƒ²‹²š²¤²§²©²¹²¹²Å²¹ÊPZ�¯¯¯!¯(¯6¯=¯B¯O¯a¯c¯j¯p¯€¯‹¯•¯ ¯ ¯·¯º¯¼¯Î¯Ô¯ä¯î¯ø¯ÿ¯
° °'°'°=°=°Q°1Z�P�¨X°X°j°q°x°†°�°’°Ÿ°±°³°º°À°Ğ°Û°å°ğ°ğ°±
± ±±%±5±?±I±P±[±o±w±w±�±�±¢±1�¨=Z®®®$®+®2®8®H®S®]®h®h®®‚®„®Ÿ®©®³®º®Å®×®ß®ß®õ®õ®¯'=Z ¨¹¨±¨±Ã±Ê±Õ±ß±ê±ò±² ²²"²&²:²:²H²¨¹`­6°Æ°ÆÑÆØÆØÆñÆıÆÇÇÇ?ÇAÇJÇxÇzǕǣǣǬdzǿÇÉÇĞÇ×ÇÛÇİÇäÇğÇúÇÈÈ È ÈÈ)È)È2È`ÈbÈkșȼÈÊÈÓÈÚÈæÈğÈ÷ÈşÈÉÉ ÉÉ!É(É/É3É3É@ÉNÉqɘɦɭɸɸÉÁÉïÉñÉúÉ(Ê1Ê8ÊDÊNÊUÊ\Ê`ÊbÊiÊuÊʆÊ�Ê‘Ê‘ÊœÊ¿ÊæÊôÊûÊËËË=Ë?ËHËvËˊ˖ˠ˧ˮ˲˴˻ËÇËÑËØËßËãËãËíËÌ#Ì1Ì5Ì5Ì8ÌA̾Ì“­6øà«à«¬¬$¬,¬0¬4¬8¬<¬@¬D¬L¬Q¬[¬b¬o¬‚¬‰¬“¬“¬•¬Ÿ¬¦¬­¬­¬¿¬& ÀPe(Ÿ(Ÿ:Ÿ@Ÿ@ŸIŸRŸRŸyŸ€Ÿ‰Ÿ’ŸœŸªŸµŸ»ŸÅŸ Pe!øe�ÈŸÈŸÜŸãŸìŸñŸôŸ÷Ÿ    & - 0 ; > Z ] c f • › ¢ ¢ ² "&e�# �ş(¡(¡J¡J¡V¡V¡b¡b¡h¡r¡¡‰¡�¡�¡š¡¤¡®¡»¡Å¡Ë¡Ë¡Ö¡à¡ê¡÷¡¢¢¢¢"¢,¢9¢C¢I¢I¢T¢f¢p¢}¢‡¢�¢�¢˜¢�¢¨¢µ¢¿¢Å¢Å¢Ğ¢Ø¢â¢ï¢ù¢ÿ¢ÿ¢ÿ¢ ££ £+£?£I£V£`£k££‰£–£ £«£Â£Â£×£ë£ë£õ£¤ ¤¤.¤8¤I¤R¤R¤^¤d¤u¤}¤‹¤�¤­¤¿¤Í¤Í¤Û¤Û¤ş¥${�ş%È  ˆœˆœ”œ›œ œ©œ±œ¿œÒœŞœõœ����#�:�>�F�&   '�Ñàèšèšöšúš›››››#›'›*›4›(Ñà)€òÿğ›ğ›œœ œœ œ)œ)œ,œ0œ8œ*òÿ+(�°ø˜ø˜™ ™&™.™7™;™?™L™T™Y™Y™j™n™u™™™�™–™Ÿ™®™µ™¼™É™Ğ™Ş™Line truncated
‹‹‹;‹I‹P‹À‹TvÆ2U(2tÀ‹À‹Ø‹ã‹ã‹ç‹ğ‹÷‹ŒŒŒ$Œ)Œ)Œ?ŒDŒDŒ[Œ]Œ]ŒtŒvŒvŒŠŒŒŒŒŒ Œ¢Œ¢Œ¸ŒºŒºŒĞŒĞŒ׌ÛŒߌäŒèŒõŒøŒ���)�0�0�J�L�g�i���ƒ���¡�½�À�Ë��VL2tWÀ›°x™x™|™’™™™±™º™Å™Ğ™Û™â™ç™ì™ššš*š/š1šX ›°YĞ<³¨€¨€¬€»€¿€΀İ€ì€û€␍��)�A�S�u�•�£�¿�Ñ�ê�‚‚2‚:‚\‚w‚‰‚›‚ª‚ª‚º‚͂ނí‚ı‚
ƒƒ$ƒDƒDƒMƒMƒMƒ`ƒmƒwƒ”ƒ¡ƒăâƒëƒøƒüƒ„„'„?„H„X„`„e„x„�„®„¾„Ʉلބ愅&…>…M…U…d…m…u…u…‡…¬…´…¼…Ç…É…Ù…ñ… †!†9†K†]†o†�†“†œ†¥†·†ņɆê†Z�<³[0 ŞA8R8R<RMR^RoR€R‘R¢R³RÄRÕRæR÷RSS*S;SLS]SnSS�S¡S²SÃSÔSåSöSTT)T:TKT\TmT~T�T T±TÂTÓTäTõT UUUU/U(U@U9UQUJU[UlU}U•U�UŸU°UÁUÒUãUôUVV'V8VIVZVkV|V�V�V¯VÀVÑVâVóVWW&W7WHWYWjW{WŒW�W®W¿WĞWáWòWXX%X6XGXXXiXzX‹XœX­X¾XÏXàXñXYY$Y5YFYWYhYyY‘YŠY›Ylx\mŞA]ĞâV�V�z�}�²�º�º�Õ�Û�à�à�û����!�'�,�,�5�C�C�P�X�^�c�¦�±�¹�¿�Á�Á�×�İ�İ�İ�â�ş� ‘"‘'‘'‘'‘.‘5‘<‘Q‘X‘X‘q‘q‘§‘^Aâ_`…��q�q®q¶qÃqÍqØqàq`…�ax ØÁØÁáÁæÁæÁôÁôÁÂÂÂÂb c0$(<(<7<[<u<Line truncated
= ='=.=5=?=H=`=o=ˆ=‹=¢=¥=ª=Á=Í=Ù=å=é=÷=ş=>1>d-$ex%®‘®‘ȑґ֑ڑߑᑒ ’ ’)’f%g8<XXpz†���¤²¹Òßíû €$€,€6€E€M€Z€b€e€e€e€s€s€�€�€‘€”€¤€h.<ih  Á Á©Á®Á®ÁÁÁÊÁÌÁÑÁj kxÑîàîàá␍áá)á1á9áCáGáNáTáhápáuáxáƒá�á–á¡á¬á±á±áËáÒáÙáäáïá÷áùáââââ&â&â@âaâgâmâ€â†â�â�â£â©â©â±â¹âÄâÉâÛâèâìâûâıâãããã!ã!ã&ã:ãBãBãÄãlVÑm804;";*;/;n04op4?P•P•e•t•ˆ•••›•¡•¤•Å•p4?qphsp—p—…—”—¨—µ—»—Á—Ä—å—rhssp�›™™™$™8™E™K™Q™T™u™t�›u`+4•••-•:•@•C•K•v+4w`_h(—(—:—M—Z—`—c—k—x_hyh†�¸˜¸˜ʘݘê˜ğ˜ó˜û˜z†�{ +¸“¸“¼“À“À“Õ“î“î“””?”a”p”y”†”�”�”ª”ÔДԔܔܔܔï”ï”ÿ”••|* +}?_È•È•Ì•Ğ•Ğ•å•ş•ş•–(–_–�–�–™–¦–­–½–Ê–ã–ğ–ô–ü–ü–ü–—— —#—'—~*?_°s†è—è—˜˜˜$˜$˜.˜E˜b˜€˜†˜�˜�˜£˜¦˜²˜€s†�pş3ş3
444$4*4.494‚ƒ@rwYY␍YYY„rw…@Î3Î3Ü3ñ3÷3†‡@P:Y:v:{:ˆ‰X)¦¦
¦¦$¦+¦3¦;¦C¦K¦S¦^¦h¦p¦{¦…¦�¦–¦›¦ª¦¯¦¸¦¸¦È¦×¦Ü¦ã¦è¦ğ¦ò¦§§§F§F§H§^§a§g§Š2)‹HgP¨P¨\¨t¨t¨‚¨‚¨‚¨‚¨‹¨‹¨’¨¹¨Á¨Á¨Ì¨Ì¨Ú¨ê¨ê¨ø¨ş¨ş¨©©©µ©Œ)Hg�Pg�¸©¸©Ä©Í©Í©à©í©ù©ªªª(ª4ª@ª@ªPª\ªeªlªuªšªŸª²ªÂªÎªÎªäªäª␍«␍««"«$«>«J«M«n«�1g��)Hh§h§~§ˆ§•§£§¬§¹§¹§Ç§Ç§Ş§ç§ø§ú§ı§ÿ§¨¨'¨2¨2¨2¨5¨=¨B¨P¨�))H‘ �Ÿp«p«~«€«€«‰«’« «¥«®«±«¶«Ä«Î«Û«’�Ÿ“гjV®V®ˆ®“®›®¤®µ®®×®Ú®İ®á®ê®ê®ø®¯¯¯?¯D¯U¯�¯†¯—¯·¯¼¯˯÷¯ÿ¯°°E°M°R°R°q°Œ°�°¡°À°À°Ó°ذë°ÿ°± ±%±%±>±>±>±>±>±N±c±f±i±m±m±r±�±ª±¯±¸±ɱѱğ±²²²0²0²0²=²T²V²V²V²c²z²|²|²‰² ² ²§²º²º²ͲÒ²å²ù²³³ ³(³?³Q³Q³d³y³y³y³†³�³Ÿ³Ÿ³Ÿ³¬³óųųÒ³é³é³ğ³´´´´+´8´T´Y´a´f´r´Œ´�´�´±´Æ´Æ´Æ´Ó´ê´ì´ì´ù´µµµ*µ*µ=µBµUµiµpµ’µ³µ¸µ¿µ͵ڵߵߵߵûµ*¶ ·”Á³j• r³öªöª« «"«(«-«D«[«r«„«ª«Ñ«Ô«í«¬¬¬$¬7¬?¬R¬R¬g¬l¬�¬•¬²¬·¬¼¬ĬάÖ¬Ö¬ݬæ¬æ¬æ¬ñ¬­3­9­R­k­m­‡­�­¦­¿­Ç­Ç­Ò­Ò­Ü­Ü­ï­-®B®T®–Kr³—£âÎŒÎŒçŒ ��O�[�v�‡�œ�£�á�í���)�-�-�1�6�<�E�H�R�_�|����„�Š�Š�¥�³�¾�Æ�Ú�á�ê�ê����#�4�4�C�H�H�T�˜I£â™øÂ
^ DO„\ŠŠ¹¾¾ÂÌØóú
,HH[h€‡šš­²ÅÙõúÿ+2;=BVss†“«²ÅÅÚÜñş <@@KRdgin‹£¥½ÏÒÔÙööö  !B^^cgƒ��ªÈÒÖêş*>H^bxŒ£¥¥¸ÂÖàé
  *@DDDOVj‚„œ°ÇÌÌßç    C C U š¦Â
^ ›ê  ŞŞîõ16=]_‹›»ÀÇÇÏÖáéôÿ 'œ'ê  �`ÁjŞ;Ş;ø;ü;<<<"<$<'<.<5<5<Q<U<[<[<s<‡<˜<˜< <Ä<ä<ä<=
=+=0=<=G=L=Y=\=“=¤=©=¯=±=·=º=Ë=Ğ=Ó=Û=ä=ÿ= >6>I>N>R>t>‡>Œ>£>¶>»>¿>á>ü>?/?4?E?J?M?O?U?[?l?q?w???‰?’?©?¼?Á?Å?ç?@"@5@:@U@u@Œ@Ÿ@¤@¨@Ê@İ@İ@ó@ó@ó@AAAAA)AAACACAQAiAiAqA…A…A™A�A²A¿AÜAâAâAëAëAóAÿA B)B9B@BKBaBeBeBeB„B�B•B¯B¶BÁBÙBŞBäBşBCCC)C)CkC�³ÁjŸĞ°Ç¶^¶^È^Ô^ê^÷^__)_-_3_R_F_c_e_e_–_„_e_µ_¿_ !°Ç¡¨jœnCnC~C�C‰CÃCĞCÜCâCD!DMDMDRDhDzDzD—D±DäDäDóD+EEFEFESEE„E«E°E¸EÔEÀEïEFôE(FF<F<FIFuFuFuFuF}F¢<jœ£h]‡Î,Î,æ,ñ,ü,--->-D-D-k-k-x-£-ê-ä-¼-.".:.'.M.F.l.Y.€.€.�.¸.í.ç.¿.ù.
/
/
//¤4]‡¥È\␍’␍¾ ¾ Ô à ğ õ !!!%!O!k!x!�!›!®!®!Ã!Å!Ú!ç!" """5"="="="M"B"_"o"t"’"‡"¤"´"©"Æ"Ò"×"ø"í"
##¦@\␍’␍§èâ \␍ŞŞ (3BKOZez™¸¾ÃÖ%+36;N{‘—Ÿ¢­ÂÇä  *5JOiˆ�“�³¼Áàèíø␍7?J_d~�£¨¨¨¨µ½½ÒÒ÷  " B V ] p p ƒ ˆ › « Ç Ì Ö Û ï ö    ! 4 H d i i r } } ª ª ª ¼ ¨„â \␍©ĞœS~F~F˜F¨F¬F·FÂFG.GLGvG|G‚GŠGŒG”G¯G²G½GÉGH5HSH}HƒH‰H‘H–H�H¹H¼HÇHÓHØHIDIbIŒI’I˜I I¢IªIÅIÈIÓIßI,JSJqJ›J¡J§J¯J´J¼J×JÚJåJñJñJöJüJK
KKK/K>KpKšK K¥K·KÆKL*L0L8L=LOL^L˜LÂLÈLÍLßLîL(MRMXM]M]M]MiMiM~M~M‰MÈMÓMØMëMNNFNQNVNiNvN¤N¸N¿NÖNÖNóNøNO)OMORO`OeOyO€O—O—O´O¹OÖOêOPPPPP P,P5PKPWPWPdP~P‚P‚P‚P¥P°PµPÈPÈPÙPğPõPúP Q QQ+Q5Q5QGQªÁœS«Ğ_vî�î�ò�ò��� �&�2�2�I�I�`�`�w�w�����¥�§�§�«�¬!_v­Øj â ööQ`všŸ£««´ÃÊÓØíş%'FN]dpu|„ŠŒ˜¨­¯ÏÕÕİİæõ<CCCWmq’Šª¯ºÁÉÏÑİíòô&6;@`fkw‡Œ�®´»ÃÉË×çìî%%//Gw�‘Ÿ²ªÊÊÜ®‚j â ¯ğ‡b//0/8/</J/J/N/t//‡/�/¥/­/­/±/ã/î/000%0+0/030B0J0T0]0o0„0 0ª0¬0È0Ò0á0é0ö0û01112181A1L1T1\1l1t1|1—1Ÿ1¤1¤1®1Î1Ö1Û1Û1å1ô1222>2F2F2F2Q2Z2n2v222„2ˆ2Œ2‘2–2�2»2×2ñ233(353I3Q3d3d3y3{3�3�3º3¿3Ã3Ï3ô34&4E4K4M4l4o4o4‚4�4£4ª4½4½4Ò4×4ì4ù4555&5*555@5K5V5X5w5z5…5�5•5´5º5¿5Ê5Õ5×5ö5ù566636969696C6C6N666Š6Š6Š6“6›6§6´6Ñ6á6è6î6ú677 7 7 7B7B7M7R7l7s7}7‰7�7§7¬7±7Ë7Ò7Ü7ì7ö78 8 8:8:8L8°å‡b±(H j ææö17Vu†�½Üî "A`l„£©°°¸ÃÎíõ²,H j ³À%Z.’.’V’Y’^’^Line truncated
y
FıFıTı[ızı™ı›ıºıÙıèığıûııışş2ş8şºf
y
»Èy
¯
>ş>şSş^şeş’ş±ş³şÒşÿşÿÿ!ÿ#ÿ.ÿ9ÿ9ÿ>ÿkÿpÿ�ÿ¢ÿ©ÿÈÿçÿòÿôÿ22M\doq|‡‡§ÄÄÑÑõ¼@y
¯
½Hå
öö8öIöUölösöŒö„ö¤öÄö°öĞöáöæö÷óö ÷0÷G÷N÷g÷_÷÷Ÿ÷‹÷«÷¼÷Ò÷¾÷ê÷÷÷÷÷øøø¾0å
¿Xs›ÍÍ8ÍJÍQÍYÍYÍhÍm͌͌͑Ͱ͵ͼͼÍËÍÍÍìÍìÍ Î Î␍Î,Î,Î;Î=Î\Î\Î\Î\Îk΄Î}ΜΦÎÀ2s›ÁĞ"9 ãã$ã(ã;ãCãJãQãUãWã^ãeãiãiãqãŠã”ã”ã¨ã³ãÁãÒãÖãÛãæã÷ãä ä#ä,ä0ä5äFäXäcäiäqä…äŠä¥ä¶äºäºäºä¿äíäå ååå#å.å?åPågåoåtåxå}å�å å¨å®åÂåÄåßåğåôåôåôåÿåæ!æ8æ<æEæIæNæ_æqæ|æ‚æŠæ�æ£æ¾æÏæÓæÓæäæäæäæéæéæøæúæçç<çGçMçaçrçwçŒç—ç¨ç¹çĞçÔçİçáçæç÷ç èèèè2è4èOè`èdèdèkè|è€è€è’è—è¢è·èÈèßèçèìèğèõèéé$é*é>éCé^éoésésé…é…é…é…éŸéŠé«é«éºé¼éİéèéîéêêêêêê-êLêLêLê[ê[ênê�ê˜ê©ê®ê´ê¾êÀêÌêÌê×êâêíê
ëëë7ëCëEëPë\ëlëwë‚ë”ëœë ë¤ë¦ë«ë³ë·ëËëÍëÒëÚëŞëàëàëéëñëıë
ì'ì7ì>ìHìTì[ìuìyìyìyìœìœì§ì¬ìÆìÍì×ìãìíìí íí(í/í9íIíSí`íjíjí|íÂ!"9 ØÁñf»f»Œ»�»–» »ª»¬»¶»À»À»Ô»ß»æ»ó»¼¼ ¼/¼5¼7¼>¼D¼N¼N¼]¼_¼f¼l¼v¼v¼v¼�¼£¼ª¼ª¼¹¼»¼ͼܼܼî¼Ä:ÁñÅğñ î¼î¼½½½(½2½4½>½H½O½\½i½|½‰½˜½�½ ½¦½°½¿½ѽà½ş½¾Æ%ñ ÇØÍ å ŞôŞôøôõõ8õIõPõiõaõ�õ¡õ�õ­õ¾õÀõáõÍõùõùõöööÈ"Í å É?]ş¿ş¿À$À+À+À3ÀRÀWÀvÀ{À•À‚À´À¡ÀÀÀÕÀÂÀôÀáÀÁÁÁÁÁ8Á8Á@ÁÊ(?]Ë0›Ş¦Î¦ÎºÎÌÎ×ÎÿÎŞÎ Ï Ï-ÏZÏ9ÏfÏfττϣϸϥÏåÏÄÏñÏñÏĞĞ!Ğ!Ğ?Ğ?ĞlĞlĞyвзоĞìĞİĞøĞøĞÑ*Ñ\ÑIÑwÑhууѥѽѪÑÉÑ÷ÑèÑÒÒ!Ò!Ò3Ò3ÒQÒlÒlÒyÒ˜Ò˜Ò˜Ò ÒÌM›ŞÍX¥ Í ¦ò¦òÀòÑòİòóòóó1ó)óIóióUóuó†ó‹ó¬ó˜óÄóÕóëó ôô)ô!ôAôaôMômô~ô€ô¡ô�ô¹ô¹ôÑôÑôÛôÎ2¥ Í ÏP¬s6Ä6ÄXÄkÄsÄzÄ�ćĉÄ�ėĚĚĚĬĬĿÄÊÄÕÄæÄ÷ÄÅÅ Å'Å,Å=ÅSÅ[ÅcÅuÅzŔŬŰŰŵÅáÅöÅÆÆ#Æ:ÆBÆKÆSÆXÆiÆ{ƃƋÆ�ƟƹÆÑÆÕÆÕÆàÆñÆÇÇ!Ç*Ç2Ç7ÇHÇ^ÇfÇnǀDžǟǷǻǻÇÎÇÎÇÎÇæÇÓÇÈóÇÈ È%È=ÈUÈZÈoÈzȋȜȳȻÈÄÈÌÈÑÈâÈôÈüÈÉÉÉ2ÉJÉNÉNÉYÉjÉ{ɒɚɣɫɰÉÁÉ×ÉßÉçÉùÉşÉÊ0Ê4Ê4ÊGÊGÊGÊ_ÊLÊÊlʌʘÊ�ʶÊÎÊÎÊÎÊÚÊàÊëÊöÊË Ë7ËNËeË|Ë|Ë�˲˲˲ËÊËÊËØËÚËÚËèËèËñËüË
Ì%Ì4Ì;Ì;ÌOÌTÌTÌŵ̶̥ÌÑÌÑÌÍĞѬsÑ8
Ş"¦Ò¦ÒÀÒÇÒÎÒÙÒáÒúÒúÒÓÓ%Ó%Ó1Ó5Ó@ÓlÓKÓyÓ�ÓŸÓ·Ó»ÓÀÓÀÓÖÓçÓşÓÔÔ&Ô*Ô/ÔWÔoÔsÔsÔ„ÔÅÔ¤ÔÒÔÒÔôÔôÔÕ Õ&Õ>ÕMÕRÕRÕhÕyÕ�Õ§Õ°Õ¸Õ¼Õ¾ÕæÕşÕÖ␍ÖÖ/ÖFÖJÖOÖSÖXÖiÖÖ…Ö‹ÖŸÖ¤Ö¾ÖÍÖÑÖÑÖäÖäÖäÖäÖéÖ× ×J×)×W×W×yׅ׋ףײ׷×Â×Ó×ä×û×ÿרØ␍ØØ0Ø6Ø<ØPØRØlØ{ØØØØ™ØªØÁØØØáØéØíØïØÙ/Ù3Ù3Ù@Ù@Ù@Ù@ÙWÙ]ÙhÙoÙoكٟٟٲٲÙÀÙÂÙÂÙĞÙĞÙéÙúÙÚ0Ú0ÚDÚIÚIÚlÚwÚšÚ«ÚºÚÉÚèÚàÚÛ8Û8Û8ÛEÛÛ„Û„Û“Û™Û¤ÛÄÛãÛÓÛğÛÜÜ/ÜGÜKÜ\Ü|ܬܜܹܹÜÛÜÛÜûÜİ␍İ%İ4İ9İPİhİlİw݌ݡݸݼİÁİÅİÊİßİõİûİŞŞŞ4ŞCŞGŞGŞZŞZŞZŞZŞ_Ş’ŞŞŸŞÏŞ¿ŞÜŞÜŞşŞ
ßß(ß7ß<ßGß\ßq߈ߌߑߕߚ߯ßÅßËßÑßåßêßàààà7àNàfàjàjàwàwàwà–àœà§à²à²àÊàéàéàéàááááá!á!á:áKáeá‡á‡á›á á áÇáÖáùá
âââ?â\â\âiâŠâŠâŠâ ãÒNŞ"ÓøO k �î�î¨îĞî³îÜîÜîéîüîïï-ïEï2ïXïQïdïdïqï„ï�ï–ï©ï©ï¶ïÕïÕïßïÔ&O k Õ�]¬FÁFÁfÁ~Á™Á…Á¹Á¥ÁÅÁÛÁÇÁûÁçÁÂÂÂ$Â4Â;ÂHÂSÂ_ÂjÂrÂwƒˆœ£§²·ÂÂÂÛÂäÂğÂõ ÃÃÃÃÃÃ/Ã4ÃMÃbÃqÃvÃ�ÉÉÉËäùÃÄÃÎÃÙÃÛÃæÃîÃîÃûÃóÃÄ3ÄÖY]¬×È9 O ~í~í˜í¼íŸíÈíáíÚíùíîûí!îî-îFî?îRîRî_î~î~îˆîØ 9 O ÙĞ
"
øø8øDø[øløsøŒø„ø¤øÄø°øĞøáø÷øãøùùù4ù4ù>ùÚ!
"
Û˜Õ␍å␍¦%¦%À%Ò%Ò%Ù%ø%ø%
&&,&%&D&D&N&ÜÕ␍å␍ݰ ?¾¾4¾;¾F¾F¾\¾\¾n¾y¾„¾•¾¦¾½¾Á¾ƾʾ̾ݾï¾õ¾û¾␍¿¿(¿7¿;¿;¿;¿N¿i¿i¿u¿{¿…¿�¿�¿¥¿¥¿´¿¶¿Ò¿ì¿ì¿ş¿Ş= ?ßø‡£&Œ&Œ<ŒFŒFŒVŒ_ŒbŒhŒhŒrŒ‹Œ‹Œ›Œ¤Œ§Œ­Œ­Œ´Œ»Œ½Œ½Œ½ŒÇŒà&‡£áp5`¨¨4¨N¨N¨a¨e¨„¨‹¨�¨�¨±¨¶¨ɨݨù¨ş¨©©©© ©5©A©R©W©h©|©�©ƒ©œ©´©¶©¶©Ï©ç©ç©9ªâ55`ãèÃıFUFU\UhUsUˆU�U“U–UšU°UœU¼UÁUÖUÛUåUèUìUVñUVVV1V6V<V?VCVYVEVeVkV€V…V‹V�V’V¨V”V´V¹V¹V¹VÙVñVW4W_WmWäDÃıåxMYffff%f0f;fEfcfnfyf~fæMYçHY¿~f~f’f¨f¹fÅfèfÕfgôfg(ggGg4gSgSgdgfgwgyg†g‹g‘g›g�g­g¿g¿gÒgågêgêgıghhh%h8h:h:hMh`h`hmhƒhrh�h¡hšh´h­hÀhÎhÛhèhõhii iii@i-i_iLi~ikiŠi›i¾i«iİiÊiüiéijj
j<j)j[jHjgjyjrjŒj…j˜j£j®j®jújèpY¿é(¿şjşjkk)kVkgkmkmk~k€k‘k“k k¥k¾k«kÛkÊkçkùkòkl␍lllAl.l`lMllll‹lœl¿l¬lŞlËlılêl mm m=m*m\mImhmzmsm�m†m™m¡m®m»mÈmÓmÓmÓmóm*nêL¿ëXıEnWnW†WŒW—W¬W±W·WºW¾W¾WŞWãWXX%X>X*XJXcXOXoXzXX‰XŒX�X•X®XšXºXºXºX¿XÔXÙXßXâXæXæXY YAY-YMYfYRYrYˆYtY”YŸY¤YªY­Y±Y³YÌY¸YØYØYØYØYğYZ%ZìRıEí°¯
Â
,3Rqs’±ÀÈÓÕàë
î¯
Â
ïhLvvZvZŠZ•Z¼ZÔZÙZŞZâZäZêZğZ[óZ[[1[I[6[U[|[”[™[�[¢[¤[ª[°[Æ[³[Ò[Ò[å[í[ÿ[\\%\1\ğ4Lvñ˜\̶”¶”ʔҔߔÿ”•• •%•+•/•3•L•L•W•[•[•q•�•…•ЕЕ‘•”•™•¨•¬•¬••İ•á•æ•æ•í•ğ•õ•–––$–3–7–9–H–L–L–b–r–v–{–{–�–’–�–¨–³–Ù–ä–è–í–#—:—E—I—Z—e—i—k—v—z—z—z—Œ—˜—œ—œ—œ— —ç—òz\Ìóv5®�®�à�é�ş�ŸŸ(Ÿ(Ÿ5ŸSŸ[Ÿ[ŸˆŸ�Ÿ¶ŸÓŸîŸôŸøŸ A F F o ‰ ¯ Æ Ì Ğ é ñ ö ¡¡-¡3¡7¡P¡X¡w¡|¡�¡•¡´¡¹¡Á¡Ç¡Ë¡Ï¡á¡é¡õ¡ ¢¢ ¢%¢6¢;¢T¢a¢j¢‹¢¼¢ ££££ £'£5£B£[£[£r£w£w£�£�£�£¤£¦£¦£½£¿£¿£Ö£Ø£Ø£ï£ï£ö£ ¤ ¤¤!¤4¤H¤d¤i¤i¤n¤n¤~¤£¤µ¤º¤º¤º¤º¤Á¤õ¤¥¥¥¥(¥?¥A¥A¥A¥N¥e¥g¥g¥t¥‹¥‹¥’¥¥¥¥¥¸¥½¥Ğ¥à¥ù¥¦¦¦¦¦¦¦¦¦¦ ¦ ¦*¦/¦D¦D¦D¦L¦Q¦Q¦Q¦Y¦^¦^¦f¦f¦h¦o¦‹¦�¦ ¦´¦´¦´¦´¦´¦˦ã¦ë¦ë¦¨ôÉv5õèk ¥ æïæïğğğğ#ğ(ğ*ğ1ğ8ğ<ğOğ�ğŒğ·ğ¼ğİğİğéğñğñ:ñ?ñlñtñyñ‚ñ�ñ–ñ�ñ¼ñÂñáñãñò␍ò$òCòIòPòPòVòYò]ònò�ò òöDk ¥ ÷8"
f
>ù>ùRùYùlùŸùªùªùºùéùéùõùıù úFúHúuú}ú}úªú¯úÎúéúïúşúûû û(ûCûHûQû]ûeûpûwû¤ûÃûÅûäûü üüFüKüRüqü�ü’ü±üĞüëüóüııı:ı:ıFıøN"
f
ùÍ ê nn|ˆ²ÎÛòş&(=Jglwy˜ «¾·ÖÜú'Í ê ûè.HNˆNˆ]ˆbˆvˆˆ�ˆ«ˆ»ˆÓˆ؈ìˆõˆ‰!‰1‰A‰C‰V‰i‰i‰i‰o‰ü$.HıhU_����®�³�¹�½�Á�à�è�şU_ÿĞÇŞÆ_Æ_Ø_ä_ú_` ``9`=`C`b`V`s`u`u`¦`”`u`Å`Ï`!ÇŞ ' ..@FMYi‰�•µ·×ãó   %(,4LWb‚Œ* ' ğ$?Ö›Ö›ö›œœœœœœ=œJœLœLœLœLœYœaœtœˆœŠœŠœ’œ¥œ¥œáœ%$?€?Læœæœğœúœ��"�/�/�2�4�:�?LX
2f(f(€(‹(–(Ä(£(Ü(ã(2))ê(X)])†)‹)—)¾)Ã)Å)ä)ê)*÷)*%*b*T*,*v*x*�*�*�*�*2
2 @å␍
N&N&h&s&~&Ô&´&Œ&ú&ü&%'%'2'k'p'|'‡'‰'¨'®'µ'ò'ä'¼'(( ( (,(S(S(S(a(
/å␍
 ’␍±␍##&#-#?#G#R#R#a#a#u#‚#�#’#²#²#Á#É#Ô#Ü#ç#ò#ı#$$$$0$0$8$ )’␍±␍␍Hñ¶™¶™Ö™ï™ï™ï™šš#š#š2šDš^šfšmšoš‚šŠšŠšŠšŒšŒšŒšŒš¡š¡š¡š¡š³šµšµšµšÈšÓšw›0ñ€$~›~›ˆ›�›™›™›¸›Å›Å›È›Ê›Ğ›$ˆSaNQNQ^Q^QnQ„QpQ�Q’Q¤Q¶Q¾QSa`aоQ¾QĞQÛQğQõQ
R÷QRRR,RDR1RPRSRXRnRsRˆRuR”R—R—R§R¼R©RÈRÎRÎRáRôRSS-S7S3aŠ`г>S>SPS[SpSuSŠSwS–SœSœS¬SÄS±SĞSÓSØSîSóSTõSTTT'T<T)THTNTNTaTtT‡TšT­T·T3г˜³Ã¾T¾TÎTÎTŞTôTàTUUU(U3U>UFU³Ãˆ .ƇƇÕ‡Ú‡î‡÷‡ˆ#ˆ3ˆHˆHˆHˆNˆ .(^ € V V € … › £ µ à Ç Ç Ğ Ğ Õ é é 

<
D
I
P
d
|
~
–
ª
­
À
Ú
ì
,^ € 8€ Ä î
î
 2 : E L S \ ^ a  † ¡ £ ª Å Ì Õ × Ú ø ø ø     = ? Y a a } ›   § »  İ ß æ   0 3 ; H H h j „ Œ Œ ¨ à à é é û N€ Ä  @Ìñî—î—˜"˜-˜B˜a˜l˜�˜�˜�˜�˜¦˜¨˜¨˜¨˜µ˜͘ϘϘá˜î˜™™ ™ ™ ™3™5™H™U™q™v™v™²™ /Ìñ!PEL&Z&ZMZ:ZYZhZpZ"EL#ĞjÁ··2·?·B·I·O·f·}·”·×·ó· ¸¸¸"¸9¸9¸L¸Y¸l¸t¸‡¸‡¸œ¸�¸³¸À¸ݸâ¸ö¸û¸¹&¹+¹.¹H¹b¹j¹r¹w¹‘¹«¹³¹»¹À¹Ú¹â¹ç¹º ºº)ºCºKºSºUºoº‰º‘º™º›ºµº½º½ººǺÒºÒºݺݺéºéºüº<»R»R»b»$ajÁ%èv°6\6\H\T\_\d\p\{\€\‡\Œ\Œ\—\œ\œ\»\Ú\Ü\á\á\ì\ñ\ñ\]/]L]L]_]r]…]˜]�]�]°]Ã]Ö]é]î]î]^^'^:^<^<^O^b^u^ˆ^ˆ^²^&Dv°'ĞöMŞaŞaüab bb b b&bFbKbabybeb…b”bÌbÔbîb&c.cGc3cSc‹c�c«c—cËc·c×cícÙc dùcdQdQdUdYdbdndwd‰d”d¦dªdªdªdÉdĞdÕdçdùdûdeee%e%e%e)ehehe�e‹e‹e�e¦e·eÃeÔeÙeêeîeóef(aöM)ğb�N8N8n8q8‡8“8½8Ù8æ8ı8 9991939H9U9r9w9‚9„9¤9¬9¬9»9Ã9Ã9Ç9Î9Ö9è9ó9ó9ÿ9::::6:;:@:R:R:^:u:w:|:�:�:š:§:±:±:Á:*Eb�+�Æ Õ .%.%>%J%U%k%W%w%y%€%‹%—%Ÿ%,Æ Õ -@Á Æ î$î$%#%+%.Á Æ /@¼ Á ®$®$Â$ã$ë$0¼ Á 1p± ¼ >$>$_$L$k$v$�$Œ$—$£$©$2± ¼ 3�HWv‰v‰‰“‰œ‰¬‰ȉ܉ğ‰ò‰ Š Š Š%Š4HW5 Wh&Š&Š/ŠCŠLŠ\ŠxŠLine truncated
aaa*aCaGaMala`a}aaa°a�aaÏaÙa@"ŞöA ' H ���¥·×Üã%7W\cckr}ˆ�˜£®¹ÙáB+' H C8�ÁÆ:Æ:â:å:å:í:í:ñ:ø:;;;;';9;?;?;?;Z;_;d;r;r;};“;•;š;¨;¨;³;À;È;È;Ø;D.�ÁE`LU>�>�L�R�V�u�–�–�œ�FLUG°8K@;@;J;T;f;m;w;w;‹;�;�;©;¸;»;½;ó;H8KI@KPø;ø;ı;<$<JKPKĞ8

2
B
B
L
L
V
V
`
r

‚
„
�
š
š
š
´
»
»
Õ
Ü
ò
ò
  4 4 4 4 D D D V V d r ˆ ˆ � ¿ Ô ö  % - - - ? LA8M8480;4;;;=;N48O@+0;
;;;P+0QXB°g°gÆgâgíghhhhh/h/h>h>hDhFhFhLhNhNhThVhVh]hahfhfhfhfhfhfhnhƒhƒh�h’h›h¥h²hÇhÉhähæhii!i&i,i.i.iCiFiFimizi’i’i²i²i»iÀiàiÎiæiõiúij
jj%j-j2j2j2j;jTj^j^jwj…j…jŸjµj·j¿jÅjÍjÒjÒjØjØjájájòjôj k kkk!k&k&k,k,k5kDkXkZkbkhkpkukukukukƒk—k™k­k­kµk»kÃkÈkÑkÙkâkèkîkğkğkğkøkøklll l,l.lIlOlWl\lelplslyllˆl‹l‹l™l§l¬l¬lÏlìlòlúlÿlm␍m␍mmmmm7mImRmhmnmqm‘m“m–m²m¶mÁmÊmÙmğmömşmn nnnn&n+n3n3nJnTnsnsnyn~n~n„n‰n‰n�n”n”nšnŸnŸn¥nªnªn°nµnµn»nÀnÀnÀnÈnÈnánónón␍o#o#o%o%o.o4o9o9o9oAoAoJoYolononowo}o‚o‚o‚oŠoŒoŒo•o•o•o�o±oÅoÇoÇoĞoÖoÛoÛoáoçoçoöoÿoppppp,p.p1p6p>pFpKpKpRpVp[pjpopyp‡p‡p˜p¶p¶p¼pÎpßpépğpq q"q(q-q-q2qEqQqYqaqiqqqzqˆqˆq�q‘qšqšq¤q¶qÊqİqğqrrr-r2r2rOrTrfrpryrƒrŒršrŸrŸr²r¸r½rÌrŞrñrör
ss(s1sGsMsPspsusxs”s�s¡s¡s°sÃsÕsŞsôsúsıst"t%tAtEtMtRtkt~t~tƒtˆtˆt“t›t t t¦t¦t¸tÂtÈtÖtàtuu u-u-u2u:u?uHuMuMuXu`ueueujuyu~uƒu’u—u´u¶u»uÀuÅuÊuÏuÔuÙuÙuŞuãuÿuEvKvVvVvhvrvxv†v�vÇvÊvÏvİv÷vüvüvüvw wwwww"w*w/w/w4wCwHwMwRwRwewewzw€w€w’wœw¢w°wºwñwôwùwx!x&x&x&x.x3x<xAxAxLxTxYxYx^xmxrxwx|x|x�x�x¤xªxªx¼xÆxÌxÚxäxyy#y1yKyPyPyPyXy]yfykykyvy~yƒyƒyƒy”yšyšy¬y¶y¼yÊyÔy zzz!z;z@z@z@zHzMzVz[z[zfznzszszsz„zŠzŠzœz¦z¬zºzÄzûzşz{{+{0{0{0{8{={F{K{K{V{^{c{c{c{i{w{}{“{˜{˜{�{¬{Á{Æ{Æ{Ì{Ş{ç{ï{÷{ü{ü{|| |1|<|C|K|S|X|q|„|„|„|‰|‰|‰|™|™|™|™|�|¢|¢|­|±|¶|Â|È|Í|Ö|í|õ|ú|}} }}$}/}4}:}B}G}G}G}G}G}G}G}G}G}G}d}n}w}�}‰}�}—} }¯}¸}À}Å}Å}Å}Ë}Ó}Ø}Ø}Ü}á}á}ê}ø}~~~~ ~8~8~B~K~c~c~l~q~{~„~œ~œ~¥~ª~ª~³~¸~¸~À~Å~Å~â~ğ~ü~ "'''CLVVlyy„„Œ‘‘®¼ÅÊÊÊĞÔÙÙÙÙŞäêû€€¤�R2B
␍ ␍
 
␍

   




 

  
SpŒ—<B<BFBMBXB`BgBmBsBsByBTŒ—U¸AU€?€?Œ?“?Ÿ?¦?²?º?Ã?Ç?Ò?Ò?á?ê?ö?ÿ?@␍@VAUW¨–¨ÀYÀYÒYÜYäYèY÷Y
ZZZ*Z2Z=ZCZFZPZX–¨Yˆ—¥|B|B’B™B¢B®BÃBËBÑB×BÙBÙBèBZ—¥[ “¤°�°�¾�Ì�×�Ş�ô�ù�‘‘#‘*‘8‘C‘i‘\“¤]àB[¨�¨�Â�Æ�Ê�Ò�à�ã�æ�õ�ù�ı��␍���:�S�Z�a�a�n�q�ƒ�^#B[_H¥kìBìBCCCCCC)C0C2CECECECLCWC[C_CbCkCnCrCCCCµCÁCÒCâCøCıCDD D D#D*D7D>DQDYDYDjDrDwDwD�D›D›D¬D´D¹D¹DÑDŞDŞDïD÷DüDüDE E)E1E9EEE[EfE–EšE¨E°EµEµEÍEÍEçEñEıEF
F
F"F"F<FFFRFZF_F_F~FŠF›F F¸FÄFËFÓFØFßFçFìFìFôFùFùFùFùFÿFGGGG#G/G@GBGHGKGKGVGVG_GfGuG~G†GˆGˆGˆG�G›G¤G¬G´G»G¿GÊGÕGèGîGóGùGşGH␍H␍H&H+H9HAHCHCHCHCHCHCHHHHHOHOHXHXH\HcHgHzH‚H‚H‚H‚H„H„H‰H‰H˜H˜H½HÆHÊHÚX`Ğ¥k       
     
  a(¸€b€b b¢b¦b³b½bÈbÔbÜbæbccccc c"c"c.c3c3c?cDcDcPcUcUcacfcfcrcwcwcwczczc”c¢c¢c¶cÆcÆcÈcÈcÔcÚcßcßcßcâcâcìcûcd
d
ddd!d!d!d$d&d&d-d-d-d7dFdTdVdVdbdhdmdmdsdddŠd–d–d£d¹dÁdÇdÇdØdØdádäd¬gbl¸c°¨ÛPZPZlZsZ‚Z�Z�Z˜Z©Z­Z°ZµZÉZËZÎZÕZÙZåZïZóZúZ[[ [['[*[2[2[K[Z[_[g[s[�[‰[“[—[¢[²[d=¨ÛeÀwŒYY9Y@YOYRYVY^YbYfYkYxY€Y‚Y–Y�Y¥Y±Yf wŒg$A8>8>P>_>i>z>�>…>�>£>®>¹>ß>ß>õ>?␍???4?:?:?M?b?j?m?y?h'$AixçóH\H\T\[\z\…\“\�\¦\¾\Æ\jçókxÛç¸[¸[Ä[Ë[ê[ê[\\\\,\H\lÛçmğ[vˆ�ˆ�š�¦�±�Á�Á�Ä�Ó�Ù�Ù�æ�è�î�î�û�ı��␍����%�n%[vo€vƒ(�(�1�7�<�g�i�†�¬�³�Ä�×�pvƒqÀuŠ(A(A1A8ALAUAZAxA}A›A�A»A½AÎAáAêAìAB
B8Br uŠs˜ƒ“Ø�Ø�ì���!�&�?�A�U�i�i�q�x�«�tƒ“u¸Ui@@@%@'@3@:@I@T@`@d@r@r@…@‘@›@�@¨@vUiwPkrÜXÜXæXïXüXYxkry˜,\ğ]ğ] ^^Q^a^g^�^ ^°^°^µ^¹^¹^À^Ë^Ö^ã^ì^ì^ñ^ö^ı^____$_&_(_*_*_*_2_2_2_:_B_J_R_V_`_�_z:,\{¸ H]H]Z]Z]^]c]v]y]~]~]ˆ]�]�]Ÿ]¡]«]| }�,°]°]À]Ä]É]É]Ô]Ô]Ş]ä]ä]è]ğ]~,ø��˜`˜`¨`·`»`Ä`Ò`á`ğ`ğ`aaPaPaTa[a`ana}a}a“a–a›a¤a°a€&���@\� _ _°_´_½_À_É_Ò_Ò_â_â_ ````!`!`1`7`:`B`E`R`Z`b`j`r`r`…`…`‘`‚/\�ƒPQX®5®5¸5Ç5Ë5Î5Ô5„QX…ğ�¸°a°a¾aÀaÄaÍaÙaåaåaøaøa%b)b.b:b:bNbXb[bfbibqb{b†%�¸‡póşÈ\È\Ø\Ü\á\ë\ö\ù\ı\]ˆóş‰pş ]]]]!]+]5]8]<]D]Šş ‹P &°:º:Ë:Ü:ß:å:Œ &�@ ˜:¢:ª:¯:� �8vH{H{^{g{}{}{‚{Š{’{š{¨{­{µ{Â{Â{Ç{Ì{Ì{Ñ{Ö{Ö{Û{à{à{å{ê{ê{ï{ô{ô{ù{ş{ş{||| ||||||5|H|M|R|R|[|x|x|~|†|‹|�|˜|˜|�|¦|«|°|¸|¸|¾|Æ|Ë|Ğ|Ø|Ø|Ş|æ|ë|ğ|ø|ø|ş|} }}}}}$}*}2}7}<}D}D}J}P}X}]}b}j}j}j}{}ƒ}‹}“}›}©}·}¼}Ä}Ä}Û}ë}ü}~~~~#~(~/~/~3~D~I~Q~_~m~u~y~~~†~”~¢~ª~®~³~¾~Ô~à~å~í~ñ~ÿ~ &4BJNS^c{�•š� ‚�®v‘@Ñv€t€tLine truncated
¢.%£p¯ºĞsĞsÙsÙsÙsçsîsøsûst¤¯º¥pºÅtt t t ttt2t5t:t¦ºÅ§hÅÏ@t@tItItPtPt]tqtttyt¨ÅÏ©@.3ĞÂĞÂŞÂäÂêª.3«P�•æqæqôq rrrVr¬�•­@ 8:A:I:N:® ¯@ :):1:6:° ±ˆ34¢à‚à‚û‚ƒƒƒ%ƒ7ƒAƒAƒMƒ_ƒ_ƒtƒƒ‡ƒ�ƒ’ƒ¤ƒ»ƒ»ƒÓƒ؃؃èƒôƒÿƒ„„„&„-„=„=„L„T„[„k„k„k„{„�„�„�„’„«„º„¿„ĄτԄԄلò„…… …………/…8…C…J…R…Z…_…g…j…o…x…Š…“…¤…´…´…¹…Á…Ʌ΅օممޅޅޅç…î…õ…††I†N†T†]†]†l†s†{†‡†�†—†£†¯†¯†¶†½††ȆÔ†܆ä†ä†ä†ä†ä†ä†ä†ä†ä†é†é†í†í†û†‡ ‡‡‡+‡0‡0‡?‡M‡X‡]‡e‡j‡r‡w‡�‡Œ‡‘‡™‡�‡¦‡¸‡Á‡Ò‡â‡â‡ç‡ç‡ö‡ˆˆˆ#ˆ(ˆ0ˆ5ˆ?ˆQˆVˆ^ˆcˆkˆ}ˆ†ˆ—ˆ§ˆ§ˆ¬ˆ¬ˆÀˆƈшÖˆ؈èˆíˆíˆ ‰0‰B‰K‰\‰l‰l‰q‰q‰‰‡‰œ‰¯‰¹‰¾‰ÉˉÓ‰æ‰ë‰ğ‰ø‰ŠŠŠŠŠŠŠŠ$Š4Š9Š9ŠMŠSŠSŠiŠzŠŠ�ŠšŠŸŠ«Š³Š»ŠÊÈŠÚŠãŠôŠ‹‹ ‹ ‹!‹'‹'‹=‹N‹S‹X‹q‹v‹‚‹Š‹’‹š‹Ÿ‹±‹º‹Ë‹Û‹Û‹à‹à‹ò‹ÿ‹ ŒŒŒ%Œ.Œ9ŒBŒPŒbŒkŒ|ŒŒŒŒŒ‘Œ‘Œ«ŒµŒµŒËŒÜŒáŒæŒõŒúŒ ��� �'�,�>�G�X�h�h�m�m�‡�‘�‘�§�¸�½�Â�Ñ�Ö�é�ñ�÷�ÿ�� ��'�8�H�H�M�M�g�q�q�‡�˜���¢�¢�´�¹�¾�Ú�ó�ó�ø�ø�� ����&�)�.�.�R�Z�b�g�o��„�„�—�°�°�µ�µ�Á�Ç�Ï�Ô�Ü�ä�ç�ì�ì����&�6�;�\�q�y�”�š�¢�§�¯�·�º�Ô�Ü�÷�ı�‘
‘‘‘‘‘‘>‘R‘^‘d‘l‘q‘y‘�‘„‘—‘¬‘¸‘Ö‘Ü‘ä‘é‘ñ‘ù‘ü‘’"’@’F’N’S’[’c’f’f’f’f’x’�’’’—’©’¹’¹’¾’¾’ç’“ “ “'“=“B“G“G“Y“^“c“�“‹“—“�“¥“ª“²“º“½“æ“î“ô“ü“ ””””#”,”A”F”\”l”l”q”q”š”´”¾”¾”Ú”ğ”õ”ú”ú”%•*•=•ˆ•¡•©•®•À•ɕޕã•ù• – –––(–4–4–?–I–I–[–d–y–~–”–¤–¤–©–©–ÖÏ–Ï–Ş–è–è–ú–———3—C—C—H—H—b—n—n—}—‡—‡—™—¢—·—¼—Ò—â—â—ç—ç—˜ ˜˜˜!˜!˜3˜8˜=˜Y˜e˜j˜r˜x˜€˜Œ˜‘˜¤˜²˜¿˜˘Иؘݘå˜í˜ğ˜õ˜™&™.™I™N™V™[™c™k™n™ˆ™�™�™¹™Ù™Ş™æ™ë™ó™û™ş™ş™šš*š0š8š=šEšMšPšUšqš†š�š©š¯š·š¼šÄšÌšÏšéšñšñš›:›@›H›M›U›]›`›`›s›€›Œ›‘›™›�›¦›®›±›¶›Ò›ç›ï› œœœœ&œ.œ1œKœSœSœ~œ œ¥œ­œ²œºœœÅœÅœØœåœñœ÷œÿœ� ����8�M�U�s�y���†���–�™�³�»�»�ç�
����%�-�0�0�0�0�0�B�K�`�e�{�‹�‹�����ª�´�À�Å�Ê�Ê�Ü�á�æ�ô�ŸŸŸ!Ÿ)Ÿ.Ÿ6Ÿ>ŸAŸFŸbŸwŸŸšŸ Ÿ¨Ÿ­ŸµŸ½ŸÀŸÚŸâŸâŸ  + 1 9 > F N Q Q Q d q } ƒ ‹ � ˜   £ ¨ Ä Ù å ¡ ¡¡¡¡&¡)¡C¡O¡O¡{¡�¡¤¡¬¡±¡¹¡Á¡Ä¡Ä¡Ä¡Ä¡Ä¡Ö¡ß¡ô¡ù¡¢ ¢ ¢$¢$¢;¢Q¢V¢d¢o¢t¢†¢�¢¤¢©¢¿¢Ï¢Ï¢Ï¢ã¢ó¢ø¢ø¢£%£*£8£G£L£^£g£|£�£—£§£§£§£»£Ë£Ğ£Ğ£ê£ô£ô£¤0¤5¤5¤_¤d¤i¤i¤y¤‚¤‘¤‘¤–¤¨¤±¤Ƥˤá¤ñ¤ñ¤ñ¤¥¥¥¥4¥>¥>¥_¥z¥¥¥©¥®¥³¥³¥Ã¥Ì¥Û¥Û¥à¥ò¥û¥¦¦+¦;¦;¦;¦O¦_¦d¦d¦~¦ˆ¦ˆ¦©¦Ħɦɦó¦ø¦ı¦ı¦ §§%§%§*§<§E§Z§_§u§…§…§…§™§©§®§®§ȧҧҧ󧨨¨=¨B¨G¨G¨W¨`¨o¨o¨t¨†¨�¨¤¨©¨¿¨ϨϨϨã¨ó¨ø¨ø¨©*©/©A©J©_©d©z©Š©Š©•©š©š©±©Ç©Ì©Ş©ç©ü©ªª'ª'ª2ª7ª7ªNªqªvªˆª‘ª¦ª«ªÁªѪѪܪáªáªóª«««,«5«D«M«c«c«u«~«“«£«£«¨«¨«è«è«è«ÿ«¬,¬P¬`¬e¬e¬e¬n¬…¬˜¬¡¬°¬°¬µ¬µ¬õ¬õ¬õ¬ ­ ­]­m­r­{­’­¥­®­½­½­­­®®®®,®j®r®w®€®—®ª®³®®®Ç®Ç®Ç®¯¯¯'¯:¯C¯R¯R¯W¯W¯—¯—¯ª¯³¯¯ǯЯ߯߯°°°° °(°0°C°H°M°U°]°e°e°j°j°j°j°j°j°ª°ª°³°°ǰǰǰÖ°Û°Û°í°ù°±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±"±"±"±"±"±(±-±-±6±D±R±W±_±d±s±~±‰±‰±�±�±¥±­±­±´±´±ɱѱä±ò±÷±ÿ±² ²²"²"²)²)²>²F²F²M²M²b²j²u²‰²‘²–²¡²¬²¯²¯²²²¹²¹²DzÕ²زݲê²ñ²ù²ù²ü²³³³ ³"³'³8³?³G³G³L³LLine truncated
 
 
 
 
 
 
    ³Ø3‹ğÂğÂÃ␍Ã"Ã$Ã-ÃEÃ[ÃjÃrÀÄÖÙáêîîÃÁÃÚÃÄëÃ*Ä>ÄOÄ_ÄuÄuėĩĺļļÄÇÄÅÅ ÅÅÅÅÅÅ-ÅBÅMÅXÅ`ÅhÅlŃŃśŠŠŰŸÅÊÅÔÅæÅğÅÆ ÆÆÆ!Æ)Æ;ÆEÆWÆaÆqÆ}ƂƂƒƚƬƶÆÈÆÒÆâÆîÆóÆóÆóÆÇÇ Ç$Ç1Ç=Ç=ÇBÇMÇ\ÇaÇfÇkÇkÇpÇ{ÇŠÇ�ǔǔǔǔǔǔǔǔǔǙǙÇ�ǤǤǤǤǤǤǩǩǸÇÊÇÖÇßÇìÇøÇ ÈÈÈÈ3ÈGÈXÈyÈ~ȕȧȾÈÇÈĞÈİÈåÈøÈÉÉÉ
É
É
É
É
ÉÉÉÉÉ;ÉTÉ\ÉwɈɩɫɿɿɿɿɿɿɿɿÉÄÉÄÉÄÉÓÉáɿɿÉñÉÿÉÊÊ(Ê1Ê1ÊFÊRÊWÊfÊjÊrÊ�ʛʤʩʯÊÂÊÊÊÖÊêÊûÊË!Ë&Ë&Ë&Ë&Ë1Ë?ËDËVËbËkËwË|ˀ˅˅˅˅˅˅Ë�Ë�Ë�Ë�Ë�Ë�Ë�Ë�ˣˣˣˣˣˣ˸˸˸˸˸˸˸˸˸˸ËÀËİËúËÌ!Ì2ÌSÌUÌiÌuÌzÌzÌzÌƒÌ¡Ì­ÌØÌäÌäÌéÌéÌéÌéÌéÌéÌéÌéÌéÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ ÍÍÍÍ#Í(Í(Í(Í0ÍHÍQÍUÍ`Í”Í�ͣͨͰ͵͵͵͵ÍÇÍÛÍùÍÎ ÎÎÎÎ%Î9Î_ÎjÎrÎwÎwÎ|Î|Î�΢ÎÀÎËÎĞÎÕÎÚÎÚÎìÎÏ&Ï1Ï9Ï>Ï>ÏCÏCÏCÏKÏhυϑϰÏÁÏâÏäÏóÏõÏõÏõÏõÏõÏõÏ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
Ğ
ĞĞĞĞ"Ğ)Ğ)Ğ)Ğ)Ğ)Ğ)Ğ)Ğ)Ğ)Ğ)Ğ)Ğ)Ğ)Ğ)Ğ)Ğ.Ğ.ĞBĞDĞDĞNĞNĞUĞgДЪнĞÒĞêĞíĞúĞÑ4ÑWÑ�цљѣÑğÑğÑóÑÒÒÒ:ÒHÒLÒLÒ_ÒyÒyÒ¥Ò¨Ò·ÒÌÒíÒşÒ8Ó$ÓÓHÓZÓZÓ]ÓbÓeÓ‚Ó�ÓÂÓäÓäÓÔÔ"Ô7ÔXÔiÔ�Ô{ԫԫԫԮԳԳԹԯܴb3‹   µ¸àTØäØäêäÿäåååå%å%å6åFåQåaåfåkåsåså€å�åšåšå¢å¦åªåÀåÀåØåÚåÚåéåñåñåææææ æ æ æ'æ'æ'æ+æ3æ8æ=æ=æAæIæMæRæRæRæRæRæRæRæRæRæRæRæRæRæRæWæWæcæ|æŒæ•æ¨æ­æµæµæºæºæÄæĞæéæùæç
ççç'ç,ç4ç4ç9çCçQç}ç‰ç‰ç›ç¥ç­ç²çÁçĞçÕçáçççìçìçìçìçìçìçìçìçìçúçèè'è,è4è9èAèEèXè]èeèjèoèoèoèwè|è„èˆè�è™è¡è¦è«èµèÃèïèûèééé é$é3éBéNéTéYé^é^éhé�é‹é¤é¯é·éÌéÎéİéåéúéúé êêê(ê7êIêOêTêXê\êkê~ê˜ê§ê¯êÄêÄêĞêÕêáêìêñêñêë2ë7ëAëVëaëië~ëƒë’ëšë¯ë´ëÂëÜëëëóëìììì%ì0ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì5ì:ì:ì:ìBìBìBìBìBìBìBìBìBìBìBìBìPìpì•ì¥ìªì²ì·ì¿ìÃìÇìÚìßìçìììôìùìíí íí"í*í,íLíTíYíaíeíiírízíí„í�íœíÈíÔíÜíÜíîíøíıíîî#î'î:î@îEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîEîJîJîJîWîdîhîuî‹î“î¥î¯îÁî×îÙîÙîäîéîïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïï ï ï ï ï ï ï ï ï ï ï ï ï ï ï ï ï ï ï ï ï ï ï ï$ï0ïPï_ï_ïiïsï“ï›ï�ï£ï£ïµïÂïÂïÇïÇïâïóïöïùïğğğğğ ğ&ğ.ğ>ğNğ[ğağiğyğ‰ğœğ¢ğ¢ğ§ğ§ğ§ğ§ğÀğÌğìğÿğÿğ␍ññ?ñGñJñOñOñañnñnñsñsñ’ñ§ñªñ­ñµñºñºñÃñÌñÔñÚñâñòñòòòò-ò=òPòVòVò[ò[ò[ò[ò[ò[ò[ò[ò[ò[ò[ò[ò[ò[ò[òfòqòò‘ò–ò–ò¡ò«ò¼òÁòÁòÈòÍòÍòáòáòæòæòæòüòó,ó?óEóMóoó|ó‹ó‹ó�ó�óšóšó¥ó«ó¹óËóËóÒóÙú~àT        
    ·p¬àúàúòúûû û ûû1û<ûCûTûgûmûmûmû|û–û�û¦û°û³û¿ûÈûÒûÕûÚûÚûğûúûúûüü%ü:üAüJüVükürürürü€ü�ü˜ü›ü©ü³ü¶üÈüÈüÍüÒüâüåüêüúüıüı
ıı$ı)ı1ı@ıOıOıOıeıoıoı‡ı�ıšı¯ı¶ı¿ıËıàıçıçıçıõış␍şşş(ş+ş=ş=şBşGşWşZş_şoşrşvşş‡ş™ş�ş¦şµşÄşÄşÄşÚşäşäşüşÿÿ$ÿ.ÿ>ÿPÿWÿfÿwÿwÿ~ÿ~ÿ~ÿŒÿšÿ¤ÿ§ÿµÿ¿ÿÂÿÔÿÔÿÙÿŞÿîÿñÿöÿ&8=ETcco��ˆ¯¸µ¬¹à’ ĞĞæéù ,,:BENNUUfv�…�›£®ºØİìììò÷&;NT\ou}}‚˜¤¹¼¼ÊÕãñÿ  +7@TYpx�‰‰±´¹¹ÂÕÛãöü   ' 4 G M U h n v v v v Ÿ Ÿ ¤ À à Ê Ú ç 

.
8
E
a
u
u
¹
ºƒ’ 
»€%’:LTT``gxŠ��››£¨°°¿ØÚâû (33;DOXcmvyƒ’£µ¸½ĞĞéı 22K_ggy|�””­ÁÉÉÕêíö %>@Unvv��œ¡¡¨³Ê¼w%’½Ğ)8À
À
Ú
í
û
 & 0 > > [ h h r r | � ™ ™ ¤ ¤ « µ » Á È İ è      % 0 ; U _ g ~ Ÿ ´ À Ğ Õ Õ Û á ì ù ␍!␍%␍+␍3␍8␍A␍b␍f␍l␍t␍y␍y␍†␍�␍¨␍”␍´␍¸␍¾␍Æ␍Ë␍ì␍ğ␍ö␍ş␍)59?GLmqw„‘˜¹½ÃËÔõùÿ 'HLRZc„ˆ�––¢¯×Ûáéù$,,1>Efjpxˆ©­³»»»»ÀÀÀÍÔõùÿ15;CCPWx|‚Š“´¸¾ÆÆÆÆÒÒİçğ-2CWWw|��Œ”œ¥ÅÒáğ

*/44?G\gt™«½ĞÈèíòòòöö;@EEMaj�›¦¦ºÈÑÖÛààèóøø 6 NSS[yc‘––¡·Øäõú   ?DI]Iuzz‡ŒŒ”™™¥ÈÍÍáÍùşş  *///CSXXXl|���•¥ªªª¾ÎÓêÓSAkp¬špÄÉÉÉØèíííü  .3[I3sx �x¸½åÓ½ı#␍M]bbb�m«»ÀÀÌÑÑİâââõ


-222EUZZZm}‚‚Š��—œœ¤©©±¾ÃÃĞÕÕâç5#çBG•ƒqG¢§§§ÑÖÖÖç&++388@EEMRRR�|]­ÈÍÍÍ ÷Ø(CHzhH’—É·—áæ æ  :  R W W W w | ’ Š � ® » Í ğ õ   + 8 q ‹ ™ · ¹ è ğ ğ ğ ü ü !!!7!B!L!W!\!g!o!t!y!y!„!Œ!•! !°!È!à!ô!ù!ş!ş!"$"."3">"H"M"M"X"k"u"€"¡"­"¾"Ã"Ô"Ø"İ"â"â"ò"ı"###&#1#K#]#o#z##Š#›#¤#¯#¼#Ç#á#ó#$$
$$$$ $ $*$/$/$:$?$?$J$O$O$i$n$n$v${${$†$‹$‹$–$›$›$¦$«$¿$«$Ë$Ö$Û$ï$Û$û$% % %%%%&%4%9%9%J%O%O%`%e%e%%Š%�%—%�%£%¨%¼%¨%È%Í%Õ%Í%á%æ%ú%æ%&& & & & &+&+&0&<&0&T&Y&Y&e&Y&}&‚&‚&�&‚&¦&«&«&·&«&Ï&Ô&Ô&Ô&ä&é&ı&é& '' '+'0'D'0'P'\'g'r'w'‹'w'—'¨'­'­'µ'º'º'Â'Ç'Ç'Ğ'Õ'Õ'Ş'ã'ã'ì'ñ'ñ'ü'(( ((((!(!(,(1(1(<(A(A(L(Q(Q(\(a(u(a(�(Œ(—(¢(§(§(´(¹(¹(Æ(Ë(Ë(Õ(Ú(Ú(ä(é(é(ó(ø(ø())))))!)&)&)3)8)8)8)8)8)@)E)E)M)R)R)Z)_)_)g)l)l)t)y)y)�)†)†)†)†)†)š)Ÿ)³)Ÿ)¿)Ğ)Õ)Õ)ë)ö)ö)* *5*@*Y*E*e*p*{*€*€*–*¡*¡*Å*Ê*à*ë*+ğ*++&+++++A+L+L+p+u+‹+–+¯+›+»+Æ+Ñ+Ö+Ö+,ì+ , ,0,5,K,V,[,z,f,š,†,¦,¿,«,ß,Ë,ë,ö,û,û,%--1-1-U-Z-p-{-€-Ÿ-‹-¿-«-Ë-ä-Ğ-.ğ-.. . .J.6.V.V.z..•. .¥.Ä.°.ä.Ğ.ğ. /õ.)//5/@/E/E/T/Y/Y/h/m/m/~/ƒ/ˆ/ˆ/™/�/£/£/°/¿/Ä/É/É/Ö/å/ê/ï/ï/0000=0B0G0G0i0n0s0s0•0š0Ÿ0Ÿ0Ÿ0Á0è0í0ò0ò011111@1g1l1q1q1“1˜1�1�1�1¿1æ1ë1ğ1ğ122222>2e2j2o2o2‘2–2›2›2¶2»2À2À2À2Û2à2å2å2å233
3
3
3%3*3/3/3J3O3T3T3T3o3t3y3y3y3”3™3�3�3�3¹3¾3Ã3Ã3Ô3Ù3Ş3Ş3ï3ô3ù3ù344;4Y4Y4Y4r4w4ƒ4‘4°4»4à455!565F5K5K5V5[5[5t5x5„5�5˜5¬5¶5É5Ğ5Ğ5Ğ5Ş5ã5ô5 66 6*6267676<6<6@6D6P6Z6d6i6i6n6n6y6ƒ6ƒ6ƒ6ƒ6ˆ6ˆ6ˆ6’6’6—6—6¡6¡6®6Î6Ó6Ó6İ6İ6â6â6é6é6ö6777%707;7@7i7a7�7‘7º7²7Ò7Ò7Ò7Ş7ç7í7û7û78868?8G8g8g8g8g8‹8•8ª8È8È8È8÷8999 9;9P9Z9Z9Œ9“9˜9�9¤9«9°9·9À9Ö9Ö9Ú9Ú9û9::: ::!:3:H:`:l:}:‚:“:²:Î:å:è:í:ø:ı:ı:;;,;7;7;:;L;L;~;¡;¡;¡;ÏB¾A8  

 
 ¿€˜¥ğrğrsss%s0s0s=sNsSs]sÀ˜¥Á@€:Š:’:—:ÂÃPîëîë÷ëìì#ì#ìCìÄÅH]ƒV@V@l@r@y@�@‰@Œ@—@«@²@µ@·@À@Ò@Ò@Õ@İ@ó@ö@AA
AAAA+A+A?AEAMAŠAÆ0]ƒÇ€ÌYннâ½ó½û½¾ ¾¾¾¾)¾<¾U¾X¾k¾k¾s¾|¾‚¾‡¾‡¾�¾˜¾�¾£¾£¾«¾´¾º¾¿¾¿¾Ç¾Ğ¾Ö¾Û¾Û¾ä¾ğ¾ô¾ù¾ÿ¾¿¿ ¿¿¿ ¿ ¿:¿P¿P¿P¿X¿Z¿Z¿Z¿b¿d¿d¿d¿l¿n¿n¿n¿v¿x¿x¿…¿…¿‹¿�¿—¿¢¿¢¿²¿²¿²¿¹¿Ä¿Ä¿Ô¿Ô¿ß¿ã¿é¿ÀÀ"À.ÀKÀNÀUÀgÀoÀxÀƒÀƒÀ�À”À™À À«À°À·ÀÂÀÎÀÔÀÔÀëÀóÀùÀùÀÁ'Á-Á2Á9ÁDÁDÁIÁ]ÁbÁhÁjÁjÁqÁ|Á|Á‰Á‰Á‰Á‰ÁNÂÈ—ÌY  É°ĞÆãÆãÜãããîãûãä ä+ä+ä?äGä_äeäƒä—ä¢ä¨äÁäÁäÑäÑäèäêäíäùäå åå å%å+å7å7å9åMåXå]å]å]åvååšå¬åºåÇå×åäåäåñåûåæææææ#æ#æ+æ0æ0æ8æ=æ=æEæJæJæQæVæVæ]æbæbæmæræræ}æ‚æ‚æ�æ’æ’æŸæŸæ´æ»æÁæÄæËæÎæÙæàæãæãæ÷æùæÿæ
ç
ç
çç-çBçRçcçiç|ç‚ç‡ç‘ç¤çµçÀçÆç×çäçîçıç
èèèè2è8èIèVè\ènènè€è…è“èŸè§è¯è·è¾èÄèÕèâèçèééé)é0é@éJéPéXé^éiéoété�é“é“é“é�é§é»ééëʽĞË0©Ìˆ¼ˆ¼–¼–¼ª¼®¼¶¼¾¼É¼Ô¼Ü¼ç¼ò¼÷¼÷¼½½ ½*½5½7½B½M½^½`½l½w½‚½‹½“½“½—½Í½Ì-©ÌÍ(L�¦T¦TÆTÆTİTâTêTòTúTÿTU"U+U2U8U=UEUaUkUmUoUUU�U�U§U©U«U»U»U»UÀUÈUĞUØUİUñUVV VVVV)V0V7VCVaViVvV|V�V–V�V�V±VÁVÁVÄV␍WÎLL�Ïx->4>4D4X4[4c4j4n4r4r4y4€4„4Œ4�4�4—4�4¢4ª4®4®4µ4¼4À4È4Ì4Ì4Ó4Ú4Ş4æ4ê4í4ñ4Ğ6-ÑĞîV2V2d2d2x2z2z2†2ˆ2”2–2¢2©2±2¸2Ç2Ç2Õ2×2â2â2õ2333Ò(ĞîÓØOgÎhÎhæhæhñhüh ii i2i8iKiQi]iqiqi…i•i£i©i¼iÂi#jÔ"OgÕ ƒ¤�A�A¦A®AµA¿AÅAĞAàAèAíAøAøABBB#B+B;BBBJBRBZB_BjBjBxBxB�BÖ+ƒ¤×
,m>í>íBíFíaíiíyí„í“í�íÂíÖíÖíãíãíôíöíîî#î.î9îHîHîPînî�î¥î¥î­î­î­îÚîãîñîıî#ï%ï-ï/ï/ï/ï/ï/ï8ïJï]ïfïnïpï€ï€ï€ï€ï�ï�ï�ï�ïªïÆïßïßïõïşïğğ!ğ9ğFğJğNğSğbğnğ‡ğ�ğœğªğ¾ğÇğÏğÚğîğğğñññ$ñ1ñ=ñRñmñmñmñ|ñ’ñ©ñ¿ñÕñ×ñ×ñ×ñíñïñïñóñõñõñşñò ò ò òòò%òRò[ò_òcòhòwò…ò‘òšòšò°ò»òØòó ó ó ó)ó>óMóYódóxó�óªóºóÃóÇóÇóÔóáóåóòóôô ô?ôIôIôMôXôsôsô…ô”ôªôÁô×ôíôíôòôòôõõ)õ<õRõhõqõqõvõvõvõŒõ‘õ‘õ‘õŸõµõËõËõËõäõïõûõö*öTö`övö‰ö�ö¨ö¾öÉöÙöëö÷÷(÷(÷-÷:÷G÷_÷l÷p÷t÷v÷v÷v÷v÷�÷Œ÷Œ÷™÷¦÷ª÷¹÷Ğ÷Ğ÷Õ÷Õ÷ı÷ø*ø@øEøEønø„øšø°ø¹ø¹ø¾ø¾ø¾øÔøÙøÙøÙøëøùùùù0ù;ùGù]ùvù�ù‘ù£ù¿ùÕùàùàùàùåùïùúú,ú>úbúrú„úˆú•ú•ú•úŸú¦ú»úÄúÒúãúãúúúúúû ûCûUûZû�ÿØK,m
 
   
Ù`g�&j&j@jUjUjijojjjŠj˜j¤j¸jÃjÓjÓjçjíjójùjùjkk$k-k3k3kGkMkbkqkyk‡k�k›kíkÚ3g�ÛxÕ!>Y>YTYbYuY�Y‘Y–Y«Y²Y¸YÀYÆYÔYêYøYÿYZZ"Z9ZFZ\ZoZvZ‰Z—ZœZ¤ZµZºZÕZŞZíZõZ[ [␍[$[C[H[S[e[p[y[[Š[�[—[Ÿ[â[Ä[÷[,\\A\D\I\U\`\k\]ÜVÕ!ݼšöö )AS\bfjl„–£©­±³·»»áåëëòò)<OU`kuy|ƒ‰�“¤ª¯ÃÅÙÛââïñ**BNk�©®ÅÊØìñ÷%28<<OUUhj€…‡�¢¢¢°¹¼Ïçùü*8>ITTYYfuu{‰�«±´·¾ÎÙÙŞŞëúú"069<CCJQQ^mmx†‘—¢­­ÁÁÛèóı   * B G G p ƒ Š – – ¯ Æ Æ ä æ ş $
/
Q
d
‹
�
�
š
¼
¼
¼
Õ
ã
ñ
  Õ Şè¼šßP�ÕWW.W5W>WFW`W`WiWkW{W{W}W—W¡W£W¥WµWµWµWµW¹WÂWÊWÔWŞWâWâWôWXXX X X.X.X=XBXGX[XjXjXlXvXXˆX�X•X±X¸X¿XÆXÔXİXY Y YYYY$Y'Y7YàQ�Õá8-Qö4ö4ü4555"5&5*5*51585<5D5H5H5O5V5Z5b5f5f5m5t5x5€5„5„5‹5’5–5�5¢5¥5©5â.-Qã`/8^>^>r>Æ>·>>}>Ú>â>ä/8åØ!]]$]+]+]+]X]X]f]f]f]v]]†]�]–]–]�]¦]Â]Ï]Û]ã]ã]î]^^^#^+^4^9^9^L^W^`^k^p^p^€^…^…^…^…^š^Ÿ^²^¸^¸^Ò^æ^æ^ë^ë^û^___ ____%_,_,_;_A_N_U_X_o_o_w_†_‘_˜_š_®_¹_À_Å_Ê_Ê_Ê_Ê_ß_ä_ó_ú_ú_`(`(`-`-`5`D`K`P`d`k`p`p`|`�`�`¢`±`Ä`È`×`á`è`ğ`÷`a"a'a6a6aMaTaTagaiapaƒa…aŒa›a§a®aÄaËa×aéabbbbbb)b=bMbUbWbkb€b‡b—b¤bÅbÌbØbccc c ccc!c%c0c7c>cTcYcYcicrczccc�c“c§c¶cÅcĞcÛcécïcõcûcd ddd*d6dBdUdldnd{d†dˆd”d½dÃdÉdÏdØdØdéd ee$e0eEeZeZegelele€e†eˆeˆeˆeˆeffæ!     ç9ffff†f†fšf f¬fÀfÀfÔfÚfåfìfüf ggg"g(g/g:gHgUgegsg‚g‚gÁgè*9épXcÖ5Ö5à5à5ù566 6 66êXcë˜ .q.q8qBqLq^qcqiquqwqwq‹q‹q‹q�q½qì í�¼¦¦´´ËÕŞàç÷**--N[]v}�� ïî)�¼ï@ nìnìwì‹ì�ìğ Line truncated
~
~(~,~1~A~L~^~j~~~‘~–~£~µ~È~Í~Í~Ó~Ó~ê~ü~*055;AFFL[o|‚…ŠŠ�Ÿ³ÀÆÉÎÎÔæìïôôú €€€€€ €2€8€;€@€@€F€X€^€a€f€f€l€q€w€z€€€€ƒ€ƒ€“€œ€£€²€·€È€È€Ò€İ€â€è€õ€û€ş€� � ��!�7�B�J�R�W�l�q�w�‚���—���¯�¯�Á�Ä�Ä�Ê�Õ�ñ�ı�‚&‚&‚&‚4‚H‚H‚U‚g‚g‚g‚k‚‚”‚:‡üwœ     
           
  

  

     ı@8]æ>æ>? ???$?*?8???o?…?’? ?®?É?Ï?Û?ß?í? @@%@'@.@.@<@B@B@T@ş/8]ÿ¨M¾q¾qÔqÛqâqéqğqûqrrr'r2rBrZr`rkryr‡r’r¸rÒrÒrßrîrşrss sss"s-s8s?sRsXsfsns„s�s•s›sÏs<MÀ– îkîklll%l%l9l?lKlVlblmlyl…l™l°lÃlÚlÚlñlmmmm0m6mKmcmmmxm~m‰m—mœm¦m°mºmÁmÇmÓm×mßmâmåmømşmnnn n)n)nJnTn`ndnhnknqnsn€n€n�n•n¡n§n·n·nÄnÈnÎnÓnØnßnânønønınoo)o9o9oMoSoboeoyo�o�o´oÎoÙoëoîoóoúo p p7p=pApRpapsp)q– �MœÖsÖsğs÷st't1t>t>tCtNtZtetetrttt‰tŒtŒtštªtºtÄtËtËtàtõtõt u'u4uCuPu^uuuuu�u�u�u«uµu¼u¼uÑuæuæuúuvv%v+v>v>vDvDvQvSvhvkvyv�v�vªv·vÇvwYMœ(¤�B�B°B»B¾BÆBÉBÉBÙBæBæBíBôBûBCCCCC"C@CGCJCRCZC_CkCqC�C–C™C¡C©C®C®CµC»CÎCÔCÚCãCåCìCìCõCÿCD DDDDD+DBDEDTD`DoDoDoDoDtDtDˆD�D¡DÀDÔDêDñDÿD EEEEE,E5EDEUEbEbEbEvEŠEšE�E-Fl¤(.Ğ$$8$?$T$^$^$m$x$x$¦$·$À$À$Ï$Ï$Ù$Ù$ä$%%%%% %4%A%A%P%W%j%p%�%›%�%¶%¼%Ç%×%é%ò%ù%ş%& &2&7&E&N&N&U&U&d&{&{&Š&�&¦&°&·&¼&Ç&Í&Õ&û&' '''*'9'I'N'V'b'p'p'‡'’'¡'±'±'Å'Ë'Ô'Ô'Ô'ã'é'ø'(("(4(C(K(V(j(u(‡(š(¥(¸(Ù(ì(ğ(ü(),),)@)F)Q)])m)})‚)‹)Line truncated
'19I]]mm�‡¯¸¸ÍØØêöü,8<N`hoŠ˜˜˜¥Á¬ÒÉÜŞúæ..5;DLOfr†y�”���°µµÀÍÔÛÛèóù%06;BLLYdjov���•œœ¿ßááş%22EERdo~‡Œ³¼ÇÌÔÜì%%=RY_hh‹’—¥µÃÃÉĞÙÙÙìì$,IQVk~ƒ‹‹ ª¿ÏÏÏÏÛÛÛèèş

+6DOO_f…˜�µÊÏÏŞóóù!4@@MP[my„‰•¡®³³ÍÒÒñ   !5C[[amv{œ¥±·ÀÀÀÙïïïü!00HNYYYfloz€ƒ‹šš²¸ÃÃÃÔÚİèîñó!4LRaayŠŠ—$
�š.
  ¨cÕ6646?6J6J6]6o6o6ƒ6Š6�6–6›6À6À6Í6Ğ6Ù6Ù6í6ó6ø6 72767<7S7Z7h7n7z7ˆ7�7›7´7Â7Ë7Û7İ7ä7é7ñ7888*8G8f8m8w8‹8‘8—8�8£8±8Ç8è8ü899'9/9>9K9X9f9t9�9›9 9®9Í9ß9ö9ÿ9:::::1:<:I:P:P:P:b:q:s:…:”:²:²:º:İ:è:); |cÕ␍°Ü/.;.;U;U;h;};ˆ;¢;°;·;Æ;Í;Õ;ë;ó;ó;<<2<<<><U<e<n<t<y<€<‡<�<“<�<©<¬<³<Í<Õ<ï<===== =2=A=L=T=T=k=„=ˆ=‘=˜=¶=¾=Å=É=Ò=×=é=>>>>>'>'>'>)>@>F>F>X>]Ü/à ?.F.FLFTFZFZFkFˆF–FœFœFœF©F«F¶FÀFÇFÓFàFæFğFğFûFGGG G/G5G:GBGKGQGYGhG}G‚G†GŒGŒG”GœG¢G¢G·GÃGÈGĞGÚGåGîGîGH
HH&H+H2HGHKHKHSHYHkHqH‡H�H�H«H¸H¸HÀHÌH×HİHáHûHI
IIII*I?IDIHIOIUI[I[IcIgInItIzIzIzI¥I¥I¶I¶IÍIÚIŞIŞIâIğIJJ JJJJJ-J>J>JSJgJsJ�J…J—J›J¡J¾JÀJÆJ×JÙJåJ KKK@KKKQKWK]KfKmK{KŒK˜KœK®K²K¸KÕK×KİKîKğKüK"L(L.L4L=LDLDLTLrL{L�L�L–L›L›L¢L©L»LÀLÀLÀLÚLßLıLM M&M.M9M\MbMhMtMˆM�M•M¡M¦M¦M±MµM¼MÎMÓMÛMàMëMñMùMşM␍N␍N%N2N2NENVNVNpNuNuN�N�NšN©N®N·N¼NÉNĞNÕNÕNàNäNëNıNO
OOO(O/O3O;OCOKO^OjOoO{O{O„O„O�O�O¸O¾OÃOÇOÌOÌOÌOÌOÒO×O×OúOPP/P4P4P4PAPAPAPFPUP[PqPqP”PÿSC?

È9OÆgÆgŞgŞgògøghhh1h1hEhKhKhVhfhuhƒh�hËh 9OX.6� � ™ � ¦ ¬ ¬ ± .6ˆ6D¸ ¸ È Ï á ä ä ë ë 


6D`
hhr�‹›Ÿ¢¨
8
.¨¨¿ÆĞÖÙÙàåöûş   ) 1 F Q c g i {  � � � ‹ .
.xiu¨@¨@¸@¿@Û@é@î@î@AAA!Aiuh  0BHNT €À~À~Ì~Ö~İ~ä~ø~

  !˜P`�8�8 8 8»8Å8Ì8á8ñ8ı89)9"P`# oPP␍P␍b␍u␍‹␍Ğ␍×␍ë␍ò␍ú␍ %-4;IWr€‰‰µÖå
 /Lv…ªÃÅÌÓÓğ5Lczzz‰–›››ª·¼¼ÂÇÇÍØİİãîóóù%**0;FKKQ\gllr}ˆ“˜˜�¦««±¼ÄÉÉÏÚâççíø !)..4?JRTTZepxzz€‹–¡©««²²ÀÃÃËÚÚéûûş *7F[`w‚���¼ÊØ6<ALjqvŠÄÉĞתããêğõõ6<A`ggglov}„‰‰�–››²ÙÙç#***,,,2<DIQ[iqs{{€€€’š·ËËĞÕÙİİğş.IQc‚Šœ»ÃÕÚôü-5Gfn€›£µµµÈÖğû␍,7Ihs…¤¯ÁÆàëı'9Xcu”Ÿ±±±¼ÊÕØ #11Z~ƒ°µâç(-;;dˆ�º¿ìñ22;Na‚‹¬ºÈÖáåéı $9\{‰—�¸ÌÚáû  ) . 5 5 d „ Ÿ ­ ­ Û  ; @ r w © © ½ Ş å ğ ó !!#!'!B!F!]!a!a!{!�!–!›!©!º!Á!Ú!ı!""/"4"M"R"k"{"™" "º"Î"Î"#4#H#[#[#Š#³#Ç#Ì#Ì#×#$$J$^$c$j$j$”$™$Ã$ç$û$%%%%>%b%g%”%™%Æ%Ë%ø% & & &#&8&C&J&d&y&‰&‘&«&À&Å&Ì&æ&û&û&û&'''5'<'V'k'{'ƒ'�'²'·'¾'Ø'í'í'í'ÿ'ÿ'ÿ'
(&(;(M(k(}(‘(‘(–(–(–(¢(¾(Ó(Ø(Ø(Ø(â(ş())))#)?)T)Y)Y)`)c)})‘)¦)«)«)³)¶)Ğ)ä)ù)ş)ş)**"*6*K*P*P*b*g*g*y*~*~*�*•*•*§*¬*¬*¾*Ã*Ã*Õ*Ú*Ú*ì*ñ*ñ*++++ + +1+6+6+H+M+M+_+d+d+v+{+{+~+¼+Ñ+Ñ+ã+ã+ã+î+
, ,$,$,$,0,L,a,f,f,f,p,Œ,¡,¦,¦,¦,±,Í,â,ç,ç,ù,ş,ş,---'-,-,->-C-C-U-Z-Z-l-q-q-ƒ-ˆ-ˆ-š-Ÿ-Ÿ-±-¶-¶-È-Í-Í-ß-ä-ä-ö-û-û-␍....S.h.h.h.r.r.€.�.Ÿ.­.».Ì.è.ù.///D/`/p/‡/˜/¦/­/�8$ëoP%˜`p0909B9D9K9K9f9p9v9‹9˜9›9§9Ô9&`p'Ğ8o@ @ N U X X c n   Š • • ™ � � ² ¿ ¿ Â Ø Ü á í ô ␍␍␍␍"␍$␍=␍I␍(A8o)P?FTT
TT,T9TVT*?F+HFLVTVTdT}T„T¤T,FL
+25
View File
@@ -0,0 +1,25 @@
#exe {OptOn(OPTf_WARN_PAREN);};
#exe {OptOn(OPTf_WARN_DUP_TYPES);};
#include "/SparrowOS/OSMain/Static.HPP.Z"
#include "CmpAsm"
#include "CmpExts"
#include "CmpGlbls"
#include "CmpQueVect"
#include "Unassembler"
#include "Directives"
#include "Lex"
#include "CodeGen"
#include "Hash1b"
#include "Assembler"
#include "ExpParser"
#include "StmtParser"
#include "BackEnd"
#include "OptPass012"
#include "OptPass3"
#include "OptPass4"
#include "OptPass5"
#include "OptPass6"
#include "OptPass789A"
#include "CmpInit"
#include "CmpMain"
+79
View File
@@ -0,0 +1,79 @@
Bool OptEqu(I64 num,Bool val) {
return BEqu(&Fs->last_lex->opts,num,val);
}
//Turn on compiler option
Bool OptOn(I64 num) {
return OptEqu(num,ON);
}
//Turn off compiler option
Bool OptOff(I64 num) {
return OptEqu(num,OFF);
}
//Get state of compiler option
Bool GetOpt(I64 num) {
return Bt(&Fs->last_lex->opts,num);
}
//Displays intermediate code as it is being added
Bool PTrace(Bool val) {
return OptEqu(OPTf_PARSE_TRACE,val);
}
//Displays intermediate code after passes through optimization
Bool OTrace(Bool val) {
return OptEqu(OPTf_OPT_TRACE,val);
}
//Ctrls which optimizer passes are displayed
I64 OPassTraceMask(I64 i=0b1001111101) {
I64 old=Fs->last_lex->pass_trace_mask;
Fs->last_lex->pass_trace_mask=i;
return old;
}
//Displays assembly code output
Bool CTrace(Bool val) {
return OptEqu(OPTf_COMPILE_TRACE,val);
}
//Displays lexical analyser's output
Bool LTrace(Bool val) {
return OptEqu(OPTf_LEX_TRACE,val);
}
//Displays text as it is being compiled
Bool Echo(Bool val) {
return OptEqu(OPTf_ECHO,val);
}
Bool IsReplaceSyms() {
return GetOpt(OPTf_REPLACE_SYMS);
}
U0 ImportHashTable(CHashTable *src)
{ //called from #exe {} in static modules
// See $LK,"::/SparrowOS/OSMain/StaticAdam.HPP.Z","FI:::/SparrowOS/OSMain/StaticAdam.HPP.Z"$.
CLex *lx=Fs->last_lex;
if (lx==&Fs->next_lex) {
PutErr;
"Not Compiling\n";
}
if (!(lx->flags&LF_EXE_BLK))
LexExcept(lx,"ST_IMPORT_HASH_TABLE_NOT_ALLOWED");
while (src) {
if (lx->stream_parent_glbl_hash_table)
HashTableImport(src,lx->stream_parent_glbl_hash_table);
else
HashTableImport(src,lx->glbl_hash_table);
src=src->next;
}
}
I64 IncludeDepth()
{
CLex *lx=Fs->last_lex;
return lx->cur_lfn-&lx->lfns;
}
File diff suppressed because it is too large. Load diff
+158
View File
@@ -0,0 +1,158 @@
CHashSrcSym *HashEntryImportCopy(CHashSrcSym *temph)
{ //Actually this imports, not copies!!
CHashSrcSym *result=MAllocIdentical(temph);
result->str=MAllocIdentical(temph->str);
result->use_cnt=0;
result->src_link=NULL;
result->index=NULL;
result->list=NULL;
result->debug=NULL;
result->indent=NULL;
if (temph->type & (HTT_FUN | HTT_CLASS)) {
result(CHashClass *)->member_list =MemberListCopy(temph);
result(CHashClass *)->member_list2=temph(CHashClass *)->member_list2;
if (temph->type & HTT_FUN) {
if (Bt(temph(CHashFun *)->flags,Ff_INTERNAL)) {
result->import_name=NULL;
LBtr(result(CHashFun *)->flags,Cf_EXTERN);
} else {
result->import_name=MAllocIdentical(temph->import_name);
result->type|=HTF_IMPORT;
LBts(result(CHashFun *)->flags,Cf_EXTERN);
}
}
} else if (temph->type & (HTT_EXPORT_SYS_SYM | HTT_GLBL_VAR)) {
result->import_name=MAllocIdentical(temph->import_name);
result->type|=HTF_IMPORT;
if (temph->type&HTT_EXPORT_SYS_SYM) {
result->type|=HTF_UNRESOLVED;
result(CHashExport *)->val=0;
} else {
result(CHashGlblVar *)->dim.next=LinkedListCopy(temph(CHashGlblVar *)->dim.next);
result(CHashGlblVar *)->flags|=GVAF_IMPORT|GVAF_ALIAS;
if (temph(CHashGlblVar *)->fun_ptr)
result(CHashGlblVar *)->fun_ptr=HashEntryImportCopy(temph(CHashGlblVar *)->fun_ptr-temph(CHashGlblVar *)->fun_ptr->ptr_cnt)(CHashFun *)+temph(CHashGlblVar *)->fun_ptr->ptr_cnt;
}
} else if (temph->type&HTT_DEFINE_STR)
result(CHashDefineStr *)->data=MAllocIdentical(temph(CHashDefineStr *)->data);
return result;
}
U0 HashTableImport(CHashTable *src,CHashTable *dst)
{
I64 i;
CHashSrcSym *temph,*temph1,*temph2;
if (!src) return;
for (i=0;i<=src->mask;i++) {
temph=src->body[i];
while (temph) {
if (temph->type & HTG_SRC_SYM) {
//Only add first in list
temph2=src->body[i];
while (temph2!=temph)
if (!StrCmp(temph->str,temph2->str) &&
temph2->type & temph->type & HTG_SRC_SYM ||
temph->type & HTT_EXPORT_SYS_SYM)
break;
else
temph2=temph2->next;
if (temph2==temph && (temph1=HashEntryImportCopy(temph))) {
if (IsReplaceSyms)
HashReplace(temph1,dst);
else
HashAdd(temph1,dst);
}
}
temph=temph->next;
}
}
}
I64 HashEntrySize(CHashSrcSym *temph)
{
CDbgInfo *dbg;
CBinFile *bfh;
switch (HashTypeNum(temph)) {
case HTt_DEFINE_STR:
return MSize(temph(CHashDefineStr *)->data);
case HTt_GLBL_VAR:
case HTt_CLASS:
case HTt_INTERNAL_TYPE:
return temph(CHashClass *)->size;
case HTt_FUN:
if (dbg=temph->debug)
return dbg->body[dbg->max_line-dbg->min_line+1]-temph(CHashFun *)->executable_addr;
else
return -1;
case HTt_FILE:
return MSize(temph(CHashGeneric *)->user_data0);
case HTt_MODULE:
if (StrCmp(temph->str,OSMAIN_MODULE_NAME))
return MSize(temph(CHashGeneric *)->user_data0);
else {
bfh=sys_boot_base-sizeof(CBinFile);
return bfh->file_size;
}
case HTt_WORD:
return StrLen(temph->str);
}
return -1;
}
I64 HashEntrySize2(CHashSrcSym *temph)
{
CDbgInfo *dbg;
I64 result=MSize2(temph);
if (!(temph->type&HTT_DICT_WORD))
result+=MSize2(temph->str);
if (temph->type & HTG_SRC_SYM) {
result+=MSize2(temph->src_link);
result+=MSize2(temph->index);
result+=MSize2(temph->import_name);
result+=LinkedListSize(temph->list);
if (temph->type & (HTT_FUN | HTT_EXPORT_SYS_SYM)) {
result+=MSize2(temph->debug);
result+=MSize2(temph->indent);
}
if (temph->type & HTT_CLASS)
result+=MemberListSize(temph);
else if (temph->type & HTT_FUN) {
result+=MemberListSize(temph);
if (dbg=temph->debug)
//This should be $LK,"MSize","MN:MSize"$() but it would crash on static .BIN.Z file funs.
result+=dbg->body[dbg->max_line-dbg->min_line+1]-temph(CHashFun *)->executable_addr;
} else if (temph->type&HTT_DEFINE_STR)
result+=MSize2(temph(CHashDefineStr *)->data);
else if (temph->type & HTT_GLBL_VAR) {
result+=LinkedListSize(temph(CHashGlblVar *)->dim.next);
if (!(temph(CHashGlblVar *)->flags&GVAF_ALIAS))
result+=MSize2(temph(CHashGlblVar *)->data_addr);
if (temph(CHashGlblVar *)->fun_ptr)
result+=HashEntrySize2(temph(CHashGlblVar *)->fun_ptr-temph(CHashGlblVar *)->fun_ptr->ptr_cnt);
}
} else if (temph->type & HTT_FILE)
result+=MSize2(temph(CHashGeneric *)->user_data0);
else if (temph->type & HTT_MODULE &&
StrCmp(temph->str,OSMAIN_MODULE_NAME))
result+=MSize2(temph(CHashGeneric *)->user_data0);
return result;
}
I64 HashTableSize2(CHashTable *tempht)
{
I64 i,result=0;
CHashSrcSym *temph;
if (!tempht)
return 0;
for (i=0;i<=tempht->mask;i++) {
temph=tempht->body[i];
while (temph) {
result+=HashEntrySize2(temph);
temph=temph->next;
}
}
result+=MSize2(tempht->body);
result+=MSize2(tempht);
return result;
}
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
+650
View File
@@ -0,0 +1,650 @@
I64 CmpType(CHashClass *tempc)
{
if (tempc) {
while (tempc->fwd_class)
tempc=tempc->fwd_class;
return tempc->sub_type;
}
return 0;
}
I64 CmpPType(CHashClass *tempc)
{
if (tempc) {
if (tempc->ptr_cnt)
tempc--;
while (tempc->fwd_class)
tempc=tempc->fwd_class;
return tempc->sub_type;
}
return 0;
}
U0 CmpF1PushPop(CIntermediateCode *tempi,CIntermediateCode *tempi2)
{
if (Bt(fpop_bitmap,tempi2->ic_opcode)|| tempi2->ic_flags&ICF_R_TO_F64)
Bts(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0);
}
U0 CmpF2PushPop(CIntermediateCode *tempi,CIntermediateCode *tempi1,CIntermediateCode *tempi2)
{
if ((tempi2->ic_opcode==IC_MOV || tempi2->ic_opcode==IC_F64) &&
!(tempi2->ic_flags&ICF_R_TO_F64) &&
(Bt(fpop_bitmap,tempi1->ic_opcode) || tempi1->ic_flags&ICF_R_TO_F64))
Bts(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0);
else if ((Bt(fpop_bitmap,tempi2->ic_opcode) || tempi2->ic_flags&ICF_R_TO_F64)&&
!(tempi1->ic_flags&ICF_R_TO_F64))
Bts(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0);
}
class OptMemberVar
{
I64 score,offset,lea_balance;
CMemberList *m;
};
I64 OptMVCompare(OptMemberVar *mv1,OptMemberVar *mv2)
{
return mv2->score-mv1->score;
}
U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets)
{
CHashClass *tempc,*tempc1,*tempc2,*tempc3;
CCodeBlkMisc *lb;
CIntermediateCode *tempi,*tempi1,*tempi2,*tempi3,
*tempil1,*tempil2,
*temp_lag[4];
I64 code,i,j,l,member_cnt,used_reg_mask=0;
CMemberList *tempm;
CPrsStk *ps=OptStart(lx,temp_lag);
OptMemberVar *mv=NULL;
for (i=0;i<NUM_REGS;i++) {
register_offsets[i].offset=MAX_I64;
register_offsets[i].m=NULL;
}
if (fun_class) {
member_cnt=fun_class->member_cnt;
if (Bt(&fun_class->flags,Ff_DOT_DOT_DOT))
member_cnt+=2;
mv=CAlloc(member_cnt*sizeof(OptMemberVar));
member_cnt=0;
tempm=fun_class->member_list;
while (tempm) {
tempc=tempm->member_class;
while (tempc->fwd_class)
tempc=tempc->fwd_class;
if (0<=tempm->register<NUM_REGS) {
if (Bts(&used_reg_mask,tempm->register))
PrintFWarn("%S\n $$LK-A,\"FL:%s,%d\"$$ '%s' in '%s'\n","ST_REG_IN_USE",
lx->cur_lfn->name,lx->cur_lfn->line_num,tempm->str,fun_class->str);
register_offsets[tempm->register].offset=tempm->offset;
register_offsets[tempm->register].m=tempm;
} else if (tempc->sub_type!=IT_F64 && tempm->register!=CREG_NONE ||
tempm->register==CREG_ALLOC) {
if (tempm->register==CREG_ALLOC)
mv[member_cnt].score=MAX_I64/2; //big but not too big
mv[member_cnt].offset=tempm->offset;
mv[member_cnt++].m=tempm;
} else {
if (tempm->register==CREG_ALLOC)
PrintFWarn("%S\n $$LK-A,\"FL:%s,%d\"$$ '%s' in '%s'\n","ST_CANT_REG_VAR",
lx->cur_lfn->name,lx->cur_lfn->line_num,tempm->str,fun_class->str);
}
tempm=tempm->next;
}
} else
member_cnt=0;
tempi=lx->cbh.cb_in_ptr;
if (tempi->ic_opcode==IC_START)
tempi++;
while (code=tempi->ic_opcode) {
if (code!=IC_NOP) {
OptNext(tempi,temp_lag);
tempil1=temp_lag[1];
tempil2=temp_lag[2];
tempc=tempi->ic_class;
nobound_switch (cmp_arg_cnt[code]) {
case 9:
ps->ptr-=tempi->ic_data>>3;
break;
case 3:
tempi3=PrsPop(ps);
if (tempi3->ic_flags&ICF_R_TO_F64)
tempc3=sys_internal_types[IT_F64];
else if (tempi3->ic_flags & ICF_R_TO_INT)
tempc3=sys_internal_types[IT_I64];
else
tempc3=tempi->t.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_F64)
tempc2=sys_internal_types[IT_F64];
else if (tempi2->ic_flags & ICF_R_TO_INT)
tempc2=sys_internal_types[IT_I64];
else
tempc2=tempi->t.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_F64)
tempc1=sys_internal_types[IT_F64];
else if (tempi1->ic_flags & ICF_R_TO_INT)
tempc1=sys_internal_types[IT_I64];
else
tempc1=tempi->t.p1c;
tempi->p1.type=TY_STK+CmpType(tempc1);
tempi->p1.ptype=CmpPType(tempc1);
tempi->ic_flags|=ICF_P1_WAS_STK;
break;
case 0: //nobound_switch
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);
}
nobound_switch (code) {
case IC_F64:
tempi->ic_flags&=~ICF_R_TO_F64;
if (tempi->ic_flags&ICF_R_TO_INT) {
tempi->ic_data=ToI64(tempi->ic_data(F64));
tempi->ic_flags&=~ICF_R_TO_INT;
tempi->ic_opcode=IC_IMM;
}
break;
case IC_IMM:
tempi->ic_flags&=~ICF_R_TO_INT;
if (tempi->ic_flags&ICF_R_TO_F64) {
tempi->ic_data(F64)=ToF64(tempi->ic_data);
tempi->ic_flags&=~ICF_R_TO_F64;
tempi->ic_opcode=IC_F64;
}
break;
case IC_STR_CONST:
case IC_FS:
case IC_GS:
case IC_MOV_FS:
case IC_MOV_GS:
case IC_RIP:
case IC_PUSH_CMP:
break;
case IC_RBP:
tempi->ic_opcode=IC_REG;
tempi->p1.reg=CREG_RBP;
break;
case IC_REG:
case IC_COM:
case IC_NATIVE_TYPECAST:
case IC_NOT:
case IC_UNARY_MINUS:
break;
case IC_DEREF:
tempi->p1.ptype=tempi->r.type&IT_MASK;
if (tempi1->ic_opcode==IC_LEA) {
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=IC_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=IC_MOV;
if (tempi->p1.reg==CREG_RBP)
for (i=0;i<member_cnt;i++)
if (mv[i].offset==tempi->p1.disp) {
mv[i].lea_balance--;
mv[i].score+=1+tempi->ic_indent_level;
break;
}
} else if (tempil1->ic_opcode==IC_ADD_CONST) {
if (tempil2->ic_opcode==IC_REG) {
tempi->ic_flags|=tempil2->ic_flags|tempil1->ic_flags;
tempil2->ic_opcode=IC_NOP;
tempil1->ic_opcode=IC_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=IC_MOV;
}
}
break;
case IC__PP:
case IC__MM:
case IC_PP_:
case IC_MM_:
tempi->r.ptype=CmpPType(tempi->t.p1c);
case IC_DEREF_PP:
case IC_DEREF_MM:
if (tempi1->ic_opcode==IC_LEA &&
tempi1->p1.type&TY_MASK==TY_DISP &&
tempi1->p1.reg==CREG_RBP)
for (i=0;i<member_cnt;i++)
if (mv[i].offset==tempi1->p1.disp) {
mv[i].lea_balance--;
mv[i].score+=1+tempi->ic_indent_level;
break;
}
tempi->p1.ptype=tempi->r.type&IT_MASK;
break;
case IC_POWER:
case IC_SHL:
case IC_SHR:
case IC_MOD:
case IC_AND:
case IC_OR:
case IC_XOR:
break;
case IC_MUL:
case IC_DIV:
if (tempc->sub_type==IT_F64) {
CmpF2PushPop(tempi,tempi1,tempi2);
break;
}
break;
case IC_ADD:
if (tempc->sub_type==IT_F64) {
CmpF2PushPop(tempi,tempi1,tempi2);
break;
}
if (OptFixupBinaryOp2(&tempi1,&tempi2)) {
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=IC_NOP;
if (tempi->t.p1t!=tempi2)
tempi->t.p1c=tempi->t.p2c;
tempi->ic_data=tempi1->ic_data;
tempi->ic_opcode=IC_ADD_CONST;
tempi->p1.ptype=tempi->r.type&IT_MASK;
tempi->p2.type=TY_NULL;
if (tempil2->ic_opcode==IC_REG &&
tempil2->p1.reg==CREG_RBP) {
tempi->ic_flags|=tempil2->ic_flags;
tempil2->ic_opcode=IC_NOP;
tempi->ic_opcode=IC_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<member_cnt;i++)
if (mv[i].offset==tempi->ic_data) {
mv[i].lea_balance++;
mv[i].score+=1+tempi->ic_indent_level;
break;
}
}
}
break;
case IC_SUB:
if (tempc->sub_type==IT_F64) {
CmpF2PushPop(tempi,tempi1,tempi2);
break;
}
if (tempi2->ic_opcode==IC_IMM) {
tempi->ic_flags|=tempi2->ic_flags;
tempi2->ic_opcode=IC_NOP;
tempi->ic_data=tempi2->ic_data;
tempi->ic_opcode=IC_SUB_CONST;
tempi->p2.type=TY_NULL;
}
break;
case IC_LESS:
case IC_GREATER:
case IC_LESS_EQUAL:
case IC_GREATER_EQUAL:
if (tempi->ic_flags&ICF_USE_F64)
CmpF2PushPop(tempi,tempi1,tempi2);
break;
case IC_EQUAL_EQUAL:
case IC_NOT_EQUAL:
case IC_AND_AND:
case IC_OR_OR:
case IC_XOR_XOR:
case IC_COLON:
break;
case IC_MUL_EQUAL:
case IC_DIV_EQUAL:
case IC_ADD_EQUAL:
case IC_SUB_EQUAL:
if (tempc->sub_type==IT_F64)
CmpF1PushPop(tempi,tempi2);
case IC_ASSIGN_PP:
case IC_ASSIGN_MM:
case IC_ASSIGN:
case IC_SHL_EQUAL:
case IC_SHR_EQUAL:
case IC_MOD_EQUAL:
case IC_AND_EQUAL:
case IC_OR_EQUAL:
case IC_XOR_EQUAL:
if (tempi1->ic_opcode==IC_LEA &&
tempi1->p1.type&TY_MASK==TY_DISP &&
tempi1->p1.reg==CREG_RBP)
for (i=0;i<member_cnt;i++)
if (mv[i].offset==tempi1->p1.disp) {
mv[i].lea_balance--;
mv[i].score+=1+tempi->ic_indent_level;
break;
}
tempi->p1.ptype=tempi->r.type&IT_MASK;
tempi->r.ptype=CmpPType(tempi->t.p1c);
break;
case IC_RETURN_VAL:
case IC_RETURN_VAL2:
if (tempc) {
if (tempc->sub_type==IT_F64 && tempil1->ic_class->sub_type!=IT_F64)
tempil1->ic_flags|=ICF_R_TO_F64;
else if (tempc->sub_type!=IT_F64 && tempil1->ic_class->sub_type==IT_F64)
tempil1->ic_flags|=ICF_R_TO_INT;
}
break;
case IC_SQR:
case IC_ABS:
case IC_SQRT:
case IC_SIN:
case IC_COS:
case IC_TAN:
case IC_ATAN:
if (tempc->sub_type==IT_F64)
CmpF1PushPop(tempi,tempi1);
break;
case IC_SHL_CONST:
case IC_SHR_CONST:
case IC_ENTER:
case IC_ADD_RSP:
case IC_ADD_RSP1:
case IC_CALL:
case IC_CALL_INDIRECT:
case IC_CALL_INDIRECT2:
case IC_CALL_EXTERN:
case IC_CALL_IMPORT:
case IC_CLI:
case IC_STI:
case IC_HLT:
case IC_PUSHFD:
case IC_POPFD:
case IC_PUSH:
case IC_POP:
case IC_CLD:
case IC_STD:
case IC_INVLPG:
case IC_CLFLUSH:
case IC_PAUSE:
case IC_GET_FLAGS:
case IC_RDTSC:
case IC_HPET:
case IC_SET_FLAGS:
case IC_GET_BASE_PTR:
case IC_SET_BASE_PTR:
case IC_GET_STK_PTR:
case IC_GET_RAX:
case IC_SET_STK_PTR:
case IC_SET_RAX:
case IC_ABS_ADDR:
case IC_HEAP_GLBL:
case IC_ADDR_IMPORT:
case IC_TYPE:
case IC_BT:
case IC_BTS:
case IC_BTR:
case IC_BTC:
case IC_BEQU:
case IC_LBTS:
case IC_LBTR:
case IC_LBTC:
case IC_LBEQU:
case IC_BSF:
case IC_BSR:
case IC_PREEMPT:
case IC_SIGN_I64:
case IC_TOUPPER:
case IC_TO_I64:
case IC_TO_F64:
case IC_TO_BOOL:
case IC_ABS_I64:
case IC_LIMIT_I64:
case IC_LIMIT_U64:
case IC_MIN_I64:
case IC_MAX_I64:
case IC_MIN_U64:
case IC_MAX_U64:
case IC_MOD_U64:
case IC_SQR_I64:
case IC_SQR_U64:
case IC_SWAP_U8:
case IC_SWAP_U16:
case IC_SWAP_U32:
case IC_SWAP_U64:
case IC_QUE_INIT:
case IC_QUE_INS:
case IC_QUE_INS_REV:
case IC_QUE_REM:
case IC_MEMCPY:
case IC_MEMSET:
case IC_MEMSET_U16:
case IC_MEMSET_U32:
case IC_MEMSET_U64:
case IC_INU32:
case IC_INU16:
case IC_INU8:
case IC_STRLEN:
case IC_OUTU32:
case IC_OUTU16:
case IC_OUTU8:
case IC_ASM:
break;
case IC_NOBOUND_SWITCH:
case IC_SWITCH:
lb=tempi->ic_data;
lb=lb->dft;
while (lb->fwd)
lb=lb->fwd;
lb->flags|=CBMF_USED;
break;
case IC_BR_ZERO:
case IC_BR_NOT_ZERO:
if (tempi1->ic_opcode==IC_IMM ||
tempi1->ic_opcode==IC_F64) {
tempi1->ic_opcode=IC_NOP;
tempi->p1.type=TY_NULL;
tempi1->r.type=TY_NULL;
if (code==IC_BR_ZERO ^^ tempi1->ic_data)
tempi->ic_opcode=IC_JMP;
else {
tempi->ic_opcode=IC_NOP;
tempi->ic_class=NULL;
break;
}
}
goto here1;
case IC_BR_AND_ZERO:
if (tempi1->ic_opcode==IC_IMM) {
i=Bsr(tempi1->ic_data);
if (0<=i==Bsf(tempi1->ic_data)) {
tempi1->ic_data=i;
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_opcode=IC_BR_NOT_BT;
goto here1;
}
}
if (tempi2->ic_opcode==IC_IMM) {
i=Bsr(tempi2->ic_data);
if (0<=i==Bsf(tempi2->ic_data)) {
tempi2->ic_data=i;
tempi->ic_flags|=ICF_SWAP|ICF_NOT_ADDR;
tempi->ic_opcode=IC_BR_NOT_BT;
}
}
goto here1;
case IC_BR_AND_NOT_ZERO:
if (tempi1->ic_opcode==IC_IMM) {
i=Bsr(tempi1->ic_data);
if (0<=i==Bsf(tempi1->ic_data)) {
tempi1->ic_data=i;
tempi->ic_flags|=ICF_NOT_ADDR;
tempi->ic_opcode=IC_BR_BT;
goto here1;
}
}
if (tempi2->ic_opcode==IC_IMM) {
i=Bsr(tempi2->ic_data);
if (0<=i==Bsf(tempi2->ic_data)) {
tempi2->ic_data=i;
tempi->ic_flags|=ICF_SWAP|ICF_NOT_ADDR;
tempi->ic_opcode=IC_BR_BT;
}
}
goto here1;
case IC_BR_MM_ZERO:
case IC_BR_MM_NOT_ZERO:
if (tempi1->ic_opcode==IC_LEA &&
tempi1->p1.type&TY_MASK==TY_DISP &&
tempi1->p1.reg==CREG_RBP)
for (i=0;i<member_cnt;i++)
if (mv[i].offset==tempi1->p1.disp) {
mv[i].lea_balance--;
mv[i].score+=1+tempi->ic_indent_level;
break;
}
tempi->p1.ptype=CmpType(tempc);
goto here1;
case IC_BR_GREATER_EQUAL:
case IC_BR_LESS_EQUAL:
case IC_BR_GREATER:
case IC_BR_LESS:
if (tempi->ic_flags&ICF_USE_F64)
CmpF2PushPop(tempi,tempi1,tempi2);
case IC_BR_GREATER_EQUAL2:
case IC_BR_LESS_EQUAL2:
case IC_BR_GREATER2:
case IC_BR_LESS2:
case IC_BR_NOT_EQUAL2:
case IC_BR_EQUAL_EQUAL2:
case IC_BR_NOT_EQUAL:
case IC_BR_EQUAL_EQUAL:
case IC_GET_LABEL:
case IC_BR_BT:
case IC_BR_BTS:
case IC_BR_BTR:
case IC_BR_BTC:
case IC_BR_NOT_BT:
case IC_BR_NOT_BTS:
case IC_BR_NOT_BTR:
case IC_BR_NOT_BTC:
case IC_BR_LBTS:
case IC_BR_LBTR:
case IC_BR_LBTC:
case IC_BR_NOT_LBTS:
case IC_BR_NOT_LBTR:
case IC_BR_NOT_LBTC:
case IC_JMP:
here1:
lb=tempi->ic_data;
if (!(tempi->ic_flags&ICF_PUSH_CMP))
while (lb->fwd)
lb=lb->fwd;
lb->flags|=CBMF_USED;
break;
case IC_LEAVE:
case IC_RET:
break;
case IC_ADDR:
case IC_NOP:
case IC_END:
case IC_QUESTION:
case IC_IRQ:
case IC_END_EXP:
case IC_CALL_END:
case IC_CALL_END2:
case IC_CALL_START:
case IC_PUSH_REGS:
case IC_POP_REGS:
case IC_LABEL:
break;
case IC_NOP1:
ps->ptr+=tempi->ic_data;
break;
default:
OptMissing(lx,tempi);
}
}
tempi++;
}
if (fun_class) {
fun_class->used_reg_mask=fun_class->used_reg_mask&~(CREG_VARS_MASK|CREG_NON_PTR_MASK)|used_reg_mask;
if (!Bt(&lx->opts,OPTf_NO_REG_VAR) &&
!(lx->flags & LF_NO_REG_OPT)) {
QSort(mv,member_cnt,sizeof(OptMemberVar),&OptMVCompare);
while (member_cnt && !mv[member_cnt-1].score)
member_cnt--;
j=0;
for (i=0;i<member_cnt;i++) {
if (!mv[i].lea_balance && mv[i].offset) {//addr operator cancels
mv[j].m=mv[i].m;
mv[j++].offset=mv[i].offset;
} else {
if (mv[i].m->register==CREG_ALLOC)
PrintFWarn("%S\n $$LK-A,\"FL:%s,%d\"$$ '%s' in '%s'\n","ST_CANT_REG_VAR",
lx->cur_lfn->name,lx->cur_lfn->line_num,mv[i].m->str,fun_class->str);
}
}
if (j>0) {
if (j>num_reg_vars) {
l=0;
for (i=0;i<j && l<num_non_ptr_vars;i++) {
tempm=mv[i].m;
tempc=tempm->member_class;
while (tempc->fwd_class)
tempc=tempc->fwd_class;
if (!tempc->ptr_cnt && !tempm->dim.next) {
while (l<num_non_ptr_vars &&
Bts(&fun_class->used_reg_mask,to_non_ptr_vars_map[l]))
l++;
if (l<num_non_ptr_vars) {
tempm->register=to_non_ptr_vars_map[l++];
register_offsets[tempm->register].offset=mv[i].offset;
register_offsets[tempm->register].m=tempm;
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT))
"Fun:%s\nReg %Z Var \"%s\" %08X[RBP]\n",
fun_class->str,tempm->register,"ST_U64_REGS",
tempm->str,register_offsets[tempm->register].offset;
mv[i].offset=0; //flag as reg var
}
}
}
}
l=0;
for (i=0;i<j && l<num_reg_vars;i++) {
tempm=mv[i].m;
//if not just flagged as reg var
if (mv[i].offset && (!mv[i].m->dim.next||
tempm->offset>0 && StrCmp(tempm->str,"argv"))) {
while (l<num_reg_vars &&
Bts(&fun_class->used_reg_mask,to_reg_vars_map[l]))
l++;
if (l<num_reg_vars) {
tempm->register=to_reg_vars_map[l++];
register_offsets[tempm->register].offset=mv[i].offset;
register_offsets[tempm->register].m=tempm;
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT))
"Reg %Z Var \"%s\" %08X[RBP]\n",tempm->register,"ST_U64_REGS",
tempm->str,register_offsets[tempm->register].offset;
}
}
}
}
}
Free(mv);
}
OptEnd(lx,ps);
}
+851
View File
@@ -0,0 +1,851 @@
Bool OptIC4(CIntermediateCode *tempi)
{
I64 i,ty,pt,ty1,pt1;
CIntermediateCode *tempil1,*tempil2;
if (tempi->ic_opcode<IC_IMM) return FALSE;
tempil1=tempi;
if (!(tempil2=OptLag1(tempil1)))
return FALSE;
if (tempil2->r.type&TY_MASK==TY_STK &&
!(tempil2->ic_flags&ICF_PUSH_RESULT)) {
if (tempil1->ic_opcode==IC_ADD_CONST &&
tempil1->p1.type&TY_MASK==TY_STK) {
if ((tempil2->ic_opcode==IC_REG ||
tempil2->ic_opcode==IC_MOV) &&
tempil2->p1.type&TY_MASK==TY_REG) {
i=tempil1->ic_data;
if (MIN_I32<=i<=MAX_I32 &&
!Bt(&non_ptr_vars_mask,tempil2->p1.reg)) {
tempil1->ic_flags|=tempil2->ic_flags&ICF_NO_CVT_MASK;
tempil2->ic_opcode=IC_NOP;
tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK;
tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK;
tempil1->ic_opcode=IC_LEA;
tempil1->p1.type=TY_DISP+tempil1->p1.type&IT_MASK;
tempil1->p1.reg=tempil2->p1.reg;
tempil1->p1.disp=i;
return TRUE;
}
} else if (tempil2->ic_opcode==IC_SHL_CONST &&
tempil2->p1.type&TY_MASK==TY_REG) {
i=tempil1->ic_data;
if (MIN_I32<=i<=MAX_I32 &&
tempil2->p1.reg!=CREG_RSP &&
1<=tempil2->ic_data<=3) {
tempil1->ic_flags|=tempil2->ic_flags&ICF_NO_CVT_MASK;
tempil2->ic_opcode=IC_NOP;
tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK;
tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK;
tempil1->ic_opcode=IC_LEA;
tempil1->p1.type=TY_SIB+tempil1->p1.type&IT_MASK;
tempil1->p1.reg=tempil2->p1.reg<<8+CREG_NONE;
if (tempil2->ic_data==1)
tempil1->p1.reg|=0x4000;
else if (tempil2->ic_data==2)
tempil1->p1.reg|=0x8000;
else
tempil1->p1.reg|=0xC000;
tempil1->p1.disp=i;
return TRUE;
}
}
}
if (tempil2->ic_opcode==IC_MOV ||
tempil2->ic_opcode==IC_REG) {
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(F64);
else
tempil1->ic_flags|=ICF_P3_TO_INT;
} else if (tempil2->ic_flags&ICF_R_TO_F64) {
if (tempil2->p1.type&TY_MASK==TY_IMM)
tempil2->p1.disp(F64)=tempil2->p1.disp;
else
tempil1->ic_flags|=ICF_P3_TO_F64;
}
ty=tempil1->p3.type&IT_MASK;
ty1=tempil2->p1.type&IT_MASK;
if (ty1 && ty1<ty)
ty=ty1;
ty1=tempil2->r.type&IT_MASK;
if (ty1 && ty1<ty)
ty=ty1;
tempil1->p3.type=tempil2->p1.type&TY_MASK+ty;
pt=tempil1->p3.ptype;
pt1=tempil2->p1.ptype;
if (pt1 && pt1<pt && pt!=IT_F64)
pt=pt1;
pt1=tempil2->r.ptype;
if (pt1 && pt1<pt && pt!=IT_F64)
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=IC_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(F64);
else
tempil1->ic_flags|=ICF_P2_TO_INT;
} else if (tempil2->ic_flags&ICF_R_TO_F64) {
if (tempil2->p1.type&TY_MASK==TY_IMM)
tempil2->p1.disp(F64)=tempil2->p1.disp;
else
tempil1->ic_flags|=ICF_P2_TO_F64;
}
ty=tempil1->p2.type&IT_MASK;
ty1=tempil2->p1.type&IT_MASK;
if (ty1 && ty1<ty)
ty=ty1;
ty1=tempil2->r.type&IT_MASK;
if (ty1 && ty1<ty)
ty=ty1;
tempil1->p2.type=tempil2->p1.type&TY_MASK+ty;
pt=tempil1->p2.ptype;
pt1=tempil2->p1.ptype;
if (pt1 && pt1<pt && pt!=IT_F64)
pt=pt1;
pt1=tempil2->r.ptype;
if (pt1 && pt1<pt && pt!=IT_F64)
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=IC_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(F64);
else
tempil1->ic_flags|=ICF_P1_TO_INT;
} else if (tempil2->ic_flags&ICF_R_TO_F64) {
if (tempil2->p1.type&TY_MASK==TY_IMM) {
if (tempil2->p1.type&1) //signed/unsigned
tempil2->p1.disp(F64)=tempil2->p1.disp(U64);
else
tempil2->p1.disp(F64)=tempil2->p1.disp(I64);
} else
tempil1->ic_flags|=ICF_P1_TO_F64;
}
ty=tempil1->p1.type&IT_MASK;
ty1=tempil2->p1.type&IT_MASK;
if (ty1 && ty1<ty)
ty=ty1;
ty1=tempil2->r.type&IT_MASK;
if (ty1 && ty1<ty)
ty=ty1;
tempil1->p1.type=tempil2->p1.type&TY_MASK+ty;
pt=tempil1->p1.ptype;
pt1=tempil2->p1.ptype;
if (pt1 && pt1<pt && pt!=IT_F64)
pt=pt1;
pt1=tempil2->r.ptype;
if (pt1 && pt1<pt && pt!=IT_F64)
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=IC_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==IC_DEREF) {
if (tempil2->ic_opcode==IC_ADD_CONST &&
tempil2->p1.type&TY_MASK==TY_REG &&
tempil1->p1.type&TY_MASK==TY_STK) {
i=tempil2->ic_data;
if (MIN_I32<=i<=MAX_I32 &&
!Bt(&non_ptr_vars_mask,tempil2->p1.reg)) {
tempil1->ic_flags|=tempil2->ic_flags;
tempil2->ic_opcode=IC_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;
tempil1->ic_opcode=IC_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==IC_LEA &&
tempil1->p1.type&TY_MASK==TY_STK) {
tempil1->ic_flags|=tempil2->ic_flags;
tempil2->ic_opcode=IC_NOP;
tempil1->ic_opcode=IC_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==IC_DEREF) {
if (tempil1->p1.type&TY_MASK==TY_REG) {
tempil1->p1.type=TY_DISP+tempil1->p1.ptype;
tempil1->p1.disp=0;
tempil1->ic_opcode=IC_MOV;
return TRUE;
}
}
return FALSE;
}
U0 OptPass4(CLex *lx,COptReg *register_offsets,I64 *_type)
{
CHashClass *tempc,*tempc1,*tempc2,*tempc3;
CIntermediateCode *tempi,*tempi1,*tempi2,*tempi3,*tempil1,*tempil2,*tempil3,
*temp_lag[4];
I64 code,i;
CPrsStk *ps=OptStart(lx,temp_lag);
Bool dead_code=FALSE;
CCodeBlkMisc *lb;
if (_type)
*_type=IT_I64;
tempi=lx->cbh.cb_in_ptr;
if (tempi->ic_opcode==IC_START)
tempi++;
while (code=tempi->ic_opcode) {
OptNext2(tempi,temp_lag);
if (dead_code&&code!=IC_LABEL)
tempi->ic_opcode=IC_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];
nobound_switch (cmp_arg_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;
case 0: //nobound_switch
break;
}
nobound_switch (code) {
case IC_IMM:
case IC_TYPE:
tempi->p1.type=TY_IMM+IT_I64;
tempi->p1.disp=tempi->ic_data;
tempi->ic_opcode=IC_MOV;
break;
case IC_F64:
tempi->p1.type=TY_IMM+IT_I64;
tempi->p1.disp=tempi->ic_data;
tempi->p1.ptype=IT_F64;
tempi->ic_opcode=IC_MOV;
break;
case IC_STR_CONST:
case IC_FS:
case IC_GS:
case IC_MOV_FS:
case IC_MOV_GS:
case IC_RIP:
case IC_RBP:
case IC_REG:
case IC_COM:
case IC_NATIVE_TYPECAST:
case IC_NOT:
case IC_UNARY_MINUS:
case IC_PUSH_CMP:
break;
case IC_MOV:
if (tempi->p1.type&TY_MASK==TY_DISP &&
tempi->p1.reg==CREG_RBP) {
i=CmpOffset2Reg(tempi->p1.disp,register_offsets);
if (i>=0) {
tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK;
tempi->p1.reg=i;
tempi->p1.disp=0;
}
}
break;
case IC_DEREF:
if (tempi1->ic_opcode==IC_LEA) {
if (tempi1->p1.type&TY_MASK==TY_DISP &&
tempi1->p1.reg==CREG_RBP) {
i=CmpOffset2Reg(tempi1->p1.disp,register_offsets);
if (i>=0) {
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=IC_NOP;
tempi->ic_opcode=IC_REG;
tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK;
tempi->p1.reg=i;
tempi->p1.disp=0;
}
}
} else if ((tempi1->ic_opcode==IC_ABS_ADDR ||
tempi1->ic_opcode==IC_MOV &&
tempi1->p1.type==TY_IMM+IT_I64 &&
0<=tempi1->p1.disp<=MAX_I32) &&
!(tempi1->ic_flags&ICF_NO_RIP)) {
if (tempi1->ic_opcode==IC_ABS_ADDR)
tempi->p1.disp=tempi1->ic_data;
else
tempi->p1.disp=tempi1->p1.disp;
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=IC_NOP;
tempi1->p1.type=TY_NULL+tempi1->p1.type&IT_MASK;
tempi1->r.type=TY_NULL+tempi1->r.type&IT_MASK;
tempi->ic_opcode=IC_MOV;
tempi->p1.type=TY_RIP_DISP32+tempi->p1.ptype;
tempi->p1.reg=CREG_RIP;
}
break;
case IC_BR_MM_ZERO:
case IC_BR_MM_NOT_ZERO:
//(branch ++ to zero is unlikely)
case IC_DEREF_PP:
case IC_DEREF_MM:
case IC__PP:
case IC__MM:
case IC_PP_:
case IC_MM_:
if (tempi1->ic_opcode==IC_LEA) {
if (tempi1->p1.type&TY_MASK==TY_DISP &&
tempi1->p1.reg==CREG_RBP) {
i=CmpOffset2Reg(tempi1->p1.disp,register_offsets);
if (i>=0) {
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=IC_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->p1.disp=0;
tempi->ic_flags|=ICF_NOT_ADDR;
} else
goto lea_gone;
} else {
lea_gone:
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=IC_NOP1;
tempi1->ic_data=1;
tempi1->r.type=TY_NULL;
tempi->p1.type=tempi1->p1.type;
tempi->p1.reg=tempi1->p1.reg;
tempi->p1.disp=tempi1->p1.disp;
tempi->ic_flags|=ICF_NOT_ADDR;
}
} else if ((tempi1->ic_opcode==IC_ABS_ADDR ||
tempi1->ic_opcode==IC_MOV &&
tempi1->p1.type==TY_IMM+IT_I64 &&
0<=tempi1->p1.disp<=MAX_I32) &&
!(tempi1->ic_flags&ICF_NO_RIP)) {
tempi->ic_flags|=tempi1->ic_flags;
if (tempi1->ic_opcode==IC_ABS_ADDR)
tempi->p1.disp=tempi1->ic_data;
else
tempi->p1.disp=tempi1->p1.disp;
tempi1->ic_opcode=IC_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_ADDR;
}
break;
case IC_ADD:
if (tempi1->ic_opcode==IC_MOV && tempi1->p1.type==TY_REG+IT_I64 ||
tempi1->ic_opcode==IC_REG) {
if (tempi2->ic_opcode==IC_MOV && tempi2->p1.type==TY_REG+IT_I64 ||
tempi2->ic_opcode==IC_REG) {
if (tempi2->p1.reg!=CREG_RSP) {
tempi->p1.disp=0;
tempi->p1.reg=tempi1->p1.reg+tempi2->p1.reg<<8;
goto sib;
} else if (tempi1->p1.reg!=CREG_RSP) {
tempi->p1.disp=0;
tempi->p1.reg=tempi2->p1.reg+tempi1->p1.reg<<8;
sib:
tempi->ic_flags|=tempi1->ic_flags&ICF_NO_CVT_MASK;
tempi1->ic_opcode=IC_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;
tempi->ic_flags|=tempi2->ic_flags&ICF_NO_CVT_MASK;
tempi2->ic_opcode=IC_NOP;
tempi->ic_opcode=IC_LEA;
tempi->p1.type=TY_SIB+IT_I64;
tempi->p1.ptype=IT_I64;
tempi->p2.type=TY_NULL+tempi->p2.type&IT_MASK;
}
} else if (tempi2->ic_opcode==IC_SHL_CONST && tempi2->p1.type==TY_REG+IT_I64 &&
tempi2->ic_data<=3) {
if (tempi2->p1.reg!=CREG_RSP) {
tempi->p1.disp=0;
tempi->p1.reg=tempi1->p1.reg+tempi2->p1.reg<<8;
if (tempi2->ic_data==1)
tempi->p1.reg|=0x4000;
else if (tempi2->ic_data==2)
tempi->p1.reg|=0x8000;
else
tempi->p1.reg|=0xC000;
goto sib;
}
}
} else if (tempi1->ic_opcode==IC_LEA && tempi1->p1.type&TY_MASK==TY_DISP) {
if (tempi1->p1.reg==CREG_RBP && CmpOffset2Reg(tempi1->p1.disp,register_offsets)>=0)
break;
if (tempi2->ic_opcode==IC_MOV && tempi2->p1.type==TY_REG+IT_I64 ||
tempi2->ic_opcode==IC_REG) {
if (tempi2->p1.reg!=CREG_RSP) {
tempi->p1.disp=tempi1->p1.disp;
tempi->p1.reg=tempi1->p1.reg+tempi2->p1.reg<<8;
goto sib;
} else if (tempi1->p1.reg!=CREG_RSP) {
tempi->p1.disp=tempi1->p1.disp;
tempi->p1.reg=tempi2->p1.reg+tempi1->p1.reg<<8;
goto sib;
}
} else if (tempi2->ic_opcode==IC_SHL_CONST && tempi2->p1.type==TY_REG+IT_I64 &&
tempi2->ic_data<=3) {
if (tempi2->p1.reg!=CREG_RSP) {
tempi->p1.disp=tempi1->p1.disp;
tempi->p1.reg=tempi1->p1.reg+tempi2->p1.reg<<8;
if (tempi2->ic_data==1)
tempi->p1.reg|=0x4000;
else if (tempi2->ic_data==2)
tempi->p1.reg|=0x8000;
else
tempi->p1.reg|=0xC000;
goto sib;
}
}
}
break;
case IC_SHL_CONST:
case IC_LEA:
case IC_SHR_CONST:
case IC_POWER:
case IC_SHL:
case IC_SHR:
case IC_MUL:
case IC_DIV:
case IC_MOD:
case IC_AND:
case IC_OR:
case IC_XOR:
case IC_SUB:
case IC_EQUAL_EQUAL:
case IC_NOT_EQUAL:
case IC_LESS:
case IC_GREATER:
case IC_LESS_EQUAL:
case IC_GREATER_EQUAL:
case IC_AND_AND:
case IC_OR_OR:
case IC_XOR_XOR:
case IC_COLON:
break;
case IC_ASSIGN_PP:
case IC_ASSIGN_MM:
//this val was stashed during pass012 for pointer arithmetic
tempi->ic_class2=tempi->t.p3c;
case IC_ASSIGN:
case IC_SHL_EQUAL:
case IC_SHR_EQUAL:
case IC_MUL_EQUAL:
case IC_DIV_EQUAL:
case IC_MOD_EQUAL:
case IC_AND_EQUAL:
case IC_OR_EQUAL:
case IC_XOR_EQUAL:
case IC_ADD_EQUAL:
case IC_SUB_EQUAL:
if (tempi1->ic_opcode==IC_LEA) {
if (TY_DISP<=tempi1->p1.type&TY_MASK<=TY_SIB) {
if (tempi1->p1.type&TY_MASK==TY_DISP && tempi1->p1.reg==CREG_RBP) {
i=CmpOffset2Reg(tempi1->p1.disp,register_offsets);
if (i>=0) {
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=IC_NOP1;
tempi1->ic_data=1;
tempi1->p1.type=TY_NULL;
tempi1->r.type=TY_NULL;
tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK;
tempi->p1.reg=i;
tempi->p1.disp=0;
} else {
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=IC_NOP1;
tempi1->ic_data=1;
tempi1->r.type=TY_NULL;
tempi1->p1.type=TY_NULL;
tempi->p1.type=TY_DISP+tempi->p1.type&IT_MASK;
tempi->p1.reg=CREG_RBP;
tempi->p1.disp=tempi1->p1.disp;
}
} else {
tempi->p1.type=tempi1->p1.type&TY_MASK+tempi->p1.type&IT_MASK;
tempi->ic_flags|=tempi1->ic_flags;
tempi1->ic_opcode=IC_NOP1;
tempi1->ic_data=1;
tempi1->r.type=TY_NULL;
tempi1->p1.type=TY_NULL;
tempi->p1.reg=tempi1->p1.reg;
tempi->p1.disp=tempi1->p1.disp;
}
tempi->ic_flags|=ICF_NOT_ADDR;
}
} else if ((tempi1->ic_opcode==IC_ABS_ADDR ||
tempi1->ic_opcode==IC_MOV &&
tempi1->p1.type==TY_IMM+IT_I64 &&
0<=tempi1->p1.disp<=MAX_I32) &&
!(tempi1->ic_flags&ICF_NO_RIP)) {
tempi->ic_flags|=tempi1->ic_flags;
if (tempi1->ic_opcode==IC_ABS_ADDR)
tempi->p1.disp=tempi1->ic_data;
else
tempi->p1.disp=tempi1->p1.disp;
tempi1->ic_opcode=IC_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_ADDR;
}
break;
case IC_ADD_CONST:
case IC_SUB_CONST:
case IC_ENTER:
case IC_ADD_RSP:
case IC_ADD_RSP1:
case IC_CALL:
case IC_CALL_INDIRECT:
case IC_CALL_INDIRECT2:
case IC_CALL_EXTERN:
case IC_CALL_IMPORT:
case IC_CLI:
case IC_STI:
case IC_HLT:
case IC_PUSHFD:
case IC_POPFD:
case IC_PUSH:
case IC_POP:
case IC_CLD:
case IC_STD:
case IC_INVLPG:
case IC_CLFLUSH:
case IC_PAUSE:
case IC_GET_FLAGS:
case IC_RDTSC:
case IC_HPET:
case IC_SET_FLAGS:
case IC_GET_BASE_PTR:
case IC_SET_BASE_PTR:
case IC_GET_STK_PTR:
case IC_GET_RAX:
case IC_SET_STK_PTR:
case IC_SET_RAX:
break;
case IC_RETURN_VAL:
case IC_RETURN_VAL2:
if (!tempi->ic_class) {
if (_type) {
tempil1=tempi;
while (tempil1=OptLag1(tempil1))
if (tempil1->ic_class) {
if (tempil1->ic_flags & ICF_R_TO_F64)
*_type=IT_F64;
else if (tempil1->ic_flags & ICF_R_TO_INT)
*_type=IT_I64;
else
*_type=tempil1->ic_class->sub_type;
break;
}
}
tempi->ic_class=sys_internal_types[IT_I64];
} else if (_type)
*_type=tempi->ic_class->sub_type;
break;
case IC_GET_LABEL:
case IC_ABS_ADDR:
case IC_HEAP_GLBL:
case IC_ADDR_IMPORT:
case IC_BSF:
case IC_BSR:
case IC_PREEMPT:
case IC_SIGN_I64:
case IC_TOUPPER:
case IC_TO_I64:
case IC_TO_F64:
case IC_TO_BOOL:
case IC_SQR:
case IC_ABS:
case IC_SQRT:
case IC_SIN:
case IC_COS:
case IC_TAN:
case IC_ATAN:
case IC_ABS_I64:
case IC_LIMIT_I64:
case IC_LIMIT_U64:
case IC_MIN_I64:
case IC_MAX_I64:
case IC_MIN_U64:
case IC_MAX_U64:
case IC_MOD_U64:
case IC_SQR_I64:
case IC_SQR_U64:
case IC_SWAP_U8:
case IC_SWAP_U16:
case IC_SWAP_U32:
case IC_SWAP_U64:
case IC_QUE_INIT:
case IC_QUE_INS:
case IC_QUE_INS_REV:
case IC_QUE_REM:
case IC_MEMCPY:
case IC_MEMSET:
case IC_MEMSET_U16:
case IC_MEMSET_U32:
case IC_MEMSET_U64:
case IC_INU32:
case IC_INU16:
case IC_INU8:
case IC_STRLEN:
case IC_OUTU32:
case IC_OUTU16:
case IC_OUTU8:
case IC_NOBOUND_SWITCH:
case IC_SWITCH:
case IC_RET:
case IC_END:
case IC_ADDR:
case IC_QUESTION:
case IC_IRQ:
case IC_NOP:
case IC_CALL_START:
case IC_LEAVE:
case IC_PUSH_REGS:
case IC_POP_REGS:
case IC_ASM:
case IC_BR_AND_NOT_ZERO:
case IC_BR_AND_ZERO:
break;
case IC_BR_BT:
case IC_BR_BTS:
case IC_BR_BTR:
case IC_BR_BTC:
case IC_BR_NOT_BT:
case IC_BR_NOT_BTS:
case IC_BR_NOT_BTR:
case IC_BR_NOT_BTC:
case IC_BR_LBTS:
case IC_BR_LBTR:
case IC_BR_LBTC:
case IC_BR_NOT_LBTS:
case IC_BR_NOT_LBTR:
case IC_BR_NOT_LBTC:
case IC_BT:
case IC_BTS:
case IC_BTR:
case IC_BTC:
case IC_LBTS:
case IC_LBTR:
case IC_LBTC:
if (tempi2->ic_opcode==IC_ADDR &&
!(tempi->ic_flags&ICF_NOT_ADDR)) {
if (tempi2->p1.type&TY_MASK==TY_STK &&
tempi2->r.type&TY_MASK==TY_STK) {
if (!(tempil2=OptLag1(tempi2)) ||
tempil2->ic_opcode!=IC_ABS_ADDR &&
!(tempil2->ic_opcode==IC_MOV &&
tempil2->p1.type==TY_IMM+IT_I64 &&
0<=tempil2->p1.disp<=MAX_I32) ||
tempil2->ic_flags&ICF_NO_RIP)
tempil2=NULL;
else {
if (tempil2->ic_opcode==IC_ABS_ADDR)
tempi->p2.disp=tempil2->ic_data;
else
tempi->p2.disp=tempil2->p1.disp;
}
} else {
if (tempi2->p1.type==TY_IMM+IT_I64 &&
0<=tempi2->p1.disp<=MAX_I32 &&
!(tempi2->ic_flags&ICF_NO_RIP)) {
tempil2=tempi2;
tempi2=NULL;
tempi->p2.disp=tempil2->p1.disp;
} else
tempil2=NULL;
}
if (tempil2) {
if (tempi2) {
tempi->ic_flags|=tempi2->ic_flags;
tempi2->ic_opcode=IC_NOP;
tempi2->ic_flags=0;
tempi2 ->p1.type=TY_NULL+tempi2 ->p1.type&IT_MASK;
tempi2 ->r .type=TY_NULL+tempi2 ->r .type&IT_MASK;
}
tempi->ic_flags|=tempil2->ic_flags|ICF_NOT_ADDR;
tempil2->ic_opcode=IC_NOP;
tempil2->ic_flags=0;
tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK;
tempil2->r .type=TY_NULL+tempil2->r .type&IT_MASK;
tempi->p2.type=TY_RIP_DISP32+tempi->p2.type&IT_MASK;
tempi->p2.reg=CREG_RIP;
}
}
break;
case IC_BEQU:
case IC_LBEQU:
if (tempi3->ic_opcode==IC_ADDR &&
!(tempi->ic_flags&ICF_NOT_ADDR)) {
if (tempi3->p1.type&TY_MASK==TY_STK &&
tempi3->r.type&TY_MASK==TY_STK) {
if (!(tempil3=OptLag1(tempi3)) ||
tempil3->ic_opcode!=IC_ABS_ADDR &&
!(tempil3->ic_opcode==IC_MOV &&
tempil3->p1.type==TY_IMM+IT_I64 &&
0<=tempil3->p1.disp<=MAX_I32) ||
tempil3->ic_flags&ICF_NO_RIP)
tempil3=NULL;
else {
if (tempil3->ic_opcode==IC_ABS_ADDR)
tempi->p3.disp=tempil3->ic_data;
else
tempi->p3.disp=tempil3->p1.disp;
}
} else {
if (tempi3->p1.type==TY_IMM+IT_I64 &&
0<=tempi3->p1.disp<=MAX_I32 &&
!(tempi3->ic_flags&ICF_NO_RIP)) {
tempil3=tempi3;
tempi3=NULL;
tempi->p3.disp=tempil3->p1.disp;
} else
tempil3=NULL;
}
if (tempil3) {
if (tempi3) {
tempi->ic_flags|=tempi3->ic_flags;
tempi3->ic_opcode=IC_NOP;
tempi3->ic_flags=0;
tempi3 ->p1.type=TY_NULL+tempi3 ->p1.type&IT_MASK;
tempi3 ->r .type=TY_NULL+tempi3 ->r .type&IT_MASK;
}
tempi->ic_flags|=tempil3->ic_flags|ICF_NOT_ADDR;
tempil3->ic_opcode=IC_NOP;
tempil3->ic_flags=0;
tempil3->p1.type=TY_NULL+tempil3->p1.type&IT_MASK;
tempil3->r .type=TY_NULL+tempil3->r .type&IT_MASK;
tempi->p3.type=TY_RIP_DISP32+tempi->p3.type&IT_MASK;
tempi->p3.reg=CREG_RIP;
}
}
break;
case IC_BR_NOT_EQUAL2:
case IC_BR_EQUAL_EQUAL2:
case IC_BR_GREATER_EQUAL2:
case IC_BR_LESS_EQUAL2:
case IC_BR_GREATER2:
case IC_BR_LESS2:
case IC_BR_ZERO:
case IC_BR_NOT_ZERO:
case IC_BR_NOT_EQUAL:
case IC_BR_EQUAL_EQUAL:
case IC_BR_GREATER_EQUAL:
case IC_BR_LESS_EQUAL:
case IC_BR_GREATER:
case IC_BR_LESS:
lb=tempi->ic_data;
if (tempi->ic_flags&ICF_PUSH_CMP) {
lb->flags|=CBMF_POP_CMP;
lb->fwd=NULL;
}
break;
case IC_LABEL:
lb=tempi->ic_data;
if (lb->flags&CBMF_USED)
dead_code=FALSE;
break;
case IC_JMP:
dead_code=TRUE;
break;
case IC_NOP1:
ps->ptr+=tempi->ic_data;
break;
case IC_CALL_END2:
break;
case IC_CALL_END:
case IC_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;
tempi->p1.disp=0;
tempil1->r.type=TY_REG+tempil1->r.type&IT_MASK;
tempil1->r.reg=CREG_RAX;
tempil1->r.disp=0;
}
}
break;
default:
OptMissing(lx,tempi);
}
while (OptIC4(tempi));
code=tempi->ic_opcode;
if (cmp_result_cnt[code])
PrsPush(ps,tempi);
}
tempi++;
}
OptEnd(lx,ps);
}
+171
View File
@@ -0,0 +1,171 @@
U0 OptPass5(CLex *lx)
{
CIntermediateCode *tempi,*tempi1;
I64 code,i,ty,pt,ty1,pt1;
CPrsStk *ps=OptStart(lx);
tempi=lx->cbh.cb_in_ptr;
if (tempi->ic_opcode==IC_START)
tempi++;
while (code=tempi->ic_opcode) {
if (code>IC_NOP1) {
if (tempi->ic_flags&ICF_TRACE) {
if (Bt(&lx->pass_trace_mask,5)) {
"%2d:",ps->ptr;
CBPutIC(tempi);
}
}
if (cmp_arg_cnt[code]==9)
ps->ptr-=tempi->ic_data>>3;
if (code==IC_PUSH_REGS) {
for (i=0;i<NUM_REGS;i++)
if (Bt(&tempi->ic_data,i))
ps->ptr++;
} else if (code==IC_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 (tempi1->ic_opcode==IC_MOV ||
tempi1->ic_opcode==IC_REG) {
if (tempi1->ic_flags & ICF_R_TO_INT) {
if (tempi1->p1.type&TY_MASK==TY_IMM)
tempi1->p1.disp=tempi1->p1.disp(F64);
else
tempi->ic_flags|=ICF_P3_TO_INT;
} else if (tempi1->ic_flags&ICF_R_TO_F64) {
if (tempi1->p1.type&TY_MASK==TY_IMM)
tempi1->p1.disp(F64)=tempi1->p1.disp;
else
tempi->ic_flags|=ICF_P3_TO_F64;
}
ty=tempi->p3.type&IT_MASK;
ty1=tempi1->p1.type&IT_MASK;
if (ty1 && ty1<ty)
ty=ty1;
ty1=tempi1->r.type&IT_MASK;
if (ty1 && ty1<ty)
ty=ty1;
tempi->p3.type=tempi1->p1.type&TY_MASK+ty;
pt=tempi->p3.ptype;
pt1=tempi1->p1.ptype;
if (pt1 && pt1<pt && pt!=IT_F64)
pt=pt1;
pt1=tempi1->r.ptype;
if (pt1 && pt1<pt && pt!=IT_F64)
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=IC_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 (tempi1->ic_opcode==IC_MOV ||
tempi1->ic_opcode==IC_REG) {
if (tempi1->ic_flags & ICF_R_TO_INT) {
if (tempi1->p1.type&TY_MASK==TY_IMM)
tempi1->p1.disp=tempi1->p1.disp(F64);
else
tempi->ic_flags|=ICF_P2_TO_INT;
} else if (tempi1->ic_flags&ICF_R_TO_F64) {
if (tempi1->p1.type&TY_MASK==TY_IMM)
tempi1->p1.disp(F64)=tempi1->p1.disp;
else
tempi->ic_flags|=ICF_P2_TO_F64;
}
ty=tempi->p2.type&IT_MASK;
ty1=tempi1->p1.type&IT_MASK;
if (ty1 && ty1<ty)
ty=ty1;
ty1=tempi1->r.type&IT_MASK;
if (ty1 && ty1<ty)
ty=ty1;
tempi->p2.type=tempi1->p1.type&TY_MASK+ty;
pt=tempi->p2.ptype;
pt1=tempi1->p1.ptype;
if (pt1 && pt1<pt && pt!=IT_F64)
pt=pt1;
pt1=tempi1->r.ptype;
if (pt1 && pt1<pt && pt!=IT_F64)
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=IC_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 (tempi1->ic_opcode==IC_MOV ||
tempi1->ic_opcode==IC_REG) {
if (tempi1->ic_flags & ICF_R_TO_INT) {
if (tempi1->p1.type&TY_MASK==TY_IMM)
tempi1->p1.disp=tempi1->p1.disp(F64);
else
tempi->ic_flags|=ICF_P1_TO_INT;
} else if (tempi1->ic_flags&ICF_R_TO_F64) {
if (tempi1->p1.type&TY_MASK==TY_IMM) {
if (tempi1->p1.type & 1) //signed/unsigned
tempi1->p1.disp(F64)=tempi1->p1.disp(U64);
else
tempi1->p1.disp(F64)=tempi1->p1.disp(I64);
} else
tempi->ic_flags|=ICF_P1_TO_F64;
}
ty=tempi->p1.type&IT_MASK;
ty1=tempi1->p1.type&IT_MASK;
if (ty1 && ty1<ty)
ty=ty1;
ty1=tempi1->r.type&IT_MASK;
if (ty1 && ty1<ty)
ty=ty1;
tempi->p1.type=tempi1->p1.type&TY_MASK+ty;
pt=tempi->p1.ptype;
pt1=tempi1->p1.ptype;
if (pt1 && pt1<pt && pt!=IT_F64)
pt=pt1;
pt1=tempi1->r.ptype;
if (pt1 && pt1<pt && pt!=IT_F64)
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=IC_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->r.type&TY_MASK==TY_STK)
PrsPush(ps,tempi);
}
tempi++;
}
OptEnd(lx,ps);
}
+266
View File
@@ -0,0 +1,266 @@
Bool OptIC6(CIntermediateCode *tempi)
{
CIntermediateCode *tempil1,*tempil2;
if (tempi->ic_opcode<IC_IMM) return FALSE;
tempil1=tempi;
if (!(tempil2=OptLag1(tempil1)))
return FALSE;
if (tempil2->ic_opcode==IC_ADD_CONST &&
tempil1->ic_opcode==IC_DEREF &&
tempil1->ic_flags&ICF_P1_WAS_STK &&
tempil1->p1.type&TY_MASK==TY_REG &&
tempil2->r.type&TY_MASK==TY_REG &&
MIN_I32<=tempil2->ic_data<=MAX_I32 &&
!Bt(&non_ptr_vars_mask,tempil2->p1.reg))
if (tempil2->p1.type&TY_MASK==TY_REG) {
tempil1->ic_flags= tempil1->ic_flags & ~ICF_P1_WAS_STK |
tempil2->ic_flags;
tempil2->ic_opcode=IC_NOP1;
tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK;
tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK;
tempil1->ic_opcode=IC_MOV;
tempil1->p1.type=TY_DISP+tempil1->p1.ptype;
tempil1->p1.reg=tempil2->p1.reg;
tempil1->p1.disp=tempil2->ic_data;
tempil2->ic_data=-1;
return TRUE;
} else {
tempil2->ic_opcode=IC_MOV;
tempil1->ic_opcode=IC_MOV;
tempil1->p1.type=TY_DISP+tempil1->p1.ptype;
tempil1->p1.disp=tempil2->ic_data;
return TRUE;
}
return FALSE;
}
U0 OptPass6Lag(CLex *lx,
CPrsStk *ps,CIntermediateCode *tempi,I64 *i_,I64 num_stk,
I64 *_clobbered_reg_mask,I64 fun_num)
{
I64 i=*i_,j,k,l,code,clobbered_reg_mask=*_clobbered_reg_mask;
CHashFun *tempf;
code=tempi->ic_opcode;
if (code<=IC_NOP1)
return;
else {
if (tempi->ic_flags&ICF_TRACE) {
if (Bt(&lx->pass_trace_mask,6)) {
"%2d:",i;
CBPutIC(tempi);
}
}
if (code==IC_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 (tempf=tempi->ic_data) {
if (Bt(tempf->flags,Ff_INTERNAL))
j=0;
else {
j&=tempf->clobbered_reg_mask;
clobbered_reg_mask|=tempf->clobbered_reg_mask;
}
}
tempi->ic_data=j;
PrsPush(ps,i);
PrsPush(ps,j);
} else if (code==IC_CALL_END) {
tempi->ic_data=PrsPop(ps);
i=PrsPop(ps);
}
// else if (code==IC_LEAVE)
// i=0;
else if (code==IC_CALL_END2) {
ps->ptr--;
i=PrsPop(ps);
}
if (cmp_arg_cnt[code]==9)
i-=tempi->ic_data>>3;
if (tempi->p3.type&TY_MASK==TY_STK) {
i--;
if (i<num_stk) {
tempi->p3.type=TY_REG+tempi->p3.type&IT_MASK;
if (fun_num&1)
tempi->p3.reg=to_stk_temps_map_odd[i];
else
tempi->p3.reg=to_stk_temps_map_even[i];
tempi->p3.disp=0;
}
}
if (tempi->p2.type&TY_MASK==TY_STK) {
i--;
if (i<num_stk) {
tempi->p2.type=TY_REG+tempi->p2.type&IT_MASK;
if (fun_num&1)
tempi->p2.reg=to_stk_temps_map_odd[i];
else
tempi->p2.reg=to_stk_temps_map_even[i];
tempi->p2.disp=0;
}
}
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];
tempi->p1.disp=0;
}
}
if (tempi->r.type&TY_MASK==TY_STK &&
!(tempi->ic_flags & ICF_PUSH_RESULT)) {
i++;
if (i<=num_stk) {
tempi->r.type=TY_REG+tempi->r.type&IT_MASK;
if (fun_num&1) {
tempi->r.reg=to_stk_temps_map_odd[i-1];
Bts(&clobbered_reg_mask,to_stk_temps_map_odd[i-1]);
} else {
tempi->r.reg=to_stk_temps_map_even[i-1];
Bts(&clobbered_reg_mask,to_stk_temps_map_even[i-1]);
}
tempi->r.disp=0;
}
}
while (OptIC6(tempi));
if (tempi->r.type&IT_MASK!=IT_F64 &&
!(tempi->ic_flags&ICF_USE_F64))
tempi->ic_flags|=ICF_USE_INT;
}
*i_=i;
*_clobbered_reg_mask=clobbered_reg_mask;
}
U0 OptPass6(CLex *lx,CHashFun *fun_class)
{
CIntermediateCode *tempi,*tempil1,*tempif1,*tempif2,
*temp_lag[4],*old_tempil1=NULL;
CPrsStk *ps=OptStart(lx,temp_lag);
I64 i=0,code,num_stk,clobbered_reg_mask=CALWAYS_CLOBBERED_MASK,
fun_num=0;
if (fun_class)
fun_num=compiled_funs++;
if (Bt(&lx->opts,OPTf_NO_REG_VAR) ||
lx->flags&LF_NO_REG_OPT)
num_stk=0;
else
num_stk=num_stk_temps;
tempi=lx->cbh.cb_in_ptr;
if (tempi->ic_opcode==IC_START)
tempi++;
while (code=tempi->ic_opcode) {
OptNext3(tempi,temp_lag);
tempil1=temp_lag[1];
if (tempil1->ic_opcode==IC_END_EXP) {
if (code!=IC_RETURN_VAL2 && code!=IC_NOP) {
if (!(temp_lag[2]->ic_flags&
(ICF_R_TO_F64|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<=IC_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;
tempi->p3.disp=0;
tempil1->r.type=TY_REG+tempil1->r.type&IT_MASK;
tempil1->r.reg=CREG_RAX;
tempil1->r.disp=0;
}
}
} 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==IC_ASSIGN &&
tempi->ic_flags&ICF_NOT_ADDR &&
tempil1->ic_opcode!=IC_CALL_END &&
tempil1->ic_opcode!=IC_CALL_END2 &&
tempil1->ic_opcode!=IC_SET_RAX &&
!(tempi->ic_flags&
(ICF_P2_TO_F64|ICF_P2_TO_INT)) &&
!(tempil1->ic_flags&
(ICF_R_TO_F64|ICF_R_TO_INT))) {
if (tempif1=OptLead1(lx,tempi)) //predict NO_DEPEND
if (tempif2=OptLead1(lx,tempif1))
if (tempif1->ic_opcode==IC_END_EXP &&
tempif2->ic_opcode!=IC_RETURN_VAL2) {
tempi->ic_opcode=IC_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_ADDR|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;
tempi->p2.disp=0;
tempil1->r.type=TY_REG+tempil1->r.type&IT_MASK;
tempil1->r.reg=CREG_RAX;
tempil1->r.disp=0;
}
}
} 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;
tempi->p1.disp=0;
tempil1->r.type=TY_REG+tempil1->r.type&IT_MASK;
tempil1->r.reg=CREG_RAX;
tempil1->r.disp=0;
}
}
}
if (tempi->ic_flags & ICF_PUSH_RESULT)
tempi->r.type==TY_STK+tempi->r.type&IT_MASK;
}
if (old_tempil1!=tempil1) {
OptPass6Lag(lx,ps,tempil1,&i,num_stk,&clobbered_reg_mask,fun_num);
old_tempil1=tempil1;
}
tempi++;
}
OptEnd(lx,ps);
if (fun_class) {
fun_class->used_reg_mask&=~CSTK_TEMPS_MASK;
fun_class->used_reg_mask|=clobbered_reg_mask;
fun_class->clobbered_reg_mask=clobbered_reg_mask;
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT) &&
Bt(&lx->pass_trace_mask,6)) {
"Used Reg Mask:%04X\n",fun_class->used_reg_mask;
"Clobbered Reg Mask:%04X\n",clobbered_reg_mask;
}
}
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+879
View File
@@ -0,0 +1,879 @@
I64 InstEntriesCompare(CInstruction *tempi1,CInstruction *tempi2)
{
I64 i1,i2,j=0,result=0,oc_cnt1=tempi1->opcode_cnt,oc_cnt2=tempi2->opcode_cnt;
if (tempi1->flags&IEF_STI)
oc_cnt1--;
if (tempi2->flags&IEF_STI)
oc_cnt2--;
while (TRUE) {
if (j<oc_cnt1 && j<oc_cnt2) {
if (result=tempi1->opcode[j]-tempi2->opcode[j])
return result;
j++;
} else {
if (result=oc_cnt1-oc_cnt2)
return result;
if (tempi1->flags&IEF_STI)
i1=tempi1->opcode[j]>>3&7;
else
i1=tempi1->slash_val;
if (tempi2->flags&IEF_STI)
i2=tempi2->opcode[j]>>3&7;
else
i2=tempi2->slash_val;
if (result=i1-i2) return result;
if (tempi1->flags&IEF_STI && tempi2->flags&IEF_STI) {
i1=tempi1->opcode[j]&7;
i2=tempi2->opcode[j]&7;
if (result=i1-i2) return result;
}
if (tempi1->flags&IEF_STI)
return 1;
if (tempi2->flags&IEF_STI)
return -1;
i1=tempi1->flags & IEF_OP_SIZE32;
i2=tempi2->flags & IEF_OP_SIZE32;
if (result=i1-i2) return result;
i1=Bt(&uasm_ins64_mask,tempi1->arg1) ||
Bt(&uasm_ins64_mask,tempi1->arg2);
i2=Bt(&uasm_ins64_mask,tempi2->arg1) ||
Bt(&uasm_ins64_mask,tempi2->arg2);
if (result=i1-i2) return result;
i1=tempi1->flags & IEF_48_REX;
i2=tempi2->flags & IEF_48_REX;
return i1-i2;
}
}
}
U0 UnasmHashLoad()
{
CHashTable *h=asm_hash;
CHashOpcode *temph;
CInstruction *tempi;
I64 cnt=0,j,k;
unasm_table=NULL;
unasm_table_entries=0;
uasm_ins64_mask=0x0880888880+1<<ARGT_ST0+1<<ARGT_STI;
uasm_signed_arg_mask=1<<ARGT_REL8+1<<ARGT_REL16+1<<ARGT_REL32+
1<<ARGT_IMM8+1<<ARGT_IMM16+1<<ARGT_IMM32+1<<ARGT_IMM64;
uasm_mem_mask=1<<ARGT_M8+1<<ARGT_M16+1<<ARGT_M32+1<<ARGT_M64;
temph=h->next_added;
while (temph!=h) {
if (temph->type==HTT_OPCODE)
cnt+=temph->instruction_entry_cnt;
temph=temph->next_added;
}
unasm_table_entries=cnt;
j=0;
unasm_table=MAlloc(cnt*sizeof(U8 *));
temph=h->next_added;
while (temph!=h) {
if (temph->type==HTT_OPCODE) {
tempi=&temph->ins;
for (k=0;k<temph->instruction_entry_cnt;k++) {
unasm_table[j++]=tempi;
tempi++;
}
}
temph=temph->next_added;
}
QSortI64(unasm_table,cnt,&InstEntriesCompare);
}
/*
U0 DumpUnasmIns(CInstruction *tempi)
{
CHashOpcode *tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInstruction)-offset(CHashOpcode.ins);
"%10s:%02d,%02d SV:%02d\n",tempo->str,tempi->arg1,tempi->arg2,tempi->slash_val;
}
U0 DumpUnasmTable()
{
I64 k;
for (k=0;k<unasm_table_entries;k++)
DumpUnasmIns(unasm_table[k]);
}
*/
U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *branch=NULL)
//Unassembles one instruction
{
I64 disp,imm,opsize,opadd,
i,j,k,n,m,o1,o2,a1,a2,aa1,aa2,arg1_size=0,arg2_size=0,a1_size,a2_size,
ModrM=-1,SIB=-1,scale,r1,r2,
Mod=-1,RM1=-1,RM2=-1,REX=-1,REX_r=0,REX_x=0,REX_b=0,oc_cnt,sv;
Bool cont;
CInstruction *tempi;
CHashOpcode *tempo;
U8 *ip=*_ip,*ptr,*a1_st,*a2_st,*bin_data_area,*bin_data_area2,
buf2[256],buf3[256],seg_overrides[40],arg1_st[256],arg2_st[256];
if (branch) *branch=-1;
if (seg_size==16) {
opsize=16;
opadd=16;
} else if (seg_size==32) {
opsize=32;
opadd=32;
} else {
opsize=32;
opadd=64;
}
*arg1_st=0;
*arg2_st=0;
a1_st=arg1_st;
a2_st=arg2_st;
if (!IsRaw && PutSrcLink(ip,1,buf))
StrCat(buf,"\n");
else
*buf=0;
SPrintF(buf+StrLen(buf),"%24tP ",ip);
bin_data_area=buf+StrLen(buf);
for (i=0;i<6;i++) {
SPrintF(buf2,"%02X",ip[i]);
StrCat(buf,buf2);
}
StrCat(buf," ");
SPrintF(buf3,"%24tP ",ip+6);
bin_data_area2=buf3+StrLen(buf3);
for (i=6;i<12;i++) {
SPrintF(buf2,"%02X",ip[i]);
StrCat(buf3,buf2);
}
*seg_overrides=0;
cont=TRUE;
do {
switch (*ip++) {
case 0x2E: StrCat(seg_overrides,"CS:"); break;
case 0x36: StrCat(seg_overrides,"SS:"); break;
case 0x3E: StrCat(seg_overrides,"DS:"); break;
case 0x26: StrCat(seg_overrides,"ES:"); break;
case 0x64: StrCat(seg_overrides,"FS:"); break;
case 0x65: StrCat(seg_overrides,"GS:"); break;
case OC_OP_SIZE_PREFIX:
if (opsize==16)
opsize=32;
else
opsize=16;
break;
case OC_ADDR_SIZE_PREFIX:
if (opadd==16)
opadd=32;
else
opadd=16;
break;
case 0x40:
REX=0x40;
break;
case 0x41:
REX=0x41;
REX_b=8;
break;
case 0x42:
REX=0x42;
REX_x=8;
break;
case 0x43:
REX=0x43;
REX_b=8;
REX_x=8;
break;
case 0x44:
REX=0x44;
REX_r=8;
break;
case 0x45:
REX=0x45;
REX_b=8;
REX_r=8;
break;
case 0x46:
REX=0x46;
REX_x=8;
REX_r=8;
break;
case 0x47:
REX=0x47;
REX_b=8;
REX_x=8;
REX_r=8;
break;
case 0x48:
REX=0x48;
opsize=64;
break;
case 0x49:
REX=0x49;
REX_b=8;
opsize=64;
break;
case 0x4A:
REX=0x4A;
REX_x=8;
opsize=64;
break;
case 0x4B:
REX=0x4B;
REX_b=8;
REX_x=8;
opsize=64;
break;
case 0x4C:
REX=0x4C;
REX_r=8;
opsize=64;
break;
case 0x4D:
REX=0x4D;
REX_b=8;
REX_r=8;
opsize=64;
break;
case 0x4E:
REX=0x4E;
REX_x=8;
REX_r=8;
opsize=64;
break;
case 0x4F:
REX=0x4F;
REX_b=8;
REX_x=8;
REX_r=8;
opsize=64;
break;
default:
cont=FALSE;
}
} while (cont);
ip--;
i=0;
j=unasm_table_entries-1;
while (TRUE) {
k=(i+j)>>1; //binary search
tempi=unasm_table[k];
//DumpUnasmIns(tempi);
m=0;
n=0;
while (TRUE) {
a1=tempi->arg1;
a2=tempi->arg2;
oc_cnt=tempi->opcode_cnt;
if (tempi->flags&IEF_STI)
oc_cnt--;
if (n<oc_cnt) {
o1=ip[n];
if (n==tempi->opcode_cnt-1 && tempi->flags & IEF_PLUS_OPCODE)
o1&=-8;
o2=tempi->opcode[n++];
if (m=o1-o2)
break;
} else {
if (tempi->flags&IEF_STI)
sv=tempi->opcode[tempi->opcode_cnt-1]>>3&7;
else
sv=tempi->slash_val;
if (sv<8) {
if (!(m=ip[n]>>3&7-sv)) {
if ((Bt(&uasm_mem_mask,a1) || Bt(&uasm_mem_mask,a2)) &&
ip[n]&0xC0==0xC0) {
m=1;
break;
} else if (tempi->flags&IEF_STI) {
if (ip[n]&0xC0!=0xC0) {
m=-1;
break;
}
if (a1!=ARGT_STI && a2!=ARGT_STI)
m=ip[n]&0x7-tempi->opcode[tempi->opcode_cnt-1]&7;
break;
}
if (opsize==16) {
if (tempi->flags & IEF_OP_SIZE32) {
m=-1;
break;
}
} else {
if (tempi->flags & IEF_OP_SIZE16) {
m=1;
break;
}
}
if (opsize==64||a1==ARGT_M64||a2==ARGT_M64||tempi->flags&IEF_NO_REX) {
if (!Bt(&uasm_ins64_mask,a1) && !Bt(&uasm_ins64_mask,a2) && !(tempi->flags&IEF_48_REX))
m=1;
} else {
if (Bt(&uasm_ins64_mask,a1) || Bt(&uasm_ins64_mask,a2) || tempi->flags&IEF_48_REX)
m=-1;
}
}
} else {
m=0;
if (opsize==16) {
if (tempi->flags & IEF_OP_SIZE32) {
m=-1;
break;
}
} else {
if (tempi->flags & IEF_OP_SIZE16) {
m=1;
break;
}
}
if (opsize==64 || a1==ARGT_M64 || a2==ARGT_M64) {
if (!Bt(&uasm_ins64_mask,a1) && !Bt(&uasm_ins64_mask,a2) && !(tempi->flags&IEF_48_REX)&&
!(a2==ARGT_NO &&
(ARGT_UIMM8<=a1<=ARGT_UIMM64 ||
ARGT_IMM8<=a1<=ARGT_IMM64 ) ))
m=1;
} else {
if (Bt(&uasm_ins64_mask,a1) || Bt(&uasm_ins64_mask,a2) || tempi->flags&IEF_48_REX)
m=-1;
}
}
break;
}
}
if (m>0) {
if (k==i) {
k=j;
break;
} else
i=k;
} else if (m<0) {
if (k-i<=1) {
k=i;
break;
} else
j=k;
} else
break;
}
tempi=unasm_table[k];
ip+=tempi->opcode_cnt;
tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInstruction)-offset(CHashOpcode.ins);
StrCat(buf,tempo->str);
a1=tempi->arg1;
a2=tempi->arg2;
aa1=a1;
aa2=a2;
ptr=DefineSub(a1,"ST_ARG_TYPES");
if (Bt(&uasm_signed_arg_mask,a1)) {
if (StrStr(ptr,"8")) {
arg1_size=1;
StrCat(arg1_st,"I8 ");
} else if (StrStr(ptr,"16")) {
arg1_size=2;
StrCat(arg1_st,"I16 ");
} else if (StrStr(ptr,"32")) {
arg1_size=4;
StrCat(arg1_st,"I32 ");
} else if (StrStr(ptr,"64")) {
arg1_size=8;
StrCat(arg1_st,"I64 ");
}
} else {
if (StrStr(ptr,"8")) {
arg1_size=1;
StrCat(arg1_st,"U8 ");
} else if (StrStr(ptr,"16")) {
arg1_size=2;
StrCat(arg1_st,"U16 ");
} else if (StrStr(ptr,"32")) {
arg1_size=4;
StrCat(arg1_st,"U32 ");
} else if (StrStr(ptr,"64")) {
arg1_size=8;
StrCat(arg1_st,"U64 ");
}
}
ptr=DefineSub(a2,"ST_ARG_TYPES");
if (Bt(&uasm_signed_arg_mask,a2)) {
if (StrStr(ptr,"8")) {
arg2_size=1;
StrCat(arg2_st,"I8 ");
} else if (StrStr(ptr,"16")) {
arg2_size=2;
StrCat(arg2_st,"I16 ");
} else if (StrStr(ptr,"32")) {
arg2_size=4;
StrCat(arg2_st,"I32 ");
} else if (StrStr(ptr,"64")) {
arg2_size=8;
StrCat(arg2_st,"I64 ");
}
} else {
if (StrStr(ptr,"8")) {
arg2_size=1;
StrCat(arg2_st,"U8 ");
} else if (StrStr(ptr,"16")) {
arg2_size=2;
StrCat(arg2_st,"U16 ");
} else if (StrStr(ptr,"32")) {
arg2_size=4;
StrCat(arg2_st,"U32 ");
} else if (StrStr(ptr,"64")) {
arg2_size=8;
StrCat(arg2_st,"U64 ");
}
}
a1_size=arg1_size;
a2_size=arg2_size;
if (tempi->flags & IEF_PLUS_OPCODE) {
ip--;
RM1=*ip++ - tempi->opcode[tempi->opcode_cnt-1]+REX_b;
*buf2=0;
if (ARGT_R8<=a1<=ARGT_R64) {
if (a1_size==1) {
if (REX!=-1)
SPrintF(buf2,"%Z",RM1,"ST_U8_REX_REGS");
else
SPrintF(buf2,"%Z",RM1,"ST_U8_REGS");
} else if (a1_size==2)
SPrintF(buf2,"%Z",RM1,"ST_U16_REGS");
else if (a1_size==4)
SPrintF(buf2,"%Z",RM1,"ST_U32_REGS");
else if (a1_size==8)
SPrintF(buf2,"%Z",RM1,"ST_U64_REGS");
StrCat(a1_st,buf2);
} else {
if (a2_size==1) {
if (REX!=-1)
SPrintF(buf2,"%Z",RM1,"ST_U8_REX_REGS");
else
SPrintF(buf2,"%Z",RM1,"ST_U8_REGS");
} else if (a2_size==2)
SPrintF(buf2,"%Z",RM1,"ST_U16_REGS");
else if (a2_size==4)
SPrintF(buf2,"%Z",RM1,"ST_U32_REGS");
else if (a2_size==8)
SPrintF(buf2,"%Z",RM1,"ST_U64_REGS");
StrCat(a2_st,buf2);
}
}
if (ARGT_RM8<=a1<=ARGT_RM64 ||
ARGT_M8<=a1<=ARGT_M64 ||
ARGT_RM8<=a2<=ARGT_RM64 ||
ARGT_M8<=a2<=ARGT_M64) {
if (ARGT_RM8<=a2<=ARGT_RM64 ||
ARGT_M8<=a2<=ARGT_M64) {
a1_st=arg2_st;
a2_st=arg1_st;
a1_size=arg2_size;
a2_size=arg1_size;
aa1=a2;
aa2=a1;
}
StrCat(a1_st,seg_overrides);
ModrM=*ip++;
Mod=ModrM>>6 & 3;
RM1=ModrM & 7+REX_b;
RM2=ModrM>>3 & 7+REX_r;
if (Mod<3 && RM1&7==4) {
SIB=*ip++;
}
if (Mod==1) {
disp=*ip(U8 *)++;
SPrintF(buf2,"%02X",disp);
StrCat(a1_st,buf2);
}
if (Mod==2) {
disp=*ip(U32 *)++;
SPrintF(buf2,"%08X",disp);
StrCat(a1_st,buf2);
}
if (tempi->slash_val<8)
RM2=-1;
else {
*buf2=0;
if (aa2==ARGT_SREG)
SPrintF(buf2,"%Z",RM2,"ST_SEG_REGS");
else if (!(ARGT_IMM8<=aa2<=ARGT_IMM64) &&
!(ARGT_UIMM8<=aa2<=ARGT_UIMM64)) {
if (a2_size==1) {
if (REX!=-1)
SPrintF(buf2,"%Z",RM2,"ST_U8_REX_REGS");
else
SPrintF(buf2,"%Z",RM2,"ST_U8_REGS");
}else if (a2_size==2)
SPrintF(buf2,"%Z",RM2,"ST_U16_REGS");
else if (a2_size==4)
SPrintF(buf2,"%Z",RM2,"ST_U32_REGS");
else if (a2_size==8)
SPrintF(buf2,"%Z",RM2,"ST_U64_REGS");
}
StrCat(a2_st,buf2);
}
if (RM1&7==5 && !Mod) {
disp=*ip(I32 *)++;
if (seg_size==64) {
disp+=ip;
if (aa2==ARGT_IMM8 || aa2==ARGT_UIMM8)
disp++;
else if (aa2==ARGT_IMM16 || aa2==ARGT_UIMM16)
disp+=2;
else if (aa2==ARGT_IMM32 || aa2==ARGT_UIMM32)
disp+=4;
else if (aa2==ARGT_IMM64 || aa2==ARGT_UIMM64)
disp+=8;
}
SPrintF(buf2,"[%X] ",disp);
StrCat(a1_st,buf2);
RM1=-1;
} else {
if (Mod<3) {
if (RM1&7==4) {
RM1=-1;
r1=SIB & 7+REX_b;
r2=SIB>>3 & 7+REX_x;
scale=SIB>>6 &3;
if (scale==3)
scale=8;
else if (scale==2)
scale=4;
else if (scale==1)
scale=2;
else
scale=1;
if (r1==CREG_RBP && !Mod) {
disp=*ip(U32 *)++;
SPrintF(buf2,"%08X",disp);
StrCat(a1_st,buf2);
if (seg_size!=64)
SPrintF(buf2,"[%Z*%d]",r2,"ST_U32_REGS",scale);
else
SPrintF(buf2,"[%Z*%d]",r2,"ST_U64_REGS",scale);
StrCat(a1_st,buf2);
} else if (r2==4) {
if (seg_size!=64)
SPrintF(buf2,"[%Z]",r1,"ST_U32_REGS");
else
SPrintF(buf2,"[%Z]",r1,"ST_U64_REGS");
StrCat(a1_st,buf2);
} else {
if (seg_size!=64)
SPrintF(buf2,"[%Z+%Z*%d]",r1,"ST_U32_REGS",
r2,"ST_U32_REGS",scale);
else
SPrintF(buf2,"[%Z+%Z*%d]",r1,"ST_U64_REGS",
r2,"ST_U64_REGS",scale);
StrCat(a1_st,buf2);
}
} else {
*buf2=0;
if (opadd==16)
SPrintF(buf2,"[%Z]",RM1,"ST_U16_REGS");
else if (opadd==32)
SPrintF(buf2,"[%Z]",RM1,"ST_U32_REGS");
else
SPrintF(buf2,"[%Z]",RM1,"ST_U64_REGS");
StrCat(a1_st,buf2);
}
} else {
*buf2=0;
if (a1_size==1) {
if (REX!=-1)
SPrintF(buf2,"%Z",RM1,"ST_U8_REX_REGS");
else
SPrintF(buf2,"%Z",RM1,"ST_U8_REGS");
} else if (a1_size==2)
SPrintF(buf2,"%Z",RM1,"ST_U16_REGS");
else if (a1_size==4)
SPrintF(buf2,"%Z",RM1,"ST_U32_REGS");
else if (a1_size==8)
SPrintF(buf2,"%Z",RM1,"ST_U64_REGS");
StrCat(a1_st,buf2);
}
}
}
if (ARGT_MOFFS8<=a1<=ARGT_MOFFS64) {
StrCat(arg1_st,seg_overrides);
if (arg1_size==1) {
disp=*ip(U8 *)++;
SPrintF(buf2,"[%X]",disp);
StrCat(arg1_st,buf2);
} else if (opadd==16) {
disp=*ip(U16 *)++;
SPrintF(buf2,"[%X]",disp);
StrCat(arg1_st,buf2);
} else {
disp=*ip(U32 *)++;
SPrintF(buf2,"[%X]",disp);
StrCat(arg1_st,buf2);
}
}
if (ARGT_MOFFS8<=a2<=ARGT_MOFFS64) {
StrCat(arg2_st,seg_overrides);
if (arg2_size==1) {
disp=*ip(U8 *)++;
SPrintF(buf2,"[%X]",disp);
StrCat(arg2_st,buf2);
} else if (opadd==16) {
disp=*ip(U16 *)++;
SPrintF(buf2,"[%X]",disp);
StrCat(arg2_st,buf2);
} else {
disp=*ip(U32 *)++;
SPrintF(buf2,"[%X]",disp);
StrCat(arg2_st,buf2);
}
}
switch (a1) {
case ARGT_IMM8:
case ARGT_UIMM8:
imm=*ip(U8 *)++;
SPrintF(buf2,"%02X",imm);
StrCat(arg1_st,buf2);
if (tempi->opcode[0]==0xCD) {
if (ptr=DefineSub(imm,"ST_INT_NAMES")) {
StrCat(arg1_st," ");
StrCat(arg1_st,ptr);
}
}
break;
case ARGT_IMM16:
case ARGT_UIMM16:
imm=*ip(U16 *)++;
SPrintF(buf2,"%04X",imm);
StrCat(arg1_st,buf2);
break;
case ARGT_IMM32:
case ARGT_UIMM32:
imm=*ip(U32 *)++;
SPrintF(buf2,"%08X",imm);
StrCat(arg1_st,buf2);
break;
case ARGT_IMM64:
case ARGT_UIMM64:
imm=*ip(I64 *)++;
SPrintF(buf2,"%016X",imm);
StrCat(arg1_st,buf2);
break;
case ARGT_REL8:
disp=*ip(I8 *)++;
disp+=ip;
SPrintF(buf2,"%P ",disp);
if (branch) *branch=disp;
StrCat(arg1_st,buf2);
break;
case ARGT_REL16:
disp=*ip(I16 *)++;
disp+=ip;
SPrintF(buf2,"%P ",disp);
if (branch) *branch=disp;
StrCat(arg1_st,buf2);
break;
case ARGT_REL32:
disp=*ip(I32 *)++;
disp+=ip;
SPrintF(buf2,"%P ",disp);
if (branch) *branch=disp;
StrCat(arg1_st,buf2);
break;
case ARGT_CL:
StrCat(arg1_st,"CL");
break;
case ARGT_AL:
StrCat(arg1_st,"AL");
break;
case ARGT_AX:
StrCat(arg1_st,"AX");
break;
case ARGT_EAX:
StrCat(arg1_st,"EAX");
break;
case ARGT_RAX:
StrCat(arg1_st,"RAX");
break;
case ARGT_DX:
StrCat(arg1_st,"DX");
break;
case ARGT_SS:
StrCat(arg1_st,"SS");
break;
case ARGT_DS:
StrCat(arg1_st,"DS");
break;
case ARGT_ES:
StrCat(arg1_st,"ES");
break;
case ARGT_FS:
StrCat(arg1_st,"FS");
break;
case ARGT_GS:
StrCat(arg1_st,"GS");
break;
case ARGT_CS:
StrCat(arg1_st,"CS");
break;
case ARGT_ST0:
StrCat(arg1_st,"ST0");
break;
case ARGT_STI:
ip--;
SPrintF(buf2,"%Z",*ip++ - tempi->opcode[tempi->opcode_cnt-1],"ST_FSTK_REGS");
StrCat(arg1_st,buf2);
break;
}
switch (a2) {
case ARGT_IMM8:
case ARGT_UIMM8:
imm=*ip(U8 *)++;
SPrintF(buf2,"%02X",imm);
StrCat(arg2_st,buf2);
break;
case ARGT_IMM16:
case ARGT_UIMM16:
imm=*ip(U16 *)++;
SPrintF(buf2,"%04X",imm);
StrCat(arg2_st,buf2);
break;
case ARGT_IMM32:
case ARGT_UIMM32:
imm=*ip(U32 *)++;
SPrintF(buf2,"%08X",imm);
StrCat(arg2_st,buf2);
break;
case ARGT_IMM64:
case ARGT_UIMM64:
imm=*ip(I64 *)++;
SPrintF(buf2,"%016X",imm);
StrCat(arg2_st,buf2);
break;
case ARGT_CL:
StrCat(arg2_st,"CL");
break;
case ARGT_AL:
StrCat(arg2_st,"AL");
break;
case ARGT_AX:
StrCat(arg2_st,"AX");
break;
case ARGT_EAX:
StrCat(arg2_st,"EAX");
break;
case ARGT_RAX:
StrCat(arg2_st,"RAX");
break;
case ARGT_DX:
StrCat(arg2_st,"DX");
break;
case ARGT_SS:
StrCat(arg2_st,"SS");
break;
case ARGT_DS:
StrCat(arg2_st,"DS");
break;
case ARGT_ES:
StrCat(arg2_st,"ES");
break;
case ARGT_FS:
StrCat(arg2_st,"FS");
break;
case ARGT_GS:
StrCat(arg2_st,"GS");
break;
case ARGT_CS:
StrCat(arg2_st,"CS");
break;
case ARGT_ST0:
StrCat(arg2_st,"ST0");
break;
case ARGT_STI:
ip--;
SPrintF(buf2,"%Z",*ip++ - tempi->opcode[tempi->opcode_cnt-1],"ST_FSTK_REGS");
StrCat(arg2_st,buf2);
break;
}
if (tempi->flags&IEF_ENDING_ZERO)
ip++;
if (*arg1_st) {
StrCat(buf,"\t");
StrCat(buf,arg1_st);
}
if (*arg2_st) {
StrCat(buf,",");
StrCat(buf,arg2_st);
}
for (i=ip-(*_ip)(I64);i<6;i++) {
bin_data_area[i<<1]=CH_SPACE;
bin_data_area[i<<1+1]=CH_SPACE;
}
for (i=ip-(*_ip)(I64);i<12;i++) {
bin_data_area2[(i-6)<<1]=CH_SPACE;
bin_data_area2[(i-6)<<1+1]=CH_SPACE;
}
StrCat(buf,"\n");
if (ip-(*_ip)(I64)>6) {
StrCat(buf,buf3);
StrCat(buf,"\n");
}
*_ip=ip;
}
U8 *U(U8 *ip,I64 cnt=20,I64 seg_size=64)
//Unassembles a num of instructions.
{
I64 i;
U8 buf[1024];
if (seg_size==16)
PrintFWarn("%S","ST_16BIT_UNASM");
"$$HL,1$$";
for (i=0;i<cnt;i++) {
Ui(buf,&ip,seg_size);
"" buf;
}
"$$HL,0$$";
return ip;
}
I64 Un(U8 *ip,I64 cnt=0x80,I64 seg_size=64)
//Unassembles a num of bytes
{
I64 i=0;
U8 buf[1024],*end_ip=ip(I64)+cnt;
if (seg_size==16)
PrintFWarn("%S","ST_16BIT_UNASM");
"$$HL,1$$";
while (ip<end_ip) {
Ui(buf,&ip,seg_size);
"" buf;
i++;
}
"$$HL,0$$";
return i;
}