< prev index next >

src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp

Print this page
*** 810,16 ***
        case T_SHORT :   __ lha(to_reg->as_register(), offset, base); break;
        case T_INT   :   __ lwa(to_reg->as_register(), offset, base); break;
        case T_LONG  :   __ ld(to_reg->as_register_lo(), offset, base); break;
        case T_METADATA: __ ld(to_reg->as_register(), offset, base); break;
        case T_ADDRESS:
!         if (offset == oopDesc::klass_offset_in_bytes() && UseCompressedClassPointers) {
-           __ lwz(to_reg->as_register(), offset, base);
-           __ decode_klass_not_null(to_reg->as_register());
-         } else {
-           __ ld(to_reg->as_register(), offset, base);
-         }
          break;
        case T_ARRAY : // fall through
        case T_OBJECT:
          {
            if (UseCompressedOops && !wide) {
--- 810,11 ---
        case T_SHORT :   __ lha(to_reg->as_register(), offset, base); break;
        case T_INT   :   __ lwa(to_reg->as_register(), offset, base); break;
        case T_LONG  :   __ ld(to_reg->as_register_lo(), offset, base); break;
        case T_METADATA: __ ld(to_reg->as_register(), offset, base); break;
        case T_ADDRESS:
!         __ ld(to_reg->as_register(), offset, base);
          break;
        case T_ARRAY : // fall through
        case T_OBJECT:
          {
            if (UseCompressedOops && !wide) {

*** 2731,10 ***
--- 2726,32 ---
      }
    }
    __ bind(*op->stub()->continuation());
  }
  
+ void LIR_Assembler::emit_load_klass(LIR_OpLoadKlass* op) {
+   Register obj = op->obj()->as_pointer_register();
+   Register result = op->result_opr()->as_pointer_register();
+ 
+   CodeEmitInfo* info = op->info();
+   if (info != NULL) {
+     if (info != NULL) {
+       if (!os::zero_page_read_protected() || !ImplicitNullChecks) {
+         explicit_null_check(obj, info);
+       } else {
+         add_debug_info_for_null_check_here(info);
+       }
+     }
+   }
+ 
+   if (UseCompressedClassPointers) {
+     __ lwz(result, oopDesc::klass_offset_in_bytes(), obj);
+     __ decode_klass_not_null(result);
+   } else {
+     __ ld(result, oopDesc::klass_offset_in_bytes(), obj);
+   }
+ }
  
  void LIR_Assembler::emit_profile_call(LIR_OpProfileCall* op) {
    ciMethod* method = op->profiled_method();
    int bci          = op->profiled_bci();
    ciMethod* callee = op->profiled_callee();
< prev index next >