OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 6473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6484 // in a little endian mode). | 6484 // in a little endian mode). |
6485 __ li(t2, Operand(2)); | 6485 __ li(t2, Operand(2)); |
6486 __ AllocateAsciiString(v0, t2, t0, t1, t5, &call_runtime); | 6486 __ AllocateAsciiString(v0, t2, t0, t1, t5, &call_runtime); |
6487 __ sh(a2, FieldMemOperand(v0, SeqAsciiString::kHeaderSize)); | 6487 __ sh(a2, FieldMemOperand(v0, SeqAsciiString::kHeaderSize)); |
6488 __ IncrementCounter(counters->string_add_native(), 1, a2, a3); | 6488 __ IncrementCounter(counters->string_add_native(), 1, a2, a3); |
6489 __ DropAndRet(2); | 6489 __ DropAndRet(2); |
6490 | 6490 |
6491 __ bind(&longer_than_two); | 6491 __ bind(&longer_than_two); |
6492 // Check if resulting string will be flat. | 6492 // Check if resulting string will be flat. |
6493 __ Branch(&string_add_flat_result, lt, t2, | 6493 __ Branch(&string_add_flat_result, lt, t2, |
6494 Operand(String::kMinNonFlatLength)); | 6494 Operand(ConsString::kMinLength)); |
6495 // Handle exceptionally long strings in the runtime system. | 6495 // Handle exceptionally long strings in the runtime system. |
6496 STATIC_ASSERT((String::kMaxLength & 0x80000000) == 0); | 6496 STATIC_ASSERT((String::kMaxLength & 0x80000000) == 0); |
6497 ASSERT(IsPowerOf2(String::kMaxLength + 1)); | 6497 ASSERT(IsPowerOf2(String::kMaxLength + 1)); |
6498 // kMaxLength + 1 is representable as shifted literal, kMaxLength is not. | 6498 // kMaxLength + 1 is representable as shifted literal, kMaxLength is not. |
6499 __ Branch(&call_runtime, hs, t2, Operand(String::kMaxLength + 1)); | 6499 __ Branch(&call_runtime, hs, t2, Operand(String::kMaxLength + 1)); |
6500 | 6500 |
6501 // If result is not supposed to be flat, allocate a cons string object. | 6501 // If result is not supposed to be flat, allocate a cons string object. |
6502 // If both strings are ASCII the result is an ASCII cons string. | 6502 // If both strings are ASCII the result is an ASCII cons string. |
6503 if (flags_ != NO_STRING_ADD_FLAGS) { | 6503 if (flags_ != NO_STRING_ADD_FLAGS) { |
6504 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); | 6504 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6536 __ xor_(t0, t0, t1); | 6536 __ xor_(t0, t0, t1); |
6537 STATIC_ASSERT(kAsciiStringTag != 0 && kAsciiDataHintTag != 0); | 6537 STATIC_ASSERT(kAsciiStringTag != 0 && kAsciiDataHintTag != 0); |
6538 __ And(t0, t0, Operand(kAsciiStringTag | kAsciiDataHintTag)); | 6538 __ And(t0, t0, Operand(kAsciiStringTag | kAsciiDataHintTag)); |
6539 __ Branch(&ascii_data, eq, t0, Operand(kAsciiStringTag | kAsciiDataHintTag)); | 6539 __ Branch(&ascii_data, eq, t0, Operand(kAsciiStringTag | kAsciiDataHintTag)); |
6540 | 6540 |
6541 // Allocate a two byte cons string. | 6541 // Allocate a two byte cons string. |
6542 __ AllocateTwoByteConsString(v0, t2, t0, t1, &call_runtime); | 6542 __ AllocateTwoByteConsString(v0, t2, t0, t1, &call_runtime); |
6543 __ Branch(&allocated); | 6543 __ Branch(&allocated); |
6544 | 6544 |
6545 // We cannot encounter sliced strings or cons strings here since: | 6545 // We cannot encounter sliced strings or cons strings here since: |
6546 STATIC_ASSERT(SlicedString::kMinLength >= String::kMinNonFlatLength); | 6546 STATIC_ASSERT(SlicedString::kMinLength >= ConsString::kMinLength); |
6547 // Handle creating a flat result from either external or sequential strings. | 6547 // Handle creating a flat result from either external or sequential strings. |
6548 // Locate the first characters' locations. | 6548 // Locate the first characters' locations. |
6549 // a0: first string | 6549 // a0: first string |
6550 // a1: second string | 6550 // a1: second string |
6551 // a2: length of first string | 6551 // a2: length of first string |
6552 // a3: length of second string | 6552 // a3: length of second string |
6553 // t0: first string instance type (if flags_ == NO_STRING_ADD_FLAGS) | 6553 // t0: first string instance type (if flags_ == NO_STRING_ADD_FLAGS) |
6554 // t1: second string instance type (if flags_ == NO_STRING_ADD_FLAGS) | 6554 // t1: second string instance type (if flags_ == NO_STRING_ADD_FLAGS) |
6555 // t2: sum of lengths. | 6555 // t2: sum of lengths. |
6556 Label first_prepared, second_prepared; | 6556 Label first_prepared, second_prepared; |
(...skipping 1024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7581 __ Ret(USE_DELAY_SLOT); | 7581 __ Ret(USE_DELAY_SLOT); |
7582 __ mov(v0, a0); | 7582 __ mov(v0, a0); |
7583 } | 7583 } |
7584 | 7584 |
7585 | 7585 |
7586 #undef __ | 7586 #undef __ |
7587 | 7587 |
7588 } } // namespace v8::internal | 7588 } } // namespace v8::internal |
7589 | 7589 |
7590 #endif // V8_TARGET_ARCH_MIPS | 7590 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |