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

Side by Side Diff: src/ia32/code-stubs-ia32.cc

Issue 137403009: Adding a type vector to replace type cells. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Seperate file for feedback slot allocation. Created 6 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 descriptor->register_param_count_ = 4; 103 descriptor->register_param_count_ = 4;
104 descriptor->register_params_ = registers; 104 descriptor->register_params_ = registers;
105 descriptor->deoptimization_handler_ = 105 descriptor->deoptimization_handler_ =
106 Runtime::FunctionForId(Runtime::kCreateObjectLiteral)->entry; 106 Runtime::FunctionForId(Runtime::kCreateObjectLiteral)->entry;
107 } 107 }
108 108
109 109
110 void CreateAllocationSiteStub::InitializeInterfaceDescriptor( 110 void CreateAllocationSiteStub::InitializeInterfaceDescriptor(
111 Isolate* isolate, 111 Isolate* isolate,
112 CodeStubInterfaceDescriptor* descriptor) { 112 CodeStubInterfaceDescriptor* descriptor) {
113 static Register registers[] = { ebx }; 113 static Register registers[] = { ebx, edx };
114 descriptor->register_param_count_ = 1; 114 descriptor->register_param_count_ = 2;
115 descriptor->register_params_ = registers; 115 descriptor->register_params_ = registers;
116 descriptor->deoptimization_handler_ = NULL; 116 descriptor->deoptimization_handler_ = NULL;
117 } 117 }
118 118
119 119
120 void KeyedLoadFastElementStub::InitializeInterfaceDescriptor( 120 void KeyedLoadFastElementStub::InitializeInterfaceDescriptor(
121 Isolate* isolate, 121 Isolate* isolate,
122 CodeStubInterfaceDescriptor* descriptor) { 122 CodeStubInterfaceDescriptor* descriptor) {
123 static Register registers[] = { edx, ecx }; 123 static Register registers[] = { edx, ecx };
124 descriptor->register_param_count_ = 2; 124 descriptor->register_param_count_ = 2;
(...skipping 2327 matching lines...) Expand 10 before | Expand all | Expand 10 after
2452 __ bind(&miss); 2452 __ bind(&miss);
2453 GenerateMiss(masm); 2453 GenerateMiss(masm);
2454 } 2454 }
2455 2455
2456 2456
2457 static void GenerateRecordCallTarget(MacroAssembler* masm) { 2457 static void GenerateRecordCallTarget(MacroAssembler* masm) {
2458 // Cache the called function in a global property cell. Cache states 2458 // Cache the called function in a global property cell. Cache states
2459 // are uninitialized, monomorphic (indicated by a JSFunction), and 2459 // are uninitialized, monomorphic (indicated by a JSFunction), and
2460 // megamorphic. 2460 // megamorphic.
2461 // eax : number of arguments to the construct function 2461 // eax : number of arguments to the construct function
2462 // ebx : cache cell for call target 2462 // ebx : Feedback vector
danno 2014/01/28 08:27:17 Boy, I wish we would generate all the code here an
2463 // edx : slot in feedback vector (Smi)
2463 // edi : the function to call 2464 // edi : the function to call
2464 Isolate* isolate = masm->isolate(); 2465 Isolate* isolate = masm->isolate();
2465 Label initialize, done, miss, megamorphic, not_array_function; 2466 Label initialize, done, miss, megamorphic, not_array_function;
2466 2467
2467 // Load the cache state into ecx. 2468 // Load the cache state into ecx.
2468 __ mov(ecx, FieldOperand(ebx, Cell::kValueOffset)); 2469 __ mov(ecx, FieldOperand(ebx, edx, times_half_pointer_size,
2470 FixedArray::kHeaderSize));
2469 2471
2470 // A monomorphic cache hit or an already megamorphic state: invoke the 2472 // A monomorphic cache hit or an already megamorphic state: invoke the
2471 // function without changing the state. 2473 // function without changing the state.
2472 __ cmp(ecx, edi); 2474 __ cmp(ecx, edi);
2473 __ j(equal, &done); 2475 __ j(equal, &done, Label::kFar);
2474 __ cmp(ecx, Immediate(TypeFeedbackCells::MegamorphicSentinel(isolate))); 2476 __ cmp(ecx, Immediate(TypeFeedbackInfo::MegamorphicSentinel(isolate)));
2475 __ j(equal, &done); 2477 __ j(equal, &done, Label::kFar);
2476 2478
2477 // If we came here, we need to see if we are the array function. 2479 // If we came here, we need to see if we are the array function.
2478 // If we didn't have a matching function, and we didn't find the megamorph 2480 // If we didn't have a matching function, and we didn't find the megamorph
2479 // sentinel, then we have in the cell either some other function or an 2481 // sentinel, then we have in the cell either some other function or an
2480 // AllocationSite. Do a map check on the object in ecx. 2482 // AllocationSite. Do a map check on the object in ecx.
2481 Handle<Map> allocation_site_map = 2483 Handle<Map> allocation_site_map =
2482 masm->isolate()->factory()->allocation_site_map(); 2484 masm->isolate()->factory()->allocation_site_map();
2483 __ cmp(FieldOperand(ecx, 0), Immediate(allocation_site_map)); 2485 __ cmp(FieldOperand(ecx, 0), Immediate(allocation_site_map));
2484 __ j(not_equal, &miss); 2486 __ j(not_equal, &miss);
2485 2487
2486 // Load the global or builtins object from the current context 2488 // Load the global or builtins object from the current context
2487 __ LoadGlobalContext(ecx); 2489 __ LoadGlobalContext(ecx);
2488 // Make sure the function is the Array() function 2490 // Make sure the function is the Array() function
2489 __ cmp(edi, Operand(ecx, 2491 __ cmp(edi, Operand(ecx,
2490 Context::SlotOffset(Context::ARRAY_FUNCTION_INDEX))); 2492 Context::SlotOffset(Context::ARRAY_FUNCTION_INDEX)));
2491 __ j(not_equal, &megamorphic); 2493 __ j(not_equal, &megamorphic);
2492 __ jmp(&done); 2494 __ jmp(&done, Label::kFar);
2493 2495
2494 __ bind(&miss); 2496 __ bind(&miss);
2495 2497
2496 // A monomorphic miss (i.e, here the cache is not uninitialized) goes 2498 // A monomorphic miss (i.e, here the cache is not uninitialized) goes
2497 // megamorphic. 2499 // megamorphic.
2498 __ cmp(ecx, Immediate(TypeFeedbackCells::UninitializedSentinel(isolate))); 2500 __ cmp(ecx, Immediate(TypeFeedbackInfo::UninitializedSentinel(isolate)));
2499 __ j(equal, &initialize); 2501 __ j(equal, &initialize);
2500 // MegamorphicSentinel is an immortal immovable object (undefined) so no 2502 // MegamorphicSentinel is an immortal immovable object (undefined) so no
2501 // write-barrier is needed. 2503 // write-barrier is needed.
2502 __ bind(&megamorphic); 2504 __ bind(&megamorphic);
2503 __ mov(FieldOperand(ebx, Cell::kValueOffset), 2505 __ mov(FieldOperand(ebx, edx, times_half_pointer_size,
2504 Immediate(TypeFeedbackCells::MegamorphicSentinel(isolate))); 2506 FixedArray::kHeaderSize),
2505 __ jmp(&done, Label::kNear); 2507 Immediate(TypeFeedbackInfo::MegamorphicSentinel(isolate)));
2508 __ jmp(&done, Label::kFar);
2506 2509
2507 // An uninitialized cache is patched with the function or sentinel to 2510 // An uninitialized cache is patched with the function or sentinel to
2508 // indicate the ElementsKind if function is the Array constructor. 2511 // indicate the ElementsKind if function is the Array constructor.
2509 __ bind(&initialize); 2512 __ bind(&initialize);
2510 __ LoadGlobalContext(ecx); 2513 __ LoadGlobalContext(ecx);
2511 // Make sure the function is the Array() function 2514 // Make sure the function is the Array() function
2512 __ cmp(edi, Operand(ecx, 2515 __ cmp(edi, Operand(ecx,
2513 Context::SlotOffset(Context::ARRAY_FUNCTION_INDEX))); 2516 Context::SlotOffset(Context::ARRAY_FUNCTION_INDEX)));
2514 __ j(not_equal, &not_array_function); 2517 __ j(not_equal, &not_array_function);
2515 2518
2516 // The target function is the Array constructor, 2519 // The target function is the Array constructor,
2517 // Create an AllocationSite if we don't already have it, store it in the cell 2520 // Create an AllocationSite if we don't already have it, store it in the cell
2518 { 2521 {
2519 FrameScope scope(masm, StackFrame::INTERNAL); 2522 FrameScope scope(masm, StackFrame::INTERNAL);
2520 2523
2521 // Arguments register must be smi-tagged to call out. 2524 // Arguments register must be smi-tagged to call out.
2522 __ SmiTag(eax); 2525 __ SmiTag(eax);
2523 __ push(eax); 2526 __ push(eax);
2524 __ push(edi); 2527 __ push(edi);
2528 __ push(edx);
2525 __ push(ebx); 2529 __ push(ebx);
2526 2530
2527 CreateAllocationSiteStub create_stub; 2531 CreateAllocationSiteStub create_stub;
2528 __ CallStub(&create_stub); 2532 __ CallStub(&create_stub);
2529 2533
2530 __ pop(ebx); 2534 __ pop(ebx);
2535 __ pop(edx);
2531 __ pop(edi); 2536 __ pop(edi);
2532 __ pop(eax); 2537 __ pop(eax);
2533 __ SmiUntag(eax); 2538 __ SmiUntag(eax);
2534 } 2539 }
2535 __ jmp(&done); 2540 __ jmp(&done);
2536 2541
2537 __ bind(&not_array_function); 2542 __ bind(&not_array_function);
2538 __ mov(FieldOperand(ebx, Cell::kValueOffset), edi); 2543 __ mov(FieldOperand(ebx, edx, times_half_pointer_size,
2539 // No need for a write barrier here - cells are rescanned. 2544 FixedArray::kHeaderSize),
2545 edi);
2546 // We won't need edx or ebx anymore, just save edi
2547 __ push(edi);
2548 __ push(ebx);
2549 __ push(edx);
2550 __ RecordWriteArray(ebx, edi, edx, kDontSaveFPRegs,
2551 EMIT_REMEMBERED_SET, OMIT_SMI_CHECK);
2552 __ pop(edx);
2553 __ pop(ebx);
2554 __ pop(edi);
2540 2555
2541 __ bind(&done); 2556 __ bind(&done);
2542 } 2557 }
2543 2558
2544 2559
2545 void CallFunctionStub::Generate(MacroAssembler* masm) { 2560 void CallFunctionStub::Generate(MacroAssembler* masm) {
2546 // ebx : cache cell for call target 2561 // ebx : feedback vector
2562 // edx : (only if ebx is not undefined) slot in feedback vector (Smi)
2547 // edi : the function to call 2563 // edi : the function to call
2548 Isolate* isolate = masm->isolate(); 2564 Isolate* isolate = masm->isolate();
2549 Label slow, non_function; 2565 Label slow, non_function;
2550 2566
2551 // Check that the function really is a JavaScript function. 2567 // Check that the function really is a JavaScript function.
2552 __ JumpIfSmi(edi, &non_function); 2568 __ JumpIfSmi(edi, &non_function);
2553 2569
2554 // Goto slow case if we do not have a function. 2570 // Goto slow case if we do not have a function.
2555 __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); 2571 __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx);
2556 __ j(not_equal, &slow); 2572 __ j(not_equal, &slow);
2557 2573
2558 if (RecordCallTarget()) { 2574 if (RecordCallTarget()) {
2559 GenerateRecordCallTarget(masm); 2575 GenerateRecordCallTarget(masm);
2560 } 2576 }
2561 2577
2562 // Fast-case: Just invoke the function. 2578 // Fast-case: Just invoke the function.
2563 ParameterCount actual(argc_); 2579 ParameterCount actual(argc_);
2564 2580
2565 __ InvokeFunction(edi, actual, JUMP_FUNCTION, NullCallWrapper()); 2581 __ InvokeFunction(edi, actual, JUMP_FUNCTION, NullCallWrapper());
2566 2582
2567 // Slow-case: Non-function called. 2583 // Slow-case: Non-function called.
2568 __ bind(&slow); 2584 __ bind(&slow);
2569 if (RecordCallTarget()) { 2585 if (RecordCallTarget()) {
2570 // If there is a call target cache, mark it megamorphic in the 2586 // If there is a call target cache, mark it megamorphic in the
2571 // non-function case. MegamorphicSentinel is an immortal immovable 2587 // non-function case. MegamorphicSentinel is an immortal immovable
2572 // object (undefined) so no write barrier is needed. 2588 // object (undefined) so no write barrier is needed.
2573 __ mov(FieldOperand(ebx, Cell::kValueOffset), 2589 __ mov(FieldOperand(ebx, edx, times_half_pointer_size,
2574 Immediate(TypeFeedbackCells::MegamorphicSentinel(isolate))); 2590 FixedArray::kHeaderSize),
2591 Immediate(TypeFeedbackInfo::MegamorphicSentinel(isolate)));
2575 } 2592 }
2576 // Check for function proxy. 2593 // Check for function proxy.
2577 __ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE); 2594 __ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE);
2578 __ j(not_equal, &non_function); 2595 __ j(not_equal, &non_function);
2579 __ pop(ecx); 2596 __ pop(ecx);
2580 __ push(edi); // put proxy as additional argument under return address 2597 __ push(edi); // put proxy as additional argument under return address
2581 __ push(ecx); 2598 __ push(ecx);
2582 __ Set(eax, Immediate(argc_ + 1)); 2599 __ Set(eax, Immediate(argc_ + 1));
2583 __ Set(ebx, Immediate(0)); 2600 __ Set(ebx, Immediate(0));
2584 __ GetBuiltinEntry(edx, Builtins::CALL_FUNCTION_PROXY); 2601 __ GetBuiltinEntry(edx, Builtins::CALL_FUNCTION_PROXY);
2585 { 2602 {
2586 Handle<Code> adaptor = isolate->builtins()->ArgumentsAdaptorTrampoline(); 2603 Handle<Code> adaptor = isolate->builtins()->ArgumentsAdaptorTrampoline();
2587 __ jmp(adaptor, RelocInfo::CODE_TARGET); 2604 __ jmp(adaptor, RelocInfo::CODE_TARGET);
2588 } 2605 }
2589 2606
2590 // CALL_NON_FUNCTION expects the non-function callee as receiver (instead 2607 // CALL_NON_FUNCTION expects the non-function callee as receiver (instead
2591 // of the original receiver from the call site). 2608 // of the original receiver from the call site).
2592 __ bind(&non_function); 2609 __ bind(&non_function);
2593 __ mov(Operand(esp, (argc_ + 1) * kPointerSize), edi); 2610 __ mov(Operand(esp, (argc_ + 1) * kPointerSize), edi);
2594 __ Set(eax, Immediate(argc_)); 2611 __ Set(eax, Immediate(argc_));
2595 __ Set(ebx, Immediate(0)); 2612 __ Set(ebx, Immediate(0));
2596 __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION); 2613 __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION);
2597 Handle<Code> adaptor = isolate->builtins()->ArgumentsAdaptorTrampoline(); 2614 Handle<Code> adaptor = isolate->builtins()->ArgumentsAdaptorTrampoline();
2598 __ jmp(adaptor, RelocInfo::CODE_TARGET); 2615 __ jmp(adaptor, RelocInfo::CODE_TARGET);
2599 } 2616 }
2600 2617
2601 2618
2602 void CallConstructStub::Generate(MacroAssembler* masm) { 2619 void CallConstructStub::Generate(MacroAssembler* masm) {
2603 // eax : number of arguments 2620 // eax : number of arguments
2604 // ebx : cache cell for call target 2621 // ebx : feedback vector
2622 // edx : (only if ebx is not undefined) slot in feedback vector (Smi)
2605 // edi : constructor function 2623 // edi : constructor function
2606 Label slow, non_function_call; 2624 Label slow, non_function_call;
2607 2625
2608 // Check that function is not a smi. 2626 // Check that function is not a smi.
2609 __ JumpIfSmi(edi, &non_function_call); 2627 __ JumpIfSmi(edi, &non_function_call);
2610 // Check that function is a JSFunction. 2628 // Check that function is a JSFunction.
2611 __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); 2629 __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx);
2612 __ j(not_equal, &slow); 2630 __ j(not_equal, &slow);
2613 2631
2614 if (RecordCallTarget()) { 2632 if (RecordCallTarget()) {
(...skipping 2619 matching lines...) Expand 10 before | Expand all | Expand 10 after
5234 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode); 5252 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode);
5235 } else { 5253 } else {
5236 UNREACHABLE(); 5254 UNREACHABLE();
5237 } 5255 }
5238 } 5256 }
5239 5257
5240 5258
5241 void ArrayConstructorStub::Generate(MacroAssembler* masm) { 5259 void ArrayConstructorStub::Generate(MacroAssembler* masm) {
5242 // ----------- S t a t e ------------- 5260 // ----------- S t a t e -------------
5243 // -- eax : argc (only if argument_count_ == ANY) 5261 // -- eax : argc (only if argument_count_ == ANY)
5244 // -- ebx : type info cell 5262 // -- ebx : feedback vector
5263 // -- edx : slot index
5245 // -- edi : constructor 5264 // -- edi : constructor
5246 // -- esp[0] : return address 5265 // -- esp[0] : return address
5247 // -- esp[4] : last argument 5266 // -- esp[4] : last argument
5248 // ----------------------------------- 5267 // -----------------------------------
5249 Handle<Object> undefined_sentinel( 5268 Handle<Object> undefined_sentinel(
5250 masm->isolate()->heap()->undefined_value(), 5269 masm->isolate()->heap()->undefined_value(),
5251 masm->isolate()); 5270 masm->isolate());
5252 5271
5253 if (FLAG_debug_code) { 5272 if (FLAG_debug_code) {
5254 // The array construct code is only set for the global and natives 5273 // The array construct code is only set for the global and natives
5255 // builtin Array functions which always have maps. 5274 // builtin Array functions which always have maps.
5256 5275
5257 // Initial map for the builtin Array function should be a map. 5276 // Initial map for the builtin Array function should be a map.
5258 __ mov(ecx, FieldOperand(edi, JSFunction::kPrototypeOrInitialMapOffset)); 5277 __ mov(ecx, FieldOperand(edi, JSFunction::kPrototypeOrInitialMapOffset));
5259 // Will both indicate a NULL and a Smi. 5278 // Will both indicate a NULL and a Smi.
5260 __ test(ecx, Immediate(kSmiTagMask)); 5279 __ test(ecx, Immediate(kSmiTagMask));
5261 __ Assert(not_zero, kUnexpectedInitialMapForArrayFunction); 5280 __ Assert(not_zero, kUnexpectedInitialMapForArrayFunction);
5262 __ CmpObjectType(ecx, MAP_TYPE, ecx); 5281 __ CmpObjectType(ecx, MAP_TYPE, ecx);
5263 __ Assert(equal, kUnexpectedInitialMapForArrayFunction); 5282 __ Assert(equal, kUnexpectedInitialMapForArrayFunction);
5264 5283
5265 // We should either have undefined in ebx or a valid cell 5284 // We should either have undefined in ebx or a valid cell
5266 Label okay_here; 5285 Label okay_here;
5267 Handle<Map> cell_map = masm->isolate()->factory()->cell_map(); 5286 Handle<Map> fixed_array_map = masm->isolate()->factory()->fixed_array_map();
5268 __ cmp(ebx, Immediate(undefined_sentinel)); 5287 __ cmp(ebx, Immediate(undefined_sentinel));
5269 __ j(equal, &okay_here); 5288 __ j(equal, &okay_here);
5270 __ cmp(FieldOperand(ebx, 0), Immediate(cell_map)); 5289 __ cmp(FieldOperand(ebx, 0), Immediate(fixed_array_map));
5290 // TODO(mvstanton): change this message below.
5271 __ Assert(equal, kExpectedPropertyCellInRegisterEbx); 5291 __ Assert(equal, kExpectedPropertyCellInRegisterEbx);
5272 __ bind(&okay_here); 5292 __ bind(&okay_here);
5273 } 5293 }
5274 5294
5275 Label no_info; 5295 Label no_info;
5276 // If the type cell is undefined, or contains anything other than an 5296 // If the type cell is undefined, or contains anything other than an
5277 // AllocationSite, call an array constructor that doesn't use AllocationSites. 5297 // AllocationSite, call an array constructor that doesn't use AllocationSites.
5278 __ cmp(ebx, Immediate(undefined_sentinel)); 5298 __ cmp(ebx, Immediate(undefined_sentinel));
5279 __ j(equal, &no_info); 5299 __ j(equal, &no_info);
5280 __ mov(ebx, FieldOperand(ebx, Cell::kValueOffset)); 5300 __ mov(ebx, FieldOperand(ebx, edx, times_half_pointer_size,
5301 FixedArray::kHeaderSize));
5281 __ cmp(FieldOperand(ebx, 0), Immediate( 5302 __ cmp(FieldOperand(ebx, 0), Immediate(
5282 masm->isolate()->factory()->allocation_site_map())); 5303 masm->isolate()->factory()->allocation_site_map()));
5283 __ j(not_equal, &no_info); 5304 __ j(not_equal, &no_info);
5284 5305
5285 // Only look at the lower 16 bits of the transition info. 5306 // Only look at the lower 16 bits of the transition info.
5286 __ mov(edx, FieldOperand(ebx, AllocationSite::kTransitionInfoOffset)); 5307 __ mov(edx, FieldOperand(ebx, AllocationSite::kTransitionInfoOffset));
5287 __ SmiUntag(edx); 5308 __ SmiUntag(edx);
5288 STATIC_ASSERT(AllocationSite::ElementsKindBits::kShift == 0); 5309 STATIC_ASSERT(AllocationSite::ElementsKindBits::kShift == 0);
5289 __ and_(edx, Immediate(AllocationSite::ElementsKindBits::kMask)); 5310 __ and_(edx, Immediate(AllocationSite::ElementsKindBits::kMask));
5290 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE); 5311 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
5380 __ bind(&fast_elements_case); 5401 __ bind(&fast_elements_case);
5381 GenerateCase(masm, FAST_ELEMENTS); 5402 GenerateCase(masm, FAST_ELEMENTS);
5382 } 5403 }
5383 5404
5384 5405
5385 #undef __ 5406 #undef __
5386 5407
5387 } } // namespace v8::internal 5408 } } // namespace v8::internal
5388 5409
5389 #endif // V8_TARGET_ARCH_IA32 5410 #endif // V8_TARGET_ARCH_IA32
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698