diff options
| author | Steve Block <steveblock@google.com> | 2011-05-26 01:26:41 +0100 |
|---|---|---|
| committer | Steve Block <steveblock@google.com> | 2011-06-02 15:09:56 +0100 |
| commit | 44f0eee88ff00398ff7f715fab053374d808c90d (patch) | |
| tree | addd100e906cd43f843f3aaf64b445f17f46fe0f /src/assembler.cc | |
| parent | 1b63b9ad386abd62f61af0e29246a687f5311b53 (diff) | |
| download | android_external_v8-44f0eee88ff00398ff7f715fab053374d808c90d.tar.gz android_external_v8-44f0eee88ff00398ff7f715fab053374d808c90d.tar.bz2 android_external_v8-44f0eee88ff00398ff7f715fab053374d808c90d.zip | |
Update V8 to r7427: Initial merge by git
As required by WebKit r82507
Change-Id: I7ae83ef3f689356043b4929255b7c1dd31d8c5df
Diffstat (limited to 'src/assembler.cc')
| -rw-r--r-- | src/assembler.cc | 255 |
1 files changed, 158 insertions, 97 deletions
diff --git a/src/assembler.cc b/src/assembler.cc index b0b44fd9..0322747c 100644 --- a/src/assembler.cc +++ b/src/assembler.cc @@ -55,6 +55,8 @@ #include "x64/regexp-macro-assembler-x64.h" #elif V8_TARGET_ARCH_ARM #include "arm/regexp-macro-assembler-arm.h" +#elif V8_TARGET_ARCH_MIPS +#include "mips/regexp-macro-assembler-mips.h" #else // Unknown architecture. #error "Unknown architecture." #endif // Target architecture. @@ -67,6 +69,7 @@ namespace internal { const double DoubleConstant::min_int = kMinInt; const double DoubleConstant::one_half = 0.5; const double DoubleConstant::minus_zero = -0.0; +const double DoubleConstant::nan = OS::nan_value(); const double DoubleConstant::negative_infinity = -V8_INFINITY; const char* RelocInfo::kFillerCommentString = "DEOPTIMIZATION PADDING"; @@ -139,6 +142,7 @@ const int kPCJumpTag = (1 << kExtraTagBits) - 1; const int kSmallPCDeltaBits = kBitsPerByte - kTagBits; const int kSmallPCDeltaMask = (1 << kSmallPCDeltaBits) - 1; +const int RelocInfo::kMaxSmallPCDelta = kSmallPCDeltaMask; const int kVariableLengthPCJumpTopTag = 1; const int kChunkBits = 7; @@ -216,7 +220,6 @@ void RelocInfoWriter::Write(const RelocInfo* rinfo) { #ifdef DEBUG byte* begin_pos = pos_; #endif - Counters::reloc_info_count.Increment(); ASSERT(rinfo->pc() - last_pc_ >= 0); ASSERT(RelocInfo::NUMBER_OF_MODES <= kMaxRelocModes); // Use unsigned delta-encoding for pc. @@ -525,7 +528,7 @@ void RelocInfo::Verify() { ASSERT(addr != NULL); // Check that we can find the right code object. Code* code = Code::GetCodeFromTargetAddress(addr); - Object* found = Heap::FindCodeObject(addr); + Object* found = HEAP->FindCodeObject(addr); ASSERT(found->IsCode()); ASSERT(code->address() == HeapObject::cast(found)->address()); break; @@ -551,153 +554,184 @@ void RelocInfo::Verify() { // ----------------------------------------------------------------------------- // Implementation of ExternalReference -ExternalReference::ExternalReference(Builtins::CFunctionId id) - : address_(Redirect(Builtins::c_function_address(id))) {} +ExternalReference::ExternalReference(Builtins::CFunctionId id, Isolate* isolate) + : address_(Redirect(isolate, Builtins::c_function_address(id))) {} ExternalReference::ExternalReference( - ApiFunction* fun, Type type = ExternalReference::BUILTIN_CALL) - : address_(Redirect(fun->address(), type)) {} + ApiFunction* fun, + Type type = ExternalReference::BUILTIN_CALL, + Isolate* isolate = NULL) + : address_(Redirect(isolate, fun->address(), type)) {} -ExternalReference::ExternalReference(Builtins::Name name) - : address_(Builtins::builtin_address(name)) {} +ExternalReference::ExternalReference(Builtins::Name name, Isolate* isolate) + : address_(isolate->builtins()->builtin_address(name)) {} -ExternalReference::ExternalReference(Runtime::FunctionId id) - : address_(Redirect(Runtime::FunctionForId(id)->entry)) {} +ExternalReference::ExternalReference(Runtime::FunctionId id, + Isolate* isolate) + : address_(Redirect(isolate, Runtime::FunctionForId(id)->entry)) {} -ExternalReference::ExternalReference(Runtime::Function* f) - : address_(Redirect(f->entry)) {} +ExternalReference::ExternalReference(const Runtime::Function* f, + Isolate* isolate) + : address_(Redirect(isolate, f->entry)) {} -ExternalReference::ExternalReference(const IC_Utility& ic_utility) - : address_(Redirect(ic_utility.address())) {} +ExternalReference ExternalReference::isolate_address() { + return ExternalReference(Isolate::Current()); +} + + +ExternalReference::ExternalReference(const IC_Utility& ic_utility, + Isolate* isolate) + : address_(Redirect(isolate, ic_utility.address())) {} #ifdef ENABLE_DEBUGGER_SUPPORT -ExternalReference::ExternalReference(const Debug_Address& debug_address) - : address_(debug_address.address()) {} +ExternalReference::ExternalReference(const Debug_Address& debug_address, + Isolate* isolate) + : address_(debug_address.address(isolate)) {} #endif ExternalReference::ExternalReference(StatsCounter* counter) : address_(reinterpret_cast<Address>(counter->GetInternalPointer())) {} -ExternalReference::ExternalReference(Top::AddressId id) - : address_(Top::get_address_from_id(id)) {} +ExternalReference::ExternalReference(Isolate::AddressId id, Isolate* isolate) + : address_(isolate->get_address_from_id(id)) {} ExternalReference::ExternalReference(const SCTableReference& table_ref) : address_(table_ref.address()) {} -ExternalReference ExternalReference::perform_gc_function() { - return ExternalReference(Redirect(FUNCTION_ADDR(Runtime::PerformGC))); +ExternalReference ExternalReference::perform_gc_function(Isolate* isolate) { + return ExternalReference(Redirect(isolate, + FUNCTION_ADDR(Runtime::PerformGC))); } -ExternalReference ExternalReference::fill_heap_number_with_random_function() { - return - ExternalReference(Redirect(FUNCTION_ADDR(V8::FillHeapNumberWithRandom))); +ExternalReference ExternalReference::fill_heap_number_with_random_function( + Isolate* isolate) { + return ExternalReference(Redirect( + isolate, + FUNCTION_ADDR(V8::FillHeapNumberWithRandom))); } -ExternalReference ExternalReference::delete_handle_scope_extensions() { - return ExternalReference(Redirect(FUNCTION_ADDR( - HandleScope::DeleteExtensions))); +ExternalReference ExternalReference::delete_handle_scope_extensions( + Isolate* isolate) { + return ExternalReference(Redirect( + isolate, + FUNCTION_ADDR(HandleScope::DeleteExtensions))); } -ExternalReference ExternalReference::random_uint32_function() { - return ExternalReference(Redirect(FUNCTION_ADDR(V8::Random))); +ExternalReference ExternalReference::random_uint32_function( + Isolate* isolate) { + return ExternalReference(Redirect(isolate, FUNCTION_ADDR(V8::Random))); } -ExternalReference ExternalReference::transcendental_cache_array_address() { - return ExternalReference(TranscendentalCache::cache_array_address()); +ExternalReference ExternalReference::transcendental_cache_array_address( + Isolate* isolate) { + return ExternalReference( + isolate->transcendental_cache()->cache_array_address()); } -ExternalReference ExternalReference::new_deoptimizer_function() { +ExternalReference ExternalReference::new_deoptimizer_function( + Isolate* isolate) { return ExternalReference( - Redirect(FUNCTION_ADDR(Deoptimizer::New))); + Redirect(isolate, FUNCTION_ADDR(Deoptimizer::New))); } -ExternalReference ExternalReference::compute_output_frames_function() { +ExternalReference ExternalReference::compute_output_frames_function( + Isolate* isolate) { return ExternalReference( - Redirect(FUNCTION_ADDR(Deoptimizer::ComputeOutputFrames))); + Redirect(isolate, FUNCTION_ADDR(Deoptimizer::ComputeOutputFrames))); } -ExternalReference ExternalReference::global_contexts_list() { - return ExternalReference(Heap::global_contexts_list_address()); +ExternalReference ExternalReference::global_contexts_list(Isolate* isolate) { + return ExternalReference(isolate->heap()->global_contexts_list_address()); } -ExternalReference ExternalReference::keyed_lookup_cache_keys() { - return ExternalReference(KeyedLookupCache::keys_address()); +ExternalReference ExternalReference::keyed_lookup_cache_keys(Isolate* isolate) { + return ExternalReference(isolate->keyed_lookup_cache()->keys_address()); } -ExternalReference ExternalReference::keyed_lookup_cache_field_offsets() { - return ExternalReference(KeyedLookupCache::field_offsets_address()); +ExternalReference ExternalReference::keyed_lookup_cache_field_offsets( + Isolate* isolate) { + return ExternalReference( + isolate->keyed_lookup_cache()->field_offsets_address()); } -ExternalReference ExternalReference::the_hole_value_location() { - return ExternalReference(Factory::the_hole_value().location()); +ExternalReference ExternalReference::the_hole_value_location(Isolate* isolate) { + return ExternalReference(isolate->factory()->the_hole_value().location()); } -ExternalReference ExternalReference::arguments_marker_location() { - return ExternalReference(Factory::arguments_marker().location()); +ExternalReference ExternalReference::arguments_marker_location( + Isolate* isolate) { + return ExternalReference(isolate->factory()->arguments_marker().location()); } -ExternalReference ExternalReference::roots_address() { - return ExternalReference(Heap::roots_address()); +ExternalReference ExternalReference::roots_address(Isolate* isolate) { + return ExternalReference(isolate->heap()->roots_address()); } -ExternalReference ExternalReference::address_of_stack_limit() { - return ExternalReference(StackGuard::address_of_jslimit()); +ExternalReference ExternalReference::address_of_stack_limit(Isolate* isolate) { + return ExternalReference(isolate->stack_guard()->address_of_jslimit()); } -ExternalReference ExternalReference::address_of_real_stack_limit() { - return ExternalReference(StackGuard::address_of_real_jslimit()); +ExternalReference ExternalReference::address_of_real_stack_limit( + Isolate* isolate) { + return ExternalReference(isolate->stack_guard()->address_of_real_jslimit()); } -ExternalReference ExternalReference::address_of_regexp_stack_limit() { - return ExternalReference(RegExpStack::limit_address()); +ExternalReference ExternalReference::address_of_regexp_stack_limit( + Isolate* isolate) { + return ExternalReference(isolate->regexp_stack()->limit_address()); } -ExternalReference ExternalReference::new_space_start() { - return ExternalReference(Heap::NewSpaceStart()); +ExternalReference ExternalReference::new_space_start(Isolate* isolate) { + return ExternalReference(isolate->heap()->NewSpaceStart()); } -ExternalReference ExternalReference::new_space_mask() { - return ExternalReference(reinterpret_cast<Address>(Heap::NewSpaceMask())); +ExternalReference ExternalReference::new_space_mask(Isolate* isolate) { + Address mask = reinterpret_cast<Address>(isolate->heap()->NewSpaceMask()); + return ExternalReference(mask); } -ExternalReference ExternalReference::new_space_allocation_top_address() { - return ExternalReference(Heap::NewSpaceAllocationTopAddress()); +ExternalReference ExternalReference::new_space_allocation_top_address( + Isolate* isolate) { + return ExternalReference(isolate->heap()->NewSpaceAllocationTopAddress()); } -ExternalReference ExternalReference::heap_always_allocate_scope_depth() { - return ExternalReference(Heap::always_allocate_scope_depth_address()); +ExternalReference ExternalReference::heap_always_allocate_scope_depth( + Isolate* isolate) { + Heap* heap = isolate->heap(); + return ExternalReference(heap->always_allocate_scope_depth_address()); } -ExternalReference ExternalReference::new_space_allocation_limit_address() { - return ExternalReference(Heap::NewSpaceAllocationLimitAddress()); +ExternalReference ExternalReference::new_space_allocation_limit_address( + Isolate* isolate) { + return ExternalReference(isolate->heap()->NewSpaceAllocationLimitAddress()); } @@ -716,8 +750,9 @@ ExternalReference ExternalReference::handle_scope_limit_address() { } -ExternalReference ExternalReference::scheduled_exception_address() { - return ExternalReference(Top::scheduled_exception_address()); +ExternalReference ExternalReference::scheduled_exception_address( + Isolate* isolate) { + return ExternalReference(isolate->scheduled_exception_address()); } @@ -745,9 +780,16 @@ ExternalReference ExternalReference::address_of_negative_infinity() { } +ExternalReference ExternalReference::address_of_nan() { + return ExternalReference(reinterpret_cast<void*>( + const_cast<double*>(&DoubleConstant::nan))); +} + + #ifndef V8_INTERPRETED_REGEXP -ExternalReference ExternalReference::re_check_stack_guard_state() { +ExternalReference ExternalReference::re_check_stack_guard_state( + Isolate* isolate) { Address function; #ifdef V8_TARGET_ARCH_X64 function = FUNCTION_ADDR(RegExpMacroAssemblerX64::CheckStackGuardState); @@ -755,19 +797,23 @@ ExternalReference ExternalReference::re_check_stack_guard_state() { function = FUNCTION_ADDR(RegExpMacroAssemblerIA32::CheckStackGuardState); #elif V8_TARGET_ARCH_ARM function = FUNCTION_ADDR(RegExpMacroAssemblerARM::CheckStackGuardState); +#elif V8_TARGET_ARCH_MIPS + function = FUNCTION_ADDR(RegExpMacroAssemblerMIPS::CheckStackGuardState); #else UNREACHABLE(); #endif - return ExternalReference(Redirect(function)); + return ExternalReference(Redirect(isolate, function)); } -ExternalReference ExternalReference::re_grow_stack() { +ExternalReference ExternalReference::re_grow_stack(Isolate* isolate) { return ExternalReference( - Redirect(FUNCTION_ADDR(NativeRegExpMacroAssembler::GrowStack))); + Redirect(isolate, FUNCTION_ADDR(NativeRegExpMacroAssembler::GrowStack))); } -ExternalReference ExternalReference::re_case_insensitive_compare_uc16() { +ExternalReference ExternalReference::re_case_insensitive_compare_uc16( + Isolate* isolate) { return ExternalReference(Redirect( + isolate, FUNCTION_ADDR(NativeRegExpMacroAssembler::CaseInsensitiveCompareUC16))); } @@ -776,16 +822,21 @@ ExternalReference ExternalReference::re_word_character_map() { NativeRegExpMacroAssembler::word_character_map_address()); } -ExternalReference ExternalReference::address_of_static_offsets_vector() { - return ExternalReference(OffsetsVector::static_offsets_vector_address()); +ExternalReference ExternalReference::address_of_static_offsets_vector( + Isolate* isolate) { + return ExternalReference( + OffsetsVector::static_offsets_vector_address(isolate)); } -ExternalReference ExternalReference::address_of_regexp_stack_memory_address() { - return ExternalReference(RegExpStack::memory_address()); +ExternalReference ExternalReference::address_of_regexp_stack_memory_address( + Isolate* isolate) { + return ExternalReference( + isolate->regexp_stack()->memory_address()); } -ExternalReference ExternalReference::address_of_regexp_stack_memory_size() { - return ExternalReference(RegExpStack::memory_size_address()); +ExternalReference ExternalReference::address_of_regexp_stack_memory_size( + Isolate* isolate) { + return ExternalReference(isolate->regexp_stack()->memory_size_address()); } #endif // V8_INTERPRETED_REGEXP @@ -831,20 +882,26 @@ static double math_log_double(double x) { } -ExternalReference ExternalReference::math_sin_double_function() { - return ExternalReference(Redirect(FUNCTION_ADDR(math_sin_double), +ExternalReference ExternalReference::math_sin_double_function( + Isolate* isolate) { + return ExternalReference(Redirect(isolate, + FUNCTION_ADDR(math_sin_double), FP_RETURN_CALL)); } -ExternalReference ExternalReference::math_cos_double_function() { - return ExternalReference(Redirect(FUNCTION_ADDR(math_cos_double), +ExternalReference ExternalReference::math_cos_double_function( + Isolate* isolate) { + return ExternalReference(Redirect(isolate, + FUNCTION_ADDR(math_cos_double), FP_RETURN_CALL)); } -ExternalReference ExternalReference::math_log_double_function() { - return ExternalReference(Redirect(FUNCTION_ADDR(math_log_double), +ExternalReference ExternalReference::math_log_double_function( + Isolate* isolate) { + return ExternalReference(Redirect(isolate, + FUNCTION_ADDR(math_log_double), FP_RETURN_CALL)); } @@ -884,14 +941,18 @@ double power_double_double(double x, double y) { } -ExternalReference ExternalReference::power_double_double_function() { - return ExternalReference(Redirect(FUNCTION_ADDR(power_double_double), +ExternalReference ExternalReference::power_double_double_function( + Isolate* isolate) { + return ExternalReference(Redirect(isolate, + FUNCTION_ADDR(power_double_double), FP_RETURN_CALL)); } -ExternalReference ExternalReference::power_double_int_function() { - return ExternalReference(Redirect(FUNCTION_ADDR(power_double_int), +ExternalReference ExternalReference::power_double_int_function( + Isolate* isolate) { + return ExternalReference(Redirect(isolate, + FUNCTION_ADDR(power_double_int), FP_RETURN_CALL)); } @@ -903,7 +964,7 @@ static int native_compare_doubles(double y, double x) { ExternalReference ExternalReference::double_fp_operation( - Token::Value operation) { + Token::Value operation, Isolate* isolate) { typedef double BinaryFPOperation(double x, double y); BinaryFPOperation* function = NULL; switch (operation) { @@ -926,28 +987,28 @@ ExternalReference ExternalReference::double_fp_operation( UNREACHABLE(); } // Passing true as 2nd parameter indicates that they return an fp value. - return ExternalReference(Redirect(FUNCTION_ADDR(function), FP_RETURN_CALL)); + return ExternalReference(Redirect(isolate, + FUNCTION_ADDR(function), + FP_RETURN_CALL)); } -ExternalReference ExternalReference::compare_doubles() { - return ExternalReference(Redirect(FUNCTION_ADDR(native_compare_doubles), +ExternalReference ExternalReference::compare_doubles(Isolate* isolate) { + return ExternalReference(Redirect(isolate, + FUNCTION_ADDR(native_compare_doubles), BUILTIN_CALL)); } -ExternalReference::ExternalReferenceRedirector* - ExternalReference::redirector_ = NULL; - - #ifdef ENABLE_DEBUGGER_SUPPORT -ExternalReference ExternalReference::debug_break() { - return ExternalReference(Redirect(FUNCTION_ADDR(Debug::Break))); +ExternalReference ExternalReference::debug_break(Isolate* isolate) { + return ExternalReference(Redirect(isolate, FUNCTION_ADDR(Debug::Break))); } -ExternalReference ExternalReference::debug_step_in_fp_address() { - return ExternalReference(Debug::step_in_fp_addr()); +ExternalReference ExternalReference::debug_step_in_fp_address( + Isolate* isolate) { + return ExternalReference(isolate->debug()->step_in_fp_addr()); } #endif |
