| OLD | NEW | 
|---|
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 11174 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 11185   __ SmiCompare(rbx, Smi::FromInt(String::kMinNonFlatLength)); | 11185   __ SmiCompare(rbx, Smi::FromInt(String::kMinNonFlatLength)); | 
| 11186   __ j(below, &string_add_flat_result); | 11186   __ j(below, &string_add_flat_result); | 
| 11187   // Handle exceptionally long strings in the runtime system. | 11187   // Handle exceptionally long strings in the runtime system. | 
| 11188   ASSERT((String::kMaxLength & 0x80000000) == 0); | 11188   ASSERT((String::kMaxLength & 0x80000000) == 0); | 
| 11189   __ SmiCompare(rbx, Smi::FromInt(String::kMaxLength)); | 11189   __ SmiCompare(rbx, Smi::FromInt(String::kMaxLength)); | 
| 11190   __ j(above, &string_add_runtime); | 11190   __ j(above, &string_add_runtime); | 
| 11191 | 11191 | 
| 11192   // If result is not supposed to be flat, allocate a cons string object. If | 11192   // If result is not supposed to be flat, allocate a cons string object. If | 
| 11193   // both strings are ascii the result is an ascii cons string. | 11193   // both strings are ascii the result is an ascii cons string. | 
| 11194   // rax: first string | 11194   // rax: first string | 
| 11195   // ebx: length of resulting flat string | 11195   // rbx: length of resulting flat string | 
| 11196   // rdx: second string | 11196   // rdx: second string | 
| 11197   // r8: instance type of first string | 11197   // r8: instance type of first string | 
| 11198   // r9: instance type of second string | 11198   // r9: instance type of second string | 
| 11199   Label non_ascii, allocated; | 11199   Label non_ascii, allocated, ascii_data; | 
| 11200   __ movl(rcx, r8); | 11200   __ movl(rcx, r8); | 
| 11201   __ and_(rcx, r9); | 11201   __ and_(rcx, r9); | 
| 11202   ASSERT(kStringEncodingMask == kAsciiStringTag); | 11202   ASSERT(kStringEncodingMask == kAsciiStringTag); | 
| 11203   __ testl(rcx, Immediate(kAsciiStringTag)); | 11203   __ testl(rcx, Immediate(kAsciiStringTag)); | 
| 11204   __ j(zero, &non_ascii); | 11204   __ j(zero, &non_ascii); | 
|  | 11205   __ bind(&ascii_data); | 
| 11205   // Allocate an acsii cons string. | 11206   // Allocate an acsii cons string. | 
| 11206   __ AllocateAsciiConsString(rcx, rdi, no_reg, &string_add_runtime); | 11207   __ AllocateAsciiConsString(rcx, rdi, no_reg, &string_add_runtime); | 
| 11207   __ bind(&allocated); | 11208   __ bind(&allocated); | 
| 11208   // Fill the fields of the cons string. | 11209   // Fill the fields of the cons string. | 
| 11209   __ movq(FieldOperand(rcx, ConsString::kLengthOffset), rbx); | 11210   __ movq(FieldOperand(rcx, ConsString::kLengthOffset), rbx); | 
| 11210   __ movq(FieldOperand(rcx, ConsString::kHashFieldOffset), | 11211   __ movq(FieldOperand(rcx, ConsString::kHashFieldOffset), | 
| 11211           Immediate(String::kEmptyHashField)); | 11212           Immediate(String::kEmptyHashField)); | 
| 11212   __ movq(FieldOperand(rcx, ConsString::kFirstOffset), rax); | 11213   __ movq(FieldOperand(rcx, ConsString::kFirstOffset), rax); | 
| 11213   __ movq(FieldOperand(rcx, ConsString::kSecondOffset), rdx); | 11214   __ movq(FieldOperand(rcx, ConsString::kSecondOffset), rdx); | 
| 11214   __ movq(rax, rcx); | 11215   __ movq(rax, rcx); | 
| 11215   __ IncrementCounter(&Counters::string_add_native, 1); | 11216   __ IncrementCounter(&Counters::string_add_native, 1); | 
| 11216   __ ret(2 * kPointerSize); | 11217   __ ret(2 * kPointerSize); | 
| 11217   __ bind(&non_ascii); | 11218   __ bind(&non_ascii); | 
|  | 11219   // At least one of the strings is two-byte. Check whether it happens | 
|  | 11220   // to contain only ascii characters. | 
|  | 11221   // rcx: first instance type AND second instance type. | 
|  | 11222   // r8: first instance type. | 
|  | 11223   // r9: second instance type. | 
|  | 11224   __ testb(rcx, Immediate(kAsciiDataHintMask)); | 
|  | 11225   __ j(not_zero, &ascii_data); | 
|  | 11226   __ xor_(r8, r9); | 
|  | 11227   ASSERT(kAsciiStringTag != 0 && kAsciiDataHintTag != 0); | 
|  | 11228   __ andb(r8, Immediate(kAsciiStringTag | kAsciiDataHintTag)); | 
|  | 11229   __ cmpb(r8, Immediate(kAsciiStringTag | kAsciiDataHintTag)); | 
|  | 11230   __ j(equal, &ascii_data); | 
| 11218   // Allocate a two byte cons string. | 11231   // Allocate a two byte cons string. | 
| 11219   __ AllocateConsString(rcx, rdi, no_reg, &string_add_runtime); | 11232   __ AllocateConsString(rcx, rdi, no_reg, &string_add_runtime); | 
| 11220   __ jmp(&allocated); | 11233   __ jmp(&allocated); | 
| 11221 | 11234 | 
| 11222   // Handle creating a flat result. First check that both strings are not | 11235   // Handle creating a flat result. First check that both strings are not | 
| 11223   // external strings. | 11236   // external strings. | 
| 11224   // rax: first string | 11237   // rax: first string | 
| 11225   // ebx: length of resulting flat string as smi | 11238   // rbx: length of resulting flat string as smi | 
| 11226   // rdx: second string | 11239   // rdx: second string | 
| 11227   // r8: instance type of first string | 11240   // r8: instance type of first string | 
| 11228   // r9: instance type of first string | 11241   // r9: instance type of first string | 
| 11229   __ bind(&string_add_flat_result); | 11242   __ bind(&string_add_flat_result); | 
| 11230   __ SmiToInteger32(rbx, rbx); | 11243   __ SmiToInteger32(rbx, rbx); | 
| 11231   __ movl(rcx, r8); | 11244   __ movl(rcx, r8); | 
| 11232   __ and_(rcx, Immediate(kStringRepresentationMask)); | 11245   __ and_(rcx, Immediate(kStringRepresentationMask)); | 
| 11233   __ cmpl(rcx, Immediate(kExternalStringTag)); | 11246   __ cmpl(rcx, Immediate(kExternalStringTag)); | 
| 11234   __ j(equal, &string_add_runtime); | 11247   __ j(equal, &string_add_runtime); | 
| 11235   __ movl(rcx, r9); | 11248   __ movl(rcx, r9); | 
| 11236   __ and_(rcx, Immediate(kStringRepresentationMask)); | 11249   __ and_(rcx, Immediate(kStringRepresentationMask)); | 
| 11237   __ cmpl(rcx, Immediate(kExternalStringTag)); | 11250   __ cmpl(rcx, Immediate(kExternalStringTag)); | 
| 11238   __ j(equal, &string_add_runtime); | 11251   __ j(equal, &string_add_runtime); | 
| 11239   // Now check if both strings are ascii strings. | 11252   // Now check if both strings are ascii strings. | 
| 11240   // rax: first string | 11253   // rax: first string | 
| 11241   // ebx: length of resulting flat string | 11254   // rbx: length of resulting flat string | 
| 11242   // rdx: second string | 11255   // rdx: second string | 
| 11243   // r8: instance type of first string | 11256   // r8: instance type of first string | 
| 11244   // r9: instance type of second string | 11257   // r9: instance type of second string | 
| 11245   Label non_ascii_string_add_flat_result; | 11258   Label non_ascii_string_add_flat_result; | 
| 11246   ASSERT(kStringEncodingMask == kAsciiStringTag); | 11259   ASSERT(kStringEncodingMask == kAsciiStringTag); | 
| 11247   __ testl(r8, Immediate(kAsciiStringTag)); | 11260   __ testl(r8, Immediate(kAsciiStringTag)); | 
| 11248   __ j(zero, &non_ascii_string_add_flat_result); | 11261   __ j(zero, &non_ascii_string_add_flat_result); | 
| 11249   __ testl(r9, Immediate(kAsciiStringTag)); | 11262   __ testl(r9, Immediate(kAsciiStringTag)); | 
| 11250   __ j(zero, &string_add_runtime); | 11263   __ j(zero, &string_add_runtime); | 
| 11251 | 11264 | 
| (...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 11930 } | 11943 } | 
| 11931 | 11944 | 
| 11932 #endif | 11945 #endif | 
| 11933 | 11946 | 
| 11934 | 11947 | 
| 11935 #undef __ | 11948 #undef __ | 
| 11936 | 11949 | 
| 11937 } }  // namespace v8::internal | 11950 } }  // namespace v8::internal | 
| 11938 | 11951 | 
| 11939 #endif  // V8_TARGET_ARCH_X64 | 11952 #endif  // V8_TARGET_ARCH_X64 | 
| OLD | NEW | 
|---|