Mercurial > hg > graal-jvmci-8
comparison src/cpu/x86/vm/x86_64.ad @ 17809:a433eb716ce1
8037821: Account for trampoline stubs when estimating code buffer sizes
Summary: Take into account space needed for "trampoline code" used by calls on PPC64.
Reviewed-by: kvn
Contributed-by: lutz.schmidt@sap.com
author | goetz |
---|---|
date | Tue, 25 Mar 2014 12:54:21 -0700 |
parents | f040cf9fc9c0 |
children | 62c54fcc0a35 |
comparison
equal
deleted
inserted
replaced
17808:d623bc507723 | 17809:a433eb716ce1 |
---|---|
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 } |