@@ -3757,22 +3757,6 @@ Lowerer::GenerateProfiledNewScArrayFastPath(IR::Instr *instr, Js::ArrayCallSiteI
3757
3757
IR::RegOpnd *headOpnd;
3758
3758
uint32 i = length;
3759
3759
3760
- auto fillMissingItems = [&](IRType type, uint missingItemCount, uint offsetStart, uint itemSpacing)
3761
- {
3762
- IR::Opnd * missingItemOpnd = GetMissingItemOpnd(type, func);
3763
- #if _M_ARM32_OR_ARM64
3764
- IR::Instr * move = this->InsertMove(IR::RegOpnd::New(type, instr->m_func), missingItemOpnd, instr);
3765
- missingItemOpnd = move->GetDst();
3766
- #endif
3767
- const IR::AutoReuseOpnd autoReuseHeadOpnd(headOpnd, func);
3768
- const IR::AutoReuseOpnd autoReuseMissingItemOpnd(missingItemOpnd, func);
3769
-
3770
- for (; i < missingItemCount; i++)
3771
- {
3772
- GenerateMemInit(headOpnd, offsetStart + i * itemSpacing, missingItemOpnd, instr, isZeroed);
3773
- }
3774
- };
3775
-
3776
3760
if (instr->GetDst() && instr->GetDst()->GetValueType().IsLikelyNativeIntArray())
3777
3761
{
3778
3762
if (!IsSmallObject<Js::JavascriptNativeIntArray>(length))
@@ -3782,10 +3766,14 @@ Lowerer::GenerateProfiledNewScArrayFastPath(IR::Instr *instr, Js::ArrayCallSiteI
3782
3766
GenerateArrayInfoIsNativeIntArrayTest(instr, arrayInfo, arrayInfoAddr, helperLabel);
3783
3767
Assert(Js::JavascriptNativeIntArray::GetOffsetOfArrayFlags() + sizeof(uint16) == Js::JavascriptNativeIntArray::GetOffsetOfArrayCallSiteIndex());
3784
3768
headOpnd = GenerateArrayLiteralsAlloc<Js::JavascriptNativeIntArray>(instr, &size, arrayInfo, &isZeroed);
3769
+ const IR::AutoReuseOpnd autoReuseHeadOpnd(headOpnd, func);
3785
3770
3786
3771
GenerateMemInit(dstOpnd, Js::JavascriptNativeIntArray::GetOffsetOfWeakFuncRef(), IR::AddrOpnd::New(weakFuncRef, IR::AddrOpndKindDynamicFunctionBodyWeakRef, m_func), instr, isZeroed);
3787
-
3788
- fillMissingItems(TyInt32, size, sizeof(Js::SparseArraySegmentBase), sizeof(int32));
3772
+ for (; i < size; i++)
3773
+ {
3774
+ GenerateMemInit(headOpnd, sizeof(Js::SparseArraySegmentBase) + i * sizeof(int32),
3775
+ Js::JavascriptNativeIntArray::MissingItem, instr, isZeroed);
3776
+ }
3789
3777
}
3790
3778
else if (instr->GetDst() && instr->GetDst()->GetValueType().IsLikelyNativeFloatArray())
3791
3779
{
@@ -3796,24 +3784,35 @@ Lowerer::GenerateProfiledNewScArrayFastPath(IR::Instr *instr, Js::ArrayCallSiteI
3796
3784
GenerateArrayInfoIsNativeFloatAndNotIntArrayTest(instr, arrayInfo, arrayInfoAddr, helperLabel);
3797
3785
Assert(Js::JavascriptNativeFloatArray::GetOffsetOfArrayFlags() + sizeof(uint16) == Js::JavascriptNativeFloatArray::GetOffsetOfArrayCallSiteIndex());
3798
3786
headOpnd = GenerateArrayLiteralsAlloc<Js::JavascriptNativeFloatArray>(instr, &size, arrayInfo, &isZeroed);
3787
+ const IR::AutoReuseOpnd autoReuseHeadOpnd(headOpnd, func);
3799
3788
3800
3789
GenerateMemInit(dstOpnd, Js::JavascriptNativeFloatArray::GetOffsetOfWeakFuncRef(), IR::AddrOpnd::New(weakFuncRef, IR::AddrOpndKindDynamicFunctionBodyWeakRef, m_func), instr, isZeroed);
3801
-
3790
+ // Js::JavascriptArray::MissingItem is a Var, so it may be 32-bit or 64 bit.
3802
3791
uint const offsetStart = sizeof(Js::SparseArraySegmentBase);
3803
- uint const missingItemCount = size * sizeof(double) / sizeof(Js::JavascriptArray::MissingItem);
3804
- i = i * sizeof(double) / sizeof(Js::JavascriptArray::MissingItem);
3805
-
3806
- fillMissingItems(TyVar, missingItemCount, offsetStart, sizeof(Js::JavascriptArray::MissingItem));
3792
+ for (; i < size; i++)
3793
+ {
3794
+ GenerateMemInit(
3795
+ headOpnd, offsetStart + i * sizeof(double),
3796
+ GetMissingItemOpndForAssignment(TyFloat64, m_func),
3797
+ instr, isZeroed);
3798
+ }
3807
3799
}
3808
3800
else
3809
3801
{
3810
3802
if (!IsSmallObject<Js::JavascriptArray>(length))
3811
3803
{
3812
3804
return false;
3813
3805
}
3814
-
3806
+ uint const offsetStart = sizeof(Js::SparseArraySegmentBase);
3815
3807
headOpnd = GenerateArrayLiteralsAlloc<Js::JavascriptArray>(instr, &size, arrayInfo, &isZeroed);
3816
- fillMissingItems(TyVar, size, sizeof(Js::SparseArraySegmentBase), sizeof(Js::Var));
3808
+ const IR::AutoReuseOpnd autoReuseHeadOpnd(headOpnd, func);
3809
+ for (; i < size; i++)
3810
+ {
3811
+ GenerateMemInit(
3812
+ headOpnd, offsetStart + i * sizeof(Js::Var),
3813
+ GetMissingItemOpndForAssignment(TyVar, m_func),
3814
+ instr, isZeroed);
3815
+ }
3817
3816
}
3818
3817
3819
3818
// Skip pass the helper call
@@ -4134,12 +4133,11 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
4134
4133
4135
4134
// Js::JavascriptArray::MissingItem is a Var, so it may be 32-bit or 64 bit.
4136
4135
uint const offsetStart = sizeof(Js::SparseArraySegmentBase);
4137
- uint const missingItemCount = size * sizeof(double) / sizeof(Js::JavascriptArray::MissingItem);
4138
- for (uint i = 0; i < missingItemCount; i++)
4136
+ for (uint i = 0; i < size; i++)
4139
4137
{
4140
4138
GenerateMemInit(
4141
- headOpnd, offsetStart + i * sizeof(Js::JavascriptArray::MissingItem ),
4142
- IR::AddrOpnd::New(Js::JavascriptArray::MissingItem, IR::AddrOpndKindConstantAddress, m_func, true ),
4139
+ headOpnd, offsetStart + i * sizeof(double ),
4140
+ GetMissingItemOpndForAssignment(TyFloat64, m_func),
4143
4141
instr, isZeroed);
4144
4142
}
4145
4143
}
@@ -4149,9 +4147,9 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
4149
4147
headOpnd = GenerateArrayObjectsAlloc<Js::JavascriptArray>(instr, &size, arrayInfo, &isZeroed, isNoArgs);
4150
4148
for (uint i = 0; i < size; i++)
4151
4149
{
4152
- GenerateMemInit(
4150
+ GenerateMemInit(
4153
4151
headOpnd, offsetStart + i * sizeof(Js::Var),
4154
- IR::AddrOpnd::New(Js::JavascriptArray::MissingItem, IR::AddrOpndKindConstantAddress, m_func, true ),
4152
+ GetMissingItemOpndForAssignment(TyVar, m_func),
4155
4153
instr, isZeroed);
4156
4154
}
4157
4155
}
@@ -4182,8 +4180,8 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
4182
4180
uint allocationBucketsCount = ArrayType::AllocationBucketsCount;
4183
4181
uint(*allocationBuckets)[Js::JavascriptArray::AllocationBucketsInfoSize];
4184
4182
allocationBuckets = ArrayType::allocationBuckets;
4185
- uint sizeFactor = 1;
4186
- IRType missingItemType = (arrayInfo && arrayInfo->IsNativeIntArray()) ? IRType::TyInt32 : IRType::TyVar;
4183
+
4184
+ IRType missingItemType = (arrayInfo ? arrayInfo->IsNativeIntArray() ? IRType::TyInt32 : arrayInfo->IsNativeFloatArray() ? IRType::TyFloat64 : IRType:: TyVar : IRType::TyVar) ;
4187
4185
IR::LabelInstr * arrayInitDone = IR::LabelInstr::New(Js::OpCode::Label, func);
4188
4186
4189
4187
bool isNativeArray = arrayInfo && (arrayInfo->IsNativeIntArray() || arrayInfo->IsNativeFloatArray());
@@ -4195,9 +4193,7 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
4195
4193
}
4196
4194
else if (arrayInfo && arrayInfo->IsNativeFloatArray())
4197
4195
{
4198
- // Js::JavascriptArray::MissingItem is a Var, so it may be 32-bit or 64 bit.
4199
- sizeFactor = sizeof(double) / sizeof(Js::JavascriptArray::MissingItem);
4200
- sizeOfElement = sizeof(Js::JavascriptArray::MissingItem);
4196
+ sizeOfElement = sizeof(double);
4201
4197
GenerateArrayInfoIsNativeFloatAndNotIntArrayTest(instr, arrayInfo, arrayInfoAddr, helperLabel);
4202
4198
}
4203
4199
else
@@ -4227,7 +4223,7 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
4227
4223
4228
4224
for (uint8 i = 0;i < allocationBucketsCount;i++)
4229
4225
{
4230
- missingItemCount = allocationBuckets[i][Js::JavascriptArray::MissingElementsCountIndex] * sizeFactor ;
4226
+ missingItemCount = allocationBuckets[i][Js::JavascriptArray::MissingElementsCountIndex];
4231
4227
4232
4228
if (i > 0)
4233
4229
{
@@ -4258,7 +4254,7 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
4258
4254
// Ensure no. of missingItems written are same
4259
4255
Assert(missingItemIndex == missingItemInitializedSoFar);
4260
4256
// Ensure no. of missingItems match what present in allocationBuckets
4261
- Assert(missingItemIndex == allocationBuckets[allocationBucketsCount - 1][Js::JavascriptArray::MissingElementsCountIndex] * sizeFactor );
4257
+ Assert(missingItemIndex == allocationBuckets[allocationBucketsCount - 1][Js::JavascriptArray::MissingElementsCountIndex]);
4262
4258
4263
4259
instr->InsertBefore(arrayInitDone);
4264
4260
@@ -4386,11 +4382,11 @@ Lowerer::GenerateProfiledNewScFloatArrayFastPath(IR::Instr *instr, Js::ArrayCall
4386
4382
4387
4383
// Js::JavascriptArray::MissingItem is a Var, so it may be 32-bit or 64 bit.
4388
4384
uint const offsetStart = sizeof(Js::SparseArraySegmentBase) + doubles->count * sizeof(double);
4389
- uint const missingItem = (size - doubles->count) * sizeof(double) / sizeof(Js::JavascriptArray::MissingItem) ;
4385
+ uint const missingItem = (size - doubles->count);
4390
4386
for (uint i = 0; i < missingItem; i++)
4391
4387
{
4392
- GenerateMemInit(headOpnd, offsetStart + i * sizeof(Js::JavascriptArray::MissingItem ),
4393
- IR::AddrOpnd::New(Js::JavascriptArray::MissingItem, IR::AddrOpndKindConstantAddress, m_func, true ), instr, isHeadSegmentZeroed);
4388
+ GenerateMemInit(headOpnd, offsetStart + i * sizeof(double ),
4389
+ GetMissingItemOpndForAssignment(TyFloat64, m_func), instr, isHeadSegmentZeroed);
4394
4390
}
4395
4391
// Skip pass the helper call
4396
4392
IR::LabelInstr * doneLabel = IR::LabelInstr::New(Js::OpCode::Label, func);
0 commit comments