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