1003 void atomic_xchg(Register prev, Register newv, Register addr); 1004 void atomic_xchgw(Register prev, Register newv, Register addr); 1005 void atomic_xchgal(Register prev, Register newv, Register addr); 1006 void atomic_xchgalw(Register prev, Register newv, Register addr); 1007 1008 void orptr(Address adr, RegisterOrConstant src) { 1009 ldr(rscratch1, adr); 1010 if (src.is_register()) 1011 orr(rscratch1, rscratch1, src.as_register()); 1012 else 1013 orr(rscratch1, rscratch1, src.as_constant()); 1014 str(rscratch1, adr); 1015 } 1016 1017 // A generic CAS; success or failure is in the EQ flag. 1018 // Clobbers rscratch1 1019 void cmpxchg(Register addr, Register expected, Register new_val, 1020 enum operand_size size, 1021 bool acquire, bool release, bool weak, 1022 Register result); 1023 1024 // Calls 1025 1026 address trampoline_call(Address entry, CodeBuffer *cbuf = NULL); 1027 1028 static bool far_branches() { 1029 return ReservedCodeCacheSize > branch_range || UseAOT; 1030 } 1031 1032 // Jumps that can reach anywhere in the code cache. 1033 // Trashes tmp. 1034 void far_call(Address entry, CodeBuffer *cbuf = NULL, Register tmp = rscratch1); 1035 void far_jump(Address entry, CodeBuffer *cbuf = NULL, Register tmp = rscratch1); 1036 1037 static int far_branch_size() { 1038 if (far_branches()) { 1039 return 3 * 4; // adrp, add, br 1040 } else { 1041 return 4; 1042 } 1043 } | 1003 void atomic_xchg(Register prev, Register newv, Register addr); 1004 void atomic_xchgw(Register prev, Register newv, Register addr); 1005 void atomic_xchgal(Register prev, Register newv, Register addr); 1006 void atomic_xchgalw(Register prev, Register newv, Register addr); 1007 1008 void orptr(Address adr, RegisterOrConstant src) { 1009 ldr(rscratch1, adr); 1010 if (src.is_register()) 1011 orr(rscratch1, rscratch1, src.as_register()); 1012 else 1013 orr(rscratch1, rscratch1, src.as_constant()); 1014 str(rscratch1, adr); 1015 } 1016 1017 // A generic CAS; success or failure is in the EQ flag. 1018 // Clobbers rscratch1 1019 void cmpxchg(Register addr, Register expected, Register new_val, 1020 enum operand_size size, 1021 bool acquire, bool release, bool weak, 1022 Register result); 1023 private: 1024 void compare_eq(Register rn, Register rm, enum operand_size size); 1025 1026 public: 1027 // Calls 1028 1029 address trampoline_call(Address entry, CodeBuffer *cbuf = NULL); 1030 1031 static bool far_branches() { 1032 return ReservedCodeCacheSize > branch_range || UseAOT; 1033 } 1034 1035 // Jumps that can reach anywhere in the code cache. 1036 // Trashes tmp. 1037 void far_call(Address entry, CodeBuffer *cbuf = NULL, Register tmp = rscratch1); 1038 void far_jump(Address entry, CodeBuffer *cbuf = NULL, Register tmp = rscratch1); 1039 1040 static int far_branch_size() { 1041 if (far_branches()) { 1042 return 3 * 4; // adrp, add, br 1043 } else { 1044 return 4; 1045 } 1046 } |