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);