282 lines
4.7 KiB
Plaintext
282 lines
4.7 KiB
Plaintext
ALIGN 4,OC_NOP
|
|
CMP_INTERNAL_TYPES_TABLE::
|
|
DU4 HTT_INTERNAL_TYPE,IT_I8,8;
|
|
DU1 "void",0;
|
|
DU4 HTT_INTERNAL_TYPE,IT_DOUBLE,8;
|
|
DU1 "double",0;
|
|
|
|
DU4 HTT_INTERNAL_TYPE,IT_I0,0;
|
|
DU1 "I0i",0;
|
|
DU4 HTT_INTERNAL_TYPE,IT_U0,0;
|
|
DU1 "U0i",0;
|
|
DU4 HTT_INTERNAL_TYPE,IT_I0,0;
|
|
DU1 "I0",0;
|
|
DU4 HTT_INTERNAL_TYPE,IT_U0,0;
|
|
DU1 "U0",0;
|
|
DU4 HTT_INTERNAL_TYPE,IT_I1,1;
|
|
DU1 "I1i",0;
|
|
DU4 HTT_INTERNAL_TYPE,IT_U1,1;
|
|
DU1 "U1i",0;
|
|
DU4 HTT_INTERNAL_TYPE,IT_I1,1;
|
|
DU1 "I1",0;
|
|
DU4 HTT_INTERNAL_TYPE,IT_U1,1;
|
|
DU1 "U1",0;
|
|
DU4 HTT_INTERNAL_TYPE,IT_I2,2;
|
|
DU1 "I2i",0;
|
|
DU4 HTT_INTERNAL_TYPE,IT_U2,2;
|
|
DU1 "U2i",0;
|
|
DU4 HTT_INTERNAL_TYPE,IT_I4,4;
|
|
DU1 "I4i",0;
|
|
DU4 HTT_INTERNAL_TYPE,IT_U4,4;
|
|
DU1 "U4i",0;
|
|
DU4 HTT_INTERNAL_TYPE,IT_I8,8;
|
|
DU1 "I8i",0;
|
|
DU4 HTT_INTERNAL_TYPE,IT_U8,8;
|
|
DU1 "U8i",0;
|
|
|
|
DU4 HTT_INVALID;
|
|
//*******************************************************
|
|
ALIGN 8,OC_NOP
|
|
CMP_OPT_NOP:
|
|
DU4 EC_NOP; //Must be at IC_CODE offset
|
|
DU1 256 DUP(0);
|
|
|
|
/**********
|
|
void OptNext(IntermediateCode *tempi,
|
|
IntermediateCode **temp_lag)
|
|
{
|
|
I8 i,j=0;
|
|
for (i=3;i>0;i--)
|
|
temp_lag[i]=temp_lag[i-1];
|
|
temp_lag[0]=tempi;
|
|
for (i=0;i<4;i++)
|
|
if (temp_lag[i]->opcode>EC_END_EXP)
|
|
temp_lag[j++]=temp_lag[i];
|
|
while (j<4)
|
|
temp_lag[j++]=&opt_nop;
|
|
}
|
|
************/
|
|
ALIGN 8,OC_NOP
|
|
CP_OPTNEXT::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RDI
|
|
MOV RCX,U8 SF_PARAM1[RBP]
|
|
MOV RDX,U8 SF_PARAM2[RBP]
|
|
|
|
MOV RAX,U8 16[RDX]
|
|
MOV U8 24[RDX],RAX
|
|
MOV RAX,U8 8[RDX]
|
|
MOV U8 16[RDX],RAX
|
|
MOV RAX,U8 [RDX]
|
|
MOV U8 8[RDX],RAX
|
|
MOV U8 [RDX],RCX
|
|
|
|
MOV RDI,RDX
|
|
|
|
MOV RAX,RCX
|
|
CMP U2 IC_CODE[RAX],EC_END_EXP
|
|
JBE @@10
|
|
STOSQ
|
|
|
|
@@10: MOV RAX,U8 8[RDX]
|
|
CMP U2 IC_CODE[RAX],EC_END_EXP
|
|
JBE @@11
|
|
STOSQ
|
|
|
|
@@11: MOV RAX,U8 16[RDX]
|
|
CMP U2 IC_CODE[RAX],EC_END_EXP
|
|
JBE @@12
|
|
STOSQ
|
|
|
|
@@12: MOV RAX,U8 24[RDX]
|
|
CMP U2 IC_CODE[RAX],EC_END_EXP
|
|
JBE @@13
|
|
STOSQ
|
|
|
|
@@13: MOV RAX,CMP_OPT_NOP
|
|
ADD RDX,32
|
|
JMP @@15
|
|
|
|
@@14: STOSQ
|
|
@@15: CMP RDI,RDX
|
|
JB @@14
|
|
|
|
POP RDI
|
|
POP RBP
|
|
RET
|
|
/**********
|
|
void OptNext2(IntermediateCode *tempi,
|
|
IntermediateCode **temp_lag)
|
|
{
|
|
I8 i,j=0;
|
|
for (i=3;i>0;i--)
|
|
temp_lag[i]=temp_lag[i-1];
|
|
temp_lag[0]=tempi;
|
|
for (i=0;i<4;i++)
|
|
if (temp_lag[i]->opcode>=EC_END_EXP)
|
|
temp_lag[j++]=temp_lag[i];
|
|
while (j<4)
|
|
temp_lag[j++]=&opt_nop;
|
|
}
|
|
************/
|
|
ALIGN 8,OC_NOP
|
|
CP_OPTNEXT2::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RDI
|
|
MOV RCX,U8 SF_PARAM1[RBP]
|
|
MOV RDX,U8 SF_PARAM2[RBP]
|
|
|
|
MOV RAX,U8 16[RDX]
|
|
MOV U8 24[RDX],RAX
|
|
MOV RAX,U8 8[RDX]
|
|
MOV U8 16[RDX],RAX
|
|
MOV RAX,U8 [RDX]
|
|
MOV U8 8[RDX],RAX
|
|
MOV U8 [RDX],RCX
|
|
|
|
MOV RDI,RDX
|
|
|
|
MOV RAX,RCX
|
|
CMP U2 IC_CODE[RAX],EC_END_EXP
|
|
JB @@10
|
|
STOSQ
|
|
|
|
@@10: MOV RAX,U8 8[RDX]
|
|
CMP U2 IC_CODE[RAX],EC_END_EXP
|
|
JB @@11
|
|
STOSQ
|
|
|
|
@@11: MOV RAX,U8 16[RDX]
|
|
CMP U2 IC_CODE[RAX],EC_END_EXP
|
|
JB @@12
|
|
STOSQ
|
|
|
|
@@12: MOV RAX,U8 24[RDX]
|
|
CMP U2 IC_CODE[RAX],EC_END_EXP
|
|
JB @@13
|
|
STOSQ
|
|
|
|
@@13: MOV RAX,CMP_OPT_NOP
|
|
ADD RDX,32
|
|
JMP @@15
|
|
|
|
@@14: STOSQ
|
|
@@15: CMP RDI,RDX
|
|
JB @@14
|
|
|
|
POP RDI
|
|
POP RBP
|
|
RET
|
|
|
|
|
|
ALIGN 8,OC_NOP
|
|
CP_OPTNEXT3::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RDI
|
|
MOV RCX,U8 SF_PARAM1[RBP]
|
|
MOV RDX,U8 SF_PARAM2[RBP]
|
|
|
|
MOV RAX,U8 16[RDX]
|
|
MOV U8 24[RDX],RAX
|
|
MOV RAX,U8 8[RDX]
|
|
MOV U8 16[RDX],RAX
|
|
MOV RAX,U8 [RDX]
|
|
MOV U8 8[RDX],RAX
|
|
MOV U8 [RDX],RCX
|
|
|
|
MOV RDI,RDX
|
|
|
|
MOV RAX,RCX
|
|
CMP U2 IC_CODE[RAX],EC_END_EXP
|
|
JB @@10
|
|
CMP U2 IC_CODE[RAX],EC_NOP1
|
|
JE @@10
|
|
STOSQ
|
|
|
|
@@10: MOV RAX,U8 8[RDX]
|
|
CMP U2 IC_CODE[RAX],EC_END_EXP
|
|
JB @@11
|
|
CMP U2 IC_CODE[RAX],EC_NOP1
|
|
JE @@11
|
|
STOSQ
|
|
|
|
@@11: MOV RAX,U8 16[RDX]
|
|
CMP U2 IC_CODE[RAX],EC_END_EXP
|
|
JB @@12
|
|
CMP U2 IC_CODE[RAX],EC_NOP1
|
|
JE @@12
|
|
STOSQ
|
|
|
|
@@12: MOV RAX,U8 24[RDX]
|
|
CMP U2 IC_CODE[RAX],EC_END_EXP
|
|
JB @@13
|
|
CMP U2 IC_CODE[RAX],EC_NOP1
|
|
JE @@13
|
|
STOSQ
|
|
|
|
@@13: MOV RAX,CMP_OPT_NOP
|
|
ADD RDX,32
|
|
JMP @@15
|
|
|
|
@@14: STOSQ
|
|
@@15: CMP RDI,RDX
|
|
JB @@14
|
|
|
|
POP RDI
|
|
POP RBP
|
|
RET
|
|
|
|
|
|
//*******************************************************
|
|
/****
|
|
void PrsPush(ParseStack *ps,I8 val)
|
|
{
|
|
ps->stk[ps->ptr++]=val;
|
|
}
|
|
I8 PrsPop(ParseStack *ps)
|
|
{
|
|
return ps->stk[--ps->ptr];
|
|
}
|
|
******/
|
|
ALIGN 8,OC_NOP
|
|
CP_PRSPUSH::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RCX,U8 SF_PARAM1[RBP]
|
|
MOV RAX,U8 [RCX]
|
|
INC RAX
|
|
MOV RDX,U8 SF_PARAM2[RBP]
|
|
MOV U8 [RCX+RAX*8],RDX
|
|
MOV U8 [RCX],RAX
|
|
POP RBP
|
|
RET
|
|
|
|
ALIGN 8,OC_NOP
|
|
CP_PRSPOP::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RCX,U8 SF_PARAM1[RBP]
|
|
MOV RBX,U8 [RCX]
|
|
MOV RAX,U8 [RCX+RBX*8]
|
|
DEC RBX
|
|
MOV U8 [RCX],RBX
|
|
POP RBP
|
|
RET
|
|
|
|
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_HI_CALL::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
OR RAX,RAX
|
|
JZ @@100
|
|
CALL RAX
|
|
@@100: POP RBP
|
|
RET
|
|
|