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