hotspot/src/cpu/ppc/vm/vtableStubs_ppc_64.cpp
changeset 23492 af5352f40e65
parent 22861 f5c393d456fc
child 30303 c703c89fddbf
equal deleted inserted replaced
23491:f690330b10b9 23492:af5352f40e65
     1 /*
     1 /*
     2  * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
     3  * Copyright 2012, 2013 SAP AG. All rights reserved.
     3  * Copyright 2012, 2014 SAP AG. All rights reserved.
     4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     5  *
     5  *
     6  * This code is free software; you can redistribute it and/or modify it
     6  * This code is free software; you can redistribute it and/or modify it
     7  * under the terms of the GNU General Public License version 2 only, as
     7  * under the terms of the GNU General Public License version 2 only, as
     8  * published by the Free Software Foundation.
     8  * published by the Free Software Foundation.
    77 
    77 
    78   // We might implicit NULL fault here.
    78   // We might implicit NULL fault here.
    79   address npe_addr = __ pc(); // npe = null pointer exception
    79   address npe_addr = __ pc(); // npe = null pointer exception
    80   __ load_klass_with_trap_null_check(rcvr_klass, R3);
    80   __ load_klass_with_trap_null_check(rcvr_klass, R3);
    81 
    81 
    82  // Set methodOop (in case of interpreted method), and destination address.
    82  // Set method (in case of interpreted method), and destination address.
    83   int entry_offset = InstanceKlass::vtable_start_offset() + vtable_index*vtableEntry::size();
    83   int entry_offset = InstanceKlass::vtable_start_offset() + vtable_index*vtableEntry::size();
    84 
    84 
    85 #ifndef PRODUCT
    85 #ifndef PRODUCT
    86   if (DebugVtables) {
    86   if (DebugVtables) {
    87     Label L;
    87     Label L;
   159 
   159 
   160   // We might implicit NULL fault here.
   160   // We might implicit NULL fault here.
   161   address npe_addr = __ pc(); // npe = null pointer exception
   161   address npe_addr = __ pc(); // npe = null pointer exception
   162   __ load_klass_with_trap_null_check(rcvr_klass, R3_ARG1);
   162   __ load_klass_with_trap_null_check(rcvr_klass, R3_ARG1);
   163 
   163 
   164   //__ ld(rcvr_klass, oopDesc::klass_offset_in_bytes(), R3_ARG1);
       
   165 
       
   166   BLOCK_COMMENT("Load start of itable entries into itable_entry.");
   164   BLOCK_COMMENT("Load start of itable entries into itable_entry.");
   167   __ lwz(vtable_len, InstanceKlass::vtable_length_offset() * wordSize, rcvr_klass);
   165   __ lwz(vtable_len, InstanceKlass::vtable_length_offset() * wordSize, rcvr_klass);
   168   __ slwi(vtable_len, vtable_len, exact_log2(vtableEntry::size() * wordSize));
   166   __ slwi(vtable_len, vtable_len, exact_log2(vtableEntry::size() * wordSize));
   169   __ add(itable_entry_addr, vtable_len, rcvr_klass);
   167   __ add(itable_entry_addr, vtable_len, rcvr_klass);
   170 
   168 
   197   const int vtable_offset_offset = (itableOffsetEntry::offset_offset_in_bytes() -
   195   const int vtable_offset_offset = (itableOffsetEntry::offset_offset_in_bytes() -
   198                                     itableOffsetEntry::interface_offset_in_bytes()) -
   196                                     itableOffsetEntry::interface_offset_in_bytes()) -
   199                                    itable_offset_search_inc;
   197                                    itable_offset_search_inc;
   200   __ lwz(vtable_offset, vtable_offset_offset, itable_entry_addr);
   198   __ lwz(vtable_offset, vtable_offset_offset, itable_entry_addr);
   201 
   199 
   202   // Compute itableMethodEntry and get methodOop and entry point for compiler.
   200   // Compute itableMethodEntry and get method and entry point for compiler.
   203   const int method_offset = (itableMethodEntry::size() * wordSize * vtable_index) +
   201   const int method_offset = (itableMethodEntry::size() * wordSize * vtable_index) +
   204     itableMethodEntry::method_offset_in_bytes();
   202     itableMethodEntry::method_offset_in_bytes();
   205 
   203 
   206   __ add(itable_method, rcvr_klass, vtable_offset);
   204   __ add(itable_method, rcvr_klass, vtable_offset);
   207   __ ld(R19_method, method_offset, itable_method);
   205   __ ld(R19_method, method_offset, itable_method);
   209 #ifndef PRODUCT
   207 #ifndef PRODUCT
   210   if (DebugVtables) {
   208   if (DebugVtables) {
   211     Label ok;
   209     Label ok;
   212     __ cmpd(CCR0, R19_method, 0);
   210     __ cmpd(CCR0, R19_method, 0);
   213     __ bne(CCR0, ok);
   211     __ bne(CCR0, ok);
   214     __ stop("methodOop is null", 103);
   212     __ stop("method is null", 103);
   215     __ bind(ok);
   213     __ bind(ok);
   216   }
   214   }
   217 #endif
   215 #endif
   218 
   216 
   219   // If the vtable entry is null, the method is abstract.
   217   // If the vtable entry is null, the method is abstract.