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 |