580 address entry = __ pc(); |
580 address entry = __ pc(); |
581 |
581 |
582 // the following temporary registers are used during frame creation |
582 // the following temporary registers are used during frame creation |
583 const Register Gtmp1 = G3_scratch ; |
583 const Register Gtmp1 = G3_scratch ; |
584 const Register Gtmp2 = G1_scratch; |
584 const Register Gtmp2 = G1_scratch; |
585 const Address size_of_parameters(G5_method, 0, in_bytes(Method::size_of_parameters_offset())); |
585 const Register RconstMethod = Gtmp1; |
|
586 const Address constMethod(G5_method, 0, in_bytes(Method::const_offset())); |
|
587 const Address size_of_parameters(RconstMethod, 0, in_bytes(ConstMethod::size_of_parameters_offset())); |
586 |
588 |
587 bool inc_counter = UseCompiler || CountCompiledCalls; |
589 bool inc_counter = UseCompiler || CountCompiledCalls; |
588 |
590 |
589 // make sure registers are different! |
591 // make sure registers are different! |
590 assert_different_registers(G2_thread, G5_method, Gargs, Gtmp1, Gtmp2); |
592 assert_different_registers(G2_thread, G5_method, Gargs, Gtmp1, Gtmp2); |
616 __ stop("tried to execute abstract method as non-abstract"); |
618 __ stop("tried to execute abstract method as non-abstract"); |
617 __ bind(L); |
619 __ bind(L); |
618 } |
620 } |
619 #endif // ASSERT |
621 #endif // ASSERT |
620 |
622 |
|
623 __ ld_ptr(constMethod, RconstMethod); |
621 __ lduh(size_of_parameters, Gtmp1); |
624 __ lduh(size_of_parameters, Gtmp1); |
622 __ sll(Gtmp1, LogBytesPerWord, Gtmp2); // parameter size in bytes |
625 __ sll(Gtmp1, LogBytesPerWord, Gtmp2); // parameter size in bytes |
623 __ add(Gargs, Gtmp2, Gargs); // points to first local + BytesPerWord |
626 __ add(Gargs, Gtmp2, Gargs); // points to first local + BytesPerWord |
624 // NEW |
627 // NEW |
625 __ add(Gargs, -wordSize, Gargs); // points to first local[0] |
628 __ add(Gargs, -wordSize, Gargs); // points to first local[0] |
1045 assert_different_registers(state, prev_state); |
1048 assert_different_registers(state, prev_state); |
1046 assert_different_registers(prev_state, G3_scratch); |
1049 assert_different_registers(prev_state, G3_scratch); |
1047 const Register Gtmp = G3_scratch; |
1050 const Register Gtmp = G3_scratch; |
1048 const Address constMethod (G5_method, 0, in_bytes(Method::const_offset())); |
1051 const Address constMethod (G5_method, 0, in_bytes(Method::const_offset())); |
1049 const Address access_flags (G5_method, 0, in_bytes(Method::access_flags_offset())); |
1052 const Address access_flags (G5_method, 0, in_bytes(Method::access_flags_offset())); |
1050 const Address size_of_parameters(G5_method, 0, in_bytes(Method::size_of_parameters_offset())); |
|
1051 const Address size_of_locals (G5_method, 0, in_bytes(Method::size_of_locals_offset())); |
|
1052 |
1053 |
1053 // slop factor is two extra slots on the expression stack so that |
1054 // slop factor is two extra slots on the expression stack so that |
1054 // we always have room to store a result when returning from a call without parameters |
1055 // we always have room to store a result when returning from a call without parameters |
1055 // that returns a result. |
1056 // that returns a result. |
1056 |
1057 |
1064 // XXX G5_method valid |
1065 // XXX G5_method valid |
1065 |
1066 |
1066 // Now compute new frame size |
1067 // Now compute new frame size |
1067 |
1068 |
1068 if (native) { |
1069 if (native) { |
|
1070 const Register RconstMethod = Gtmp; |
|
1071 const Address size_of_parameters(RconstMethod, 0, in_bytes(ConstMethod::size_of_parameters_offset())); |
|
1072 __ ld_ptr(constMethod, RconstMethod); |
1069 __ lduh( size_of_parameters, Gtmp ); |
1073 __ lduh( size_of_parameters, Gtmp ); |
1070 __ calc_mem_param_words(Gtmp, Gtmp); // space for native call parameters passed on the stack in words |
1074 __ calc_mem_param_words(Gtmp, Gtmp); // space for native call parameters passed on the stack in words |
1071 } else { |
1075 } else { |
1072 // Full size expression stack |
1076 // Full size expression stack |
1073 __ ld_ptr(constMethod, Gtmp); |
1077 __ ld_ptr(constMethod, Gtmp); |
1234 __ set( 0x0F0F0F0F, init_value ); |
1238 __ set( 0x0F0F0F0F, init_value ); |
1235 #endif // ASSERT |
1239 #endif // ASSERT |
1236 } |
1240 } |
1237 if (init_value != noreg) { |
1241 if (init_value != noreg) { |
1238 Label clear_loop; |
1242 Label clear_loop; |
|
1243 const Register RconstMethod = O1; |
|
1244 const Address size_of_parameters(RconstMethod, 0, in_bytes(ConstMethod::size_of_parameters_offset())); |
|
1245 const Address size_of_locals (RconstMethod, 0, in_bytes(ConstMethod::size_of_locals_offset())); |
1239 |
1246 |
1240 // NOTE: If you change the frame layout, this code will need to |
1247 // NOTE: If you change the frame layout, this code will need to |
1241 // be updated! |
1248 // be updated! |
|
1249 __ ld_ptr( constMethod, RconstMethod ); |
1242 __ lduh( size_of_locals, O2 ); |
1250 __ lduh( size_of_locals, O2 ); |
1243 __ lduh( size_of_parameters, O1 ); |
1251 __ lduh( size_of_parameters, O1 ); |
1244 __ sll( O2, LogBytesPerWord, O2); |
1252 __ sll( O2, LogBytesPerWord, O2); |
1245 __ sll( O1, LogBytesPerWord, O1 ); |
1253 __ sll( O1, LogBytesPerWord, O1 ); |
1246 __ ld_ptr(XXX_STATE(_locals), L2_scratch); |
1254 __ ld_ptr(XXX_STATE(_locals), L2_scratch); |
1481 // Destroys args, G3_scratch, G3_scratch |
1489 // Destroys args, G3_scratch, G3_scratch |
1482 // In/Out O5_savedSP (sender's original SP) |
1490 // In/Out O5_savedSP (sender's original SP) |
1483 // |
1491 // |
1484 // assert_different_registers(state, prev_state); |
1492 // assert_different_registers(state, prev_state); |
1485 const Register Gtmp = G3_scratch; |
1493 const Register Gtmp = G3_scratch; |
|
1494 const RconstMethod = G3_scratch; |
1486 const Register tmp = O2; |
1495 const Register tmp = O2; |
1487 const Address size_of_parameters(G5_method, 0, in_bytes(Method::size_of_parameters_offset())); |
1496 const Address constMethod(G5_method, 0, in_bytes(Method::const_offset())); |
1488 const Address size_of_locals (G5_method, 0, in_bytes(Method::size_of_locals_offset())); |
1497 const Address size_of_parameters(RconstMethod, 0, in_bytes(ConstMethod::size_of_parameters_offset())); |
1489 |
1498 const Address size_of_locals (RconstMethod, 0, in_bytes(ConstMethod::size_of_locals_offset())); |
|
1499 |
|
1500 __ ld_ptr(constMethod, RconstMethod); |
1490 __ lduh(size_of_parameters, tmp); |
1501 __ lduh(size_of_parameters, tmp); |
1491 __ sll(tmp, LogBytesPerWord, Gtmp); // parameter size in bytes |
1502 __ sll(tmp, LogBytesPerWord, Gargs); // parameter size in bytes |
1492 __ add(args, Gtmp, Gargs); // points to first local + BytesPerWord |
1503 __ add(args, Gargs, Gargs); // points to first local + BytesPerWord |
1493 // NEW |
1504 // NEW |
1494 __ add(Gargs, -wordSize, Gargs); // points to first local[0] |
1505 __ add(Gargs, -wordSize, Gargs); // points to first local[0] |
1495 // determine extra space for non-argument locals & adjust caller's SP |
1506 // determine extra space for non-argument locals & adjust caller's SP |
1496 // Gtmp1: parameter size in words |
1507 // Gtmp1: parameter size in words |
1497 __ lduh(size_of_locals, Gtmp); |
1508 __ lduh(size_of_locals, Gtmp); |
1539 const Register Gtmp1 = G3_scratch; |
1550 const Register Gtmp1 = G3_scratch; |
1540 // const Register Lmirror = L1; // native mirror (native calls only) |
1551 // const Register Lmirror = L1; // native mirror (native calls only) |
1541 |
1552 |
1542 const Address constMethod (G5_method, 0, in_bytes(Method::const_offset())); |
1553 const Address constMethod (G5_method, 0, in_bytes(Method::const_offset())); |
1543 const Address access_flags (G5_method, 0, in_bytes(Method::access_flags_offset())); |
1554 const Address access_flags (G5_method, 0, in_bytes(Method::access_flags_offset())); |
1544 const Address size_of_parameters(G5_method, 0, in_bytes(Method::size_of_parameters_offset())); |
|
1545 const Address size_of_locals (G5_method, 0, in_bytes(Method::size_of_locals_offset())); |
|
1546 |
1555 |
1547 address entry_point = __ pc(); |
1556 address entry_point = __ pc(); |
1548 __ mov(G0, prevState); // no current activation |
1557 __ mov(G0, prevState); // no current activation |
1549 |
1558 |
1550 |
1559 |
1748 |
1757 |
1749 // Process the native abi result to java expression stack |
1758 // Process the native abi result to java expression stack |
1750 |
1759 |
1751 __ ld_ptr(STATE(_result._to_call._callee), L4_scratch); // called method |
1760 __ ld_ptr(STATE(_result._to_call._callee), L4_scratch); // called method |
1752 __ ld_ptr(STATE(_stack), L1_scratch); // get top of java expr stack |
1761 __ ld_ptr(STATE(_stack), L1_scratch); // get top of java expr stack |
1753 __ lduh(L4_scratch, in_bytes(Method::size_of_parameters_offset()), L2_scratch); // get parameter size |
1762 // get parameter size |
|
1763 __ ld_ptr(L4_scratch, in_bytes(Method::const_offset()), L2_scratch); |
|
1764 __ lduh(L2_scratch, in_bytes(ConstMethod::size_of_parameters_offset()), L2_scratch); |
1754 __ sll(L2_scratch, LogBytesPerWord, L2_scratch ); // parameter size in bytes |
1765 __ sll(L2_scratch, LogBytesPerWord, L2_scratch ); // parameter size in bytes |
1755 __ add(L1_scratch, L2_scratch, L1_scratch); // stack destination for result |
1766 __ add(L1_scratch, L2_scratch, L1_scratch); // stack destination for result |
1756 __ ld(L4_scratch, in_bytes(Method::result_index_offset()), L3_scratch); // called method result type index |
1767 __ ld(L4_scratch, in_bytes(Method::result_index_offset()), L3_scratch); // called method result type index |
1757 |
1768 |
1758 // tosca is really just native abi |
1769 // tosca is really just native abi |