annotate src/share/vm/c1/c1_LIRAssembler.cpp @ 3018:5857923e563c

Fixed an issue with frame states in exception dispatch chains (now we are correctly rethrowing the exception immediately at entering the interpreter).
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Sat, 18 Jun 2011 19:13:55 +0200
parents 6c97c830fb6f
children 0e8a2a629afb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2426
1d1603768966 7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents: 2192
diff changeset
2 * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1378
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1378
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1378
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
26 #include "c1/c1_Compilation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
27 #include "c1/c1_Instruction.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
28 #include "c1/c1_InstructionPrinter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
29 #include "c1/c1_LIRAssembler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
30 #include "c1/c1_MacroAssembler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
31 #include "c1/c1_ValueStack.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
32 #include "ci/ciInstance.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
33 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
34 # include "nativeInst_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
35 # include "vmreg_x86.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
36 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
37 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
38 # include "nativeInst_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
39 # include "vmreg_sparc.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
40 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
41 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
42 # include "nativeInst_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
43 # include "vmreg_zero.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
44 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2089
diff changeset
45 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2089
diff changeset
46 # include "nativeInst_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2089
diff changeset
47 # include "vmreg_arm.inline.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2089
diff changeset
48 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2089
diff changeset
49 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2089
diff changeset
50 # include "nativeInst_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2089
diff changeset
51 # include "vmreg_ppc.inline.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2089
diff changeset
52 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 void LIR_Assembler::patching_epilog(PatchingStub* patch, LIR_PatchCode patch_code, Register obj, CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // we must have enough patching space so that call can be inserted
a61af66fc99e Initial load
duke
parents:
diff changeset
57 while ((intx) _masm->pc() - (intx) patch->pc_start() < NativeCall::instruction_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
58 _masm->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
59 }
a61af66fc99e Initial load
duke
parents:
diff changeset
60 patch->install(_masm, patch_code, obj, info);
a61af66fc99e Initial load
duke
parents:
diff changeset
61 append_patching_stub(patch);
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 #ifdef ASSERT
1819
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
64 Bytecodes::Code code = info->scope()->method()->java_code_at_bci(info->stack()->bci());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
65 if (patch->id() == PatchingStub::access_field_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
66 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
67 case Bytecodes::_putstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
68 case Bytecodes::_getstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
69 case Bytecodes::_putfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
70 case Bytecodes::_getfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
71 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
73 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
74 }
a61af66fc99e Initial load
duke
parents:
diff changeset
75 } else if (patch->id() == PatchingStub::load_klass_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
76 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
77 case Bytecodes::_putstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
78 case Bytecodes::_getstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
79 case Bytecodes::_new:
a61af66fc99e Initial load
duke
parents:
diff changeset
80 case Bytecodes::_anewarray:
a61af66fc99e Initial load
duke
parents:
diff changeset
81 case Bytecodes::_multianewarray:
a61af66fc99e Initial load
duke
parents:
diff changeset
82 case Bytecodes::_instanceof:
a61af66fc99e Initial load
duke
parents:
diff changeset
83 case Bytecodes::_checkcast:
a61af66fc99e Initial load
duke
parents:
diff changeset
84 case Bytecodes::_ldc:
a61af66fc99e Initial load
duke
parents:
diff changeset
85 case Bytecodes::_ldc_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
86 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
87 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
88 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
91 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 //---------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 LIR_Assembler::LIR_Assembler(Compilation* c):
a61af66fc99e Initial load
duke
parents:
diff changeset
101 _compilation(c)
a61af66fc99e Initial load
duke
parents:
diff changeset
102 , _masm(c->masm())
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
103 , _bs(Universe::heap()->barrier_set())
0
a61af66fc99e Initial load
duke
parents:
diff changeset
104 , _frame_map(c->frame_map())
a61af66fc99e Initial load
duke
parents:
diff changeset
105 , _current_block(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
106 , _pending_non_safepoint(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
107 , _pending_non_safepoint_offset(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
108 {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 _slow_case_stubs = new CodeStubList();
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 LIR_Assembler::~LIR_Assembler() {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 void LIR_Assembler::append_patching_stub(PatchingStub* stub) {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 _slow_case_stubs->append(stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 void LIR_Assembler::check_codespace() {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 CodeSection* cs = _masm->code_section();
a61af66fc99e Initial load
duke
parents:
diff changeset
124 if (cs->remaining() < (int)(1*K)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 BAILOUT("CodeBuffer overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 void LIR_Assembler::emit_code_stub(CodeStub* stub) {
a61af66fc99e Initial load
duke
parents:
diff changeset
131 _slow_case_stubs->append(stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 }
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 void LIR_Assembler::emit_stubs(CodeStubList* stub_list) {
a61af66fc99e Initial load
duke
parents:
diff changeset
135 for (int m = 0; m < stub_list->length(); m++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 CodeStub* s = (*stub_list)[m];
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 check_codespace();
a61af66fc99e Initial load
duke
parents:
diff changeset
139 CHECK_BAILOUT();
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
142 if (CommentedAssembly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
144 s->print_name(&st);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 st.print(" slow case");
a61af66fc99e Initial load
duke
parents:
diff changeset
146 _masm->block_comment(st.as_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
149 s->emit_code(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
150 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
151 s->assert_no_unbound_labels();
a61af66fc99e Initial load
duke
parents:
diff changeset
152 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 void LIR_Assembler::emit_slow_case_stubs() {
a61af66fc99e Initial load
duke
parents:
diff changeset
158 emit_stubs(_slow_case_stubs);
a61af66fc99e Initial load
duke
parents:
diff changeset
159 }
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 bool LIR_Assembler::needs_icache(ciMethod* method) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 return !method->is_static();
a61af66fc99e Initial load
duke
parents:
diff changeset
164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 int LIR_Assembler::code_offset() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 return _masm->offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 address LIR_Assembler::pc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 return _masm->pc();
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 void LIR_Assembler::emit_exception_entries(ExceptionInfoList* info_list) {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 for (int i = 0; i < info_list->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 XHandlers* handlers = info_list->at(i)->exception_handlers();
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 for (int j = 0; j < handlers->length(); j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 XHandler* handler = handlers->handler_at(j);
a61af66fc99e Initial load
duke
parents:
diff changeset
183 assert(handler->lir_op_id() != -1, "handler not processed by LinearScan");
a61af66fc99e Initial load
duke
parents:
diff changeset
184 assert(handler->entry_code() == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
185 handler->entry_code()->instructions_list()->last()->code() == lir_branch ||
a61af66fc99e Initial load
duke
parents:
diff changeset
186 handler->entry_code()->instructions_list()->last()->code() == lir_delay_slot, "last operation must be branch");
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 if (handler->entry_pco() == -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // entry code not emitted yet
a61af66fc99e Initial load
duke
parents:
diff changeset
190 if (handler->entry_code() != NULL && handler->entry_code()->instructions_list()->length() > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
191 handler->set_entry_pco(code_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
192 if (CommentedAssembly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
193 _masm->block_comment("Exception adapter block");
a61af66fc99e Initial load
duke
parents:
diff changeset
194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
195 emit_lir_list(handler->entry_code());
a61af66fc99e Initial load
duke
parents:
diff changeset
196 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 handler->set_entry_pco(handler->entry_block()->exception_handler_pco());
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 assert(handler->entry_pco() != -1, "must be set now");
a61af66fc99e Initial load
duke
parents:
diff changeset
201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 void LIR_Assembler::emit_code(BlockList* hir) {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 if (PrintLIR) {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 print_LIR(hir);
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 int n = hir->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
213 for (int i = 0; i < n; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 emit_block(hir->at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
215 CHECK_BAILOUT();
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 flush_debug_info(code_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 DEBUG_ONLY(check_no_unbound_labels());
a61af66fc99e Initial load
duke
parents:
diff changeset
221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 void LIR_Assembler::emit_block(BlockBegin* block) {
a61af66fc99e Initial load
duke
parents:
diff changeset
225 if (block->is_set(BlockBegin::backward_branch_target_flag)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
226 align_backward_branch_target();
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // if this block is the start of an exception handler, record the
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // PC offset of the first instruction for later construction of
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // the ExceptionHandlerTable
a61af66fc99e Initial load
duke
parents:
diff changeset
232 if (block->is_set(BlockBegin::exception_entry_flag)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
233 block->set_exception_handler_pco(code_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
237 if (PrintLIRWithAssembly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // don't print Phi's
a61af66fc99e Initial load
duke
parents:
diff changeset
239 InstructionPrinter ip(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
240 block->print(ip);
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242 #endif /* PRODUCT */
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 assert(block->lir() != NULL, "must have LIR");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
245 X86_ONLY(assert(_masm->rsp_offset() == 0, "frame size should be fixed"));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
248 if (CommentedAssembly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
249 stringStream st;
1819
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
250 st.print_cr(" block B%d [%d, %d]", block->block_id(), block->bci(), block->end()->printable_bci());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
251 _masm->block_comment(st.as_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
253 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 emit_lir_list(block->lir());
a61af66fc99e Initial load
duke
parents:
diff changeset
256
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
257 X86_ONLY(assert(_masm->rsp_offset() == 0, "frame size should be fixed"));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 void LIR_Assembler::emit_lir_list(LIR_List* list) {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 peephole(list);
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 int n = list->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
265 for (int i = 0; i < n; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
266 LIR_Op* op = list->at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 check_codespace();
a61af66fc99e Initial load
duke
parents:
diff changeset
269 CHECK_BAILOUT();
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
272 if (CommentedAssembly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // Don't record out every op since that's too verbose. Print
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // branches since they include block and stub names. Also print
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // patching moves since they generate funny looking code.
a61af66fc99e Initial load
duke
parents:
diff changeset
276 if (op->code() == lir_branch ||
a61af66fc99e Initial load
duke
parents:
diff changeset
277 (op->code() == lir_move && op->as_Op1()->patch_code() != lir_patch_none)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
279 op->print_on(&st);
a61af66fc99e Initial load
duke
parents:
diff changeset
280 _masm->block_comment(st.as_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283 if (PrintLIRWithAssembly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // print out the LIR operation followed by the resulting assembly
a61af66fc99e Initial load
duke
parents:
diff changeset
285 list->at(i)->print(); tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287 #endif /* PRODUCT */
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 op->emit_code(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
290
a61af66fc99e Initial load
duke
parents:
diff changeset
291 if (compilation()->debug_info_recorder()->recording_non_safepoints()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
292 process_debug_info(op);
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
296 if (PrintLIRWithAssembly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
297 _masm->code()->decode();
a61af66fc99e Initial load
duke
parents:
diff changeset
298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
299 #endif /* PRODUCT */
a61af66fc99e Initial load
duke
parents:
diff changeset
300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
304 void LIR_Assembler::check_no_unbound_labels() {
a61af66fc99e Initial load
duke
parents:
diff changeset
305 CHECK_BAILOUT();
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 for (int i = 0; i < _branch_target_blocks.length() - 1; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 if (!_branch_target_blocks.at(i)->label()->is_bound()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
309 tty->print_cr("label of block B%d is not bound", _branch_target_blocks.at(i)->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
310 assert(false, "unbound label");
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
314 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 //----------------------------------debug info--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 void LIR_Assembler::add_debug_info_for_branch(CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
320 _masm->code_section()->relocate(pc(), relocInfo::poll_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
321 int pc_offset = code_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
322 flush_debug_info(pc_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
323 info->record_debug_info(compilation()->debug_info_recorder(), pc_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
324 if (info->exception_handlers() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
325 compilation()->add_exception_handlers_for_pco(pc_offset, info->exception_handlers());
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1378
diff changeset
330 void LIR_Assembler::add_call_info(int pc_offset, CodeEmitInfo* cinfo) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
331 flush_debug_info(pc_offset);
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1378
diff changeset
332 cinfo->record_debug_info(compilation()->debug_info_recorder(), pc_offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
333 if (cinfo->exception_handlers() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 compilation()->add_exception_handlers_for_pco(pc_offset, cinfo->exception_handlers());
a61af66fc99e Initial load
duke
parents:
diff changeset
335 }
a61af66fc99e Initial load
duke
parents:
diff changeset
336 }
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 static ValueStack* debug_info(Instruction* ins) {
a61af66fc99e Initial load
duke
parents:
diff changeset
339 StateSplit* ss = ins->as_StateSplit();
a61af66fc99e Initial load
duke
parents:
diff changeset
340 if (ss != NULL) return ss->state();
1819
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
341 return ins->state_before();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 void LIR_Assembler::process_debug_info(LIR_Op* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
345 Instruction* src = op->source();
a61af66fc99e Initial load
duke
parents:
diff changeset
346 if (src == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
347 int pc_offset = code_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
348 if (_pending_non_safepoint == src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
349 _pending_non_safepoint_offset = pc_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
350 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
352 ValueStack* vstack = debug_info(src);
a61af66fc99e Initial load
duke
parents:
diff changeset
353 if (vstack == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 if (_pending_non_safepoint != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // Got some old debug info. Get rid of it.
1819
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
356 if (debug_info(_pending_non_safepoint) == vstack) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
357 _pending_non_safepoint_offset = pc_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
358 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
360 if (_pending_non_safepoint_offset < pc_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
361 record_non_safepoint_debug_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
362 }
a61af66fc99e Initial load
duke
parents:
diff changeset
363 _pending_non_safepoint = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // Remember the debug info.
a61af66fc99e Initial load
duke
parents:
diff changeset
366 if (pc_offset > compilation()->debug_info_recorder()->last_pc_offset()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
367 _pending_non_safepoint = src;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 _pending_non_safepoint_offset = pc_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // Index caller states in s, where 0 is the oldest, 1 its callee, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // Return NULL if n is too large.
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // Returns the caller_bci for the next-younger state, also.
a61af66fc99e Initial load
duke
parents:
diff changeset
375 static ValueStack* nth_oldest(ValueStack* s, int n, int& bci_result) {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 ValueStack* t = s;
a61af66fc99e Initial load
duke
parents:
diff changeset
377 for (int i = 0; i < n; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
378 if (t == NULL) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
379 t = t->caller_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
381 if (t == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
382 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
383 ValueStack* tc = t->caller_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
384 if (tc == NULL) return s;
a61af66fc99e Initial load
duke
parents:
diff changeset
385 t = tc;
1819
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
386 bci_result = tc->bci();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
387 s = s->caller_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
389 }
a61af66fc99e Initial load
duke
parents:
diff changeset
390
a61af66fc99e Initial load
duke
parents:
diff changeset
391 void LIR_Assembler::record_non_safepoint_debug_info() {
a61af66fc99e Initial load
duke
parents:
diff changeset
392 int pc_offset = _pending_non_safepoint_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
393 ValueStack* vstack = debug_info(_pending_non_safepoint);
1819
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1783
diff changeset
394 int bci = vstack->bci();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396 DebugInformationRecorder* debug_info = compilation()->debug_info_recorder();
a61af66fc99e Initial load
duke
parents:
diff changeset
397 assert(debug_info->recording_non_safepoints(), "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 debug_info->add_non_safepoint(pc_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // Visit scopes from oldest to youngest.
a61af66fc99e Initial load
duke
parents:
diff changeset
402 for (int n = 0; ; n++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
403 int s_bci = bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
404 ValueStack* s = nth_oldest(vstack, n, s_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
405 if (s == NULL) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
406 IRScope* scope = s->scope();
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 380
diff changeset
407 //Always pass false for reexecute since these ScopeDescs are never used for deopt
3018
5857923e563c Fixed an issue with frame states in exception dispatch chains (now we are correctly rethrowing the exception immediately at entering the interpreter).
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2468
diff changeset
408 debug_info->describe_scope(pc_offset, scope->method(), s->bci(), false/*reexecute*/, false/*rethrow_exception*/);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 debug_info->end_non_safepoint(pc_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
412 }
a61af66fc99e Initial load
duke
parents:
diff changeset
413
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 void LIR_Assembler::add_debug_info_for_null_check_here(CodeEmitInfo* cinfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
416 add_debug_info_for_null_check(code_offset(), cinfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
417 }
a61af66fc99e Initial load
duke
parents:
diff changeset
418
a61af66fc99e Initial load
duke
parents:
diff changeset
419 void LIR_Assembler::add_debug_info_for_null_check(int pc_offset, CodeEmitInfo* cinfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
420 ImplicitNullCheckStub* stub = new ImplicitNullCheckStub(pc_offset, cinfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
421 emit_code_stub(stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424 void LIR_Assembler::add_debug_info_for_div0_here(CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
425 add_debug_info_for_div0(code_offset(), info);
a61af66fc99e Initial load
duke
parents:
diff changeset
426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 void LIR_Assembler::add_debug_info_for_div0(int pc_offset, CodeEmitInfo* cinfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
429 DivByZeroStub* stub = new DivByZeroStub(pc_offset, cinfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
430 emit_code_stub(stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 void LIR_Assembler::emit_rtcall(LIR_OpRTCall* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
434 rt_call(op->result_opr(), op->addr(), op->arguments(), op->tmp(), op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438 void LIR_Assembler::emit_call(LIR_OpJavaCall* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 verify_oop_map(op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // must align calls sites, otherwise they can't be updated atomically on MP hardware
a61af66fc99e Initial load
duke
parents:
diff changeset
443 align_call(op->code());
a61af66fc99e Initial load
duke
parents:
diff changeset
444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // emit the static call stub stuff out of line
a61af66fc99e Initial load
duke
parents:
diff changeset
447 emit_static_call_stub();
a61af66fc99e Initial load
duke
parents:
diff changeset
448
a61af66fc99e Initial load
duke
parents:
diff changeset
449 switch (op->code()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
450 case lir_static_call:
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 948
diff changeset
451 call(op, relocInfo::static_call_type);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
452 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
453 case lir_optvirtual_call:
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 948
diff changeset
454 case lir_dynamic_call:
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 948
diff changeset
455 call(op, relocInfo::opt_virtual_call_type);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
456 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
457 case lir_icvirtual_call:
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 948
diff changeset
458 ic_call(op);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
459 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
460 case lir_virtual_call:
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 948
diff changeset
461 vtable_call(op);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
462 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
463 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
464 }
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 948
diff changeset
465
1691
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1579
diff changeset
466 // JSR 292
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1579
diff changeset
467 // Record if this method has MethodHandle invokes.
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1579
diff changeset
468 if (op->is_method_handle_invoke()) {
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1579
diff changeset
469 compilation()->set_has_method_handle_invokes(true);
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1579
diff changeset
470 }
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1579
diff changeset
471
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
472 #if defined(X86) && defined(TIERED)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // C2 leave fpu stack dirty clean it
a61af66fc99e Initial load
duke
parents:
diff changeset
474 if (UseSSE < 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
475 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
476 for ( i = 1; i <= 7 ; i++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
477 ffree(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
478 }
a61af66fc99e Initial load
duke
parents:
diff changeset
479 if (!op->result_opr()->is_float_kind()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
480 ffree(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
482 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
483 #endif // X86 && TIERED
0
a61af66fc99e Initial load
duke
parents:
diff changeset
484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486
a61af66fc99e Initial load
duke
parents:
diff changeset
487 void LIR_Assembler::emit_opLabel(LIR_OpLabel* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
488 _masm->bind (*(op->label()));
a61af66fc99e Initial load
duke
parents:
diff changeset
489 }
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492 void LIR_Assembler::emit_op1(LIR_Op1* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
493 switch (op->code()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 case lir_move:
a61af66fc99e Initial load
duke
parents:
diff changeset
495 if (op->move_kind() == lir_move_volatile) {
a61af66fc99e Initial load
duke
parents:
diff changeset
496 assert(op->patch_code() == lir_patch_none, "can't patch volatiles");
a61af66fc99e Initial load
duke
parents:
diff changeset
497 volatile_move_op(op->in_opr(), op->result_opr(), op->type(), op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
498 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
499 move_op(op->in_opr(), op->result_opr(), op->type(),
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
500 op->patch_code(), op->info(), op->pop_fpu_stack(),
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
501 op->move_kind() == lir_move_unaligned,
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
502 op->move_kind() == lir_move_wide);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
504 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
505
a61af66fc99e Initial load
duke
parents:
diff changeset
506 case lir_prefetchr:
a61af66fc99e Initial load
duke
parents:
diff changeset
507 prefetchr(op->in_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
508 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
509
a61af66fc99e Initial load
duke
parents:
diff changeset
510 case lir_prefetchw:
a61af66fc99e Initial load
duke
parents:
diff changeset
511 prefetchw(op->in_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
512 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
513
a61af66fc99e Initial load
duke
parents:
diff changeset
514 case lir_roundfp: {
a61af66fc99e Initial load
duke
parents:
diff changeset
515 LIR_OpRoundFP* round_op = op->as_OpRoundFP();
a61af66fc99e Initial load
duke
parents:
diff changeset
516 roundfp_op(round_op->in_opr(), round_op->tmp(), round_op->result_opr(), round_op->pop_fpu_stack());
a61af66fc99e Initial load
duke
parents:
diff changeset
517 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
518 }
a61af66fc99e Initial load
duke
parents:
diff changeset
519
a61af66fc99e Initial load
duke
parents:
diff changeset
520 case lir_return:
a61af66fc99e Initial load
duke
parents:
diff changeset
521 return_op(op->in_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
522 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 case lir_safepoint:
a61af66fc99e Initial load
duke
parents:
diff changeset
525 if (compilation()->debug_info_recorder()->last_pc_offset() == code_offset()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
526 _masm->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
527 }
a61af66fc99e Initial load
duke
parents:
diff changeset
528 safepoint_poll(op->in_opr(), op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
529 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
530
a61af66fc99e Initial load
duke
parents:
diff changeset
531 case lir_fxch:
a61af66fc99e Initial load
duke
parents:
diff changeset
532 fxch(op->in_opr()->as_jint());
a61af66fc99e Initial load
duke
parents:
diff changeset
533 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
534
a61af66fc99e Initial load
duke
parents:
diff changeset
535 case lir_fld:
a61af66fc99e Initial load
duke
parents:
diff changeset
536 fld(op->in_opr()->as_jint());
a61af66fc99e Initial load
duke
parents:
diff changeset
537 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
538
a61af66fc99e Initial load
duke
parents:
diff changeset
539 case lir_ffree:
a61af66fc99e Initial load
duke
parents:
diff changeset
540 ffree(op->in_opr()->as_jint());
a61af66fc99e Initial load
duke
parents:
diff changeset
541 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
542
a61af66fc99e Initial load
duke
parents:
diff changeset
543 case lir_branch:
a61af66fc99e Initial load
duke
parents:
diff changeset
544 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 case lir_push:
a61af66fc99e Initial load
duke
parents:
diff changeset
547 push(op->in_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
548 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
549
a61af66fc99e Initial load
duke
parents:
diff changeset
550 case lir_pop:
a61af66fc99e Initial load
duke
parents:
diff changeset
551 pop(op->in_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
552 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 case lir_neg:
a61af66fc99e Initial load
duke
parents:
diff changeset
555 negate(op->in_opr(), op->result_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
556 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
557
a61af66fc99e Initial load
duke
parents:
diff changeset
558 case lir_leal:
a61af66fc99e Initial load
duke
parents:
diff changeset
559 leal(op->in_opr(), op->result_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
560 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
561
a61af66fc99e Initial load
duke
parents:
diff changeset
562 case lir_null_check:
a61af66fc99e Initial load
duke
parents:
diff changeset
563 if (GenerateCompilerNullChecks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
564 add_debug_info_for_null_check_here(op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566 if (op->in_opr()->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
567 _masm->null_check(op->in_opr()->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
568 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
569 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
570 }
a61af66fc99e Initial load
duke
parents:
diff changeset
571 }
a61af66fc99e Initial load
duke
parents:
diff changeset
572 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
573
a61af66fc99e Initial load
duke
parents:
diff changeset
574 case lir_monaddr:
a61af66fc99e Initial load
duke
parents:
diff changeset
575 monitor_address(op->in_opr()->as_constant_ptr()->as_jint(), op->result_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
576 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
577
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
578 #ifdef SPARC
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
579 case lir_pack64:
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
580 pack64(op->in_opr(), op->result_opr());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
581 break;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
582
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
583 case lir_unpack64:
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
584 unpack64(op->in_opr(), op->result_opr());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
585 break;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
586 #endif
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
587
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1301
diff changeset
588 case lir_unwind:
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1301
diff changeset
589 unwind_op(op->in_opr());
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1301
diff changeset
590 break;
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1301
diff changeset
591
0
a61af66fc99e Initial load
duke
parents:
diff changeset
592 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
593 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
594 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
597
a61af66fc99e Initial load
duke
parents:
diff changeset
598
a61af66fc99e Initial load
duke
parents:
diff changeset
599 void LIR_Assembler::emit_op0(LIR_Op0* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
600 switch (op->code()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
601 case lir_word_align: {
a61af66fc99e Initial load
duke
parents:
diff changeset
602 while (code_offset() % BytesPerWord != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
603 _masm->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
605 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
606 }
a61af66fc99e Initial load
duke
parents:
diff changeset
607
a61af66fc99e Initial load
duke
parents:
diff changeset
608 case lir_nop:
a61af66fc99e Initial load
duke
parents:
diff changeset
609 assert(op->info() == NULL, "not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
610 _masm->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
611 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
612
a61af66fc99e Initial load
duke
parents:
diff changeset
613 case lir_label:
a61af66fc99e Initial load
duke
parents:
diff changeset
614 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
615 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
616
a61af66fc99e Initial load
duke
parents:
diff changeset
617 case lir_build_frame:
a61af66fc99e Initial load
duke
parents:
diff changeset
618 build_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
619 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
620
a61af66fc99e Initial load
duke
parents:
diff changeset
621 case lir_std_entry:
a61af66fc99e Initial load
duke
parents:
diff changeset
622 // init offsets
a61af66fc99e Initial load
duke
parents:
diff changeset
623 offsets()->set_value(CodeOffsets::OSR_Entry, _masm->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
624 _masm->align(CodeEntryAlignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
625 if (needs_icache(compilation()->method())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
626 check_icache();
a61af66fc99e Initial load
duke
parents:
diff changeset
627 }
a61af66fc99e Initial load
duke
parents:
diff changeset
628 offsets()->set_value(CodeOffsets::Verified_Entry, _masm->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
629 _masm->verified_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
630 build_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
631 offsets()->set_value(CodeOffsets::Frame_Complete, _masm->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
632 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 case lir_osr_entry:
a61af66fc99e Initial load
duke
parents:
diff changeset
635 offsets()->set_value(CodeOffsets::OSR_Entry, _masm->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
636 osr_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
637 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 case lir_24bit_FPU:
a61af66fc99e Initial load
duke
parents:
diff changeset
640 set_24bit_FPU();
a61af66fc99e Initial load
duke
parents:
diff changeset
641 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
642
a61af66fc99e Initial load
duke
parents:
diff changeset
643 case lir_reset_FPU:
a61af66fc99e Initial load
duke
parents:
diff changeset
644 reset_FPU();
a61af66fc99e Initial load
duke
parents:
diff changeset
645 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
646
a61af66fc99e Initial load
duke
parents:
diff changeset
647 case lir_breakpoint:
a61af66fc99e Initial load
duke
parents:
diff changeset
648 breakpoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
649 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651 case lir_fpop_raw:
a61af66fc99e Initial load
duke
parents:
diff changeset
652 fpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
653 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
654
a61af66fc99e Initial load
duke
parents:
diff changeset
655 case lir_membar:
a61af66fc99e Initial load
duke
parents:
diff changeset
656 membar();
a61af66fc99e Initial load
duke
parents:
diff changeset
657 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
658
a61af66fc99e Initial load
duke
parents:
diff changeset
659 case lir_membar_acquire:
a61af66fc99e Initial load
duke
parents:
diff changeset
660 membar_acquire();
a61af66fc99e Initial load
duke
parents:
diff changeset
661 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
662
a61af66fc99e Initial load
duke
parents:
diff changeset
663 case lir_membar_release:
a61af66fc99e Initial load
duke
parents:
diff changeset
664 membar_release();
a61af66fc99e Initial load
duke
parents:
diff changeset
665 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
666
a61af66fc99e Initial load
duke
parents:
diff changeset
667 case lir_get_thread:
a61af66fc99e Initial load
duke
parents:
diff changeset
668 get_thread(op->result_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
669 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
670
a61af66fc99e Initial load
duke
parents:
diff changeset
671 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
672 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
673 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
674 }
a61af66fc99e Initial load
duke
parents:
diff changeset
675 }
a61af66fc99e Initial load
duke
parents:
diff changeset
676
a61af66fc99e Initial load
duke
parents:
diff changeset
677
a61af66fc99e Initial load
duke
parents:
diff changeset
678 void LIR_Assembler::emit_op2(LIR_Op2* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
679 switch (op->code()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
680 case lir_cmp:
a61af66fc99e Initial load
duke
parents:
diff changeset
681 if (op->info() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
682 assert(op->in_opr1()->is_address() || op->in_opr2()->is_address(),
a61af66fc99e Initial load
duke
parents:
diff changeset
683 "shouldn't be codeemitinfo for non-address operands");
a61af66fc99e Initial load
duke
parents:
diff changeset
684 add_debug_info_for_null_check_here(op->info()); // exception possible
a61af66fc99e Initial load
duke
parents:
diff changeset
685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
686 comp_op(op->condition(), op->in_opr1(), op->in_opr2(), op);
a61af66fc99e Initial load
duke
parents:
diff changeset
687 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
688
a61af66fc99e Initial load
duke
parents:
diff changeset
689 case lir_cmp_l2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
690 case lir_cmp_fd2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
691 case lir_ucmp_fd2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
692 comp_fl2i(op->code(), op->in_opr1(), op->in_opr2(), op->result_opr(), op);
a61af66fc99e Initial load
duke
parents:
diff changeset
693 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
694
a61af66fc99e Initial load
duke
parents:
diff changeset
695 case lir_cmove:
2089
037c727f35fb 7009231: C1: Incorrect CAS code for longs on SPARC 32bit
iveresov
parents: 2002
diff changeset
696 cmove(op->condition(), op->in_opr1(), op->in_opr2(), op->result_opr(), op->type());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
697 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
698
a61af66fc99e Initial load
duke
parents:
diff changeset
699 case lir_shl:
a61af66fc99e Initial load
duke
parents:
diff changeset
700 case lir_shr:
a61af66fc99e Initial load
duke
parents:
diff changeset
701 case lir_ushr:
a61af66fc99e Initial load
duke
parents:
diff changeset
702 if (op->in_opr2()->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
703 shift_op(op->code(), op->in_opr1(), op->in_opr2()->as_constant_ptr()->as_jint(), op->result_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
704 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
705 shift_op(op->code(), op->in_opr1(), op->in_opr2(), op->result_opr(), op->tmp_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
706 }
a61af66fc99e Initial load
duke
parents:
diff changeset
707 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
708
a61af66fc99e Initial load
duke
parents:
diff changeset
709 case lir_add:
a61af66fc99e Initial load
duke
parents:
diff changeset
710 case lir_sub:
a61af66fc99e Initial load
duke
parents:
diff changeset
711 case lir_mul:
a61af66fc99e Initial load
duke
parents:
diff changeset
712 case lir_mul_strictfp:
a61af66fc99e Initial load
duke
parents:
diff changeset
713 case lir_div:
a61af66fc99e Initial load
duke
parents:
diff changeset
714 case lir_div_strictfp:
a61af66fc99e Initial load
duke
parents:
diff changeset
715 case lir_rem:
a61af66fc99e Initial load
duke
parents:
diff changeset
716 assert(op->fpu_pop_count() < 2, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
717 arith_op(
a61af66fc99e Initial load
duke
parents:
diff changeset
718 op->code(),
a61af66fc99e Initial load
duke
parents:
diff changeset
719 op->in_opr1(),
a61af66fc99e Initial load
duke
parents:
diff changeset
720 op->in_opr2(),
a61af66fc99e Initial load
duke
parents:
diff changeset
721 op->result_opr(),
a61af66fc99e Initial load
duke
parents:
diff changeset
722 op->info(),
a61af66fc99e Initial load
duke
parents:
diff changeset
723 op->fpu_pop_count() == 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
724 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
725
a61af66fc99e Initial load
duke
parents:
diff changeset
726 case lir_abs:
a61af66fc99e Initial load
duke
parents:
diff changeset
727 case lir_sqrt:
a61af66fc99e Initial load
duke
parents:
diff changeset
728 case lir_sin:
a61af66fc99e Initial load
duke
parents:
diff changeset
729 case lir_tan:
a61af66fc99e Initial load
duke
parents:
diff changeset
730 case lir_cos:
a61af66fc99e Initial load
duke
parents:
diff changeset
731 case lir_log:
a61af66fc99e Initial load
duke
parents:
diff changeset
732 case lir_log10:
a61af66fc99e Initial load
duke
parents:
diff changeset
733 intrinsic_op(op->code(), op->in_opr1(), op->in_opr2(), op->result_opr(), op);
a61af66fc99e Initial load
duke
parents:
diff changeset
734 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
735
a61af66fc99e Initial load
duke
parents:
diff changeset
736 case lir_logic_and:
a61af66fc99e Initial load
duke
parents:
diff changeset
737 case lir_logic_or:
a61af66fc99e Initial load
duke
parents:
diff changeset
738 case lir_logic_xor:
a61af66fc99e Initial load
duke
parents:
diff changeset
739 logic_op(
a61af66fc99e Initial load
duke
parents:
diff changeset
740 op->code(),
a61af66fc99e Initial load
duke
parents:
diff changeset
741 op->in_opr1(),
a61af66fc99e Initial load
duke
parents:
diff changeset
742 op->in_opr2(),
a61af66fc99e Initial load
duke
parents:
diff changeset
743 op->result_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
744 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
745
a61af66fc99e Initial load
duke
parents:
diff changeset
746 case lir_throw:
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1301
diff changeset
747 throw_op(op->in_opr1(), op->in_opr2(), op->info());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
748 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
749
a61af66fc99e Initial load
duke
parents:
diff changeset
750 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
751 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
752 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
753 }
a61af66fc99e Initial load
duke
parents:
diff changeset
754 }
a61af66fc99e Initial load
duke
parents:
diff changeset
755
a61af66fc99e Initial load
duke
parents:
diff changeset
756
a61af66fc99e Initial load
duke
parents:
diff changeset
757 void LIR_Assembler::build_frame() {
a61af66fc99e Initial load
duke
parents:
diff changeset
758 _masm->build_frame(initial_frame_size_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
759 }
a61af66fc99e Initial load
duke
parents:
diff changeset
760
a61af66fc99e Initial load
duke
parents:
diff changeset
761
a61af66fc99e Initial load
duke
parents:
diff changeset
762 void LIR_Assembler::roundfp_op(LIR_Opr src, LIR_Opr tmp, LIR_Opr dest, bool pop_fpu_stack) {
a61af66fc99e Initial load
duke
parents:
diff changeset
763 assert((src->is_single_fpu() && dest->is_single_stack()) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
764 (src->is_double_fpu() && dest->is_double_stack()),
a61af66fc99e Initial load
duke
parents:
diff changeset
765 "round_fp: rounds register -> stack location");
a61af66fc99e Initial load
duke
parents:
diff changeset
766
a61af66fc99e Initial load
duke
parents:
diff changeset
767 reg2stack (src, dest, src->type(), pop_fpu_stack);
a61af66fc99e Initial load
duke
parents:
diff changeset
768 }
a61af66fc99e Initial load
duke
parents:
diff changeset
769
a61af66fc99e Initial load
duke
parents:
diff changeset
770
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
771 void LIR_Assembler::move_op(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool pop_fpu_stack, bool unaligned, bool wide) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
772 if (src->is_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
773 if (dest->is_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
774 assert(patch_code == lir_patch_none && info == NULL, "no patching and info allowed here");
a61af66fc99e Initial load
duke
parents:
diff changeset
775 reg2reg(src, dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
776 } else if (dest->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
777 assert(patch_code == lir_patch_none && info == NULL, "no patching and info allowed here");
a61af66fc99e Initial load
duke
parents:
diff changeset
778 reg2stack(src, dest, type, pop_fpu_stack);
a61af66fc99e Initial load
duke
parents:
diff changeset
779 } else if (dest->is_address()) {
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
780 reg2mem(src, dest, type, patch_code, info, pop_fpu_stack, wide, unaligned);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
781 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
782 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
783 }
a61af66fc99e Initial load
duke
parents:
diff changeset
784
a61af66fc99e Initial load
duke
parents:
diff changeset
785 } else if (src->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
786 assert(patch_code == lir_patch_none && info == NULL, "no patching and info allowed here");
a61af66fc99e Initial load
duke
parents:
diff changeset
787 if (dest->is_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
788 stack2reg(src, dest, type);
a61af66fc99e Initial load
duke
parents:
diff changeset
789 } else if (dest->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
790 stack2stack(src, dest, type);
a61af66fc99e Initial load
duke
parents:
diff changeset
791 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
792 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
793 }
a61af66fc99e Initial load
duke
parents:
diff changeset
794
a61af66fc99e Initial load
duke
parents:
diff changeset
795 } else if (src->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
796 if (dest->is_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
797 const2reg(src, dest, patch_code, info); // patching is possible
a61af66fc99e Initial load
duke
parents:
diff changeset
798 } else if (dest->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
799 assert(patch_code == lir_patch_none && info == NULL, "no patching and info allowed here");
a61af66fc99e Initial load
duke
parents:
diff changeset
800 const2stack(src, dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
801 } else if (dest->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
802 assert(patch_code == lir_patch_none, "no patching allowed here");
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
803 const2mem(src, dest, type, info, wide);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
804 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
805 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
806 }
a61af66fc99e Initial load
duke
parents:
diff changeset
807
a61af66fc99e Initial load
duke
parents:
diff changeset
808 } else if (src->is_address()) {
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
809 mem2reg(src, dest, type, patch_code, info, wide, unaligned);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
810
a61af66fc99e Initial load
duke
parents:
diff changeset
811 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
812 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
813 }
a61af66fc99e Initial load
duke
parents:
diff changeset
814 }
a61af66fc99e Initial load
duke
parents:
diff changeset
815
a61af66fc99e Initial load
duke
parents:
diff changeset
816
a61af66fc99e Initial load
duke
parents:
diff changeset
817 void LIR_Assembler::verify_oop_map(CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
818 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
819 if (VerifyOopMaps || VerifyOops) {
a61af66fc99e Initial load
duke
parents:
diff changeset
820 bool v = VerifyOops;
a61af66fc99e Initial load
duke
parents:
diff changeset
821 VerifyOops = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
822 OopMapStream s(info->oop_map());
a61af66fc99e Initial load
duke
parents:
diff changeset
823 while (!s.is_done()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
824 OopMapValue v = s.current();
a61af66fc99e Initial load
duke
parents:
diff changeset
825 if (v.is_oop()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
826 VMReg r = v.reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
827 if (!r->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
828 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
829 st.print("bad oop %s at %d", r->as_Register()->name(), _masm->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
830 #ifdef SPARC
a61af66fc99e Initial load
duke
parents:
diff changeset
831 _masm->_verify_oop(r->as_Register(), strdup(st.as_string()), __FILE__, __LINE__);
a61af66fc99e Initial load
duke
parents:
diff changeset
832 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
833 _masm->verify_oop(r->as_Register());
a61af66fc99e Initial load
duke
parents:
diff changeset
834 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
835 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
836 _masm->verify_stack_oop(r->reg2stack() * VMRegImpl::stack_slot_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
838 }
2451
87ce328c6a21 6528013: C1 CTW failure with -XX:+VerifyOops assert(allocates2(pc),"")
never
parents: 2192
diff changeset
839 check_codespace();
87ce328c6a21 6528013: C1 CTW failure with -XX:+VerifyOops assert(allocates2(pc),"")
never
parents: 2192
diff changeset
840 CHECK_BAILOUT();
87ce328c6a21 6528013: C1 CTW failure with -XX:+VerifyOops assert(allocates2(pc),"")
never
parents: 2192
diff changeset
841
0
a61af66fc99e Initial load
duke
parents:
diff changeset
842 s.next();
a61af66fc99e Initial load
duke
parents:
diff changeset
843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
844 VerifyOops = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
845 }
a61af66fc99e Initial load
duke
parents:
diff changeset
846 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
847 }