src/hotspot/cpu/sparc/frame_sparc.inline.hpp
changeset 49397 d3a8aa01f26f
parent 47216 71c04702a3d5
child 49480 d7df2dd501ce
equal deleted inserted replaced
49396:647ee5457fd1 49397:d3a8aa01f26f
     1 /*
     1 /*
     2  * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    83 inline address* frame::O0_addr() const  { return (address*) &younger_sp()[ I0->sp_offset_in_saved_window()]; }
    83 inline address* frame::O0_addr() const  { return (address*) &younger_sp()[ I0->sp_offset_in_saved_window()]; }
    84 
    84 
    85 inline intptr_t*    frame::sender_sp() const  { return fp(); }
    85 inline intptr_t*    frame::sender_sp() const  { return fp(); }
    86 
    86 
    87 inline intptr_t* frame::real_fp() const { return fp(); }
    87 inline intptr_t* frame::real_fp() const { return fp(); }
    88 
       
    89 // Used only in frame::oopmapreg_to_location
       
    90 // This return a value in VMRegImpl::slot_size
       
    91 inline int frame::pd_oop_map_offset_adjustment() const {
       
    92   return _sp_adjustment_by_callee * VMRegImpl::slots_per_word;
       
    93 }
       
    94 
    88 
    95 inline intptr_t** frame::interpreter_frame_locals_addr() const {
    89 inline intptr_t** frame::interpreter_frame_locals_addr() const {
    96   return (intptr_t**) sp_addr_at( Llocals->sp_offset_in_saved_window());
    90   return (intptr_t**) sp_addr_at( Llocals->sp_offset_in_saved_window());
    97 }
    91 }
    98 
    92 
   189   const Argument link = Argument(0, false);
   183   const Argument link = Argument(0, false);
   190   return (JavaCallWrapper**)&sp()[link.as_in().as_register()->sp_offset_in_saved_window()];
   184   return (JavaCallWrapper**)&sp()[link.as_in().as_register()->sp_offset_in_saved_window()];
   191 }
   185 }
   192 
   186 
   193 
   187 
   194 inline int frame::local_offset_for_compiler(int local_index, int nof_args, int max_nof_locals, int max_nof_monitors) {
       
   195    // always allocate non-argument locals 0..5 as if they were arguments:
       
   196   int allocated_above_frame = nof_args;
       
   197   if (allocated_above_frame < callee_register_argument_save_area_words)
       
   198     allocated_above_frame = callee_register_argument_save_area_words;
       
   199   if (allocated_above_frame > max_nof_locals)
       
   200     allocated_above_frame = max_nof_locals;
       
   201 
       
   202   // Note: monitors (BasicLock blocks) are never allocated in argument slots
       
   203   //assert(local_index >= 0 && local_index < max_nof_locals, "bad local index");
       
   204   if (local_index < allocated_above_frame)
       
   205     return local_index + callee_register_argument_save_area_sp_offset;
       
   206   else
       
   207     return local_index - (max_nof_locals + max_nof_monitors*2) + compiler_frame_vm_locals_fp_offset;
       
   208 }
       
   209 
       
   210 inline int frame::monitor_offset_for_compiler(int local_index, int nof_args, int max_nof_locals, int max_nof_monitors) {
       
   211   assert(local_index >= max_nof_locals && ((local_index - max_nof_locals) & 1) && (local_index - max_nof_locals) < max_nof_monitors*2, "bad monitor index");
       
   212 
       
   213   // The compiler uses the __higher__ of two indexes allocated to the monitor.
       
   214   // Increasing local indexes are mapped to increasing memory locations,
       
   215   // so the start of the BasicLock is associated with the __lower__ index.
       
   216 
       
   217   int offset = (local_index-1) - (max_nof_locals + max_nof_monitors*2) + compiler_frame_vm_locals_fp_offset;
       
   218 
       
   219   // We allocate monitors aligned zero mod 8:
       
   220   assert((offset & 1) == 0, "monitor must be an an even address.");
       
   221   // This works because all monitors are allocated after
       
   222   // all locals, and because the highest address corresponding to any
       
   223   // monitor index is always even.
       
   224   assert((compiler_frame_vm_locals_fp_offset & 1) == 0, "end of monitors must be even address");
       
   225 
       
   226   return offset;
       
   227 }
       
   228 
       
   229 inline int frame::min_local_offset_for_compiler(int nof_args, int max_nof_locals, int max_nof_monitors) {
       
   230    // always allocate non-argument locals 0..5 as if they were arguments:
       
   231   int allocated_above_frame = nof_args;
       
   232   if (allocated_above_frame < callee_register_argument_save_area_words)
       
   233     allocated_above_frame = callee_register_argument_save_area_words;
       
   234   if (allocated_above_frame > max_nof_locals)
       
   235     allocated_above_frame = max_nof_locals;
       
   236 
       
   237   int allocated_in_frame = (max_nof_locals + max_nof_monitors*2) - allocated_above_frame;
       
   238 
       
   239   return compiler_frame_vm_locals_fp_offset - allocated_in_frame;
       
   240 }
       
   241 
       
   242 // On SPARC, the %lN and %iN registers are non-volatile.
       
   243 inline bool frame::volatile_across_calls(Register reg) {
       
   244   // This predicate is (presently) applied only to temporary registers,
       
   245   // and so it need not recognize non-volatile globals.
       
   246   return reg->is_out() || reg->is_global();
       
   247 }
       
   248 
       
   249 inline oop  frame::saved_oop_result(RegisterMap* map) const      {
   188 inline oop  frame::saved_oop_result(RegisterMap* map) const      {
   250   return *((oop*) map->location(O0->as_VMReg()));
   189   return *((oop*) map->location(O0->as_VMReg()));
   251 }
   190 }
   252 
   191 
   253 inline void frame::set_saved_oop_result(RegisterMap* map, oop obj) {
   192 inline void frame::set_saved_oop_result(RegisterMap* map, oop obj) {