| 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 5304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5315 // Sequential strings have already been ruled out. | 5315 // Sequential strings have already been ruled out. |
| 5316 __ And(at, a0, Operand(kIsIndirectStringMask)); | 5316 __ And(at, a0, Operand(kIsIndirectStringMask)); |
| 5317 __ Assert(eq, | 5317 __ Assert(eq, |
| 5318 "external string expected, but not found", | 5318 "external string expected, but not found", |
| 5319 at, | 5319 at, |
| 5320 Operand(zero_reg)); | 5320 Operand(zero_reg)); |
| 5321 } | 5321 } |
| 5322 __ lw(subject, | 5322 __ lw(subject, |
| 5323 FieldMemOperand(subject, ExternalString::kResourceDataOffset)); | 5323 FieldMemOperand(subject, ExternalString::kResourceDataOffset)); |
| 5324 // Move the pointer so that offset-wise, it looks like a sequential string. | 5324 // Move the pointer so that offset-wise, it looks like a sequential string. |
| 5325 STATIC_ASSERT(SeqTwoByteString::kHeaderSize == SeqAsciiString::kHeaderSize); | 5325 STATIC_ASSERT(SeqTwoByteString::kHeaderSize == SeqOneByteString::kHeaderSize); |
| 5326 __ Subu(subject, | 5326 __ Subu(subject, |
| 5327 subject, | 5327 subject, |
| 5328 SeqTwoByteString::kHeaderSize - kHeapObjectTag); | 5328 SeqTwoByteString::kHeaderSize - kHeapObjectTag); |
| 5329 __ jmp(&seq_string); | 5329 __ jmp(&seq_string); |
| 5330 | 5330 |
| 5331 // Do the runtime call to execute the regexp. | 5331 // Do the runtime call to execute the regexp. |
| 5332 __ bind(&runtime); | 5332 __ bind(&runtime); |
| 5333 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); | 5333 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); |
| 5334 #endif // V8_INTERPRETED_REGEXP | 5334 #endif // V8_INTERPRETED_REGEXP |
| 5335 } | 5335 } |
| (...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6064 // type is still in the scratch register from the CompareObjectType | 6064 // type is still in the scratch register from the CompareObjectType |
| 6065 // operation. | 6065 // operation. |
| 6066 __ JumpIfInstanceTypeIsNotSequentialAscii(scratch, scratch, &next_probe[i]); | 6066 __ JumpIfInstanceTypeIsNotSequentialAscii(scratch, scratch, &next_probe[i]); |
| 6067 | 6067 |
| 6068 // If length is not 2 the string is not a candidate. | 6068 // If length is not 2 the string is not a candidate. |
| 6069 __ lw(scratch, FieldMemOperand(candidate, String::kLengthOffset)); | 6069 __ lw(scratch, FieldMemOperand(candidate, String::kLengthOffset)); |
| 6070 __ Branch(&next_probe[i], ne, scratch, Operand(Smi::FromInt(2))); | 6070 __ Branch(&next_probe[i], ne, scratch, Operand(Smi::FromInt(2))); |
| 6071 | 6071 |
| 6072 // Check if the two characters match. | 6072 // Check if the two characters match. |
| 6073 // Assumes that word load is little endian. | 6073 // Assumes that word load is little endian. |
| 6074 __ lhu(scratch, FieldMemOperand(candidate, SeqAsciiString::kHeaderSize)); | 6074 __ lhu(scratch, FieldMemOperand(candidate, SeqOneByteString::kHeaderSize)); |
| 6075 __ Branch(&found_in_symbol_table, eq, chars, Operand(scratch)); | 6075 __ Branch(&found_in_symbol_table, eq, chars, Operand(scratch)); |
| 6076 __ bind(&next_probe[i]); | 6076 __ bind(&next_probe[i]); |
| 6077 } | 6077 } |
| 6078 | 6078 |
| 6079 // No matching 2 character string found by probing. | 6079 // No matching 2 character string found by probing. |
| 6080 __ jmp(not_found); | 6080 __ jmp(not_found); |
| 6081 | 6081 |
| 6082 // Scratch register contains result when we fall through to here. | 6082 // Scratch register contains result when we fall through to here. |
| 6083 Register result = candidate; | 6083 Register result = candidate; |
| 6084 __ bind(&found_in_symbol_table); | 6084 __ bind(&found_in_symbol_table); |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6281 // Rule out short external strings. | 6281 // Rule out short external strings. |
| 6282 STATIC_CHECK(kShortExternalStringTag != 0); | 6282 STATIC_CHECK(kShortExternalStringTag != 0); |
| 6283 __ And(t0, a1, Operand(kShortExternalStringTag)); | 6283 __ And(t0, a1, Operand(kShortExternalStringTag)); |
| 6284 __ Branch(&runtime, ne, t0, Operand(zero_reg)); | 6284 __ Branch(&runtime, ne, t0, Operand(zero_reg)); |
| 6285 __ lw(t1, FieldMemOperand(t1, ExternalString::kResourceDataOffset)); | 6285 __ lw(t1, FieldMemOperand(t1, ExternalString::kResourceDataOffset)); |
| 6286 // t1 already points to the first character of underlying string. | 6286 // t1 already points to the first character of underlying string. |
| 6287 __ jmp(&allocate_result); | 6287 __ jmp(&allocate_result); |
| 6288 | 6288 |
| 6289 __ bind(&sequential_string); | 6289 __ bind(&sequential_string); |
| 6290 // Locate first character of underlying subject string. | 6290 // Locate first character of underlying subject string. |
| 6291 STATIC_ASSERT(SeqTwoByteString::kHeaderSize == SeqAsciiString::kHeaderSize); | 6291 STATIC_ASSERT(SeqTwoByteString::kHeaderSize == SeqOneByteString::kHeaderSize); |
| 6292 __ Addu(t1, t1, Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag)); | 6292 __ Addu(t1, t1, Operand(SeqOneByteString::kHeaderSize - kHeapObjectTag)); |
| 6293 | 6293 |
| 6294 __ bind(&allocate_result); | 6294 __ bind(&allocate_result); |
| 6295 // Sequential acii string. Allocate the result. | 6295 // Sequential acii string. Allocate the result. |
| 6296 STATIC_ASSERT((kOneByteStringTag & kStringEncodingMask) != 0); | 6296 STATIC_ASSERT((kOneByteStringTag & kStringEncodingMask) != 0); |
| 6297 __ And(t0, a1, Operand(kStringEncodingMask)); | 6297 __ And(t0, a1, Operand(kStringEncodingMask)); |
| 6298 __ Branch(&two_byte_sequential, eq, t0, Operand(zero_reg)); | 6298 __ Branch(&two_byte_sequential, eq, t0, Operand(zero_reg)); |
| 6299 | 6299 |
| 6300 // Allocate and copy the resulting ASCII string. | 6300 // Allocate and copy the resulting ASCII string. |
| 6301 __ AllocateAsciiString(v0, a2, t0, t2, t3, &runtime); | 6301 __ AllocateAsciiString(v0, a2, t0, t2, t3, &runtime); |
| 6302 | 6302 |
| 6303 // Locate first character of substring to copy. | 6303 // Locate first character of substring to copy. |
| 6304 __ Addu(t1, t1, a3); | 6304 __ Addu(t1, t1, a3); |
| 6305 | 6305 |
| 6306 // Locate first character of result. | 6306 // Locate first character of result. |
| 6307 __ Addu(a1, v0, Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag)); | 6307 __ Addu(a1, v0, Operand(SeqOneByteString::kHeaderSize - kHeapObjectTag)); |
| 6308 | 6308 |
| 6309 // v0: result string | 6309 // v0: result string |
| 6310 // a1: first character of result string | 6310 // a1: first character of result string |
| 6311 // a2: result string length | 6311 // a2: result string length |
| 6312 // t1: first character of substring to copy | 6312 // t1: first character of substring to copy |
| 6313 STATIC_ASSERT((SeqAsciiString::kHeaderSize & kObjectAlignmentMask) == 0); | 6313 STATIC_ASSERT((SeqOneByteString::kHeaderSize & kObjectAlignmentMask) == 0); |
| 6314 StringHelper::GenerateCopyCharactersLong( | 6314 StringHelper::GenerateCopyCharactersLong( |
| 6315 masm, a1, t1, a2, a3, t0, t2, t3, t4, COPY_ASCII | DEST_ALWAYS_ALIGNED); | 6315 masm, a1, t1, a2, a3, t0, t2, t3, t4, COPY_ASCII | DEST_ALWAYS_ALIGNED); |
| 6316 __ jmp(&return_v0); | 6316 __ jmp(&return_v0); |
| 6317 | 6317 |
| 6318 // Allocate and copy the resulting two-byte string. | 6318 // Allocate and copy the resulting two-byte string. |
| 6319 __ bind(&two_byte_sequential); | 6319 __ bind(&two_byte_sequential); |
| 6320 __ AllocateTwoByteString(v0, a2, t0, t2, t3, &runtime); | 6320 __ AllocateTwoByteString(v0, a2, t0, t2, t3, &runtime); |
| 6321 | 6321 |
| 6322 // Locate first character of substring to copy. | 6322 // Locate first character of substring to copy. |
| 6323 STATIC_ASSERT(kSmiTagSize == 1 && kSmiTag == 0); | 6323 STATIC_ASSERT(kSmiTagSize == 1 && kSmiTag == 0); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6435 Register length, | 6435 Register length, |
| 6436 Register scratch1, | 6436 Register scratch1, |
| 6437 Register scratch2, | 6437 Register scratch2, |
| 6438 Register scratch3, | 6438 Register scratch3, |
| 6439 Label* chars_not_equal) { | 6439 Label* chars_not_equal) { |
| 6440 // Change index to run from -length to -1 by adding length to string | 6440 // Change index to run from -length to -1 by adding length to string |
| 6441 // start. This means that loop ends when index reaches zero, which | 6441 // start. This means that loop ends when index reaches zero, which |
| 6442 // doesn't need an additional compare. | 6442 // doesn't need an additional compare. |
| 6443 __ SmiUntag(length); | 6443 __ SmiUntag(length); |
| 6444 __ Addu(scratch1, length, | 6444 __ Addu(scratch1, length, |
| 6445 Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag)); | 6445 Operand(SeqOneByteString::kHeaderSize - kHeapObjectTag)); |
| 6446 __ Addu(left, left, Operand(scratch1)); | 6446 __ Addu(left, left, Operand(scratch1)); |
| 6447 __ Addu(right, right, Operand(scratch1)); | 6447 __ Addu(right, right, Operand(scratch1)); |
| 6448 __ Subu(length, zero_reg, length); | 6448 __ Subu(length, zero_reg, length); |
| 6449 Register index = length; // index = -length; | 6449 Register index = length; // index = -length; |
| 6450 | 6450 |
| 6451 | 6451 |
| 6452 // Compare loop. | 6452 // Compare loop. |
| 6453 Label loop; | 6453 Label loop; |
| 6454 __ bind(&loop); | 6454 __ bind(&loop); |
| 6455 __ Addu(scratch3, left, index); | 6455 __ Addu(scratch3, left, index); |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6590 if (flags_ != NO_STRING_ADD_FLAGS) { | 6590 if (flags_ != NO_STRING_ADD_FLAGS) { |
| 6591 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); | 6591 __ lw(t0, FieldMemOperand(a0, HeapObject::kMapOffset)); |
| 6592 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); | 6592 __ lw(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); |
| 6593 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); | 6593 __ lbu(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); |
| 6594 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); | 6594 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); |
| 6595 } | 6595 } |
| 6596 __ JumpIfBothInstanceTypesAreNotSequentialAscii(t0, t1, t2, t3, | 6596 __ JumpIfBothInstanceTypesAreNotSequentialAscii(t0, t1, t2, t3, |
| 6597 &call_runtime); | 6597 &call_runtime); |
| 6598 | 6598 |
| 6599 // Get the two characters forming the sub string. | 6599 // Get the two characters forming the sub string. |
| 6600 __ lbu(a2, FieldMemOperand(a0, SeqAsciiString::kHeaderSize)); | 6600 __ lbu(a2, FieldMemOperand(a0, SeqOneByteString::kHeaderSize)); |
| 6601 __ lbu(a3, FieldMemOperand(a1, SeqAsciiString::kHeaderSize)); | 6601 __ lbu(a3, FieldMemOperand(a1, SeqOneByteString::kHeaderSize)); |
| 6602 | 6602 |
| 6603 // Try to lookup two character string in symbol table. If it is not found | 6603 // Try to lookup two character string in symbol table. If it is not found |
| 6604 // just allocate a new one. | 6604 // just allocate a new one. |
| 6605 Label make_two_character_string; | 6605 Label make_two_character_string; |
| 6606 StringHelper::GenerateTwoCharacterSymbolTableProbe( | 6606 StringHelper::GenerateTwoCharacterSymbolTableProbe( |
| 6607 masm, a2, a3, t2, t3, t0, t1, t5, &make_two_character_string); | 6607 masm, a2, a3, t2, t3, t0, t1, t5, &make_two_character_string); |
| 6608 __ IncrementCounter(counters->string_add_native(), 1, a2, a3); | 6608 __ IncrementCounter(counters->string_add_native(), 1, a2, a3); |
| 6609 __ DropAndRet(2); | 6609 __ DropAndRet(2); |
| 6610 | 6610 |
| 6611 __ bind(&make_two_character_string); | 6611 __ bind(&make_two_character_string); |
| 6612 // Resulting string has length 2 and first chars of two strings | 6612 // Resulting string has length 2 and first chars of two strings |
| 6613 // are combined into single halfword in a2 register. | 6613 // are combined into single halfword in a2 register. |
| 6614 // So we can fill resulting string without two loops by a single | 6614 // So we can fill resulting string without two loops by a single |
| 6615 // halfword store instruction (which assumes that processor is | 6615 // halfword store instruction (which assumes that processor is |
| 6616 // in a little endian mode). | 6616 // in a little endian mode). |
| 6617 __ li(t2, Operand(2)); | 6617 __ li(t2, Operand(2)); |
| 6618 __ AllocateAsciiString(v0, t2, t0, t1, t5, &call_runtime); | 6618 __ AllocateAsciiString(v0, t2, t0, t1, t5, &call_runtime); |
| 6619 __ sh(a2, FieldMemOperand(v0, SeqAsciiString::kHeaderSize)); | 6619 __ sh(a2, FieldMemOperand(v0, SeqOneByteString::kHeaderSize)); |
| 6620 __ IncrementCounter(counters->string_add_native(), 1, a2, a3); | 6620 __ IncrementCounter(counters->string_add_native(), 1, a2, a3); |
| 6621 __ DropAndRet(2); | 6621 __ DropAndRet(2); |
| 6622 | 6622 |
| 6623 __ bind(&longer_than_two); | 6623 __ bind(&longer_than_two); |
| 6624 // Check if resulting string will be flat. | 6624 // Check if resulting string will be flat. |
| 6625 __ Branch(&string_add_flat_result, lt, t2, Operand(ConsString::kMinLength)); | 6625 __ Branch(&string_add_flat_result, lt, t2, Operand(ConsString::kMinLength)); |
| 6626 // Handle exceptionally long strings in the runtime system. | 6626 // Handle exceptionally long strings in the runtime system. |
| 6627 STATIC_ASSERT((String::kMaxLength & 0x80000000) == 0); | 6627 STATIC_ASSERT((String::kMaxLength & 0x80000000) == 0); |
| 6628 ASSERT(IsPowerOf2(String::kMaxLength + 1)); | 6628 ASSERT(IsPowerOf2(String::kMaxLength + 1)); |
| 6629 // kMaxLength + 1 is representable as shifted literal, kMaxLength is not. | 6629 // kMaxLength + 1 is representable as shifted literal, kMaxLength is not. |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6694 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); | 6694 __ lbu(t1, FieldMemOperand(t1, Map::kInstanceTypeOffset)); |
| 6695 } | 6695 } |
| 6696 // Check whether both strings have same encoding | 6696 // Check whether both strings have same encoding |
| 6697 __ Xor(t3, t0, Operand(t1)); | 6697 __ Xor(t3, t0, Operand(t1)); |
| 6698 __ And(t3, t3, Operand(kStringEncodingMask)); | 6698 __ And(t3, t3, Operand(kStringEncodingMask)); |
| 6699 __ Branch(&call_runtime, ne, t3, Operand(zero_reg)); | 6699 __ Branch(&call_runtime, ne, t3, Operand(zero_reg)); |
| 6700 | 6700 |
| 6701 STATIC_ASSERT(kSeqStringTag == 0); | 6701 STATIC_ASSERT(kSeqStringTag == 0); |
| 6702 __ And(t4, t0, Operand(kStringRepresentationMask)); | 6702 __ And(t4, t0, Operand(kStringRepresentationMask)); |
| 6703 | 6703 |
| 6704 STATIC_ASSERT(SeqAsciiString::kHeaderSize == SeqTwoByteString::kHeaderSize); | 6704 STATIC_ASSERT(SeqOneByteString::kHeaderSize == SeqTwoByteString::kHeaderSize); |
| 6705 Label skip_first_add; | 6705 Label skip_first_add; |
| 6706 __ Branch(&skip_first_add, ne, t4, Operand(zero_reg)); | 6706 __ Branch(&skip_first_add, ne, t4, Operand(zero_reg)); |
| 6707 __ Branch(USE_DELAY_SLOT, &first_prepared); | 6707 __ Branch(USE_DELAY_SLOT, &first_prepared); |
| 6708 __ addiu(t3, a0, SeqAsciiString::kHeaderSize - kHeapObjectTag); | 6708 __ addiu(t3, a0, SeqOneByteString::kHeaderSize - kHeapObjectTag); |
| 6709 __ bind(&skip_first_add); | 6709 __ bind(&skip_first_add); |
| 6710 // External string: rule out short external string and load string resource. | 6710 // External string: rule out short external string and load string resource. |
| 6711 STATIC_ASSERT(kShortExternalStringTag != 0); | 6711 STATIC_ASSERT(kShortExternalStringTag != 0); |
| 6712 __ And(t4, t0, Operand(kShortExternalStringMask)); | 6712 __ And(t4, t0, Operand(kShortExternalStringMask)); |
| 6713 __ Branch(&call_runtime, ne, t4, Operand(zero_reg)); | 6713 __ Branch(&call_runtime, ne, t4, Operand(zero_reg)); |
| 6714 __ lw(t3, FieldMemOperand(a0, ExternalString::kResourceDataOffset)); | 6714 __ lw(t3, FieldMemOperand(a0, ExternalString::kResourceDataOffset)); |
| 6715 __ bind(&first_prepared); | 6715 __ bind(&first_prepared); |
| 6716 | 6716 |
| 6717 STATIC_ASSERT(kSeqStringTag == 0); | 6717 STATIC_ASSERT(kSeqStringTag == 0); |
| 6718 __ And(t4, t1, Operand(kStringRepresentationMask)); | 6718 __ And(t4, t1, Operand(kStringRepresentationMask)); |
| 6719 STATIC_ASSERT(SeqAsciiString::kHeaderSize == SeqTwoByteString::kHeaderSize); | 6719 STATIC_ASSERT(SeqOneByteString::kHeaderSize == SeqTwoByteString::kHeaderSize); |
| 6720 Label skip_second_add; | 6720 Label skip_second_add; |
| 6721 __ Branch(&skip_second_add, ne, t4, Operand(zero_reg)); | 6721 __ Branch(&skip_second_add, ne, t4, Operand(zero_reg)); |
| 6722 __ Branch(USE_DELAY_SLOT, &second_prepared); | 6722 __ Branch(USE_DELAY_SLOT, &second_prepared); |
| 6723 __ addiu(a1, a1, SeqAsciiString::kHeaderSize - kHeapObjectTag); | 6723 __ addiu(a1, a1, SeqOneByteString::kHeaderSize - kHeapObjectTag); |
| 6724 __ bind(&skip_second_add); | 6724 __ bind(&skip_second_add); |
| 6725 // External string: rule out short external string and load string resource. | 6725 // External string: rule out short external string and load string resource. |
| 6726 STATIC_ASSERT(kShortExternalStringTag != 0); | 6726 STATIC_ASSERT(kShortExternalStringTag != 0); |
| 6727 __ And(t4, t1, Operand(kShortExternalStringMask)); | 6727 __ And(t4, t1, Operand(kShortExternalStringMask)); |
| 6728 __ Branch(&call_runtime, ne, t4, Operand(zero_reg)); | 6728 __ Branch(&call_runtime, ne, t4, Operand(zero_reg)); |
| 6729 __ lw(a1, FieldMemOperand(a1, ExternalString::kResourceDataOffset)); | 6729 __ lw(a1, FieldMemOperand(a1, ExternalString::kResourceDataOffset)); |
| 6730 __ bind(&second_prepared); | 6730 __ bind(&second_prepared); |
| 6731 | 6731 |
| 6732 Label non_ascii_string_add_flat_result; | 6732 Label non_ascii_string_add_flat_result; |
| 6733 // t3: first character of first string | 6733 // t3: first character of first string |
| 6734 // a1: first character of second string | 6734 // a1: first character of second string |
| 6735 // a2: length of first string | 6735 // a2: length of first string |
| 6736 // a3: length of second string | 6736 // a3: length of second string |
| 6737 // t2: sum of lengths. | 6737 // t2: sum of lengths. |
| 6738 // Both strings have the same encoding. | 6738 // Both strings have the same encoding. |
| 6739 STATIC_ASSERT(kTwoByteStringTag == 0); | 6739 STATIC_ASSERT(kTwoByteStringTag == 0); |
| 6740 __ And(t4, t1, Operand(kStringEncodingMask)); | 6740 __ And(t4, t1, Operand(kStringEncodingMask)); |
| 6741 __ Branch(&non_ascii_string_add_flat_result, eq, t4, Operand(zero_reg)); | 6741 __ Branch(&non_ascii_string_add_flat_result, eq, t4, Operand(zero_reg)); |
| 6742 | 6742 |
| 6743 __ AllocateAsciiString(v0, t2, t0, t1, t5, &call_runtime); | 6743 __ AllocateAsciiString(v0, t2, t0, t1, t5, &call_runtime); |
| 6744 __ Addu(t2, v0, Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag)); | 6744 __ Addu(t2, v0, Operand(SeqOneByteString::kHeaderSize - kHeapObjectTag)); |
| 6745 // v0: result string. | 6745 // v0: result string. |
| 6746 // t3: first character of first string. | 6746 // t3: first character of first string. |
| 6747 // a1: first character of second string | 6747 // a1: first character of second string |
| 6748 // a2: length of first string. | 6748 // a2: length of first string. |
| 6749 // a3: length of second string. | 6749 // a3: length of second string. |
| 6750 // t2: first character of result. | 6750 // t2: first character of result. |
| 6751 | 6751 |
| 6752 StringHelper::GenerateCopyCharacters(masm, t2, t3, a2, t0, true); | 6752 StringHelper::GenerateCopyCharacters(masm, t2, t3, a2, t0, true); |
| 6753 // t2: next character of result. | 6753 // t2: next character of result. |
| 6754 StringHelper::GenerateCopyCharacters(masm, t2, a1, a3, t0, true); | 6754 StringHelper::GenerateCopyCharacters(masm, t2, a1, a3, t0, true); |
| (...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7835 __ Pop(ra, t1, a1); | 7835 __ Pop(ra, t1, a1); |
| 7836 __ Ret(); | 7836 __ Ret(); |
| 7837 } | 7837 } |
| 7838 | 7838 |
| 7839 | 7839 |
| 7840 #undef __ | 7840 #undef __ |
| 7841 | 7841 |
| 7842 } } // namespace v8::internal | 7842 } } // namespace v8::internal |
| 7843 | 7843 |
| 7844 #endif // V8_TARGET_ARCH_MIPS | 7844 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |