mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 19:14:38 +02:00
Merge
This commit is contained in:
commit
cf2288b223
23 changed files with 788 additions and 100 deletions
|
@ -4150,7 +4150,7 @@ void MacroAssembler::call_VM_base(Register oop_result,
|
|||
if (oop_result->is_valid()) {
|
||||
movq(oop_result, Address(r15_thread, JavaThread::vm_result_offset()));
|
||||
movptr(Address(r15_thread, JavaThread::vm_result_offset()), NULL_WORD);
|
||||
verify_oop(oop_result);
|
||||
verify_oop(oop_result, "broken oop in call_VM_base");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4689,6 +4689,10 @@ void MacroAssembler::warn(const char* msg) {
|
|||
popq(r12);
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
extern "C" void findpc(intptr_t x);
|
||||
#endif
|
||||
|
||||
void MacroAssembler::debug(char* msg, int64_t pc, int64_t regs[]) {
|
||||
// In order to get locks to work, we need to fake a in_VM state
|
||||
if (ShowMessageBoxOnError ) {
|
||||
|
@ -4707,6 +4711,11 @@ void MacroAssembler::debug(char* msg, int64_t pc, int64_t regs[]) {
|
|||
if (os::message_box(msg, "Execution stopped, print registers?")) {
|
||||
ttyLocker ttyl;
|
||||
tty->print_cr("rip = 0x%016lx", pc);
|
||||
#ifndef PRODUCT
|
||||
tty->cr();
|
||||
findpc(pc);
|
||||
tty->cr();
|
||||
#endif
|
||||
tty->print_cr("rax = 0x%016lx", regs[15]);
|
||||
tty->print_cr("rbx = 0x%016lx", regs[12]);
|
||||
tty->print_cr("rcx = 0x%016lx", regs[14]);
|
||||
|
@ -5187,7 +5196,7 @@ void MacroAssembler::encode_heap_oop(Register r) {
|
|||
bind(ok);
|
||||
popq(rscratch1);
|
||||
#endif
|
||||
verify_oop(r);
|
||||
verify_oop(r, "broken oop in encode_heap_oop");
|
||||
testq(r, r);
|
||||
cmovq(Assembler::equal, r, r12_heapbase);
|
||||
subq(r, r12_heapbase);
|
||||
|
@ -5203,11 +5212,28 @@ void MacroAssembler::encode_heap_oop_not_null(Register r) {
|
|||
stop("null oop passed to encode_heap_oop_not_null");
|
||||
bind(ok);
|
||||
#endif
|
||||
verify_oop(r);
|
||||
verify_oop(r, "broken oop in encode_heap_oop_not_null");
|
||||
subq(r, r12_heapbase);
|
||||
shrq(r, LogMinObjAlignmentInBytes);
|
||||
}
|
||||
|
||||
void MacroAssembler::encode_heap_oop_not_null(Register dst, Register src) {
|
||||
assert (UseCompressedOops, "should be compressed");
|
||||
#ifdef ASSERT
|
||||
Label ok;
|
||||
testq(src, src);
|
||||
jcc(Assembler::notEqual, ok);
|
||||
stop("null oop passed to encode_heap_oop_not_null2");
|
||||
bind(ok);
|
||||
#endif
|
||||
verify_oop(src, "broken oop in encode_heap_oop_not_null2");
|
||||
if (dst != src) {
|
||||
movq(dst, src);
|
||||
}
|
||||
subq(dst, r12_heapbase);
|
||||
shrq(dst, LogMinObjAlignmentInBytes);
|
||||
}
|
||||
|
||||
void MacroAssembler::decode_heap_oop(Register r) {
|
||||
assert (UseCompressedOops, "should be compressed");
|
||||
#ifdef ASSERT
|
||||
|
@ -5232,7 +5258,7 @@ void MacroAssembler::decode_heap_oop(Register r) {
|
|||
leaq(r, Address(r12_heapbase, r, Address::times_8, 0));
|
||||
#endif
|
||||
bind(done);
|
||||
verify_oop(r);
|
||||
verify_oop(r, "broken oop in decode_heap_oop");
|
||||
}
|
||||
|
||||
void MacroAssembler::decode_heap_oop_not_null(Register r) {
|
||||
|
@ -5243,6 +5269,14 @@ void MacroAssembler::decode_heap_oop_not_null(Register r) {
|
|||
leaq(r, Address(r12_heapbase, r, Address::times_8, 0));
|
||||
}
|
||||
|
||||
void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) {
|
||||
assert (UseCompressedOops, "should only be used for compressed headers");
|
||||
// Cannot assert, unverified entry point counts instructions (see .ad file)
|
||||
// vtableStubs also counts instructions in pd_code_size_limit.
|
||||
assert(Address::times_8 == LogMinObjAlignmentInBytes, "decode alg wrong");
|
||||
leaq(dst, Address(r12_heapbase, src, Address::times_8, 0));
|
||||
}
|
||||
|
||||
Assembler::Condition MacroAssembler::negate_condition(Assembler::Condition cond) {
|
||||
switch (cond) {
|
||||
// Note some conditions are synonyms for others
|
||||
|
|
|
@ -1111,6 +1111,8 @@ class MacroAssembler : public Assembler {
|
|||
void decode_heap_oop(Register r);
|
||||
void encode_heap_oop_not_null(Register r);
|
||||
void decode_heap_oop_not_null(Register r);
|
||||
void encode_heap_oop_not_null(Register dst, Register src);
|
||||
void decode_heap_oop_not_null(Register dst, Register src);
|
||||
|
||||
// Stack frame creation/removal
|
||||
void enter();
|
||||
|
|
|
@ -913,11 +913,12 @@ class StubGenerator: public StubCodeGenerator {
|
|||
// Stack after saving c_rarg3:
|
||||
// [tos + 0]: saved c_rarg3
|
||||
// [tos + 1]: saved c_rarg2
|
||||
// [tos + 2]: saved flags
|
||||
// [tos + 3]: return address
|
||||
// * [tos + 4]: error message (char*)
|
||||
// * [tos + 5]: object to verify (oop)
|
||||
// * [tos + 6]: saved rax - saved by caller and bashed
|
||||
// [tos + 2]: saved r12 (several TemplateTable methods use it)
|
||||
// [tos + 3]: saved flags
|
||||
// [tos + 4]: return address
|
||||
// * [tos + 5]: error message (char*)
|
||||
// * [tos + 6]: object to verify (oop)
|
||||
// * [tos + 7]: saved rax - saved by caller and bashed
|
||||
// * = popped on exit
|
||||
address generate_verify_oop() {
|
||||
StubCodeMark mark(this, "StubRoutines", "verify_oop");
|
||||
|
@ -928,12 +929,24 @@ class StubGenerator: public StubCodeGenerator {
|
|||
__ pushfq();
|
||||
__ incrementl(ExternalAddress((address) StubRoutines::verify_oop_count_addr()));
|
||||
|
||||
__ pushq(r12);
|
||||
|
||||
// save c_rarg2 and c_rarg3
|
||||
__ pushq(c_rarg2);
|
||||
__ pushq(c_rarg3);
|
||||
|
||||
enum {
|
||||
// After previous pushes.
|
||||
oop_to_verify = 6 * wordSize,
|
||||
saved_rax = 7 * wordSize,
|
||||
|
||||
// Before the call to MacroAssembler::debug(), see below.
|
||||
return_addr = 16 * wordSize,
|
||||
error_msg = 17 * wordSize
|
||||
};
|
||||
|
||||
// get object
|
||||
__ movq(rax, Address(rsp, 5 * wordSize));
|
||||
__ movq(rax, Address(rsp, oop_to_verify));
|
||||
|
||||
// make sure object is 'reasonable'
|
||||
__ testq(rax, rax);
|
||||
|
@ -946,6 +959,9 @@ class StubGenerator: public StubCodeGenerator {
|
|||
__ cmpq(c_rarg2, c_rarg3);
|
||||
__ jcc(Assembler::notZero, error);
|
||||
|
||||
// set r12 to heapbase for load_klass()
|
||||
__ reinit_heapbase();
|
||||
|
||||
// make sure klass is 'reasonable'
|
||||
__ load_klass(rax, rax); // get klass
|
||||
__ testq(rax, rax);
|
||||
|
@ -971,40 +987,45 @@ class StubGenerator: public StubCodeGenerator {
|
|||
|
||||
// return if everything seems ok
|
||||
__ bind(exit);
|
||||
__ movq(rax, Address(rsp, 6 * wordSize)); // get saved rax back
|
||||
__ popq(c_rarg3); // restore c_rarg3
|
||||
__ popq(c_rarg2); // restore c_rarg2
|
||||
__ movq(rax, Address(rsp, saved_rax)); // get saved rax back
|
||||
__ popq(c_rarg3); // restore c_rarg3
|
||||
__ popq(c_rarg2); // restore c_rarg2
|
||||
__ popq(r12); // restore r12
|
||||
__ popfq(); // restore flags
|
||||
__ ret(3 * wordSize); // pop caller saved stuff
|
||||
|
||||
// handle errors
|
||||
__ bind(error);
|
||||
__ movq(rax, Address(rsp, 6 * wordSize)); // get saved rax back
|
||||
__ popq(c_rarg3); // get saved c_rarg3 back
|
||||
__ popq(c_rarg2); // get saved c_rarg2 back
|
||||
__ movq(rax, Address(rsp, saved_rax)); // get saved rax back
|
||||
__ popq(c_rarg3); // get saved c_rarg3 back
|
||||
__ popq(c_rarg2); // get saved c_rarg2 back
|
||||
__ popq(r12); // get saved r12 back
|
||||
__ popfq(); // get saved flags off stack --
|
||||
// will be ignored
|
||||
|
||||
__ pushaq(); // push registers
|
||||
// (rip is already
|
||||
// already pushed)
|
||||
// debug(char* msg, int64_t regs[])
|
||||
// debug(char* msg, int64_t pc, int64_t regs[])
|
||||
// We've popped the registers we'd saved (c_rarg3, c_rarg2 and flags), and
|
||||
// pushed all the registers, so now the stack looks like:
|
||||
// [tos + 0] 16 saved registers
|
||||
// [tos + 16] return address
|
||||
// [tos + 17] error message (char*)
|
||||
// * [tos + 17] error message (char*)
|
||||
// * [tos + 18] object to verify (oop)
|
||||
// * [tos + 19] saved rax - saved by caller and bashed
|
||||
// * = popped on exit
|
||||
|
||||
__ movq(c_rarg0, Address(rsp, 17 * wordSize)); // pass address of error message
|
||||
__ movq(c_rarg1, rsp); // pass address of regs on stack
|
||||
__ movq(c_rarg0, Address(rsp, error_msg)); // pass address of error message
|
||||
__ movq(c_rarg1, Address(rsp, return_addr)); // pass return address
|
||||
__ movq(c_rarg2, rsp); // pass address of regs on stack
|
||||
__ movq(r12, rsp); // remember rsp
|
||||
__ subq(rsp, frame::arg_reg_save_area_bytes);// windows
|
||||
__ andq(rsp, -16); // align stack as required by ABI
|
||||
BLOCK_COMMENT("call MacroAssembler::debug");
|
||||
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug)));
|
||||
__ movq(rsp, r12); // restore rsp
|
||||
__ reinit_heapbase(); // r12 is heapbase
|
||||
__ popaq(); // pop registers
|
||||
__ popaq(); // pop registers (includes r12)
|
||||
__ ret(3 * wordSize); // pop caller saved stuff
|
||||
|
||||
return start;
|
||||
|
@ -1038,7 +1059,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||
assert_different_registers(Rtmp, Rint);
|
||||
__ movslq(Rtmp, Rint);
|
||||
__ cmpq(Rtmp, Rint);
|
||||
__ jccb(Assembler::equal, L);
|
||||
__ jcc(Assembler::equal, L);
|
||||
__ stop("high 32-bits of int value are not 0");
|
||||
__ bind(L);
|
||||
#endif
|
||||
|
|
|
@ -6080,7 +6080,8 @@ instruct loadKlassComp(rRegP dst, memory mem)
|
|||
predicate(n->in(MemNode::Address)->bottom_type()->is_narrow());
|
||||
|
||||
ins_cost(125); // XXX
|
||||
format %{ "movl $dst, $mem\t# compressed class" %}
|
||||
format %{ "movl $dst, $mem\t# compressed class\n\t"
|
||||
"decode_heap_oop $dst,$dst" %}
|
||||
ins_encode %{
|
||||
Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp);
|
||||
Register dst = as_Register($dst$$reg);
|
||||
|
@ -6349,7 +6350,7 @@ instruct loadConF(regF dst, immF src)
|
|||
instruct loadConN0(rRegN dst, immN0 src, rFlagsReg cr) %{
|
||||
match(Set dst src);
|
||||
effect(KILL cr);
|
||||
format %{ "xorq $dst, $src\t# compressed ptr" %}
|
||||
format %{ "xorq $dst, $src\t# compressed NULL ptr" %}
|
||||
ins_encode %{
|
||||
Register dst = $dst$$Register;
|
||||
__ xorq(dst, dst);
|
||||
|
@ -6361,7 +6362,8 @@ instruct loadConN(rRegN dst, immN src) %{
|
|||
match(Set dst src);
|
||||
|
||||
ins_cost(125);
|
||||
format %{ "movl $dst, $src\t# compressed ptr" %}
|
||||
format %{ "movq $dst, $src\t# compressed ptr\n\t"
|
||||
"encode_heap_oop_not_null $dst,$dst" %}
|
||||
ins_encode %{
|
||||
address con = (address)$src$$constant;
|
||||
Register dst = $dst$$Register;
|
||||
|
@ -6996,6 +6998,7 @@ instruct castP2X(rRegL dst, rRegP src)
|
|||
|
||||
// Convert oop pointer into compressed form
|
||||
instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{
|
||||
predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() != TypePtr::NotNull);
|
||||
match(Set dst (EncodeP src));
|
||||
effect(KILL cr);
|
||||
format %{ "encode_heap_oop $dst,$src" %}
|
||||
|
@ -7010,7 +7013,21 @@ instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{
|
|||
ins_pipe(ialu_reg_long);
|
||||
%}
|
||||
|
||||
instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{
|
||||
predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() == TypePtr::NotNull);
|
||||
match(Set dst (EncodeP src));
|
||||
effect(KILL cr);
|
||||
format %{ "encode_heap_oop_not_null $dst,$src" %}
|
||||
ins_encode %{
|
||||
Register s = $src$$Register;
|
||||
Register d = $dst$$Register;
|
||||
__ encode_heap_oop_not_null(d, s);
|
||||
%}
|
||||
ins_pipe(ialu_reg_long);
|
||||
%}
|
||||
|
||||
instruct decodeHeapOop(rRegP dst, rRegN src, rFlagsReg cr) %{
|
||||
predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull);
|
||||
match(Set dst (DecodeN src));
|
||||
effect(KILL cr);
|
||||
format %{ "decode_heap_oop $dst,$src" %}
|
||||
|
@ -7025,6 +7042,18 @@ instruct decodeHeapOop(rRegP dst, rRegN src, rFlagsReg cr) %{
|
|||
ins_pipe(ialu_reg_long);
|
||||
%}
|
||||
|
||||
instruct decodeHeapOop_not_null(rRegP dst, rRegN src) %{
|
||||
predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull);
|
||||
match(Set dst (DecodeN src));
|
||||
format %{ "decode_heap_oop_not_null $dst,$src" %}
|
||||
ins_encode %{
|
||||
Register s = $src$$Register;
|
||||
Register d = $dst$$Register;
|
||||
__ decode_heap_oop_not_null(d, s);
|
||||
%}
|
||||
ins_pipe(ialu_reg_long);
|
||||
%}
|
||||
|
||||
|
||||
//----------Conditional Move---------------------------------------------------
|
||||
// Jump
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue