< prev index next >

src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp

Print this page




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   }


< prev index next >