1437 uint MachUEPNode::size(PhaseRegAlloc* ra_) const |
1437 uint MachUEPNode::size(PhaseRegAlloc* ra_) const |
1438 { |
1438 { |
1439 return MachNode::size(ra_); // too many variables; just compute it |
1439 return MachNode::size(ra_); // too many variables; just compute it |
1440 // the hard way |
1440 // the hard way |
1441 } |
1441 } |
1442 |
1442 |
1443 |
1443 |
1444 //============================================================================= |
1444 //============================================================================= |
1445 uint size_exception_handler() |
|
1446 { |
|
1447 // NativeCall instruction size is the same as NativeJump. |
|
1448 // Note that this value is also credited (in output.cpp) to |
|
1449 // the size of the code section. |
|
1450 return NativeJump::instruction_size; |
|
1451 } |
|
1452 |
|
1453 // Emit exception handler code. |
|
1454 int emit_exception_handler(CodeBuffer& cbuf) |
|
1455 { |
|
1456 |
|
1457 // Note that the code buffer's insts_mark is always relative to insts. |
|
1458 // That's why we must use the macroassembler to generate a handler. |
|
1459 MacroAssembler _masm(&cbuf); |
|
1460 address base = |
|
1461 __ start_a_stub(size_exception_handler()); |
|
1462 if (base == NULL) return 0; // CodeBuffer::expand failed |
|
1463 int offset = __ offset(); |
|
1464 __ jump(RuntimeAddress(OptoRuntime::exception_blob()->entry_point())); |
|
1465 assert(__ offset() - offset <= (int) size_exception_handler(), "overflow"); |
|
1466 __ end_a_stub(); |
|
1467 return offset; |
|
1468 } |
|
1469 |
|
1470 uint size_deopt_handler() |
|
1471 { |
|
1472 // three 5 byte instructions |
|
1473 return 15; |
|
1474 } |
|
1475 |
|
1476 // Emit deopt handler code. |
|
1477 int emit_deopt_handler(CodeBuffer& cbuf) |
|
1478 { |
|
1479 |
|
1480 // Note that the code buffer's insts_mark is always relative to insts. |
|
1481 // That's why we must use the macroassembler to generate a handler. |
|
1482 MacroAssembler _masm(&cbuf); |
|
1483 address base = |
|
1484 __ start_a_stub(size_deopt_handler()); |
|
1485 if (base == NULL) return 0; // CodeBuffer::expand failed |
|
1486 int offset = __ offset(); |
|
1487 address the_pc = (address) __ pc(); |
|
1488 Label next; |
|
1489 // push a "the_pc" on the stack without destroying any registers |
|
1490 // as they all may be live. |
|
1491 |
|
1492 // push address of "next" |
|
1493 __ call(next, relocInfo::none); // reloc none is fine since it is a disp32 |
|
1494 __ bind(next); |
|
1495 // adjust it so it matches "the_pc" |
|
1496 __ subptr(Address(rsp, 0), __ offset() - offset); |
|
1497 __ jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); |
|
1498 assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow"); |
|
1499 __ end_a_stub(); |
|
1500 return offset; |
|
1501 } |
|
1502 |
1445 |
1503 int Matcher::regnum_to_fpu_offset(int regnum) |
1446 int Matcher::regnum_to_fpu_offset(int regnum) |
1504 { |
1447 { |
1505 return regnum - 32; // The FP registers are in the second chunk |
1448 return regnum - 32; // The FP registers are in the second chunk |
1506 } |
1449 } |