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;
|