Ejemplo n.º 1
0
//_________________________________________________________________________________________________
void Inst::setOpnd(U_32 index, Opnd * opnd)
{
    Opnd ** opnds = getOpnds();
    if (index < opndCount) {
        Constraint cc = opnds[index]->getConstraint(Opnd::ConstraintKind_Initial);
        opnds[index] = opnd;
        if(!hasKind(Kind_PseudoInst) 
            && (getOpndRoles()[index] & OpndRole_Explicit) 
            && cc != opnd->getConstraint(Opnd::ConstraintKind_Initial)
            && !Encoder::isOpndAllowed(opcodeGroup, getExplicitOpndIndexFromOpndRoles(getOpndRoles()[index]), opnd->getConstraint(Opnd::ConstraintKind_Initial), getForm()==Form_Extended, true)
            ) {

            BasicBlock * bb = getBasicBlock();

            //instruction must be inserted into a basic block to be modifiable.
            //it caused by necessity of reference to irManager for implicit operands
            //assigning (flags, for example)
            assert(bb);
            assignOpcodeGroup(&bb->getIRManager());
            assert(opcodeGroup);
        }

    } else{
        opnds[(index - opndCount) / 4]->setMemOpndSubOpnd((MemOpndSubOpndKind)((index - opndCount) & 3), opnd);
    }
    verify();
}