hschumann2/TempleOS-Source-Code
0838
1 2Bool OptIC6(CIntermediateCode *tmpi)3{4 CIntermediateCode *tmpil1;5 if (tmpi->ic_code<IC_IMM_I64 || !(tmpil1=OptLag1(tmpi)))6 return FALSE;7 if (tmpil1->ic_code==IC_ADD_CONST && tmpi->ic_code==IC_DEREF &&8 tmpi->ic_flags&ICF_ARG1_WAS_STK && tmpi->arg1.type&MDF_REG &&9 tmpil1->res.type&MDF_REG && I32_MIN<=tmpil1->ic_data<=I32_MAX &&10 !Bt(&cmp.non_ptr_vars_mask,tmpil1->arg1.reg)) {11 if (tmpil1->arg1.type&MDF_REG) {12 tmpi->ic_flags=tmpi->ic_flags&~ICF_ARG1_WAS_STK | tmpil1->ic_flags;13 tmpi->ic_code=IC_MOV;14 tmpi->arg1.type=MDF_DISP+tmpi->arg1_type_pointed_to;15 tmpi->arg1.reg=tmpil1->arg1.reg;16 tmpi->arg1.disp=tmpil1->ic_data;17 OptSetNOP2(tmpil1,-1);18 } else {19 tmpil1->ic_code=IC_MOV;20 tmpi->ic_code=IC_MOV;21 tmpi->arg1.type=MDF_DISP+tmpi->arg1_type_pointed_to;22 tmpi->arg1.disp=tmpil1->ic_data;23 }24 return TRUE;25 }26 return FALSE;27}28 29U0 OptPass6Lag(CCmpCtrl *cc,CPrsStk *ps,CIntermediateCode *tmpi,30 I64 *_stk_ptr,I64 reg_stk_size,I64 *_clobbered_reg_mask)31{32 I64 stk_ptr=*_stk_ptr,code,33 clobbered_stk_tmp_mask,clobbered_reg_mask=*_clobbered_reg_mask;34 CHashFun *tmpf;35 code=tmpi->ic_code;36 if (tmpi->ic_flags&ICF_PASS_TRACE && Bt(&cc->saved_pass_trace,6)) {37 "%2d:",stk_ptr;38 ICPut(cc,tmpi);39 }40 if (code==IC_CALL_START) {41 if (reg_stk_size==1 && stk_ptr>0)42 clobbered_stk_tmp_mask=REGG_STK_TMP;43 else44 clobbered_stk_tmp_mask=0;45 if (tmpf=tmpi->ic_data) {46 if (Bt(&tmpf->flags,Ff_INTERNAL))47 clobbered_stk_tmp_mask=0;48 else {49 clobbered_stk_tmp_mask&=tmpf->clobbered_reg_mask;50 clobbered_reg_mask|=tmpf->clobbered_reg_mask;51 }52 }53 tmpi->ic_data=clobbered_stk_tmp_mask;54 PrsPush(ps,stk_ptr);55 PrsPush(ps,clobbered_stk_tmp_mask);56 } else if (code==IC_CALL_END) {57 tmpi->ic_data=PrsPop(ps);58 stk_ptr=PrsPop(ps);59 } else if (code==IC_CALL_END2) {60 ps->ptr--;61 stk_ptr=PrsPop(ps);62 }63 if (intermediate_code_table[code].arg_cnt==IS_V_ARG)64 stk_ptr-=tmpi->ic_data>>3;65 if (tmpi->arg2.type&MDF_STK) {66 stk_ptr--;67 if (stk_ptr<reg_stk_size) {68 tmpi->arg2.type=MDF_REG+tmpi->arg2.type.raw_type;69 tmpi->arg2.reg=Bsf(REGG_STK_TMP);70 tmpi->arg2.disp=0;71 }72 }73 if (tmpi->arg1.type&MDF_STK) {74 stk_ptr--;75 if (stk_ptr<reg_stk_size) {76 tmpi->arg1.type=MDF_REG+tmpi->arg1.type.raw_type;77 tmpi->arg1.reg=Bsf(REGG_STK_TMP);78 tmpi->arg1.disp=0;79 }80 }81 if (tmpi->res.type&MDF_STK && !(tmpi->ic_flags & ICF_PUSH_RES)) {82 stk_ptr++;83 if (stk_ptr<=reg_stk_size) {84 tmpi->res.type=MDF_REG+tmpi->res.type.raw_type;85 tmpi->res.reg=Bsf(REGG_STK_TMP);86 clobbered_reg_mask|=REGG_STK_TMP;87 tmpi->res.disp=0;88 }89 }90 while (OptIC6(tmpi));91 if (tmpi->res.type.raw_type!=RT_F64 && !(tmpi->ic_flags&ICF_USE_F64))92 tmpi->ic_flags|=ICF_USE_INT;93 *_stk_ptr=stk_ptr;94 *_clobbered_reg_mask=clobbered_reg_mask;95}96 97U0 OptPass6(CCmpCtrl *cc)98{99 CIntermediateCode *tmpi,*tmpi_next,*tmpil1,*tmpil2,*old_tmpil2;100 I64 stk_ptr=0,reg_stk_size,clobbered_reg_mask=REGG_CLOBBERED;101 CPrsStk *ps=cc->ps;102 ps->ptr=0;103 ps->ptr2=0;104 if (Bt(&cc->opts,OPTf_NO_REG_VAR) || cc->flags&CCF_NO_REG_OPT)105 reg_stk_size=0;106 else107 reg_stk_size=1;108#assert REGG_STK_TMP==1<<9109 tmpi=cc->coc.coc_head.next;110 old_tmpil2=NULL;111 tmpil1=tmpil2=&cmp.ic_nop;112 while (tmpi->ic_code) {113 if (tmpi->ic_code>IC_NOP2) {114 if (tmpil1->ic_code>IC_NOP2)115 tmpil2=tmpil1;116 tmpil1=tmpi;117 if (tmpi->arg2.type&MDF_STK) {118 if (tmpil2->res.type&MDF_STK &&119 !(tmpil2->ic_flags&ICF_PUSH_RES)) {120 if (tmpi->ic_code==IC_ASSIGN && tmpi->ic_flags&ICF_BY_VAL &&121 tmpi->ic_flags&ICF_RES_NOT_USED &&122 tmpil2->ic_code!=IC_CALL_END &&123 tmpil2->ic_code!=IC_CALL_END2 &&124 tmpil2->ic_code!=IC_SET_RAX &&125 !(tmpi->ic_flags&(ICF_ARG2_TO_F64|ICF_ARG2_TO_INT)) &&126 !(tmpil2->ic_flags&(ICF_RES_TO_F64|ICF_RES_TO_INT))) {127 tmpil2->res.type =tmpi->arg1.type&MDG_MASK+128 tmpi->arg1_type_pointed_to;129 tmpil2->res.reg =tmpi->arg1.reg;130 tmpil2->res.disp =tmpi->arg1.disp;131 tmpil2->ic_flags=tmpil2->ic_flags132 &~(ICF_RES_NOT_USED|ICF_RES_WAS_STK)133 |tmpi->ic_flags&~(ICF_BY_VAL|ICF_ARG1_WAS_STK|ICF_ARG2_WAS_STK);134 old_tmpil2=NULL;135 OptSetNOP1(tmpi);136 } else {137 tmpi->arg2.type=MDF_REG+tmpi->arg2.type.raw_type;138 tmpi->arg2.reg=REG_RAX;139 tmpi->arg2.disp=0;140 tmpil2->res.type=MDF_REG+tmpil2->res.type.raw_type;141 tmpil2->res.reg=REG_RAX;142 tmpil2->res.disp=0;143 }144 }145 } else if (tmpi->arg1.type&MDF_STK && tmpil2->res.type&MDF_STK &&146 !(tmpil2->ic_flags&ICF_PUSH_RES)) {147 tmpi->arg1.type=MDF_REG+tmpi->arg1.type.raw_type;148 tmpi->arg1.disp=0;149 tmpil2->res.type=MDF_REG+tmpil2->res.type.raw_type;150 tmpil2->res.disp=0;151 if (intermediate_code_table[tmpi->ic_code].arg_cnt==IS_2_ARG) {152 tmpi->arg1.reg=REG_R8;153 tmpil2->res.reg=REG_R8;154 } else {155 tmpi->arg1.reg=REG_RAX;156 tmpil2->res.reg=REG_RAX;157 }158 }159 if (tmpi->ic_flags & ICF_PUSH_RES)160 tmpi->res.type==MDF_STK+tmpi->res.type.raw_type;161 if (old_tmpil2!=tmpil2) {162 if (tmpil2->ic_code>IC_NOP2)163 OptPass6Lag(cc,ps,tmpil2,&stk_ptr,reg_stk_size,&clobbered_reg_mask);164 old_tmpil2=tmpil2;165 }166 }167 tmpi_next=tmpi->next;168 if (tmpi->ic_code<=IC_NOP2)169 OptFree(tmpi);170 tmpi=tmpi_next;171 }172 if (ps->ptr>2) {173 "Pass:%d Stk:%08X\n",cc->pass,ps->ptr;174 LexExcept(cc,"Compiler Optimization Error at ");175 }176 if (cc->htc.fun) {177 cc->htc.fun->used_reg_mask&=~REGG_STK_TMP;178 cc->htc.fun->used_reg_mask|=clobbered_reg_mask;179 cc->htc.fun->clobbered_reg_mask=clobbered_reg_mask;180 if (Bt(&cc->flags,CCf_PASS_TRACE_PRESENT) &&181 Bt(&cc->saved_pass_trace,6)) {182 "Used Reg Mask:%04X\n",cc->htc.fun->used_reg_mask;183 "Clobbered Reg Mask:%04X\n",clobbered_reg_mask;184 }185 }186}187 