@@ -202,10 +202,18 @@ void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm,
202
202
__ jmp (done);
203
203
204
204
__ bind (runtime);
205
- // FIXME
206
205
// Barriers might be emitted when converting between (scalarized) calling conventions for inline
207
- // types. Save all registers until JDK-8232094 is fixed to avoid overwriting argument registers .
206
+ // types. Save all argument registers before calling into the runtime .
208
207
__ pusha ();
208
+ __ subptr (rsp, 64 );
209
+ __ movdbl (Address (rsp, 0 ), j_farg0);
210
+ __ movdbl (Address (rsp, 8 ), j_farg1);
211
+ __ movdbl (Address (rsp, 16 ), j_farg2);
212
+ __ movdbl (Address (rsp, 24 ), j_farg3);
213
+ __ movdbl (Address (rsp, 32 ), j_farg4);
214
+ __ movdbl (Address (rsp, 40 ), j_farg5);
215
+ __ movdbl (Address (rsp, 48 ), j_farg6);
216
+ __ movdbl (Address (rsp, 56 ), j_farg7);
209
217
210
218
// Calling the runtime using the regular call_VM_leaf mechanism generates
211
219
// code (generated by InterpreterMacroAssember::call_VM_leaf_base)
@@ -237,7 +245,18 @@ void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm,
237
245
__ call_VM_leaf (CAST_FROM_FN_PTR (address, G1BarrierSetRuntime::write_ref_field_pre_entry), pre_val, thread);
238
246
}
239
247
248
+ // Restore registers
249
+ __ movdbl (j_farg0, Address (rsp, 0 ));
250
+ __ movdbl (j_farg1, Address (rsp, 8 ));
251
+ __ movdbl (j_farg2, Address (rsp, 16 ));
252
+ __ movdbl (j_farg3, Address (rsp, 24 ));
253
+ __ movdbl (j_farg4, Address (rsp, 32 ));
254
+ __ movdbl (j_farg5, Address (rsp, 40 ));
255
+ __ movdbl (j_farg6, Address (rsp, 48 ));
256
+ __ movdbl (j_farg7, Address (rsp, 56 ));
257
+ __ addptr (rsp, 64 );
240
258
__ popa ();
259
+
241
260
__ bind (done);
242
261
}
243
262
@@ -312,10 +331,18 @@ void G1BarrierSetAssembler::g1_write_barrier_post(MacroAssembler* masm,
312
331
__ jmp (done);
313
332
314
333
__ bind (runtime);
315
- // FIXME
316
334
// Barriers might be emitted when converting between (scalarized) calling conventions for inline
317
- // types. Save all registers until JDK-8232094 is fixed to avoid overwriting argument registers .
335
+ // types. Save all argument registers before calling into the runtime .
318
336
__ pusha ();
337
+ __ subptr (rsp, 64 );
338
+ __ movdbl (Address (rsp, 0 ), j_farg0);
339
+ __ movdbl (Address (rsp, 8 ), j_farg1);
340
+ __ movdbl (Address (rsp, 16 ), j_farg2);
341
+ __ movdbl (Address (rsp, 24 ), j_farg3);
342
+ __ movdbl (Address (rsp, 32 ), j_farg4);
343
+ __ movdbl (Address (rsp, 40 ), j_farg5);
344
+ __ movdbl (Address (rsp, 48 ), j_farg6);
345
+ __ movdbl (Address (rsp, 56 ), j_farg7);
319
346
320
347
#ifdef _LP64
321
348
__ call_VM_leaf (CAST_FROM_FN_PTR (address, G1BarrierSetRuntime::write_ref_field_post_entry), card_addr, r15_thread);
@@ -325,7 +352,18 @@ void G1BarrierSetAssembler::g1_write_barrier_post(MacroAssembler* masm,
325
352
__ pop (thread);
326
353
#endif
327
354
355
+ // Restore registers
356
+ __ movdbl (j_farg0, Address (rsp, 0 ));
357
+ __ movdbl (j_farg1, Address (rsp, 8 ));
358
+ __ movdbl (j_farg2, Address (rsp, 16 ));
359
+ __ movdbl (j_farg3, Address (rsp, 24 ));
360
+ __ movdbl (j_farg4, Address (rsp, 32 ));
361
+ __ movdbl (j_farg5, Address (rsp, 40 ));
362
+ __ movdbl (j_farg6, Address (rsp, 48 ));
363
+ __ movdbl (j_farg7, Address (rsp, 56 ));
364
+ __ addptr (rsp, 64 );
328
365
__ popa ();
366
+
329
367
__ bind (done);
330
368
}
331
369
0 commit comments