Skip to content

Commit 2455c8e

Browse files
committedAug 11, 2020
8251398: [lworld] TestCallingConvention::test36 spuriously fails due to incorrect field value
1 parent f0a8efc commit 2455c8e

File tree

1 file changed

+42
-4
lines changed

1 file changed

+42
-4
lines changed
 

‎src/hotspot/cpu/x86/gc/g1/g1BarrierSetAssembler_x86.cpp

+42-4
Original file line numberDiff line numberDiff line change
@@ -202,10 +202,18 @@ void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm,
202202
__ jmp(done);
203203

204204
__ bind(runtime);
205-
// FIXME
206205
// 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.
208207
__ 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);
209217

210218
// Calling the runtime using the regular call_VM_leaf mechanism generates
211219
// code (generated by InterpreterMacroAssember::call_VM_leaf_base)
@@ -237,7 +245,18 @@ void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm,
237245
__ call_VM_leaf(CAST_FROM_FN_PTR(address, G1BarrierSetRuntime::write_ref_field_pre_entry), pre_val, thread);
238246
}
239247

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);
240258
__ popa();
259+
241260
__ bind(done);
242261
}
243262

@@ -312,10 +331,18 @@ void G1BarrierSetAssembler::g1_write_barrier_post(MacroAssembler* masm,
312331
__ jmp(done);
313332

314333
__ bind(runtime);
315-
// FIXME
316334
// 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.
318336
__ 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);
319346

320347
#ifdef _LP64
321348
__ 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,
325352
__ pop(thread);
326353
#endif
327354

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);
328365
__ popa();
366+
329367
__ bind(done);
330368
}
331369

0 commit comments

Comments
 (0)
Please sign in to comment.