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 |