252 if (dst == r1) { |
252 if (dst == r1) { |
253 __ mov(rscratch1, dst); |
253 __ mov(rscratch1, dst); |
254 dst = rscratch1; |
254 dst = rscratch1; |
255 } |
255 } |
256 |
256 |
257 RegSet to_save_r1 = RegSet::of(r1); |
257 // Save r0 and r1, unless it is an output register |
258 // If outgoing register is r1, we can clobber it |
258 RegSet to_save = RegSet::of(r0, r1) - result_dst; |
259 if (result_dst != r1) { |
259 __ push(to_save, sp); |
260 __ push(to_save_r1, sp); |
|
261 } |
|
262 __ lea(r1, load_addr); |
260 __ lea(r1, load_addr); |
263 |
261 __ mov(r0, dst); |
264 RegSet to_save_r0 = RegSet::of(r0); |
|
265 if (dst != r0) { |
|
266 __ push(to_save_r0, sp); |
|
267 __ mov(r0, dst); |
|
268 } |
|
269 |
262 |
270 __ far_call(RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahBarrierSetAssembler::shenandoah_lrb()))); |
263 __ far_call(RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahBarrierSetAssembler::shenandoah_lrb()))); |
271 |
264 |
272 if (result_dst != r0) { |
265 __ mov(result_dst, r0); |
273 __ mov(result_dst, r0); |
266 __ pop(to_save, sp); |
274 } |
|
275 |
|
276 if (dst != r0) { |
|
277 __ pop(to_save_r0, sp); |
|
278 } |
|
279 |
|
280 if (result_dst != r1) { |
|
281 __ pop(to_save_r1, sp); |
|
282 } |
|
283 |
267 |
284 __ bind(done); |
268 __ bind(done); |
285 __ leave(); |
269 __ leave(); |
286 } |
270 } |
287 |
271 |