< prev index next >

src/cpu/aarch64/vm/macroAssembler_aarch64.hpp

Print this page
rev 8905 : 8135157: DMB elimination in AArch64 C2 synchronization implementation
Summary: Reduce memory barrier usage in C2 fast lock and unlock.
Reviewed-by: kvn
Contributed-by: wei.tang@linaro.org, aph@redhat.com


 900   void bang_stack_size(Register size, Register tmp);
 901 
 902   virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr,
 903                                                 Register tmp,
 904                                                 int offset);
 905 
 906   // Support for serializing memory accesses between threads
 907   void serialize_memory(Register thread, Register tmp);
 908 
 909   // Arithmetics
 910 
 911   void addptr(Address dst, int32_t src) {
 912     lea(rscratch2, dst);
 913     ldr(rscratch1, Address(rscratch2));
 914     add(rscratch1, rscratch1, src);
 915     str(rscratch1, Address(rscratch2));
 916   }
 917 
 918   void cmpptr(Register src1, Address src2);
 919 


 920   void cmpxchgptr(Register oldv, Register newv, Register addr, Register tmp,
 921                   Label &suceed, Label *fail);
 922 
 923   void cmpxchgw(Register oldv, Register newv, Register addr, Register tmp,
 924                   Label &suceed, Label *fail);
 925 
 926   void atomic_add(Register prev, RegisterOrConstant incr, Register addr);
 927   void atomic_addw(Register prev, RegisterOrConstant incr, Register addr);
 928 
 929   void atomic_xchg(Register prev, Register newv, Register addr);
 930   void atomic_xchgw(Register prev, Register newv, Register addr);
 931 
 932   void orptr(Address adr, RegisterOrConstant src) {
 933     ldr(rscratch2, adr);
 934     if (src.is_register())
 935       orr(rscratch2, rscratch2, src.as_register());
 936     else
 937       orr(rscratch2, rscratch2, src.as_constant());
 938     str(rscratch2, adr);

















 939   }
 940 
 941   // Calls
 942 
 943   address trampoline_call(Address entry, CodeBuffer *cbuf = NULL);
 944 
 945   static bool far_branches() {
 946     return ReservedCodeCacheSize > branch_range;
 947   }
 948 
 949   // Jumps that can reach anywhere in the code cache.
 950   // Trashes tmp.
 951   void far_call(Address entry, CodeBuffer *cbuf = NULL, Register tmp = rscratch1);
 952   void far_jump(Address entry, CodeBuffer *cbuf = NULL, Register tmp = rscratch1);
 953 
 954   static int far_branch_size() {
 955     if (far_branches()) {
 956       return 3 * 4;  // adrp, add, br
 957     } else {
 958       return 4;




 900   void bang_stack_size(Register size, Register tmp);
 901 
 902   virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr,
 903                                                 Register tmp,
 904                                                 int offset);
 905 
 906   // Support for serializing memory accesses between threads
 907   void serialize_memory(Register thread, Register tmp);
 908 
 909   // Arithmetics
 910 
 911   void addptr(Address dst, int32_t src) {
 912     lea(rscratch2, dst);
 913     ldr(rscratch1, Address(rscratch2));
 914     add(rscratch1, rscratch1, src);
 915     str(rscratch1, Address(rscratch2));
 916   }
 917 
 918   void cmpptr(Register src1, Address src2);
 919 
 920   // Various forms of CAS
 921 
 922   void cmpxchgptr(Register oldv, Register newv, Register addr, Register tmp,
 923                   Label &suceed, Label *fail);
 924 
 925   void cmpxchgw(Register oldv, Register newv, Register addr, Register tmp,
 926                   Label &suceed, Label *fail);
 927 
 928   void atomic_add(Register prev, RegisterOrConstant incr, Register addr);
 929   void atomic_addw(Register prev, RegisterOrConstant incr, Register addr);
 930 
 931   void atomic_xchg(Register prev, Register newv, Register addr);
 932   void atomic_xchgw(Register prev, Register newv, Register addr);
 933 
 934   void orptr(Address adr, RegisterOrConstant src) {
 935     ldr(rscratch2, adr);
 936     if (src.is_register())
 937       orr(rscratch2, rscratch2, src.as_register());
 938     else
 939       orr(rscratch2, rscratch2, src.as_constant());
 940     str(rscratch2, adr);
 941   }
 942 
 943   // A generic CAS; success or failure is in the EQ flag.
 944   template <typename T1, typename T2>
 945   void cmpxchg(Register addr, Register expected, Register new_val,
 946                T1 load_insn,
 947                void (MacroAssembler::*cmp_insn)(Register, Register),
 948                T2 store_insn,
 949                Register tmp = rscratch1) {
 950     Label retry_load, done;
 951     bind(retry_load);
 952     (this->*load_insn)(tmp, addr);
 953     (this->*cmp_insn)(tmp, expected);
 954     br(Assembler::NE, done);
 955     (this->*store_insn)(tmp, new_val, addr);
 956     cbnzw(tmp, retry_load);
 957     bind(done);
 958   }
 959 
 960   // Calls
 961 
 962   address trampoline_call(Address entry, CodeBuffer *cbuf = NULL);
 963 
 964   static bool far_branches() {
 965     return ReservedCodeCacheSize > branch_range;
 966   }
 967 
 968   // Jumps that can reach anywhere in the code cache.
 969   // Trashes tmp.
 970   void far_call(Address entry, CodeBuffer *cbuf = NULL, Register tmp = rscratch1);
 971   void far_jump(Address entry, CodeBuffer *cbuf = NULL, Register tmp = rscratch1);
 972 
 973   static int far_branch_size() {
 974     if (far_branches()) {
 975       return 3 * 4;  // adrp, add, br
 976     } else {
 977       return 4;


< prev index next >