921
922 void set_narrow_oop(Register dst, jobject obj);
923
924 void encode_klass_not_null(Register r);
925 void decode_klass_not_null(Register r);
926 void encode_klass_not_null(Register dst, Register src);
927 void decode_klass_not_null(Register dst, Register src);
928
929 void set_narrow_klass(Register dst, Klass* k);
930
931 // if heap base register is used - reinit it with the correct value
932 void reinit_heapbase();
933
934 DEBUG_ONLY(void verify_heapbase(const char* msg);)
935
936 void push_CPU_state(bool save_vectors = false, bool use_sve = false,
937 int sve_vector_size_in_bytes = 0, int total_predicate_in_bytes = 0);
938 void pop_CPU_state(bool restore_vectors = false, bool use_sve = false,
939 int sve_vector_size_in_bytes = 0, int total_predicate_in_bytes = 0);
940
941 void push_cont_fastpath(Register java_thread);
942 void pop_cont_fastpath(Register java_thread);
943
944 // Round up to a power of two
945 void round_to(Register reg, int modulus);
946
947 // java.lang.Math::round intrinsics
948 void java_round_double(Register dst, FloatRegister src, FloatRegister ftmp);
949 void java_round_float(Register dst, FloatRegister src, FloatRegister ftmp);
950
951 // allocation
952 void tlab_allocate(
953 Register obj, // result: pointer to object after successful allocation
954 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
955 int con_size_in_bytes, // object size in bytes if known at compile time
956 Register t1, // temp register
957 Register t2, // temp register
958 Label& slow_case // continuation point if fast allocation fails
959 );
960 void verify_tlab();
961
962 // interface method calling
1072 if (VerifyOops) {
1073 _verify_oop_addr(reg, s, file, line);
1074 }
1075 }
1076
1077 // TODO: verify method and klass metadata (compare against vptr?)
1078 void _verify_method_ptr(Register reg, const char * msg, const char * file, int line) {}
1079 void _verify_klass_ptr(Register reg, const char * msg, const char * file, int line){}
1080
1081 #define verify_oop(reg) _verify_oop_checked(reg, "broken oop " #reg, __FILE__, __LINE__)
1082 #define verify_oop_msg(reg, msg) _verify_oop_checked(reg, "broken oop " #reg ", " #msg, __FILE__, __LINE__)
1083 #define verify_oop_addr(addr) _verify_oop_addr_checked(addr, "broken oop addr " #addr, __FILE__, __LINE__)
1084 #define verify_method_ptr(reg) _verify_method_ptr(reg, "broken method " #reg, __FILE__, __LINE__)
1085 #define verify_klass_ptr(reg) _verify_klass_ptr(reg, "broken klass " #reg, __FILE__, __LINE__)
1086
1087 // Restore cpu control state after JNI call
1088 void restore_cpu_control_state_after_jni(Register tmp1, Register tmp2);
1089
1090 // prints msg, dumps registers and stops execution
1091 void stop(const char* msg);
1092
1093 static void debug64(char* msg, int64_t pc, int64_t regs[]);
1094
1095 void untested() { stop("untested"); }
1096
1097 void unimplemented(const char* what = "");
1098
1099 void should_not_reach_here() { stop("should not reach here"); }
1100
1101 void _assert_asm(Condition cc, const char* msg);
1102 #define assert_asm0(cc, msg) _assert_asm(cc, FILE_AND_LINE ": " msg)
1103 #define assert_asm(masm, command, cc, msg) DEBUG_ONLY(command; (masm)->_assert_asm(cc, FILE_AND_LINE ": " #command " " #cc ": " msg))
1104
1105 // Stack overflow checking
1106 void bang_stack_with_offset(int offset) {
1107 // stack grows down, caller passes positive offset
1108 assert(offset > 0, "must bang with negative offset");
1109 sub(rscratch2, sp, offset);
1110 str(zr, Address(rscratch2));
1111 }
|
921
922 void set_narrow_oop(Register dst, jobject obj);
923
924 void encode_klass_not_null(Register r);
925 void decode_klass_not_null(Register r);
926 void encode_klass_not_null(Register dst, Register src);
927 void decode_klass_not_null(Register dst, Register src);
928
929 void set_narrow_klass(Register dst, Klass* k);
930
931 // if heap base register is used - reinit it with the correct value
932 void reinit_heapbase();
933
934 DEBUG_ONLY(void verify_heapbase(const char* msg);)
935
936 void push_CPU_state(bool save_vectors = false, bool use_sve = false,
937 int sve_vector_size_in_bytes = 0, int total_predicate_in_bytes = 0);
938 void pop_CPU_state(bool restore_vectors = false, bool use_sve = false,
939 int sve_vector_size_in_bytes = 0, int total_predicate_in_bytes = 0);
940
941 void push_cont_fastpath(Register java_thread = rthread);
942 void pop_cont_fastpath(Register java_thread = rthread);
943
944 void inc_held_monitor_count();
945 void dec_held_monitor_count();
946
947 // Round up to a power of two
948 void round_to(Register reg, int modulus);
949
950 // java.lang.Math::round intrinsics
951 void java_round_double(Register dst, FloatRegister src, FloatRegister ftmp);
952 void java_round_float(Register dst, FloatRegister src, FloatRegister ftmp);
953
954 // allocation
955 void tlab_allocate(
956 Register obj, // result: pointer to object after successful allocation
957 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
958 int con_size_in_bytes, // object size in bytes if known at compile time
959 Register t1, // temp register
960 Register t2, // temp register
961 Label& slow_case // continuation point if fast allocation fails
962 );
963 void verify_tlab();
964
965 // interface method calling
1075 if (VerifyOops) {
1076 _verify_oop_addr(reg, s, file, line);
1077 }
1078 }
1079
1080 // TODO: verify method and klass metadata (compare against vptr?)
1081 void _verify_method_ptr(Register reg, const char * msg, const char * file, int line) {}
1082 void _verify_klass_ptr(Register reg, const char * msg, const char * file, int line){}
1083
1084 #define verify_oop(reg) _verify_oop_checked(reg, "broken oop " #reg, __FILE__, __LINE__)
1085 #define verify_oop_msg(reg, msg) _verify_oop_checked(reg, "broken oop " #reg ", " #msg, __FILE__, __LINE__)
1086 #define verify_oop_addr(addr) _verify_oop_addr_checked(addr, "broken oop addr " #addr, __FILE__, __LINE__)
1087 #define verify_method_ptr(reg) _verify_method_ptr(reg, "broken method " #reg, __FILE__, __LINE__)
1088 #define verify_klass_ptr(reg) _verify_klass_ptr(reg, "broken klass " #reg, __FILE__, __LINE__)
1089
1090 // Restore cpu control state after JNI call
1091 void restore_cpu_control_state_after_jni(Register tmp1, Register tmp2);
1092
1093 // prints msg, dumps registers and stops execution
1094 void stop(const char* msg);
1095 void trace(const char* msg);
1096
1097 static void debug64(char* msg, int64_t pc, int64_t regs[]);
1098
1099 void untested() { stop("untested"); }
1100
1101 void unimplemented(const char* what = "");
1102
1103 void should_not_reach_here() { stop("should not reach here"); }
1104
1105 void _assert_asm(Condition cc, const char* msg);
1106 #define assert_asm0(cc, msg) _assert_asm(cc, FILE_AND_LINE ": " msg)
1107 #define assert_asm(masm, command, cc, msg) DEBUG_ONLY(command; (masm)->_assert_asm(cc, FILE_AND_LINE ": " #command " " #cc ": " msg))
1108
1109 // Stack overflow checking
1110 void bang_stack_with_offset(int offset) {
1111 // stack grows down, caller passes positive offset
1112 assert(offset > 0, "must bang with negative offset");
1113 sub(rscratch2, sp, offset);
1114 str(zr, Address(rscratch2));
1115 }
|