Mercurial > hg > graal-jvmci-8
comparison src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp @ 1848:c393f046f4c5
6991512: G1 barriers fail with 64bit C1
Summary: Fix compare-and-swap intrinsic problem with G1 post-barriers and issue with branch ranges in G1 stubs on sparc
Reviewed-by: never, kvn
author | iveresov |
---|---|
date | Tue, 12 Oct 2010 23:51:20 -0700 |
parents | f02a8bbe6ed4 |
children | f95d63e2154a |
comparison
equal
deleted
inserted
replaced
1847:a932f331ef90 | 1848:c393f046f4c5 |
---|---|
423 assert(pre_val()->is_register(), "Precondition."); | 423 assert(pre_val()->is_register(), "Precondition."); |
424 | 424 |
425 Register pre_val_reg = pre_val()->as_register(); | 425 Register pre_val_reg = pre_val()->as_register(); |
426 | 426 |
427 ce->mem2reg(addr(), pre_val(), T_OBJECT, patch_code(), info(), false); | 427 ce->mem2reg(addr(), pre_val(), T_OBJECT, patch_code(), info(), false); |
428 __ br_on_reg_cond(Assembler::rc_z, /*annul*/false, Assembler::pt, | 428 if (__ is_in_wdisp16_range(_continuation)) { |
429 pre_val_reg, _continuation); | 429 __ br_on_reg_cond(Assembler::rc_z, /*annul*/false, Assembler::pt, |
430 pre_val_reg, _continuation); | |
431 } else { | |
432 __ cmp(pre_val_reg, G0); | |
433 __ brx(Assembler::equal, false, Assembler::pn, _continuation); | |
434 } | |
430 __ delayed()->nop(); | 435 __ delayed()->nop(); |
431 | 436 |
432 __ call(Runtime1::entry_for(Runtime1::Runtime1::g1_pre_barrier_slow_id)); | 437 __ call(Runtime1::entry_for(Runtime1::Runtime1::g1_pre_barrier_slow_id)); |
433 __ delayed()->mov(pre_val_reg, G4); | 438 __ delayed()->mov(pre_val_reg, G4); |
434 __ br(Assembler::always, false, Assembler::pt, _continuation); | 439 __ br(Assembler::always, false, Assembler::pt, _continuation); |
450 | 455 |
451 assert(addr()->is_register(), "Precondition."); | 456 assert(addr()->is_register(), "Precondition."); |
452 assert(new_val()->is_register(), "Precondition."); | 457 assert(new_val()->is_register(), "Precondition."); |
453 Register addr_reg = addr()->as_pointer_register(); | 458 Register addr_reg = addr()->as_pointer_register(); |
454 Register new_val_reg = new_val()->as_register(); | 459 Register new_val_reg = new_val()->as_register(); |
455 __ br_on_reg_cond(Assembler::rc_z, /*annul*/false, Assembler::pt, | 460 if (__ is_in_wdisp16_range(_continuation)) { |
456 new_val_reg, _continuation); | 461 __ br_on_reg_cond(Assembler::rc_z, /*annul*/false, Assembler::pt, |
462 new_val_reg, _continuation); | |
463 } else { | |
464 __ cmp(new_val_reg, G0); | |
465 __ brx(Assembler::equal, false, Assembler::pn, _continuation); | |
466 } | |
457 __ delayed()->nop(); | 467 __ delayed()->nop(); |
458 | 468 |
459 __ call(Runtime1::entry_for(Runtime1::Runtime1::g1_post_barrier_slow_id)); | 469 __ call(Runtime1::entry_for(Runtime1::Runtime1::g1_post_barrier_slow_id)); |
460 __ delayed()->mov(addr_reg, G4); | 470 __ delayed()->mov(addr_reg, G4); |
461 __ br(Assembler::always, false, Assembler::pt, _continuation); | 471 __ br(Assembler::always, false, Assembler::pt, _continuation); |