OLD | NEW |
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 2122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2133 // Test if left operand is a string. | 2133 // Test if left operand is a string. |
2134 __ JumpIfSmi(left, &call_runtime); | 2134 __ JumpIfSmi(left, &call_runtime); |
2135 __ GetObjectType(left, a2, a2); | 2135 __ GetObjectType(left, a2, a2); |
2136 __ Branch(&call_runtime, ge, a2, Operand(FIRST_NONSTRING_TYPE)); | 2136 __ Branch(&call_runtime, ge, a2, Operand(FIRST_NONSTRING_TYPE)); |
2137 | 2137 |
2138 // Test if right operand is a string. | 2138 // Test if right operand is a string. |
2139 __ JumpIfSmi(right, &call_runtime); | 2139 __ JumpIfSmi(right, &call_runtime); |
2140 __ GetObjectType(right, a2, a2); | 2140 __ GetObjectType(right, a2, a2); |
2141 __ Branch(&call_runtime, ge, a2, Operand(FIRST_NONSTRING_TYPE)); | 2141 __ Branch(&call_runtime, ge, a2, Operand(FIRST_NONSTRING_TYPE)); |
2142 | 2142 |
2143 StringAddStub string_add_stub((StringAddFlags) | 2143 StringAddStub string_add_stub( |
2144 (ERECT_FRAME | NO_STRING_CHECK_IN_STUB)); | 2144 (StringAddFlags)(STRING_ADD_CHECK_NONE | STRING_ADD_ERECT_FRAME)); |
2145 GenerateRegisterArgsPush(masm); | 2145 GenerateRegisterArgsPush(masm); |
2146 __ TailCallStub(&string_add_stub); | 2146 __ TailCallStub(&string_add_stub); |
2147 | 2147 |
2148 __ bind(&call_runtime); | 2148 __ bind(&call_runtime); |
2149 GenerateTypeTransition(masm); | 2149 GenerateTypeTransition(masm); |
2150 } | 2150 } |
2151 | 2151 |
2152 | 2152 |
2153 void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) { | 2153 void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) { |
2154 ASSERT(Max(left_type_, right_type_) == BinaryOpIC::INT32); | 2154 ASSERT(Max(left_type_, right_type_) == BinaryOpIC::INT32); |
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2551 Label left_not_string, call_runtime; | 2551 Label left_not_string, call_runtime; |
2552 | 2552 |
2553 Register left = a1; | 2553 Register left = a1; |
2554 Register right = a0; | 2554 Register right = a0; |
2555 | 2555 |
2556 // Check if left argument is a string. | 2556 // Check if left argument is a string. |
2557 __ JumpIfSmi(left, &left_not_string); | 2557 __ JumpIfSmi(left, &left_not_string); |
2558 __ GetObjectType(left, a2, a2); | 2558 __ GetObjectType(left, a2, a2); |
2559 __ Branch(&left_not_string, ge, a2, Operand(FIRST_NONSTRING_TYPE)); | 2559 __ Branch(&left_not_string, ge, a2, Operand(FIRST_NONSTRING_TYPE)); |
2560 | 2560 |
2561 StringAddStub string_add_left_stub((StringAddFlags) | 2561 StringAddStub string_add_left_stub( |
2562 (ERECT_FRAME | NO_STRING_CHECK_LEFT_IN_STUB)); | 2562 (StringAddFlags)(STRING_ADD_CHECK_RIGHT | STRING_ADD_ERECT_FRAME)); |
2563 GenerateRegisterArgsPush(masm); | 2563 GenerateRegisterArgsPush(masm); |
2564 __ TailCallStub(&string_add_left_stub); | 2564 __ TailCallStub(&string_add_left_stub); |
2565 | 2565 |
2566 // Left operand is not a string, test right. | 2566 // Left operand is not a string, test right. |
2567 __ bind(&left_not_string); | 2567 __ bind(&left_not_string); |
2568 __ JumpIfSmi(right, &call_runtime); | 2568 __ JumpIfSmi(right, &call_runtime); |
2569 __ GetObjectType(right, a2, a2); | 2569 __ GetObjectType(right, a2, a2); |
2570 __ Branch(&call_runtime, ge, a2, Operand(FIRST_NONSTRING_TYPE)); | 2570 __ Branch(&call_runtime, ge, a2, Operand(FIRST_NONSTRING_TYPE)); |
2571 | 2571 |
2572 StringAddStub string_add_right_stub((StringAddFlags) | 2572 StringAddStub string_add_right_stub( |
2573 (ERECT_FRAME | NO_STRING_CHECK_RIGHT_IN_STUB)); | 2573 (StringAddFlags)(STRING_ADD_CHECK_LEFT | STRING_ADD_ERECT_FRAME)); |
2574 GenerateRegisterArgsPush(masm); | 2574 GenerateRegisterArgsPush(masm); |
2575 __ TailCallStub(&string_add_right_stub); | 2575 __ TailCallStub(&string_add_right_stub); |
2576 | 2576 |
2577 // At least one argument is not a string. | 2577 // At least one argument is not a string. |
2578 __ bind(&call_runtime); | 2578 __ bind(&call_runtime); |
2579 } | 2579 } |
2580 | 2580 |
2581 | 2581 |
2582 void BinaryOpStub_GenerateHeapResultAllocation(MacroAssembler* masm, | 2582 void BinaryOpStub_GenerateHeapResultAllocation(MacroAssembler* masm, |
2583 Register result, | 2583 Register result, |
(...skipping 3281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5865 | 5865 |
5866 // Stack on entry: | 5866 // Stack on entry: |
5867 // sp[0]: second argument (right). | 5867 // sp[0]: second argument (right). |
5868 // sp[4]: first argument (left). | 5868 // sp[4]: first argument (left). |
5869 | 5869 |
5870 // Load the two arguments. | 5870 // Load the two arguments. |
5871 __ lw(a0, MemOperand(sp, 1 * kPointerSize)); // First argument. | 5871 __ lw(a0, MemOperand(sp, 1 * kPointerSize)); // First argument. |
5872 __ lw(a1, MemOperand(sp, 0 * kPointerSize)); // Second argument. | 5872 __ lw(a1, MemOperand(sp, 0 * kPointerSize)); // Second argument. |
5873 | 5873 |
5874 // Make sure that both arguments are strings if not known in advance. | 5874 // Make sure that both arguments are strings if not known in advance. |
5875 if ((flags_ & NO_STRING_ADD_FLAGS) != 0) { | 5875 // Otherwise, at least one of the arguments is definitely a string, |
| 5876 // and we convert the one that is not known to be a string. |
| 5877 if ((flags_ & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_BOTH) { |
| 5878 ASSERT((flags_ & STRING_ADD_CHECK_LEFT) == STRING_ADD_CHECK_LEFT); |
| 5879 ASSERT((flags_ & STRING_ADD_CHECK_RIGHT) == STRING_ADD_CHECK_RIGHT); |
5876 __ JumpIfEitherSmi(a0, a1, &call_runtime); | 5880 __ JumpIfEitherSmi(a0, a1, &call_runtime); |
5877 // Load instance types. | 5881 // Load instance types. |
5878 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); | 5882 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); |
5879 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); | 5883 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); |
5880 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); | 5884 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); |
5881 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); | 5885 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); |
5882 STATIC_ASSERT(kStringTag == 0); | 5886 STATIC_ASSERT(kStringTag == 0); |
5883 // If either is not a string, go to runtime. | 5887 // If either is not a string, go to runtime. |
5884 __ Or(t4, t0, Operand(t1)); | 5888 __ Or(t4, t0, Operand(t1)); |
5885 __ And(t4, t4, Operand(kIsNotStringMask)); | 5889 __ And(t4, t4, Operand(kIsNotStringMask)); |
5886 __ Branch(&call_runtime, ne, t4, Operand(zero_reg)); | 5890 __ Branch(&call_runtime, ne, t4, Operand(zero_reg)); |
5887 } else { | 5891 } else if ((flags_ & STRING_ADD_CHECK_LEFT) == STRING_ADD_CHECK_LEFT) { |
5888 // Here at least one of the arguments is definitely a string. | 5892 ASSERT((flags_ & STRING_ADD_CHECK_RIGHT) == 0); |
5889 // We convert the one that is not known to be a string. | 5893 GenerateConvertArgument( |
5890 if ((flags_ & NO_STRING_CHECK_LEFT_IN_STUB) == 0) { | 5894 masm, 1 * kPointerSize, a0, a2, a3, t0, t1, &call_builtin); |
5891 ASSERT((flags_ & NO_STRING_CHECK_RIGHT_IN_STUB) != 0); | 5895 builtin_id = Builtins::STRING_ADD_RIGHT; |
5892 GenerateConvertArgument( | 5896 } else if ((flags_ & STRING_ADD_CHECK_RIGHT) == STRING_ADD_CHECK_RIGHT) { |
5893 masm, 1 * kPointerSize, a0, a2, a3, t0, t1, &call_builtin); | 5897 ASSERT((flags_ & STRING_ADD_CHECK_LEFT) == 0); |
5894 builtin_id = Builtins::STRING_ADD_RIGHT; | 5898 GenerateConvertArgument( |
5895 } else if ((flags_ & NO_STRING_CHECK_RIGHT_IN_STUB) == 0) { | 5899 masm, 0 * kPointerSize, a1, a2, a3, t0, t1, &call_builtin); |
5896 ASSERT((flags_ & NO_STRING_CHECK_LEFT_IN_STUB) != 0); | 5900 builtin_id = Builtins::STRING_ADD_LEFT; |
5897 GenerateConvertArgument( | |
5898 masm, 0 * kPointerSize, a1, a2, a3, t0, t1, &call_builtin); | |
5899 builtin_id = Builtins::STRING_ADD_LEFT; | |
5900 } | |
5901 } | 5901 } |
5902 | 5902 |
5903 // Both arguments are strings. | 5903 // Both arguments are strings. |
5904 // a0: first string | 5904 // a0: first string |
5905 // a1: second string | 5905 // a1: second string |
5906 // t0: first string instance type (if flags_ == NO_STRING_ADD_FLAGS) | 5906 // t0: first string instance type (if flags_ == NO_STRING_ADD_FLAGS) |
5907 // t1: second string instance type (if flags_ == NO_STRING_ADD_FLAGS) | 5907 // t1: second string instance type (if flags_ == NO_STRING_ADD_FLAGS) |
5908 { | 5908 { |
5909 Label strings_not_empty; | 5909 Label strings_not_empty; |
5910 // Check if either of the strings are empty. In that case return the other. | 5910 // Check if either of the strings are empty. In that case return the other. |
(...skipping 30 matching lines...) Expand all Loading... |
5941 // Look at the length of the result of adding the two strings. | 5941 // Look at the length of the result of adding the two strings. |
5942 Label string_add_flat_result, longer_than_two; | 5942 Label string_add_flat_result, longer_than_two; |
5943 // Adding two lengths can't overflow. | 5943 // Adding two lengths can't overflow. |
5944 STATIC_ASSERT(String::kMaxLength < String::kMaxLength * 2); | 5944 STATIC_ASSERT(String::kMaxLength < String::kMaxLength * 2); |
5945 __ Addu(t2, a2, Operand(a3)); | 5945 __ Addu(t2, a2, Operand(a3)); |
5946 // Use the string table when adding two one character strings, as it | 5946 // Use the string table when adding two one character strings, as it |
5947 // helps later optimizations to return a string here. | 5947 // helps later optimizations to return a string here. |
5948 __ Branch(&longer_than_two, ne, t2, Operand(2)); | 5948 __ Branch(&longer_than_two, ne, t2, Operand(2)); |
5949 | 5949 |
5950 // Check that both strings are non-external ASCII strings. | 5950 // Check that both strings are non-external ASCII strings. |
5951 if (flags_ != NO_STRING_ADD_FLAGS) { | 5951 if ((flags_ & STRING_ADD_CHECK_BOTH) != STRING_ADD_CHECK_BOTH) { |
5952 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); | 5952 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); |
5953 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); | 5953 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); |
5954 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); | 5954 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); |
5955 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); | 5955 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); |
5956 } | 5956 } |
5957 __ JumpIfBothInstanceTypesAreNotSequentialAscii(t0, t1, t2, t3, | 5957 __ JumpIfBothInstanceTypesAreNotSequentialAscii(t0, t1, t2, t3, |
5958 &call_runtime); | 5958 &call_runtime); |
5959 | 5959 |
5960 // Get the two characters forming the sub string. | 5960 // Get the two characters forming the sub string. |
5961 __ lbu(a2, FieldMemOperand(a0, SeqOneByteString::kHeaderSize)); | 5961 __ lbu(a2, FieldMemOperand(a0, SeqOneByteString::kHeaderSize)); |
(...skipping 23 matching lines...) Expand all Loading... |
5985 // Check if resulting string will be flat. | 5985 // Check if resulting string will be flat. |
5986 __ Branch(&string_add_flat_result, lt, t2, Operand(ConsString::kMinLength)); | 5986 __ Branch(&string_add_flat_result, lt, t2, Operand(ConsString::kMinLength)); |
5987 // Handle exceptionally long strings in the runtime system. | 5987 // Handle exceptionally long strings in the runtime system. |
5988 STATIC_ASSERT((String::kMaxLength & 0x80000000) == 0); | 5988 STATIC_ASSERT((String::kMaxLength & 0x80000000) == 0); |
5989 ASSERT(IsPowerOf2(String::kMaxLength + 1)); | 5989 ASSERT(IsPowerOf2(String::kMaxLength + 1)); |
5990 // kMaxLength + 1 is representable as shifted literal, kMaxLength is not. | 5990 // kMaxLength + 1 is representable as shifted literal, kMaxLength is not. |
5991 __ Branch(&call_runtime, hs, t2, Operand(String::kMaxLength + 1)); | 5991 __ Branch(&call_runtime, hs, t2, Operand(String::kMaxLength + 1)); |
5992 | 5992 |
5993 // If result is not supposed to be flat, allocate a cons string object. | 5993 // If result is not supposed to be flat, allocate a cons string object. |
5994 // If both strings are ASCII the result is an ASCII cons string. | 5994 // If both strings are ASCII the result is an ASCII cons string. |
5995 if (flags_ != NO_STRING_ADD_FLAGS) { | 5995 if ((flags_ & STRING_ADD_CHECK_BOTH) != STRING_ADD_CHECK_BOTH) { |
5996 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); | 5996 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); |
5997 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); | 5997 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); |
5998 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); | 5998 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); |
5999 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); | 5999 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); |
6000 } | 6000 } |
6001 Label non_ascii, allocated, ascii_data; | 6001 Label non_ascii, allocated, ascii_data; |
6002 STATIC_ASSERT(kTwoByteStringTag == 0); | 6002 STATIC_ASSERT(kTwoByteStringTag == 0); |
6003 // Branch to non_ascii if either string-encoding field is zero (non-ASCII). | 6003 // Branch to non_ascii if either string-encoding field is zero (non-ASCII). |
6004 __ And(t4, t0, Operand(t1)); | 6004 __ And(t4, t0, Operand(t1)); |
6005 __ And(t4, t4, Operand(kStringEncodingMask)); | 6005 __ And(t4, t4, Operand(kStringEncodingMask)); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6068 // Locate the first characters' locations. | 6068 // Locate the first characters' locations. |
6069 // a0: first string | 6069 // a0: first string |
6070 // a1: second string | 6070 // a1: second string |
6071 // a2: length of first string | 6071 // a2: length of first string |
6072 // a3: length of second string | 6072 // a3: length of second string |
6073 // t0: first string instance type (if flags_ == NO_STRING_ADD_FLAGS) | 6073 // t0: first string instance type (if flags_ == NO_STRING_ADD_FLAGS) |
6074 // t1: second string instance type (if flags_ == NO_STRING_ADD_FLAGS) | 6074 // t1: second string instance type (if flags_ == NO_STRING_ADD_FLAGS) |
6075 // t2: sum of lengths. | 6075 // t2: sum of lengths. |
6076 Label first_prepared, second_prepared; | 6076 Label first_prepared, second_prepared; |
6077 __ bind(&string_add_flat_result); | 6077 __ bind(&string_add_flat_result); |
6078 if (flags_ != NO_STRING_ADD_FLAGS) { | 6078 if ((flags_ & STRING_ADD_CHECK_BOTH) != STRING_ADD_CHECK_BOTH) { |
6079 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); | 6079 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); |
6080 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); | 6080 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); |
6081 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); | 6081 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); |
6082 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); | 6082 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); |
6083 } | 6083 } |
6084 // Check whether both strings have same encoding | 6084 // Check whether both strings have same encoding |
6085 __ Xor(t3, t0, Operand(t1)); | 6085 __ Xor(t3, t0, Operand(t1)); |
6086 __ And(t3, t3, Operand(kStringEncodingMask)); | 6086 __ And(t3, t3, Operand(kStringEncodingMask)); |
6087 __ Branch(&call_runtime, ne, t3, Operand(zero_reg)); | 6087 __ Branch(&call_runtime, ne, t3, Operand(zero_reg)); |
6088 | 6088 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6154 // t2: first character of result. | 6154 // t2: first character of result. |
6155 StringHelper::GenerateCopyCharacters(masm, t2, t3, a2, t0, false); | 6155 StringHelper::GenerateCopyCharacters(masm, t2, t3, a2, t0, false); |
6156 // t2: next character of result. | 6156 // t2: next character of result. |
6157 StringHelper::GenerateCopyCharacters(masm, t2, a1, a3, t0, false); | 6157 StringHelper::GenerateCopyCharacters(masm, t2, a1, a3, t0, false); |
6158 | 6158 |
6159 __ IncrementCounter(counters->string_add_native(), 1, a2, a3); | 6159 __ IncrementCounter(counters->string_add_native(), 1, a2, a3); |
6160 __ DropAndRet(2); | 6160 __ DropAndRet(2); |
6161 | 6161 |
6162 // Just jump to runtime to add the two strings. | 6162 // Just jump to runtime to add the two strings. |
6163 __ bind(&call_runtime); | 6163 __ bind(&call_runtime); |
6164 if ((flags_ & ERECT_FRAME) != 0) { | 6164 if ((flags_ & STRING_ADD_ERECT_FRAME) != 0) { |
6165 GenerateRegisterArgsPop(masm); | 6165 GenerateRegisterArgsPop(masm); |
6166 // Build a frame. | 6166 // Build a frame. |
6167 { | 6167 { |
6168 FrameScope scope(masm, StackFrame::INTERNAL); | 6168 FrameScope scope(masm, StackFrame::INTERNAL); |
6169 GenerateRegisterArgsPush(masm); | 6169 GenerateRegisterArgsPush(masm); |
6170 __ CallRuntime(Runtime::kStringAdd, 2); | 6170 __ CallRuntime(Runtime::kStringAdd, 2); |
6171 } | 6171 } |
6172 __ Ret(); | 6172 __ Ret(); |
6173 } else { | 6173 } else { |
6174 __ TailCallRuntime(Runtime::kStringAdd, 2, 1); | 6174 __ TailCallRuntime(Runtime::kStringAdd, 2, 1); |
6175 } | 6175 } |
6176 | 6176 |
6177 if (call_builtin.is_linked()) { | 6177 if (call_builtin.is_linked()) { |
6178 __ bind(&call_builtin); | 6178 __ bind(&call_builtin); |
6179 if ((flags_ & ERECT_FRAME) != 0) { | 6179 if ((flags_ & STRING_ADD_ERECT_FRAME) != 0) { |
6180 GenerateRegisterArgsPop(masm); | 6180 GenerateRegisterArgsPop(masm); |
6181 // Build a frame. | 6181 // Build a frame. |
6182 { | 6182 { |
6183 FrameScope scope(masm, StackFrame::INTERNAL); | 6183 FrameScope scope(masm, StackFrame::INTERNAL); |
6184 GenerateRegisterArgsPush(masm); | 6184 GenerateRegisterArgsPush(masm); |
6185 __ InvokeBuiltin(builtin_id, CALL_FUNCTION); | 6185 __ InvokeBuiltin(builtin_id, CALL_FUNCTION); |
6186 } | 6186 } |
6187 __ Ret(); | 6187 __ Ret(); |
6188 } else { | 6188 } else { |
6189 __ InvokeBuiltin(builtin_id, JUMP_FUNCTION); | 6189 __ InvokeBuiltin(builtin_id, JUMP_FUNCTION); |
(...skipping 1430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7620 __ bind(&fast_elements_case); | 7620 __ bind(&fast_elements_case); |
7621 GenerateCase(masm, FAST_ELEMENTS); | 7621 GenerateCase(masm, FAST_ELEMENTS); |
7622 } | 7622 } |
7623 | 7623 |
7624 | 7624 |
7625 #undef __ | 7625 #undef __ |
7626 | 7626 |
7627 } } // namespace v8::internal | 7627 } } // namespace v8::internal |
7628 | 7628 |
7629 #endif // V8_TARGET_ARCH_MIPS | 7629 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |