Index: src/arm/builtins-arm.cc |
diff --git a/src/arm/builtins-arm.cc b/src/arm/builtins-arm.cc |
index 13c0e4441649327a7183c1ec586be124eb4bc207..60f529003006afcf45981e2042229401b2729621 100644 |
--- a/src/arm/builtins-arm.cc |
+++ b/src/arm/builtins-arm.cc |
@@ -826,6 +826,39 @@ CODE_AGE_LIST(DEFINE_CODE_AGE_BUILTIN_GENERATOR) |
#undef DEFINE_CODE_AGE_BUILTIN_GENERATOR |
+void Builtins::Generate_MarkCodeAsExecutedOnce(MacroAssembler* masm) { |
+ // For now, as in GenerateMakeCodeYoungAgainCommon, we are relying on the fact |
+ // that make_code_young doesn't do any garbage collection which allows us to |
+ // save/restore the registers without worrying about which of them contain |
+ // pointers. |
+ |
+ // The following registers must be saved and restored when calling through to |
+ // the runtime: |
+ // r0 - contains return address (beginning of patch sequence) |
+ // r1 - isolate |
+ FrameScope scope(masm, StackFrame::MANUAL); |
+ __ stm(db_w, sp, r0.bit() | r1.bit() | fp.bit() | lr.bit()); |
+ __ PrepareCallCFunction(1, 0, r2); |
+ __ mov(r1, Operand(ExternalReference::isolate_address(masm->isolate()))); |
+ __ CallCFunction(ExternalReference::get_mark_code_as_executed_function( |
+ masm->isolate()), 2); |
+ __ ldm(ia_w, sp, r0.bit() | r1.bit() | fp.bit() | lr.bit()); |
+ |
+ // Perform prologue operations usually performed by the young code stub. |
+ __ stm(db_w, sp, r1.bit() | cp.bit() | fp.bit() | lr.bit()); |
+ __ add(fp, sp, Operand(2 * kPointerSize)); |
+ |
+ // Jump to point after the code-age stub. |
+ __ add(r0, r0, Operand(kNoCodeAgeSequenceLength * Assembler::kInstrSize)); |
+ __ mov(pc, r0); |
+} |
+ |
+ |
+void Builtins::Generate_MarkCodeAsExecutedTwice(MacroAssembler* masm) { |
+ GenerateMakeCodeYoungAgainCommon(masm); |
+} |
+ |
+ |
void Builtins::Generate_NotifyStubFailure(MacroAssembler* masm) { |
{ |
FrameScope scope(masm, StackFrame::INTERNAL); |