Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: src/heap/heap.cc

Issue 2652553003: Access double fields in C++ as uint64_t fields to preserve signaling bit of a NaN. (Closed)
Patch Set: More fixes Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/heap/heap.h ('k') | src/objects.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/heap/heap.h" 5 #include "src/heap/heap.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/ast/context-slot-cache.h" 9 #include "src/ast/context-slot-cache.h"
10 #include "src/base/bits.h" 10 #include "src/base/bits.h"
(...skipping 2397 matching lines...) Expand 10 before | Expand all | Expand 10 after
2408 set_empty_fixed_##type##_array(obj); \ 2408 set_empty_fixed_##type##_array(obj); \
2409 } 2409 }
2410 2410
2411 TYPED_ARRAYS(ALLOCATE_EMPTY_FIXED_TYPED_ARRAY) 2411 TYPED_ARRAYS(ALLOCATE_EMPTY_FIXED_TYPED_ARRAY)
2412 #undef ALLOCATE_EMPTY_FIXED_TYPED_ARRAY 2412 #undef ALLOCATE_EMPTY_FIXED_TYPED_ARRAY
2413 } 2413 }
2414 DCHECK(!InNewSpace(empty_fixed_array())); 2414 DCHECK(!InNewSpace(empty_fixed_array()));
2415 return true; 2415 return true;
2416 } 2416 }
2417 2417
2418 2418 AllocationResult Heap::AllocateHeapNumber(MutableMode mode,
2419 AllocationResult Heap::AllocateHeapNumber(double value, MutableMode mode,
2420 PretenureFlag pretenure) { 2419 PretenureFlag pretenure) {
2421 // Statically ensure that it is safe to allocate heap numbers in paged 2420 // Statically ensure that it is safe to allocate heap numbers in paged
2422 // spaces. 2421 // spaces.
2423 int size = HeapNumber::kSize; 2422 int size = HeapNumber::kSize;
2424 STATIC_ASSERT(HeapNumber::kSize <= kMaxRegularHeapObjectSize); 2423 STATIC_ASSERT(HeapNumber::kSize <= kMaxRegularHeapObjectSize);
2425 2424
2426 AllocationSpace space = SelectSpace(pretenure); 2425 AllocationSpace space = SelectSpace(pretenure);
2427 2426
2428 HeapObject* result = nullptr; 2427 HeapObject* result = nullptr;
2429 { 2428 {
2430 AllocationResult allocation = AllocateRaw(size, space, kDoubleUnaligned); 2429 AllocationResult allocation = AllocateRaw(size, space, kDoubleUnaligned);
2431 if (!allocation.To(&result)) return allocation; 2430 if (!allocation.To(&result)) return allocation;
2432 } 2431 }
2433 2432
2434 Map* map = mode == MUTABLE ? mutable_heap_number_map() : heap_number_map(); 2433 Map* map = mode == MUTABLE ? mutable_heap_number_map() : heap_number_map();
2435 HeapObject::cast(result)->set_map_no_write_barrier(map); 2434 HeapObject::cast(result)->set_map_no_write_barrier(map);
2436 HeapNumber::cast(result)->set_value(value);
2437 return result; 2435 return result;
2438 } 2436 }
2439 2437
2440 #define SIMD_ALLOCATE_DEFINITION(TYPE, Type, type, lane_count, lane_type) \ 2438 #define SIMD_ALLOCATE_DEFINITION(TYPE, Type, type, lane_count, lane_type) \
2441 AllocationResult Heap::Allocate##Type(lane_type lanes[lane_count], \ 2439 AllocationResult Heap::Allocate##Type(lane_type lanes[lane_count], \
2442 PretenureFlag pretenure) { \ 2440 PretenureFlag pretenure) { \
2443 int size = Type::kSize; \ 2441 int size = Type::kSize; \
2444 STATIC_ASSERT(Type::kSize <= kMaxRegularHeapObjectSize); \ 2442 STATIC_ASSERT(Type::kSize <= kMaxRegularHeapObjectSize); \
2445 \ 2443 \
2446 AllocationSpace space = SelectSpace(pretenure); \ 2444 AllocationSpace space = SelectSpace(pretenure); \
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
2593 void Heap::CreateInitialObjects() { 2591 void Heap::CreateInitialObjects() {
2594 HandleScope scope(isolate()); 2592 HandleScope scope(isolate());
2595 Factory* factory = isolate()->factory(); 2593 Factory* factory = isolate()->factory();
2596 2594
2597 // The -0 value must be set before NewNumber works. 2595 // The -0 value must be set before NewNumber works.
2598 set_minus_zero_value(*factory->NewHeapNumber(-0.0, IMMUTABLE, TENURED)); 2596 set_minus_zero_value(*factory->NewHeapNumber(-0.0, IMMUTABLE, TENURED));
2599 DCHECK(std::signbit(minus_zero_value()->Number()) != 0); 2597 DCHECK(std::signbit(minus_zero_value()->Number()) != 0);
2600 2598
2601 set_nan_value(*factory->NewHeapNumber( 2599 set_nan_value(*factory->NewHeapNumber(
2602 std::numeric_limits<double>::quiet_NaN(), IMMUTABLE, TENURED)); 2600 std::numeric_limits<double>::quiet_NaN(), IMMUTABLE, TENURED));
2603 set_hole_nan_value(*factory->NewHeapNumber(bit_cast<double>(kHoleNanInt64), 2601 set_hole_nan_value(
2604 IMMUTABLE, TENURED)); 2602 *factory->NewHeapNumberFromBits(kHoleNanInt64, IMMUTABLE, TENURED));
2605 set_infinity_value(*factory->NewHeapNumber(V8_INFINITY, IMMUTABLE, TENURED)); 2603 set_infinity_value(*factory->NewHeapNumber(V8_INFINITY, IMMUTABLE, TENURED));
2606 set_minus_infinity_value( 2604 set_minus_infinity_value(
2607 *factory->NewHeapNumber(-V8_INFINITY, IMMUTABLE, TENURED)); 2605 *factory->NewHeapNumber(-V8_INFINITY, IMMUTABLE, TENURED));
2608 2606
2609 // Allocate initial string table. 2607 // Allocate initial string table.
2610 set_string_table(*StringTable::New(isolate(), kInitialStringTableSize)); 2608 set_string_table(*StringTable::New(isolate(), kInitialStringTableSize));
2611 2609
2612 // Allocate 2610 // Allocate
2613 2611
2614 // Finish initializing oddballs after creating the string table. 2612 // Finish initializing oddballs after creating the string table.
(...skipping 3993 matching lines...) Expand 10 before | Expand all | Expand 10 after
6608 } 6606 }
6609 6607
6610 6608
6611 // static 6609 // static
6612 int Heap::GetStaticVisitorIdForMap(Map* map) { 6610 int Heap::GetStaticVisitorIdForMap(Map* map) {
6613 return StaticVisitorBase::GetVisitorId(map); 6611 return StaticVisitorBase::GetVisitorId(map);
6614 } 6612 }
6615 6613
6616 } // namespace internal 6614 } // namespace internal
6617 } // namespace v8 6615 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698