void psMovementManager::HandleMessage(MsgEntry* me)
{
    switch ( me->GetType() )
    {
        case MSGTYPE_MOVEINFO:  // Initial info about modes and moves
        {
            if (ready)
            {
                Bug1("Received second set of movement info!");
                return;
            }
            psMovementInfoMessage movemsg(me);
            SetupMovements(movemsg);
            return;
        }

        case MSGTYPE_MOVELOCK:  // Movement lockout started
        {
            // The server will override any attempts to move during a lockout.
            // The client should lockout controls too, until the server says otherwise.
            psMoveLockMessage lockmsg(me);
            LockMoves(lockmsg.locked);
            return;
        }

        case MSGTYPE_MOVEMOD:  // Movement modifier
        {
            psMoveModMsg modmsg(me);
            HandleMod(modmsg);
            return;
        }
    }
}
Esempio n. 2
0
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Operand* Peephole::Simplify(Instruction* instr) {
	// Set the insertion point for new instructions; all new instructions
	// after the current one, in the order they are created.
	irGen_.SetInsertionPoint(instr);

    switch(instr->GetOpcode()) {
        case Instr_Add: {
            return PreserveUSO(instr, HandleAdd(instr->GetSourceOp(0), 
                                                instr->GetSourceOp(1),
                                                instr->ParentBlock()));
        }
        case Instr_Sub: {
            return PreserveUSO(instr, HandleSub(instr->GetSourceOp(0),
                                                instr->GetSourceOp(1),
                                                instr->ParentBlock()));
        }
        case Instr_Mul: {
            return PreserveUSO(instr, HandleMul(instr->GetSourceOp(0), 
                               instr->GetSourceOp(1), instr->ParentBlock()));
        }
        case Instr_Div: {
            auto arithInstr = instr->As<ArithmeticInstr>();
            return PreserveUSO(instr, HandleDiv(arithInstr->LeftOp(),
                                                arithInstr->RightOp(),
                                                instr->ParentBlock(),
                                                arithInstr->HasNoRemainder()));
        }
        case Instr_Udiv: {
            return PreserveUSO(instr, HandleUdiv(instr->GetSourceOp(0),
                                                 instr->GetSourceOp(1),
                                                 instr->ParentBlock()));
        }
        case Instr_Mod:  {
            return PreserveUSO(instr, HandleMod(instr->GetSourceOp(0),
                                                instr->GetSourceOp(1),
                                                instr->ParentBlock()));
        }
        case Instr_Umod: {
            return PreserveUSO(instr, HandleUmod(instr->GetSourceOp(0),
                                                 instr->GetSourceOp(1),
                                                 instr->ParentBlock()));
        }
        case Instr_Fadd: {
            auto arithInstr = instr->As<ArithmeticInstr>();
            return HandleFadd(arithInstr->LeftOp(), 
                              arithInstr->RightOp(),
                              arithInstr->GetFPMode());
        }
        case Instr_Fsub: {
            auto arithInstr = instr->As<ArithmeticInstr>();
            return HandleFsub(arithInstr->LeftOp(), 
                              arithInstr->RightOp(),
                              arithInstr->GetFPMode());
        }
        case Instr_Fmul: {
            auto arithInstr = instr->As<ArithmeticInstr>();
            return HandleFmul(arithInstr->LeftOp(), 
                              arithInstr->RightOp(),
                              arithInstr->GetFPMode());
        }
        case Instr_Fdiv: {
            auto arithInstr = instr->As<ArithmeticInstr>();
            return HandleFdiv(arithInstr->LeftOp(), 
                              arithInstr->RightOp(),
                              arithInstr->GetFPMode());
        }

        case Instr_And:  return HandleAnd(instr->GetSourceOp(0), 
                                          instr->GetSourceOp(1),
                                          instr->ParentBlock());
        case Instr_Or:   return HandleOr(instr->GetSourceOp(0), 
                                         instr->GetSourceOp(1),
                                         instr->ParentBlock());
        case Instr_Xor:  return HandleXor(instr->GetSourceOp(0), 
                                          instr->GetSourceOp(1),
                                          instr->ParentBlock());
        case Instr_Shl:  return HandleShl(instr->As<ShlInstr>());
        case Instr_Shr:  return HandleShr(instr->As<ShrInstr>());
        case Instr_Ushr: return HandleUshr(instr->As<UshrInstr>());

        case Instr_Cmp:  return HandleCmp(instr->As<CmpInstr>());
        case Instr_Ucmp: return HandleUcmp(instr->As<UcmpInstr>());
        case Instr_Fcmp: return HandleFcmp(instr->As<FcmpInstr>());

        case Instr_Trunc:  return HandleTrunc(instr->As<TruncInstr>());
        case Instr_Sext:   return HandleSext(instr->As<SextInstr>());
        case Instr_Zext:   return HandleZext(instr->As<ZextInstr>());
        case Instr_Ftrunc: return HandleFtrunc(instr->As<FtruncInstr>());
        case Instr_Fext:   return HandleFext(instr->As<FextInstr>());
        case Instr_Ftoi:   return HandleFtoi(instr->As<FtoiInstr>());
        case Instr_Ftoui:  return HandleFtoui(instr->As<FtouiInstr>());
        case Instr_Itof:   return HandleItof(instr->As<ItofInstr>());
        case Instr_Itop:   return HandleItop(instr->As<ItopInstr>());
        case Instr_Ptoi:   return HandlePtoi(instr->As<PtoiInstr>());
        case Instr_Ptop:   return HandlePtop(instr->As<PtopInstr>());
        case Instr_Uitof:  return HandleUitof(instr->As<UitofInstr>());

        case Instr_Call:     return HandleCall(instr->As<CallInstr>());
        case Instr_Address:  return HandleAddress(instr->As<AddressInstr>());
        case Instr_Index:    return HandleIndex(instr->As<IndexInstr>());
        case Instr_Element:  return HandleElement(instr->As<ElementInstr>());
		case Instr_Load:     return HandleLoad(instr->As<LoadInstr>());
		case Instr_Store:    return HandleStore(instr->As<StoreInstr>());
        case Instr_Question: return HandleQuestion(instr->As<QuestionInstr>());
        case Instr_Phi:      return HandlePhi(instr->As<PhiInstr>());
    }

    // This is an instruction that is not supported.
    return nullptr;
}