| 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 |