Index: runtime/vm/intrinsifier_x64.cc |
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc |
index b888804ec48014899ce266223dccc7c3d406fc48..9f6f053fb132aa5cde0413227b9075429b11bf2d 100644 |
--- a/runtime/vm/intrinsifier_x64.cc |
+++ b/runtime/vm/intrinsifier_x64.cc |
@@ -2193,7 +2193,7 @@ void Intrinsifier::TwoByteString_equality(Assembler* assembler) { |
void Intrinsifier::RegExp_ExecuteMatch(Assembler* assembler) { |
erikcorry
2016/11/17 13:56:17
Can't RegExp_ExecuteMatch and RegExp_ExecuteMatchS
Vyacheslav Egorov (Google)
2016/11/17 16:51:33
In this case code below would have to check for bo
|
- if (FLAG_interpret_irregexp) return; |
+ if (FLAG_interpret_irregexp || FLAG_precompiled_runtime) return; |
rmacnak
2016/11/17 00:49:52
Why add this? FLAG_interpret_irregexp should alrea
Vyacheslav Egorov (Google)
2016/11/17 16:51:33
There was a code somewhere that checked both so I
|
static const intptr_t kRegExpParamOffset = 3 * kWordSize; |
static const intptr_t kStringParamOffset = 2 * kWordSize; |
@@ -2211,7 +2211,41 @@ void Intrinsifier::RegExp_ExecuteMatch(Assembler* assembler) { |
__ LoadClassId(RDI, RDI); |
__ SubImmediate(RDI, Immediate(kOneByteStringCid)); |
__ movq(RAX, FieldAddress(RBX, RDI, TIMES_8, |
- RegExp::function_offset(kOneByteStringCid))); |
+ RegExp::function_offset(kOneByteStringCid, |
+ /*sticky=*/false))); |
+ |
+ // Registers are now set up for the lazy compile stub. It expects the function |
+ // in RAX, the argument descriptor in R10, and IC-Data in RCX. |
+ __ xorq(RCX, RCX); |
+ |
+ // Tail-call the function. |
+ __ movq(CODE_REG, FieldAddress(RAX, Function::code_offset())); |
+ __ movq(RDI, FieldAddress(RAX, Function::entry_point_offset())); |
+ __ jmp(RDI); |
+} |
+ |
+ |
+void Intrinsifier::RegExp_ExecuteMatchSticky(Assembler* assembler) { |
+ if (FLAG_interpret_irregexp || FLAG_precompiled_runtime) return; |
+ |
+ static const intptr_t kRegExpParamOffset = 3 * kWordSize; |
+ static const intptr_t kStringParamOffset = 2 * kWordSize; |
+ // start_index smi is located at offset 1. |
+ |
+ // Incoming registers: |
+ // RAX: Function. (Will be loaded with the specialized matcher function.) |
+ // RCX: Unknown. (Must be GC safe on tail call.) |
+ // R10: Arguments descriptor. (Will be preserved.) |
+ |
+ // Load the specialized function pointer into RAX. Leverage the fact the |
+ // string CIDs as well as stored function pointers are in sequence. |
+ __ movq(RBX, Address(RSP, kRegExpParamOffset)); |
+ __ movq(RDI, Address(RSP, kStringParamOffset)); |
+ __ LoadClassId(RDI, RDI); |
+ __ SubImmediate(RDI, Immediate(kOneByteStringCid)); |
+ __ movq(RAX, FieldAddress(RBX, RDI, TIMES_8, |
+ RegExp::function_offset(kOneByteStringCid, |
+ /*sticky=*/true))); |
// Registers are now set up for the lazy compile stub. It expects the function |
// in RAX, the argument descriptor in R10, and IC-Data in RCX. |