| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 8492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8503 return Map::AsElementsKind(map, target_kind); | 8503 return Map::AsElementsKind(map, target_kind); |
| 8504 } | 8504 } |
| 8505 | 8505 |
| 8506 | 8506 |
| 8507 HValue* HOptimizedGraphBuilder::BuildAllocateExternalElements( | 8507 HValue* HOptimizedGraphBuilder::BuildAllocateExternalElements( |
| 8508 ExternalArrayType array_type, | 8508 ExternalArrayType array_type, |
| 8509 bool is_zero_byte_offset, | 8509 bool is_zero_byte_offset, |
| 8510 HValue* buffer, HValue* byte_offset, HValue* length) { | 8510 HValue* buffer, HValue* byte_offset, HValue* length) { |
| 8511 Handle<Map> external_array_map( | 8511 Handle<Map> external_array_map( |
| 8512 isolate()->heap()->MapForExternalArrayType(array_type)); | 8512 isolate()->heap()->MapForExternalArrayType(array_type)); |
| 8513 |
| 8514 // The HForceRepresentation is to prevent possible deopt on int-smi |
| 8515 // conversion after allocation but before the new object fields are set. |
| 8516 length = AddUncasted<HForceRepresentation>(length, Representation::Smi()); |
| 8513 HValue* elements = | 8517 HValue* elements = |
| 8514 Add<HAllocate>( | 8518 Add<HAllocate>( |
| 8515 Add<HConstant>(ExternalArray::kAlignedSize), | 8519 Add<HConstant>(ExternalArray::kAlignedSize), |
| 8516 HType::Tagged(), | 8520 HType::Tagged(), |
| 8517 NOT_TENURED, | 8521 NOT_TENURED, |
| 8518 external_array_map->instance_type()); | 8522 external_array_map->instance_type()); |
| 8519 | 8523 |
| 8520 AddStoreMapConstant(elements, external_array_map); | 8524 AddStoreMapConstant(elements, external_array_map); |
| 8525 Add<HStoreNamedField>(elements, |
| 8526 HObjectAccess::ForFixedArrayLength(), length); |
| 8521 | 8527 |
| 8522 HValue* backing_store = Add<HLoadNamedField>( | 8528 HValue* backing_store = Add<HLoadNamedField>( |
| 8523 buffer, static_cast<HValue*>(NULL), | 8529 buffer, static_cast<HValue*>(NULL), |
| 8524 HObjectAccess::ForJSArrayBufferBackingStore()); | 8530 HObjectAccess::ForJSArrayBufferBackingStore()); |
| 8525 | 8531 |
| 8526 HValue* typed_array_start; | 8532 HValue* typed_array_start; |
| 8527 if (is_zero_byte_offset) { | 8533 if (is_zero_byte_offset) { |
| 8528 typed_array_start = backing_store; | 8534 typed_array_start = backing_store; |
| 8529 } else { | 8535 } else { |
| 8530 HInstruction* external_pointer = | 8536 HInstruction* external_pointer = |
| 8531 AddUncasted<HAdd>(backing_store, byte_offset); | 8537 AddUncasted<HAdd>(backing_store, byte_offset); |
| 8532 // Arguments are checked prior to call to TypedArrayInitialize, | 8538 // Arguments are checked prior to call to TypedArrayInitialize, |
| 8533 // including byte_offset. | 8539 // including byte_offset. |
| 8534 external_pointer->ClearFlag(HValue::kCanOverflow); | 8540 external_pointer->ClearFlag(HValue::kCanOverflow); |
| 8535 typed_array_start = external_pointer; | 8541 typed_array_start = external_pointer; |
| 8536 } | 8542 } |
| 8537 | 8543 |
| 8538 | |
| 8539 Add<HStoreNamedField>(elements, | 8544 Add<HStoreNamedField>(elements, |
| 8540 HObjectAccess::ForExternalArrayExternalPointer(), | 8545 HObjectAccess::ForExternalArrayExternalPointer(), |
| 8541 typed_array_start); | 8546 typed_array_start); |
| 8542 | 8547 |
| 8543 Add<HStoreNamedField>(elements, | |
| 8544 HObjectAccess::ForFixedArrayLength(), length); | |
| 8545 return elements; | 8548 return elements; |
| 8546 } | 8549 } |
| 8547 | 8550 |
| 8548 | 8551 |
| 8549 HValue* HOptimizedGraphBuilder::BuildAllocateFixedTypedArray( | 8552 HValue* HOptimizedGraphBuilder::BuildAllocateFixedTypedArray( |
| 8550 ExternalArrayType array_type, size_t element_size, | 8553 ExternalArrayType array_type, size_t element_size, |
| 8551 ElementsKind fixed_elements_kind, | 8554 ElementsKind fixed_elements_kind, |
| 8552 HValue* byte_length, HValue* length) { | 8555 HValue* byte_length, HValue* length) { |
| 8553 STATIC_ASSERT( | 8556 STATIC_ASSERT( |
| 8554 (FixedTypedArrayBase::kHeaderSize & kObjectAlignmentMask) == 0); | 8557 (FixedTypedArrayBase::kHeaderSize & kObjectAlignmentMask) == 0); |
| 8555 HValue* total_size; | 8558 HValue* total_size; |
| 8556 | 8559 |
| 8557 // if fixed array's elements are not aligned to object's alignment, | 8560 // if fixed array's elements are not aligned to object's alignment, |
| 8558 // we need to align the whole array to object alignment. | 8561 // we need to align the whole array to object alignment. |
| 8559 if (element_size % kObjectAlignment != 0) { | 8562 if (element_size % kObjectAlignment != 0) { |
| 8560 total_size = BuildObjectSizeAlignment( | 8563 total_size = BuildObjectSizeAlignment( |
| 8561 byte_length, FixedTypedArrayBase::kHeaderSize); | 8564 byte_length, FixedTypedArrayBase::kHeaderSize); |
| 8562 } else { | 8565 } else { |
| 8563 total_size = AddUncasted<HAdd>(byte_length, | 8566 total_size = AddUncasted<HAdd>(byte_length, |
| 8564 Add<HConstant>(FixedTypedArrayBase::kHeaderSize)); | 8567 Add<HConstant>(FixedTypedArrayBase::kHeaderSize)); |
| 8565 total_size->ClearFlag(HValue::kCanOverflow); | 8568 total_size->ClearFlag(HValue::kCanOverflow); |
| 8566 } | 8569 } |
| 8567 | 8570 |
| 8571 // The HForceRepresentation is to prevent possible deopt on int-smi |
| 8572 // conversion after allocation but before the new object fields are set. |
| 8573 length = AddUncasted<HForceRepresentation>(length, Representation::Smi()); |
| 8568 Handle<Map> fixed_typed_array_map( | 8574 Handle<Map> fixed_typed_array_map( |
| 8569 isolate()->heap()->MapForFixedTypedArray(array_type)); | 8575 isolate()->heap()->MapForFixedTypedArray(array_type)); |
| 8570 HValue* elements = | 8576 HValue* elements = |
| 8571 Add<HAllocate>(total_size, HType::Tagged(), | 8577 Add<HAllocate>(total_size, HType::Tagged(), |
| 8572 NOT_TENURED, | 8578 NOT_TENURED, |
| 8573 fixed_typed_array_map->instance_type()); | 8579 fixed_typed_array_map->instance_type()); |
| 8574 AddStoreMapConstant(elements, fixed_typed_array_map); | 8580 AddStoreMapConstant(elements, fixed_typed_array_map); |
| 8575 | 8581 |
| 8576 Add<HStoreNamedField>(elements, | 8582 Add<HStoreNamedField>(elements, |
| 8577 HObjectAccess::ForFixedArrayLength(), | 8583 HObjectAccess::ForFixedArrayLength(), |
| 8578 length); | 8584 length); |
| 8585 |
| 8579 HValue* filler = Add<HConstant>(static_cast<int32_t>(0)); | 8586 HValue* filler = Add<HConstant>(static_cast<int32_t>(0)); |
| 8580 | 8587 |
| 8581 { | 8588 { |
| 8582 LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement); | 8589 LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement); |
| 8583 | 8590 |
| 8584 HValue* key = builder.BeginBody( | 8591 HValue* key = builder.BeginBody( |
| 8585 Add<HConstant>(static_cast<int32_t>(0)), | 8592 Add<HConstant>(static_cast<int32_t>(0)), |
| 8586 length, Token::LT); | 8593 length, Token::LT); |
| 8587 Add<HStoreKeyed>(elements, key, filler, fixed_elements_kind); | 8594 Add<HStoreKeyed>(elements, key, filler, fixed_elements_kind); |
| 8588 | 8595 |
| 8589 builder.EndBody(); | 8596 builder.EndBody(); |
| 8590 } | 8597 } |
| 8591 Add<HStoreNamedField>( | |
| 8592 elements, HObjectAccess::ForFixedArrayLength(), length); | |
| 8593 return elements; | 8598 return elements; |
| 8594 } | 8599 } |
| 8595 | 8600 |
| 8596 | 8601 |
| 8597 void HOptimizedGraphBuilder::GenerateTypedArrayInitialize( | 8602 void HOptimizedGraphBuilder::GenerateTypedArrayInitialize( |
| 8598 CallRuntime* expr) { | 8603 CallRuntime* expr) { |
| 8599 ZoneList<Expression*>* arguments = expr->arguments(); | 8604 ZoneList<Expression*>* arguments = expr->arguments(); |
| 8600 | 8605 |
| 8601 NoObservableSideEffectsScope scope(this); | 8606 NoObservableSideEffectsScope scope(this); |
| 8602 static const int kObjectArg = 0; | 8607 static const int kObjectArg = 0; |
| (...skipping 2840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11443 if (ShouldProduceTraceOutput()) { | 11448 if (ShouldProduceTraceOutput()) { |
| 11444 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 11449 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 11445 } | 11450 } |
| 11446 | 11451 |
| 11447 #ifdef DEBUG | 11452 #ifdef DEBUG |
| 11448 graph_->Verify(false); // No full verify. | 11453 graph_->Verify(false); // No full verify. |
| 11449 #endif | 11454 #endif |
| 11450 } | 11455 } |
| 11451 | 11456 |
| 11452 } } // namespace v8::internal | 11457 } } // namespace v8::internal |
| OLD | NEW |