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()) {
|