977 // Various forms of CAS 978 979 void cmpxchg_obj_header(Register oldv, Register newv, Register obj, Register tmp, 980 Label &suceed, Label *fail); 981 void cmpxchgptr(Register oldv, Register newv, Register addr, Register tmp, 982 Label &suceed, Label *fail); 983 984 void cmpxchgw(Register oldv, Register newv, Register addr, Register tmp, 985 Label &suceed, Label *fail); 986 987 void atomic_add(Register prev, RegisterOrConstant incr, Register addr); 988 void atomic_addw(Register prev, RegisterOrConstant incr, Register addr); 989 void atomic_addal(Register prev, RegisterOrConstant incr, Register addr); 990 void atomic_addalw(Register prev, RegisterOrConstant incr, Register addr); 991 992 void atomic_xchg(Register prev, Register newv, Register addr); 993 void atomic_xchgw(Register prev, Register newv, Register addr); 994 void atomic_xchgal(Register prev, Register newv, Register addr); 995 void atomic_xchgalw(Register prev, Register newv, Register addr); 996 997 void orptr(Address adr, RegisterOrConstant src) { 998 ldr(rscratch2, adr); 999 if (src.is_register()) 1000 orr(rscratch2, rscratch2, src.as_register()); 1001 else 1002 orr(rscratch2, rscratch2, src.as_constant()); 1003 str(rscratch2, adr); 1004 } 1005 1006 // A generic CAS; success or failure is in the EQ flag. 1007 // Clobbers rscratch1 1008 void cmpxchg(Register addr, Register expected, Register new_val, 1009 enum operand_size size, 1010 bool acquire, bool release, bool weak, 1011 Register result); 1012 1013 // Calls 1014 1015 address trampoline_call(Address entry, CodeBuffer *cbuf = NULL); 1016 1017 static bool far_branches() { 1018 return ReservedCodeCacheSize > branch_range; 1019 } 1020 1021 // Jumps that can reach anywhere in the code cache. 1022 // Trashes tmp. 1023 void far_call(Address entry, CodeBuffer *cbuf = NULL, Register tmp = rscratch1); | 977 // Various forms of CAS 978 979 void cmpxchg_obj_header(Register oldv, Register newv, Register obj, Register tmp, 980 Label &suceed, Label *fail); 981 void cmpxchgptr(Register oldv, Register newv, Register addr, Register tmp, 982 Label &suceed, Label *fail); 983 984 void cmpxchgw(Register oldv, Register newv, Register addr, Register tmp, 985 Label &suceed, Label *fail); 986 987 void atomic_add(Register prev, RegisterOrConstant incr, Register addr); 988 void atomic_addw(Register prev, RegisterOrConstant incr, Register addr); 989 void atomic_addal(Register prev, RegisterOrConstant incr, Register addr); 990 void atomic_addalw(Register prev, RegisterOrConstant incr, Register addr); 991 992 void atomic_xchg(Register prev, Register newv, Register addr); 993 void atomic_xchgw(Register prev, Register newv, Register addr); 994 void atomic_xchgal(Register prev, Register newv, Register addr); 995 void atomic_xchgalw(Register prev, Register newv, Register addr); 996 997 void orptr(Address adr, RegisterOrConstant src, Register tmp = rscratch1) { 998 ldr(tmp, adr); 999 if (src.is_register()) 1000 orr(tmp, tmp, src.as_register()); 1001 else 1002 orr(tmp, tmp, src.as_constant()); 1003 str(tmp, adr); 1004 } 1005 1006 // A generic CAS; success or failure is in the EQ flag. 1007 // Clobbers rscratch1 1008 void cmpxchg(Register addr, Register expected, Register new_val, 1009 enum operand_size size, 1010 bool acquire, bool release, bool weak, 1011 Register result); 1012 1013 // Calls 1014 1015 address trampoline_call(Address entry, CodeBuffer *cbuf = NULL); 1016 1017 static bool far_branches() { 1018 return ReservedCodeCacheSize > branch_range; 1019 } 1020 1021 // Jumps that can reach anywhere in the code cache. 1022 // Trashes tmp. 1023 void far_call(Address entry, CodeBuffer *cbuf = NULL, Register tmp = rscratch1); |