hschumann2/TempleOS-Source-Code
0838
1 2U0 OptPass5(CCmpCtrl *cc)3{4 CIntermediateCode *tmpi,*tmpi1;5 I64 code,i;6 CPrsStk *ps=cc->ps;7 ps->ptr=0;8 ps->ptr2=0;9 10 tmpi=cc->coc.coc_head.next;11 while (code=tmpi->ic_code) {12 if (code>IC_NOP2) {13 if (tmpi->ic_flags&ICF_PASS_TRACE) {14 if (Bt(&cc->saved_pass_trace,5)) {15 "%2d:",ps->ptr;16 ICPut(cc,tmpi);17 }18 }19 if (intermediate_code_table[code].arg_cnt==IS_V_ARG)20 ps->ptr-=tmpi->ic_data>>3;21 if (code==IC_PUSH_REGS) {22 for (i=0;i<REG_REGS_NUM;i++)23 if (Bt(&tmpi->ic_data,i))24 ps->ptr++;25 } else if (code==IC_POP_REGS) {26 for (i=0;i<REG_REGS_NUM;i++)27 if (Bt(&tmpi->ic_data,i))28 ps->ptr--;29 }30 if (tmpi->arg2.type&MDF_STK) {31 tmpi1=PrsPop(ps);32 if (tmpi1->ic_code==IC_MOV || tmpi1->ic_code==IC_REG) {33 if (tmpi1->ic_flags & ICF_RES_TO_INT) {34 if (tmpi1->arg1.type&MDF_IMM)35 tmpi1->arg1.disp=tmpi1->arg1.disp(F64);36 else37 tmpi->ic_flags|=ICF_ARG2_TO_INT;38 } else if (tmpi1->ic_flags&ICF_RES_TO_F64) {39 if (tmpi1->arg1.type&MDF_IMM)40 tmpi1->arg1.disp(F64)=tmpi1->arg1.disp;41 else42 tmpi->ic_flags|=ICF_ARG2_TO_F64;43 }44 tmpi->arg2.type=tmpi1->arg1.type&MDG_MASK+45 MinI64(tmpi->arg2.type.raw_type,46 MinI64(tmpi1->res.type.raw_type,tmpi1->arg1.type.raw_type));47 tmpi->arg2.reg=tmpi1->arg1.reg;48 tmpi->arg2.disp=tmpi1->arg1.disp;49 tmpi->ic_flags|=tmpi1->ic_flags&ICG_NO_CVT_MASK;50 OptSetNOP2(tmpi1);51 }52 }53 54 if (tmpi->arg1.type&MDF_STK) {55 tmpi1=PrsPop(ps);56 if (tmpi1->ic_code==IC_MOV || tmpi1->ic_code==IC_REG) {57 if (tmpi1->ic_flags & ICF_RES_TO_INT) {58 if (tmpi1->arg1.type&MDF_IMM)59 tmpi1->arg1.disp=tmpi1->arg1.disp(F64);60 else61 tmpi->ic_flags|=ICF_ARG1_TO_INT;62 } else if (tmpi1->ic_flags&ICF_RES_TO_F64) {63 if (tmpi1->arg1.type&MDF_IMM) {64 if (tmpi1->arg1.type&RTF_UNSIGNED)65 tmpi1->arg1.disp(F64)=tmpi1->arg1.disp(U64);66 else67 tmpi1->arg1.disp(F64)=tmpi1->arg1.disp(I64);68 } else69 tmpi->ic_flags|=ICF_ARG1_TO_F64;70 }71 tmpi->arg1.type=tmpi1->arg1.type&MDG_MASK+72 MinI64(tmpi->arg1.type.raw_type,73 MinI64(tmpi1->res.type.raw_type,tmpi1->arg1.type.raw_type));74 CmpMinTypePointed(tmpi,tmpi1->arg1_type_pointed_to);75 tmpi->arg1.reg=tmpi1->arg1.reg;76 tmpi->arg1.disp=tmpi1->arg1.disp;77 tmpi->ic_flags|=tmpi1->ic_flags&ICG_NO_CVT_MASK;78 OptSetNOP2(tmpi1);79 }80 }81 if (tmpi->res.type&MDF_STK &&82 !(tmpi->ic_flags&ICF_RES_NOT_USED))83 PrsPush(ps,tmpi);84 }85 tmpi=tmpi->next;86 }87 if (ps->ptr>2) {88 "Pass:%d Stk:%08X\n",cc->pass,ps->ptr;89 LexExcept(cc,"Compiler Optimization Error at ");90 }91}92 