OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 8213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8224 __ j(not_equal, &loop); | 8224 __ j(not_equal, &loop); |
8225 } | 8225 } |
8226 // Completed loop without finding different characters. | 8226 // Completed loop without finding different characters. |
8227 // Compare lengths (precomputed). | 8227 // Compare lengths (precomputed). |
8228 __ bind(&compare_lengths); | 8228 __ bind(&compare_lengths); |
8229 __ testl(length_difference, length_difference); | 8229 __ testl(length_difference, length_difference); |
8230 __ j(not_zero, &result_not_equal); | 8230 __ j(not_zero, &result_not_equal); |
8231 | 8231 |
8232 // Result is EQUAL. | 8232 // Result is EQUAL. |
8233 __ Move(rax, Smi::FromInt(EQUAL)); | 8233 __ Move(rax, Smi::FromInt(EQUAL)); |
8234 __ IncrementCounter(&Counters::string_compare_native, 1); | |
8235 __ ret(2 * kPointerSize); | 8234 __ ret(2 * kPointerSize); |
8236 | 8235 |
8237 Label result_greater; | 8236 Label result_greater; |
8238 __ bind(&result_not_equal); | 8237 __ bind(&result_not_equal); |
8239 // Unequal comparison of left to right, either character or length. | 8238 // Unequal comparison of left to right, either character or length. |
8240 __ j(greater, &result_greater); | 8239 __ j(greater, &result_greater); |
8241 | 8240 |
8242 // Result is LESS. | 8241 // Result is LESS. |
8243 __ Move(rax, Smi::FromInt(LESS)); | 8242 __ Move(rax, Smi::FromInt(LESS)); |
8244 __ IncrementCounter(&Counters::string_compare_native, 1); | |
8245 __ ret(2 * kPointerSize); | 8243 __ ret(2 * kPointerSize); |
8246 | 8244 |
8247 // Result is GREATER. | 8245 // Result is GREATER. |
8248 __ bind(&result_greater); | 8246 __ bind(&result_greater); |
8249 __ Move(rax, Smi::FromInt(GREATER)); | 8247 __ Move(rax, Smi::FromInt(GREATER)); |
8250 __ IncrementCounter(&Counters::string_compare_native, 1); | |
8251 __ ret(2 * kPointerSize); | 8248 __ ret(2 * kPointerSize); |
8252 } | 8249 } |
8253 | 8250 |
8254 | 8251 |
8255 void StringCompareStub::Generate(MacroAssembler* masm) { | 8252 void StringCompareStub::Generate(MacroAssembler* masm) { |
8256 Label runtime; | 8253 Label runtime; |
8257 | 8254 |
8258 // Stack frame on entry. | 8255 // Stack frame on entry. |
8259 // rsp[0]: return address | 8256 // rsp[0]: return address |
8260 // rsp[8]: right string | 8257 // rsp[8]: right string |
8261 // rsp[16]: left string | 8258 // rsp[16]: left string |
8262 | 8259 |
8263 __ movq(rdx, Operand(rsp, 2 * kPointerSize)); // left | 8260 __ movq(rdx, Operand(rsp, 2 * kPointerSize)); // left |
8264 __ movq(rax, Operand(rsp, 1 * kPointerSize)); // right | 8261 __ movq(rax, Operand(rsp, 1 * kPointerSize)); // right |
8265 | 8262 |
8266 // Check for identity. | 8263 // Check for identity. |
8267 Label not_same; | 8264 Label not_same; |
8268 __ cmpq(rdx, rax); | 8265 __ cmpq(rdx, rax); |
8269 __ j(not_equal, ¬_same); | 8266 __ j(not_equal, ¬_same); |
8270 __ Move(rax, Smi::FromInt(EQUAL)); | 8267 __ Move(rax, Smi::FromInt(EQUAL)); |
8271 __ IncrementCounter(&Counters::string_compare_native, 1); | 8268 __ IncrementCounter(&Counters::string_compare_native, 1); |
8272 __ ret(2 * kPointerSize); | 8269 __ ret(2 * kPointerSize); |
8273 | 8270 |
8274 __ bind(¬_same); | 8271 __ bind(¬_same); |
8275 | 8272 |
8276 // Check that both are sequential ASCII strings. | 8273 // Check that both are sequential ASCII strings. |
8277 __ JumpIfNotBothSequentialAsciiStrings(rdx, rax, rcx, rbx, &runtime); | 8274 __ JumpIfNotBothSequentialAsciiStrings(rdx, rax, rcx, rbx, &runtime); |
8278 | 8275 |
8279 // Inline comparison of ascii strings. | 8276 // Inline comparison of ascii strings. |
| 8277 __ IncrementCounter(&Counters::string_compare_native, 1); |
8280 GenerateCompareFlatAsciiStrings(masm, rdx, rax, rcx, rbx, rdi, r8); | 8278 GenerateCompareFlatAsciiStrings(masm, rdx, rax, rcx, rbx, rdi, r8); |
8281 | 8279 |
8282 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | 8280 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) |
8283 // tagged as a small integer. | 8281 // tagged as a small integer. |
8284 __ bind(&runtime); | 8282 __ bind(&runtime); |
8285 __ TailCallRuntime(ExternalReference(Runtime::kStringCompare), 2, 1); | 8283 __ TailCallRuntime(ExternalReference(Runtime::kStringCompare), 2, 1); |
8286 } | 8284 } |
8287 | 8285 |
8288 #undef __ | 8286 #undef __ |
8289 | 8287 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8375 // Call the function from C++. | 8373 // Call the function from C++. |
8376 return FUNCTION_CAST<ModuloFunction>(buffer); | 8374 return FUNCTION_CAST<ModuloFunction>(buffer); |
8377 } | 8375 } |
8378 | 8376 |
8379 #endif | 8377 #endif |
8380 | 8378 |
8381 | 8379 |
8382 #undef __ | 8380 #undef __ |
8383 | 8381 |
8384 } } // namespace v8::internal | 8382 } } // namespace v8::internal |
OLD | NEW |