LTCD_070816.ISO
This commit is contained in:
1 parent
d14bbc24f9
commit
0e9364ff4c
506 files changed
+157705
-41812
No files matched your search
@@ -0,0 +1,182 @@
|
||||
void CmpOptPass4(LexStruct *lx)
|
||||
{
|
||||
IntermediateCode *tempi,*tempi1,
|
||||
*temp_lag[4];
|
||||
I8 code,i,t,pt,t1,pt1;
|
||||
ParseStack *ps=OptStart(lx,temp_lag);
|
||||
BoolU4 inside_return=FALSE;
|
||||
|
||||
tempi=lx->cb.cb_in_ptr;
|
||||
while (code=tempi->ic_opcode) {
|
||||
OptNext2(tempi,temp_lag);
|
||||
if (code>EC_END_EXP && code!=EC_NOP1) {
|
||||
|
||||
if (tempi->ic_flags&ICF_TRACE) {
|
||||
if (Bt(&lx->pass_trace_mask,4)) {
|
||||
PrintF("%2d:",ps->ptr);
|
||||
CbPutIc(tempi);
|
||||
}
|
||||
}
|
||||
|
||||
if (cmp_param_cnt[code]==9)
|
||||
ps->ptr-=tempi->ic_data>>3;
|
||||
if (code==EC_PUSH_REGS) {
|
||||
for (i=0;i<NUM_REGS;i++)
|
||||
if (Bt(&tempi->ic_data,i))
|
||||
ps->ptr++;
|
||||
} else if (code==EC_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 (!inside_return) {
|
||||
if (tempi1->ic_opcode==EC_MOV ||
|
||||
tempi1->ic_opcode==EC_REG) {
|
||||
if (tempi1->ic_flags & ICF_R_TO_INT) {
|
||||
if (tempi1->p1.type&TY_MASK==TY_IMM)
|
||||
tempi1->p1.disp=tempi1->p1.disp><(double);
|
||||
else
|
||||
tempi->ic_flags|=ICF_P3_TO_INT;
|
||||
} else if (tempi1->ic_flags&ICF_R_TO_DOUBLE) {
|
||||
if (tempi1->p1.type&TY_MASK==TY_IMM)
|
||||
tempi1->p1.disp><(double)=tempi1->p1.disp;
|
||||
else
|
||||
tempi->ic_flags|=ICF_P3_TO_DOUBLE;
|
||||
}
|
||||
|
||||
t=tempi->p3.type&IT_MASK;
|
||||
t1=tempi1->p1.type&IT_MASK;
|
||||
if (t1 && t1<t)
|
||||
t=t1;
|
||||
t1=tempi1->r.type&IT_MASK;
|
||||
if (t1 && t1<t)
|
||||
t=t1;
|
||||
tempi->p3.type=tempi1->p1.type&TY_MASK+t;
|
||||
|
||||
pt=tempi->p3.ptype;
|
||||
pt1=tempi1->p1.ptype;
|
||||
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
|
||||
pt=pt1;
|
||||
pt1=tempi1->r.ptype;
|
||||
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
|
||||
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=EC_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 (!inside_return) {
|
||||
if (tempi1->ic_opcode==EC_MOV ||
|
||||
tempi1->ic_opcode==EC_REG) {
|
||||
if (tempi1->ic_flags & ICF_R_TO_INT) {
|
||||
if (tempi1->p1.type&TY_MASK==TY_IMM)
|
||||
tempi1->p1.disp=tempi1->p1.disp><(double);
|
||||
else
|
||||
tempi->ic_flags|=ICF_P2_TO_INT;
|
||||
} else if (tempi1->ic_flags&ICF_R_TO_DOUBLE) {
|
||||
if (tempi1->p1.type&TY_MASK==TY_IMM)
|
||||
tempi1->p1.disp><(double)=tempi1->p1.disp;
|
||||
else
|
||||
tempi->ic_flags|=ICF_P2_TO_DOUBLE;
|
||||
}
|
||||
|
||||
t=tempi->p2.type&IT_MASK;
|
||||
t1=tempi1->p1.type&IT_MASK;
|
||||
if (t1 && t1<t)
|
||||
t=t1;
|
||||
t1=tempi1->r.type&IT_MASK;
|
||||
if (t1 && t1<t)
|
||||
t=t1;
|
||||
tempi->p2.type=tempi1->p1.type&TY_MASK+t;
|
||||
|
||||
pt=tempi->p2.ptype;
|
||||
pt1=tempi1->p1.ptype;
|
||||
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
|
||||
pt=pt1;
|
||||
pt1=tempi1->r.ptype;
|
||||
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
|
||||
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=EC_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 (!inside_return) {
|
||||
if (tempi1->ic_opcode==EC_MOV ||
|
||||
tempi1->ic_opcode==EC_REG) {
|
||||
if (tempi1->ic_flags & ICF_R_TO_INT) {
|
||||
if (tempi1->p1.type&TY_MASK==TY_IMM)
|
||||
tempi1->p1.disp=tempi1->p1.disp><(double);
|
||||
else
|
||||
tempi->ic_flags|=ICF_P1_TO_INT;
|
||||
} else if (tempi1->ic_flags&ICF_R_TO_DOUBLE) {
|
||||
if (tempi1->p1.type&TY_MASK==TY_IMM)
|
||||
tempi1->p1.disp><(double)=tempi1->p1.disp; //dbgo signed/unsigned
|
||||
else if (!(tempi->ic_flags&ICF_USE_INT))
|
||||
tempi->ic_flags|=ICF_P1_TO_DOUBLE;
|
||||
}
|
||||
|
||||
t=tempi->p1.type&IT_MASK;
|
||||
t1=tempi1->p1.type&IT_MASK;
|
||||
if (t1 && t1<t)
|
||||
t=t1;
|
||||
t1=tempi1->r.type&IT_MASK;
|
||||
if (t1 && t1<t)
|
||||
t=t1;
|
||||
tempi->p1.type=tempi1->p1.type&TY_MASK+t;
|
||||
|
||||
pt=tempi->p1.ptype;
|
||||
pt1=tempi1->p1.ptype;
|
||||
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
|
||||
pt=pt1;
|
||||
pt1=tempi1->r.ptype;
|
||||
if (pt1 && pt1<pt && pt!=IT_DOUBLE)
|
||||
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=EC_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 (code==EC_RETURN_START)
|
||||
inside_return=TRUE;
|
||||
else if (code==EC_RETURN_END)
|
||||
inside_return=FALSE;
|
||||
|
||||
if (tempi->r.type&TY_MASK==TY_STK)
|
||||
PrsPush(ps,tempi);
|
||||
}
|
||||
tempi+=sizeof(IntermediateCode);
|
||||
}
|
||||
OptEnd(lx,4,ps);
|
||||
}
|
||||
Reference in new issue
Block a user