@@ -4207,7 +4207,7 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
4207
4207
{
4208
4208
// Ensure we don't write missingItems past allocation size
4209
4209
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*/);
4211
4211
missingItemIndex++;
4212
4212
}
4213
4213
@@ -10802,7 +10802,7 @@ Lowerer::LowerStElemC(IR::Instr * stElem)
10802
10802
IR::Opnd* missingElementOpnd = GetMissingItemOpnd(stElem->GetSrc1()->GetType(), m_func);
10803
10803
if (!stElem->GetSrc1()->IsEqual(missingElementOpnd))
10804
10804
{
10805
- InsertCompareBranch (stElem->GetSrc1(), missingElementOpnd , Js::OpCode::BrEq_A, labelBailOut, stElem, true );
10805
+ InsertMissingItemCompareBranch (stElem->GetSrc1(), Js::OpCode::BrEq_A, labelBailOut, stElem);
10806
10806
}
10807
10807
else
10808
10808
{
@@ -11858,7 +11858,7 @@ Lowerer::GenerateHelperToArrayPopFastPath(IR::Instr * instr, IR::LabelInstr * do
11858
11858
if(retInstr->GetDst())
11859
11859
{
11860
11860
//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);
11862
11862
}
11863
11863
else
11864
11864
{
@@ -16459,13 +16459,11 @@ Lowerer::GenerateFastElemIIntIndexCommon(
16459
16459
Assert(instr->m_opcode != Js::OpCode::InlineArrayPush || bailOutLabelInstr);
16460
16460
16461
16461
// Check for a write of the MissingItem value.
16462
- InsertCompareBranch (
16462
+ InsertMissingItemCompareBranch (
16463
16463
element,
16464
- GetMissingItemOpnd(elementType, m_func),
16465
16464
Js::OpCode::BrEq_A,
16466
16465
instr->m_opcode == Js::OpCode::InlineArrayPush ? bailOutLabelInstr : labelCantUseArray,
16467
- instr,
16468
- true);
16466
+ instr);
16469
16467
}
16470
16468
16471
16469
if(!headSegmentOpnd)
@@ -16985,17 +16983,15 @@ Lowerer::GenerateFastElemIIntIndexCommon(
16985
16983
//If the array has missing values, check for one
16986
16984
if (!baseValueType.HasNoMissingValues())
16987
16985
{
16988
- InsertCompareBranch (
16986
+ InsertMissingItemCompareBranch (
16989
16987
dst,
16990
- GetMissingItemOpnd(indirType, m_func),
16991
16988
Js::OpCode::BrEq_A,
16992
16989
bailOutLabelInstr,
16993
- instr,
16994
- true);
16990
+ instr);
16995
16991
}
16996
16992
}
16997
16993
// MOV [head + offset], missing
16998
- InsertMove(indirOpnd, GetMissingItemOpnd (indirType, m_func), instr);
16994
+ InsertMove(indirOpnd, GetMissingItemOpndForAssignment (indirType, m_func), instr);
16999
16995
17000
16996
IR::Opnd *newLengthOpnd;
17001
16997
IR::AutoReuseOpnd autoReuseNewLengthOpnd;
@@ -17276,6 +17272,22 @@ Lowerer::GenerateFastElemIIntIndexCommon(
17276
17272
return indirOpnd;
17277
17273
}
17278
17274
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
+
17279
17291
IR::RegOpnd *
17280
17292
Lowerer::GenerateUntagVar(IR::RegOpnd * opnd, IR::LabelInstr * labelFail, IR::Instr * insertBeforeInstr, bool generateTagCheck)
17281
17293
{
@@ -17836,13 +17848,11 @@ Lowerer::GenerateFastLdElemI(IR::Instr *& ldElem, bool *instrIsInHelperBlockRef)
17836
17848
{
17837
17849
// TEST dst, dst
17838
17850
// JEQ $helper | JNE $fallthrough
17839
- InsertCompareBranch (
17851
+ InsertMissingItemCompareBranch (
17840
17852
dst,
17841
- GetMissingItemOpnd(dst->GetType(), m_func),
17842
17853
needObjectTest ? Js::OpCode::BrEq_A : Js::OpCode::BrNeq_A,
17843
17854
needObjectTest ? labelHelper : labelFallThru,
17844
- ldElem,
17845
- true);
17855
+ ldElem);
17846
17856
17847
17857
if (isNativeArrayLoad)
17848
17858
{
@@ -17928,7 +17938,7 @@ Lowerer::GenerateFastLdElemI(IR::Instr *& ldElem, bool *instrIsInHelperBlockRef)
17928
17938
labelMissingNative = IR::LabelInstr::New(Js::OpCode::Label, m_func, true);
17929
17939
}
17930
17940
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);
17932
17942
}
17933
17943
InsertBranch(Js::OpCode::Br, labelFallThru, insertBeforeInstr);
17934
17944
if(labelMissingNative)
@@ -17960,7 +17970,7 @@ Lowerer::GenerateFastLdElemI(IR::Instr *& ldElem, bool *instrIsInHelperBlockRef)
17960
17970
{
17961
17971
if(!emitBailout)
17962
17972
{
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);
17964
17974
}
17965
17975
17966
17976
InsertBranch(Js::OpCode::Br, labelFallThru, insertBeforeInstr);
@@ -17990,8 +18000,48 @@ Lowerer::GetMissingItemOpnd(IRType type, Func *func)
17990
18000
{
17991
18001
return IR::IntConstOpnd::New(Js::JavascriptNativeIntArray::MissingItem, TyInt32, func, true);
17992
18002
}
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
+ }
17995
18045
}
17996
18046
17997
18047
bool
@@ -18631,13 +18681,11 @@ Lowerer::GenerateFastStElemI(IR::Instr *& stElem, bool *instrIsInHelperBlockRef)
18631
18681
//
18632
18682
// cmp [segment + index], Js::SparseArraySegment::MissingValue
18633
18683
// je $helper
18634
- InsertCompareBranch (
18684
+ InsertMissingItemCompareBranch (
18635
18685
indirOpnd,
18636
- GetMissingItemOpnd(src->GetType(), m_func),
18637
18686
Js::OpCode::BrEq_A,
18638
18687
labelHelper,
18639
- stElem,
18640
- true);
18688
+ stElem);
18641
18689
}
18642
18690
else
18643
18691
{
@@ -28023,6 +28071,13 @@ Lowerer::AddBailoutToHelperCallInstr(IR::Instr * helperCallInstr, BailOutInfo *
28023
28071
return helperCallInstr;
28024
28072
}
28025
28073
28074
+ void
28075
+ Lowerer::InsertAndLegalize(IR::Instr * instr, IR::Instr* insertBeforeInstr)
28076
+ {
28077
+ insertBeforeInstr->InsertBefore(instr);
28078
+ LowererMD::Legalize(instr);
28079
+ }
28080
+
28026
28081
#if DBG
28027
28082
void
28028
28083
Lowerer::LegalizeVerifyRange(IR::Instr * instrStart, IR::Instr * instrLast)
0 commit comments