hotspot/src/cpu/sparc/vm/assembler_sparc.cpp
changeset 9976 6fef34e63df1
parent 9176 42d9d1010f38
child 10252 0981ce1c3eef
equal deleted inserted replaced
9975:82190b49ce14 9976:6fef34e63df1
    38 #include "runtime/stubRoutines.hpp"
    38 #include "runtime/stubRoutines.hpp"
    39 #ifndef SERIALGC
    39 #ifndef SERIALGC
    40 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
    40 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
    41 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
    41 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
    42 #include "gc_implementation/g1/heapRegion.hpp"
    42 #include "gc_implementation/g1/heapRegion.hpp"
       
    43 #endif
       
    44 
       
    45 #ifdef PRODUCT
       
    46 #define BLOCK_COMMENT(str) /* nothing */
       
    47 #else
       
    48 #define BLOCK_COMMENT(str) block_comment(str)
    43 #endif
    49 #endif
    44 
    50 
    45 // Convert the raw encoding form into the form expected by the
    51 // Convert the raw encoding form into the form expected by the
    46 // constructor for Address.
    52 // constructor for Address.
    47 Address Address::make_raw(int base, int index, int scale, int disp, bool disp_is_oop) {
    53 Address Address::make_raw(int base, int index, int scale, int disp, bool disp_is_oop) {
  1070   // check for pending exceptions. use Gtemp as scratch register.
  1076   // check for pending exceptions. use Gtemp as scratch register.
  1071   if (check_exceptions) {
  1077   if (check_exceptions) {
  1072     check_and_forward_exception(Gtemp);
  1078     check_and_forward_exception(Gtemp);
  1073   }
  1079   }
  1074 
  1080 
       
  1081 #ifdef ASSERT
       
  1082   set(badHeapWordVal, G3);
       
  1083   set(badHeapWordVal, G4);
       
  1084   set(badHeapWordVal, G5);
       
  1085 #endif
       
  1086 
  1075   // get oop result if there is one and reset the value in the thread
  1087   // get oop result if there is one and reset the value in the thread
  1076   if (oop_result->is_valid()) {
  1088   if (oop_result->is_valid()) {
  1077     get_vm_result(oop_result);
  1089     get_vm_result(oop_result);
  1078   }
  1090   }
  1079 }
  1091 }
  1175   save_thread(thread_cache);
  1187   save_thread(thread_cache);
  1176   // do the call
  1188   // do the call
  1177   call(entry_point, relocInfo::runtime_call_type);
  1189   call(entry_point, relocInfo::runtime_call_type);
  1178   delayed()->nop();
  1190   delayed()->nop();
  1179   restore_thread(thread_cache);
  1191   restore_thread(thread_cache);
       
  1192 #ifdef ASSERT
       
  1193   set(badHeapWordVal, G3);
       
  1194   set(badHeapWordVal, G4);
       
  1195   set(badHeapWordVal, G5);
       
  1196 #endif
  1180 }
  1197 }
  1181 
  1198 
  1182 
  1199 
  1183 void MacroAssembler::call_VM_leaf(Register thread_cache, address entry_point, int number_of_arguments) {
  1200 void MacroAssembler::call_VM_leaf(Register thread_cache, address entry_point, int number_of_arguments) {
  1184   call_VM_leaf_base(thread_cache, entry_point, number_of_arguments);
  1201   call_VM_leaf_base(thread_cache, entry_point, number_of_arguments);
  1516 
  1533 
  1517 
  1534 
  1518 // save_frame: given number of "extra" words in frame,
  1535 // save_frame: given number of "extra" words in frame,
  1519 // issue approp. save instruction (p 200, v8 manual)
  1536 // issue approp. save instruction (p 200, v8 manual)
  1520 
  1537 
  1521 void MacroAssembler::save_frame(int extraWords = 0) {
  1538 void MacroAssembler::save_frame(int extraWords) {
  1522   int delta = -total_frame_size_in_bytes(extraWords);
  1539   int delta = -total_frame_size_in_bytes(extraWords);
  1523   if (is_simm13(delta)) {
  1540   if (is_simm13(delta)) {
  1524     save(SP, delta, SP);
  1541     save(SP, delta, SP);
  1525   } else {
  1542   } else {
  1526     set(delta, G3_scratch);
  1543     set(delta, G3_scratch);
  1728   // plausibility check for oops
  1745   // plausibility check for oops
  1729   if (!VerifyOops) return;
  1746   if (!VerifyOops) return;
  1730 
  1747 
  1731   if (reg == G0)  return;       // always NULL, which is always an oop
  1748   if (reg == G0)  return;       // always NULL, which is always an oop
  1732 
  1749 
       
  1750   BLOCK_COMMENT("verify_oop {");
  1733   char buffer[64];
  1751   char buffer[64];
  1734 #ifdef COMPILER1
  1752 #ifdef COMPILER1
  1735   if (CommentedAssembly) {
  1753   if (CommentedAssembly) {
  1736     snprintf(buffer, sizeof(buffer), "verify_oop at %d", offset());
  1754     snprintf(buffer, sizeof(buffer), "verify_oop at %d", offset());
  1737     block_comment(buffer);
  1755     block_comment(buffer);
  1766   // Register call to verify_oop_subroutine
  1784   // Register call to verify_oop_subroutine
  1767   callr(O7, G0);
  1785   callr(O7, G0);
  1768   delayed()->nop();
  1786   delayed()->nop();
  1769   // recover frame size
  1787   // recover frame size
  1770   add(SP, 8*8,SP);
  1788   add(SP, 8*8,SP);
       
  1789   BLOCK_COMMENT("} verify_oop");
  1771 }
  1790 }
  1772 
  1791 
  1773 void MacroAssembler::_verify_oop_addr(Address addr, const char* msg, const char * file, int line) {
  1792 void MacroAssembler::_verify_oop_addr(Address addr, const char* msg, const char * file, int line) {
  1774   // plausibility check for oops
  1793   // plausibility check for oops
  1775   if (!VerifyOops) return;
  1794   if (!VerifyOops) return;
  2038       }
  2057       }
  2039       ThreadStateTransition::transition(JavaThread::current(), _thread_in_vm, saved_state);
  2058       ThreadStateTransition::transition(JavaThread::current(), _thread_in_vm, saved_state);
  2040   }
  2059   }
  2041   else
  2060   else
  2042      ::tty->print_cr("=============== DEBUG MESSAGE: %s ================\n", msg);
  2061      ::tty->print_cr("=============== DEBUG MESSAGE: %s ================\n", msg);
  2043   assert(false, "error");
  2062   assert(false, err_msg("DEBUG MESSAGE: %s", msg));
  2044 }
  2063 }
  2045 
  2064 
  2046 
  2065 
  2047 #ifndef PRODUCT
  2066 #ifndef PRODUCT
  2048 void MacroAssembler::test() {
  2067 void MacroAssembler::test() {
  3228   }
  3247   }
  3229 }
  3248 }
  3230 
  3249 
  3231 
  3250 
  3232 RegisterOrConstant MacroAssembler::argument_offset(RegisterOrConstant arg_slot,
  3251 RegisterOrConstant MacroAssembler::argument_offset(RegisterOrConstant arg_slot,
       
  3252                                                    Register temp_reg,
  3233                                                    int extra_slot_offset) {
  3253                                                    int extra_slot_offset) {
  3234   // cf. TemplateTable::prepare_invoke(), if (load_receiver).
  3254   // cf. TemplateTable::prepare_invoke(), if (load_receiver).
  3235   int stackElementSize = Interpreter::stackElementSize;
  3255   int stackElementSize = Interpreter::stackElementSize;
  3236   int offset = extra_slot_offset * stackElementSize;
  3256   int offset = extra_slot_offset * stackElementSize;
  3237   if (arg_slot.is_constant()) {
  3257   if (arg_slot.is_constant()) {
  3238     offset += arg_slot.as_constant() * stackElementSize;
  3258     offset += arg_slot.as_constant() * stackElementSize;
  3239     return offset;
  3259     return offset;
  3240   } else {
  3260   } else {
  3241     Register temp = arg_slot.as_register();
  3261     assert(temp_reg != noreg, "must specify");
  3242     sll_ptr(temp, exact_log2(stackElementSize), temp);
  3262     sll_ptr(arg_slot.as_register(), exact_log2(stackElementSize), temp_reg);
  3243     if (offset != 0)
  3263     if (offset != 0)
  3244       add(temp, offset, temp);
  3264       add(temp_reg, offset, temp_reg);
  3245     return temp;
  3265     return temp_reg;
  3246   }
  3266   }
  3247 }
  3267 }
  3248 
  3268 
  3249 
  3269 
  3250 Address MacroAssembler::argument_address(RegisterOrConstant arg_slot,
  3270 Address MacroAssembler::argument_address(RegisterOrConstant arg_slot,
       
  3271                                          Register temp_reg,
  3251                                          int extra_slot_offset) {
  3272                                          int extra_slot_offset) {
  3252   return Address(Gargs, argument_offset(arg_slot, extra_slot_offset));
  3273   return Address(Gargs, argument_offset(arg_slot, temp_reg, extra_slot_offset));
  3253 }
  3274 }
  3254 
  3275 
  3255 
  3276 
  3256 void MacroAssembler::biased_locking_enter(Register obj_reg, Register mark_reg,
  3277 void MacroAssembler::biased_locking_enter(Register obj_reg, Register mark_reg,
  3257                                           Register temp_reg,
  3278                                           Register temp_reg,
  4904   delayed()->lduw(ary1, limit, chr1); // hoisted
  4925   delayed()->lduw(ary1, limit, chr1); // hoisted
  4905 
  4926 
  4906   // Caller should set it:
  4927   // Caller should set it:
  4907   // add(G0, 1, result); // equals
  4928   // add(G0, 1, result); // equals
  4908 }
  4929 }
  4909