@@ -3687,12 +3687,12 @@ BOOL Lowerer::IsSmallObject(uint32 length)
3687
3687
return HeapInfo::IsSmallObject(HeapInfo::GetAlignedSizeNoCheck(allocSize));
3688
3688
}
3689
3689
3690
- void
3690
+ bool
3691
3691
Lowerer::GenerateProfiledNewScArrayFastPath(IR::Instr *instr, Js::ArrayCallSiteInfo * arrayInfo, intptr_t arrayInfoAddr, intptr_t weakFuncRef, uint32 length)
3692
3692
{
3693
3693
if (PHASE_OFF(Js::ArrayCtorFastPathPhase, m_func) || CONFIG_FLAG(ForceES5Array))
3694
3694
{
3695
- return;
3695
+ return false ;
3696
3696
}
3697
3697
3698
3698
Func * func = this->m_func;
@@ -3707,7 +3707,7 @@ Lowerer::GenerateProfiledNewScArrayFastPath(IR::Instr *instr, Js::ArrayCallSiteI
3707
3707
{
3708
3708
if (!IsSmallObject<Js::JavascriptNativeIntArray>(length))
3709
3709
{
3710
- return;
3710
+ return false ;
3711
3711
}
3712
3712
GenerateArrayInfoIsNativeIntArrayTest(instr, arrayInfo, arrayInfoAddr, helperLabel);
3713
3713
Assert(Js::JavascriptNativeIntArray::GetOffsetOfArrayFlags() + sizeof(uint16) == Js::JavascriptNativeIntArray::GetOffsetOfArrayCallSiteIndex());
@@ -3725,7 +3725,7 @@ Lowerer::GenerateProfiledNewScArrayFastPath(IR::Instr *instr, Js::ArrayCallSiteI
3725
3725
{
3726
3726
if (!IsSmallObject<Js::JavascriptNativeFloatArray>(length))
3727
3727
{
3728
- return;
3728
+ return false ;
3729
3729
}
3730
3730
GenerateArrayInfoIsNativeFloatAndNotIntArrayTest(instr, arrayInfo, arrayInfoAddr, helperLabel);
3731
3731
Assert(Js::JavascriptNativeFloatArray::GetOffsetOfArrayFlags() + sizeof(uint16) == Js::JavascriptNativeFloatArray::GetOffsetOfArrayCallSiteIndex());
@@ -3749,7 +3749,7 @@ Lowerer::GenerateProfiledNewScArrayFastPath(IR::Instr *instr, Js::ArrayCallSiteI
3749
3749
{
3750
3750
if (!IsSmallObject<Js::JavascriptArray>(length))
3751
3751
{
3752
- return;
3752
+ return false ;
3753
3753
}
3754
3754
uint const offsetStart = sizeof(Js::SparseArraySegmentBase);
3755
3755
headOpnd = GenerateArrayLiteralsAlloc<Js::JavascriptArray>(instr, &size, arrayInfo, &isZeroed);
@@ -3769,6 +3769,7 @@ Lowerer::GenerateProfiledNewScArrayFastPath(IR::Instr *instr, Js::ArrayCallSiteI
3769
3769
instr->InsertBefore(helperLabel);
3770
3770
3771
3771
instr->InsertAfter(doneLabel);
3772
+ return true;
3772
3773
}
3773
3774
3774
3775
void
@@ -4030,12 +4031,12 @@ Lowerer::GenerateArrayAlloc(IR::Instr *instr, IR::Opnd * arrayLenOpnd, Js::Array
4030
4031
}
4031
4032
4032
4033
4033
- void
4034
+ bool
4034
4035
Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSiteInfo * arrayInfo, intptr_t arrayInfoAddr, intptr_t weakFuncRef, uint32 length, IR::LabelInstr* labelDone, bool isNoArgs)
4035
4036
{
4036
4037
if (PHASE_OFF(Js::ArrayCtorFastPathPhase, m_func))
4037
4038
{
4038
- return;
4039
+ return false ;
4039
4040
}
4040
4041
4041
4042
Func * func = this->m_func;
@@ -4095,17 +4096,18 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
4095
4096
// Skip pass the helper call
4096
4097
InsertBranch(Js::OpCode::Br, labelDone, instr);
4097
4098
instr->InsertBefore(helperLabel);
4099
+ return true;
4098
4100
}
4099
4101
4100
4102
4101
4103
template <typename ArrayType>
4102
- void
4104
+ bool
4103
4105
Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSiteInfo * arrayInfo, intptr_t arrayInfoAddr, intptr_t weakFuncRef, IR::LabelInstr* helperLabel,
4104
4106
IR::LabelInstr* labelDone, IR::Opnd* lengthOpnd, uint32 offsetOfCallSiteIndex, uint32 offsetOfWeakFuncRef)
4105
4107
{
4106
4108
if (PHASE_OFF(Js::ArrayCtorFastPathPhase, m_func))
4107
4109
{
4108
- return;
4110
+ return false ;
4109
4111
}
4110
4112
4111
4113
Func * func = this->m_func;
@@ -4199,6 +4201,7 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
4199
4201
4200
4202
Lowerer::InsertBranch(Js::OpCode::Br, labelDone, instr);
4201
4203
instr->InsertBefore(helperLabel);
4204
+ return true;
4202
4205
}
4203
4206
4204
4207
void
@@ -5271,26 +5274,29 @@ Lowerer::LowerNewScObjArray(IR::Instr *newObjInstr)
5271
5274
AssertMsg(linkSym->IsArgSlotSym(), "Not an argSlot symbol...");
5272
5275
linkOpnd = argInstr->GetSrc2();
5273
5276
5274
- bool emittedFastPath = true ;
5277
+ bool emittedFastPath = false ;
5275
5278
// 2a. If 1st parameter is a variable, emit fast path with checks
5276
5279
if (opndOfArrayCtor->IsRegOpnd())
5277
5280
{
5278
- // 3. GenerateFastPath
5279
- if (arrayInfo && arrayInfo->IsNativeIntArray())
5280
- {
5281
- GenerateProfiledNewScObjArrayFastPath<Js::JavascriptNativeIntArray>(newObjInstr, arrayInfo, arrayInfoAddr, weakFuncRef, helperLabel, labelDone, opndOfArrayCtor,
5282
- Js::JavascriptNativeIntArray::GetOffsetOfArrayCallSiteIndex(),
5283
- Js::JavascriptNativeIntArray::GetOffsetOfWeakFuncRef());
5284
- }
5285
- else if (arrayInfo && arrayInfo->IsNativeFloatArray())
5281
+ if (!opndOfArrayCtor->AsRegOpnd()->IsNotInt())
5286
5282
{
5287
- GenerateProfiledNewScObjArrayFastPath<Js::JavascriptNativeFloatArray>(newObjInstr, arrayInfo, arrayInfoAddr, weakFuncRef, helperLabel, labelDone, opndOfArrayCtor,
5288
- Js::JavascriptNativeFloatArray::GetOffsetOfArrayCallSiteIndex(),
5289
- Js::JavascriptNativeFloatArray::GetOffsetOfWeakFuncRef());
5290
- }
5291
- else
5292
- {
5293
- GenerateProfiledNewScObjArrayFastPath<Js::JavascriptArray>(newObjInstr, arrayInfo, arrayInfoAddr, weakFuncRef, helperLabel, labelDone, opndOfArrayCtor, 0, 0);
5283
+ // 3. GenerateFastPath
5284
+ if (arrayInfo && arrayInfo->IsNativeIntArray())
5285
+ {
5286
+ emittedFastPath = GenerateProfiledNewScObjArrayFastPath<Js::JavascriptNativeIntArray>(newObjInstr, arrayInfo, arrayInfoAddr, weakFuncRef, helperLabel, labelDone, opndOfArrayCtor,
5287
+ Js::JavascriptNativeIntArray::GetOffsetOfArrayCallSiteIndex(),
5288
+ Js::JavascriptNativeIntArray::GetOffsetOfWeakFuncRef());
5289
+ }
5290
+ else if (arrayInfo && arrayInfo->IsNativeFloatArray())
5291
+ {
5292
+ emittedFastPath = GenerateProfiledNewScObjArrayFastPath<Js::JavascriptNativeFloatArray>(newObjInstr, arrayInfo, arrayInfoAddr, weakFuncRef, helperLabel, labelDone, opndOfArrayCtor,
5293
+ Js::JavascriptNativeFloatArray::GetOffsetOfArrayCallSiteIndex(),
5294
+ Js::JavascriptNativeFloatArray::GetOffsetOfWeakFuncRef());
5295
+ }
5296
+ else
5297
+ {
5298
+ emittedFastPath = GenerateProfiledNewScObjArrayFastPath<Js::JavascriptArray>(newObjInstr, arrayInfo, arrayInfoAddr, weakFuncRef, helperLabel, labelDone, opndOfArrayCtor, 0, 0);
5299
+ }
5294
5300
}
5295
5301
}
5296
5302
// 2b. If 1st parameter is a constant, it is in range 0 and upperBoundValue (inclusive)
@@ -5299,11 +5305,7 @@ Lowerer::LowerNewScObjArray(IR::Instr *newObjInstr)
5299
5305
int32 length = linkSym->GetIntConstValue();
5300
5306
if (length >= 0 && length <= upperBoundValue)
5301
5307
{
5302
- GenerateProfiledNewScObjArrayFastPath(newObjInstr, arrayInfo, arrayInfoAddr, weakFuncRef, (uint32)length, labelDone, false);
5303
- }
5304
- else
5305
- {
5306
- emittedFastPath = false;
5308
+ emittedFastPath = GenerateProfiledNewScObjArrayFastPath(newObjInstr, arrayInfo, arrayInfoAddr, weakFuncRef, (uint32)length, labelDone, false);
5307
5309
}
5308
5310
}
5309
5311
// Since we emitted fast path above, move the startCall/argOut instruction right before helper
0 commit comments