| Index: src/code-stub-assembler.cc
|
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
|
| index 4479086ed78030baf6af758c894299997090650d..43983ae5db7aa2cd736c23837521b04517771f18 100644
|
| --- a/src/code-stub-assembler.cc
|
| +++ b/src/code-stub-assembler.cc
|
| @@ -3575,71 +3575,75 @@ void CodeStubAssembler::EmitElementLoad(Node* object, Node* elements,
|
| LoadObjectField(elements, FixedTypedArrayBase::kBasePointerOffset);
|
| Node* backing_store = IntPtrAdd(external_pointer, base_pointer);
|
|
|
| + Label uint8_elements(this), int8_elements(this), uint16_elements(this),
|
| + int16_elements(this), uint32_elements(this), int32_elements(this),
|
| + float32_elements(this), float64_elements(this);
|
| + Label* elements_kind_labels[] = {
|
| + &uint8_elements, &uint8_elements, &int8_elements,
|
| + &uint16_elements, &int16_elements, &uint32_elements,
|
| + &int32_elements, &float32_elements, &float64_elements};
|
| + int32_t elements_kinds[] = {
|
| + UINT8_ELEMENTS, UINT8_CLAMPED_ELEMENTS, INT8_ELEMENTS,
|
| + UINT16_ELEMENTS, INT16_ELEMENTS, UINT32_ELEMENTS,
|
| + INT32_ELEMENTS, FLOAT32_ELEMENTS, FLOAT64_ELEMENTS};
|
| const int kTypedElementsKindCount = LAST_FIXED_TYPED_ARRAY_ELEMENTS_KIND -
|
| FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND +
|
| 1;
|
| - Label* elements_kind_labels[kTypedElementsKindCount];
|
| - int32_t elements_kinds[kTypedElementsKindCount];
|
| - for (int i = 0; i < kTypedElementsKindCount; i++) {
|
| - elements_kinds[i] = i + FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND;
|
| - elements_kind_labels[i] = new Label(this);
|
| - }
|
| + DCHECK_EQ(kTypedElementsKindCount, arraysize(elements_kinds));
|
| + DCHECK_EQ(kTypedElementsKindCount, arraysize(elements_kind_labels));
|
| Switch(elements_kind, miss, elements_kinds, elements_kind_labels,
|
| static_cast<size_t>(kTypedElementsKindCount));
|
| -
|
| - for (int i = 0; i < kTypedElementsKindCount; i++) {
|
| - ElementsKind kind = static_cast<ElementsKind>(elements_kinds[i]);
|
| - Bind(elements_kind_labels[i]);
|
| - Comment(ElementsKindToString(kind));
|
| - switch (kind) {
|
| - case UINT8_ELEMENTS:
|
| - case UINT8_CLAMPED_ELEMENTS:
|
| - Return(SmiTag(Load(MachineType::Uint8(), backing_store, key)));
|
| - break;
|
| - case INT8_ELEMENTS:
|
| - Return(SmiTag(Load(MachineType::Int8(), backing_store, key)));
|
| - break;
|
| - case UINT16_ELEMENTS: {
|
| - Node* index = WordShl(key, IntPtrConstant(1));
|
| - Return(SmiTag(Load(MachineType::Uint16(), backing_store, index)));
|
| - break;
|
| - }
|
| - case INT16_ELEMENTS: {
|
| - Node* index = WordShl(key, IntPtrConstant(1));
|
| - Return(SmiTag(Load(MachineType::Int16(), backing_store, index)));
|
| - break;
|
| - }
|
| - case UINT32_ELEMENTS: {
|
| - Node* index = WordShl(key, IntPtrConstant(2));
|
| - Node* element = Load(MachineType::Uint32(), backing_store, index);
|
| - Return(ChangeUint32ToTagged(element));
|
| - break;
|
| - }
|
| - case INT32_ELEMENTS: {
|
| - Node* index = WordShl(key, IntPtrConstant(2));
|
| - Node* element = Load(MachineType::Int32(), backing_store, index);
|
| - Return(ChangeInt32ToTagged(element));
|
| - break;
|
| - }
|
| - case FLOAT32_ELEMENTS: {
|
| - Node* index = WordShl(key, IntPtrConstant(2));
|
| - Node* element = Load(MachineType::Float32(), backing_store, index);
|
| - var_double_value->Bind(ChangeFloat32ToFloat64(element));
|
| - Goto(rebox_double);
|
| - break;
|
| - }
|
| - case FLOAT64_ELEMENTS: {
|
| - Node* index = WordShl(key, IntPtrConstant(3));
|
| - Node* element = Load(MachineType::Float64(), backing_store, index);
|
| - var_double_value->Bind(element);
|
| - Goto(rebox_double);
|
| - break;
|
| - }
|
| - default:
|
| - UNREACHABLE();
|
| - }
|
| - // Don't forget to clean up.
|
| - delete elements_kind_labels[i];
|
| + Bind(&uint8_elements);
|
| + {
|
| + Comment("UINT8_ELEMENTS"); // Handles UINT8_CLAMPED_ELEMENTS too.
|
| + Return(SmiTag(Load(MachineType::Uint8(), backing_store, key)));
|
| + }
|
| + Bind(&int8_elements);
|
| + {
|
| + Comment("INT8_ELEMENTS");
|
| + Return(SmiTag(Load(MachineType::Int8(), backing_store, key)));
|
| + }
|
| + Bind(&uint16_elements);
|
| + {
|
| + Comment("UINT16_ELEMENTS");
|
| + Node* index = WordShl(key, IntPtrConstant(1));
|
| + Return(SmiTag(Load(MachineType::Uint16(), backing_store, index)));
|
| + }
|
| + Bind(&int16_elements);
|
| + {
|
| + Comment("INT16_ELEMENTS");
|
| + Node* index = WordShl(key, IntPtrConstant(1));
|
| + Return(SmiTag(Load(MachineType::Int16(), backing_store, index)));
|
| + }
|
| + Bind(&uint32_elements);
|
| + {
|
| + Comment("UINT32_ELEMENTS");
|
| + Node* index = WordShl(key, IntPtrConstant(2));
|
| + Node* element = Load(MachineType::Uint32(), backing_store, index);
|
| + Return(ChangeUint32ToTagged(element));
|
| + }
|
| + Bind(&int32_elements);
|
| + {
|
| + Comment("INT32_ELEMENTS");
|
| + Node* index = WordShl(key, IntPtrConstant(2));
|
| + Node* element = Load(MachineType::Int32(), backing_store, index);
|
| + Return(ChangeInt32ToTagged(element));
|
| + }
|
| + Bind(&float32_elements);
|
| + {
|
| + Comment("FLOAT32_ELEMENTS");
|
| + Node* index = WordShl(key, IntPtrConstant(2));
|
| + Node* element = Load(MachineType::Float32(), backing_store, index);
|
| + var_double_value->Bind(ChangeFloat32ToFloat64(element));
|
| + Goto(rebox_double);
|
| + }
|
| + Bind(&float64_elements);
|
| + {
|
| + Comment("FLOAT64_ELEMENTS");
|
| + Node* index = WordShl(key, IntPtrConstant(3));
|
| + Node* element = Load(MachineType::Float64(), backing_store, index);
|
| + var_double_value->Bind(element);
|
| + Goto(rebox_double);
|
| }
|
| }
|
| }
|
|
|