@@ -4207,7 +4207,7 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
42074207 {
42084208 // Ensure we don't write missingItems past allocation size
42094209 Assert(offsetStart + missingItemIndex * sizeOfElement <= maxAllocationSize);
4210- GenerateMemInit(headOpnd, offsetStart + missingItemIndex * sizeOfElement, GetMissingItemOpnd (missingItemType, func), instr, true /*isZeroed*/);
4210+ GenerateMemInit(headOpnd, offsetStart + missingItemIndex * sizeOfElement, GetMissingItemOpndForAssignment (missingItemType, func), instr, true /*isZeroed*/);
42114211 missingItemIndex++;
42124212 }
42134213
@@ -10802,7 +10802,7 @@ Lowerer::LowerStElemC(IR::Instr * stElem)
1080210802 IR::Opnd* missingElementOpnd = GetMissingItemOpnd(stElem->GetSrc1()->GetType(), m_func);
1080310803 if (!stElem->GetSrc1()->IsEqual(missingElementOpnd))
1080410804 {
10805- InsertCompareBranch (stElem->GetSrc1(), missingElementOpnd , Js::OpCode::BrEq_A, labelBailOut, stElem, true );
10805+ InsertMissingItemCompareBranch (stElem->GetSrc1(), Js::OpCode::BrEq_A, labelBailOut, stElem);
1080610806 }
1080710807 else
1080810808 {
@@ -11858,7 +11858,7 @@ Lowerer::GenerateHelperToArrayPopFastPath(IR::Instr * instr, IR::LabelInstr * do
1185811858 if(retInstr->GetDst())
1185911859 {
1186011860 //Do this check only for native arrays with Dst. For Var arrays, this is taken care in the Runtime helper itself.
11861- InsertCompareBranch(GetMissingItemOpnd(retInstr->GetDst()->GetType(), m_func), retInstr->GetDst(), Js::OpCode::BrNeq_A, doneLabel, bailOutLabelHelper);
11861+ InsertMissingItemCompareBranch( retInstr->GetDst(), Js::OpCode::BrNeq_A, doneLabel, bailOutLabelHelper);
1186211862 }
1186311863 else
1186411864 {
@@ -16459,13 +16459,11 @@ Lowerer::GenerateFastElemIIntIndexCommon(
1645916459 Assert(instr->m_opcode != Js::OpCode::InlineArrayPush || bailOutLabelInstr);
1646016460
1646116461 // Check for a write of the MissingItem value.
16462- InsertCompareBranch (
16462+ InsertMissingItemCompareBranch (
1646316463 element,
16464- GetMissingItemOpnd(elementType, m_func),
1646516464 Js::OpCode::BrEq_A,
1646616465 instr->m_opcode == Js::OpCode::InlineArrayPush ? bailOutLabelInstr : labelCantUseArray,
16467- instr,
16468- true);
16466+ instr);
1646916467 }
1647016468
1647116469 if(!headSegmentOpnd)
@@ -16985,17 +16983,15 @@ Lowerer::GenerateFastElemIIntIndexCommon(
1698516983 //If the array has missing values, check for one
1698616984 if (!baseValueType.HasNoMissingValues())
1698716985 {
16988- InsertCompareBranch (
16986+ InsertMissingItemCompareBranch (
1698916987 dst,
16990- GetMissingItemOpnd(indirType, m_func),
1699116988 Js::OpCode::BrEq_A,
1699216989 bailOutLabelInstr,
16993- instr,
16994- true);
16990+ instr);
1699516991 }
1699616992 }
1699716993 // MOV [head + offset], missing
16998- InsertMove(indirOpnd, GetMissingItemOpnd (indirType, m_func), instr);
16994+ InsertMove(indirOpnd, GetMissingItemOpndForAssignment (indirType, m_func), instr);
1699916995
1700016996 IR::Opnd *newLengthOpnd;
1700116997 IR::AutoReuseOpnd autoReuseNewLengthOpnd;
@@ -17276,6 +17272,22 @@ Lowerer::GenerateFastElemIIntIndexCommon(
1727617272 return indirOpnd;
1727717273}
1727817274
17275+ IR::BranchInstr*
17276+ Lowerer::InsertMissingItemCompareBranch(IR::Opnd* compareSrc, Js::OpCode opcode, IR::LabelInstr* target, IR::Instr* insertBeforeInstr)
17277+ {
17278+ IR::Opnd* missingItemOpnd = GetMissingItemOpndForCompare(compareSrc->GetType(), m_func);
17279+ if (compareSrc->IsFloat64())
17280+ {
17281+ Assert(compareSrc->IsRegOpnd() || compareSrc->IsIndirOpnd());
17282+ return m_lowererMD.InsertMissingItemCompareBranch(compareSrc, missingItemOpnd, opcode, target, insertBeforeInstr);
17283+ }
17284+ else
17285+ {
17286+ Assert(compareSrc->IsInt32() || compareSrc->IsVar());
17287+ return InsertCompareBranch(missingItemOpnd, compareSrc, opcode, target, insertBeforeInstr, true);
17288+ }
17289+ }
17290+
1727917291IR::RegOpnd *
1728017292Lowerer::GenerateUntagVar(IR::RegOpnd * opnd, IR::LabelInstr * labelFail, IR::Instr * insertBeforeInstr, bool generateTagCheck)
1728117293{
@@ -17836,13 +17848,11 @@ Lowerer::GenerateFastLdElemI(IR::Instr *& ldElem, bool *instrIsInHelperBlockRef)
1783617848 {
1783717849 // TEST dst, dst
1783817850 // JEQ $helper | JNE $fallthrough
17839- InsertCompareBranch (
17851+ InsertMissingItemCompareBranch (
1784017852 dst,
17841- GetMissingItemOpnd(dst->GetType(), m_func),
1784217853 needObjectTest ? Js::OpCode::BrEq_A : Js::OpCode::BrNeq_A,
1784317854 needObjectTest ? labelHelper : labelFallThru,
17844- ldElem,
17845- true);
17855+ ldElem);
1784617856
1784717857 if (isNativeArrayLoad)
1784817858 {
@@ -17928,7 +17938,7 @@ Lowerer::GenerateFastLdElemI(IR::Instr *& ldElem, bool *instrIsInHelperBlockRef)
1792817938 labelMissingNative = IR::LabelInstr::New(Js::OpCode::Label, m_func, true);
1792917939 }
1793017940
17931- InsertCompareBranch(GetMissingItemOpnd( ldElem->GetDst()->GetType(), m_func), ldElem->GetDst(), Js::OpCode::BrEq_A, labelMissingNative, insertBeforeInstr, true );
17941+ InsertMissingItemCompareBranch( ldElem->GetDst(), Js::OpCode::BrEq_A, labelMissingNative, insertBeforeInstr);
1793217942 }
1793317943 InsertBranch(Js::OpCode::Br, labelFallThru, insertBeforeInstr);
1793417944 if(labelMissingNative)
@@ -17960,7 +17970,7 @@ Lowerer::GenerateFastLdElemI(IR::Instr *& ldElem, bool *instrIsInHelperBlockRef)
1796017970 {
1796117971 if(!emitBailout)
1796217972 {
17963- InsertCompareBranch(GetMissingItemOpnd( ldElem->GetDst()->GetType(), m_func), ldElem->GetDst(), Js::OpCode::BrEq_A, labelBailOut, insertBeforeInstr, true );
17973+ InsertMissingItemCompareBranch( ldElem->GetDst(), Js::OpCode::BrEq_A, labelBailOut, insertBeforeInstr);
1796417974 }
1796517975
1796617976 InsertBranch(Js::OpCode::Br, labelFallThru, insertBeforeInstr);
@@ -17990,8 +18000,48 @@ Lowerer::GetMissingItemOpnd(IRType type, Func *func)
1799018000 {
1799118001 return IR::IntConstOpnd::New(Js::JavascriptNativeIntArray::MissingItem, TyInt32, func, true);
1799218002 }
17993- Assert(type == TyFloat64);
17994- return IR::MemRefOpnd::New(func->GetThreadContextInfo()->GetNativeFloatArrayMissingItemAddr(), TyFloat64, func);
18003+ AssertMsg(false, "Only expecting TyVar and TyInt32 in Lowerer::GetMissingItemOpnd");
18004+ __assume(false);
18005+ }
18006+
18007+ IR::Opnd*
18008+ Lowerer::GetMissingItemOpndForAssignment(IRType type, Func *func)
18009+ {
18010+ switch (type)
18011+ {
18012+ case TyVar:
18013+ case TyInt32:
18014+ return GetMissingItemOpnd(type, func);
18015+
18016+ case TyFloat64:
18017+ return IR::MemRefOpnd::New(func->GetThreadContextInfo()->GetNativeFloatArrayMissingItemAddr(), TyFloat64, func);
18018+
18019+ default:
18020+ AnalysisAssertMsg(false, "Unexpected type in Lowerer::GetMissingItemOpndForAssignment");
18021+ __assume(false);
18022+ }
18023+ }
18024+
18025+ IR::Opnd *
18026+ Lowerer::GetMissingItemOpndForCompare(IRType type, Func *func)
18027+ {
18028+ switch (type)
18029+ {
18030+ case TyVar:
18031+ case TyInt32:
18032+ return GetMissingItemOpnd(type, func);
18033+
18034+ case TyFloat64:
18035+ #if TARGET_64
18036+ return IR::MemRefOpnd::New(func->GetThreadContextInfo()->GetNativeFloatArrayMissingItemAddr(), TyUint64, func);
18037+ #else
18038+ return IR::MemRefOpnd::New(func->GetThreadContextInfo()->GetNativeFloatArrayMissingItemAddr(), TyUint32, func);
18039+ #endif
18040+
18041+ default:
18042+ AnalysisAssertMsg(false, "Unexpected type in Lowerer::GetMissingItemOpndForCompare");
18043+ __assume(false);
18044+ }
1799518045}
1799618046
1799718047bool
@@ -18631,13 +18681,11 @@ Lowerer::GenerateFastStElemI(IR::Instr *& stElem, bool *instrIsInHelperBlockRef)
1863118681 //
1863218682 // cmp [segment + index], Js::SparseArraySegment::MissingValue
1863318683 // je $helper
18634- InsertCompareBranch (
18684+ InsertMissingItemCompareBranch (
1863518685 indirOpnd,
18636- GetMissingItemOpnd(src->GetType(), m_func),
1863718686 Js::OpCode::BrEq_A,
1863818687 labelHelper,
18639- stElem,
18640- true);
18688+ stElem);
1864118689 }
1864218690 else
1864318691 {
@@ -28023,6 +28071,13 @@ Lowerer::AddBailoutToHelperCallInstr(IR::Instr * helperCallInstr, BailOutInfo *
2802328071 return helperCallInstr;
2802428072}
2802528073
28074+ void
28075+ Lowerer::InsertAndLegalize(IR::Instr * instr, IR::Instr* insertBeforeInstr)
28076+ {
28077+ insertBeforeInstr->InsertBefore(instr);
28078+ LowererMD::Legalize(instr);
28079+ }
28080+
2802628081#if DBG
2802728082void
2802828083Lowerer::LegalizeVerifyRange(IR::Instr * instrStart, IR::Instr * instrLast)
0 commit comments