src/cpu/sparc/vm/sparc.ad

changeset 5283
46c544b8fbfc
parent 5001
e10e43e58e92
child 5528
740e263c80c6
equal deleted inserted replaced
5282:ea60d1de6735 5283:46c544b8fbfc
2776 MacroAssembler _masm(&cbuf); 2776 MacroAssembler _masm(&cbuf);
2777 Register Rmem = reg_to_register_object($mem$$reg); 2777 Register Rmem = reg_to_register_object($mem$$reg);
2778 Register Rold = reg_to_register_object($old$$reg); 2778 Register Rold = reg_to_register_object($old$$reg);
2779 Register Rnew = reg_to_register_object($new$$reg); 2779 Register Rnew = reg_to_register_object($new$$reg);
2780 2780
2781 // casx_under_lock picks 1 of 3 encodings: 2781 __ cas_ptr(Rmem, Rold, Rnew); // Swap(*Rmem,Rnew) if *Rmem == Rold
2782 // For 32-bit pointers you get a 32-bit CAS
2783 // For 64-bit pointers you get a 64-bit CASX
2784 __ casn(Rmem, Rold, Rnew); // Swap(*Rmem,Rnew) if *Rmem == Rold
2785 __ cmp( Rold, Rnew ); 2782 __ cmp( Rold, Rnew );
2786 %} 2783 %}
2787 2784
2788 enc_class enc_casx( iRegP mem, iRegL old, iRegL new) %{ 2785 enc_class enc_casx( iRegP mem, iRegL old, iRegL new) %{
2789 Register Rmem = reg_to_register_object($mem$$reg); 2786 Register Rmem = reg_to_register_object($mem$$reg);
3065 #ifdef ASSERT 3062 #ifdef ASSERT
3066 __ save_frame(0); 3063 __ save_frame(0);
3067 AddressLiteral last_rethrow_addrlit(&last_rethrow); 3064 AddressLiteral last_rethrow_addrlit(&last_rethrow);
3068 __ sethi(last_rethrow_addrlit, L1); 3065 __ sethi(last_rethrow_addrlit, L1);
3069 Address addr(L1, last_rethrow_addrlit.low10()); 3066 Address addr(L1, last_rethrow_addrlit.low10());
3070 __ get_pc(L2); 3067 __ rdpc(L2);
3071 __ inc(L2, 3 * BytesPerInstWord); // skip this & 2 more insns to point at jump_to 3068 __ inc(L2, 3 * BytesPerInstWord); // skip this & 2 more insns to point at jump_to
3072 __ st_ptr(L2, addr); 3069 __ st_ptr(L2, addr);
3073 __ restore(); 3070 __ restore();
3074 #endif 3071 #endif
3075 __ JUMP(rethrow_stub, temp_reg, 0); // sethi;jmp 3072 __ JUMP(rethrow_stub, temp_reg, 0); // sethi;jmp

mercurial