Started separation between Low level and higher level instructions
This commit is contained in:
@@ -18,7 +18,7 @@ bool Idiom5::match(iICODE pIcode)
|
||||
return false;
|
||||
m_icodes[0]=pIcode++;
|
||||
m_icodes[1]=pIcode++;
|
||||
if (m_icodes[1]->ic.ll.match(iADC))
|
||||
if (m_icodes[1]->ll()->match(iADC))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -51,7 +51,7 @@ bool Idiom6::match(iICODE pIcode)
|
||||
return false;
|
||||
m_icodes[0]=pIcode++;
|
||||
m_icodes[1]=pIcode++;
|
||||
if (m_icodes[1]->ic.ll.match(iSBB))
|
||||
if (m_icodes[1]->ll()->match(iSBB))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -93,24 +93,24 @@ bool Idiom18::match(iICODE picode)
|
||||
for(int i=0; i<4; ++i)
|
||||
m_icodes[i] =picode++;
|
||||
|
||||
m_is_dec = m_icodes[1]->ic.ll.match(iDEC);
|
||||
m_is_dec = m_icodes[1]->ll()->match(iDEC);
|
||||
int type = -1; /* type of variable: 1 = reg-var, 2 = local */
|
||||
uint8_t regi; /* register of the MOV */
|
||||
|
||||
/* Get variable */
|
||||
if (m_icodes[1]->ic.ll.dst.regi == 0) /* global variable */
|
||||
if (m_icodes[1]->ll()->dst.regi == 0) /* global variable */
|
||||
{
|
||||
/* not supported yet */
|
||||
type = 0;
|
||||
}
|
||||
else if (m_icodes[1]->ic.ll.dst.regi < INDEXBASE) /* register */
|
||||
else if (m_icodes[1]->ll()->dst.regi < INDEXBASE) /* register */
|
||||
{
|
||||
if ((m_icodes[1]->ic.ll.dst.regi == rSI) && (m_func->flg & SI_REGVAR))
|
||||
if ((m_icodes[1]->ll()->dst.regi == rSI) && (m_func->flg & SI_REGVAR))
|
||||
type = 1;
|
||||
else if ((m_icodes[1]->ic.ll.dst.regi == rDI) && (m_func->flg & DI_REGVAR))
|
||||
else if ((m_icodes[1]->ll()->dst.regi == rDI) && (m_func->flg & DI_REGVAR))
|
||||
type = 1;
|
||||
}
|
||||
else if (m_icodes[1]->ic.ll.dst.off) /* local variable */
|
||||
else if (m_icodes[1]->ll()->dst.off) /* local variable */
|
||||
type = 2;
|
||||
else /* indexed */
|
||||
{
|
||||
@@ -126,25 +126,25 @@ bool Idiom18::match(iICODE picode)
|
||||
break;
|
||||
case 1: /* register variable */
|
||||
/* Check previous instruction for a MOV */
|
||||
if (m_icodes[0]->ic.ll.match(iMOV) && (m_icodes[0]->ic.ll.src.regi == m_icodes[1]->ic.ll.dst.regi))
|
||||
if (m_icodes[0]->ll()->match(iMOV) && (m_icodes[0]->ll()->src.regi == m_icodes[1]->ll()->dst.regi))
|
||||
{
|
||||
regi = m_icodes[0]->ic.ll.dst.regi;
|
||||
regi = m_icodes[0]->ll()->dst.regi;
|
||||
if ((regi > 0) && (regi < INDEXBASE))
|
||||
{
|
||||
if ( m_icodes[2]->ic.ll.match(iCMP) && (m_icodes[2]->ic.ll.dst.regi == regi) &&
|
||||
m_icodes[3]->ic.ll.conditionalJump() )
|
||||
if ( m_icodes[2]->ll()->match(iCMP) && (m_icodes[2]->ll()->dst.regi == regi) &&
|
||||
m_icodes[3]->ll()->conditionalJump() )
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2: /* local */
|
||||
if (m_icodes[0]->ic.ll.match(iMOV) && (m_icodes[0]->ic.ll.src.off == m_icodes[1]->ic.ll.dst.off))
|
||||
if (m_icodes[0]->ll()->match(iMOV) && (m_icodes[0]->ll()->src.off == m_icodes[1]->ll()->dst.off))
|
||||
{
|
||||
regi = m_icodes[0]->ic.ll.dst.regi;
|
||||
regi = m_icodes[0]->ll()->dst.regi;
|
||||
if ((regi > 0) && (regi < INDEXBASE))
|
||||
{
|
||||
if ( m_icodes[2]->ic.ll.match(iCMP) && (m_icodes[2]->ic.ll.dst.regi == regi) &&
|
||||
m_icodes[3]->ic.ll.conditionalJump() )
|
||||
if ( m_icodes[2]->ll()->match(iCMP) && (m_icodes[2]->ll()->dst.regi == regi) &&
|
||||
m_icodes[3]->ll()->conditionalJump() )
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -163,7 +163,7 @@ int Idiom18::action() // action length
|
||||
lhs = COND_EXPR::id (*m_icodes[0], SRC, m_func, m_icodes[1], *m_icodes[1], eUSE);
|
||||
lhs = COND_EXPR::unary ( m_is_dec ? POST_DEC : POST_INC, lhs);
|
||||
rhs = COND_EXPR::id (*m_icodes[2], SRC, m_func, m_icodes[1], *m_icodes[3], eUSE);
|
||||
expr = COND_EXPR::boolOp (lhs, rhs, condOpJCond[m_icodes[3]->ic.ll.opcode - iJB]);
|
||||
expr = COND_EXPR::boolOp (lhs, rhs, condOpJCond[m_icodes[3]->ll()->opcode - iJB]);
|
||||
m_icodes[3]->setJCond(expr);
|
||||
|
||||
m_icodes[0]->invalidate();
|
||||
@@ -189,19 +189,19 @@ bool Idiom19::match(iICODE picode)
|
||||
|
||||
for(int i=0; i<2; ++i)
|
||||
m_icodes[i] =picode++;
|
||||
m_is_dec = m_icodes[0]->ic.ll.match(iDEC);
|
||||
if (m_icodes[0]->ic.ll.dst.regi == 0) /* global variable */
|
||||
m_is_dec = m_icodes[0]->ll()->match(iDEC);
|
||||
if (m_icodes[0]->ll()->dst.regi == 0) /* global variable */
|
||||
/* not supported yet */ ;
|
||||
else if (m_icodes[0]->ic.ll.dst.regi < INDEXBASE) /* register */
|
||||
else if (m_icodes[0]->ll()->dst.regi < INDEXBASE) /* register */
|
||||
{
|
||||
// if (((picode->ic.ll.dst.regi == rSI) && (pproc->flg & SI_REGVAR)) ||
|
||||
// ((picode->ic.ll.dst.regi == rDI) && (pproc->flg & DI_REGVAR)))
|
||||
if (m_icodes[1]->ic.ll.conditionalJump())
|
||||
// if (((picode->ll()->dst.regi == rSI) && (pproc->flg & SI_REGVAR)) ||
|
||||
// ((picode->ll()->dst.regi == rDI) && (pproc->flg & DI_REGVAR)))
|
||||
if (m_icodes[1]->ll()->conditionalJump())
|
||||
return true;
|
||||
}
|
||||
else if (m_icodes[0]->ic.ll.dst.off) /* stack variable */
|
||||
else if (m_icodes[0]->ll()->dst.off) /* stack variable */
|
||||
{
|
||||
if ( m_icodes[1]->ic.ll.conditionalJump() )
|
||||
if ( m_icodes[1]->ll()->conditionalJump() )
|
||||
return true;
|
||||
}
|
||||
else /* indexed */
|
||||
@@ -214,7 +214,7 @@ int Idiom19::action()
|
||||
lhs = COND_EXPR::id (*m_icodes[1], DST, m_func, m_icodes[0], *m_icodes[1], eUSE);
|
||||
lhs = COND_EXPR::unary (m_is_dec ? PRE_DEC : PRE_INC, lhs);
|
||||
rhs = COND_EXPR::idKte (0, 2);
|
||||
expr = COND_EXPR::boolOp (lhs, rhs, condOpJCond[m_icodes[1]->ic.ll.opcode - iJB]);
|
||||
expr = COND_EXPR::boolOp (lhs, rhs, condOpJCond[m_icodes[1]->ll()->opcode - iJB]);
|
||||
m_icodes[1]->setJCond(expr);
|
||||
m_icodes[0]->invalidate();
|
||||
return 2;
|
||||
@@ -244,21 +244,21 @@ bool Idiom20::match(iICODE picode)
|
||||
for(int i=0; i<4; ++i)
|
||||
m_icodes[i] =picode++;
|
||||
|
||||
m_is_dec = m_icodes[0]->ic.ll.match(iDEC);
|
||||
m_is_dec = m_icodes[0]->ll()->match(iDEC);
|
||||
|
||||
/* Get variable */
|
||||
if (m_icodes[0]->ic.ll.dst.regi == 0) /* global variable */
|
||||
if (m_icodes[0]->ll()->dst.regi == 0) /* global variable */
|
||||
{
|
||||
/* not supported yet */ ;
|
||||
}
|
||||
else if (m_icodes[0]->ic.ll.dst.regi < INDEXBASE) /* register */
|
||||
else if (m_icodes[0]->ll()->dst.regi < INDEXBASE) /* register */
|
||||
{
|
||||
if ((m_icodes[0]->ic.ll.dst.regi == rSI) && (m_func->flg & SI_REGVAR))
|
||||
if ((m_icodes[0]->ll()->dst.regi == rSI) && (m_func->flg & SI_REGVAR))
|
||||
type = 1;
|
||||
else if ((m_icodes[0]->ic.ll.dst.regi == rDI) && (m_func->flg & DI_REGVAR))
|
||||
else if ((m_icodes[0]->ll()->dst.regi == rDI) && (m_func->flg & DI_REGVAR))
|
||||
type = 1;
|
||||
}
|
||||
else if (m_icodes[0]->ic.ll.dst.off) /* local variable */
|
||||
else if (m_icodes[0]->ll()->dst.off) /* local variable */
|
||||
type = 2;
|
||||
else /* indexed */
|
||||
{
|
||||
@@ -269,28 +269,28 @@ bool Idiom20::match(iICODE picode)
|
||||
/* Check previous instruction for a MOV */
|
||||
if (type == 1) /* register variable */
|
||||
{
|
||||
if (m_icodes[1]->ic.ll.match(iMOV) &&
|
||||
(m_icodes[1]->ic.ll.src.regi == m_icodes[0]->ic.ll.dst.regi))
|
||||
if (m_icodes[1]->ll()->match(iMOV) &&
|
||||
(m_icodes[1]->ll()->src.regi == m_icodes[0]->ll()->dst.regi))
|
||||
{
|
||||
regi = m_icodes[1]->ic.ll.dst.regi;
|
||||
regi = m_icodes[1]->ll()->dst.regi;
|
||||
if ((regi > 0) && (regi < INDEXBASE))
|
||||
{
|
||||
if (m_icodes[2]->ic.ll.match(iCMP,(eReg)regi) &&
|
||||
m_icodes[3]->ic.ll.conditionalJump())
|
||||
if (m_icodes[2]->ll()->match(iCMP,(eReg)regi) &&
|
||||
m_icodes[3]->ll()->conditionalJump())
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (type == 2) /* local */
|
||||
{
|
||||
if ( m_icodes[0]->ic.ll.match(iMOV) &&
|
||||
(m_icodes[1]->ic.ll.src.off == m_icodes[0]->ic.ll.dst.off))
|
||||
if ( m_icodes[0]->ll()->match(iMOV) &&
|
||||
(m_icodes[1]->ll()->src.off == m_icodes[0]->ll()->dst.off))
|
||||
{
|
||||
regi = m_icodes[1]->ic.ll.dst.regi;
|
||||
regi = m_icodes[1]->ll()->dst.regi;
|
||||
if ((regi > 0) && (regi < INDEXBASE))
|
||||
{
|
||||
if (m_icodes[2]->ic.ll.match(iCMP,(eReg)regi) &&
|
||||
m_icodes[3]->ic.ll.conditionalJump())
|
||||
if (m_icodes[2]->ll()->match(iCMP,(eReg)regi) &&
|
||||
m_icodes[3]->ll()->conditionalJump())
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -303,7 +303,7 @@ int Idiom20::action()
|
||||
lhs = COND_EXPR::id (*m_icodes[1], SRC, m_func, m_icodes[0], *m_icodes[0], eUSE);
|
||||
lhs = COND_EXPR::unary (m_is_dec ? PRE_DEC : PRE_INC, lhs);
|
||||
rhs = COND_EXPR::id (*m_icodes[2], SRC, m_func, m_icodes[0], *m_icodes[3], eUSE);
|
||||
expr = COND_EXPR::boolOp (lhs, rhs, condOpJCond[m_icodes[3]->ic.ll.opcode - iJB]);
|
||||
expr = COND_EXPR::boolOp (lhs, rhs, condOpJCond[m_icodes[3]->ll()->opcode - iJB]);
|
||||
m_icodes[3]->setJCond(expr);
|
||||
for(int i=0; i<3; ++i)
|
||||
m_icodes[i]->invalidate();
|
||||
|
||||
@@ -22,25 +22,25 @@ bool Idiom3::match(iICODE picode)
|
||||
/* Match ADD SP, immed */
|
||||
for(int i=0; i<2; ++i)
|
||||
m_icodes[i] = picode++;
|
||||
if ( (m_icodes[1]->ic.ll.flg & I) && m_icodes[1]->ic.ll.match(iADD,rSP))
|
||||
if ( m_icodes[1]->ll()->isLlFlag(I) && m_icodes[1]->ll()->match(iADD,rSP))
|
||||
{
|
||||
m_param_count = m_icodes[1]->ic.ll.src.op();
|
||||
m_param_count = m_icodes[1]->ll()->src.op();
|
||||
return true;
|
||||
}
|
||||
else if (m_icodes[1]->ic.ll.match(iMOV,rSP,rBP))
|
||||
else if (m_icodes[1]->ll()->match(iMOV,rSP,rBP))
|
||||
{
|
||||
m_icodes[0]->ic.ll.flg |= REST_STK;
|
||||
m_icodes[0]->ll()->SetLlFlag(REST_STK);
|
||||
return true;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int Idiom3::action()
|
||||
{
|
||||
if (m_icodes[0]->ic.ll.flg & I)
|
||||
if (m_icodes[0]->ll()->isLlFlag(I) )
|
||||
{
|
||||
m_icodes[0]->ic.ll.src.proc.proc->cbParam = (int16_t)m_param_count;
|
||||
m_icodes[0]->ic.ll.src.proc.cb = m_param_count;
|
||||
m_icodes[0]->ic.ll.src.proc.proc->flg |= CALL_C;
|
||||
m_icodes[0]->ll()->src.proc.proc->cbParam = (int16_t)m_param_count;
|
||||
m_icodes[0]->ll()->src.proc.cb = m_param_count;
|
||||
m_icodes[0]->ll()->src.proc.proc->flg |= CALL_C;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -76,16 +76,16 @@ bool Idiom17::match(iICODE picode)
|
||||
uint8_t regi;
|
||||
|
||||
/* Match POP reg */
|
||||
if (m_icodes[1]->ic.ll.match(iPOP))
|
||||
if (m_icodes[1]->ll()->match(iPOP))
|
||||
{
|
||||
int i=0;
|
||||
regi = m_icodes[1]->ic.ll.dst.regi;
|
||||
regi = m_icodes[1]->ll()->dst.regi;
|
||||
if ((regi >= rAX) && (regi <= rBX))
|
||||
i++;
|
||||
|
||||
while (picode != m_end && picode->ic.ll.match(iPOP))
|
||||
while (picode != m_end && picode->ll()->match(iPOP))
|
||||
{
|
||||
if (picode->ic.ll.dst.regi != regi)
|
||||
if (picode->ll()->dst.regi != regi)
|
||||
break;
|
||||
i++;
|
||||
m_icodes.push_back(picode++);
|
||||
@@ -96,11 +96,11 @@ bool Idiom17::match(iICODE picode)
|
||||
}
|
||||
int Idiom17::action()
|
||||
{
|
||||
if (m_icodes[0]->isLlFlag(I))
|
||||
if (m_icodes[0]->ll()->isLlFlag(I))
|
||||
{
|
||||
m_icodes[0]->ic.ll.src.proc.proc->cbParam = (int16_t)m_param_count;
|
||||
m_icodes[0]->ic.ll.src.proc.cb = m_param_count;
|
||||
m_icodes[0]->ic.ll.src.proc.proc->flg |= CALL_C;
|
||||
m_icodes[0]->ll()->src.proc.proc->cbParam = (int16_t)m_param_count;
|
||||
m_icodes[0]->ll()->src.proc.cb = m_param_count;
|
||||
m_icodes[0]->ll()->src.proc.proc->flg |= CALL_C;
|
||||
for(int idx=1; idx<m_icodes.size(); ++idx)
|
||||
{
|
||||
m_icodes[idx]->invalidate();
|
||||
|
||||
@@ -12,22 +12,22 @@ void EpilogIdiom::popStkVars(iICODE pIcode)
|
||||
{
|
||||
// TODO : only process SI-DI DI-SI pairings, no SI-SI, DI-DI like it's now
|
||||
/* Match [POP DI] */
|
||||
if (pIcode->ic.ll.match(iPOP))
|
||||
if (pIcode->ll()->match(iPOP))
|
||||
{
|
||||
if ((m_func->flg & DI_REGVAR) && pIcode->ic.ll.match(rDI))
|
||||
if ((m_func->flg & DI_REGVAR) && pIcode->ll()->match(rDI))
|
||||
m_icodes.push_front(pIcode);
|
||||
else if ((m_func->flg & SI_REGVAR) && pIcode->ic.ll.match(rSI))
|
||||
else if ((m_func->flg & SI_REGVAR) && pIcode->ll()->match(rSI))
|
||||
m_icodes.push_front(pIcode);
|
||||
}
|
||||
++pIcode;
|
||||
if(pIcode==m_end)
|
||||
return;
|
||||
/* Match [POP SI] */
|
||||
if (pIcode->ic.ll.match(iPOP))
|
||||
if (pIcode->ll()->match(iPOP))
|
||||
{
|
||||
if ((m_func->flg & SI_REGVAR) && pIcode->ic.ll.match(rSI))
|
||||
if ((m_func->flg & SI_REGVAR) && pIcode->ll()->match(rSI))
|
||||
m_icodes.push_front(pIcode);
|
||||
else if ((m_func->flg & DI_REGVAR) && pIcode->ic.ll.match(rDI))
|
||||
else if ((m_func->flg & DI_REGVAR) && pIcode->ll()->match(rDI))
|
||||
m_icodes.push_front(pIcode);
|
||||
}
|
||||
}
|
||||
@@ -46,7 +46,7 @@ bool Idiom2::match(iICODE pIcode)
|
||||
iICODE nicode;
|
||||
if(pIcode==m_func->Icode.begin()) // pIcode->loc_ip == 0
|
||||
return false;
|
||||
if ( ((pIcode->ic.ll.flg & I) == I) || not pIcode->ic.ll.match(rSP,rBP))
|
||||
if ( pIcode->ll()->isLlFlag(I) || (not pIcode->ll()->match(rSP,rBP)) )
|
||||
return false;
|
||||
if(distance(pIcode,m_end)<3)
|
||||
return false;
|
||||
@@ -55,21 +55,21 @@ bool Idiom2::match(iICODE pIcode)
|
||||
m_icodes.push_back(pIcode);
|
||||
/* Get next icode, skip over holes in the icode array */
|
||||
nicode = ++iICODE(pIcode);
|
||||
while (nicode->ic.ll.flg & NO_CODE && (nicode != m_end))
|
||||
while (nicode->ll()->isLlFlag(NO_CODE) && (nicode != m_end))
|
||||
{
|
||||
nicode++;
|
||||
}
|
||||
if(nicode == m_end)
|
||||
return false;
|
||||
|
||||
if (nicode->ic.ll.match(iPOP,rBP) && ! (nicode->ic.ll.flg & (I | TARGET | CASE)) )
|
||||
if (nicode->ll()->match(iPOP,rBP) && ! (nicode->ll()->isLlFlag(I | TARGET | CASE)) )
|
||||
{
|
||||
m_icodes.push_back(nicode++); // Matched POP BP
|
||||
|
||||
/* Match RET(F) */
|
||||
if ( nicode != m_end &&
|
||||
!(nicode->ic.ll.flg & (I | TARGET | CASE)) &&
|
||||
(nicode->ic.ll.match(iRET) || nicode->ic.ll.match(iRETF))
|
||||
!(nicode->ll()->isLlFlag(I | TARGET | CASE)) &&
|
||||
(nicode->ll()->match(iRET) || nicode->ll()->match(iRETF))
|
||||
)
|
||||
{
|
||||
m_icodes.push_back(nicode); // Matched RET
|
||||
@@ -118,7 +118,7 @@ bool Idiom4::match(iICODE pIcode)
|
||||
{
|
||||
iICODE prev1 = --iICODE(pIcode);
|
||||
/* Check for POP BP */
|
||||
if (prev1->ic.ll.match(iPOP,rBP) && not prev1->ic.ll.anyFlagSet(I) )
|
||||
if (prev1->ll()->match(iPOP,rBP) && not prev1->ll()->isLlFlag(I) )
|
||||
m_icodes.push_back(prev1);
|
||||
else if(prev1!=m_func->Icode.begin())
|
||||
{
|
||||
@@ -129,9 +129,9 @@ bool Idiom4::match(iICODE pIcode)
|
||||
}
|
||||
|
||||
/* Check for RET(F) immed */
|
||||
if (pIcode->ic.ll.flg & I)
|
||||
if (pIcode->ll()->isLlFlag(I) )
|
||||
{
|
||||
m_param_count = (int16_t)pIcode->ic.ll.src.op();
|
||||
m_param_count = (int16_t)pIcode->ll()->src.op();
|
||||
}
|
||||
}
|
||||
int Idiom4::action()
|
||||
|
||||
@@ -15,18 +15,18 @@ int Idiom1::checkStkVars (iICODE pIcode)
|
||||
int di_matched=0;
|
||||
if(pIcode==m_end)
|
||||
return 0;
|
||||
if (pIcode->ic.ll.match(iPUSH,rSI))
|
||||
if (pIcode->ll()->match(iPUSH,rSI))
|
||||
{
|
||||
si_matched = 1;
|
||||
++pIcode;
|
||||
if ((pIcode != m_end) && pIcode->ic.ll.match(iPUSH,rDI)) // Look for PUSH DI
|
||||
if ((pIcode != m_end) && pIcode->ll()->match(iPUSH,rDI)) // Look for PUSH DI
|
||||
di_matched = 1;
|
||||
}
|
||||
else if (pIcode->ic.ll.match(iPUSH,rDI))
|
||||
else if (pIcode->ll()->match(iPUSH,rDI))
|
||||
{
|
||||
di_matched = 1;
|
||||
++pIcode;
|
||||
if ((pIcode != m_end) && pIcode->ic.ll.match(iPUSH,rSI)) // Look for PUSH SI
|
||||
if ((pIcode != m_end) && pIcode->ll()->match(iPUSH,rSI)) // Look for PUSH SI
|
||||
si_matched = 1;
|
||||
}
|
||||
m_func->flg |= (si_matched ? SI_REGVAR : 0) | (di_matched ? DI_REGVAR : 0);
|
||||
@@ -60,13 +60,13 @@ bool Idiom1::match(iICODE picode)
|
||||
m_icodes.clear();
|
||||
m_min_off = 0;
|
||||
/* PUSH BP as first instruction of procedure */
|
||||
if ( !(picode->ic.ll.flg & I) && picode->ic.ll.src.regi == rBP)
|
||||
if ( (not picode->ll()->isLlFlag(I)) && picode->ll()->src.regi == rBP)
|
||||
{
|
||||
m_icodes.push_back( picode++ ); // insert iPUSH
|
||||
if(picode==m_end)
|
||||
return false;
|
||||
/* MOV BP, SP as next instruction */
|
||||
if ( !picode->ic.ll.anyFlagSet(I | TARGET | CASE) && picode->ic.ll.match(iMOV ,rBP,rSP) )
|
||||
if ( !picode->ll()->isLlFlag(I | TARGET | CASE) && picode->ll()->match(iMOV ,rBP,rSP) )
|
||||
{
|
||||
m_icodes.push_back( picode++ ); // insert iMOV
|
||||
if(picode==m_end)
|
||||
@@ -75,7 +75,7 @@ bool Idiom1::match(iICODE picode)
|
||||
|
||||
/* Look for SUB SP, immed */
|
||||
if (
|
||||
picode->ic.ll.anyFlagSet(I | TARGET | CASE) && picode->ic.ll.match(iSUB,rSP)
|
||||
picode->ll()->isLlFlag(I | TARGET | CASE) && picode->ll()->match(iSUB,rSP)
|
||||
)
|
||||
{
|
||||
m_icodes.push_back( picode++ ); // insert iSUB
|
||||
@@ -99,8 +99,8 @@ bool Idiom1::match(iICODE picode)
|
||||
return false;
|
||||
/* Look for MOV BP, SP */
|
||||
if ( picode != m_end &&
|
||||
!picode->ic.ll.anyFlagSet(I | TARGET | CASE) &&
|
||||
picode->ic.ll.match(iMOV,rBP,rSP))
|
||||
!picode->ll()->isLlFlag(I | TARGET | CASE) &&
|
||||
picode->ll()->match(iMOV,rBP,rSP))
|
||||
{
|
||||
m_icodes.push_back(picode);
|
||||
m_min_off = 2 + (n * 2);
|
||||
|
||||
@@ -28,14 +28,14 @@ bool Idiom14::match(iICODE pIcode)
|
||||
m_icodes[0]=pIcode++;
|
||||
m_icodes[1]=pIcode++;
|
||||
/* Check for regL */
|
||||
m_regL = m_icodes[0]->ic.ll.dst.regi;
|
||||
if (not m_icodes[0]->isLlFlag(I) && ((m_regL == rAX) || (m_regL ==rBX)))
|
||||
m_regL = m_icodes[0]->ll()->dst.regi;
|
||||
if (not m_icodes[0]->ll()->isLlFlag(I) && ((m_regL == rAX) || (m_regL ==rBX)))
|
||||
{
|
||||
/* Check for XOR regH, regH */
|
||||
if (m_icodes[1]->ic.ll.match(iXOR) && not m_icodes[1]->isLlFlag(I))
|
||||
if (m_icodes[1]->ll()->match(iXOR) && not m_icodes[1]->ll()->isLlFlag(I))
|
||||
{
|
||||
m_regH = m_icodes[1]->ic.ll.dst.regi;
|
||||
if (m_regH == m_icodes[1]->ic.ll.src.regi)
|
||||
m_regH = m_icodes[1]->ll()->dst.regi;
|
||||
if (m_regH == m_icodes[1]->ll()->src.regi)
|
||||
{
|
||||
if ((m_regL == rAX) && (m_regH == rDX))
|
||||
return true;
|
||||
@@ -80,13 +80,13 @@ bool Idiom13::match(iICODE pIcode)
|
||||
uint8_t regi;
|
||||
|
||||
/* Check for regL */
|
||||
regi = m_icodes[0]->ic.ll.dst.regi;
|
||||
if (not m_icodes[0]->isLlFlag(I) && (regi >= rAL) && (regi <= rBH))
|
||||
regi = m_icodes[0]->ll()->dst.regi;
|
||||
if (not m_icodes[0]->ll()->isLlFlag(I) && (regi >= rAL) && (regi <= rBH))
|
||||
{
|
||||
/* Check for MOV regH, 0 */
|
||||
if (m_icodes[1]->ic.ll.match(iMOV) && m_icodes[1]->isLlFlag(I) && (m_icodes[1]->ic.ll.src.op() == 0))
|
||||
if (m_icodes[1]->ll()->match(iMOV) && m_icodes[1]->ll()->isLlFlag(I) && (m_icodes[1]->ll()->src.op() == 0))
|
||||
{
|
||||
if (m_icodes[1]->ic.ll.dst.regi == (regi + 4)) //TODO: based on distance between AH-AL,BH-BL etc.
|
||||
if (m_icodes[1]->ll()->dst.regi == (regi + 4)) //TODO: based on distance between AH-AL,BH-BL etc.
|
||||
{
|
||||
m_loaded_reg=(regi - rAL + rAX);
|
||||
return true;
|
||||
|
||||
@@ -27,22 +27,22 @@ bool Idiom11::match (iICODE picode)
|
||||
return false;
|
||||
/* Check NEG reg/mem
|
||||
* SBB reg/mem, 0*/
|
||||
if (not m_icodes[1]->ic.ll.match(iNEG) or not m_icodes[2]->ic.ll.match(iSBB))
|
||||
if (not m_icodes[1]->ll()->match(iNEG) or not m_icodes[2]->ll()->match(iSBB))
|
||||
return false;
|
||||
switch (type)
|
||||
{
|
||||
case GLOB_VAR:
|
||||
if ((m_icodes[2]->ic.ll.dst.segValue == m_icodes[0]->ic.ll.dst.segValue) &&
|
||||
(m_icodes[2]->ic.ll.dst.off == m_icodes[0]->ic.ll.dst.off))
|
||||
if ((m_icodes[2]->ll()->dst.segValue == m_icodes[0]->ll()->dst.segValue) &&
|
||||
(m_icodes[2]->ll()->dst.off == m_icodes[0]->ll()->dst.off))
|
||||
return true;
|
||||
break;
|
||||
case REGISTER:
|
||||
if (m_icodes[2]->ic.ll.dst.regi == m_icodes[0]->ic.ll.dst.regi)
|
||||
if (m_icodes[2]->ll()->dst.regi == m_icodes[0]->ll()->dst.regi)
|
||||
return true;
|
||||
break;
|
||||
case PARAM:
|
||||
case LOCAL_VAR:
|
||||
if (m_icodes[2]->ic.ll.dst.off == m_icodes[0]->ic.ll.dst.off)
|
||||
if (m_icodes[2]->ll()->dst.off == m_icodes[0]->ll()->dst.off)
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
@@ -79,13 +79,13 @@ bool Idiom16::match (iICODE picode)
|
||||
for(int i=0; i<3; ++i)
|
||||
m_icodes[i]=picode++;
|
||||
|
||||
uint8_t regi = m_icodes[0]->ic.ll.dst.regi;
|
||||
uint8_t regi = m_icodes[0]->ll()->dst.regi;
|
||||
if ((regi >= rAX) && (regi < INDEXBASE))
|
||||
{
|
||||
if (m_icodes[1]->ic.ll.match(iSBB) && m_icodes[2]->ic.ll.match(iINC))
|
||||
if ((m_icodes[1]->ic.ll.dst.regi == (m_icodes[1]->ic.ll.src.regi)) &&
|
||||
m_icodes[1]->ic.ll.match((eReg)regi) &&
|
||||
m_icodes[2]->ic.ll.match((eReg)regi))
|
||||
if (m_icodes[1]->ll()->match(iSBB) && m_icodes[2]->ll()->match(iINC))
|
||||
if ((m_icodes[1]->ll()->dst.regi == (m_icodes[1]->ll()->src.regi)) &&
|
||||
m_icodes[1]->ll()->match((eReg)regi) &&
|
||||
m_icodes[2]->ll()->match((eReg)regi))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -93,7 +93,7 @@ bool Idiom16::match (iICODE picode)
|
||||
int Idiom16::action()
|
||||
{
|
||||
COND_EXPR *lhs,*rhs;
|
||||
lhs = COND_EXPR::idReg (m_icodes[0]->ic.ll.dst.regi, m_icodes[0]->ic.ll.flg,&m_func->localId);
|
||||
lhs = COND_EXPR::idReg (m_icodes[0]->ll()->dst.regi, m_icodes[0]->ll()->GetLlFlag(),&m_func->localId);
|
||||
rhs = COND_EXPR::unary (NEGATION, lhs->clone());
|
||||
m_icodes[0]->setAsgn(lhs, rhs);
|
||||
m_icodes[1]->invalidate();
|
||||
|
||||
@@ -18,10 +18,9 @@ bool Idiom8::match(iICODE pIcode)
|
||||
return false;
|
||||
m_icodes[0]=pIcode++;
|
||||
m_icodes[1]=pIcode++;
|
||||
if (m_icodes[0]->isLlFlag(I) && (m_icodes[0]->ic.ll.src.op() == 1))
|
||||
if (m_icodes[1]->ic.ll.match(iRCR) &&
|
||||
m_icodes[1]->isLlFlag(I) &&
|
||||
(m_icodes[1]->ic.ll.src.op() == 1))
|
||||
if (m_icodes[0]->ll()->isLlFlag(I) && (m_icodes[0]->ll()->src.op() == 1))
|
||||
if ( m_icodes[1]->ll()->match(iRCR,I) &&
|
||||
(m_icodes[1]->ll()->src.op() == 1))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -31,8 +30,8 @@ int Idiom8::action()
|
||||
int idx;
|
||||
COND_EXPR *rhs,*lhs,*expr;
|
||||
uint8_t regH,regL;
|
||||
regH=m_icodes[0]->ic.ll.dst.regi;
|
||||
regL=m_icodes[1]->ic.ll.dst.regi;
|
||||
regH=m_icodes[0]->ll()->dst.regi;
|
||||
regL=m_icodes[1]->ll()->dst.regi;
|
||||
idx = m_func->localId.newLongReg (TYPE_LONG_SIGN, regH, regL, m_icodes[0]);
|
||||
lhs = COND_EXPR::idLongIdx (idx);
|
||||
m_icodes[0]->setRegDU( regL, USE_DEF);
|
||||
@@ -64,15 +63,14 @@ bool Idiom15::match(iICODE pIcode)
|
||||
if(distance(pIcode,m_end)<2)
|
||||
return false;
|
||||
/* Match SHL reg, 1 */
|
||||
if (not pIcode->isLlFlag(I) or (pIcode->ic.ll.src.op() != 1))
|
||||
if (not pIcode->ll()->isLlFlag(I) or (pIcode->ll()->src.op() != 1))
|
||||
return false;
|
||||
m_icodes.clear();
|
||||
regi = pIcode->ic.ll.dst.regi;
|
||||
regi = pIcode->ll()->dst.regi;
|
||||
m_icodes.push_back(pIcode++);
|
||||
while( (pIcode!=m_end) and
|
||||
pIcode->ic.ll.match(iSHL,(eReg)regi) and
|
||||
pIcode->isLlFlag(I) and
|
||||
(pIcode->ic.ll.src.op() == 1) )
|
||||
pIcode->ll()->match(iSHL,(eReg)regi,I) and
|
||||
(pIcode->ll()->src.op() == 1) )
|
||||
{
|
||||
n++;
|
||||
m_icodes.push_back(pIcode++);
|
||||
@@ -83,9 +81,9 @@ bool Idiom15::match(iICODE pIcode)
|
||||
int Idiom15::action()
|
||||
{
|
||||
COND_EXPR *lhs,*rhs,*exp;
|
||||
lhs = COND_EXPR::idReg (m_icodes[0]->ic.ll.dst.regi,
|
||||
m_icodes[0]->ic.ll.flg & NO_SRC_B,
|
||||
&m_func->localId);
|
||||
lhs = COND_EXPR::idReg (m_icodes[0]->ll()->dst.regi,
|
||||
m_icodes[0]->ll()->GetLlFlag() & NO_SRC_B,
|
||||
&m_func->localId);
|
||||
rhs = COND_EXPR::idKte (m_icodes.size(), 2);
|
||||
exp = COND_EXPR::boolOp (lhs, rhs, SHL);
|
||||
m_icodes[0]->setAsgn(lhs, exp);
|
||||
@@ -111,9 +109,8 @@ bool Idiom12::match(iICODE pIcode)
|
||||
return false;
|
||||
m_icodes[0]=pIcode++;
|
||||
m_icodes[1]=pIcode++;
|
||||
if (m_icodes[0]->isLlFlag(I) && (m_icodes[0]->ic.ll.src.op() == 1))
|
||||
if (m_icodes[1]->ic.ll.match(iRCL) &&
|
||||
m_icodes[1]->isLlFlag(I) && (m_icodes[1]->ic.ll.src.op() == 1))
|
||||
if (m_icodes[0]->ll()->isLlFlag(I) && (m_icodes[0]->ll()->src.op() == 1))
|
||||
if (m_icodes[1]->ll()->match(iRCL,I) && (m_icodes[1]->ll()->src.op() == 1))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -123,8 +120,8 @@ int Idiom12::action()
|
||||
int idx;
|
||||
COND_EXPR *rhs,*lhs,*expr;
|
||||
uint8_t regH,regL;
|
||||
regL=m_icodes[0]->ic.ll.dst.regi;
|
||||
regH=m_icodes[1]->ic.ll.dst.regi;
|
||||
regL=m_icodes[0]->ll()->dst.regi;
|
||||
regH=m_icodes[1]->ll()->dst.regi;
|
||||
|
||||
idx = m_func->localId.newLongReg (TYPE_LONG_UNSIGN, regH, regL,m_icodes[0]);
|
||||
lhs = COND_EXPR::idLongIdx (idx);
|
||||
@@ -151,9 +148,8 @@ bool Idiom9::match(iICODE pIcode)
|
||||
return false;
|
||||
m_icodes[0]=pIcode++;
|
||||
m_icodes[1]=pIcode++;
|
||||
if (m_icodes[0]->isLlFlag(I) && (m_icodes[0]->ic.ll.src.op() == 1))
|
||||
if (m_icodes[1]->ic.ll.match(iRCR) &&
|
||||
m_icodes[1]->isLlFlag(I) && (m_icodes[1]->ic.ll.src.op() == 1))
|
||||
if (m_icodes[0]->ll()->isLlFlag(I) && (m_icodes[0]->ll()->src.op() == 1))
|
||||
if (m_icodes[1]->ll()->match(iRCR,I) && (m_icodes[1]->ll()->src.op() == 1))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -163,8 +159,8 @@ int Idiom9::action()
|
||||
int idx;
|
||||
COND_EXPR *rhs,*lhs,*expr;
|
||||
uint8_t regH,regL;
|
||||
regL=m_icodes[1]->ic.ll.dst.regi;
|
||||
regH=m_icodes[0]->ic.ll.dst.regi;
|
||||
regL=m_icodes[1]->ll()->dst.regi;
|
||||
regH=m_icodes[0]->ll()->dst.regi;
|
||||
idx = m_func->localId.newLongReg (TYPE_LONG_UNSIGN,regH,regL,m_icodes[0]);
|
||||
lhs = COND_EXPR::idLongIdx (idx);
|
||||
m_icodes[0]->setRegDU(regL, USE_DEF);
|
||||
|
||||
@@ -23,16 +23,16 @@ bool Idiom21::match (iICODE picode)
|
||||
m_icodes[0]=picode++;
|
||||
m_icodes[1]=picode++;
|
||||
|
||||
if (not m_icodes[1]->isLlFlag(I))
|
||||
if (not m_icodes[1]->ll()->isLlFlag(I))
|
||||
return false;
|
||||
|
||||
dst = &m_icodes[0]->ic.ll.dst;
|
||||
src = &m_icodes[0]->ic.ll.src;
|
||||
dst = &m_icodes[0]->ll()->dst;
|
||||
src = &m_icodes[0]->ll()->src;
|
||||
if ((dst->regi == src->regi) && (dst->regi > 0) && (dst->regi < INDEXBASE))
|
||||
{
|
||||
if ((dst->regi == rDX) && m_icodes[1]->ic.ll.match(rAX))
|
||||
if ((dst->regi == rDX) && m_icodes[1]->ll()->match(rAX))
|
||||
return true;
|
||||
if ((dst->regi == rCX) && m_icodes[1]->ic.ll.match(rBX))
|
||||
if ((dst->regi == rCX) && m_icodes[1]->ll()->match(rBX))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -41,7 +41,7 @@ int Idiom21::action()
|
||||
{
|
||||
COND_EXPR *lhs,*rhs;
|
||||
lhs = COND_EXPR::idLong (&m_func->localId, DST, m_icodes[0],HIGH_FIRST, m_icodes[0], eDEF, 1);
|
||||
rhs = COND_EXPR::idKte (m_icodes[1]->ic.ll.src.op() , 4);
|
||||
rhs = COND_EXPR::idKte (m_icodes[1]->ll()->src.op() , 4);
|
||||
m_icodes[0]->setAsgn(lhs, rhs);
|
||||
m_icodes[0]->du.use = 0; /* clear register used in iXOR */
|
||||
m_icodes[1]->invalidate();
|
||||
@@ -61,8 +61,8 @@ bool Idiom7::match(iICODE picode)
|
||||
return false;
|
||||
LLOperand *dst, *src;
|
||||
m_icode=picode;
|
||||
dst = &picode->ic.ll.dst;
|
||||
src = &picode->ic.ll.src;
|
||||
dst = &picode->ll()->dst;
|
||||
src = &picode->ll()->src;
|
||||
if (dst->regi == 0) /* global variable */
|
||||
{
|
||||
if ((dst->segValue == src->segValue) && (dst->off == src->off))
|
||||
@@ -87,7 +87,7 @@ int Idiom7::action()
|
||||
rhs = COND_EXPR::idKte (0, 2);
|
||||
m_icode->setAsgn(lhs, rhs);
|
||||
m_icode->du.use = 0; /* clear register used in iXOR */
|
||||
m_icode->ic.ll.flg |= I;
|
||||
m_icode->ll()->SetLlFlag(I);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -113,11 +113,11 @@ bool Idiom10::match(iICODE pIcode)
|
||||
m_icodes[0]=pIcode++;
|
||||
m_icodes[1]=pIcode++;
|
||||
/* Check OR reg, reg */
|
||||
if (not m_icodes[0]->isLlFlag(I) &&
|
||||
(m_icodes[0]->ic.ll.src.regi > 0) &&
|
||||
(m_icodes[0]->ic.ll.src.regi < INDEXBASE) &&
|
||||
(m_icodes[0]->ic.ll.src.regi == m_icodes[0]->ic.ll.dst.regi))
|
||||
if (m_icodes[1]->ic.ll.match(iJNE)) //.conditionalJump()
|
||||
if (not m_icodes[0]->ll()->isLlFlag(I) &&
|
||||
(m_icodes[0]->ll()->src.regi > 0) &&
|
||||
(m_icodes[0]->ll()->src.regi < INDEXBASE) &&
|
||||
(m_icodes[0]->ll()->src.regi == m_icodes[0]->ll()->dst.regi))
|
||||
if (m_icodes[1]->ll()->match(iJNE)) //.conditionalJump()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@@ -126,9 +126,9 @@ bool Idiom10::match(iICODE pIcode)
|
||||
|
||||
int Idiom10::action()
|
||||
{
|
||||
m_icodes[0]->ic.ll.opcode = iCMP;
|
||||
m_icodes[0]->ic.ll.flg |= I;
|
||||
m_icodes[0]->ic.ll.src.SetImmediateOp(0); // todo check if proc should be zeroed too
|
||||
m_icodes[0]->ll()->opcode = iCMP;
|
||||
m_icodes[0]->ll()->SetLlFlag(I);
|
||||
m_icodes[0]->ll()->src.SetImmediateOp(0); // todo check if proc should be zeroed too
|
||||
m_icodes[0]->du.def = 0;
|
||||
m_icodes[0]->du1.numRegsDef = 0;
|
||||
return 2;
|
||||
|
||||
Reference in New Issue
Block a user