Skip to content

Commit c76da44

Browse files
rajatdpleath
authored andcommitted
1 parent 334471b commit c76da44

File tree

6 files changed

+37
-24
lines changed

6 files changed

+37
-24
lines changed

lib/Backend/Lower.cpp

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

lib/Runtime/Library/JavascriptArray.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ using namespace Js;
2828
{ 8, 0, 0 }, // allocate space for 8 elements for array of length 6,7,8
2929
};
3030

31-
const Var JavascriptArray::MissingItem = (Var)FloatMissingItemPattern;
31+
const Var JavascriptArray::MissingItem = (Var)VarMissingItemPattern;
3232

3333
#if defined(TARGET_64)
3434
const Var JavascriptArray::IntMissingItemVar = (Var)(((uint64)IntMissingItemPattern << 32) | (uint32)IntMissingItemPattern);
@@ -2048,6 +2048,8 @@ using namespace Js;
20482048
{
20492049
((SparseArraySegment<Var>*)seg)->elements[i] = JavascriptNumber::ToVar(ival, scriptContext);
20502050
}
2051+
SparseArraySegment<Var>* newSeg = (SparseArraySegment<Var>*)seg;
2052+
newSeg->FillSegmentBuffer(seg->length, seg->size);
20512053
}
20522054
prevSeg = seg;
20532055
}
@@ -2243,7 +2245,7 @@ using namespace Js;
22432245
}
22442246
}
22452247
}
2246-
if (seg == newSeg && shrinkFactor != 1)
2248+
if (seg == newSeg)
22472249
{
22482250
// Fill the remaining slots.
22492251
newSeg->FillSegmentBuffer(i, seg->size);

lib/Runtime/Library/JavascriptArray.inl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,8 @@ namespace Js
486486
template<typename T>
487487
inline void JavascriptArray::DirectSetItemInLastUsedSegmentAt(const uint32 offset, const T newValue)
488488
{
489+
Assert(!SparseArraySegment<T>::IsMissingItem(&newValue));
490+
489491
SparseArraySegment<T> *const seg = (SparseArraySegment<T>*)GetLastUsedSegment();
490492
Assert(seg);
491493
Assert(offset < seg->size);
@@ -526,6 +528,8 @@ namespace Js
526528
const T newValue,
527529
StElemInfo *const stElemInfo)
528530
{
531+
Assert(!SparseArraySegment<T>::IsMissingItem(&newValue));
532+
529533
SparseArraySegment<T> *const seg = SparseArraySegment<T>::From(head);
530534
Assert(seg);
531535
Assert(offset < seg->size);
@@ -1219,6 +1223,8 @@ SECOND_PASS:
12191223
template<typename T>
12201224
void JavascriptArray::DirectSetItem_Full(uint32 itemIndex, T newValue)
12211225
{
1226+
Assert(!SparseArraySegment<T>::IsMissingItem(&newValue));
1227+
12221228
DebugOnly(VerifyNotNeedMarshal(newValue));
12231229
this->EnsureHead<T>();
12241230
AnalysisAssert(head);

lib/Runtime/Library/SparseArraySegment.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ namespace Js
147147
return JavascriptArray::MissingItem;
148148
}
149149
template<> Var SparseArraySegment<int32>::GetMissingItemVar();
150+
Var SparseArraySegment<double>::GetMissingItemVar();
150151

151152
template<>
152153
inline bool SparseArraySegment<double>::IsMissingItem(const double* value)

lib/Runtime/Library/SparseArraySegment.inl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,12 @@ namespace Js
229229
return JavascriptArray::IntMissingItemVar;
230230
}
231231

232+
template<>
233+
inline Var SparseArraySegment<double>::GetMissingItemVar()
234+
{
235+
return (Var)FloatMissingItemPattern;
236+
}
237+
232238
template<typename T>
233239
void SparseArraySegment<T>::FillSegmentBuffer(uint32 start, uint32 size)
234240
{

lib/Runtime/RuntimeCommon.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,9 @@ namespace Js
179179

180180
#if FLOATVAR
181181
const uint64 FloatTag_Value = 0xFFFCull << 48;
182+
const uint64 VarMissingItemPattern = 0x00040002FFF80002; // Float-tagged representation of FloatMissingItemPattern
183+
#else
184+
const int32 VarMissingItemPattern = 0xFFF80002;
182185
#endif
183186
const uint64 FloatMissingItemPattern = 0xFFF80002FFF80002;
184187
const int32 IntMissingItemPattern = 0xFFF80002;

0 commit comments

Comments
 (0)