annotate src/share/vm/c1/c1_LIRAssembler.cpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents 4a665be40fd3
children d5d065957597
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1378
diff changeset
2 * Copyright (c) 2000, 2010, 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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_c1_LIRAssembler.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 void LIR_Assembler::patching_epilog(PatchingStub* patch, LIR_PatchCode patch_code, Register obj, CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // we must have enough patching space so that call can be inserted
a61af66fc99e Initial load
duke
parents:
diff changeset
31 while ((intx) _masm->pc() - (intx) patch->pc_start() < NativeCall::instruction_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
32 _masm->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
33 }
a61af66fc99e Initial load
duke
parents:
diff changeset
34 patch->install(_masm, patch_code, obj, info);
a61af66fc99e Initial load
duke
parents:
diff changeset
35 append_patching_stub(patch);
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
38 Bytecodes::Code code = info->scope()->method()->java_code_at_bci(info->bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
39 if (patch->id() == PatchingStub::access_field_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
40 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
41 case Bytecodes::_putstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
42 case Bytecodes::_getstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
43 case Bytecodes::_putfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
44 case Bytecodes::_getfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
45 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
47 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
48 }
a61af66fc99e Initial load
duke
parents:
diff changeset
49 } else if (patch->id() == PatchingStub::load_klass_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
50 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
51 case Bytecodes::_putstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
52 case Bytecodes::_getstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
53 case Bytecodes::_new:
a61af66fc99e Initial load
duke
parents:
diff changeset
54 case Bytecodes::_anewarray:
a61af66fc99e Initial load
duke
parents:
diff changeset
55 case Bytecodes::_multianewarray:
a61af66fc99e Initial load
duke
parents:
diff changeset
56 case Bytecodes::_instanceof:
a61af66fc99e Initial load
duke
parents:
diff changeset
57 case Bytecodes::_checkcast:
a61af66fc99e Initial load
duke
parents:
diff changeset
58 case Bytecodes::_ldc:
a61af66fc99e Initial load
duke
parents:
diff changeset
59 case Bytecodes::_ldc_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
60 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
62 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
63 }
a61af66fc99e Initial load
duke
parents:
diff changeset
64 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
65 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
66 }
a61af66fc99e Initial load
duke
parents:
diff changeset
67 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
68 }
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 //---------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 LIR_Assembler::LIR_Assembler(Compilation* c):
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _compilation(c)
a61af66fc99e Initial load
duke
parents:
diff changeset
76 , _masm(c->masm())
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
77 , _bs(Universe::heap()->barrier_set())
0
a61af66fc99e Initial load
duke
parents:
diff changeset
78 , _frame_map(c->frame_map())
a61af66fc99e Initial load
duke
parents:
diff changeset
79 , _current_block(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
80 , _pending_non_safepoint(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
81 , _pending_non_safepoint_offset(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
82 {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 _slow_case_stubs = new CodeStubList();
a61af66fc99e Initial load
duke
parents:
diff changeset
84 }
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 LIR_Assembler::~LIR_Assembler() {
a61af66fc99e Initial load
duke
parents:
diff changeset
88 }
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 void LIR_Assembler::append_patching_stub(PatchingStub* stub) {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 _slow_case_stubs->append(stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
93 }
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 void LIR_Assembler::check_codespace() {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 CodeSection* cs = _masm->code_section();
a61af66fc99e Initial load
duke
parents:
diff changeset
98 if (cs->remaining() < (int)(1*K)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 BAILOUT("CodeBuffer overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 void LIR_Assembler::emit_code_stub(CodeStub* stub) {
a61af66fc99e Initial load
duke
parents:
diff changeset
105 _slow_case_stubs->append(stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 void LIR_Assembler::emit_stubs(CodeStubList* stub_list) {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 for (int m = 0; m < stub_list->length(); m++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
110 CodeStub* s = (*stub_list)[m];
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 check_codespace();
a61af66fc99e Initial load
duke
parents:
diff changeset
113 CHECK_BAILOUT();
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
116 if (CommentedAssembly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
117 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 s->print_name(&st);
a61af66fc99e Initial load
duke
parents:
diff changeset
119 st.print(" slow case");
a61af66fc99e Initial load
duke
parents:
diff changeset
120 _masm->block_comment(st.as_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
122 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
123 s->emit_code(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
124 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
125 s->assert_no_unbound_labels();
a61af66fc99e Initial load
duke
parents:
diff changeset
126 #endif
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
a61af66fc99e Initial load
duke
parents:
diff changeset
131 void LIR_Assembler::emit_slow_case_stubs() {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 emit_stubs(_slow_case_stubs);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 bool LIR_Assembler::needs_icache(ciMethod* method) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
137 return !method->is_static();
a61af66fc99e Initial load
duke
parents:
diff changeset
138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 int LIR_Assembler::code_offset() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
142 return _masm->offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 address LIR_Assembler::pc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
147 return _masm->pc();
a61af66fc99e Initial load
duke
parents:
diff changeset
148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 void LIR_Assembler::emit_exception_entries(ExceptionInfoList* info_list) {
a61af66fc99e Initial load
duke
parents:
diff changeset
152 for (int i = 0; i < info_list->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
153 XHandlers* handlers = info_list->at(i)->exception_handlers();
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 for (int j = 0; j < handlers->length(); j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
156 XHandler* handler = handlers->handler_at(j);
a61af66fc99e Initial load
duke
parents:
diff changeset
157 assert(handler->lir_op_id() != -1, "handler not processed by LinearScan");
a61af66fc99e Initial load
duke
parents:
diff changeset
158 assert(handler->entry_code() == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
159 handler->entry_code()->instructions_list()->last()->code() == lir_branch ||
a61af66fc99e Initial load
duke
parents:
diff changeset
160 handler->entry_code()->instructions_list()->last()->code() == lir_delay_slot, "last operation must be branch");
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 if (handler->entry_pco() == -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // entry code not emitted yet
a61af66fc99e Initial load
duke
parents:
diff changeset
164 if (handler->entry_code() != NULL && handler->entry_code()->instructions_list()->length() > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 handler->set_entry_pco(code_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
166 if (CommentedAssembly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
167 _masm->block_comment("Exception adapter block");
a61af66fc99e Initial load
duke
parents:
diff changeset
168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
169 emit_lir_list(handler->entry_code());
a61af66fc99e Initial load
duke
parents:
diff changeset
170 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
171 handler->set_entry_pco(handler->entry_block()->exception_handler_pco());
a61af66fc99e Initial load
duke
parents:
diff changeset
172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 assert(handler->entry_pco() != -1, "must be set now");
a61af66fc99e Initial load
duke
parents:
diff changeset
175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 void LIR_Assembler::emit_code(BlockList* hir) {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 if (PrintLIR) {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 print_LIR(hir);
a61af66fc99e Initial load
duke
parents:
diff changeset
184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 int n = hir->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
187 for (int i = 0; i < n; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 emit_block(hir->at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
189 CHECK_BAILOUT();
a61af66fc99e Initial load
duke
parents:
diff changeset
190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 flush_debug_info(code_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 DEBUG_ONLY(check_no_unbound_labels());
a61af66fc99e Initial load
duke
parents:
diff changeset
195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 void LIR_Assembler::emit_block(BlockBegin* block) {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 if (block->is_set(BlockBegin::backward_branch_target_flag)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 align_backward_branch_target();
a61af66fc99e Initial load
duke
parents:
diff changeset
201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // if this block is the start of an exception handler, record the
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // PC offset of the first instruction for later construction of
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // the ExceptionHandlerTable
a61af66fc99e Initial load
duke
parents:
diff changeset
206 if (block->is_set(BlockBegin::exception_entry_flag)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 block->set_exception_handler_pco(code_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
211 if (PrintLIRWithAssembly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // don't print Phi's
a61af66fc99e Initial load
duke
parents:
diff changeset
213 InstructionPrinter ip(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
214 block->print(ip);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 #endif /* PRODUCT */
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 assert(block->lir() != NULL, "must have LIR");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
219 X86_ONLY(assert(_masm->rsp_offset() == 0, "frame size should be fixed"));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
222 if (CommentedAssembly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
223 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
224 st.print_cr(" block B%d [%d, %d]", block->block_id(), block->bci(), block->end()->bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
225 _masm->block_comment(st.as_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
227 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 emit_lir_list(block->lir());
a61af66fc99e Initial load
duke
parents:
diff changeset
230
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
231 X86_ONLY(assert(_masm->rsp_offset() == 0, "frame size should be fixed"));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 void LIR_Assembler::emit_lir_list(LIR_List* list) {
a61af66fc99e Initial load
duke
parents:
diff changeset
236 peephole(list);
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 int n = list->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
239 for (int i = 0; i < n; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
240 LIR_Op* op = list->at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 check_codespace();
a61af66fc99e Initial load
duke
parents:
diff changeset
243 CHECK_BAILOUT();
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
246 if (CommentedAssembly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // Don't record out every op since that's too verbose. Print
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // branches since they include block and stub names. Also print
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // patching moves since they generate funny looking code.
a61af66fc99e Initial load
duke
parents:
diff changeset
250 if (op->code() == lir_branch ||
a61af66fc99e Initial load
duke
parents:
diff changeset
251 (op->code() == lir_move && op->as_Op1()->patch_code() != lir_patch_none)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
253 op->print_on(&st);
a61af66fc99e Initial load
duke
parents:
diff changeset
254 _masm->block_comment(st.as_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257 if (PrintLIRWithAssembly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // print out the LIR operation followed by the resulting assembly
a61af66fc99e Initial load
duke
parents:
diff changeset
259 list->at(i)->print(); tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
261 #endif /* PRODUCT */
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 op->emit_code(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 if (compilation()->debug_info_recorder()->recording_non_safepoints()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
266 process_debug_info(op);
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
270 if (PrintLIRWithAssembly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 _masm->code()->decode();
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273 #endif /* PRODUCT */
a61af66fc99e Initial load
duke
parents:
diff changeset
274 }
a61af66fc99e Initial load
duke
parents:
diff changeset
275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
278 void LIR_Assembler::check_no_unbound_labels() {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 CHECK_BAILOUT();
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 for (int i = 0; i < _branch_target_blocks.length() - 1; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 if (!_branch_target_blocks.at(i)->label()->is_bound()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
283 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
284 assert(false, "unbound label");
a61af66fc99e Initial load
duke
parents:
diff changeset
285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
288 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
289
a61af66fc99e Initial load
duke
parents:
diff changeset
290 //----------------------------------debug info--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 void LIR_Assembler::add_debug_info_for_branch(CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
294 _masm->code_section()->relocate(pc(), relocInfo::poll_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
295 int pc_offset = code_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
296 flush_debug_info(pc_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
297 info->record_debug_info(compilation()->debug_info_recorder(), pc_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
298 if (info->exception_handlers() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
299 compilation()->add_exception_handlers_for_pco(pc_offset, info->exception_handlers());
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
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1378
diff changeset
304 void LIR_Assembler::add_call_info(int pc_offset, CodeEmitInfo* cinfo) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
305 flush_debug_info(pc_offset);
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1378
diff changeset
306 cinfo->record_debug_info(compilation()->debug_info_recorder(), pc_offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
307 if (cinfo->exception_handlers() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 compilation()->add_exception_handlers_for_pco(pc_offset, cinfo->exception_handlers());
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310 }
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312 static ValueStack* debug_info(Instruction* ins) {
a61af66fc99e Initial load
duke
parents:
diff changeset
313 StateSplit* ss = ins->as_StateSplit();
a61af66fc99e Initial load
duke
parents:
diff changeset
314 if (ss != NULL) return ss->state();
a61af66fc99e Initial load
duke
parents:
diff changeset
315 return ins->lock_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318 void LIR_Assembler::process_debug_info(LIR_Op* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
319 Instruction* src = op->source();
a61af66fc99e Initial load
duke
parents:
diff changeset
320 if (src == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
321 int pc_offset = code_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
322 if (_pending_non_safepoint == src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
323 _pending_non_safepoint_offset = pc_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
324 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
326 ValueStack* vstack = debug_info(src);
a61af66fc99e Initial load
duke
parents:
diff changeset
327 if (vstack == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
328 if (_pending_non_safepoint != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // Got some old debug info. Get rid of it.
a61af66fc99e Initial load
duke
parents:
diff changeset
330 if (_pending_non_safepoint->bci() == src->bci() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
331 debug_info(_pending_non_safepoint) == vstack) {
a61af66fc99e Initial load
duke
parents:
diff changeset
332 _pending_non_safepoint_offset = pc_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
333 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
335 if (_pending_non_safepoint_offset < pc_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
336 record_non_safepoint_debug_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
338 _pending_non_safepoint = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
339 }
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // Remember the debug info.
a61af66fc99e Initial load
duke
parents:
diff changeset
341 if (pc_offset > compilation()->debug_info_recorder()->last_pc_offset()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
342 _pending_non_safepoint = src;
a61af66fc99e Initial load
duke
parents:
diff changeset
343 _pending_non_safepoint_offset = pc_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // Index caller states in s, where 0 is the oldest, 1 its callee, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // Return NULL if n is too large.
a61af66fc99e Initial load
duke
parents:
diff changeset
349 // Returns the caller_bci for the next-younger state, also.
a61af66fc99e Initial load
duke
parents:
diff changeset
350 static ValueStack* nth_oldest(ValueStack* s, int n, int& bci_result) {
a61af66fc99e Initial load
duke
parents:
diff changeset
351 ValueStack* t = s;
a61af66fc99e Initial load
duke
parents:
diff changeset
352 for (int i = 0; i < n; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 if (t == NULL) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 t = t->caller_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356 if (t == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
358 ValueStack* tc = t->caller_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
359 if (tc == NULL) return s;
a61af66fc99e Initial load
duke
parents:
diff changeset
360 t = tc;
a61af66fc99e Initial load
duke
parents:
diff changeset
361 bci_result = s->scope()->caller_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
362 s = s->caller_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
363 }
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 void LIR_Assembler::record_non_safepoint_debug_info() {
a61af66fc99e Initial load
duke
parents:
diff changeset
367 int pc_offset = _pending_non_safepoint_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 ValueStack* vstack = debug_info(_pending_non_safepoint);
a61af66fc99e Initial load
duke
parents:
diff changeset
369 int bci = _pending_non_safepoint->bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 DebugInformationRecorder* debug_info = compilation()->debug_info_recorder();
a61af66fc99e Initial load
duke
parents:
diff changeset
372 assert(debug_info->recording_non_safepoints(), "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 debug_info->add_non_safepoint(pc_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
375
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // Visit scopes from oldest to youngest.
a61af66fc99e Initial load
duke
parents:
diff changeset
377 for (int n = 0; ; n++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
378 int s_bci = bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
379 ValueStack* s = nth_oldest(vstack, n, s_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
380 if (s == NULL) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
381 IRScope* scope = s->scope();
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 380
diff changeset
382 //Always pass false for reexecute since these ScopeDescs are never used for deopt
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 380
diff changeset
383 debug_info->describe_scope(pc_offset, scope->method(), s_bci, false/*reexecute*/);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 debug_info->end_non_safepoint(pc_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 void LIR_Assembler::add_debug_info_for_null_check_here(CodeEmitInfo* cinfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
391 add_debug_info_for_null_check(code_offset(), cinfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
392 }
a61af66fc99e Initial load
duke
parents:
diff changeset
393
a61af66fc99e Initial load
duke
parents:
diff changeset
394 void LIR_Assembler::add_debug_info_for_null_check(int pc_offset, CodeEmitInfo* cinfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
395 ImplicitNullCheckStub* stub = new ImplicitNullCheckStub(pc_offset, cinfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
396 emit_code_stub(stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 void LIR_Assembler::add_debug_info_for_div0_here(CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 add_debug_info_for_div0(code_offset(), info);
a61af66fc99e Initial load
duke
parents:
diff changeset
401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403 void LIR_Assembler::add_debug_info_for_div0(int pc_offset, CodeEmitInfo* cinfo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
404 DivByZeroStub* stub = new DivByZeroStub(pc_offset, cinfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
405 emit_code_stub(stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 void LIR_Assembler::emit_rtcall(LIR_OpRTCall* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
409 rt_call(op->result_opr(), op->addr(), op->arguments(), op->tmp(), op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 void LIR_Assembler::emit_call(LIR_OpJavaCall* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
414 verify_oop_map(op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // must align calls sites, otherwise they can't be updated atomically on MP hardware
a61af66fc99e Initial load
duke
parents:
diff changeset
418 align_call(op->code());
a61af66fc99e Initial load
duke
parents:
diff changeset
419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // emit the static call stub stuff out of line
a61af66fc99e Initial load
duke
parents:
diff changeset
422 emit_static_call_stub();
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424 switch (op->code()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
425 case lir_static_call:
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 948
diff changeset
426 call(op, relocInfo::static_call_type);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
427 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
428 case lir_optvirtual_call:
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 948
diff changeset
429 case lir_dynamic_call:
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 948
diff changeset
430 call(op, relocInfo::opt_virtual_call_type);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
431 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
432 case lir_icvirtual_call:
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 948
diff changeset
433 ic_call(op);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
434 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
435 case lir_virtual_call:
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 948
diff changeset
436 vtable_call(op);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
437 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
438 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
439 }
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 948
diff changeset
440
1691
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1579
diff changeset
441 // JSR 292
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1579
diff changeset
442 // 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
443 if (op->is_method_handle_invoke()) {
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1579
diff changeset
444 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
445 }
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1579
diff changeset
446
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
447 #if defined(X86) && defined(TIERED)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // C2 leave fpu stack dirty clean it
a61af66fc99e Initial load
duke
parents:
diff changeset
449 if (UseSSE < 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
450 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
451 for ( i = 1; i <= 7 ; i++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 ffree(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454 if (!op->result_opr()->is_float_kind()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
455 ffree(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
457 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
458 #endif // X86 && TIERED
0
a61af66fc99e Initial load
duke
parents:
diff changeset
459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462 void LIR_Assembler::emit_opLabel(LIR_OpLabel* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
463 _masm->bind (*(op->label()));
a61af66fc99e Initial load
duke
parents:
diff changeset
464 }
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467 void LIR_Assembler::emit_op1(LIR_Op1* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
468 switch (op->code()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
469 case lir_move:
a61af66fc99e Initial load
duke
parents:
diff changeset
470 if (op->move_kind() == lir_move_volatile) {
a61af66fc99e Initial load
duke
parents:
diff changeset
471 assert(op->patch_code() == lir_patch_none, "can't patch volatiles");
a61af66fc99e Initial load
duke
parents:
diff changeset
472 volatile_move_op(op->in_opr(), op->result_opr(), op->type(), op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
473 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
474 move_op(op->in_opr(), op->result_opr(), op->type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
475 op->patch_code(), op->info(), op->pop_fpu_stack(), op->move_kind() == lir_move_unaligned);
a61af66fc99e Initial load
duke
parents:
diff changeset
476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
477 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479 case lir_prefetchr:
a61af66fc99e Initial load
duke
parents:
diff changeset
480 prefetchr(op->in_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
481 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 case lir_prefetchw:
a61af66fc99e Initial load
duke
parents:
diff changeset
484 prefetchw(op->in_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
485 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
486
a61af66fc99e Initial load
duke
parents:
diff changeset
487 case lir_roundfp: {
a61af66fc99e Initial load
duke
parents:
diff changeset
488 LIR_OpRoundFP* round_op = op->as_OpRoundFP();
a61af66fc99e Initial load
duke
parents:
diff changeset
489 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
490 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
491 }
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493 case lir_return:
a61af66fc99e Initial load
duke
parents:
diff changeset
494 return_op(op->in_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
495 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497 case lir_safepoint:
a61af66fc99e Initial load
duke
parents:
diff changeset
498 if (compilation()->debug_info_recorder()->last_pc_offset() == code_offset()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
499 _masm->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
501 safepoint_poll(op->in_opr(), op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
502 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504 case lir_fxch:
a61af66fc99e Initial load
duke
parents:
diff changeset
505 fxch(op->in_opr()->as_jint());
a61af66fc99e Initial load
duke
parents:
diff changeset
506 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 case lir_fld:
a61af66fc99e Initial load
duke
parents:
diff changeset
509 fld(op->in_opr()->as_jint());
a61af66fc99e Initial load
duke
parents:
diff changeset
510 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 case lir_ffree:
a61af66fc99e Initial load
duke
parents:
diff changeset
513 ffree(op->in_opr()->as_jint());
a61af66fc99e Initial load
duke
parents:
diff changeset
514 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 case lir_branch:
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 case lir_push:
a61af66fc99e Initial load
duke
parents:
diff changeset
520 push(op->in_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
521 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
522
a61af66fc99e Initial load
duke
parents:
diff changeset
523 case lir_pop:
a61af66fc99e Initial load
duke
parents:
diff changeset
524 pop(op->in_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
525 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 case lir_neg:
a61af66fc99e Initial load
duke
parents:
diff changeset
528 negate(op->in_opr(), op->result_opr());
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_leal:
a61af66fc99e Initial load
duke
parents:
diff changeset
532 leal(op->in_opr(), op->result_opr());
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_null_check:
a61af66fc99e Initial load
duke
parents:
diff changeset
536 if (GenerateCompilerNullChecks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
537 add_debug_info_for_null_check_here(op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
538
a61af66fc99e Initial load
duke
parents:
diff changeset
539 if (op->in_opr()->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
540 _masm->null_check(op->in_opr()->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
541 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
542 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
543 }
a61af66fc99e Initial load
duke
parents:
diff changeset
544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
545 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
546
a61af66fc99e Initial load
duke
parents:
diff changeset
547 case lir_monaddr:
a61af66fc99e Initial load
duke
parents:
diff changeset
548 monitor_address(op->in_opr()->as_constant_ptr()->as_jint(), op->result_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
549 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
550
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1301
diff changeset
551 case lir_unwind:
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1301
diff changeset
552 unwind_op(op->in_opr());
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1301
diff changeset
553 break;
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1301
diff changeset
554
0
a61af66fc99e Initial load
duke
parents:
diff changeset
555 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
556 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
557 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
558 }
a61af66fc99e Initial load
duke
parents:
diff changeset
559 }
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561
a61af66fc99e Initial load
duke
parents:
diff changeset
562 void LIR_Assembler::emit_op0(LIR_Op0* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
563 switch (op->code()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
564 case lir_word_align: {
a61af66fc99e Initial load
duke
parents:
diff changeset
565 while (code_offset() % BytesPerWord != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
566 _masm->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
568 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 case lir_nop:
a61af66fc99e Initial load
duke
parents:
diff changeset
572 assert(op->info() == NULL, "not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
573 _masm->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
574 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
575
a61af66fc99e Initial load
duke
parents:
diff changeset
576 case lir_label:
a61af66fc99e Initial load
duke
parents:
diff changeset
577 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
578 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
579
a61af66fc99e Initial load
duke
parents:
diff changeset
580 case lir_build_frame:
a61af66fc99e Initial load
duke
parents:
diff changeset
581 build_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
582 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
583
a61af66fc99e Initial load
duke
parents:
diff changeset
584 case lir_std_entry:
a61af66fc99e Initial load
duke
parents:
diff changeset
585 // init offsets
a61af66fc99e Initial load
duke
parents:
diff changeset
586 offsets()->set_value(CodeOffsets::OSR_Entry, _masm->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
587 _masm->align(CodeEntryAlignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
588 if (needs_icache(compilation()->method())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
589 check_icache();
a61af66fc99e Initial load
duke
parents:
diff changeset
590 }
a61af66fc99e Initial load
duke
parents:
diff changeset
591 offsets()->set_value(CodeOffsets::Verified_Entry, _masm->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
592 _masm->verified_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
593 build_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
594 offsets()->set_value(CodeOffsets::Frame_Complete, _masm->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
595 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 case lir_osr_entry:
a61af66fc99e Initial load
duke
parents:
diff changeset
598 offsets()->set_value(CodeOffsets::OSR_Entry, _masm->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
599 osr_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
600 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
601
a61af66fc99e Initial load
duke
parents:
diff changeset
602 case lir_24bit_FPU:
a61af66fc99e Initial load
duke
parents:
diff changeset
603 set_24bit_FPU();
a61af66fc99e Initial load
duke
parents:
diff changeset
604 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
605
a61af66fc99e Initial load
duke
parents:
diff changeset
606 case lir_reset_FPU:
a61af66fc99e Initial load
duke
parents:
diff changeset
607 reset_FPU();
a61af66fc99e Initial load
duke
parents:
diff changeset
608 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610 case lir_breakpoint:
a61af66fc99e Initial load
duke
parents:
diff changeset
611 breakpoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
612 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
613
a61af66fc99e Initial load
duke
parents:
diff changeset
614 case lir_fpop_raw:
a61af66fc99e Initial load
duke
parents:
diff changeset
615 fpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
616 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
617
a61af66fc99e Initial load
duke
parents:
diff changeset
618 case lir_membar:
a61af66fc99e Initial load
duke
parents:
diff changeset
619 membar();
a61af66fc99e Initial load
duke
parents:
diff changeset
620 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622 case lir_membar_acquire:
a61af66fc99e Initial load
duke
parents:
diff changeset
623 membar_acquire();
a61af66fc99e Initial load
duke
parents:
diff changeset
624 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
625
a61af66fc99e Initial load
duke
parents:
diff changeset
626 case lir_membar_release:
a61af66fc99e Initial load
duke
parents:
diff changeset
627 membar_release();
a61af66fc99e Initial load
duke
parents:
diff changeset
628 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
629
a61af66fc99e Initial load
duke
parents:
diff changeset
630 case lir_get_thread:
a61af66fc99e Initial load
duke
parents:
diff changeset
631 get_thread(op->result_opr());
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 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
635 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
636 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
639
a61af66fc99e Initial load
duke
parents:
diff changeset
640
a61af66fc99e Initial load
duke
parents:
diff changeset
641 void LIR_Assembler::emit_op2(LIR_Op2* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
642 switch (op->code()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
643 case lir_cmp:
a61af66fc99e Initial load
duke
parents:
diff changeset
644 if (op->info() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
645 assert(op->in_opr1()->is_address() || op->in_opr2()->is_address(),
a61af66fc99e Initial load
duke
parents:
diff changeset
646 "shouldn't be codeemitinfo for non-address operands");
a61af66fc99e Initial load
duke
parents:
diff changeset
647 add_debug_info_for_null_check_here(op->info()); // exception possible
a61af66fc99e Initial load
duke
parents:
diff changeset
648 }
a61af66fc99e Initial load
duke
parents:
diff changeset
649 comp_op(op->condition(), op->in_opr1(), op->in_opr2(), op);
a61af66fc99e Initial load
duke
parents:
diff changeset
650 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
651
a61af66fc99e Initial load
duke
parents:
diff changeset
652 case lir_cmp_l2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
653 case lir_cmp_fd2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
654 case lir_ucmp_fd2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
655 comp_fl2i(op->code(), op->in_opr1(), op->in_opr2(), op->result_opr(), op);
a61af66fc99e Initial load
duke
parents:
diff changeset
656 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
657
a61af66fc99e Initial load
duke
parents:
diff changeset
658 case lir_cmove:
a61af66fc99e Initial load
duke
parents:
diff changeset
659 cmove(op->condition(), op->in_opr1(), op->in_opr2(), op->result_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
660 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
661
a61af66fc99e Initial load
duke
parents:
diff changeset
662 case lir_shl:
a61af66fc99e Initial load
duke
parents:
diff changeset
663 case lir_shr:
a61af66fc99e Initial load
duke
parents:
diff changeset
664 case lir_ushr:
a61af66fc99e Initial load
duke
parents:
diff changeset
665 if (op->in_opr2()->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
666 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
667 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
668 shift_op(op->code(), op->in_opr1(), op->in_opr2(), op->result_opr(), op->tmp_opr());
a61af66fc99e Initial load
duke
parents:
diff changeset
669 }
a61af66fc99e Initial load
duke
parents:
diff changeset
670 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
671
a61af66fc99e Initial load
duke
parents:
diff changeset
672 case lir_add:
a61af66fc99e Initial load
duke
parents:
diff changeset
673 case lir_sub:
a61af66fc99e Initial load
duke
parents:
diff changeset
674 case lir_mul:
a61af66fc99e Initial load
duke
parents:
diff changeset
675 case lir_mul_strictfp:
a61af66fc99e Initial load
duke
parents:
diff changeset
676 case lir_div:
a61af66fc99e Initial load
duke
parents:
diff changeset
677 case lir_div_strictfp:
a61af66fc99e Initial load
duke
parents:
diff changeset
678 case lir_rem:
a61af66fc99e Initial load
duke
parents:
diff changeset
679 assert(op->fpu_pop_count() < 2, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
680 arith_op(
a61af66fc99e Initial load
duke
parents:
diff changeset
681 op->code(),
a61af66fc99e Initial load
duke
parents:
diff changeset
682 op->in_opr1(),
a61af66fc99e Initial load
duke
parents:
diff changeset
683 op->in_opr2(),
a61af66fc99e Initial load
duke
parents:
diff changeset
684 op->result_opr(),
a61af66fc99e Initial load
duke
parents:
diff changeset
685 op->info(),
a61af66fc99e Initial load
duke
parents:
diff changeset
686 op->fpu_pop_count() == 1);
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_abs:
a61af66fc99e Initial load
duke
parents:
diff changeset
690 case lir_sqrt:
a61af66fc99e Initial load
duke
parents:
diff changeset
691 case lir_sin:
a61af66fc99e Initial load
duke
parents:
diff changeset
692 case lir_tan:
a61af66fc99e Initial load
duke
parents:
diff changeset
693 case lir_cos:
a61af66fc99e Initial load
duke
parents:
diff changeset
694 case lir_log:
a61af66fc99e Initial load
duke
parents:
diff changeset
695 case lir_log10:
a61af66fc99e Initial load
duke
parents:
diff changeset
696 intrinsic_op(op->code(), op->in_opr1(), op->in_opr2(), op->result_opr(), op);
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_logic_and:
a61af66fc99e Initial load
duke
parents:
diff changeset
700 case lir_logic_or:
a61af66fc99e Initial load
duke
parents:
diff changeset
701 case lir_logic_xor:
a61af66fc99e Initial load
duke
parents:
diff changeset
702 logic_op(
a61af66fc99e Initial load
duke
parents:
diff changeset
703 op->code(),
a61af66fc99e Initial load
duke
parents:
diff changeset
704 op->in_opr1(),
a61af66fc99e Initial load
duke
parents:
diff changeset
705 op->in_opr2(),
a61af66fc99e Initial load
duke
parents:
diff changeset
706 op->result_opr());
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_throw:
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1301
diff changeset
710 throw_op(op->in_opr1(), op->in_opr2(), op->info());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
711 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
712
a61af66fc99e Initial load
duke
parents:
diff changeset
713 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
714 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
715 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
716 }
a61af66fc99e Initial load
duke
parents:
diff changeset
717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719
a61af66fc99e Initial load
duke
parents:
diff changeset
720 void LIR_Assembler::build_frame() {
a61af66fc99e Initial load
duke
parents:
diff changeset
721 _masm->build_frame(initial_frame_size_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
722 }
a61af66fc99e Initial load
duke
parents:
diff changeset
723
a61af66fc99e Initial load
duke
parents:
diff changeset
724
a61af66fc99e Initial load
duke
parents:
diff changeset
725 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
726 assert((src->is_single_fpu() && dest->is_single_stack()) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
727 (src->is_double_fpu() && dest->is_double_stack()),
a61af66fc99e Initial load
duke
parents:
diff changeset
728 "round_fp: rounds register -> stack location");
a61af66fc99e Initial load
duke
parents:
diff changeset
729
a61af66fc99e Initial load
duke
parents:
diff changeset
730 reg2stack (src, dest, src->type(), pop_fpu_stack);
a61af66fc99e Initial load
duke
parents:
diff changeset
731 }
a61af66fc99e Initial load
duke
parents:
diff changeset
732
a61af66fc99e Initial load
duke
parents:
diff changeset
733
a61af66fc99e Initial load
duke
parents:
diff changeset
734 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) {
a61af66fc99e Initial load
duke
parents:
diff changeset
735 if (src->is_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
736 if (dest->is_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
737 assert(patch_code == lir_patch_none && info == NULL, "no patching and info allowed here");
a61af66fc99e Initial load
duke
parents:
diff changeset
738 reg2reg(src, dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
739 } else if (dest->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
740 assert(patch_code == lir_patch_none && info == NULL, "no patching and info allowed here");
a61af66fc99e Initial load
duke
parents:
diff changeset
741 reg2stack(src, dest, type, pop_fpu_stack);
a61af66fc99e Initial load
duke
parents:
diff changeset
742 } else if (dest->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
743 reg2mem(src, dest, type, patch_code, info, pop_fpu_stack, unaligned);
a61af66fc99e Initial load
duke
parents:
diff changeset
744 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
745 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
746 }
a61af66fc99e Initial load
duke
parents:
diff changeset
747
a61af66fc99e Initial load
duke
parents:
diff changeset
748 } else if (src->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
749 assert(patch_code == lir_patch_none && info == NULL, "no patching and info allowed here");
a61af66fc99e Initial load
duke
parents:
diff changeset
750 if (dest->is_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
751 stack2reg(src, dest, type);
a61af66fc99e Initial load
duke
parents:
diff changeset
752 } else if (dest->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
753 stack2stack(src, dest, type);
a61af66fc99e Initial load
duke
parents:
diff changeset
754 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
755 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
756 }
a61af66fc99e Initial load
duke
parents:
diff changeset
757
a61af66fc99e Initial load
duke
parents:
diff changeset
758 } else if (src->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
759 if (dest->is_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
760 const2reg(src, dest, patch_code, info); // patching is possible
a61af66fc99e Initial load
duke
parents:
diff changeset
761 } else if (dest->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
762 assert(patch_code == lir_patch_none && info == NULL, "no patching and info allowed here");
a61af66fc99e Initial load
duke
parents:
diff changeset
763 const2stack(src, dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
764 } else if (dest->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
765 assert(patch_code == lir_patch_none, "no patching allowed here");
a61af66fc99e Initial load
duke
parents:
diff changeset
766 const2mem(src, dest, type, info);
a61af66fc99e Initial load
duke
parents:
diff changeset
767 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
768 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
769 }
a61af66fc99e Initial load
duke
parents:
diff changeset
770
a61af66fc99e Initial load
duke
parents:
diff changeset
771 } else if (src->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
772 mem2reg(src, dest, type, patch_code, info, unaligned);
a61af66fc99e Initial load
duke
parents:
diff changeset
773
a61af66fc99e Initial load
duke
parents:
diff changeset
774 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
775 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
776 }
a61af66fc99e Initial load
duke
parents:
diff changeset
777 }
a61af66fc99e Initial load
duke
parents:
diff changeset
778
a61af66fc99e Initial load
duke
parents:
diff changeset
779
a61af66fc99e Initial load
duke
parents:
diff changeset
780 void LIR_Assembler::verify_oop_map(CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
781 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
782 if (VerifyOopMaps || VerifyOops) {
a61af66fc99e Initial load
duke
parents:
diff changeset
783 bool v = VerifyOops;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 VerifyOops = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
785 OopMapStream s(info->oop_map());
a61af66fc99e Initial load
duke
parents:
diff changeset
786 while (!s.is_done()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
787 OopMapValue v = s.current();
a61af66fc99e Initial load
duke
parents:
diff changeset
788 if (v.is_oop()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
789 VMReg r = v.reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
790 if (!r->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
791 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
792 st.print("bad oop %s at %d", r->as_Register()->name(), _masm->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
793 #ifdef SPARC
a61af66fc99e Initial load
duke
parents:
diff changeset
794 _masm->_verify_oop(r->as_Register(), strdup(st.as_string()), __FILE__, __LINE__);
a61af66fc99e Initial load
duke
parents:
diff changeset
795 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
796 _masm->verify_oop(r->as_Register());
a61af66fc99e Initial load
duke
parents:
diff changeset
797 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
798 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
799 _masm->verify_stack_oop(r->reg2stack() * VMRegImpl::stack_slot_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
801 }
a61af66fc99e Initial load
duke
parents:
diff changeset
802 s.next();
a61af66fc99e Initial load
duke
parents:
diff changeset
803 }
a61af66fc99e Initial load
duke
parents:
diff changeset
804 VerifyOops = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
805 }
a61af66fc99e Initial load
duke
parents:
diff changeset
806 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
807 }