@@ -2213,19 +2213,24 @@ void StubCodeCompiler::GenerateInitSyncStarStub() {
2213
2213
2214
2214
void StubCodeCompiler::GenerateCoroutineInitializeStub () {
2215
2215
const Register kCoroutine = CoroutineInitializeStubABI::kCoroutineReg ;
2216
- const Register kStackLimit = CoroutineInitializeStubABI::kStackLimitReg ;
2217
2216
2218
2217
#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
2219
2218
SPILLS_LR_TO_FRAME ({});
2220
2219
#endif
2221
- __ LoadFieldFromOffset (kStackLimit , kCoroutine , target::Coroutine::stack_limit_offset ());
2222
- __ StoreToOffset (kStackLimit , THR, Thread::stack_limit_offset ());
2220
+ __ EnterStubFrame ();
2221
+ __ PushObject (NullObject ());
2222
+ __ PushRegister (kCoroutine );
2223
+ __ CallRuntime (kEnterCoroutineRuntimeEntry , 1 );
2224
+ __ Drop (2 );
2225
+ __ LeaveStubFrame ();
2223
2226
2224
2227
__ PushRegister (FPREG);
2225
2228
__ PushRegister (PP);
2226
2229
__ PushRegister (CODE_REG);
2227
2230
__ PushRegister (FUNCTION_REG);
2231
+
2228
2232
__ EnterFrame (0 );
2233
+
2229
2234
__ LoadFieldFromOffset (SPREG, kCoroutine , target::Coroutine::stack_base_offset ());
2230
2235
__ PushRegister (FPREG);
2231
2236
__ LoadCompressedFieldFromOffset (FUNCTION_REG, kCoroutine , target::Coroutine::entry_offset ());
@@ -2235,12 +2240,20 @@ void StubCodeCompiler::GenerateCoroutineInitializeStub() {
2235
2240
}
2236
2241
__ Call (FieldAddress (FUNCTION_REG, target::Function::entry_point_offset ()));
2237
2242
__ PopRegister (FPREG);
2243
+
2238
2244
__ LeaveFrame ();
2245
+
2239
2246
__ PopRegister (FUNCTION_REG);
2240
2247
__ PopRegister (CODE_REG);
2241
2248
__ PopRegister (PP);
2242
2249
__ PopRegister (FPREG);
2243
2250
2251
+ __ EnterStubFrame ();
2252
+ __ PushObject (NullObject ());
2253
+ __ CallRuntime (kExitCoroutineRuntimeEntry , 0 );
2254
+ __ Drop (1 );
2255
+ __ LeaveStubFrame ();
2256
+
2244
2257
__ Ret ();
2245
2258
}
2246
2259
@@ -2259,24 +2272,25 @@ void StubCodeCompiler::GenerateCoroutineTransferStub() {
2259
2272
__ PushRegister (FUNCTION_REG);
2260
2273
__ StoreFieldToOffset (SPREG, kFromCoroutine , target::Coroutine::stack_base_offset ());
2261
2274
2262
- __ LoadFieldFromOffset (kToStackLimit , kToCoroutine , target::Coroutine::stack_limit_offset ());
2263
- __ StoreToOffset (kToStackLimit , THR, Thread::stack_limit_offset ());
2264
-
2265
2275
__ LoadFieldFromOffset (SPREG, kToCoroutine , target::Coroutine::stack_base_offset ());
2266
2276
__ PopRegister (FUNCTION_REG);
2267
2277
__ PopRegister (CODE_REG);
2268
2278
__ PopRegister (PP);
2269
2279
__ PopRegister (FPREG);
2270
2280
2281
+ __ LoadFieldFromOffset (kToStackLimit , kToCoroutine , target::Coroutine::stack_limit_offset ());
2282
+ __ StoreToOffset (kToStackLimit , THR, Thread::stack_limit_offset ());
2283
+ __ StoreToOffset (kToCoroutine , THR, Thread::coroutine_offset ());
2284
+
2271
2285
__ StoreFieldToOffset (kFromCoroutine , kToCoroutine , target::Coroutine::caller_offset ());
2272
2286
2273
2287
__ Ret ();
2274
2288
}
2275
2289
2276
2290
void StubCodeCompiler::GenerateCoroutineForkStub () {
2277
- const Register kCaller = CoroutineForkStubABI::kCallerCoroutineReg ;
2278
- const Register kForked = CoroutineForkStubABI::kForkedCoroutineReg ;
2279
- const Register kForkedStackLimit = CoroutineForkStubABI::kForkedStackLimitReg ;
2291
+ const Register kCallerCoroutine = CoroutineForkStubABI::kCallerCoroutineReg ;
2292
+ const Register kForkedCoroutine = CoroutineForkStubABI::kForkedCoroutineReg ;
2293
+ const Register kStackLimit = CoroutineForkStubABI::kStackLimitReg ;
2280
2294
2281
2295
#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
2282
2296
SPILLS_LR_TO_FRAME ({});
@@ -2286,27 +2300,31 @@ void StubCodeCompiler::GenerateCoroutineForkStub() {
2286
2300
__ PushRegister (PP);
2287
2301
__ PushRegister (CODE_REG);
2288
2302
__ PushRegister (FUNCTION_REG);
2289
- __ StoreFieldToOffset (SPREG, kCaller , target::Coroutine::stack_base_offset ());
2303
+ __ StoreFieldToOffset (SPREG, kCallerCoroutine , target::Coroutine::stack_base_offset ());
2290
2304
2291
- __ LoadFieldFromOffset (kForkedStackLimit , kForked , target::Coroutine::stack_limit_offset ());
2292
- __ StoreToOffset (kForkedStackLimit , THR, Thread::stack_limit_offset ());
2293
-
2294
- __ StoreFieldToOffset (kCaller , kForked , target::Coroutine::caller_offset ());
2295
- __ LoadFieldFromOffset (SPREG, kForked , target::Coroutine::stack_base_offset ());
2296
- __ PushRegister (kForked );
2297
- __ LoadCompressedFieldFromOffset (FUNCTION_REG, kForked , target::Coroutine::entry_offset ());
2305
+ __ StoreFieldToOffset (kCallerCoroutine , kForkedCoroutine , target::Coroutine::caller_offset ());
2306
+ __ LoadFieldFromOffset (SPREG, kForkedCoroutine , target::Coroutine::stack_base_offset ());
2307
+ __ PushRegister (kForkedCoroutine );
2308
+ __ LoadCompressedFieldFromOffset (FUNCTION_REG, kForkedCoroutine , target::Coroutine::entry_offset ());
2298
2309
if (!FLAG_precompiled_mode) {
2299
2310
__ LoadCompressedFieldFromOffset (CODE_REG, FUNCTION_REG, target::Function::code_offset ());
2300
2311
__ LoadImmediate (ARGS_DESC_REG, 0 );
2301
2312
}
2313
+
2314
+ __ LoadFieldFromOffset (kStackLimit , kForkedCoroutine , target::Coroutine::stack_limit_offset ());
2315
+ __ StoreToOffset (kStackLimit , THR, Thread::stack_limit_offset ());
2316
+ __ StoreToOffset (kForkedCoroutine , THR, Thread::coroutine_offset ());
2317
+
2302
2318
__ Call (FieldAddress (FUNCTION_REG, target::Function::entry_point_offset ()));
2303
- __ PopRegister (kForked );
2304
- __ LoadFieldFromOffset (kCaller , kForked , target::Coroutine::caller_offset ());
2305
- __ LoadFieldFromOffset (SPREG, kCaller , target::Coroutine::stack_base_offset ());
2319
+
2320
+ __ PopRegister (kForkedCoroutine );
2321
+ __ LoadFieldFromOffset (kCallerCoroutine , kForkedCoroutine , target::Coroutine::caller_offset ());
2322
+ __ LoadFieldFromOffset (SPREG, kCallerCoroutine , target::Coroutine::stack_base_offset ());
2306
2323
__ PopRegister (FUNCTION_REG);
2307
2324
__ PopRegister (CODE_REG);
2308
2325
__ PopRegister (PP);
2309
2326
__ PopRegister (FPREG);
2327
+
2310
2328
__ Ret ();
2311
2329
}
2312
2330
0 commit comments