annotate src/cpu/x86/vm/graalCodeInstaller_x86.cpp @ 15388:769fc3629f59

Add phase FlowSensitiveReductionPhase. It is possible to remove GuardingPiNodes, CheckCastNodes, and FixedGuards during HighTier under certain conditions (control-flow sensitive conditions). The phase added in this commit (FlowSensitiveReductionPhase) does that, and in addition replaces usages with "downcasting" PiNodes when possible thus resulting in more precise object stamps (e.g., non-null). Finally, usages of floating, side-effects free, expressions are also simplified (as per control-flow sensitive conditions). The newly added phase runs only during HighTier and can be deactivated using Graal option FlowSensitiveReduction (it is active by default).
author Miguel Garcia <miguel.m.garcia@oracle.com>
date Fri, 25 Apr 2014 16:50:52 +0200
parents 370cb412d027
children 063ec2920d21
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
1 /*
15123
7ccd2a1df0fa made SPARC compile again; moved graalCodeInstaller_<arch>.hpp to .cpp files
twisti
parents: 14574
diff changeset
2 * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
4 *
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
8 *
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
13 * accompanied this code).
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
14 *
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
18 *
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
21 * questions.
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
22 */
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
23
15155
370cb412d027 add precompiled.hpp to graalCodeInstaller_x86.cpp, fixes Windows build
Christian Wirth <christian.wirth@oracle.com>
parents: 15123
diff changeset
24 #include "precompiled.hpp"
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
25 #include "compiler/disassembler.hpp"
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
26 #include "runtime/javaCalls.hpp"
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
27 #include "graal/graalEnv.hpp"
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
28 #include "graal/graalCompiler.hpp"
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
29 #include "graal/graalCodeInstaller.hpp"
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
30 #include "graal/graalJavaAccess.hpp"
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
31 #include "graal/graalCompilerToVM.hpp"
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
32 #include "graal/graalRuntime.hpp"
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
33 #include "asm/register.hpp"
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
34 #include "classfile/vmSymbols.hpp"
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
35 #include "code/vmreg.hpp"
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
36
15123
7ccd2a1df0fa made SPARC compile again; moved graalCodeInstaller_<arch>.hpp to .cpp files
twisti
parents: 14574
diff changeset
37 jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, oop method) {
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
38 if (inst->is_call() || inst->is_jump()) {
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
39 assert(NativeCall::instruction_size == (int)NativeJump::instruction_size, "unexpected size");
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
40 return (pc_offset + NativeCall::instruction_size);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
41 } else if (inst->is_mov_literal64()) {
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
42 // mov+call instruction pair
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
43 jint offset = pc_offset + NativeMovConstReg::instruction_size;
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
44 u_char* call = (u_char*) (_instructions->start() + offset);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
45 assert((call[0] == 0x40 || call[0] == 0x41) && call[1] == 0xFF, "expected call with rex/rexb prefix byte");
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
46 offset += 3; /* prefix byte + opcode byte + modrm byte */
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
47 return (offset);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
48 } else if (inst->is_call_reg()) {
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
49 // the inlined vtable stub contains a "call register" instruction
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
50 assert(method != NULL, "only valid for virtual calls");
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
51 return (pc_offset + ((NativeCallReg *) inst)->next_instruction_offset());
11826
2d3d3d36ab3c AMD64HotSpot: use conditional jump for IC_MISS_HANDLER
Bernhard Urban <bernhard.urban@jku.at>
parents: 11799
diff changeset
52 } else if (inst->is_cond_jump()) {
2d3d3d36ab3c AMD64HotSpot: use conditional jump for IC_MISS_HANDLER
Bernhard Urban <bernhard.urban@jku.at>
parents: 11799
diff changeset
53 address pc = (address) (inst);
2d3d3d36ab3c AMD64HotSpot: use conditional jump for IC_MISS_HANDLER
Bernhard Urban <bernhard.urban@jku.at>
parents: 11799
diff changeset
54 return pc_offset + (jint) (Assembler::locate_next_instruction(pc) - pc);
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
55 } else {
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
56 fatal("unsupported type of instruction for call site");
9953
60648c97cdd0 Windows build fix: compiler warning "not all control paths return a value" in CodeInstaller::pd_next_offset.
Andreas Woess <andreas.woess@jku.at>
parents: 9934
diff changeset
57 return 0;
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
58 }
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
59 }
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
60
15123
7ccd2a1df0fa made SPARC compile again; moved graalCodeInstaller_<arch>.hpp to .cpp files
twisti
parents: 14574
diff changeset
61 void CodeInstaller::pd_patch_OopData(int pc_offset, oop data) {
10810
4e1db4c9d4c5 Support data patches for values larger than long.
Roland Schatz <roland.schatz@oracle.com>
parents: 10684
diff changeset
62 address pc = _instructions->start() + pc_offset;
14561
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
63 Handle obj = OopData::object(data);
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
64 jobject value = JNIHandles::make_local(obj());
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
65 if (OopData::compressed(data)) {
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
66 address operand = Assembler::locate_operand(pc, Assembler::narrow_oop_operand);
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
67 int oop_index = _oop_recorder->find_index(value);
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
68 _instructions->relocate(pc, oop_Relocation::spec(oop_index), Assembler::narrow_oop_operand);
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
69 TRACE_graal_3("relocating (narrow oop constant) at %p/%p", pc, operand);
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
70 } else {
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
71 address operand = Assembler::locate_operand(pc, Assembler::imm_operand);
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
72 *((jobject*) operand) = value;
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
73 _instructions->relocate(pc, oop_Relocation::spec_for_immediate(), Assembler::imm_operand);
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
74 TRACE_graal_3("relocating (oop constant) at %p/%p", pc, operand);
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
75 }
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
76 }
13520
fb7b39f07232 Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13515
diff changeset
77
15123
7ccd2a1df0fa made SPARC compile again; moved graalCodeInstaller_<arch>.hpp to .cpp files
twisti
parents: 14574
diff changeset
78 void CodeInstaller::pd_patch_DataSectionReference(int pc_offset, oop data) {
14561
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
79 address pc = _instructions->start() + pc_offset;
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
80 jint offset = DataSectionReference::offset(data);
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
81
14561
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
82 address operand = Assembler::locate_operand(pc, Assembler::disp32_operand);
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
83 address next_instruction = Assembler::locate_next_instruction(pc);
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
84 address dest = _constants->start() + offset;
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
85
14561
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
86 long disp = dest - next_instruction;
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
87 assert(disp == (jint) disp, "disp doesn't fit in 32 bits");
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
88 *((jint*) operand) = (jint) disp;
13576
4e679d50ba9a Move data section building code to Java.
Roland Schatz <roland.schatz@oracle.com>
parents: 13561
diff changeset
89
14561
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
90 _instructions->relocate(pc, section_word_Relocation::spec((address) dest, CodeBuffer::SECT_CONSTS), Assembler::disp32_operand);
e14198669e5c Make data patch system use vm specific NarrowOop kind.
Roland Schatz <roland.schatz@oracle.com>
parents: 13726
diff changeset
91 TRACE_graal_3("relocating at %p/%p with destination at %p (%d)", pc, operand, dest, offset);
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
92 }
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
93
15123
7ccd2a1df0fa made SPARC compile again; moved graalCodeInstaller_<arch>.hpp to .cpp files
twisti
parents: 14574
diff changeset
94 void CodeInstaller::pd_relocate_CodeBlob(CodeBlob* cb, NativeInstruction* inst) {
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
95 if (cb->is_nmethod()) {
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
96 nmethod* nm = (nmethod*) cb;
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
97 nativeJump_at((address)inst)->set_jump_destination(nm->verified_entry_point());
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
98 } else {
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
99 nativeJump_at((address)inst)->set_jump_destination(cb->code_begin());
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
100 }
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
101 _instructions->relocate((address)inst, runtime_call_Relocation::spec(), Assembler::call32_operand);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
102 }
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
103
15123
7ccd2a1df0fa made SPARC compile again; moved graalCodeInstaller_<arch>.hpp to .cpp files
twisti
parents: 14574
diff changeset
104 void CodeInstaller::pd_relocate_ForeignCall(NativeInstruction* inst, jlong foreign_call_destination) {
11827
ff1d8605f354 graal code installer: minor style cleanup
Bernhard Urban <bernhard.urban@jku.at>
parents: 11826
diff changeset
105 address pc = (address) inst;
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
106 if (inst->is_call()) {
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
107 // NOTE: for call without a mov, the offset must fit a 32-bit immediate
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
108 // see also CompilerToVM.getMaxCallTargetOffset()
11827
ff1d8605f354 graal code installer: minor style cleanup
Bernhard Urban <bernhard.urban@jku.at>
parents: 11826
diff changeset
109 NativeCall* call = nativeCall_at(pc);
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
110 call->set_destination((address) foreign_call_destination);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
111 _instructions->relocate(call->instruction_address(), runtime_call_Relocation::spec(), Assembler::call32_operand);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
112 } else if (inst->is_mov_literal64()) {
11827
ff1d8605f354 graal code installer: minor style cleanup
Bernhard Urban <bernhard.urban@jku.at>
parents: 11826
diff changeset
113 NativeMovConstReg* mov = nativeMovConstReg_at(pc);
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
114 mov->set_data((intptr_t) foreign_call_destination);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
115 _instructions->relocate(mov->instruction_address(), runtime_call_Relocation::spec(), Assembler::imm_operand);
11826
2d3d3d36ab3c AMD64HotSpot: use conditional jump for IC_MISS_HANDLER
Bernhard Urban <bernhard.urban@jku.at>
parents: 11799
diff changeset
116 } else if (inst->is_jump()) {
11827
ff1d8605f354 graal code installer: minor style cleanup
Bernhard Urban <bernhard.urban@jku.at>
parents: 11826
diff changeset
117 NativeJump* jump = nativeJump_at(pc);
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
118 jump->set_jump_destination((address) foreign_call_destination);
11826
2d3d3d36ab3c AMD64HotSpot: use conditional jump for IC_MISS_HANDLER
Bernhard Urban <bernhard.urban@jku.at>
parents: 11799
diff changeset
119 _instructions->relocate(jump->instruction_address(), runtime_call_Relocation::spec(), Assembler::call32_operand);
2d3d3d36ab3c AMD64HotSpot: use conditional jump for IC_MISS_HANDLER
Bernhard Urban <bernhard.urban@jku.at>
parents: 11799
diff changeset
120 } else if (inst->is_cond_jump()) {
11827
ff1d8605f354 graal code installer: minor style cleanup
Bernhard Urban <bernhard.urban@jku.at>
parents: 11826
diff changeset
121 address old_dest = nativeGeneralJump_at(pc)->jump_destination();
ff1d8605f354 graal code installer: minor style cleanup
Bernhard Urban <bernhard.urban@jku.at>
parents: 11826
diff changeset
122 address disp = Assembler::locate_operand(pc, Assembler::call32_operand);
11826
2d3d3d36ab3c AMD64HotSpot: use conditional jump for IC_MISS_HANDLER
Bernhard Urban <bernhard.urban@jku.at>
parents: 11799
diff changeset
123 *(jint*) disp += ((address) foreign_call_destination) - old_dest;
11827
ff1d8605f354 graal code installer: minor style cleanup
Bernhard Urban <bernhard.urban@jku.at>
parents: 11826
diff changeset
124 _instructions->relocate(pc, runtime_call_Relocation::spec(), Assembler::call32_operand);
11826
2d3d3d36ab3c AMD64HotSpot: use conditional jump for IC_MISS_HANDLER
Bernhard Urban <bernhard.urban@jku.at>
parents: 11799
diff changeset
125 } else {
2d3d3d36ab3c AMD64HotSpot: use conditional jump for IC_MISS_HANDLER
Bernhard Urban <bernhard.urban@jku.at>
parents: 11799
diff changeset
126 fatal("unsupported relocation for foreign call");
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
127 }
11826
2d3d3d36ab3c AMD64HotSpot: use conditional jump for IC_MISS_HANDLER
Bernhard Urban <bernhard.urban@jku.at>
parents: 11799
diff changeset
128
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
129 TRACE_graal_3("relocating (foreign call) at %p", inst);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
130 }
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
131
15123
7ccd2a1df0fa made SPARC compile again; moved graalCodeInstaller_<arch>.hpp to .cpp files
twisti
parents: 14574
diff changeset
132 void CodeInstaller::pd_relocate_JavaMethod(oop hotspot_method, jint pc_offset) {
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
133 #ifdef ASSERT
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
134 Method* method = NULL;
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
135 // we need to check, this might also be an unresolved method
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
136 if (hotspot_method->is_a(HotSpotResolvedJavaMethod::klass())) {
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
137 method = getMethodFromHotSpotMethod(hotspot_method);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
138 }
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
139 #endif
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
140 switch (_next_call_type) {
14574
6bab029d6e3a removed com/oracle/graal/hotspot/bridge/Marks.java and replaced with enum
twisti
parents: 14561
diff changeset
141 case INLINE_INVOKE:
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
142 break;
14574
6bab029d6e3a removed com/oracle/graal/hotspot/bridge/Marks.java and replaced with enum
twisti
parents: 14561
diff changeset
143 case INVOKEVIRTUAL:
6bab029d6e3a removed com/oracle/graal/hotspot/bridge/Marks.java and replaced with enum
twisti
parents: 14561
diff changeset
144 case INVOKEINTERFACE: {
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
145 assert(method == NULL || !method->is_static(), "cannot call static method with invokeinterface");
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
146
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
147 NativeCall* call = nativeCall_at(_instructions->start() + pc_offset);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
148 call->set_destination(SharedRuntime::get_resolve_virtual_call_stub());
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
149 _instructions->relocate(call->instruction_address(),
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
150 virtual_call_Relocation::spec(_invoke_mark_pc),
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
151 Assembler::call32_operand);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
152 break;
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
153 }
14574
6bab029d6e3a removed com/oracle/graal/hotspot/bridge/Marks.java and replaced with enum
twisti
parents: 14561
diff changeset
154 case INVOKESTATIC: {
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
155 assert(method == NULL || method->is_static(), "cannot call non-static method with invokestatic");
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
156
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
157 NativeCall* call = nativeCall_at(_instructions->start() + pc_offset);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
158 call->set_destination(SharedRuntime::get_resolve_static_call_stub());
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
159 _instructions->relocate(call->instruction_address(),
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
160 relocInfo::static_call_type, Assembler::call32_operand);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
161 break;
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
162 }
14574
6bab029d6e3a removed com/oracle/graal/hotspot/bridge/Marks.java and replaced with enum
twisti
parents: 14561
diff changeset
163 case INVOKESPECIAL: {
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
164 assert(method == NULL || !method->is_static(), "cannot call static method with invokespecial");
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
165 NativeCall* call = nativeCall_at(_instructions->start() + pc_offset);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
166 call->set_destination(SharedRuntime::get_resolve_opt_virtual_call_stub());
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
167 _instructions->relocate(call->instruction_address(),
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
168 relocInfo::opt_virtual_call_type, Assembler::call32_operand);
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
169 break;
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
170 }
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
171 default:
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
172 break;
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
173 }
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
174 }
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
175
13485
04a87dc2cfca refactored common code into a separate function
Doug Simon <doug.simon@oracle.com>
parents: 11827
diff changeset
176 static void relocate_poll_near(address pc) {
04a87dc2cfca refactored common code into a separate function
Doug Simon <doug.simon@oracle.com>
parents: 11827
diff changeset
177 NativeInstruction* ni = nativeInstruction_at(pc);
04a87dc2cfca refactored common code into a separate function
Doug Simon <doug.simon@oracle.com>
parents: 11827
diff changeset
178 int32_t* disp = (int32_t*) Assembler::locate_operand(pc, Assembler::disp32_operand);
04a87dc2cfca refactored common code into a separate function
Doug Simon <doug.simon@oracle.com>
parents: 11827
diff changeset
179 int32_t offset = *disp; // The Java code installed the polling page offset into the disp32 operand
04a87dc2cfca refactored common code into a separate function
Doug Simon <doug.simon@oracle.com>
parents: 11827
diff changeset
180 intptr_t new_disp = (intptr_t) (os::get_polling_page() + offset) - (intptr_t) ni;
04a87dc2cfca refactored common code into a separate function
Doug Simon <doug.simon@oracle.com>
parents: 11827
diff changeset
181 *disp = (int32_t)new_disp;
04a87dc2cfca refactored common code into a separate function
Doug Simon <doug.simon@oracle.com>
parents: 11827
diff changeset
182 }
04a87dc2cfca refactored common code into a separate function
Doug Simon <doug.simon@oracle.com>
parents: 11827
diff changeset
183
04a87dc2cfca refactored common code into a separate function
Doug Simon <doug.simon@oracle.com>
parents: 11827
diff changeset
184
15123
7ccd2a1df0fa made SPARC compile again; moved graalCodeInstaller_<arch>.hpp to .cpp files
twisti
parents: 14574
diff changeset
185 void CodeInstaller::pd_relocate_poll(address pc, jint mark) {
11760
ce0b00597980 made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents: 10810
diff changeset
186 switch (mark) {
14574
6bab029d6e3a removed com/oracle/graal/hotspot/bridge/Marks.java and replaced with enum
twisti
parents: 14561
diff changeset
187 case POLL_NEAR: {
13485
04a87dc2cfca refactored common code into a separate function
Doug Simon <doug.simon@oracle.com>
parents: 11827
diff changeset
188 relocate_poll_near(pc);
13553
d49f00604347 removed poll_Relocation::pollingForm type and associated data field and rely solely on format field of safepoint relocation entries when deciding whether or not to relocate the operand of a safepoint poll instruction
Doug Simon <doug.simon@oracle.com>
parents: 13520
diff changeset
189 _instructions->relocate(pc, relocInfo::poll_type, Assembler::disp32_operand);
13512
8085ce95b6f5 reloc info for safepoint polls includes whether the poison page is far or near
Doug Simon <doug.simon@oracle.com>
parents: 13485
diff changeset
190 break;
11760
ce0b00597980 made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents: 10810
diff changeset
191 }
14574
6bab029d6e3a removed com/oracle/graal/hotspot/bridge/Marks.java and replaced with enum
twisti
parents: 14561
diff changeset
192 case POLL_FAR:
13561
4fc8c8bb4c32 removed Assembler::no_operand alias
Doug Simon <doug.simon@oracle.com>
parents: 13553
diff changeset
193 // This is a load from a register so there is no relocatable operand.
4fc8c8bb4c32 removed Assembler::no_operand alias
Doug Simon <doug.simon@oracle.com>
parents: 13553
diff changeset
194 // We just have to ensure that the format is not disp32_operand
4fc8c8bb4c32 removed Assembler::no_operand alias
Doug Simon <doug.simon@oracle.com>
parents: 13553
diff changeset
195 // so that poll_Relocation::fix_relocation_after_move does the right
4fc8c8bb4c32 removed Assembler::no_operand alias
Doug Simon <doug.simon@oracle.com>
parents: 13553
diff changeset
196 // thing (i.e. ignores this relocation record)
4fc8c8bb4c32 removed Assembler::no_operand alias
Doug Simon <doug.simon@oracle.com>
parents: 13553
diff changeset
197 _instructions->relocate(pc, relocInfo::poll_type, Assembler::imm_operand);
11760
ce0b00597980 made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents: 10810
diff changeset
198 break;
14574
6bab029d6e3a removed com/oracle/graal/hotspot/bridge/Marks.java and replaced with enum
twisti
parents: 14561
diff changeset
199 case POLL_RETURN_NEAR: {
13485
04a87dc2cfca refactored common code into a separate function
Doug Simon <doug.simon@oracle.com>
parents: 11827
diff changeset
200 relocate_poll_near(pc);
13553
d49f00604347 removed poll_Relocation::pollingForm type and associated data field and rely solely on format field of safepoint relocation entries when deciding whether or not to relocate the operand of a safepoint poll instruction
Doug Simon <doug.simon@oracle.com>
parents: 13520
diff changeset
201 _instructions->relocate(pc, relocInfo::poll_return_type, Assembler::disp32_operand);
13512
8085ce95b6f5 reloc info for safepoint polls includes whether the poison page is far or near
Doug Simon <doug.simon@oracle.com>
parents: 13485
diff changeset
202 break;
11760
ce0b00597980 made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents: 10810
diff changeset
203 }
14574
6bab029d6e3a removed com/oracle/graal/hotspot/bridge/Marks.java and replaced with enum
twisti
parents: 14561
diff changeset
204 case POLL_RETURN_FAR:
15123
7ccd2a1df0fa made SPARC compile again; moved graalCodeInstaller_<arch>.hpp to .cpp files
twisti
parents: 14574
diff changeset
205 // see comment above for POLL_FAR
13561
4fc8c8bb4c32 removed Assembler::no_operand alias
Doug Simon <doug.simon@oracle.com>
parents: 13553
diff changeset
206 _instructions->relocate(pc, relocInfo::poll_return_type, Assembler::imm_operand);
11760
ce0b00597980 made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents: 10810
diff changeset
207 break;
ce0b00597980 made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents: 10810
diff changeset
208 default:
11799
4c96ccce3772 SPARC: added CodeInstaller::pd_relocate_poll
twisti
parents: 11760
diff changeset
209 fatal("invalid mark value");
11760
ce0b00597980 made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents: 10810
diff changeset
210 break;
ce0b00597980 made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents: 10810
diff changeset
211 }
9934
0f7ca53be929 CR-806: Changes to build Graal for SPARC
Morris Meyer <morris.meyer@oracle.com>
parents:
diff changeset
212 }