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

Side by Side Diff: src/x64/codegen-x64.cc

Issue 2814021: X64: Reapply fix for allocating HeapNumber results for >>>. (Closed)
Patch Set: Addressed review comments. Created 10 years, 6 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 // Leaves rdx and rax unchanged. SmiOperands assumes both are smis. 267 // Leaves rdx and rax unchanged. SmiOperands assumes both are smis.
268 // NumberOperands assumes both are smis or heap numbers. 268 // NumberOperands assumes both are smis or heap numbers.
269 static void LoadSSE2SmiOperands(MacroAssembler* masm); 269 static void LoadSSE2SmiOperands(MacroAssembler* masm);
270 static void LoadSSE2NumberOperands(MacroAssembler* masm); 270 static void LoadSSE2NumberOperands(MacroAssembler* masm);
271 static void LoadSSE2UnknownOperands(MacroAssembler* masm, 271 static void LoadSSE2UnknownOperands(MacroAssembler* masm,
272 Label* not_numbers); 272 Label* not_numbers);
273 273
274 // Takes the operands in rdx and rax and loads them as integers in rax 274 // Takes the operands in rdx and rax and loads them as integers in rax
275 // and rcx. 275 // and rcx.
276 static void LoadAsIntegers(MacroAssembler* masm, 276 static void LoadAsIntegers(MacroAssembler* masm,
277 Label* operand_conversion_failure); 277 Label* operand_conversion_failure,
278 Register heap_number_map);
279 // As above, but we know the operands to be numbers. In that case,
280 // conversion can't fail.
281 static void LoadNumbersAsIntegers(MacroAssembler* masm);
278 }; 282 };
279 283
280 284
281 // ----------------------------------------------------------------------------- 285 // -----------------------------------------------------------------------------
282 // CodeGenerator implementation. 286 // CodeGenerator implementation.
283 287
284 CodeGenerator::CodeGenerator(MacroAssembler* masm) 288 CodeGenerator::CodeGenerator(MacroAssembler* masm)
285 : deferred_(8), 289 : deferred_(8),
286 masm_(masm), 290 masm_(masm),
287 info_(NULL), 291 info_(NULL),
(...skipping 9633 matching lines...) Expand 10 before | Expand all | Expand 10 after
9921 9925
9922 void FloatingPointHelper::LoadSSE2SmiOperands(MacroAssembler* masm) { 9926 void FloatingPointHelper::LoadSSE2SmiOperands(MacroAssembler* masm) {
9923 __ SmiToInteger32(kScratchRegister, rdx); 9927 __ SmiToInteger32(kScratchRegister, rdx);
9924 __ cvtlsi2sd(xmm0, kScratchRegister); 9928 __ cvtlsi2sd(xmm0, kScratchRegister);
9925 __ SmiToInteger32(kScratchRegister, rax); 9929 __ SmiToInteger32(kScratchRegister, rax);
9926 __ cvtlsi2sd(xmm1, kScratchRegister); 9930 __ cvtlsi2sd(xmm1, kScratchRegister);
9927 } 9931 }
9928 9932
9929 9933
9930 void FloatingPointHelper::LoadSSE2NumberOperands(MacroAssembler* masm) { 9934 void FloatingPointHelper::LoadSSE2NumberOperands(MacroAssembler* masm) {
9935 if (FLAG_debug_code) {
9936 // Both arguments can not be smis. That case is handled by smi-only code.
9937 Label ok;
9938 __ JumpIfNotBothSmi(rax, rdx, &ok);
9939 __ Abort("Both arguments smi but not handled by smi-code.");
9940 __ bind(&ok);
9941 }
9931 Label load_smi_rdx, load_nonsmi_rax, load_smi_rax, done; 9942 Label load_smi_rdx, load_nonsmi_rax, load_smi_rax, done;
9932 // Load operand in rdx into xmm0. 9943 // Load operand in rdx into xmm0.
9933 __ JumpIfSmi(rdx, &load_smi_rdx); 9944 __ JumpIfSmi(rdx, &load_smi_rdx);
9934 __ movsd(xmm0, FieldOperand(rdx, HeapNumber::kValueOffset)); 9945 __ movsd(xmm0, FieldOperand(rdx, HeapNumber::kValueOffset));
9935 // Load operand in rax into xmm1. 9946 // Load operand in rax into xmm1.
9936 __ JumpIfSmi(rax, &load_smi_rax); 9947 __ JumpIfSmi(rax, &load_smi_rax);
9937 __ bind(&load_nonsmi_rax); 9948 __ bind(&load_nonsmi_rax);
9938 __ movsd(xmm1, FieldOperand(rax, HeapNumber::kValueOffset)); 9949 __ movsd(xmm1, FieldOperand(rax, HeapNumber::kValueOffset));
9939 __ jmp(&done); 9950 __ jmp(&done);
9940 9951
9941 __ bind(&load_smi_rdx); 9952 __ bind(&load_smi_rdx);
9942 __ SmiToInteger32(kScratchRegister, rdx); 9953 __ SmiToInteger32(kScratchRegister, rdx);
9943 __ cvtlsi2sd(xmm0, kScratchRegister); 9954 __ cvtlsi2sd(xmm0, kScratchRegister);
9944 __ JumpIfNotSmi(rax, &load_nonsmi_rax); 9955 __ jmp(&load_nonsmi_rax);
9945 9956
9946 __ bind(&load_smi_rax); 9957 __ bind(&load_smi_rax);
9947 __ SmiToInteger32(kScratchRegister, rax); 9958 __ SmiToInteger32(kScratchRegister, rax);
9948 __ cvtlsi2sd(xmm1, kScratchRegister); 9959 __ cvtlsi2sd(xmm1, kScratchRegister);
9949 9960
9950 __ bind(&done); 9961 __ bind(&done);
9951 } 9962 }
9952 9963
9953 9964
9954 void FloatingPointHelper::LoadSSE2UnknownOperands(MacroAssembler* masm, 9965 void FloatingPointHelper::LoadSSE2UnknownOperands(MacroAssembler* masm,
(...skipping 22 matching lines...) Expand all
9977 __ bind(&load_smi_rax); 9988 __ bind(&load_smi_rax);
9978 __ SmiToInteger32(kScratchRegister, rax); 9989 __ SmiToInteger32(kScratchRegister, rax);
9979 __ cvtlsi2sd(xmm1, kScratchRegister); 9990 __ cvtlsi2sd(xmm1, kScratchRegister);
9980 __ bind(&done); 9991 __ bind(&done);
9981 } 9992 }
9982 9993
9983 9994
9984 // Input: rdx, rax are the left and right objects of a bit op. 9995 // Input: rdx, rax are the left and right objects of a bit op.
9985 // Output: rax, rcx are left and right integers for a bit op. 9996 // Output: rax, rcx are left and right integers for a bit op.
9986 void FloatingPointHelper::LoadAsIntegers(MacroAssembler* masm, 9997 void FloatingPointHelper::LoadAsIntegers(MacroAssembler* masm,
9987 Label* conversion_failure) { 9998 Label* conversion_failure,
9999 Register heap_number_map) {
9988 // Check float operands. 10000 // Check float operands.
9989 Label arg1_is_object, check_undefined_arg1; 10001 Label arg1_is_object, check_undefined_arg1;
9990 Label arg2_is_object, check_undefined_arg2; 10002 Label arg2_is_object, check_undefined_arg2;
9991 Label load_arg2, done; 10003 Label load_arg2, done;
9992 10004
9993 __ JumpIfNotSmi(rdx, &arg1_is_object); 10005 __ JumpIfNotSmi(rdx, &arg1_is_object);
9994 __ SmiToInteger32(rdx, rdx); 10006 __ SmiToInteger32(rdx, rdx);
9995 __ jmp(&load_arg2); 10007 __ jmp(&load_arg2);
9996 10008
9997 // If the argument is undefined it converts to zero (ECMA-262, section 9.5). 10009 // If the argument is undefined it converts to zero (ECMA-262, section 9.5).
9998 __ bind(&check_undefined_arg1); 10010 __ bind(&check_undefined_arg1);
9999 __ CompareRoot(rdx, Heap::kUndefinedValueRootIndex); 10011 __ CompareRoot(rdx, Heap::kUndefinedValueRootIndex);
10000 __ j(not_equal, conversion_failure); 10012 __ j(not_equal, conversion_failure);
10001 __ movl(rdx, Immediate(0)); 10013 __ movl(rdx, Immediate(0));
10002 __ jmp(&load_arg2); 10014 __ jmp(&load_arg2);
10003 10015
10004 __ bind(&arg1_is_object); 10016 __ bind(&arg1_is_object);
10005 __ movq(rbx, FieldOperand(rdx, HeapObject::kMapOffset)); 10017 __ cmpq(FieldOperand(rdx, HeapObject::kMapOffset), heap_number_map);
10006 __ CompareRoot(rbx, Heap::kHeapNumberMapRootIndex);
10007 __ j(not_equal, &check_undefined_arg1); 10018 __ j(not_equal, &check_undefined_arg1);
10008 // Get the untagged integer version of the edx heap number in rcx. 10019 // Get the untagged integer version of the edx heap number in rcx.
10009 IntegerConvert(masm, rdx, rdx); 10020 IntegerConvert(masm, rdx, rdx);
10010 10021
10011 // Here rdx has the untagged integer, rax has a Smi or a heap number. 10022 // Here rdx has the untagged integer, rax has a Smi or a heap number.
10012 __ bind(&load_arg2); 10023 __ bind(&load_arg2);
10013 // Test if arg2 is a Smi. 10024 // Test if arg2 is a Smi.
10014 __ JumpIfNotSmi(rax, &arg2_is_object); 10025 __ JumpIfNotSmi(rax, &arg2_is_object);
10015 __ SmiToInteger32(rax, rax); 10026 __ SmiToInteger32(rax, rax);
10016 __ movl(rcx, rax); 10027 __ movl(rcx, rax);
10017 __ jmp(&done); 10028 __ jmp(&done);
10018 10029
10019 // If the argument is undefined it converts to zero (ECMA-262, section 9.5). 10030 // If the argument is undefined it converts to zero (ECMA-262, section 9.5).
10020 __ bind(&check_undefined_arg2); 10031 __ bind(&check_undefined_arg2);
10021 __ CompareRoot(rax, Heap::kUndefinedValueRootIndex); 10032 __ CompareRoot(rax, Heap::kUndefinedValueRootIndex);
10022 __ j(not_equal, conversion_failure); 10033 __ j(not_equal, conversion_failure);
10023 __ movl(rcx, Immediate(0)); 10034 __ movl(rcx, Immediate(0));
10024 __ jmp(&done); 10035 __ jmp(&done);
10025 10036
10026 __ bind(&arg2_is_object); 10037 __ bind(&arg2_is_object);
10027 __ movq(rbx, FieldOperand(rax, HeapObject::kMapOffset)); 10038 __ cmpq(FieldOperand(rax, HeapObject::kMapOffset), heap_number_map);
10028 __ CompareRoot(rbx, Heap::kHeapNumberMapRootIndex);
10029 __ j(not_equal, &check_undefined_arg2); 10039 __ j(not_equal, &check_undefined_arg2);
10030 // Get the untagged integer version of the eax heap number in ecx. 10040 // Get the untagged integer version of the eax heap number in ecx.
10031 IntegerConvert(masm, rcx, rax); 10041 IntegerConvert(masm, rcx, rax);
10032 __ bind(&done); 10042 __ bind(&done);
10033 __ movl(rax, rdx); 10043 __ movl(rax, rdx);
10034 } 10044 }
10035 10045
10036 10046
10047 // Input: rdx, rax are the left and right objects of a bit op.
10048 // Output: rax, rcx are left and right integers for a bit op.
10049 void FloatingPointHelper::LoadNumbersAsIntegers(MacroAssembler* masm) {
10050 if (FLAG_debug_code) {
10051 // Both arguments can not be smis. That case is handled by smi-only code.
10052 Label ok;
10053 __ JumpIfNotBothSmi(rax, rdx, &ok);
10054 __ Abort("Both arguments smi but not handled by smi-code.");
10055 __ bind(&ok);
10056 }
10057 // Check float operands.
10058 Label done;
10059 Label rax_is_object;
10060 Label rdx_is_object;
10061 Label rax_is_smi;
10062 Label rdx_is_smi;
10063
10064 __ JumpIfNotSmi(rdx, &rdx_is_object);
10065 __ SmiToInteger32(rdx, rdx);
10066
10067 __ bind(&rax_is_object);
10068 IntegerConvert(masm, rcx, rax); // Uses rdi, rcx and rbx.
10069 __ jmp(&done);
10070
10071 __ bind(&rdx_is_object);
10072 IntegerConvert(masm, rdx, rdx); // Uses rdi, rcx and rbx.
10073 __ JumpIfNotSmi(rax, &rax_is_object);
10074 __ bind(&rax_is_smi);
10075 __ SmiToInteger32(rcx, rax);
10076
10077 __ bind(&done);
10078 __ movl(rax, rdx);
10079 }
10080
10081
10037 const char* GenericBinaryOpStub::GetName() { 10082 const char* GenericBinaryOpStub::GetName() {
10038 if (name_ != NULL) return name_; 10083 if (name_ != NULL) return name_;
10039 const int len = 100; 10084 const int len = 100;
10040 name_ = Bootstrapper::AllocateAutoDeletedArray(len); 10085 name_ = Bootstrapper::AllocateAutoDeletedArray(len);
10041 if (name_ == NULL) return "OOM"; 10086 if (name_ == NULL) return "OOM";
10042 const char* op_name = Token::Name(op_); 10087 const char* op_name = Token::Name(op_);
10043 const char* overwrite_name; 10088 const char* overwrite_name;
10044 switch (mode_) { 10089 switch (mode_) {
10045 case NO_OVERWRITE: overwrite_name = "Alloc"; break; 10090 case NO_OVERWRITE: overwrite_name = "Alloc"; break;
10046 case OVERWRITE_RIGHT: overwrite_name = "OverwriteRight"; break; 10091 case OVERWRITE_RIGHT: overwrite_name = "OverwriteRight"; break;
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after
10480 case Token::MOD: { 10525 case Token::MOD: {
10481 // For MOD we go directly to runtime in the non-smi case. 10526 // For MOD we go directly to runtime in the non-smi case.
10482 break; 10527 break;
10483 } 10528 }
10484 case Token::BIT_OR: 10529 case Token::BIT_OR:
10485 case Token::BIT_AND: 10530 case Token::BIT_AND:
10486 case Token::BIT_XOR: 10531 case Token::BIT_XOR:
10487 case Token::SAR: 10532 case Token::SAR:
10488 case Token::SHL: 10533 case Token::SHL:
10489 case Token::SHR: { 10534 case Token::SHR: {
10490 Label skip_allocation, non_smi_result; 10535 Label skip_allocation, non_smi_shr_result;
10491 FloatingPointHelper::LoadAsIntegers(masm, &call_runtime); 10536 Register heap_number_map = r9;
10537 __ LoadRoot(heap_number_map, Heap::kHeapNumberMapRootIndex);
10538 if (static_operands_type_.IsNumber()) {
10539 if (FLAG_debug_code) {
10540 // Assert at runtime that inputs are only numbers.
10541 __ AbortIfNotNumber(rdx);
10542 __ AbortIfNotNumber(rax);
10543 }
10544 FloatingPointHelper::LoadNumbersAsIntegers(masm);
10545 } else {
10546 FloatingPointHelper::LoadAsIntegers(masm,
10547 &call_runtime,
10548 heap_number_map);
10549 }
10492 switch (op_) { 10550 switch (op_) {
10493 case Token::BIT_OR: __ orl(rax, rcx); break; 10551 case Token::BIT_OR: __ orl(rax, rcx); break;
10494 case Token::BIT_AND: __ andl(rax, rcx); break; 10552 case Token::BIT_AND: __ andl(rax, rcx); break;
10495 case Token::BIT_XOR: __ xorl(rax, rcx); break; 10553 case Token::BIT_XOR: __ xorl(rax, rcx); break;
10496 case Token::SAR: __ sarl_cl(rax); break; 10554 case Token::SAR: __ sarl_cl(rax); break;
10497 case Token::SHL: __ shll_cl(rax); break; 10555 case Token::SHL: __ shll_cl(rax); break;
10498 case Token::SHR: __ shrl_cl(rax); break; 10556 case Token::SHR: {
10557 __ shrl_cl(rax);
10558 // Check if result is negative. This can only happen for a shift
10559 // by zero.
10560 __ testl(rax, rax);
10561 __ j(negative, &non_smi_shr_result);
10562 break;
10563 }
10499 default: UNREACHABLE(); 10564 default: UNREACHABLE();
10500 } 10565 }
10501 if (op_ == Token::SHR) { 10566
10502 // Check if result is negative. This can only happen for a shift 10567 STATIC_ASSERT(kSmiValueSize == 32);
10503 // by zero, which also doesn't update the sign flag. 10568 // Tag smi result and return.
10504 __ testl(rax, rax);
10505 __ j(negative, &non_smi_result);
10506 }
10507 __ JumpIfNotValidSmiValue(rax, &non_smi_result);
10508 // Tag smi result, if possible, and return.
10509 __ Integer32ToSmi(rax, rax); 10569 __ Integer32ToSmi(rax, rax);
10510 GenerateReturn(masm); 10570 GenerateReturn(masm);
10511 10571
10512 // All ops except SHR return a signed int32 that we load in 10572 // All bit-ops except SHR return a signed int32 that can be
10513 // a HeapNumber. 10573 // returned immediately as a smi.
10514 if (op_ != Token::SHR && non_smi_result.is_linked()) { 10574 // We might need to allocate a HeapNumber if we shift a negative
10515 __ bind(&non_smi_result); 10575 // number right by zero (i.e., convert to UInt32).
10576 if (op_ == Token::SHR) {
10577 ASSERT(non_smi_shr_result.is_linked());
10578 __ bind(&non_smi_shr_result);
10516 // Allocate a heap number if needed. 10579 // Allocate a heap number if needed.
10517 __ movsxlq(rbx, rax); // rbx: sign extended 32-bit result 10580 __ movl(rbx, rax); // rbx holds result value (uint32 value as int64).
10518 switch (mode_) { 10581 switch (mode_) {
10519 case OVERWRITE_LEFT: 10582 case OVERWRITE_LEFT:
10520 case OVERWRITE_RIGHT: 10583 case OVERWRITE_RIGHT:
10521 // If the operand was an object, we skip the 10584 // If the operand was an object, we skip the
10522 // allocation of a heap number. 10585 // allocation of a heap number.
10523 __ movq(rax, Operand(rsp, mode_ == OVERWRITE_RIGHT ? 10586 __ movq(rax, Operand(rsp, mode_ == OVERWRITE_RIGHT ?
10524 1 * kPointerSize : 2 * kPointerSize)); 10587 1 * kPointerSize : 2 * kPointerSize));
10525 __ JumpIfNotSmi(rax, &skip_allocation); 10588 __ JumpIfNotSmi(rax, &skip_allocation);
10526 // Fall through! 10589 // Fall through!
10527 case NO_OVERWRITE: 10590 case NO_OVERWRITE:
10528 __ AllocateHeapNumber(rax, rcx, &call_runtime); 10591 // Allocate heap number in new space.
10592 // Not using AllocateHeapNumber macro in order to reuse
10593 // already loaded heap_number_map.
10594 __ AllocateInNewSpace(HeapNumber::kSize,
10595 rax,
10596 rcx,
10597 no_reg,
10598 &call_runtime,
10599 TAG_OBJECT);
10600 // Set the map.
10601 if (FLAG_debug_code) {
10602 __ AbortIfNotRootValue(heap_number_map,
10603 Heap::kHeapNumberMapRootIndex,
10604 "HeapNumberMap register clobbered.");
10605 }
10606 __ movq(FieldOperand(rax, HeapObject::kMapOffset),
10607 heap_number_map);
10529 __ bind(&skip_allocation); 10608 __ bind(&skip_allocation);
10530 break; 10609 break;
10531 default: UNREACHABLE(); 10610 default: UNREACHABLE();
10532 } 10611 }
10533 // Store the result in the HeapNumber and return. 10612 // Store the result in the HeapNumber and return.
10534 __ movq(Operand(rsp, 1 * kPointerSize), rbx); 10613 __ cvtqsi2sd(xmm0, rbx);
10535 __ fild_s(Operand(rsp, 1 * kPointerSize)); 10614 __ movsd(FieldOperand(rax, HeapNumber::kValueOffset), xmm0);
10536 __ fstp_d(FieldOperand(rax, HeapNumber::kValueOffset));
10537 GenerateReturn(masm); 10615 GenerateReturn(masm);
10538 } 10616 }
10539 10617
10540 // SHR should return uint32 - go to runtime for non-smi/negative result.
10541 if (op_ == Token::SHR) {
10542 __ bind(&non_smi_result);
10543 }
10544 break; 10618 break;
10545 } 10619 }
10546 default: UNREACHABLE(); break; 10620 default: UNREACHABLE(); break;
10547 } 10621 }
10548 } 10622 }
10549 10623
10550 // If all else fails, use the runtime system to get the correct 10624 // If all else fails, use the runtime system to get the correct
10551 // result. If arguments was passed in registers now place them on the 10625 // result. If arguments was passed in registers now place them on the
10552 // stack in the correct order below the return address. 10626 // stack in the correct order below the return address.
10553 __ bind(&call_runtime); 10627 __ bind(&call_runtime);
(...skipping 12 matching lines...) Expand all
10566 rhs = rdx; 10640 rhs = rdx;
10567 } else { 10641 } else {
10568 lhs = rdx; 10642 lhs = rdx;
10569 rhs = rax; 10643 rhs = rax;
10570 } 10644 }
10571 10645
10572 // Test for string arguments before calling runtime. 10646 // Test for string arguments before calling runtime.
10573 Label not_strings, both_strings, not_string1, string1, string1_smi2; 10647 Label not_strings, both_strings, not_string1, string1, string1_smi2;
10574 10648
10575 // If this stub has already generated FP-specific code then the arguments 10649 // If this stub has already generated FP-specific code then the arguments
10576 // are already in rdx, rax 10650 // are already in rdx and rax.
10577 if (!ShouldGenerateFPCode() && !HasArgsInRegisters()) { 10651 if (!ShouldGenerateFPCode() && !HasArgsInRegisters()) {
10578 GenerateLoadArguments(masm); 10652 GenerateLoadArguments(masm);
10579 } 10653 }
10580 10654
10581 Condition is_smi; 10655 Condition is_smi;
10582 is_smi = masm->CheckSmi(lhs); 10656 is_smi = masm->CheckSmi(lhs);
10583 __ j(is_smi, &not_string1); 10657 __ j(is_smi, &not_string1);
10584 __ CmpObjectType(lhs, FIRST_NONSTRING_TYPE, r8); 10658 __ CmpObjectType(lhs, FIRST_NONSTRING_TYPE, r8);
10585 __ j(above_equal, &not_string1); 10659 __ j(above_equal, &not_string1);
10586 10660
(...skipping 1260 matching lines...) Expand 10 before | Expand all | Expand 10 after
11847 } 11921 }
11848 11922
11849 #endif 11923 #endif
11850 11924
11851 11925
11852 #undef __ 11926 #undef __
11853 11927
11854 } } // namespace v8::internal 11928 } } // namespace v8::internal
11855 11929
11856 #endif // V8_TARGET_ARCH_X64 11930 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698