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