< prev index next >

src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp

Print this page
rev 52825 : Revert to emit locked cmpxchg only on MP


1913     }
1914     NOT_LP64(__ cmpxchg8(Address(addr, 0)));
1915 
1916   } else if (op->code() == lir_cas_int || op->code() == lir_cas_obj ) {
1917     NOT_LP64(assert(op->addr()->is_single_cpu(), "must be single");)
1918     Register addr = (op->addr()->is_single_cpu() ? op->addr()->as_register() : op->addr()->as_register_lo());
1919     Register newval = op->new_value()->as_register();
1920     Register cmpval = op->cmp_value()->as_register();
1921     assert(cmpval == rax, "wrong register");
1922     assert(newval != NULL, "new val must be register");
1923     assert(cmpval != newval, "cmp and new values must be in different registers");
1924     assert(cmpval != addr, "cmp and addr must be in different registers");
1925     assert(newval != addr, "new value and addr must be in different registers");
1926 
1927     if ( op->code() == lir_cas_obj) {
1928 #ifdef _LP64
1929       if (UseCompressedOops) {
1930         __ encode_heap_oop(cmpval);
1931         __ mov(rscratch1, newval);
1932         __ encode_heap_oop(rscratch1);

1933         __ lock();

1934         // cmpval (rax) is implicitly used by this instruction
1935         __ cmpxchgl(rscratch1, Address(addr, 0));
1936       } else
1937 #endif
1938       {

1939         __ lock();

1940         __ cmpxchgptr(newval, Address(addr, 0));
1941       }
1942    } else {
1943       assert(op->code() == lir_cas_int, "lir_cas_int expected");
1944       if (os::is_MP()) {
1945         __ lock();
1946       }
1947       __ cmpxchgl(newval, Address(addr, 0));
1948     }
1949 #ifdef _LP64
1950   } else if (op->code() == lir_cas_long) {
1951     Register addr = (op->addr()->is_single_cpu() ? op->addr()->as_register() : op->addr()->as_register_lo());
1952     Register newval = op->new_value()->as_register_lo();
1953     Register cmpval = op->cmp_value()->as_register_lo();
1954     assert(cmpval == rax, "wrong register");
1955     assert(newval != NULL, "new val must be register");
1956     assert(cmpval != newval, "cmp and new values must be in different registers");
1957     assert(cmpval != addr, "cmp and addr must be in different registers");
1958     assert(newval != addr, "new value and addr must be in different registers");
1959     if (os::is_MP()) {




1913     }
1914     NOT_LP64(__ cmpxchg8(Address(addr, 0)));
1915 
1916   } else if (op->code() == lir_cas_int || op->code() == lir_cas_obj ) {
1917     NOT_LP64(assert(op->addr()->is_single_cpu(), "must be single");)
1918     Register addr = (op->addr()->is_single_cpu() ? op->addr()->as_register() : op->addr()->as_register_lo());
1919     Register newval = op->new_value()->as_register();
1920     Register cmpval = op->cmp_value()->as_register();
1921     assert(cmpval == rax, "wrong register");
1922     assert(newval != NULL, "new val must be register");
1923     assert(cmpval != newval, "cmp and new values must be in different registers");
1924     assert(cmpval != addr, "cmp and addr must be in different registers");
1925     assert(newval != addr, "new value and addr must be in different registers");
1926 
1927     if ( op->code() == lir_cas_obj) {
1928 #ifdef _LP64
1929       if (UseCompressedOops) {
1930         __ encode_heap_oop(cmpval);
1931         __ mov(rscratch1, newval);
1932         __ encode_heap_oop(rscratch1);
1933         if (os::is_MP()) {
1934           __ lock();
1935         }
1936         // cmpval (rax) is implicitly used by this instruction
1937         __ cmpxchgl(rscratch1, Address(addr, 0));
1938       } else
1939 #endif
1940       {
1941         if (os::is_MP()) {
1942           __ lock();
1943         }
1944         __ cmpxchgptr(newval, Address(addr, 0));
1945       }
1946    } else {
1947       assert(op->code() == lir_cas_int, "lir_cas_int expected");
1948       if (os::is_MP()) {
1949         __ lock();
1950       }
1951       __ cmpxchgl(newval, Address(addr, 0));
1952     }
1953 #ifdef _LP64
1954   } else if (op->code() == lir_cas_long) {
1955     Register addr = (op->addr()->is_single_cpu() ? op->addr()->as_register() : op->addr()->as_register_lo());
1956     Register newval = op->new_value()->as_register_lo();
1957     Register cmpval = op->cmp_value()->as_register_lo();
1958     assert(cmpval == rax, "wrong register");
1959     assert(newval != NULL, "new val must be register");
1960     assert(cmpval != newval, "cmp and new values must be in different registers");
1961     assert(cmpval != addr, "cmp and addr must be in different registers");
1962     assert(newval != addr, "new value and addr must be in different registers");
1963     if (os::is_MP()) {


< prev index next >