@@ -3765,13 +3765,11 @@ Lowerer::GenerateProfiledNewScArrayFastPath(IR::Instr *instr, Js::ArrayCallSiteI
37653765 GenerateMemInit(dstOpnd, Js::JavascriptNativeFloatArray::GetOffsetOfWeakFuncRef(), IR::AddrOpnd::New(weakFuncRef, IR::AddrOpndKindDynamicFunctionBodyWeakRef, m_func), instr, isZeroed);
37663766 // Js::JavascriptArray::MissingItem is a Var, so it may be 32-bit or 64 bit.
37673767 uint const offsetStart = sizeof(Js::SparseArraySegmentBase);
3768- uint const missingItemCount = size * sizeof(double) / sizeof(Js::JavascriptArray::MissingItem);
3769- i = i * sizeof(double) / sizeof(Js::JavascriptArray::MissingItem);
3770- for (; i < missingItemCount; i++)
3768+ for (; i < size; i++)
37713769 {
37723770 GenerateMemInit(
3773- headOpnd, offsetStart + i * sizeof(Js::JavascriptArray::MissingItem ),
3774- IR::AddrOpnd::New(Js::JavascriptArray::MissingItem, IR::AddrOpndKindConstantAddress, m_func, true ),
3771+ headOpnd, offsetStart + i * sizeof(double ),
3772+ GetMissingItemOpndForAssignment(TyFloat64, m_func),
37753773 instr, isZeroed);
37763774 }
37773775 }
@@ -3788,7 +3786,7 @@ Lowerer::GenerateProfiledNewScArrayFastPath(IR::Instr *instr, Js::ArrayCallSiteI
37883786 {
37893787 GenerateMemInit(
37903788 headOpnd, offsetStart + i * sizeof(Js::Var),
3791- IR::AddrOpnd::New(Js::JavascriptArray::MissingItem, IR::AddrOpndKindConstantAddress, m_func, true ),
3789+ GetMissingItemOpndForAssignment(TyVar, m_func),
37923790 instr, isZeroed);
37933791 }
37943792 }
@@ -4111,12 +4109,11 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
41114109
41124110 // Js::JavascriptArray::MissingItem is a Var, so it may be 32-bit or 64 bit.
41134111 uint const offsetStart = sizeof(Js::SparseArraySegmentBase);
4114- uint const missingItemCount = size * sizeof(double) / sizeof(Js::JavascriptArray::MissingItem);
4115- for (uint i = 0; i < missingItemCount; i++)
4112+ for (uint i = 0; i < size; i++)
41164113 {
41174114 GenerateMemInit(
4118- headOpnd, offsetStart + i * sizeof(Js::JavascriptArray::MissingItem ),
4119- IR::AddrOpnd::New(Js::JavascriptArray::MissingItem, IR::AddrOpndKindConstantAddress, m_func, true ),
4115+ headOpnd, offsetStart + i * sizeof(double ),
4116+ GetMissingItemOpndForAssignment(TyFloat64, m_func),
41204117 instr, isZeroed);
41214118 }
41224119 }
@@ -4126,9 +4123,9 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
41264123 headOpnd = GenerateArrayObjectsAlloc<Js::JavascriptArray>(instr, &size, arrayInfo, &isZeroed, isNoArgs);
41274124 for (uint i = 0; i < size; i++)
41284125 {
4129- GenerateMemInit(
4126+ GenerateMemInit(
41304127 headOpnd, offsetStart + i * sizeof(Js::Var),
4131- IR::AddrOpnd::New(Js::JavascriptArray::MissingItem, IR::AddrOpndKindConstantAddress, m_func, true ),
4128+ GetMissingItemOpndForAssignment(TyVar, m_func),
41324129 instr, isZeroed);
41334130 }
41344131 }
@@ -4159,8 +4156,8 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
41594156 uint allocationBucketsCount = ArrayType::AllocationBucketsCount;
41604157 uint(*allocationBuckets)[Js::JavascriptArray::AllocationBucketsInfoSize];
41614158 allocationBuckets = ArrayType::allocationBuckets;
4162- uint sizeFactor = 1;
4163- IRType missingItemType = (arrayInfo && arrayInfo->IsNativeIntArray()) ? IRType::TyInt32 : IRType::TyVar;
4159+
4160+ IRType missingItemType = (arrayInfo ? arrayInfo->IsNativeIntArray() ? IRType::TyInt32 : arrayInfo->IsNativeFloatArray() ? IRType::TyFloat64 : IRType:: TyVar : IRType::TyVar) ;
41644161 IR::LabelInstr * arrayInitDone = IR::LabelInstr::New(Js::OpCode::Label, func);
41654162
41664163 bool isNativeArray = arrayInfo && (arrayInfo->IsNativeIntArray() || arrayInfo->IsNativeFloatArray());
@@ -4172,9 +4169,7 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
41724169 }
41734170 else if (arrayInfo && arrayInfo->IsNativeFloatArray())
41744171 {
4175- // Js::JavascriptArray::MissingItem is a Var, so it may be 32-bit or 64 bit.
4176- sizeFactor = sizeof(double) / sizeof(Js::JavascriptArray::MissingItem);
4177- sizeOfElement = sizeof(Js::JavascriptArray::MissingItem);
4172+ sizeOfElement = sizeof(double);
41784173 GenerateArrayInfoIsNativeFloatAndNotIntArrayTest(instr, arrayInfo, arrayInfoAddr, helperLabel);
41794174 }
41804175 else
@@ -4204,7 +4199,7 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
42044199
42054200 for (uint8 i = 0;i < allocationBucketsCount;i++)
42064201 {
4207- missingItemCount = allocationBuckets[i][Js::JavascriptArray::MissingElementsCountIndex] * sizeFactor ;
4202+ missingItemCount = allocationBuckets[i][Js::JavascriptArray::MissingElementsCountIndex];
42084203
42094204 if (i > 0)
42104205 {
@@ -4235,7 +4230,7 @@ Lowerer::GenerateProfiledNewScObjArrayFastPath(IR::Instr *instr, Js::ArrayCallSi
42354230 // Ensure no. of missingItems written are same
42364231 Assert(missingItemIndex == missingItemInitializedSoFar);
42374232 // Ensure no. of missingItems match what present in allocationBuckets
4238- Assert(missingItemIndex == allocationBuckets[allocationBucketsCount - 1][Js::JavascriptArray::MissingElementsCountIndex] * sizeFactor );
4233+ Assert(missingItemIndex == allocationBuckets[allocationBucketsCount - 1][Js::JavascriptArray::MissingElementsCountIndex]);
42394234
42404235 instr->InsertBefore(arrayInitDone);
42414236
@@ -4363,11 +4358,11 @@ Lowerer::GenerateProfiledNewScFloatArrayFastPath(IR::Instr *instr, Js::ArrayCall
43634358
43644359 // Js::JavascriptArray::MissingItem is a Var, so it may be 32-bit or 64 bit.
43654360 uint const offsetStart = sizeof(Js::SparseArraySegmentBase) + doubles->count * sizeof(double);
4366- uint const missingItem = (size - doubles->count) * sizeof(double) / sizeof(Js::JavascriptArray::MissingItem) ;
4361+ uint const missingItem = (size - doubles->count);
43674362 for (uint i = 0; i < missingItem; i++)
43684363 {
4369- GenerateMemInit(headOpnd, offsetStart + i * sizeof(Js::JavascriptArray::MissingItem ),
4370- IR::AddrOpnd::New(Js::JavascriptArray::MissingItem, IR::AddrOpndKindConstantAddress, m_func, true ), instr, isHeadSegmentZeroed);
4364+ GenerateMemInit(headOpnd, offsetStart + i * sizeof(double ),
4365+ GetMissingItemOpndForAssignment(TyFloat64, m_func), instr, isHeadSegmentZeroed);
43714366 }
43724367 // Skip pass the helper call
43734368 IR::LabelInstr * doneLabel = IR::LabelInstr::New(Js::OpCode::Label, func);
0 commit comments