void StackSym::SetIsConst() { Assert(this->m_isSingleDef); Assert(this->m_instrDef); IR::Opnd * src = this->m_instrDef->GetSrc1(); Assert(src->IsImmediateOpnd() || src->IsFloatConstOpnd() || src->IsSimd128ConstOpnd()); if (src->IsIntConstOpnd()) { Assert(this->m_instrDef->m_opcode == Js::OpCode::Ld_I4 || this->m_instrDef->m_opcode == Js::OpCode::LdC_A_I4 || LowererMD::IsAssign(this->m_instrDef)); this->SetIsIntConst(src->AsIntConstOpnd()->GetValue()); } else if (src->IsFloatConstOpnd()) { Assert(this->m_instrDef->m_opcode == Js::OpCode::LdC_A_R8); this->SetIsFloatConst(); } else if (src->IsSimd128ConstOpnd()){ Assert(this->m_instrDef->m_opcode == Js::OpCode::Simd128_LdC); this->SetIsSimd128Const(); } else { Assert(this->m_instrDef->m_opcode == Js::OpCode::Ld_A || LowererMD::IsAssign(this->m_instrDef)); Assert(src->IsAddrOpnd()); IR::AddrOpnd * addrOpnd = src->AsAddrOpnd(); this->m_isConst = true; if (addrOpnd->IsVar()) { Js::Var var = addrOpnd->m_address; if (Js::TaggedInt::Is(var)) { this->m_isIntConst = true; this->m_isTaggableIntConst = true; } else if (var && Js::JavascriptNumber::Is(var) && Js::JavascriptNumber::IsInt32_NoChecks(var)) { this->m_isIntConst = true; } } } }
void PeepsMD::PeepAssign(IR::Instr *instr) { IR::Opnd* dst = instr->GetDst(); IR::Opnd* src = instr->GetSrc1(); if(dst->IsRegOpnd() && instr->m_opcode == Js::OpCode::MOV) { if (src->IsImmediateOpnd() && src->GetImmediateValue(instr->m_func) == 0) { Assert(instr->GetSrc2() == NULL); // 32-bit XOR has a smaller encoding if (TySize[dst->GetType()] == MachPtr) { dst->SetType(TyInt32); } instr->m_opcode = Js::OpCode::XOR; instr->ReplaceSrc1(dst); instr->SetSrc2(dst); } else if (!instr->isInlineeEntryInstr) { if(src->IsIntConstOpnd() && src->GetSize() <= TySize[TyUint32]) { dst->SetType(TyUint32); } else if(src->IsAddrOpnd() && (((size_t)src->AsAddrOpnd()->m_address >> 32) == 0 )) { instr->ReplaceSrc1(IR::IntConstOpnd::New(::Math::PointerCastToIntegral<UIntConstType>(src->AsAddrOpnd()->m_address), TyUint32, instr->m_func)); dst->SetType(TyUint32); } } } else if (((instr->m_opcode == Js::OpCode::MOVSD || instr->m_opcode == Js::OpCode::MOVSS)