3103 load_const_optimized(tmp1, entry);
3104
3105 set_last_Java_frame(/*sp=*/sp, /*pc=*/tmp1);
3106 }
3107
3108 void MacroAssembler::get_vm_result(Register oop_result) {
3109 // Read:
3110 // R16_thread
3111 // R16_thread->in_bytes(JavaThread::vm_result_offset())
3112 //
3113 // Updated:
3114 // oop_result
3115 // R16_thread->in_bytes(JavaThread::vm_result_offset())
3116
3117 verify_thread();
3118
3119 ld(oop_result, in_bytes(JavaThread::vm_result_offset()), R16_thread);
3120 li(R0, 0);
3121 std(R0, in_bytes(JavaThread::vm_result_offset()), R16_thread);
3122
3123 verify_oop(oop_result);
3124 }
3125
3126 void MacroAssembler::get_vm_result_2(Register metadata_result) {
3127 // Read:
3128 // R16_thread
3129 // R16_thread->in_bytes(JavaThread::vm_result_2_offset())
3130 //
3131 // Updated:
3132 // metadata_result
3133 // R16_thread->in_bytes(JavaThread::vm_result_2_offset())
3134
3135 ld(metadata_result, in_bytes(JavaThread::vm_result_2_offset()), R16_thread);
3136 li(R0, 0);
3137 std(R0, in_bytes(JavaThread::vm_result_2_offset()), R16_thread);
3138 }
3139
3140 Register MacroAssembler::encode_klass_not_null(Register dst, Register src) {
3141 Register current = (src != noreg) ? src : dst; // Klass is in dst if no src provided.
3142 if (CompressedKlassPointers::base() != 0) {
3143 // Use dst as temp if it is free.
4898 switch (size) {
4899 case 4:
4900 lwz(R0, mem_offset, mem_base);
4901 cmpwi(CCR0, R0, 0);
4902 break;
4903 case 8:
4904 ld(R0, mem_offset, mem_base);
4905 cmpdi(CCR0, R0, 0);
4906 break;
4907 default:
4908 ShouldNotReachHere();
4909 }
4910 asm_assert(check_equal, msg, id);
4911 #endif // ASSERT
4912 }
4913
4914 void MacroAssembler::verify_thread() {
4915 if (VerifyThread) {
4916 unimplemented("'VerifyThread' currently not implemented on PPC");
4917 }
4918 }
4919
4920 // READ: oop. KILL: R0. Volatile floats perhaps.
4921 void MacroAssembler::verify_oop(Register oop, const char* msg) {
4922 if (!VerifyOops) {
4923 return;
4924 }
4925
4926 address/* FunctionDescriptor** */fd = StubRoutines::verify_oop_subroutine_entry_address();
4927 const Register tmp = R11; // Will be preserved.
4928 const int nbytes_save = MacroAssembler::num_volatile_regs * 8;
4929 save_volatile_gprs(R1_SP, -nbytes_save); // except R0
4930
4931 mr_if_needed(R4_ARG2, oop);
4932 save_LR_CR(tmp); // save in old frame
4933 push_frame_reg_args(nbytes_save, tmp);
4934 // load FunctionDescriptor** / entry_address *
4935 load_const_optimized(tmp, fd, R0);
4936 // load FunctionDescriptor* / entry_address
4937 ld(tmp, 0, tmp);
|
3103 load_const_optimized(tmp1, entry);
3104
3105 set_last_Java_frame(/*sp=*/sp, /*pc=*/tmp1);
3106 }
3107
3108 void MacroAssembler::get_vm_result(Register oop_result) {
3109 // Read:
3110 // R16_thread
3111 // R16_thread->in_bytes(JavaThread::vm_result_offset())
3112 //
3113 // Updated:
3114 // oop_result
3115 // R16_thread->in_bytes(JavaThread::vm_result_offset())
3116
3117 verify_thread();
3118
3119 ld(oop_result, in_bytes(JavaThread::vm_result_offset()), R16_thread);
3120 li(R0, 0);
3121 std(R0, in_bytes(JavaThread::vm_result_offset()), R16_thread);
3122
3123 verify_oop(oop_result, FILE_AND_LINE);
3124 }
3125
3126 void MacroAssembler::get_vm_result_2(Register metadata_result) {
3127 // Read:
3128 // R16_thread
3129 // R16_thread->in_bytes(JavaThread::vm_result_2_offset())
3130 //
3131 // Updated:
3132 // metadata_result
3133 // R16_thread->in_bytes(JavaThread::vm_result_2_offset())
3134
3135 ld(metadata_result, in_bytes(JavaThread::vm_result_2_offset()), R16_thread);
3136 li(R0, 0);
3137 std(R0, in_bytes(JavaThread::vm_result_2_offset()), R16_thread);
3138 }
3139
3140 Register MacroAssembler::encode_klass_not_null(Register dst, Register src) {
3141 Register current = (src != noreg) ? src : dst; // Klass is in dst if no src provided.
3142 if (CompressedKlassPointers::base() != 0) {
3143 // Use dst as temp if it is free.
4898 switch (size) {
4899 case 4:
4900 lwz(R0, mem_offset, mem_base);
4901 cmpwi(CCR0, R0, 0);
4902 break;
4903 case 8:
4904 ld(R0, mem_offset, mem_base);
4905 cmpdi(CCR0, R0, 0);
4906 break;
4907 default:
4908 ShouldNotReachHere();
4909 }
4910 asm_assert(check_equal, msg, id);
4911 #endif // ASSERT
4912 }
4913
4914 void MacroAssembler::verify_thread() {
4915 if (VerifyThread) {
4916 unimplemented("'VerifyThread' currently not implemented on PPC");
4917 }
4918 }
4919
4920 void MacroAssembler::verify_coop(Register coop, const char* msg) {
4921 if (!VerifyOops) { return; }
4922 if (UseCompressedOops) { decode_heap_oop(coop); }
4923 verify_oop(coop, msg);
4924 if (UseCompressedOops) { encode_heap_oop(coop, coop); }
4925 }
4926
4927 // READ: oop. KILL: R0. Volatile floats perhaps.
4928 void MacroAssembler::verify_oop(Register oop, const char* msg) {
4929 if (!VerifyOops) {
4930 return;
4931 }
4932
4933 address/* FunctionDescriptor** */fd = StubRoutines::verify_oop_subroutine_entry_address();
4934 const Register tmp = R11; // Will be preserved.
4935 const int nbytes_save = MacroAssembler::num_volatile_regs * 8;
4936 save_volatile_gprs(R1_SP, -nbytes_save); // except R0
4937
4938 mr_if_needed(R4_ARG2, oop);
4939 save_LR_CR(tmp); // save in old frame
4940 push_frame_reg_args(nbytes_save, tmp);
4941 // load FunctionDescriptor** / entry_address *
4942 load_const_optimized(tmp, fd, R0);
4943 // load FunctionDescriptor* / entry_address
4944 ld(tmp, 0, tmp);
|