blob: e150be3025030b3f60e2bad815440525bc42f6e0 [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#include "Backend.h"
// PeepsMD::Init
void
PeepsMD::Init(Peeps *peeps)
{
this->peeps = peeps;
}
// PeepsMD::ProcessImplicitRegs
// Note: only do calls for now
void
PeepsMD::ProcessImplicitRegs(IR::Instr *instr)
{
if (LowererMD::IsCall(instr))
{
#define REGDAT(Name, Listing, Encode, Type, BitVec) \
if (!((BitVec) & (RA_CALLEESAVE | RA_DONTALLOCATE))) \
{ \
this->peeps->ClearReg(Reg ## Name); \
}
#include "RegList.h"
}
else if (instr->m_opcode == Js::OpCode::IMUL)
{
this->peeps->ClearReg(RegRDX);
}
else if (instr->m_opcode == Js::OpCode::IDIV)
{
if (instr->GetDst()->AsRegOpnd()->GetReg() == RegRDX)
{
this->peeps->ClearReg(RegRAX);
}
else
{
Assert(instr->GetDst()->AsRegOpnd()->GetReg() == RegRAX);
this->peeps->ClearReg(RegRDX);
}
}
}
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);
src->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)
&& src->IsRegOpnd()
&& dst->IsRegOpnd()
&& (TySize[src->GetType()] == TySize[dst->GetType()]))
|| ((instr->m_opcode == Js::OpCode::MOVUPS)
&& src->IsRegOpnd()
&& dst->IsRegOpnd())
|| (instr->m_opcode == Js::OpCode::MOVAPD))
{
// MOVAPS has 1 byte shorter encoding
instr->m_opcode = Js::OpCode::MOVAPS;
}
else if (instr->m_opcode == Js::OpCode::MOVSD_ZERO)
{
instr->m_opcode = Js::OpCode::XORPS;
instr->SetSrc1(dst);
instr->SetSrc2(dst);
}
}