| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 // | 4 // |
| 5 // The intrinsic code below is executed before a method has built its frame. | 5 // The intrinsic code below is executed before a method has built its frame. |
| 6 // The return address is on the stack and the arguments below it. | 6 // The return address is on the stack and the arguments below it. |
| 7 // Registers EDX (arguments descriptor) and ECX (function) must be preserved. | 7 // Registers EDX (arguments descriptor) and ECX (function) must be preserved. |
| 8 // Each intrinsification method returns true if the corresponding | 8 // Each intrinsification method returns true if the corresponding |
| 9 // Dart method was intrinsified. | 9 // Dart method was intrinsified. |
| 10 | 10 |
| (...skipping 2212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2223 void Intrinsifier::OneByteString_equality(Assembler* assembler) { | 2223 void Intrinsifier::OneByteString_equality(Assembler* assembler) { |
| 2224 StringEquality(assembler, kOneByteStringCid); | 2224 StringEquality(assembler, kOneByteStringCid); |
| 2225 } | 2225 } |
| 2226 | 2226 |
| 2227 | 2227 |
| 2228 void Intrinsifier::TwoByteString_equality(Assembler* assembler) { | 2228 void Intrinsifier::TwoByteString_equality(Assembler* assembler) { |
| 2229 StringEquality(assembler, kTwoByteStringCid); | 2229 StringEquality(assembler, kTwoByteStringCid); |
| 2230 } | 2230 } |
| 2231 | 2231 |
| 2232 | 2232 |
| 2233 void Intrinsifier::RegExp_ExecuteMatch(Assembler* assembler) { | 2233 void Intrinsifier::IntrinsifyRegExpExecuteMatch(Assembler* assembler, |
| 2234 bool sticky) { |
| 2234 if (FLAG_interpret_irregexp) return; | 2235 if (FLAG_interpret_irregexp) return; |
| 2235 | 2236 |
| 2236 static const intptr_t kRegExpParamOffset = 3 * kWordSize; | 2237 static const intptr_t kRegExpParamOffset = 3 * kWordSize; |
| 2237 static const intptr_t kStringParamOffset = 2 * kWordSize; | 2238 static const intptr_t kStringParamOffset = 2 * kWordSize; |
| 2238 // start_index smi is located at offset 1. | 2239 // start_index smi is located at offset 1. |
| 2239 | 2240 |
| 2240 // Incoming registers: | 2241 // Incoming registers: |
| 2241 // EAX: Function. (Will be loaded with the specialized matcher function.) | 2242 // EAX: Function. (Will be loaded with the specialized matcher function.) |
| 2242 // ECX: Unknown. (Must be GC safe on tail call.) | 2243 // ECX: Unknown. (Must be GC safe on tail call.) |
| 2243 // EDX: Arguments descriptor. (Will be preserved.) | 2244 // EDX: Arguments descriptor. (Will be preserved.) |
| 2244 | 2245 |
| 2245 // Load the specialized function pointer into EAX. Leverage the fact the | 2246 // Load the specialized function pointer into EAX. Leverage the fact the |
| 2246 // string CIDs as well as stored function pointers are in sequence. | 2247 // string CIDs as well as stored function pointers are in sequence. |
| 2247 __ movl(EBX, Address(ESP, kRegExpParamOffset)); | 2248 __ movl(EBX, Address(ESP, kRegExpParamOffset)); |
| 2248 __ movl(EDI, Address(ESP, kStringParamOffset)); | 2249 __ movl(EDI, Address(ESP, kStringParamOffset)); |
| 2249 __ LoadClassId(EDI, EDI); | 2250 __ LoadClassId(EDI, EDI); |
| 2250 __ SubImmediate(EDI, Immediate(kOneByteStringCid)); | 2251 __ SubImmediate(EDI, Immediate(kOneByteStringCid)); |
| 2251 __ movl(EAX, FieldAddress(EBX, EDI, TIMES_4, | 2252 __ movl(EAX, FieldAddress(EBX, EDI, TIMES_4, RegExp::function_offset( |
| 2252 RegExp::function_offset(kOneByteStringCid))); | 2253 kOneByteStringCid, sticky))); |
| 2253 | 2254 |
| 2254 // Registers are now set up for the lazy compile stub. It expects the function | 2255 // Registers are now set up for the lazy compile stub. It expects the function |
| 2255 // in EAX, the argument descriptor in EDX, and IC-Data in ECX. | 2256 // in EAX, the argument descriptor in EDX, and IC-Data in ECX. |
| 2256 __ xorl(ECX, ECX); | 2257 __ xorl(ECX, ECX); |
| 2257 | 2258 |
| 2258 // Tail-call the function. | 2259 // Tail-call the function. |
| 2259 __ movl(EDI, FieldAddress(EAX, Function::entry_point_offset())); | 2260 __ movl(EDI, FieldAddress(EAX, Function::entry_point_offset())); |
| 2260 __ jmp(EDI); | 2261 __ jmp(EDI); |
| 2261 } | 2262 } |
| 2262 | 2263 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2313 __ Bind(&true_label); | 2314 __ Bind(&true_label); |
| 2314 __ LoadObject(EAX, Bool::True()); | 2315 __ LoadObject(EAX, Bool::True()); |
| 2315 __ ret(); | 2316 __ ret(); |
| 2316 } | 2317 } |
| 2317 | 2318 |
| 2318 #undef __ | 2319 #undef __ |
| 2319 | 2320 |
| 2320 } // namespace dart | 2321 } // namespace dart |
| 2321 | 2322 |
| 2322 #endif // defined TARGET_ARCH_IA32 | 2323 #endif // defined TARGET_ARCH_IA32 |
| OLD | NEW |