Mercurial > hg > graal-compiler
comparison src/cpu/sparc/vm/templateInterpreter_sparc.cpp @ 1506:2338d41fbd81
6943304: remove tagged stack interpreter
Reviewed-by: coleenp, never, gbenson
author | twisti |
---|---|
date | Fri, 30 Apr 2010 08:37:24 -0700 |
parents | c640000b7cc1 |
children | c18cbe5936b8 ab102d5d923e |
comparison
equal
deleted
inserted
replaced
1505:0c5b3cf3c1f5 | 1506:2338d41fbd81 |
---|---|
195 __ get_cache_and_index_at_bcp(cache, G1_scratch, 1); | 195 __ get_cache_and_index_at_bcp(cache, G1_scratch, 1); |
196 __ bind(L_got_cache); | 196 __ bind(L_got_cache); |
197 __ ld_ptr(cache, constantPoolCacheOopDesc::base_offset() + | 197 __ ld_ptr(cache, constantPoolCacheOopDesc::base_offset() + |
198 ConstantPoolCacheEntry::flags_offset(), size); | 198 ConstantPoolCacheEntry::flags_offset(), size); |
199 __ and3(size, 0xFF, size); // argument size in words | 199 __ and3(size, 0xFF, size); // argument size in words |
200 __ sll(size, Interpreter::logStackElementSize(), size); // each argument size in bytes | 200 __ sll(size, Interpreter::logStackElementSize, size); // each argument size in bytes |
201 __ add(Lesp, size, Lesp); // pop arguments | 201 __ add(Lesp, size, Lesp); // pop arguments |
202 __ dispatch_next(state, step); | 202 __ dispatch_next(state, step); |
203 | 203 |
204 // out of the main line of code... | 204 // out of the main line of code... |
205 if (EnableInvokeDynamic) { | 205 if (EnableInvokeDynamic) { |
493 | 493 |
494 // Gargs points to first local + BytesPerWord | 494 // Gargs points to first local + BytesPerWord |
495 // Set the saved SP after the register window save | 495 // Set the saved SP after the register window save |
496 // | 496 // |
497 assert_different_registers(Gargs, Glocals_size, Gframe_size, O5_savedSP); | 497 assert_different_registers(Gargs, Glocals_size, Gframe_size, O5_savedSP); |
498 __ sll(Glocals_size, Interpreter::logStackElementSize(), Otmp1); | 498 __ sll(Glocals_size, Interpreter::logStackElementSize, Otmp1); |
499 __ add(Gargs, Otmp1, Gargs); | 499 __ add(Gargs, Otmp1, Gargs); |
500 | 500 |
501 if (native_call) { | 501 if (native_call) { |
502 __ calc_mem_param_words( Glocals_size, Gframe_size ); | 502 __ calc_mem_param_words( Glocals_size, Gframe_size ); |
503 __ add( Gframe_size, extra_space, Gframe_size); | 503 __ add( Gframe_size, extra_space, Gframe_size); |
509 // Compute number of locals in method apart from incoming parameters | 509 // Compute number of locals in method apart from incoming parameters |
510 // | 510 // |
511 __ lduh( size_of_locals, Otmp1 ); | 511 __ lduh( size_of_locals, Otmp1 ); |
512 __ sub( Otmp1, Glocals_size, Glocals_size ); | 512 __ sub( Otmp1, Glocals_size, Glocals_size ); |
513 __ round_to( Glocals_size, WordsPerLong ); | 513 __ round_to( Glocals_size, WordsPerLong ); |
514 __ sll( Glocals_size, Interpreter::logStackElementSize(), Glocals_size ); | 514 __ sll( Glocals_size, Interpreter::logStackElementSize, Glocals_size ); |
515 | 515 |
516 // see if the frame is greater than one page in size. If so, | 516 // see if the frame is greater than one page in size. If so, |
517 // then we need to verify there is enough stack space remaining | 517 // then we need to verify there is enough stack space remaining |
518 // Frame_size = (max_stack + extra_space) * BytesPerWord; | 518 // Frame_size = (max_stack + extra_space) * BytesPerWord; |
519 __ lduh( max_stack, Gframe_size ); | 519 __ lduh( max_stack, Gframe_size ); |
520 __ add( Gframe_size, extra_space, Gframe_size ); | 520 __ add( Gframe_size, extra_space, Gframe_size ); |
521 __ round_to( Gframe_size, WordsPerLong ); | 521 __ round_to( Gframe_size, WordsPerLong ); |
522 __ sll( Gframe_size, Interpreter::logStackElementSize(), Gframe_size); | 522 __ sll( Gframe_size, Interpreter::logStackElementSize, Gframe_size); |
523 | 523 |
524 // Add in java locals size for stack overflow check only | 524 // Add in java locals size for stack overflow check only |
525 __ add( Gframe_size, Glocals_size, Gframe_size ); | 525 __ add( Gframe_size, Glocals_size, Gframe_size ); |
526 | 526 |
527 const Register Otmp2 = O4; | 527 const Register Otmp2 = O4; |
1232 | 1232 |
1233 // NOTE: If you change the frame layout, this code will need to | 1233 // NOTE: If you change the frame layout, this code will need to |
1234 // be updated! | 1234 // be updated! |
1235 __ lduh( size_of_locals, O2 ); | 1235 __ lduh( size_of_locals, O2 ); |
1236 __ lduh( size_of_parameters, O1 ); | 1236 __ lduh( size_of_parameters, O1 ); |
1237 __ sll( O2, Interpreter::logStackElementSize(), O2); | 1237 __ sll( O2, Interpreter::logStackElementSize, O2); |
1238 __ sll( O1, Interpreter::logStackElementSize(), O1 ); | 1238 __ sll( O1, Interpreter::logStackElementSize, O1 ); |
1239 __ sub( Llocals, O2, O2 ); | 1239 __ sub( Llocals, O2, O2 ); |
1240 __ sub( Llocals, O1, O1 ); | 1240 __ sub( Llocals, O1, O1 ); |
1241 | 1241 |
1242 __ bind( clear_loop ); | 1242 __ bind( clear_loop ); |
1243 __ inc( O2, wordSize ); | 1243 __ inc( O2, wordSize ); |
1468 // | 1468 // |
1469 const int rounded_vm_local_words = | 1469 const int rounded_vm_local_words = |
1470 round_to(frame::interpreter_frame_vm_local_words,WordsPerLong); | 1470 round_to(frame::interpreter_frame_vm_local_words,WordsPerLong); |
1471 // callee_locals and max_stack are counts, not the size in frame. | 1471 // callee_locals and max_stack are counts, not the size in frame. |
1472 const int locals_size = | 1472 const int locals_size = |
1473 round_to(callee_extra_locals * Interpreter::stackElementWords(), WordsPerLong); | 1473 round_to(callee_extra_locals * Interpreter::stackElementWords, WordsPerLong); |
1474 const int max_stack_words = max_stack * Interpreter::stackElementWords(); | 1474 const int max_stack_words = max_stack * Interpreter::stackElementWords; |
1475 return (round_to((max_stack_words | 1475 return (round_to((max_stack_words |
1476 //6815692//+ methodOopDesc::extra_stack_words() | 1476 //6815692//+ methodOopDesc::extra_stack_words() |
1477 + rounded_vm_local_words | 1477 + rounded_vm_local_words |
1478 + frame::memory_parameter_word_sp_offset), WordsPerLong) | 1478 + frame::memory_parameter_word_sp_offset), WordsPerLong) |
1479 // already rounded | 1479 // already rounded |
1568 // preallocate monitors (cf. __ add_monitor_to_stack) | 1568 // preallocate monitors (cf. __ add_monitor_to_stack) |
1569 intptr_t* monitors = montop - monitor_size; | 1569 intptr_t* monitors = montop - monitor_size; |
1570 | 1570 |
1571 // preallocate stack space | 1571 // preallocate stack space |
1572 intptr_t* esp = monitors - 1 - | 1572 intptr_t* esp = monitors - 1 - |
1573 (tempcount * Interpreter::stackElementWords()) - | 1573 (tempcount * Interpreter::stackElementWords) - |
1574 popframe_extra_args; | 1574 popframe_extra_args; |
1575 | 1575 |
1576 int local_words = method->max_locals() * Interpreter::stackElementWords(); | 1576 int local_words = method->max_locals() * Interpreter::stackElementWords; |
1577 int parm_words = method->size_of_parameters() * Interpreter::stackElementWords(); | 1577 int parm_words = method->size_of_parameters() * Interpreter::stackElementWords; |
1578 NEEDS_CLEANUP; | 1578 NEEDS_CLEANUP; |
1579 intptr_t* locals; | 1579 intptr_t* locals; |
1580 if (caller->is_interpreted_frame()) { | 1580 if (caller->is_interpreted_frame()) { |
1581 // Can force the locals area to end up properly overlapping the top of the expression stack. | 1581 // Can force the locals area to end up properly overlapping the top of the expression stack. |
1582 intptr_t* Lesp_ptr = caller->interpreter_frame_tos_address() - 1; | 1582 intptr_t* Lesp_ptr = caller->interpreter_frame_tos_address() - 1; |
1660 | 1660 |
1661 #ifdef ASSERT | 1661 #ifdef ASSERT |
1662 BasicObjectLock* mp = (BasicObjectLock*)monitors; | 1662 BasicObjectLock* mp = (BasicObjectLock*)monitors; |
1663 | 1663 |
1664 assert(interpreter_frame->interpreter_frame_method() == method, "method matches"); | 1664 assert(interpreter_frame->interpreter_frame_method() == method, "method matches"); |
1665 assert(interpreter_frame->interpreter_frame_local_at(9) == (intptr_t *)((intptr_t)locals - (9 * Interpreter::stackElementSize())+Interpreter::value_offset_in_bytes()), "locals match"); | 1665 assert(interpreter_frame->interpreter_frame_local_at(9) == (intptr_t *)((intptr_t)locals - (9 * Interpreter::stackElementSize)), "locals match"); |
1666 assert(interpreter_frame->interpreter_frame_monitor_end() == mp, "monitor_end matches"); | 1666 assert(interpreter_frame->interpreter_frame_monitor_end() == mp, "monitor_end matches"); |
1667 assert(((intptr_t *)interpreter_frame->interpreter_frame_monitor_begin()) == ((intptr_t *)mp)+monitor_size, "monitor_begin matches"); | 1667 assert(((intptr_t *)interpreter_frame->interpreter_frame_monitor_begin()) == ((intptr_t *)mp)+monitor_size, "monitor_begin matches"); |
1668 assert(interpreter_frame->interpreter_frame_tos_address()-1 == esp, "esp matches"); | 1668 assert(interpreter_frame->interpreter_frame_tos_address()-1 == esp, "esp matches"); |
1669 | 1669 |
1670 // check bounds | 1670 // check bounds |
1756 const Register Gtmp1 = G3_scratch; | 1756 const Register Gtmp1 = G3_scratch; |
1757 const Register Gtmp2 = G1_scratch; | 1757 const Register Gtmp2 = G1_scratch; |
1758 | 1758 |
1759 // Compute size of arguments for saving when returning to deoptimized caller | 1759 // Compute size of arguments for saving when returning to deoptimized caller |
1760 __ lduh(Lmethod, in_bytes(methodOopDesc::size_of_parameters_offset()), Gtmp1); | 1760 __ lduh(Lmethod, in_bytes(methodOopDesc::size_of_parameters_offset()), Gtmp1); |
1761 __ sll(Gtmp1, Interpreter::logStackElementSize(), Gtmp1); | 1761 __ sll(Gtmp1, Interpreter::logStackElementSize, Gtmp1); |
1762 __ sub(Llocals, Gtmp1, Gtmp2); | 1762 __ sub(Llocals, Gtmp1, Gtmp2); |
1763 __ add(Gtmp2, wordSize, Gtmp2); | 1763 __ add(Gtmp2, wordSize, Gtmp2); |
1764 // Save these arguments | 1764 // Save these arguments |
1765 __ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, Deoptimization::popframe_preserve_args), G2_thread, Gtmp1, Gtmp2); | 1765 __ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, Deoptimization::popframe_preserve_args), G2_thread, Gtmp1, Gtmp2); |
1766 // Inform deoptimization that it is responsible for restoring these arguments | 1766 // Inform deoptimization that it is responsible for restoring these arguments |