annotate src/cpu/x86/vm/assembler_x86.cpp @ 2007:5ddfcf4b079e

7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer Summary: C1 with profiling doesn't check whether the MDO has been really allocated, which can silently fail if the perm gen is full. The solution is to check if the allocation failed and bailout out of inlining or compilation. Reviewed-by: kvn, never
author iveresov
date Thu, 02 Dec 2010 17:21:12 -0800
parents f95d63e2154a
children 0fc262af204f 2f644f85485d
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: 1513
diff changeset
2 * Copyright (c) 1997, 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: 1513
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1513
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: 1513
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: 1920
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
26 #include "assembler_x86.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
27 #include "gc_interface/collectedHeap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
28 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
29 #include "memory/cardTableModRefBS.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
30 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
31 #include "prims/methodHandles.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
32 #include "runtime/biasedLocking.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
33 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
34 #include "runtime/objectMonitor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
35 #include "runtime/os.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
36 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
37 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
38 #ifndef SERIALGC
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
39 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
40 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
41 #include "gc_implementation/g1/heapRegion.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
42 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // Implementation of AddressLiteral
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 AddressLiteral::AddressLiteral(address target, relocInfo::relocType rtype) {
a61af66fc99e Initial load
duke
parents:
diff changeset
47 _is_lval = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 _target = target;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 switch (rtype) {
a61af66fc99e Initial load
duke
parents:
diff changeset
50 case relocInfo::oop_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // Oops are a special case. Normally they would be their own section
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // but in cases like icBuffer they are literals in the code stream that
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // we don't have a section for. We use none so that we get a literal address
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // which is always patchable.
a61af66fc99e Initial load
duke
parents:
diff changeset
55 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 case relocInfo::external_word_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
57 _rspec = external_word_Relocation::spec(target);
a61af66fc99e Initial load
duke
parents:
diff changeset
58 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 case relocInfo::internal_word_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
60 _rspec = internal_word_Relocation::spec(target);
a61af66fc99e Initial load
duke
parents:
diff changeset
61 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 case relocInfo::opt_virtual_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
63 _rspec = opt_virtual_call_Relocation::spec();
a61af66fc99e Initial load
duke
parents:
diff changeset
64 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 case relocInfo::static_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
66 _rspec = static_call_Relocation::spec();
a61af66fc99e Initial load
duke
parents:
diff changeset
67 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 case relocInfo::runtime_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
69 _rspec = runtime_call_Relocation::spec();
a61af66fc99e Initial load
duke
parents:
diff changeset
70 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 case relocInfo::poll_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
72 case relocInfo::poll_return_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
73 _rspec = Relocation::spec_simple(rtype);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 case relocInfo::none:
a61af66fc99e Initial load
duke
parents:
diff changeset
76 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
77 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
78 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
79 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
80 }
a61af66fc99e Initial load
duke
parents:
diff changeset
81 }
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Implementation of Address
a61af66fc99e Initial load
duke
parents:
diff changeset
84
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
85 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
86
0
a61af66fc99e Initial load
duke
parents:
diff changeset
87 Address Address::make_array(ArrayAddress adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // Not implementable on 64bit machines
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // Should have been handled higher up the call chain.
a61af66fc99e Initial load
duke
parents:
diff changeset
90 ShouldNotReachHere();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
91 return Address();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
92 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
93
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
94 // exceedingly dangerous constructor
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
95 Address::Address(int disp, address loc, relocInfo::relocType rtype) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
96 _base = noreg;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
97 _index = noreg;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
98 _scale = no_scale;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
99 _disp = disp;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
100 switch (rtype) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
101 case relocInfo::external_word_type:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
102 _rspec = external_word_Relocation::spec(loc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
103 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
104 case relocInfo::internal_word_type:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
105 _rspec = internal_word_Relocation::spec(loc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
106 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
107 case relocInfo::runtime_call_type:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
108 // HMM
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
109 _rspec = runtime_call_Relocation::spec();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
110 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
111 case relocInfo::poll_type:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
112 case relocInfo::poll_return_type:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
113 _rspec = Relocation::spec_simple(rtype);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
114 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
115 case relocInfo::none:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
116 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
117 default:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
118 ShouldNotReachHere();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
119 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
120 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
121 #else // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
122
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
123 Address Address::make_array(ArrayAddress adr) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
124 AddressLiteral base = adr.base();
a61af66fc99e Initial load
duke
parents:
diff changeset
125 Address index = adr.index();
a61af66fc99e Initial load
duke
parents:
diff changeset
126 assert(index._disp == 0, "must not have disp"); // maybe it can?
a61af66fc99e Initial load
duke
parents:
diff changeset
127 Address array(index._base, index._index, index._scale, (intptr_t) base.target());
a61af66fc99e Initial load
duke
parents:
diff changeset
128 array._rspec = base._rspec;
a61af66fc99e Initial load
duke
parents:
diff changeset
129 return array;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
130 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // exceedingly dangerous constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
133 Address::Address(address loc, RelocationHolder spec) {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 _base = noreg;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 _index = noreg;
a61af66fc99e Initial load
duke
parents:
diff changeset
136 _scale = no_scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 _disp = (intptr_t) loc;
a61af66fc99e Initial load
duke
parents:
diff changeset
138 _rspec = spec;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
140
0
a61af66fc99e Initial load
duke
parents:
diff changeset
141 #endif // _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
142
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
143
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
144
0
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // Convert the raw encoding form into the form expected by the constructor for
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Address. An index of 4 (rsp) corresponds to having no index, so convert
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // that to noreg for the Address constructor.
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
148 Address Address::make_raw(int base, int index, int scale, int disp, bool disp_is_oop) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
149 RelocationHolder rspec;
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
150 if (disp_is_oop) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
151 rspec = Relocation::spec_simple(relocInfo::oop_type);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
152 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
153 bool valid_index = index != rsp->encoding();
a61af66fc99e Initial load
duke
parents:
diff changeset
154 if (valid_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 Address madr(as_Register(base), as_Register(index), (Address::ScaleFactor)scale, in_ByteSize(disp));
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
156 madr._rspec = rspec;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
157 return madr;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
159 Address madr(as_Register(base), noreg, Address::no_scale, in_ByteSize(disp));
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
160 madr._rspec = rspec;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
161 return madr;
a61af66fc99e Initial load
duke
parents:
diff changeset
162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // Implementation of Assembler
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 int AbstractAssembler::code_fill_byte() {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 return (u_char)'\xF4'; // hlt
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // make this go away someday
a61af66fc99e Initial load
duke
parents:
diff changeset
172 void Assembler::emit_data(jint data, relocInfo::relocType rtype, int format) {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 if (rtype == relocInfo::none)
a61af66fc99e Initial load
duke
parents:
diff changeset
174 emit_long(data);
a61af66fc99e Initial load
duke
parents:
diff changeset
175 else emit_data(data, Relocation::spec_simple(rtype), format);
a61af66fc99e Initial load
duke
parents:
diff changeset
176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 void Assembler::emit_data(jint data, RelocationHolder const& rspec, int format) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
179 assert(imm_operand == 0, "default format must be immediate in this file");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
180 assert(inst_mark() != NULL, "must be inside InstructionMark");
a61af66fc99e Initial load
duke
parents:
diff changeset
181 if (rspec.type() != relocInfo::none) {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
183 check_relocation(rspec, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
184 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // Do not use AbstractAssembler::relocate, which is not intended for
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // embedded words. Instead, relocate to the enclosing instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // hack. call32 is too wide for mask so use disp32
a61af66fc99e Initial load
duke
parents:
diff changeset
189 if (format == call32_operand)
a61af66fc99e Initial load
duke
parents:
diff changeset
190 code_section()->relocate(inst_mark(), rspec, disp32_operand);
a61af66fc99e Initial load
duke
parents:
diff changeset
191 else
a61af66fc99e Initial load
duke
parents:
diff changeset
192 code_section()->relocate(inst_mark(), rspec, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
194 emit_long(data);
a61af66fc99e Initial load
duke
parents:
diff changeset
195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
196
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
197 static int encode(Register r) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
198 int enc = r->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
199 if (enc >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
200 enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
201 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
202 return enc;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
203 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
204
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
205 static int encode(XMMRegister r) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
206 int enc = r->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
207 if (enc >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
208 enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
209 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
210 return enc;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
211 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 void Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 assert(dst->has_byte_register(), "must have byte register");
a61af66fc99e Initial load
duke
parents:
diff changeset
215 assert(isByte(op1) && isByte(op2), "wrong opcode");
a61af66fc99e Initial load
duke
parents:
diff changeset
216 assert(isByte(imm8), "not a byte");
a61af66fc99e Initial load
duke
parents:
diff changeset
217 assert((op1 & 0x01) == 0, "should be 8bit operation");
a61af66fc99e Initial load
duke
parents:
diff changeset
218 emit_byte(op1);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
219 emit_byte(op2 | encode(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
220 emit_byte(imm8);
a61af66fc99e Initial load
duke
parents:
diff changeset
221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
224 void Assembler::emit_arith(int op1, int op2, Register dst, int32_t imm32) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
225 assert(isByte(op1) && isByte(op2), "wrong opcode");
a61af66fc99e Initial load
duke
parents:
diff changeset
226 assert((op1 & 0x01) == 1, "should be 32bit operation");
a61af66fc99e Initial load
duke
parents:
diff changeset
227 assert((op1 & 0x02) == 0, "sign-extension bit should not be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
228 if (is8bit(imm32)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
229 emit_byte(op1 | 0x02); // set sign bit
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
230 emit_byte(op2 | encode(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
231 emit_byte(imm32 & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
232 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
233 emit_byte(op1);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
234 emit_byte(op2 | encode(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
235 emit_long(imm32);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // immediate-to-memory forms
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
240 void Assembler::emit_arith_operand(int op1, Register rm, Address adr, int32_t imm32) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
241 assert((op1 & 0x01) == 1, "should be 32bit operation");
a61af66fc99e Initial load
duke
parents:
diff changeset
242 assert((op1 & 0x02) == 0, "sign-extension bit should not be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
243 if (is8bit(imm32)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 emit_byte(op1 | 0x02); // set sign bit
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
245 emit_operand(rm, adr, 1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
246 emit_byte(imm32 & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
247 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 emit_byte(op1);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
249 emit_operand(rm, adr, 4);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
250 emit_long(imm32);
a61af66fc99e Initial load
duke
parents:
diff changeset
251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 void Assembler::emit_arith(int op1, int op2, Register dst, jobject obj) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
255 LP64_ONLY(ShouldNotReachHere());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
256 assert(isByte(op1) && isByte(op2), "wrong opcode");
a61af66fc99e Initial load
duke
parents:
diff changeset
257 assert((op1 & 0x01) == 1, "should be 32bit operation");
a61af66fc99e Initial load
duke
parents:
diff changeset
258 assert((op1 & 0x02) == 0, "sign-extension bit should not be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
259 InstructionMark im(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
260 emit_byte(op1);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
261 emit_byte(op2 | encode(dst));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
262 emit_data((intptr_t)obj, relocInfo::oop_type, 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 void Assembler::emit_arith(int op1, int op2, Register dst, Register src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 assert(isByte(op1) && isByte(op2), "wrong opcode");
a61af66fc99e Initial load
duke
parents:
diff changeset
268 emit_byte(op1);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
269 emit_byte(op2 | encode(dst) << 3 | encode(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
270 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
271
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
272
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
273 void Assembler::emit_operand(Register reg, Register base, Register index,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
274 Address::ScaleFactor scale, int disp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
275 RelocationHolder const& rspec,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
276 int rip_relative_correction) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
277 relocInfo::relocType rtype = (relocInfo::relocType) rspec.type();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
278
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
279 // Encode the registers as needed in the fields they are used in
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
280
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
281 int regenc = encode(reg) << 3;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
282 int indexenc = index->is_valid() ? encode(index) << 3 : 0;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
283 int baseenc = base->is_valid() ? encode(base) : 0;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
284
0
a61af66fc99e Initial load
duke
parents:
diff changeset
285 if (base->is_valid()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
286 if (index->is_valid()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
287 assert(scale != Address::no_scale, "inconsistent address");
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // [base + index*scale + disp]
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
289 if (disp == 0 && rtype == relocInfo::none &&
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
290 base != rbp LP64_ONLY(&& base != r13)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // [base + index*scale]
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // [00 reg 100][ss index base]
a61af66fc99e Initial load
duke
parents:
diff changeset
293 assert(index != rsp, "illegal addressing mode");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
294 emit_byte(0x04 | regenc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
295 emit_byte(scale << 6 | indexenc | baseenc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
296 } else if (is8bit(disp) && rtype == relocInfo::none) {
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // [base + index*scale + imm8]
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // [01 reg 100][ss index base] imm8
a61af66fc99e Initial load
duke
parents:
diff changeset
299 assert(index != rsp, "illegal addressing mode");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
300 emit_byte(0x44 | regenc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
301 emit_byte(scale << 6 | indexenc | baseenc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
302 emit_byte(disp & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
303 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
304 // [base + index*scale + disp32]
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
305 // [10 reg 100][ss index base] disp32
0
a61af66fc99e Initial load
duke
parents:
diff changeset
306 assert(index != rsp, "illegal addressing mode");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
307 emit_byte(0x84 | regenc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
308 emit_byte(scale << 6 | indexenc | baseenc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
309 emit_data(disp, rspec, disp32_operand);
a61af66fc99e Initial load
duke
parents:
diff changeset
310 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
311 } else if (base == rsp LP64_ONLY(|| base == r12)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
312 // [rsp + disp]
0
a61af66fc99e Initial load
duke
parents:
diff changeset
313 if (disp == 0 && rtype == relocInfo::none) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
314 // [rsp]
0
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // [00 reg 100][00 100 100]
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
316 emit_byte(0x04 | regenc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
317 emit_byte(0x24);
a61af66fc99e Initial load
duke
parents:
diff changeset
318 } else if (is8bit(disp) && rtype == relocInfo::none) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
319 // [rsp + imm8]
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
320 // [01 reg 100][00 100 100] disp8
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
321 emit_byte(0x44 | regenc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
322 emit_byte(0x24);
a61af66fc99e Initial load
duke
parents:
diff changeset
323 emit_byte(disp & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
324 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
325 // [rsp + imm32]
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
326 // [10 reg 100][00 100 100] disp32
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
327 emit_byte(0x84 | regenc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
328 emit_byte(0x24);
a61af66fc99e Initial load
duke
parents:
diff changeset
329 emit_data(disp, rspec, disp32_operand);
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // [base + disp]
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
333 assert(base != rsp LP64_ONLY(&& base != r12), "illegal addressing mode");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
334 if (disp == 0 && rtype == relocInfo::none &&
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
335 base != rbp LP64_ONLY(&& base != r13)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // [base]
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // [00 reg base]
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
338 emit_byte(0x00 | regenc | baseenc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
339 } else if (is8bit(disp) && rtype == relocInfo::none) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
340 // [base + disp8]
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
341 // [01 reg base] disp8
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
342 emit_byte(0x40 | regenc | baseenc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
343 emit_byte(disp & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
344 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
345 // [base + disp32]
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
346 // [10 reg base] disp32
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
347 emit_byte(0x80 | regenc | baseenc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
348 emit_data(disp, rspec, disp32_operand);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
350 }
a61af66fc99e Initial load
duke
parents:
diff changeset
351 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
352 if (index->is_valid()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 assert(scale != Address::no_scale, "inconsistent address");
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // [index*scale + disp]
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
355 // [00 reg 100][ss index 101] disp32
0
a61af66fc99e Initial load
duke
parents:
diff changeset
356 assert(index != rsp, "illegal addressing mode");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
357 emit_byte(0x04 | regenc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
358 emit_byte(scale << 6 | indexenc | 0x05);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
359 emit_data(disp, rspec, disp32_operand);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
360 } else if (rtype != relocInfo::none ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
361 // [disp] (64bit) RIP-RELATIVE (32bit) abs
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
362 // [00 000 101] disp32
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
363
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
364 emit_byte(0x05 | regenc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
365 // Note that the RIP-rel. correction applies to the generated
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
366 // disp field, but _not_ to the target address in the rspec.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
367
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
368 // disp was created by converting the target address minus the pc
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
369 // at the start of the instruction. That needs more correction here.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
370 // intptr_t disp = target - next_ip;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
371 assert(inst_mark() != NULL, "must be inside InstructionMark");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
372 address next_ip = pc() + sizeof(int32_t) + rip_relative_correction;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
373 int64_t adjusted = disp;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
374 // Do rip-rel adjustment for 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
375 LP64_ONLY(adjusted -= (next_ip - inst_mark()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
376 assert(is_simm32(adjusted),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
377 "must be 32bit offset (RIP relative address)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
378 emit_data((int32_t) adjusted, rspec, disp32_operand);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
379
0
a61af66fc99e Initial load
duke
parents:
diff changeset
380 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
381 // 32bit never did this, did everything as the rip-rel/disp code above
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
382 // [disp] ABSOLUTE
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
383 // [00 reg 100][00 100 101] disp32
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
384 emit_byte(0x04 | regenc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
385 emit_byte(0x25);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
386 emit_data(disp, rspec, disp32_operand);
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
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
391 void Assembler::emit_operand(XMMRegister reg, Register base, Register index,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
392 Address::ScaleFactor scale, int disp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
393 RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
394 emit_operand((Register)reg, base, index, scale, disp, rspec);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
395 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
396
0
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // Secret local extension to Assembler::WhichOperand:
a61af66fc99e Initial load
duke
parents:
diff changeset
398 #define end_pc_operand (_WhichOperand_limit)
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 address Assembler::locate_operand(address inst, WhichOperand which) {
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // Decode the given instruction, and return the address of
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // an embedded 32-bit operand word.
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // If "which" is disp32_operand, selects the displacement portion
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // of an effective address specifier.
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
406 // If "which" is imm64_operand, selects the trailing immediate constant.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
407 // If "which" is call32_operand, selects the displacement of a call or jump.
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // Caller is responsible for ensuring that there is such an operand,
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
409 // and that it is 32/64 bits wide.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // If "which" is end_pc_operand, find the end of the instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 address ip = inst;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
414 bool is_64bit = false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
415
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
416 debug_only(bool has_disp32 = false);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
417 int tail_size = 0; // other random bytes (#32, #16, etc.) at end of insn
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
418
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
419 again_after_prefix:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
420 switch (0xFF & *ip++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // These convenience macros generate groups of "case" labels for the switch.
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
423 #define REP4(x) (x)+0: case (x)+1: case (x)+2: case (x)+3
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
424 #define REP8(x) (x)+0: case (x)+1: case (x)+2: case (x)+3: \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
425 case (x)+4: case (x)+5: case (x)+6: case (x)+7
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
426 #define REP16(x) REP8((x)+0): \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
427 case REP8((x)+8)
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429 case CS_segment:
a61af66fc99e Initial load
duke
parents:
diff changeset
430 case SS_segment:
a61af66fc99e Initial load
duke
parents:
diff changeset
431 case DS_segment:
a61af66fc99e Initial load
duke
parents:
diff changeset
432 case ES_segment:
a61af66fc99e Initial load
duke
parents:
diff changeset
433 case FS_segment:
a61af66fc99e Initial load
duke
parents:
diff changeset
434 case GS_segment:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
435 // Seems dubious
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
436 LP64_ONLY(assert(false, "shouldn't have that prefix"));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
437 assert(ip == inst+1, "only one prefix allowed");
a61af66fc99e Initial load
duke
parents:
diff changeset
438 goto again_after_prefix;
a61af66fc99e Initial load
duke
parents:
diff changeset
439
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
440 case 0x67:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
441 case REX:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
442 case REX_B:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
443 case REX_X:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
444 case REX_XB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
445 case REX_R:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
446 case REX_RB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
447 case REX_RX:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
448 case REX_RXB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
449 NOT_LP64(assert(false, "64bit prefixes"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
450 goto again_after_prefix;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
451
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
452 case REX_W:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
453 case REX_WB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
454 case REX_WX:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
455 case REX_WXB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
456 case REX_WR:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
457 case REX_WRB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
458 case REX_WRX:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
459 case REX_WRXB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
460 NOT_LP64(assert(false, "64bit prefixes"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
461 is_64bit = true;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
462 goto again_after_prefix;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
463
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
464 case 0xFF: // pushq a; decl a; incl a; call a; jmp a
0
a61af66fc99e Initial load
duke
parents:
diff changeset
465 case 0x88: // movb a, r
a61af66fc99e Initial load
duke
parents:
diff changeset
466 case 0x89: // movl a, r
a61af66fc99e Initial load
duke
parents:
diff changeset
467 case 0x8A: // movb r, a
a61af66fc99e Initial load
duke
parents:
diff changeset
468 case 0x8B: // movl r, a
a61af66fc99e Initial load
duke
parents:
diff changeset
469 case 0x8F: // popl a
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
470 debug_only(has_disp32 = true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
471 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
472
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
473 case 0x68: // pushq #32
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
474 if (which == end_pc_operand) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
475 return ip + 4;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
476 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
477 assert(which == imm_operand && !is_64bit, "pushl has no disp32 or 64bit immediate");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
478 return ip; // not produced by emit_operand
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 case 0x66: // movw ... (size prefix)
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
481 again_after_size_prefix2:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
482 switch (0xFF & *ip++) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
483 case REX:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
484 case REX_B:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
485 case REX_X:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
486 case REX_XB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
487 case REX_R:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
488 case REX_RB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
489 case REX_RX:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
490 case REX_RXB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
491 case REX_W:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
492 case REX_WB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
493 case REX_WX:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
494 case REX_WXB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
495 case REX_WR:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
496 case REX_WRB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
497 case REX_WRX:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
498 case REX_WRXB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
499 NOT_LP64(assert(false, "64bit prefix found"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
500 goto again_after_size_prefix2;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
501 case 0x8B: // movw r, a
a61af66fc99e Initial load
duke
parents:
diff changeset
502 case 0x89: // movw a, r
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
503 debug_only(has_disp32 = true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
504 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
505 case 0xC7: // movw a, #16
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
506 debug_only(has_disp32 = true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
507 tail_size = 2; // the imm16
a61af66fc99e Initial load
duke
parents:
diff changeset
508 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
509 case 0x0F: // several SSE/SSE2 variants
a61af66fc99e Initial load
duke
parents:
diff changeset
510 ip--; // reparse the 0x0F
a61af66fc99e Initial load
duke
parents:
diff changeset
511 goto again_after_prefix;
a61af66fc99e Initial load
duke
parents:
diff changeset
512 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
513 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
516
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
517 case REP8(0xB8): // movl/q r, #32/#64(oop?)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
518 if (which == end_pc_operand) return ip + (is_64bit ? 8 : 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
519 // these asserts are somewhat nonsensical
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
520 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
521 assert(which == imm_operand || which == disp32_operand, "");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
522 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
523 assert((which == call32_operand || which == imm_operand) && is_64bit ||
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
524 which == narrow_oop_operand && !is_64bit, "");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
525 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
526 return ip;
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 case 0x69: // imul r, a, #32
a61af66fc99e Initial load
duke
parents:
diff changeset
529 case 0xC7: // movl a, #32(oop?)
a61af66fc99e Initial load
duke
parents:
diff changeset
530 tail_size = 4;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
531 debug_only(has_disp32 = true); // has both kinds of operands!
0
a61af66fc99e Initial load
duke
parents:
diff changeset
532 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
533
a61af66fc99e Initial load
duke
parents:
diff changeset
534 case 0x0F: // movx..., etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
535 switch (0xFF & *ip++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
536 case 0x12: // movlps
a61af66fc99e Initial load
duke
parents:
diff changeset
537 case 0x28: // movaps
a61af66fc99e Initial load
duke
parents:
diff changeset
538 case 0x2E: // ucomiss
a61af66fc99e Initial load
duke
parents:
diff changeset
539 case 0x2F: // comiss
a61af66fc99e Initial load
duke
parents:
diff changeset
540 case 0x54: // andps
a61af66fc99e Initial load
duke
parents:
diff changeset
541 case 0x55: // andnps
a61af66fc99e Initial load
duke
parents:
diff changeset
542 case 0x56: // orps
a61af66fc99e Initial load
duke
parents:
diff changeset
543 case 0x57: // xorps
a61af66fc99e Initial load
duke
parents:
diff changeset
544 case 0x6E: // movd
a61af66fc99e Initial load
duke
parents:
diff changeset
545 case 0x7E: // movd
a61af66fc99e Initial load
duke
parents:
diff changeset
546 case 0xAE: // ldmxcsr a
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
547 // 64bit side says it these have both operands but that doesn't
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
548 // appear to be true
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
549 debug_only(has_disp32 = true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
550 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
551
a61af66fc99e Initial load
duke
parents:
diff changeset
552 case 0xAD: // shrd r, a, %cl
a61af66fc99e Initial load
duke
parents:
diff changeset
553 case 0xAF: // imul r, a
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
554 case 0xBE: // movsbl r, a (movsxb)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
555 case 0xBF: // movswl r, a (movsxw)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
556 case 0xB6: // movzbl r, a (movzxb)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
557 case 0xB7: // movzwl r, a (movzxw)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
558 case REP16(0x40): // cmovl cc, r, a
a61af66fc99e Initial load
duke
parents:
diff changeset
559 case 0xB0: // cmpxchgb
a61af66fc99e Initial load
duke
parents:
diff changeset
560 case 0xB1: // cmpxchg
a61af66fc99e Initial load
duke
parents:
diff changeset
561 case 0xC1: // xaddl
a61af66fc99e Initial load
duke
parents:
diff changeset
562 case 0xC7: // cmpxchg8
a61af66fc99e Initial load
duke
parents:
diff changeset
563 case REP16(0x90): // setcc a
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
564 debug_only(has_disp32 = true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // fall out of the switch to decode the address
a61af66fc99e Initial load
duke
parents:
diff changeset
566 break;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
567
0
a61af66fc99e Initial load
duke
parents:
diff changeset
568 case 0xAC: // shrd r, a, #8
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
569 debug_only(has_disp32 = true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
570 tail_size = 1; // the imm8
a61af66fc99e Initial load
duke
parents:
diff changeset
571 break;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
572
0
a61af66fc99e Initial load
duke
parents:
diff changeset
573 case REP16(0x80): // jcc rdisp32
a61af66fc99e Initial load
duke
parents:
diff changeset
574 if (which == end_pc_operand) return ip + 4;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
575 assert(which == call32_operand, "jcc has no disp32 or imm");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
576 return ip;
a61af66fc99e Initial load
duke
parents:
diff changeset
577 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
578 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
579 }
a61af66fc99e Initial load
duke
parents:
diff changeset
580 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
581
a61af66fc99e Initial load
duke
parents:
diff changeset
582 case 0x81: // addl a, #32; addl r, #32
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // also: orl, adcl, sbbl, andl, subl, xorl, cmpl
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
584 // on 32bit in the case of cmpl, the imm might be an oop
0
a61af66fc99e Initial load
duke
parents:
diff changeset
585 tail_size = 4;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
586 debug_only(has_disp32 = true); // has both kinds of operands!
0
a61af66fc99e Initial load
duke
parents:
diff changeset
587 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
588
a61af66fc99e Initial load
duke
parents:
diff changeset
589 case 0x83: // addl a, #8; addl r, #8
a61af66fc99e Initial load
duke
parents:
diff changeset
590 // also: orl, adcl, sbbl, andl, subl, xorl, cmpl
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
591 debug_only(has_disp32 = true); // has both kinds of operands!
0
a61af66fc99e Initial load
duke
parents:
diff changeset
592 tail_size = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
593 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595 case 0x9B:
a61af66fc99e Initial load
duke
parents:
diff changeset
596 switch (0xFF & *ip++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
597 case 0xD9: // fnstcw a
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
598 debug_only(has_disp32 = true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
599 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
600 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
601 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
603 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
604
a61af66fc99e Initial load
duke
parents:
diff changeset
605 case REP4(0x00): // addb a, r; addl a, r; addb r, a; addl r, a
a61af66fc99e Initial load
duke
parents:
diff changeset
606 case REP4(0x10): // adc...
a61af66fc99e Initial load
duke
parents:
diff changeset
607 case REP4(0x20): // and...
a61af66fc99e Initial load
duke
parents:
diff changeset
608 case REP4(0x30): // xor...
a61af66fc99e Initial load
duke
parents:
diff changeset
609 case REP4(0x08): // or...
a61af66fc99e Initial load
duke
parents:
diff changeset
610 case REP4(0x18): // sbb...
a61af66fc99e Initial load
duke
parents:
diff changeset
611 case REP4(0x28): // sub...
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
612 case 0xF7: // mull a
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
613 case 0x8D: // lea r, a
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
614 case 0x87: // xchg r, a
0
a61af66fc99e Initial load
duke
parents:
diff changeset
615 case REP4(0x38): // cmp...
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
616 case 0x85: // test r, a
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
617 debug_only(has_disp32 = true); // has both kinds of operands!
0
a61af66fc99e Initial load
duke
parents:
diff changeset
618 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
619
a61af66fc99e Initial load
duke
parents:
diff changeset
620 case 0xC1: // sal a, #8; sar a, #8; shl a, #8; shr a, #8
a61af66fc99e Initial load
duke
parents:
diff changeset
621 case 0xC6: // movb a, #8
a61af66fc99e Initial load
duke
parents:
diff changeset
622 case 0x80: // cmpb a, #8
a61af66fc99e Initial load
duke
parents:
diff changeset
623 case 0x6B: // imul r, a, #8
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
624 debug_only(has_disp32 = true); // has both kinds of operands!
0
a61af66fc99e Initial load
duke
parents:
diff changeset
625 tail_size = 1; // the imm8
a61af66fc99e Initial load
duke
parents:
diff changeset
626 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
627
a61af66fc99e Initial load
duke
parents:
diff changeset
628 case 0xE8: // call rdisp32
a61af66fc99e Initial load
duke
parents:
diff changeset
629 case 0xE9: // jmp rdisp32
a61af66fc99e Initial load
duke
parents:
diff changeset
630 if (which == end_pc_operand) return ip + 4;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
631 assert(which == call32_operand, "call has no disp32 or imm");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
632 return ip;
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 case 0xD1: // sal a, 1; sar a, 1; shl a, 1; shr a, 1
a61af66fc99e Initial load
duke
parents:
diff changeset
635 case 0xD3: // sal a, %cl; sar a, %cl; shl a, %cl; shr a, %cl
a61af66fc99e Initial load
duke
parents:
diff changeset
636 case 0xD9: // fld_s a; fst_s a; fstp_s a; fldcw a
a61af66fc99e Initial load
duke
parents:
diff changeset
637 case 0xDD: // fld_d a; fst_d a; fstp_d a
a61af66fc99e Initial load
duke
parents:
diff changeset
638 case 0xDB: // fild_s a; fistp_s a; fld_x a; fstp_x a
a61af66fc99e Initial load
duke
parents:
diff changeset
639 case 0xDF: // fild_d a; fistp_d a
a61af66fc99e Initial load
duke
parents:
diff changeset
640 case 0xD8: // fadd_s a; fsubr_s a; fmul_s a; fdivr_s a; fcomp_s a
a61af66fc99e Initial load
duke
parents:
diff changeset
641 case 0xDC: // fadd_d a; fsubr_d a; fmul_d a; fdivr_d a; fcomp_d a
a61af66fc99e Initial load
duke
parents:
diff changeset
642 case 0xDE: // faddp_d a; fsubrp_d a; fmulp_d a; fdivrp_d a; fcompp_d a
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
643 debug_only(has_disp32 = true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
644 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
645
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 405
diff changeset
646 case 0xF0: // Lock
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 405
diff changeset
647 assert(os::is_MP(), "only on MP");
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 405
diff changeset
648 goto again_after_prefix;
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 405
diff changeset
649
0
a61af66fc99e Initial load
duke
parents:
diff changeset
650 case 0xF3: // For SSE
a61af66fc99e Initial load
duke
parents:
diff changeset
651 case 0xF2: // For SSE2
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
652 switch (0xFF & *ip++) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
653 case REX:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
654 case REX_B:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
655 case REX_X:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
656 case REX_XB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
657 case REX_R:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
658 case REX_RB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
659 case REX_RX:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
660 case REX_RXB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
661 case REX_W:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
662 case REX_WB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
663 case REX_WX:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
664 case REX_WXB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
665 case REX_WR:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
666 case REX_WRB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
667 case REX_WRX:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
668 case REX_WRXB:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
669 NOT_LP64(assert(false, "found 64bit prefix"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
670 ip++;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
671 default:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
672 ip++;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
673 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
674 debug_only(has_disp32 = true); // has both kinds of operands!
0
a61af66fc99e Initial load
duke
parents:
diff changeset
675 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
676
a61af66fc99e Initial load
duke
parents:
diff changeset
677 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
678 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
679
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
680 #undef REP8
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
681 #undef REP16
0
a61af66fc99e Initial load
duke
parents:
diff changeset
682 }
a61af66fc99e Initial load
duke
parents:
diff changeset
683
a61af66fc99e Initial load
duke
parents:
diff changeset
684 assert(which != call32_operand, "instruction is not a call, jmp, or jcc");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
685 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
686 assert(which != imm_operand, "instruction is not a movq reg, imm64");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
687 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
688 // assert(which != imm_operand || has_imm32, "instruction has no imm32 field");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
689 assert(which != imm_operand || has_disp32, "instruction has no imm32 field");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
690 #endif // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
691 assert(which != disp32_operand || has_disp32, "instruction has no disp32 field");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
692
a61af66fc99e Initial load
duke
parents:
diff changeset
693 // parse the output of emit_operand
a61af66fc99e Initial load
duke
parents:
diff changeset
694 int op2 = 0xFF & *ip++;
a61af66fc99e Initial load
duke
parents:
diff changeset
695 int base = op2 & 0x07;
a61af66fc99e Initial load
duke
parents:
diff changeset
696 int op3 = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
697 const int b100 = 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
698 const int b101 = 5;
a61af66fc99e Initial load
duke
parents:
diff changeset
699 if (base == b100 && (op2 >> 6) != 3) {
a61af66fc99e Initial load
duke
parents:
diff changeset
700 op3 = 0xFF & *ip++;
a61af66fc99e Initial load
duke
parents:
diff changeset
701 base = op3 & 0x07; // refetch the base
a61af66fc99e Initial load
duke
parents:
diff changeset
702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
703 // now ip points at the disp (if any)
a61af66fc99e Initial load
duke
parents:
diff changeset
704
a61af66fc99e Initial load
duke
parents:
diff changeset
705 switch (op2 >> 6) {
a61af66fc99e Initial load
duke
parents:
diff changeset
706 case 0:
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // [00 reg 100][ss index base]
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
708 // [00 reg 100][00 100 esp]
0
a61af66fc99e Initial load
duke
parents:
diff changeset
709 // [00 reg base]
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // [00 reg 100][ss index 101][disp32]
a61af66fc99e Initial load
duke
parents:
diff changeset
711 // [00 reg 101] [disp32]
a61af66fc99e Initial load
duke
parents:
diff changeset
712
a61af66fc99e Initial load
duke
parents:
diff changeset
713 if (base == b101) {
a61af66fc99e Initial load
duke
parents:
diff changeset
714 if (which == disp32_operand)
a61af66fc99e Initial load
duke
parents:
diff changeset
715 return ip; // caller wants the disp32
a61af66fc99e Initial load
duke
parents:
diff changeset
716 ip += 4; // skip the disp32
a61af66fc99e Initial load
duke
parents:
diff changeset
717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
718 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
719
a61af66fc99e Initial load
duke
parents:
diff changeset
720 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
721 // [01 reg 100][ss index base][disp8]
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
722 // [01 reg 100][00 100 esp][disp8]
0
a61af66fc99e Initial load
duke
parents:
diff changeset
723 // [01 reg base] [disp8]
a61af66fc99e Initial load
duke
parents:
diff changeset
724 ip += 1; // skip the disp8
a61af66fc99e Initial load
duke
parents:
diff changeset
725 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
726
a61af66fc99e Initial load
duke
parents:
diff changeset
727 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
728 // [10 reg 100][ss index base][disp32]
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
729 // [10 reg 100][00 100 esp][disp32]
0
a61af66fc99e Initial load
duke
parents:
diff changeset
730 // [10 reg base] [disp32]
a61af66fc99e Initial load
duke
parents:
diff changeset
731 if (which == disp32_operand)
a61af66fc99e Initial load
duke
parents:
diff changeset
732 return ip; // caller wants the disp32
a61af66fc99e Initial load
duke
parents:
diff changeset
733 ip += 4; // skip the disp32
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 3:
a61af66fc99e Initial load
duke
parents:
diff changeset
737 // [11 reg base] (not a memory addressing mode)
a61af66fc99e Initial load
duke
parents:
diff changeset
738 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
739 }
a61af66fc99e Initial load
duke
parents:
diff changeset
740
a61af66fc99e Initial load
duke
parents:
diff changeset
741 if (which == end_pc_operand) {
a61af66fc99e Initial load
duke
parents:
diff changeset
742 return ip + tail_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
743 }
a61af66fc99e Initial load
duke
parents:
diff changeset
744
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
745 #ifdef _LP64
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
746 assert(which == narrow_oop_operand && !is_64bit, "instruction is not a movl adr, imm32");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
747 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
748 assert(which == imm_operand, "instruction has only an imm field");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
749 #endif // LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
750 return ip;
a61af66fc99e Initial load
duke
parents:
diff changeset
751 }
a61af66fc99e Initial load
duke
parents:
diff changeset
752
a61af66fc99e Initial load
duke
parents:
diff changeset
753 address Assembler::locate_next_instruction(address inst) {
a61af66fc99e Initial load
duke
parents:
diff changeset
754 // Secretly share code with locate_operand:
a61af66fc99e Initial load
duke
parents:
diff changeset
755 return locate_operand(inst, end_pc_operand);
a61af66fc99e Initial load
duke
parents:
diff changeset
756 }
a61af66fc99e Initial load
duke
parents:
diff changeset
757
a61af66fc99e Initial load
duke
parents:
diff changeset
758
a61af66fc99e Initial load
duke
parents:
diff changeset
759 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
760 void Assembler::check_relocation(RelocationHolder const& rspec, int format) {
a61af66fc99e Initial load
duke
parents:
diff changeset
761 address inst = inst_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
762 assert(inst != NULL && inst < pc(), "must point to beginning of instruction");
a61af66fc99e Initial load
duke
parents:
diff changeset
763 address opnd;
a61af66fc99e Initial load
duke
parents:
diff changeset
764
a61af66fc99e Initial load
duke
parents:
diff changeset
765 Relocation* r = rspec.reloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
766 if (r->type() == relocInfo::none) {
a61af66fc99e Initial load
duke
parents:
diff changeset
767 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
768 } else if (r->is_call() || format == call32_operand) {
a61af66fc99e Initial load
duke
parents:
diff changeset
769 // assert(format == imm32_operand, "cannot specify a nonzero format");
a61af66fc99e Initial load
duke
parents:
diff changeset
770 opnd = locate_operand(inst, call32_operand);
a61af66fc99e Initial load
duke
parents:
diff changeset
771 } else if (r->is_data()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
772 assert(format == imm_operand || format == disp32_operand
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
773 LP64_ONLY(|| format == narrow_oop_operand), "format ok");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
774 opnd = locate_operand(inst, (WhichOperand)format);
a61af66fc99e Initial load
duke
parents:
diff changeset
775 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
776 assert(format == imm_operand, "cannot specify a format");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
777 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
778 }
a61af66fc99e Initial load
duke
parents:
diff changeset
779 assert(opnd == pc(), "must put operand where relocs can find it");
a61af66fc99e Initial load
duke
parents:
diff changeset
780 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
781 #endif // ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
782
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
783 void Assembler::emit_operand32(Register reg, Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
784 assert(reg->encoding() < 8, "no extended registers");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
785 assert(!adr.base_needs_rex() && !adr.index_needs_rex(), "no extended registers");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
786 emit_operand(reg, adr._base, adr._index, adr._scale, adr._disp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
787 adr._rspec);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
788 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
789
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
790 void Assembler::emit_operand(Register reg, Address adr,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
791 int rip_relative_correction) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
792 emit_operand(reg, adr._base, adr._index, adr._scale, adr._disp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
793 adr._rspec,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
794 rip_relative_correction);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
795 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
796
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
797 void Assembler::emit_operand(XMMRegister reg, Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
798 emit_operand(reg, adr._base, adr._index, adr._scale, adr._disp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
799 adr._rspec);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
800 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
801
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
802 // MMX operations
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
803 void Assembler::emit_operand(MMXRegister reg, Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
804 assert(!adr.base_needs_rex() && !adr.index_needs_rex(), "no extended registers");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
805 emit_operand((Register)reg, adr._base, adr._index, adr._scale, adr._disp, adr._rspec);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
806 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
807
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
808 // work around gcc (3.2.1-7a) bug
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
809 void Assembler::emit_operand(Address adr, MMXRegister reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
810 assert(!adr.base_needs_rex() && !adr.index_needs_rex(), "no extended registers");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
811 emit_operand((Register)reg, adr._base, adr._index, adr._scale, adr._disp, adr._rspec);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
812 }
a61af66fc99e Initial load
duke
parents:
diff changeset
813
a61af66fc99e Initial load
duke
parents:
diff changeset
814
a61af66fc99e Initial load
duke
parents:
diff changeset
815 void Assembler::emit_farith(int b1, int b2, int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
816 assert(isByte(b1) && isByte(b2), "wrong opcode");
a61af66fc99e Initial load
duke
parents:
diff changeset
817 assert(0 <= i && i < 8, "illegal stack offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
818 emit_byte(b1);
a61af66fc99e Initial load
duke
parents:
diff changeset
819 emit_byte(b2 + i);
a61af66fc99e Initial load
duke
parents:
diff changeset
820 }
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
823 // Now the Assembler instruction (identical for 32/64 bits)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
824
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
825 void Assembler::adcl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
826 prefix(dst);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
827 emit_arith(0x81, 0xD0, dst, imm32);
a61af66fc99e Initial load
duke
parents:
diff changeset
828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
829
a61af66fc99e Initial load
duke
parents:
diff changeset
830 void Assembler::adcl(Register dst, Address src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
831 InstructionMark im(this);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
832 prefix(src, dst);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
833 emit_byte(0x13);
a61af66fc99e Initial load
duke
parents:
diff changeset
834 emit_operand(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
835 }
a61af66fc99e Initial load
duke
parents:
diff changeset
836
a61af66fc99e Initial load
duke
parents:
diff changeset
837 void Assembler::adcl(Register dst, Register src) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
838 (void) prefix_and_encode(dst->encoding(), src->encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
839 emit_arith(0x13, 0xC0, dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
840 }
a61af66fc99e Initial load
duke
parents:
diff changeset
841
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
842 void Assembler::addl(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
843 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
844 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
845 emit_arith_operand(0x81, rax, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
846 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
847
a61af66fc99e Initial load
duke
parents:
diff changeset
848 void Assembler::addl(Address dst, Register src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
849 InstructionMark im(this);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
850 prefix(dst, src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
851 emit_byte(0x01);
a61af66fc99e Initial load
duke
parents:
diff changeset
852 emit_operand(src, dst);
a61af66fc99e Initial load
duke
parents:
diff changeset
853 }
a61af66fc99e Initial load
duke
parents:
diff changeset
854
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
855 void Assembler::addl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
856 prefix(dst);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
857 emit_arith(0x81, 0xC0, dst, imm32);
a61af66fc99e Initial load
duke
parents:
diff changeset
858 }
a61af66fc99e Initial load
duke
parents:
diff changeset
859
a61af66fc99e Initial load
duke
parents:
diff changeset
860 void Assembler::addl(Register dst, Address src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
861 InstructionMark im(this);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
862 prefix(src, dst);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
863 emit_byte(0x03);
a61af66fc99e Initial load
duke
parents:
diff changeset
864 emit_operand(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
865 }
a61af66fc99e Initial load
duke
parents:
diff changeset
866
a61af66fc99e Initial load
duke
parents:
diff changeset
867 void Assembler::addl(Register dst, Register src) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
868 (void) prefix_and_encode(dst->encoding(), src->encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
869 emit_arith(0x03, 0xC0, dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
870 }
a61af66fc99e Initial load
duke
parents:
diff changeset
871
a61af66fc99e Initial load
duke
parents:
diff changeset
872 void Assembler::addr_nop_4() {
a61af66fc99e Initial load
duke
parents:
diff changeset
873 // 4 bytes: NOP DWORD PTR [EAX+0]
a61af66fc99e Initial load
duke
parents:
diff changeset
874 emit_byte(0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
875 emit_byte(0x1F);
a61af66fc99e Initial load
duke
parents:
diff changeset
876 emit_byte(0x40); // emit_rm(cbuf, 0x1, EAX_enc, EAX_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
877 emit_byte(0); // 8-bits offset (1 byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
878 }
a61af66fc99e Initial load
duke
parents:
diff changeset
879
a61af66fc99e Initial load
duke
parents:
diff changeset
880 void Assembler::addr_nop_5() {
a61af66fc99e Initial load
duke
parents:
diff changeset
881 // 5 bytes: NOP DWORD PTR [EAX+EAX*0+0] 8-bits offset
a61af66fc99e Initial load
duke
parents:
diff changeset
882 emit_byte(0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
883 emit_byte(0x1F);
a61af66fc99e Initial load
duke
parents:
diff changeset
884 emit_byte(0x44); // emit_rm(cbuf, 0x1, EAX_enc, 0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
885 emit_byte(0x00); // emit_rm(cbuf, 0x0, EAX_enc, EAX_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
886 emit_byte(0); // 8-bits offset (1 byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
887 }
a61af66fc99e Initial load
duke
parents:
diff changeset
888
a61af66fc99e Initial load
duke
parents:
diff changeset
889 void Assembler::addr_nop_7() {
a61af66fc99e Initial load
duke
parents:
diff changeset
890 // 7 bytes: NOP DWORD PTR [EAX+0] 32-bits offset
a61af66fc99e Initial load
duke
parents:
diff changeset
891 emit_byte(0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
892 emit_byte(0x1F);
a61af66fc99e Initial load
duke
parents:
diff changeset
893 emit_byte(0x80); // emit_rm(cbuf, 0x2, EAX_enc, EAX_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
894 emit_long(0); // 32-bits offset (4 bytes)
a61af66fc99e Initial load
duke
parents:
diff changeset
895 }
a61af66fc99e Initial load
duke
parents:
diff changeset
896
a61af66fc99e Initial load
duke
parents:
diff changeset
897 void Assembler::addr_nop_8() {
a61af66fc99e Initial load
duke
parents:
diff changeset
898 // 8 bytes: NOP DWORD PTR [EAX+EAX*0+0] 32-bits offset
a61af66fc99e Initial load
duke
parents:
diff changeset
899 emit_byte(0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
900 emit_byte(0x1F);
a61af66fc99e Initial load
duke
parents:
diff changeset
901 emit_byte(0x84); // emit_rm(cbuf, 0x2, EAX_enc, 0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
902 emit_byte(0x00); // emit_rm(cbuf, 0x0, EAX_enc, EAX_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
903 emit_long(0); // 32-bits offset (4 bytes)
a61af66fc99e Initial load
duke
parents:
diff changeset
904 }
a61af66fc99e Initial load
duke
parents:
diff changeset
905
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
906 void Assembler::addsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
907 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
908 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
909 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
910 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
911 emit_byte(0x58);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
912 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
913 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
914
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
915 void Assembler::addsd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
916 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
917 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
918 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
919 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
920 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
921 emit_byte(0x58);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
922 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
923 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
924
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
925 void Assembler::addss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
926 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
927 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
928 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
929 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
930 emit_byte(0x58);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
931 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
932 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
933
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
934 void Assembler::addss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
935 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
936 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
937 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
938 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
939 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
940 emit_byte(0x58);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
941 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
942 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
943
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
944 void Assembler::andl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
945 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
946 emit_arith(0x81, 0xE0, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
947 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
948
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
949 void Assembler::andl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
950 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
951 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
952 emit_byte(0x23);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
953 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
954 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
955
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
956 void Assembler::andl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
957 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
958 emit_arith(0x23, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
959 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
960
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
961 void Assembler::andpd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
962 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
963 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
964 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
965 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
966 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
967 emit_byte(0x54);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
968 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
969 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
970
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
971 void Assembler::bsfl(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
972 int encode = prefix_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
973 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
974 emit_byte(0xBC);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
975 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
976 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
977
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
978 void Assembler::bsrl(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
979 assert(!VM_Version::supports_lzcnt(), "encoding is treated as LZCNT");
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
980 int encode = prefix_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
981 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
982 emit_byte(0xBD);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
983 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
984 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
985
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
986 void Assembler::bswapl(Register reg) { // bswap
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
987 int encode = prefix_and_encode(reg->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
988 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
989 emit_byte(0xC8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
990 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
991
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
992 void Assembler::call(Label& L, relocInfo::relocType rtype) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
993 // suspect disp32 is always good
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
994 int operand = LP64_ONLY(disp32_operand) NOT_LP64(imm_operand);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
995
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
996 if (L.is_bound()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
997 const int long_size = 5;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
998 int offs = (int)( target(L) - pc() );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
999 assert(offs <= 0, "assembler error");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1000 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1001 // 1110 1000 #32-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1002 emit_byte(0xE8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1003 emit_data(offs - long_size, rtype, operand);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1004 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1005 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1006 // 1110 1000 #32-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1007 L.add_patch_at(code(), locator());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1008
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1009 emit_byte(0xE8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1010 emit_data(int(0), rtype, operand);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1011 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1012 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1013
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1014 void Assembler::call(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1015 // This was originally using a 32bit register encoding
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1016 // and surely we want 64bit!
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1017 // this is a 32bit encoding but in 64bit mode the default
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1018 // operand size is 64bit so there is no need for the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1019 // wide prefix. So prefix only happens if we use the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1020 // new registers. Much like push/pop.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1021 int x = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1022 // this may be true but dbx disassembles it as if it
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1023 // were 32bits...
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1024 // int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1025 // if (offset() != x) assert(dst->encoding() >= 8, "what?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1026 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1027
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1028 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1029 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1030 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1031
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1032
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1033 void Assembler::call(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1034 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1035 prefix(adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1036 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1037 emit_operand(rdx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1038 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1039
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1040 void Assembler::call_literal(address entry, RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1041 assert(entry != NULL, "call most probably wrong");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1042 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1043 emit_byte(0xE8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1044 intptr_t disp = entry - (_code_pos + sizeof(int32_t));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1045 assert(is_simm32(disp), "must be 32bit offset (call2)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1046 // Technically, should use call32_operand, but this format is
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1047 // implied by the fact that we're emitting a call instruction.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1048
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1049 int operand = LP64_ONLY(disp32_operand) NOT_LP64(call32_operand);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1050 emit_data((int) disp, rspec, operand);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1051 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1052
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1053 void Assembler::cdql() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1054 emit_byte(0x99);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1055 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1056
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1057 void Assembler::cmovl(Condition cc, Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1058 NOT_LP64(guarantee(VM_Version::supports_cmov(), "illegal instruction"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1059 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1060 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1061 emit_byte(0x40 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1062 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1063 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1064
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1065
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1066 void Assembler::cmovl(Condition cc, Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1067 NOT_LP64(guarantee(VM_Version::supports_cmov(), "illegal instruction"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1068 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1069 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1070 emit_byte(0x40 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1071 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1072 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1073
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1074 void Assembler::cmpb(Address dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1075 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1076 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1077 emit_byte(0x80);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1078 emit_operand(rdi, dst, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1079 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1080 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1081
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1082 void Assembler::cmpl(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1083 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1084 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1085 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1086 emit_operand(rdi, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1087 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1088 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1089
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1090 void Assembler::cmpl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1091 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1092 emit_arith(0x81, 0xF8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1093 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1094
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1095 void Assembler::cmpl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1096 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1097 emit_arith(0x3B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1098 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1099
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1100
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1101 void Assembler::cmpl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1102 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1103 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1104 emit_byte(0x3B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1105 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1106 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1107
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1108 void Assembler::cmpw(Address dst, int imm16) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1109 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1110 assert(!dst.base_needs_rex() && !dst.index_needs_rex(), "no extended registers");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1111 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1112 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1113 emit_operand(rdi, dst, 2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1114 emit_word(imm16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1115 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1116
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1117 // The 32-bit cmpxchg compares the value at adr with the contents of rax,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1118 // and stores reg into adr if so; otherwise, the value at adr is loaded into rax,.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1119 // The ZF is set if the compared values were equal, and cleared otherwise.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1120 void Assembler::cmpxchgl(Register reg, Address adr) { // cmpxchg
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1121 if (Atomics & 2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1122 // caveat: no instructionmark, so this isn't relocatable.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1123 // Emit a synthetic, non-atomic, CAS equivalent.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1124 // Beware. The synthetic form sets all ICCs, not just ZF.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1125 // cmpxchg r,[m] is equivalent to rax, = CAS (m, rax, r)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1126 cmpl(rax, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1127 movl(rax, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1128 if (reg != rax) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1129 Label L ;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1130 jcc(Assembler::notEqual, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1131 movl(adr, reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1132 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1133 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1134 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1135 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1136 prefix(adr, reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1137 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1138 emit_byte(0xB1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1139 emit_operand(reg, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1140 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1141 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1142
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1143 void Assembler::comisd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1144 // NOTE: dbx seems to decode this as comiss even though the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1145 // 0x66 is there. Strangly ucomisd comes out correct
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1146 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1147 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1148 comiss(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1149 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1150
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1151 void Assembler::comiss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1152 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1153
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1154 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1155 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1156 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1157 emit_byte(0x2F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1158 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1159 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1160
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1161 void Assembler::cvtdq2pd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1162 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1163 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1164 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1165 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1166 emit_byte(0xE6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1167 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1168 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1169
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1170 void Assembler::cvtdq2ps(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1171 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1172 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1173 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1174 emit_byte(0x5B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1175 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1176 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1177
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1178 void Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1179 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1180 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1181 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1182 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1183 emit_byte(0x5A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1184 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1185 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1186
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1187 void Assembler::cvtsi2sdl(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1188 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1189 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1190 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1191 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1192 emit_byte(0x2A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1193 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1194 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1195
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1196 void Assembler::cvtsi2ssl(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1197 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1198 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1199 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1200 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1201 emit_byte(0x2A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1202 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1203 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1204
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1205 void Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1206 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1207 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1208 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1209 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1210 emit_byte(0x5A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1211 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1212 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1213
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1214 void Assembler::cvttsd2sil(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1215 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1216 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1217 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1218 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1219 emit_byte(0x2C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1220 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1221 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1222
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1223 void Assembler::cvttss2sil(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1224 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1225 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1226 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1227 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1228 emit_byte(0x2C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1229 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1230 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1231
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1232 void Assembler::decl(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1233 // Don't use it directly. Use MacroAssembler::decrement() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1234 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1235 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1236 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1237 emit_operand(rcx, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1238 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1239
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1240 void Assembler::divsd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1241 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1242 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1243 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1244 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1245 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1246 emit_byte(0x5E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1247 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1248 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1249
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1250 void Assembler::divsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1251 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1252 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1253 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1254 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1255 emit_byte(0x5E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1256 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1257 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1258
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1259 void Assembler::divss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1260 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1261 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1262 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1263 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1264 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1265 emit_byte(0x5E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1266 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1267 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1268
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1269 void Assembler::divss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1270 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1271 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1272 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1273 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1274 emit_byte(0x5E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1275 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1276 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1277
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1278 void Assembler::emms() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1279 NOT_LP64(assert(VM_Version::supports_mmx(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1280 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1281 emit_byte(0x77);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1282 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1283
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1284 void Assembler::hlt() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1285 emit_byte(0xF4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1286 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1287
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1288 void Assembler::idivl(Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1289 int encode = prefix_and_encode(src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1290 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1291 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1292 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1293
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
1294 void Assembler::divl(Register src) { // Unsigned
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
1295 int encode = prefix_and_encode(src->encoding());
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
1296 emit_byte(0xF7);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
1297 emit_byte(0xF0 | encode);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
1298 }
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
1299
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1300 void Assembler::imull(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1301 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1302 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1303 emit_byte(0xAF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1304 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1305 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1306
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1307
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1308 void Assembler::imull(Register dst, Register src, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1309 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1310 if (is8bit(value)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1311 emit_byte(0x6B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1312 emit_byte(0xC0 | encode);
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1846
diff changeset
1313 emit_byte(value & 0xFF);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1314 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1315 emit_byte(0x69);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1316 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1317 emit_long(value);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1318 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1319 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1320
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1321 void Assembler::incl(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1322 // Don't use it directly. Use MacroAssembler::increment() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1323 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1324 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1325 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1326 emit_operand(rax, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1327 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1328
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1329 void Assembler::jcc(Condition cc, Label& L, relocInfo::relocType rtype) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1330 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1331 relocate(rtype);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1332 assert((0 <= cc) && (cc < 16), "illegal cc");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1333 if (L.is_bound()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1334 address dst = target(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1335 assert(dst != NULL, "jcc most probably wrong");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1336
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1337 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1338 const int long_size = 6;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1339 intptr_t offs = (intptr_t)dst - (intptr_t)_code_pos;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1340 if (rtype == relocInfo::none && is8bit(offs - short_size)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1341 // 0111 tttn #8-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1342 emit_byte(0x70 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1343 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1344 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1345 // 0000 1111 1000 tttn #32-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1346 assert(is_simm32(offs - long_size),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1347 "must be 32bit offset (call4)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1348 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1349 emit_byte(0x80 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1350 emit_long(offs - long_size);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1351 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1352 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1353 // Note: could eliminate cond. jumps to this jump if condition
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1354 // is the same however, seems to be rather unlikely case.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1355 // Note: use jccb() if label to be bound is very close to get
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1356 // an 8-bit displacement
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1357 L.add_patch_at(code(), locator());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1358 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1359 emit_byte(0x80 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1360 emit_long(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1361 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1362 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1363
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1364 void Assembler::jccb(Condition cc, Label& L) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1365 if (L.is_bound()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1366 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1367 address entry = target(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1368 assert(is8bit((intptr_t)entry - ((intptr_t)_code_pos + short_size)),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1369 "Dispacement too large for a short jmp");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1370 intptr_t offs = (intptr_t)entry - (intptr_t)_code_pos;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1371 // 0111 tttn #8-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1372 emit_byte(0x70 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1373 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1374 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1375 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1376 L.add_patch_at(code(), locator());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1377 emit_byte(0x70 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1378 emit_byte(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1379 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1380 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1381
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1382 void Assembler::jmp(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1383 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1384 prefix(adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1385 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1386 emit_operand(rsp, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1387 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1388
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1389 void Assembler::jmp(Label& L, relocInfo::relocType rtype) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1390 if (L.is_bound()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1391 address entry = target(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1392 assert(entry != NULL, "jmp most probably wrong");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1393 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1394 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1395 const int long_size = 5;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1396 intptr_t offs = entry - _code_pos;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1397 if (rtype == relocInfo::none && is8bit(offs - short_size)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1398 emit_byte(0xEB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1399 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1400 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1401 emit_byte(0xE9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1402 emit_long(offs - long_size);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1403 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1404 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1405 // By default, forward jumps are always 32-bit displacements, since
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1406 // we can't yet know where the label will be bound. If you're sure that
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1407 // the forward jump will not run beyond 256 bytes, use jmpb to
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1408 // force an 8-bit displacement.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1409 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1410 relocate(rtype);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1411 L.add_patch_at(code(), locator());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1412 emit_byte(0xE9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1413 emit_long(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1414 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1415 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1416
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1417 void Assembler::jmp(Register entry) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1418 int encode = prefix_and_encode(entry->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1419 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1420 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1421 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1422
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1423 void Assembler::jmp_literal(address dest, RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1424 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1425 emit_byte(0xE9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1426 assert(dest != NULL, "must have a target");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1427 intptr_t disp = dest - (_code_pos + sizeof(int32_t));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1428 assert(is_simm32(disp), "must be 32bit offset (jmp)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1429 emit_data(disp, rspec.reloc(), call32_operand);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1430 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1431
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1432 void Assembler::jmpb(Label& L) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1433 if (L.is_bound()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1434 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1435 address entry = target(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1436 assert(is8bit((entry - _code_pos) + short_size),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1437 "Dispacement too large for a short jmp");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1438 assert(entry != NULL, "jmp most probably wrong");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1439 intptr_t offs = entry - _code_pos;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1440 emit_byte(0xEB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1441 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1442 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1443 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1444 L.add_patch_at(code(), locator());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1445 emit_byte(0xEB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1446 emit_byte(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1447 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1448 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1449
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1450 void Assembler::ldmxcsr( Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1451 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1452 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1453 prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1454 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1455 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1456 emit_operand(as_Register(2), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1457 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1458
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1459 void Assembler::leal(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1460 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1461 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1462 emit_byte(0x67); // addr32
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1463 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1464 #endif // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1465 emit_byte(0x8D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1466 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1467 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1468
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1469 void Assembler::lock() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1470 if (Atomics & 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1471 // Emit either nothing, a NOP, or a NOP: prefix
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1472 emit_byte(0x90) ;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1473 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1474 emit_byte(0xF0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1475 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1476 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1477
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1478 void Assembler::lzcntl(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1479 assert(VM_Version::supports_lzcnt(), "encoding is treated as BSR");
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1480 emit_byte(0xF3);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1481 int encode = prefix_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1482 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1483 emit_byte(0xBD);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1484 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1485 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1486
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1487 // Emit mfence instruction
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1488 void Assembler::mfence() {
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1489 NOT_LP64(assert(VM_Version::supports_sse2(), "unsupported");)
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1490 emit_byte( 0x0F );
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1491 emit_byte( 0xAE );
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1492 emit_byte( 0xF0 );
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1493 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1494
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1495 void Assembler::mov(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1496 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1497 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1498
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1499 void Assembler::movapd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1500 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1501 int dstenc = dst->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1502 int srcenc = src->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1503 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1504 if (dstenc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1505 if (srcenc >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1506 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1507 srcenc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1508 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1509 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1510 if (srcenc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1511 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1512 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1513 prefix(REX_RB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1514 srcenc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1515 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1516 dstenc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1517 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1518 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1519 emit_byte(0x28);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1520 emit_byte(0xC0 | dstenc << 3 | srcenc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1521 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1522
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1523 void Assembler::movaps(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1524 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1525 int dstenc = dst->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1526 int srcenc = src->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1527 if (dstenc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1528 if (srcenc >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1529 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1530 srcenc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1531 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1532 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1533 if (srcenc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1534 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1535 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1536 prefix(REX_RB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1537 srcenc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1538 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1539 dstenc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1540 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1541 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1542 emit_byte(0x28);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1543 emit_byte(0xC0 | dstenc << 3 | srcenc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1544 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1545
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1546 void Assembler::movb(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1547 NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1548 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1549 prefix(src, dst, true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1550 emit_byte(0x8A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1551 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1552 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1553
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1554
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1555 void Assembler::movb(Address dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1556 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1557 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1558 emit_byte(0xC6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1559 emit_operand(rax, dst, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1560 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1561 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1562
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1563
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1564 void Assembler::movb(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1565 assert(src->has_byte_register(), "must have byte register");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1566 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1567 prefix(dst, src, true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1568 emit_byte(0x88);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1569 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1570 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1571
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1572 void Assembler::movdl(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1573 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1574 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1575 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1576 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1577 emit_byte(0x6E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1578 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1579 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1580
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1581 void Assembler::movdl(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1582 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1583 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1584 // swap src/dst to get correct prefix
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1585 int encode = prefix_and_encode(src->encoding(), dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1586 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1587 emit_byte(0x7E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1588 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1589 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1590
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1591 void Assembler::movdqa(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1592 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1593 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1594 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1595 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1596 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1597 emit_byte(0x6F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1598 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1599 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1600
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1601 void Assembler::movdqa(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1602 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1603 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1604 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1605 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1606 emit_byte(0x6F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1607 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1608 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1609
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1610 void Assembler::movdqa(Address dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1611 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1612 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1613 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1614 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1615 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1616 emit_byte(0x7F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1617 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1618 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1619
405
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1620 void Assembler::movdqu(XMMRegister dst, Address src) {
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1621 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1622 InstructionMark im(this);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1623 emit_byte(0xF3);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1624 prefix(src, dst);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1625 emit_byte(0x0F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1626 emit_byte(0x6F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1627 emit_operand(dst, src);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1628 }
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1629
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1630 void Assembler::movdqu(XMMRegister dst, XMMRegister src) {
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1631 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1632 emit_byte(0xF3);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1633 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1634 emit_byte(0x0F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1635 emit_byte(0x6F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1636 emit_byte(0xC0 | encode);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1637 }
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1638
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1639 void Assembler::movdqu(Address dst, XMMRegister src) {
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1640 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1641 InstructionMark im(this);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1642 emit_byte(0xF3);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1643 prefix(dst, src);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1644 emit_byte(0x0F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1645 emit_byte(0x7F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1646 emit_operand(src, dst);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1647 }
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1648
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1649 // Uses zero extension on 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1650
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1651 void Assembler::movl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1652 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1653 emit_byte(0xB8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1654 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1655 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1656
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1657 void Assembler::movl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1658 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1659 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1660 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1661 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1662
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1663 void Assembler::movl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1664 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1665 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1666 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1667 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1668 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1669
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1670 void Assembler::movl(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1671 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1672 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1673 emit_byte(0xC7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1674 emit_operand(rax, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1675 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1676 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1677
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1678 void Assembler::movl(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1679 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1680 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1681 emit_byte(0x89);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1682 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1683 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1684
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1685 // New cpus require to use movsd and movss to avoid partial register stall
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1686 // when loading from memory. But for old Opteron use movlpd instead of movsd.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1687 // The selection is done in MacroAssembler::movdbl() and movflt().
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1688 void Assembler::movlpd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1689 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1690 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1691 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1692 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1693 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1694 emit_byte(0x12);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1695 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1696 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1697
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1698 void Assembler::movq( MMXRegister dst, Address src ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1699 assert( VM_Version::supports_mmx(), "" );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1700 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1701 emit_byte(0x6F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1702 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1703 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1704
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1705 void Assembler::movq( Address dst, MMXRegister src ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1706 assert( VM_Version::supports_mmx(), "" );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1707 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1708 emit_byte(0x7F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1709 // workaround gcc (3.2.1-7a) bug
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1710 // In that version of gcc with only an emit_operand(MMX, Address)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1711 // gcc will tail jump and try and reverse the parameters completely
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1712 // obliterating dst in the process. By having a version available
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1713 // that doesn't need to swap the args at the tail jump the bug is
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1714 // avoided.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1715 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1716 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1717
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1718 void Assembler::movq(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1719 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1720 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1721 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1722 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1723 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1724 emit_byte(0x7E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1725 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1726 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1727
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1728 void Assembler::movq(Address dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1729 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1730 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1731 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1732 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1733 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1734 emit_byte(0xD6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1735 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1736 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1737
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1738 void Assembler::movsbl(Register dst, Address src) { // movsxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1739 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1740 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1741 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1742 emit_byte(0xBE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1743 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1744 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1745
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1746 void Assembler::movsbl(Register dst, Register src) { // movsxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1747 NOT_LP64(assert(src->has_byte_register(), "must have byte register"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1748 int encode = prefix_and_encode(dst->encoding(), src->encoding(), true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1749 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1750 emit_byte(0xBE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1751 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1752 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1753
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1754 void Assembler::movsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1755 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1756 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1757 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1758 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1759 emit_byte(0x10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1760 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1761 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1762
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1763 void Assembler::movsd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1764 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1765 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1766 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1767 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1768 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1769 emit_byte(0x10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1770 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1771 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1772
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1773 void Assembler::movsd(Address dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1774 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1775 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1776 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1777 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1778 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1779 emit_byte(0x11);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1780 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1781 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1782
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1783 void Assembler::movss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1784 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1785 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1786 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1787 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1788 emit_byte(0x10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1789 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1790 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1791
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1792 void Assembler::movss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1793 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1794 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1795 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1796 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1797 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1798 emit_byte(0x10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1799 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1800 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1801
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1802 void Assembler::movss(Address dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1803 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1804 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1805 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1806 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1807 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1808 emit_byte(0x11);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1809 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1810 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1811
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1812 void Assembler::movswl(Register dst, Address src) { // movsxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1813 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1814 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1815 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1816 emit_byte(0xBF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1817 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1818 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1819
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1820 void Assembler::movswl(Register dst, Register src) { // movsxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1821 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1822 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1823 emit_byte(0xBF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1824 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1825 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1826
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1827 void Assembler::movw(Address dst, int imm16) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1828 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1829
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1830 emit_byte(0x66); // switch to 16-bit mode
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1831 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1832 emit_byte(0xC7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1833 emit_operand(rax, dst, 2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1834 emit_word(imm16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1835 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1836
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1837 void Assembler::movw(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1838 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1839 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1840 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1841 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1842 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1843 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1844
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1845 void Assembler::movw(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1846 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1847 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1848 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1849 emit_byte(0x89);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1850 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1851 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1852
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1853 void Assembler::movzbl(Register dst, Address src) { // movzxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1854 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1855 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1856 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1857 emit_byte(0xB6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1858 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1859 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1860
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1861 void Assembler::movzbl(Register dst, Register src) { // movzxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1862 NOT_LP64(assert(src->has_byte_register(), "must have byte register"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1863 int encode = prefix_and_encode(dst->encoding(), src->encoding(), true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1864 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1865 emit_byte(0xB6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1866 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1867 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1868
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1869 void Assembler::movzwl(Register dst, Address src) { // movzxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1870 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1871 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1872 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1873 emit_byte(0xB7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1874 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1875 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1876
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1877 void Assembler::movzwl(Register dst, Register src) { // movzxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1878 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1879 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1880 emit_byte(0xB7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1881 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1882 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1883
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1884 void Assembler::mull(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1885 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1886 prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1887 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1888 emit_operand(rsp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1889 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1890
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1891 void Assembler::mull(Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1892 int encode = prefix_and_encode(src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1893 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1894 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1895 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1896
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1897 void Assembler::mulsd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1898 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1899 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1900 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1901 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1902 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1903 emit_byte(0x59);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1904 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1905 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1906
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1907 void Assembler::mulsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1908 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1909 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1910 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1911 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1912 emit_byte(0x59);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1913 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1914 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1915
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1916 void Assembler::mulss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1917 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1918 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1919 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1920 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1921 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1922 emit_byte(0x59);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1923 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1924 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1925
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1926 void Assembler::mulss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1927 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1928 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1929 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1930 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1931 emit_byte(0x59);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1932 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1933 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1934
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1935 void Assembler::negl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1936 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1937 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1938 emit_byte(0xD8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1939 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1940
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 void Assembler::nop(int i) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1942 #ifdef ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 assert(i > 0, " ");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1944 // The fancy nops aren't currently recognized by debuggers making it a
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1945 // pain to disassemble code while debugging. If asserts are on clearly
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1946 // speed is not an issue so simply use the single byte traditional nop
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1947 // to do alignment.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1948
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1949 for (; i > 0 ; i--) emit_byte(0x90);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1950 return;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1951
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1952 #endif // ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1953
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 if (UseAddressNop && VM_Version::is_intel()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 // Using multi-bytes nops "0x0F 0x1F [address]" for Intel
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 // 1: 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 // 2: 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 // 3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 // 4: 0x0F 0x1F 0x40 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 // 5: 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 // 6: 0x66 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 // 7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 // 8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 // 9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 // 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 // 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1968
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 // The rest coding is Intel specific - don't use consecutive address nops
a61af66fc99e Initial load
duke
parents:
diff changeset
1970
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 // 12: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 // 13: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 // 14: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 // 15: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1975
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 while(i >= 15) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 // For Intel don't generate consecutive addess nops (mix with regular nops)
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 i -= 15;
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 switch (i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 case 14:
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 case 13:
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 case 12:
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 case 11:
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 case 10:
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 case 9:
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 case 8:
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 case 7:
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 addr_nop_7();
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 case 6:
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 case 5:
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 addr_nop_5();
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 case 4:
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 addr_nop_4();
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 case 3:
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 // Don't use "0x0F 0x1F 0x00" - need patching safe padding
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
2026 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 assert(i == 0, " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 if (UseAddressNop && VM_Version::is_amd()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 // Using multi-bytes nops "0x0F 0x1F [address]" for AMD.
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 // 1: 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 // 2: 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 // 3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 // 4: 0x0F 0x1F 0x40 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2040 // 5: 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 // 6: 0x66 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 // 7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 // 8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 // 9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 // 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 // 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2047
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 // The rest coding is AMD specific - use consecutive address nops
a61af66fc99e Initial load
duke
parents:
diff changeset
2049
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 // 12: 0x66 0x0F 0x1F 0x44 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 // 13: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 // 14: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 // 15: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 // 16: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 // Size prefixes (0x66) are added for larger sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
2056
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 while(i >= 22) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 i -= 11;
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 // Generate first nop for size between 21-12
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 switch (i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 case 21:
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 case 20:
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 case 19:
a61af66fc99e Initial load
duke
parents:
diff changeset
2071 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 case 18:
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 case 17:
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 case 16:
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 case 15:
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 i -= 8;
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 case 14:
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 case 13:
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 i -= 7;
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 addr_nop_7();
a61af66fc99e Initial load
duke
parents:
diff changeset
2086 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 case 12:
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 i -= 6;
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 addr_nop_5();
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 assert(i < 12, " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2095
a61af66fc99e Initial load
duke
parents:
diff changeset
2096 // Generate second nop for size between 11-1
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 switch (i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 case 11:
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 case 10:
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 case 9:
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 case 8:
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 case 7:
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 addr_nop_7();
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 case 6:
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 case 5:
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 addr_nop_5();
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 case 4:
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 addr_nop_4();
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 case 3:
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 // Don't use "0x0F 0x1F 0x00" - need patching safe padding
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 assert(i == 0, " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2131
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 // Using nops with size prefixes "0x66 0x90".
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 // From AMD Optimization Guide:
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 // 1: 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 // 2: 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 // 3: 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 // 4: 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 // 5: 0x66 0x66 0x90 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 // 6: 0x66 0x66 0x90 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 // 7: 0x66 0x66 0x66 0x90 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 // 8: 0x66 0x66 0x66 0x90 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 // 9: 0x66 0x66 0x90 0x66 0x66 0x90 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 // 10: 0x66 0x66 0x66 0x90 0x66 0x66 0x90 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 while(i > 12) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 i -= 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 // 1 - 12 nops
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 if(i > 8) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 if(i > 9) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 i -= 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 emit_byte(0x90);
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 // 1 - 8 nops
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 if(i > 4) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 if(i > 6) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 i -= 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 emit_byte(0x90);
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 switch (i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 case 4:
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 case 3:
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 emit_byte(0x90);
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 assert(i == 0, " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2188
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2189 void Assembler::notl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2190 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2191 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2192 emit_byte(0xD0 | encode );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2193 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2194
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2195 void Assembler::orl(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2196 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2197 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2198 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2199 emit_operand(rcx, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2200 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2201 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2202
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2203 void Assembler::orl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2204 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2205 emit_arith(0x81, 0xC8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2206 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2207
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2208
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2209 void Assembler::orl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2210 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2211 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2212 emit_byte(0x0B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2213 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2214 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2215
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2216
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2217 void Assembler::orl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2218 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2219 emit_arith(0x0B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2220 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2221
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2222 void Assembler::pcmpestri(XMMRegister dst, Address src, int imm8) {
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2223 assert(VM_Version::supports_sse4_2(), "");
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2224
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2225 InstructionMark im(this);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2226 emit_byte(0x66);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2227 prefix(src, dst);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2228 emit_byte(0x0F);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2229 emit_byte(0x3A);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2230 emit_byte(0x61);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2231 emit_operand(dst, src);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2232 emit_byte(imm8);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2233 }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2234
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2235 void Assembler::pcmpestri(XMMRegister dst, XMMRegister src, int imm8) {
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2236 assert(VM_Version::supports_sse4_2(), "");
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2237
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2238 emit_byte(0x66);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2239 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2240 emit_byte(0x0F);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2241 emit_byte(0x3A);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2242 emit_byte(0x61);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2243 emit_byte(0xC0 | encode);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2244 emit_byte(imm8);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2245 }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2246
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2247 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2248 void Assembler::pop(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2249 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2250 emit_byte(0x58 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2251 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2252
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2253 void Assembler::popcntl(Register dst, Address src) {
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2254 assert(VM_Version::supports_popcnt(), "must support");
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2255 InstructionMark im(this);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2256 emit_byte(0xF3);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2257 prefix(src, dst);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2258 emit_byte(0x0F);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2259 emit_byte(0xB8);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2260 emit_operand(dst, src);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2261 }
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2262
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2263 void Assembler::popcntl(Register dst, Register src) {
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2264 assert(VM_Version::supports_popcnt(), "must support");
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2265 emit_byte(0xF3);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2266 int encode = prefix_and_encode(dst->encoding(), src->encoding());
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2267 emit_byte(0x0F);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2268 emit_byte(0xB8);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2269 emit_byte(0xC0 | encode);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2270 }
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2271
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2272 void Assembler::popf() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2273 emit_byte(0x9D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2274 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2275
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
2276 #ifndef _LP64 // no 32bit push/pop on amd64
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2277 void Assembler::popl(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2278 // NOTE: this will adjust stack by 8byte on 64bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2279 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2280 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2281 emit_byte(0x8F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2282 emit_operand(rax, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2283 }
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
2284 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2285
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2286 void Assembler::prefetch_prefix(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2287 prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2288 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2289 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2290
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2291 void Assembler::prefetchnta(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2292 NOT_LP64(assert(VM_Version::supports_sse2(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2293 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2294 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2295 emit_byte(0x18);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2296 emit_operand(rax, src); // 0, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2297 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2298
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2299 void Assembler::prefetchr(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2300 NOT_LP64(assert(VM_Version::supports_3dnow(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2301 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2302 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2303 emit_byte(0x0D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2304 emit_operand(rax, src); // 0, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2305 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2306
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2307 void Assembler::prefetcht0(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2308 NOT_LP64(assert(VM_Version::supports_sse(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2309 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2310 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2311 emit_byte(0x18);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2312 emit_operand(rcx, src); // 1, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2313 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2314
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2315 void Assembler::prefetcht1(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2316 NOT_LP64(assert(VM_Version::supports_sse(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2317 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2318 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2319 emit_byte(0x18);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2320 emit_operand(rdx, src); // 2, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2321 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2322
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2323 void Assembler::prefetcht2(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2324 NOT_LP64(assert(VM_Version::supports_sse(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2325 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2326 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2327 emit_byte(0x18);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2328 emit_operand(rbx, src); // 3, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2329 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2330
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2331 void Assembler::prefetchw(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2332 NOT_LP64(assert(VM_Version::supports_3dnow(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2333 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2334 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2335 emit_byte(0x0D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2336 emit_operand(rcx, src); // 1, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2337 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2338
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2339 void Assembler::prefix(Prefix p) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2340 a_byte(p);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2341 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2342
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2343 void Assembler::pshufd(XMMRegister dst, XMMRegister src, int mode) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2344 assert(isByte(mode), "invalid value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2345 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2346
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2347 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2348 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2349 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2350 emit_byte(0x70);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2351 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2352 emit_byte(mode & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2353
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2354 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2355
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2356 void Assembler::pshufd(XMMRegister dst, Address src, int mode) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2357 assert(isByte(mode), "invalid value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2358 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2359
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2360 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2361 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2362 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2363 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2364 emit_byte(0x70);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2365 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2366 emit_byte(mode & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2367 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2368
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2369 void Assembler::pshuflw(XMMRegister dst, XMMRegister src, int mode) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2370 assert(isByte(mode), "invalid value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2371 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2372
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2373 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2374 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2375 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2376 emit_byte(0x70);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2377 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2378 emit_byte(mode & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2379 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2380
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2381 void Assembler::pshuflw(XMMRegister dst, Address src, int mode) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2382 assert(isByte(mode), "invalid value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2383 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2384
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2385 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2386 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2387 prefix(src, dst); // QQ new
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2388 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2389 emit_byte(0x70);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2390 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2391 emit_byte(mode & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2392 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2393
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2394 void Assembler::psrlq(XMMRegister dst, int shift) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2395 // HMM Table D-1 says sse2 or mmx
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2396 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2397
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2398 int encode = prefixq_and_encode(xmm2->encoding(), dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2399 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2400 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2401 emit_byte(0x73);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2402 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2403 emit_byte(shift);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2404 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2405
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2406 void Assembler::ptest(XMMRegister dst, Address src) {
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2407 assert(VM_Version::supports_sse4_1(), "");
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2408
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2409 InstructionMark im(this);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2410 emit_byte(0x66);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2411 prefix(src, dst);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2412 emit_byte(0x0F);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2413 emit_byte(0x38);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2414 emit_byte(0x17);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2415 emit_operand(dst, src);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2416 }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2417
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2418 void Assembler::ptest(XMMRegister dst, XMMRegister src) {
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2419 assert(VM_Version::supports_sse4_1(), "");
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2420
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2421 emit_byte(0x66);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2422 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2423 emit_byte(0x0F);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2424 emit_byte(0x38);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2425 emit_byte(0x17);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2426 emit_byte(0xC0 | encode);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2427 }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2428
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2429 void Assembler::punpcklbw(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2430 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2431 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2432 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2433 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2434 emit_byte(0x60);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2435 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2436 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2437
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2438 void Assembler::push(int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2439 // in 64bits we push 64bits onto the stack but only
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2440 // take a 32bit immediate
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2441 emit_byte(0x68);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2442 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2443 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2444
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2445 void Assembler::push(Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2446 int encode = prefix_and_encode(src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2447
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2448 emit_byte(0x50 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2449 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2450
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2451 void Assembler::pushf() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2452 emit_byte(0x9C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2453 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2454
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
2455 #ifndef _LP64 // no 32bit push/pop on amd64
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2456 void Assembler::pushl(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2457 // Note this will push 64bit on 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2458 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2459 prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2460 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2461 emit_operand(rsi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2462 }
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
2463 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2464
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2465 void Assembler::pxor(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2466 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2467 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2468 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2469 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2470 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2471 emit_byte(0xEF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2472 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2473 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2474
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2475 void Assembler::pxor(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2476 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2477 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2478 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2479 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2480 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2481 emit_byte(0xEF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2482 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2483 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2484
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2485 void Assembler::rcll(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2486 assert(isShiftCount(imm8), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2487 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2488 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2489 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2490 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2491 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2492 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2493 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2494 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2495 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2496 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2497
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2498 // copies data from [esi] to [edi] using rcx pointer sized words
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2499 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2500 void Assembler::rep_mov() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2501 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2502 // MOVSQ
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2503 LP64_ONLY(prefix(REX_W));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2504 emit_byte(0xA5);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2505 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2506
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2507 // sets rcx pointer sized words with rax, value at [edi]
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2508 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2509 void Assembler::rep_set() { // rep_set
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2510 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2511 // STOSQ
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2512 LP64_ONLY(prefix(REX_W));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2513 emit_byte(0xAB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2514 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2515
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2516 // scans rcx pointer sized words at [edi] for occurance of rax,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2517 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2518 void Assembler::repne_scan() { // repne_scan
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2519 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2520 // SCASQ
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2521 LP64_ONLY(prefix(REX_W));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2522 emit_byte(0xAF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2523 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2524
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2525 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2526 // scans rcx 4 byte words at [edi] for occurance of rax,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2527 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2528 void Assembler::repne_scanl() { // repne_scan
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2529 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2530 // SCASL
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2531 emit_byte(0xAF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2532 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2533 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2534
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2535 void Assembler::ret(int imm16) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2536 if (imm16 == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2537 emit_byte(0xC3);
a61af66fc99e Initial load
duke
parents:
diff changeset
2538 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2539 emit_byte(0xC2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2540 emit_word(imm16);
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2542 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2543
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2544 void Assembler::sahf() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2545 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2546 // Not supported in 64bit mode
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2547 ShouldNotReachHere();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2548 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2549 emit_byte(0x9E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2550 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2551
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2552 void Assembler::sarl(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2553 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2554 assert(isShiftCount(imm8), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2555 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2556 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2557 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2558 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2559 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2560 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2561 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2562 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2563 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2564
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2565 void Assembler::sarl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2566 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2567 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2568 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2569 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2570
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2571 void Assembler::sbbl(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2572 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2573 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2574 emit_arith_operand(0x81, rbx, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2575 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2576
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2577 void Assembler::sbbl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2578 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2579 emit_arith(0x81, 0xD8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2580 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2581
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2582
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2583 void Assembler::sbbl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2584 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2585 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2586 emit_byte(0x1B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2587 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2588 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2589
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2590 void Assembler::sbbl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2591 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2592 emit_arith(0x1B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2593 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2594
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2595 void Assembler::setb(Condition cc, Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2596 assert(0 <= cc && cc < 16, "illegal cc");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2597 int encode = prefix_and_encode(dst->encoding(), true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2599 emit_byte(0x90 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2600 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2601 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2602
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2603 void Assembler::shll(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2604 assert(isShiftCount(imm8), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2605 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2606 if (imm8 == 1 ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2607 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2608 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2609 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2610 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2611 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2612 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2613 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2614 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2615
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2616 void Assembler::shll(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2617 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2618 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2619 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2620 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2621
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2622 void Assembler::shrl(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2623 assert(isShiftCount(imm8), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2624 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2625 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2626 emit_byte(0xE8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2627 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2628 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2629
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2630 void Assembler::shrl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2631 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2632 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2633 emit_byte(0xE8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2634 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2635
a61af66fc99e Initial load
duke
parents:
diff changeset
2636 // copies a single word from [esi] to [edi]
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 void Assembler::smovl() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 emit_byte(0xA5);
a61af66fc99e Initial load
duke
parents:
diff changeset
2639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2640
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2641 void Assembler::sqrtsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2642 // HMM Table D-1 says sse2
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2643 // NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2644 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2645 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2646 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2647 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2648 emit_byte(0x51);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2649 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2650 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2651
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2652 void Assembler::stmxcsr( Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2653 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2654 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2655 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2656 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2657 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2658 emit_operand(as_Register(3), dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2659 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2660
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2661 void Assembler::subl(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2662 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2663 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2664 if (is8bit(imm32)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2665 emit_byte(0x83);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2666 emit_operand(rbp, dst, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2667 emit_byte(imm32 & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2668 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2669 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2670 emit_operand(rbp, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2671 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2672 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2673 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2674
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2675 void Assembler::subl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2676 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2677 emit_arith(0x81, 0xE8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2678 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2679
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2680 void Assembler::subl(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2681 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2682 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2683 emit_byte(0x29);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2684 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2685 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2686
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2687 void Assembler::subl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2688 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2689 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2690 emit_byte(0x2B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2691 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2692 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2693
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2694 void Assembler::subl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2695 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2696 emit_arith(0x2B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2697 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2698
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2699 void Assembler::subsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2700 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2701 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2702 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2703 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2704 emit_byte(0x5C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2705 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2706 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2707
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2708 void Assembler::subsd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2709 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2710 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2711 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2712 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2713 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2714 emit_byte(0x5C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2715 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2716 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2717
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2718 void Assembler::subss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2719 NOT_LP64(assert(VM_Version::supports_sse(), ""));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2720 emit_byte(0xF3);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2721 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2722 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2723 emit_byte(0x5C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2724 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2725 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2726
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2727 void Assembler::subss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2728 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2729 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2730 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2731 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2732 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2733 emit_byte(0x5C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2734 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2735 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2736
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2737 void Assembler::testb(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2738 NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2739 (void) prefix_and_encode(dst->encoding(), true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2740 emit_arith_b(0xF6, 0xC0, dst, imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2741 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2742
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2743 void Assembler::testl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2744 // not using emit_arith because test
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2745 // doesn't support sign-extension of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2746 // 8bit operands
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2747 int encode = dst->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2748 if (encode == 0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2749 emit_byte(0xA9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2750 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2751 encode = prefix_and_encode(encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2752 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2753 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2754 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2755 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2756 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2757
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2758 void Assembler::testl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2759 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2760 emit_arith(0x85, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2761 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2762
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2763 void Assembler::testl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2764 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2765 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2766 emit_byte(0x85);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2767 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2768 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2769
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2770 void Assembler::ucomisd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2771 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2772 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2773 ucomiss(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2774 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2775
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2776 void Assembler::ucomisd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2777 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2778 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2779 ucomiss(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2780 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2781
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2782 void Assembler::ucomiss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2783 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2784
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2785 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2786 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2787 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2788 emit_byte(0x2E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2789 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2790 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2791
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2792 void Assembler::ucomiss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2793 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2794 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2795 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2796 emit_byte(0x2E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2797 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2798 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2799
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2800
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2801 void Assembler::xaddl(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2802 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2803 prefix(dst, src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2804 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2805 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2806 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2807 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2808
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2809 void Assembler::xchgl(Register dst, Address src) { // xchg
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2810 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2811 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2812 emit_byte(0x87);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2813 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2814 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2815
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2816 void Assembler::xchgl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2817 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2818 emit_byte(0x87);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2819 emit_byte(0xc0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2820 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2821
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2822 void Assembler::xorl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2823 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2824 emit_arith(0x81, 0xF0, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2825 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2826
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2827 void Assembler::xorl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2828 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2829 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2830 emit_byte(0x33);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2831 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2832 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2833
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2834 void Assembler::xorl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2835 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2836 emit_arith(0x33, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2837 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2838
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2839 void Assembler::xorpd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2840 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2841 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2842 xorps(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2843 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2844
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2845 void Assembler::xorpd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2846 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2847 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2848 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2849 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2850 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2851 emit_byte(0x57);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2852 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2853 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2854
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2855
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2856 void Assembler::xorps(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2857 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2858 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2859 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2860 emit_byte(0x57);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2861 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2862 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2863
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2864 void Assembler::xorps(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2865 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2866 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2867 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2868 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2869 emit_byte(0x57);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2870 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2871 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2872
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2873 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2874 // 32bit only pieces of the assembler
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2875
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2876 void Assembler::cmp_literal32(Register src1, int32_t imm32, RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2877 // NO PREFIX AS NEVER 64BIT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2878 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2879 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2880 emit_byte(0xF8 | src1->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2881 emit_data(imm32, rspec, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2882 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2883
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2884 void Assembler::cmp_literal32(Address src1, int32_t imm32, RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2885 // NO PREFIX AS NEVER 64BIT (not even 32bit versions of 64bit regs
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2886 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2887 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2888 emit_operand(rdi, src1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2889 emit_data(imm32, rspec, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2890 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2891
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2892 // The 64-bit (32bit platform) cmpxchg compares the value at adr with the contents of rdx:rax,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2893 // and stores rcx:rbx into adr if so; otherwise, the value at adr is loaded
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2894 // into rdx:rax. The ZF is set if the compared values were equal, and cleared otherwise.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2895 void Assembler::cmpxchg8(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2896 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2897 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2898 emit_byte(0xc7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2899 emit_operand(rcx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2900 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2901
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2902 void Assembler::decl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2903 // Don't use it directly. Use MacroAssembler::decrementl() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2904 emit_byte(0x48 | dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2905 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2906
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2907 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2908
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2909 // 64bit typically doesn't use the x87 but needs to for the trig funcs
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2910
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2911 void Assembler::fabs() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2912 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2913 emit_byte(0xE1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2914 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2915
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2916 void Assembler::fadd(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2917 emit_farith(0xD8, 0xC0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2918 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2919
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2920 void Assembler::fadd_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2921 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2922 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2923 emit_operand32(rax, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2924 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2925
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2926 void Assembler::fadd_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2927 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2928 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2929 emit_operand32(rax, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2930 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2931
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2932 void Assembler::fadda(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2933 emit_farith(0xDC, 0xC0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2934 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2935
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2936 void Assembler::faddp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2937 emit_farith(0xDE, 0xC0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2938 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2939
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2940 void Assembler::fchs() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2941 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2942 emit_byte(0xE0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2943 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2944
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2945 void Assembler::fcom(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2946 emit_farith(0xD8, 0xD0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2947 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2948
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2949 void Assembler::fcomp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2950 emit_farith(0xD8, 0xD8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2951 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2952
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2953 void Assembler::fcomp_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2954 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2955 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2956 emit_operand32(rbx, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2957 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2958
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2959 void Assembler::fcomp_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2960 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2961 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2962 emit_operand32(rbx, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2963 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2964
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2965 void Assembler::fcompp() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2966 emit_byte(0xDE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2967 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2968 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2969
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2970 void Assembler::fcos() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2971 emit_byte(0xD9);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2972 emit_byte(0xFF);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2973 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2974
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2975 void Assembler::fdecstp() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2976 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2977 emit_byte(0xF6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2978 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2979
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2980 void Assembler::fdiv(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2981 emit_farith(0xD8, 0xF0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2982 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2983
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2984 void Assembler::fdiv_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2985 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2986 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2987 emit_operand32(rsi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2988 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2989
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2990 void Assembler::fdiv_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2991 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2992 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2993 emit_operand32(rsi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2994 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2995
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2996 void Assembler::fdiva(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2997 emit_farith(0xDC, 0xF8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2998 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2999
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3000 // Note: The Intel manual (Pentium Processor User's Manual, Vol.3, 1994)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3001 // is erroneous for some of the floating-point instructions below.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3002
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3003 void Assembler::fdivp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3004 emit_farith(0xDE, 0xF8, i); // ST(0) <- ST(0) / ST(1) and pop (Intel manual wrong)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3005 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3006
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3007 void Assembler::fdivr(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3008 emit_farith(0xD8, 0xF8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3009 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3010
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3011 void Assembler::fdivr_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3012 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3013 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3014 emit_operand32(rdi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3015 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3016
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3017 void Assembler::fdivr_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3018 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3019 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3020 emit_operand32(rdi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3021 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3022
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3023 void Assembler::fdivra(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3024 emit_farith(0xDC, 0xF0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3025 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3026
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3027 void Assembler::fdivrp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3028 emit_farith(0xDE, 0xF0, i); // ST(0) <- ST(1) / ST(0) and pop (Intel manual wrong)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3029 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3030
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3031 void Assembler::ffree(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3032 emit_farith(0xDD, 0xC0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3033 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3034
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3035 void Assembler::fild_d(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3036 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3037 emit_byte(0xDF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3038 emit_operand32(rbp, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3039 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3040
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3041 void Assembler::fild_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3042 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3043 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3044 emit_operand32(rax, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3045 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3046
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3047 void Assembler::fincstp() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3048 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3049 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3050 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3051
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3052 void Assembler::finit() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3053 emit_byte(0x9B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3054 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3055 emit_byte(0xE3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3056 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3057
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3058 void Assembler::fist_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3059 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3060 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3061 emit_operand32(rdx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3062 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3063
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3064 void Assembler::fistp_d(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3065 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3066 emit_byte(0xDF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3067 emit_operand32(rdi, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3068 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3069
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3070 void Assembler::fistp_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3071 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3072 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3073 emit_operand32(rbx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3074 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3075
a61af66fc99e Initial load
duke
parents:
diff changeset
3076 void Assembler::fld1() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3077 emit_byte(0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
3078 emit_byte(0xE8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3079 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3080
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3081 void Assembler::fld_d(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3082 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3083 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3084 emit_operand32(rax, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3085 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3086
a61af66fc99e Initial load
duke
parents:
diff changeset
3087 void Assembler::fld_s(Address adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3088 InstructionMark im(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3089 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3090 emit_operand32(rax, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3091 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3092
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3093
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3094 void Assembler::fld_s(int index) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3095 emit_farith(0xD9, 0xC0, index);
a61af66fc99e Initial load
duke
parents:
diff changeset
3096 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3097
a61af66fc99e Initial load
duke
parents:
diff changeset
3098 void Assembler::fld_x(Address adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3099 InstructionMark im(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3100 emit_byte(0xDB);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3101 emit_operand32(rbp, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3102 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3103
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3104 void Assembler::fldcw(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3105 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3106 emit_byte(0xd9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3107 emit_operand32(rbp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3108 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3109
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3110 void Assembler::fldenv(Address src) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3111 InstructionMark im(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3112 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3113 emit_operand32(rsp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3114 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3115
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3116 void Assembler::fldlg2() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3117 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3118 emit_byte(0xEC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3119 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3120
a61af66fc99e Initial load
duke
parents:
diff changeset
3121 void Assembler::fldln2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3122 emit_byte(0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
3123 emit_byte(0xED);
a61af66fc99e Initial load
duke
parents:
diff changeset
3124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3125
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3126 void Assembler::fldz() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3127 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3128 emit_byte(0xEE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3129 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3130
a61af66fc99e Initial load
duke
parents:
diff changeset
3131 void Assembler::flog() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3132 fldln2();
a61af66fc99e Initial load
duke
parents:
diff changeset
3133 fxch();
a61af66fc99e Initial load
duke
parents:
diff changeset
3134 fyl2x();
a61af66fc99e Initial load
duke
parents:
diff changeset
3135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3136
a61af66fc99e Initial load
duke
parents:
diff changeset
3137 void Assembler::flog10() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3138 fldlg2();
a61af66fc99e Initial load
duke
parents:
diff changeset
3139 fxch();
a61af66fc99e Initial load
duke
parents:
diff changeset
3140 fyl2x();
a61af66fc99e Initial load
duke
parents:
diff changeset
3141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3142
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3143 void Assembler::fmul(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3144 emit_farith(0xD8, 0xC8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3145 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3146
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3147 void Assembler::fmul_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3148 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3149 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3150 emit_operand32(rcx, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3151 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3152
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3153 void Assembler::fmul_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3154 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3155 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3156 emit_operand32(rcx, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3157 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3158
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3159 void Assembler::fmula(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3160 emit_farith(0xDC, 0xC8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3161 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3162
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3163 void Assembler::fmulp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3164 emit_farith(0xDE, 0xC8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3165 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3166
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3167 void Assembler::fnsave(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3168 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3169 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3170 emit_operand32(rsi, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3171 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3172
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3173 void Assembler::fnstcw(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3174 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3175 emit_byte(0x9B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3176 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3177 emit_operand32(rdi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3178 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3179
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3180 void Assembler::fnstsw_ax() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3181 emit_byte(0xdF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3182 emit_byte(0xE0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3183 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3184
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3185 void Assembler::fprem() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3186 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3187 emit_byte(0xF8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3188 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3189
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3190 void Assembler::fprem1() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3191 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3192 emit_byte(0xF5);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3193 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3194
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3195 void Assembler::frstor(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3196 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3197 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3198 emit_operand32(rsp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3199 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3200
a61af66fc99e Initial load
duke
parents:
diff changeset
3201 void Assembler::fsin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3202 emit_byte(0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
3203 emit_byte(0xFE);
a61af66fc99e Initial load
duke
parents:
diff changeset
3204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3205
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3206 void Assembler::fsqrt() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3207 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3208 emit_byte(0xFA);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3209 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3210
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3211 void Assembler::fst_d(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3212 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3213 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3214 emit_operand32(rdx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3215 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3216
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3217 void Assembler::fst_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3218 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3219 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3220 emit_operand32(rdx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3221 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3222
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3223 void Assembler::fstp_d(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3224 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3225 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3226 emit_operand32(rbx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3227 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3228
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3229 void Assembler::fstp_d(int index) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3230 emit_farith(0xDD, 0xD8, index);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3231 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3232
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3233 void Assembler::fstp_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3234 InstructionMark im(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3235 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3236 emit_operand32(rbx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3237 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3238
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3239 void Assembler::fstp_x(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3240 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3241 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3242 emit_operand32(rdi, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3243 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3244
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3245 void Assembler::fsub(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3246 emit_farith(0xD8, 0xE0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3247 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3248
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3249 void Assembler::fsub_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3250 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3251 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3252 emit_operand32(rsp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3253 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3254
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3255 void Assembler::fsub_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3256 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3257 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3258 emit_operand32(rsp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3259 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3260
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3261 void Assembler::fsuba(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3262 emit_farith(0xDC, 0xE8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3263 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3264
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3265 void Assembler::fsubp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3266 emit_farith(0xDE, 0xE8, i); // ST(0) <- ST(0) - ST(1) and pop (Intel manual wrong)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3267 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3268
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3269 void Assembler::fsubr(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3270 emit_farith(0xD8, 0xE8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3271 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3272
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3273 void Assembler::fsubr_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3274 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3275 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3276 emit_operand32(rbp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3277 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3278
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3279 void Assembler::fsubr_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3280 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3281 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3282 emit_operand32(rbp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3283 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3284
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3285 void Assembler::fsubra(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3286 emit_farith(0xDC, 0xE0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3287 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3288
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3289 void Assembler::fsubrp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3290 emit_farith(0xDE, 0xE0, i); // ST(0) <- ST(1) - ST(0) and pop (Intel manual wrong)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3292
a61af66fc99e Initial load
duke
parents:
diff changeset
3293 void Assembler::ftan() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3294 emit_byte(0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
3295 emit_byte(0xF2);
a61af66fc99e Initial load
duke
parents:
diff changeset
3296 emit_byte(0xDD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3297 emit_byte(0xD8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3299
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3300 void Assembler::ftst() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3301 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3302 emit_byte(0xE4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3303 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3304
a61af66fc99e Initial load
duke
parents:
diff changeset
3305 void Assembler::fucomi(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3306 // make sure the instruction is supported (introduced for P6, together with cmov)
a61af66fc99e Initial load
duke
parents:
diff changeset
3307 guarantee(VM_Version::supports_cmov(), "illegal instruction");
a61af66fc99e Initial load
duke
parents:
diff changeset
3308 emit_farith(0xDB, 0xE8, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3310
a61af66fc99e Initial load
duke
parents:
diff changeset
3311 void Assembler::fucomip(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3312 // make sure the instruction is supported (introduced for P6, together with cmov)
a61af66fc99e Initial load
duke
parents:
diff changeset
3313 guarantee(VM_Version::supports_cmov(), "illegal instruction");
a61af66fc99e Initial load
duke
parents:
diff changeset
3314 emit_farith(0xDF, 0xE8, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3316
a61af66fc99e Initial load
duke
parents:
diff changeset
3317 void Assembler::fwait() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3318 emit_byte(0x9B);
a61af66fc99e Initial load
duke
parents:
diff changeset
3319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3320
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3321 void Assembler::fxch(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3322 emit_farith(0xD9, 0xC8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3323 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3324
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3325 void Assembler::fyl2x() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3326 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3327 emit_byte(0xF1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3328 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3329
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3330
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3331 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3332
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3333 void Assembler::incl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3334 // Don't use it directly. Use MacroAssembler::incrementl() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3335 emit_byte(0x40 | dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3336 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3337
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3338 void Assembler::lea(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3339 leal(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3340 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3341
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3342 void Assembler::mov_literal32(Address dst, int32_t imm32, RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3343 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3344 emit_byte(0xC7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3345 emit_operand(rax, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3346 emit_data((int)imm32, rspec, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3347 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3348
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3349 void Assembler::mov_literal32(Register dst, int32_t imm32, RelocationHolder const& rspec) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3350 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3351 int encode = prefix_and_encode(dst->encoding());
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3352 emit_byte(0xB8 | encode);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3353 emit_data((int)imm32, rspec, 0);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3354 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3355
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3356 void Assembler::popa() { // 32bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3357 emit_byte(0x61);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3358 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3359
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3360 void Assembler::push_literal32(int32_t imm32, RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3361 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3362 emit_byte(0x68);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3363 emit_data(imm32, rspec, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3364 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3365
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3366 void Assembler::pusha() { // 32bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3367 emit_byte(0x60);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3368 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3369
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3370 void Assembler::set_byte_if_not_zero(Register dst) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3371 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3372 emit_byte(0x95);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3373 emit_byte(0xE0 | dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3374 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3375
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3376 void Assembler::shldl(Register dst, Register src) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3377 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3378 emit_byte(0xA5);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3379 emit_byte(0xC0 | src->encoding() << 3 | dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3380 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3381
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3382 void Assembler::shrdl(Register dst, Register src) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3383 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3384 emit_byte(0xAD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3385 emit_byte(0xC0 | src->encoding() << 3 | dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3386 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3387
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3388 #else // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3389
1369
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3390 void Assembler::set_byte_if_not_zero(Register dst) {
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3391 int enc = prefix_and_encode(dst->encoding(), true);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3392 emit_byte(0x0F);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3393 emit_byte(0x95);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3394 emit_byte(0xE0 | enc);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3395 }
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3396
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3397 // 64bit only pieces of the assembler
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3398 // This should only be used by 64bit instructions that can use rip-relative
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3399 // it cannot be used by instructions that want an immediate value.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3400
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3401 bool Assembler::reachable(AddressLiteral adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3402 int64_t disp;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3403 // None will force a 64bit literal to the code stream. Likely a placeholder
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3404 // for something that will be patched later and we need to certain it will
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3405 // always be reachable.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3406 if (adr.reloc() == relocInfo::none) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3407 return false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3408 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3409 if (adr.reloc() == relocInfo::internal_word_type) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3410 // This should be rip relative and easily reachable.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3411 return true;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3412 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3413 if (adr.reloc() == relocInfo::virtual_call_type ||
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3414 adr.reloc() == relocInfo::opt_virtual_call_type ||
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3415 adr.reloc() == relocInfo::static_call_type ||
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3416 adr.reloc() == relocInfo::static_stub_type ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3417 // This should be rip relative within the code cache and easily
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3418 // reachable until we get huge code caches. (At which point
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3419 // ic code is going to have issues).
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3420 return true;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3421 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3422 if (adr.reloc() != relocInfo::external_word_type &&
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3423 adr.reloc() != relocInfo::poll_return_type && // these are really external_word but need special
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3424 adr.reloc() != relocInfo::poll_type && // relocs to identify them
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3425 adr.reloc() != relocInfo::runtime_call_type ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3426 return false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3427 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3428
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3429 // Stress the correction code
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3430 if (ForceUnreachable) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3431 // Must be runtimecall reloc, see if it is in the codecache
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3432 // Flipping stuff in the codecache to be unreachable causes issues
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3433 // with things like inline caches where the additional instructions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3434 // are not handled.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3435 if (CodeCache::find_blob(adr._target) == NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3436 return false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3437 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3438 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3439 // For external_word_type/runtime_call_type if it is reachable from where we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3440 // are now (possibly a temp buffer) and where we might end up
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3441 // anywhere in the codeCache then we are always reachable.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3442 // This would have to change if we ever save/restore shared code
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3443 // to be more pessimistic.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3444
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3445 disp = (int64_t)adr._target - ((int64_t)CodeCache::low_bound() + sizeof(int));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3446 if (!is_simm32(disp)) return false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3447 disp = (int64_t)adr._target - ((int64_t)CodeCache::high_bound() + sizeof(int));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3448 if (!is_simm32(disp)) return false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3449
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3450 disp = (int64_t)adr._target - ((int64_t)_code_pos + sizeof(int));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3451
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3452 // Because rip relative is a disp + address_of_next_instruction and we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3453 // don't know the value of address_of_next_instruction we apply a fudge factor
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3454 // to make sure we will be ok no matter the size of the instruction we get placed into.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3455 // We don't have to fudge the checks above here because they are already worst case.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3456
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3457 // 12 == override/rex byte, opcode byte, rm byte, sib byte, a 4-byte disp , 4-byte literal
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3458 // + 4 because better safe than sorry.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3459 const int fudge = 12 + 4;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3460 if (disp < 0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3461 disp -= fudge;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3462 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3463 disp += fudge;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3464 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3465 return is_simm32(disp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3466 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3467
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3468 void Assembler::emit_data64(jlong data,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3469 relocInfo::relocType rtype,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3470 int format) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3471 if (rtype == relocInfo::none) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3472 emit_long64(data);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3473 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3474 emit_data64(data, Relocation::spec_simple(rtype), format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3475 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3476 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3477
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3478 void Assembler::emit_data64(jlong data,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3479 RelocationHolder const& rspec,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3480 int format) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3481 assert(imm_operand == 0, "default format must be immediate in this file");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3482 assert(imm_operand == format, "must be immediate");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3483 assert(inst_mark() != NULL, "must be inside InstructionMark");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3484 // Do not use AbstractAssembler::relocate, which is not intended for
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3485 // embedded words. Instead, relocate to the enclosing instruction.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3486 code_section()->relocate(inst_mark(), rspec, format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3487 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3488 check_relocation(rspec, format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3489 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3490 emit_long64(data);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3491 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3492
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3493 int Assembler::prefix_and_encode(int reg_enc, bool byteinst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3494 if (reg_enc >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3495 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3496 reg_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3497 } else if (byteinst && reg_enc >= 4) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3498 prefix(REX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3499 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3500 return reg_enc;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3501 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3502
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3503 int Assembler::prefixq_and_encode(int reg_enc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3504 if (reg_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3505 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3506 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3507 prefix(REX_WB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3508 reg_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3509 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3510 return reg_enc;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3511 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3512
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3513 int Assembler::prefix_and_encode(int dst_enc, int src_enc, bool byteinst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3514 if (dst_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3515 if (src_enc >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3516 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3517 src_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3518 } else if (byteinst && src_enc >= 4) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3519 prefix(REX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3520 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3521 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3522 if (src_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3523 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3524 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3525 prefix(REX_RB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3526 src_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3527 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3528 dst_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3529 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3530 return dst_enc << 3 | src_enc;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3531 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3532
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3533 int Assembler::prefixq_and_encode(int dst_enc, int src_enc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3534 if (dst_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3535 if (src_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3536 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3537 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3538 prefix(REX_WB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3539 src_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3540 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3541 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3542 if (src_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3543 prefix(REX_WR);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3544 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3545 prefix(REX_WRB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3546 src_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3547 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3548 dst_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3549 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3550 return dst_enc << 3 | src_enc;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3551 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3552
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3553 void Assembler::prefix(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3554 if (reg->encoding() >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3555 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3556 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3557 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3558
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3559 void Assembler::prefix(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3560 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3561 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3562 prefix(REX_XB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3563 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3564 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3565 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3566 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3567 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3568 prefix(REX_X);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3569 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3570 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3571 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3572
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3573 void Assembler::prefixq(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3574 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3575 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3576 prefix(REX_WXB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3577 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3578 prefix(REX_WB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3579 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3580 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3581 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3582 prefix(REX_WX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3583 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3584 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3585 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3586 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3587 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3588
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3589
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3590 void Assembler::prefix(Address adr, Register reg, bool byteinst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3591 if (reg->encoding() < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3592 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3593 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3594 prefix(REX_XB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3595 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3596 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3597 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3598 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3599 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3600 prefix(REX_X);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3601 } else if (reg->encoding() >= 4 ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3602 prefix(REX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3603 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3604 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3605 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3606 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3607 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3608 prefix(REX_RXB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3609 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3610 prefix(REX_RB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3611 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3612 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3613 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3614 prefix(REX_RX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3615 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3616 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3617 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3618 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3619 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3620 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3621
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3622 void Assembler::prefixq(Address adr, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3623 if (src->encoding() < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3624 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3625 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3626 prefix(REX_WXB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3627 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3628 prefix(REX_WB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3629 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3630 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3631 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3632 prefix(REX_WX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3633 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3634 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3635 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3636 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3637 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3638 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3639 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3640 prefix(REX_WRXB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3641 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3642 prefix(REX_WRB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3643 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3644 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3645 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3646 prefix(REX_WRX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3647 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3648 prefix(REX_WR);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3649 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3650 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3651 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3652 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3653
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3654 void Assembler::prefix(Address adr, XMMRegister reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3655 if (reg->encoding() < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3656 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3657 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3658 prefix(REX_XB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3659 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3660 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3661 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3662 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3663 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3664 prefix(REX_X);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3665 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3666 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3667 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3668 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3669 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3670 prefix(REX_RXB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3671 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3672 prefix(REX_RB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3673 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3674 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3675 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3676 prefix(REX_RX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3677 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3678 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3679 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3680 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3681 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3682 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3683
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3684 void Assembler::adcq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3685 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3686 emit_arith(0x81, 0xD0, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3687 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3688
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3689 void Assembler::adcq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3690 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3691 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3692 emit_byte(0x13);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3693 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3694 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3695
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3696 void Assembler::adcq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3697 (int) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3698 emit_arith(0x13, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3699 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3700
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3701 void Assembler::addq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3702 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3703 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3704 emit_arith_operand(0x81, rax, dst,imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3705 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3706
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3707 void Assembler::addq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3708 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3709 prefixq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3710 emit_byte(0x01);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3711 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3712 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3713
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3714 void Assembler::addq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3715 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3716 emit_arith(0x81, 0xC0, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3717 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3718
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3719 void Assembler::addq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3720 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3721 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3722 emit_byte(0x03);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3723 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3724 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3725
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3726 void Assembler::addq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3727 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3728 emit_arith(0x03, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3729 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3730
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3731 void Assembler::andq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3732 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3733 emit_arith(0x81, 0xE0, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3734 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3735
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3736 void Assembler::andq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3737 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3738 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3739 emit_byte(0x23);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3740 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3741 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3742
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3743 void Assembler::andq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3744 (int) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3745 emit_arith(0x23, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3746 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3747
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3748 void Assembler::bsfq(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3749 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3750 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3751 emit_byte(0xBC);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3752 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3753 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3754
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3755 void Assembler::bsrq(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3756 assert(!VM_Version::supports_lzcnt(), "encoding is treated as LZCNT");
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3757 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3758 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3759 emit_byte(0xBD);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3760 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3761 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3762
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3763 void Assembler::bswapq(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3764 int encode = prefixq_and_encode(reg->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3765 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3766 emit_byte(0xC8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3767 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3768
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3769 void Assembler::cdqq() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3770 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3771 emit_byte(0x99);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3772 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3773
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3774 void Assembler::clflush(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3775 prefix(adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3776 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3777 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3778 emit_operand(rdi, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3779 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3780
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3781 void Assembler::cmovq(Condition cc, Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3782 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3783 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3784 emit_byte(0x40 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3785 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3786 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3787
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3788 void Assembler::cmovq(Condition cc, Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3789 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3790 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3791 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3792 emit_byte(0x40 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3793 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3794 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3795
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3796 void Assembler::cmpq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3797 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3798 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3799 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3800 emit_operand(rdi, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3801 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3802 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3803
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3804 void Assembler::cmpq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3805 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3806 emit_arith(0x81, 0xF8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3807 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3808
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3809 void Assembler::cmpq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3810 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3811 prefixq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3812 emit_byte(0x3B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3813 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3814 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3815
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3816 void Assembler::cmpq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3817 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3818 emit_arith(0x3B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3819 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3820
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3821 void Assembler::cmpq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3822 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3823 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3824 emit_byte(0x3B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3825 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3826 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3827
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3828 void Assembler::cmpxchgq(Register reg, Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3829 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3830 prefixq(adr, reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3831 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3832 emit_byte(0xB1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3833 emit_operand(reg, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3834 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3835
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3836 void Assembler::cvtsi2sdq(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3837 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3838 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3839 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3840 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3841 emit_byte(0x2A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3842 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3843 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3844
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3845 void Assembler::cvtsi2ssq(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3846 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3847 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3848 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3849 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3850 emit_byte(0x2A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3851 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3852 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3853
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3854 void Assembler::cvttsd2siq(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3855 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3856 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3857 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3858 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3859 emit_byte(0x2C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3860 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3861 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3862
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3863 void Assembler::cvttss2siq(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3864 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3865 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3866 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3867 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3868 emit_byte(0x2C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3869 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3870 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3871
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3872 void Assembler::decl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3873 // Don't use it directly. Use MacroAssembler::decrementl() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3874 // Use two-byte form (one-byte form is a REX prefix in 64-bit mode)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3875 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3876 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3877 emit_byte(0xC8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3878 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3879
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3880 void Assembler::decq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3881 // Don't use it directly. Use MacroAssembler::decrementq() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3882 // Use two-byte form (one-byte from is a REX prefix in 64-bit mode)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3883 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3884 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3885 emit_byte(0xC8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3886 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3887
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3888 void Assembler::decq(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3889 // Don't use it directly. Use MacroAssembler::decrementq() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3890 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3891 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3892 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3893 emit_operand(rcx, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3894 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3895
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3896 void Assembler::fxrstor(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3897 prefixq(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3898 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3899 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3900 emit_operand(as_Register(1), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3901 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3902
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3903 void Assembler::fxsave(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3904 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3905 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3906 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3907 emit_operand(as_Register(0), dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3908 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3909
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3910 void Assembler::idivq(Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3911 int encode = prefixq_and_encode(src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3912 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3913 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3914 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3915
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3916 void Assembler::imulq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3917 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3918 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3919 emit_byte(0xAF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3920 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3921 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3922
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3923 void Assembler::imulq(Register dst, Register src, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3924 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3925 if (is8bit(value)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3926 emit_byte(0x6B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3927 emit_byte(0xC0 | encode);
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1846
diff changeset
3928 emit_byte(value & 0xFF);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3929 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3930 emit_byte(0x69);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3931 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3932 emit_long(value);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3933 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3934 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3935
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3936 void Assembler::incl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3937 // Don't use it directly. Use MacroAssembler::incrementl() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3938 // Use two-byte form (one-byte from is a REX prefix in 64-bit mode)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3939 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3940 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3941 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3942 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3943
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3944 void Assembler::incq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3945 // Don't use it directly. Use MacroAssembler::incrementq() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3946 // Use two-byte form (one-byte from is a REX prefix in 64-bit mode)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3947 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3948 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3949 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3950 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3951
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3952 void Assembler::incq(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3953 // Don't use it directly. Use MacroAssembler::incrementq() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3954 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3955 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3956 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3957 emit_operand(rax, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3958 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3959
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3960 void Assembler::lea(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3961 leaq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3962 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3963
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3964 void Assembler::leaq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3965 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3966 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3967 emit_byte(0x8D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3968 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3969 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3970
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3971 void Assembler::mov64(Register dst, int64_t imm64) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3972 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3973 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3974 emit_byte(0xB8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3975 emit_long64(imm64);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3976 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3977
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3978 void Assembler::mov_literal64(Register dst, intptr_t imm64, RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3979 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3980 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3981 emit_byte(0xB8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3982 emit_data64(imm64, rspec);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3983 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3984
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3985 void Assembler::mov_narrow_oop(Register dst, int32_t imm32, RelocationHolder const& rspec) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3986 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3987 int encode = prefix_and_encode(dst->encoding());
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3988 emit_byte(0xB8 | encode);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3989 emit_data((int)imm32, rspec, narrow_oop_operand);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3990 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3991
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3992 void Assembler::mov_narrow_oop(Address dst, int32_t imm32, RelocationHolder const& rspec) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3993 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3994 prefix(dst);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3995 emit_byte(0xC7);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3996 emit_operand(rax, dst, 4);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3997 emit_data((int)imm32, rspec, narrow_oop_operand);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3998 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3999
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4000 void Assembler::cmp_narrow_oop(Register src1, int32_t imm32, RelocationHolder const& rspec) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4001 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4002 int encode = prefix_and_encode(src1->encoding());
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4003 emit_byte(0x81);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4004 emit_byte(0xF8 | encode);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4005 emit_data((int)imm32, rspec, narrow_oop_operand);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4006 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4007
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4008 void Assembler::cmp_narrow_oop(Address src1, int32_t imm32, RelocationHolder const& rspec) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4009 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4010 prefix(src1);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4011 emit_byte(0x81);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4012 emit_operand(rax, src1, 4);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4013 emit_data((int)imm32, rspec, narrow_oop_operand);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4014 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4015
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4016 void Assembler::lzcntq(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4017 assert(VM_Version::supports_lzcnt(), "encoding is treated as BSR");
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4018 emit_byte(0xF3);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4019 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4020 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4021 emit_byte(0xBD);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4022 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4023 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4024
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4025 void Assembler::movdq(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4026 // table D-1 says MMX/SSE2
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4027 NOT_LP64(assert(VM_Version::supports_sse2() || VM_Version::supports_mmx(), ""));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4028 emit_byte(0x66);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4029 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4030 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4031 emit_byte(0x6E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4032 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4033 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4034
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4035 void Assembler::movdq(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4036 // table D-1 says MMX/SSE2
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4037 NOT_LP64(assert(VM_Version::supports_sse2() || VM_Version::supports_mmx(), ""));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4038 emit_byte(0x66);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4039 // swap src/dst to get correct prefix
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4040 int encode = prefixq_and_encode(src->encoding(), dst->encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4041 emit_byte(0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
4042 emit_byte(0x7E);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4043 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4044 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4045
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4046 void Assembler::movq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4047 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4048 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4049 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4050 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4051
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4052 void Assembler::movq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4053 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4054 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4055 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4056 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4057 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4058
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4059 void Assembler::movq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4060 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4061 prefixq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4062 emit_byte(0x89);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4063 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4064 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4065
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4066 void Assembler::movsbq(Register dst, Address src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4067 InstructionMark im(this);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4068 prefixq(src, dst);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4069 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4070 emit_byte(0xBE);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4071 emit_operand(dst, src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4072 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4073
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4074 void Assembler::movsbq(Register dst, Register src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4075 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4076 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4077 emit_byte(0xBE);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4078 emit_byte(0xC0 | encode);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4079 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4080
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4081 void Assembler::movslq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4082 // dbx shows movslq(rcx, 3) as movq $0x0000000049000000,(%rbx)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4083 // and movslq(r8, 3); as movl $0x0000000048000000,(%rbx)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4084 // as a result we shouldn't use until tested at runtime...
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4085 ShouldNotReachHere();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4086 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4087 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4088 emit_byte(0xC7 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4089 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4090 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4091
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4092 void Assembler::movslq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4093 assert(is_simm32(imm32), "lost bits");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4094 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4095 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4096 emit_byte(0xC7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4097 emit_operand(rax, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4098 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4099 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4100
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4101 void Assembler::movslq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4102 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4103 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4104 emit_byte(0x63);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4105 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4106 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4107
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4108 void Assembler::movslq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4109 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4110 emit_byte(0x63);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4111 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4112 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4113
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4114 void Assembler::movswq(Register dst, Address src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4115 InstructionMark im(this);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4116 prefixq(src, dst);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4117 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4118 emit_byte(0xBF);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4119 emit_operand(dst, src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4120 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4121
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4122 void Assembler::movswq(Register dst, Register src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4123 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4124 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4125 emit_byte(0xBF);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4126 emit_byte(0xC0 | encode);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4127 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4128
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4129 void Assembler::movzbq(Register dst, Address src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4130 InstructionMark im(this);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4131 prefixq(src, dst);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4132 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4133 emit_byte(0xB6);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4134 emit_operand(dst, src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4135 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4136
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4137 void Assembler::movzbq(Register dst, Register src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4138 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4139 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4140 emit_byte(0xB6);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4141 emit_byte(0xC0 | encode);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4142 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4143
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4144 void Assembler::movzwq(Register dst, Address src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4145 InstructionMark im(this);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4146 prefixq(src, dst);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4147 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4148 emit_byte(0xB7);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4149 emit_operand(dst, src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4150 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4151
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4152 void Assembler::movzwq(Register dst, Register src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4153 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4154 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4155 emit_byte(0xB7);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4156 emit_byte(0xC0 | encode);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4157 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4158
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4159 void Assembler::negq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4160 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4161 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4162 emit_byte(0xD8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4163 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4164
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4165 void Assembler::notq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4166 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4167 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4168 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4169 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4170
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4171 void Assembler::orq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4172 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4173 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4174 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4175 emit_operand(rcx, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4176 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4177 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4178
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4179 void Assembler::orq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4180 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4181 emit_arith(0x81, 0xC8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4182 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4183
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4184 void Assembler::orq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4185 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4186 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4187 emit_byte(0x0B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4188 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4189 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4190
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4191 void Assembler::orq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4192 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4193 emit_arith(0x0B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4194 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4195
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4196 void Assembler::popa() { // 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4197 movq(r15, Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4198 movq(r14, Address(rsp, wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4199 movq(r13, Address(rsp, 2 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4200 movq(r12, Address(rsp, 3 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4201 movq(r11, Address(rsp, 4 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4202 movq(r10, Address(rsp, 5 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4203 movq(r9, Address(rsp, 6 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4204 movq(r8, Address(rsp, 7 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4205 movq(rdi, Address(rsp, 8 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4206 movq(rsi, Address(rsp, 9 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4207 movq(rbp, Address(rsp, 10 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4208 // skip rsp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4209 movq(rbx, Address(rsp, 12 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4210 movq(rdx, Address(rsp, 13 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4211 movq(rcx, Address(rsp, 14 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4212 movq(rax, Address(rsp, 15 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4213
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4214 addq(rsp, 16 * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4215 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4216
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4217 void Assembler::popcntq(Register dst, Address src) {
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4218 assert(VM_Version::supports_popcnt(), "must support");
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4219 InstructionMark im(this);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4220 emit_byte(0xF3);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4221 prefixq(src, dst);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4222 emit_byte(0x0F);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4223 emit_byte(0xB8);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4224 emit_operand(dst, src);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4225 }
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4226
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4227 void Assembler::popcntq(Register dst, Register src) {
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4228 assert(VM_Version::supports_popcnt(), "must support");
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4229 emit_byte(0xF3);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4230 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4231 emit_byte(0x0F);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4232 emit_byte(0xB8);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4233 emit_byte(0xC0 | encode);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4234 }
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4235
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4236 void Assembler::popq(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4237 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4238 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4239 emit_byte(0x8F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4240 emit_operand(rax, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4241 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4242
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4243 void Assembler::pusha() { // 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4244 // we have to store original rsp. ABI says that 128 bytes
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4245 // below rsp are local scratch.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4246 movq(Address(rsp, -5 * wordSize), rsp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4247
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4248 subq(rsp, 16 * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4249
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4250 movq(Address(rsp, 15 * wordSize), rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4251 movq(Address(rsp, 14 * wordSize), rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4252 movq(Address(rsp, 13 * wordSize), rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4253 movq(Address(rsp, 12 * wordSize), rbx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4254 // skip rsp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4255 movq(Address(rsp, 10 * wordSize), rbp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4256 movq(Address(rsp, 9 * wordSize), rsi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4257 movq(Address(rsp, 8 * wordSize), rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4258 movq(Address(rsp, 7 * wordSize), r8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4259 movq(Address(rsp, 6 * wordSize), r9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4260 movq(Address(rsp, 5 * wordSize), r10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4261 movq(Address(rsp, 4 * wordSize), r11);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4262 movq(Address(rsp, 3 * wordSize), r12);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4263 movq(Address(rsp, 2 * wordSize), r13);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4264 movq(Address(rsp, wordSize), r14);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4265 movq(Address(rsp, 0), r15);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4266 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4267
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4268 void Assembler::pushq(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4269 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4270 prefixq(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4271 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4272 emit_operand(rsi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4273 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4274
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4275 void Assembler::rclq(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4276 assert(isShiftCount(imm8 >> 1), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4277 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4278 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4279 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4280 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4281 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4282 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4283 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4284 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4285 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4286 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4287 void Assembler::sarq(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4288 assert(isShiftCount(imm8 >> 1), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4289 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4290 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4291 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4292 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4293 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4294 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4295 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4296 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4297 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4298 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4299
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4300 void Assembler::sarq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4301 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4302 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4303 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4304 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4305 void Assembler::sbbq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4306 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4307 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4308 emit_arith_operand(0x81, rbx, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4309 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4310
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4311 void Assembler::sbbq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4312 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4313 emit_arith(0x81, 0xD8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4314 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4315
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4316 void Assembler::sbbq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4317 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4318 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4319 emit_byte(0x1B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4320 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4321 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4322
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4323 void Assembler::sbbq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4324 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4325 emit_arith(0x1B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4326 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4327
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4328 void Assembler::shlq(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4329 assert(isShiftCount(imm8 >> 1), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4330 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4331 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4332 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4333 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4334 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4335 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4336 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4337 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4338 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4339 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4340
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4341 void Assembler::shlq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4342 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4343 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4344 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4345 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4346
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4347 void Assembler::shrq(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4348 assert(isShiftCount(imm8 >> 1), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4349 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4350 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4351 emit_byte(0xE8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4352 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4353 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4354
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4355 void Assembler::shrq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4356 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4357 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4358 emit_byte(0xE8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4359 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4360
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4361 void Assembler::sqrtsd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4362 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4363 InstructionMark im(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
4364 emit_byte(0xF2);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4365 prefix(src, dst);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4366 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4367 emit_byte(0x51);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4368 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4369 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4370
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4371 void Assembler::subq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4372 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4373 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4374 if (is8bit(imm32)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4375 emit_byte(0x83);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4376 emit_operand(rbp, dst, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4377 emit_byte(imm32 & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4378 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4379 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4380 emit_operand(rbp, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4381 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4382 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4383 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4384
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4385 void Assembler::subq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4386 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4387 emit_arith(0x81, 0xE8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4388 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4389
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4390 void Assembler::subq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4391 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4392 prefixq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4393 emit_byte(0x29);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4394 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4395 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4396
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4397 void Assembler::subq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4398 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4399 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4400 emit_byte(0x2B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4401 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4402 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4403
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4404 void Assembler::subq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4405 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4406 emit_arith(0x2B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4407 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4408
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4409 void Assembler::testq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4410 // not using emit_arith because test
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4411 // doesn't support sign-extension of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4412 // 8bit operands
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4413 int encode = dst->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4414 if (encode == 0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4415 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4416 emit_byte(0xA9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4417 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4418 encode = prefixq_and_encode(encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4419 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4420 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4421 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4422 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4423 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4424
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4425 void Assembler::testq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4426 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4427 emit_arith(0x85, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4428 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4429
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4430 void Assembler::xaddq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4431 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4432 prefixq(dst, src);
71
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
4433 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4434 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4435 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4436 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4437
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4438 void Assembler::xchgq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4439 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4440 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4441 emit_byte(0x87);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4442 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4443 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4444
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4445 void Assembler::xchgq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4446 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4447 emit_byte(0x87);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4448 emit_byte(0xc0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4449 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4450
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4451 void Assembler::xorq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4452 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4453 emit_arith(0x33, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4454 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4455
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4456 void Assembler::xorq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4457 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4458 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4459 emit_byte(0x33);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4460 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4461 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4462
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4463 #endif // !LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4464
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4465 static Assembler::Condition reverse[] = {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4466 Assembler::noOverflow /* overflow = 0x0 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4467 Assembler::overflow /* noOverflow = 0x1 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4468 Assembler::aboveEqual /* carrySet = 0x2, below = 0x2 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4469 Assembler::below /* aboveEqual = 0x3, carryClear = 0x3 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4470 Assembler::notZero /* zero = 0x4, equal = 0x4 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4471 Assembler::zero /* notZero = 0x5, notEqual = 0x5 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4472 Assembler::above /* belowEqual = 0x6 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4473 Assembler::belowEqual /* above = 0x7 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4474 Assembler::positive /* negative = 0x8 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4475 Assembler::negative /* positive = 0x9 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4476 Assembler::noParity /* parity = 0xa */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4477 Assembler::parity /* noParity = 0xb */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4478 Assembler::greaterEqual /* less = 0xc */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4479 Assembler::less /* greaterEqual = 0xd */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4480 Assembler::greater /* lessEqual = 0xe */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4481 Assembler::lessEqual /* greater = 0xf, */
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4482
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4483 };
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4484
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4485
a61af66fc99e Initial load
duke
parents:
diff changeset
4486 // Implementation of MacroAssembler
a61af66fc99e Initial load
duke
parents:
diff changeset
4487
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4488 // First all the versions that have distinct versions depending on 32/64 bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4489 // Unless the difference is trivial (1 line or so).
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4490
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4491 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4492
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4493 // 32bit versions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4494
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4495 Address MacroAssembler::as_Address(AddressLiteral adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4496 return Address(adr.target(), adr.rspec());
a61af66fc99e Initial load
duke
parents:
diff changeset
4497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4498
a61af66fc99e Initial load
duke
parents:
diff changeset
4499 Address MacroAssembler::as_Address(ArrayAddress adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4500 return Address::make_array(adr);
a61af66fc99e Initial load
duke
parents:
diff changeset
4501 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4502
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4503 int MacroAssembler::biased_locking_enter(Register lock_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4504 Register obj_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4505 Register swap_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4506 Register tmp_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4507 bool swap_reg_contains_mark,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4508 Label& done,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4509 Label* slow_case,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4510 BiasedLockingCounters* counters) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4511 assert(UseBiasedLocking, "why call this otherwise?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4512 assert(swap_reg == rax, "swap_reg must be rax, for cmpxchg");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4513 assert_different_registers(lock_reg, obj_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4514
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4515 if (PrintBiasedLockingStatistics && counters == NULL)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4516 counters = BiasedLocking::counters();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4517
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4518 bool need_tmp_reg = false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4519 if (tmp_reg == noreg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4520 need_tmp_reg = true;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4521 tmp_reg = lock_reg;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4522 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4523 assert_different_registers(lock_reg, obj_reg, swap_reg, tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4524 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4525 assert(markOopDesc::age_shift == markOopDesc::lock_bits + markOopDesc::biased_lock_bits, "biased locking makes assumptions about bit layout");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4526 Address mark_addr (obj_reg, oopDesc::mark_offset_in_bytes());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4527 Address klass_addr (obj_reg, oopDesc::klass_offset_in_bytes());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4528 Address saved_mark_addr(lock_reg, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4529
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4530 // Biased locking
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4531 // See whether the lock is currently biased toward our thread and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4532 // whether the epoch is still valid
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4533 // Note that the runtime guarantees sufficient alignment of JavaThread
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4534 // pointers to allow age to be placed into low bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4535 // First check to see whether biasing is even enabled for this object
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4536 Label cas_label;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4537 int null_check_offset = -1;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4538 if (!swap_reg_contains_mark) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4539 null_check_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4540 movl(swap_reg, mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4541 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4542 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4543 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4544 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4545 movl(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4546 andl(tmp_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4547 cmpl(tmp_reg, markOopDesc::biased_lock_pattern);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4548 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4549 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4550 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4551 jcc(Assembler::notEqual, cas_label);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4552 // The bias pattern is present in the object's header. Need to check
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4553 // whether the bias owner and the epoch are both still current.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4554 // Note that because there is no current thread register on x86 we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4555 // need to store off the mark word we read out of the object to
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4556 // avoid reloading it and needing to recheck invariants below. This
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4557 // store is unfortunate but it makes the overall code shorter and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4558 // simpler.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4559 movl(saved_mark_addr, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4560 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4561 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4562 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4563 get_thread(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4564 xorl(swap_reg, tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4565 if (swap_reg_contains_mark) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4566 null_check_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4567 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4568 movl(tmp_reg, klass_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4569 xorl(swap_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4570 andl(swap_reg, ~((int) markOopDesc::age_mask_in_place));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4571 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4572 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4573 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4574 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4575 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4576 ExternalAddress((address)counters->biased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4577 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4578 jcc(Assembler::equal, done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4579
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4580 Label try_revoke_bias;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4581 Label try_rebias;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4582
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4583 // At this point we know that the header has the bias pattern and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4584 // that we are not the bias owner in the current epoch. We need to
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4585 // figure out more details about the state of the header in order to
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4586 // know what operations can be legally performed on the object's
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4587 // header.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4588
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4589 // If the low three bits in the xor result aren't clear, that means
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4590 // the prototype header is no longer biased and we have to revoke
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4591 // the bias on this object.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4592 testl(swap_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4593 jcc(Assembler::notZero, try_revoke_bias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4594
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4595 // Biasing is still enabled for this data type. See whether the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4596 // epoch of the current bias is still valid, meaning that the epoch
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4597 // bits of the mark word are equal to the epoch bits of the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4598 // prototype header. (Note that the prototype header's epoch bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4599 // only change at a safepoint.) If not, attempt to rebias the object
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4600 // toward the current thread. Note that we must be absolutely sure
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4601 // that the current epoch is invalid in order to do this because
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4602 // otherwise the manipulations it performs on the mark word are
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4603 // illegal.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4604 testl(swap_reg, markOopDesc::epoch_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4605 jcc(Assembler::notZero, try_rebias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4606
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4607 // The epoch of the current bias is still valid but we know nothing
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4608 // about the owner; it might be set or it might be clear. Try to
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4609 // acquire the bias of the object using an atomic operation. If this
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4610 // fails we will go in to the runtime to revoke the object's bias.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4611 // Note that we first construct the presumed unbiased header so we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4612 // don't accidentally blow away another thread's valid bias.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4613 movl(swap_reg, saved_mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4614 andl(swap_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4615 markOopDesc::biased_lock_mask_in_place | markOopDesc::age_mask_in_place | markOopDesc::epoch_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4616 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4617 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4618 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4619 get_thread(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4620 orl(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4621 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4622 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4623 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4624 cmpxchgptr(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4625 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4626 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4627 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4628 // If the biasing toward our thread failed, this means that
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4629 // another thread succeeded in biasing it toward itself and we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4630 // need to revoke that bias. The revocation will occur in the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4631 // interpreter runtime in the slow case.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4632 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4633 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4634 ExternalAddress((address)counters->anonymously_biased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4635 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4636 if (slow_case != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4637 jcc(Assembler::notZero, *slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4638 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4639 jmp(done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4640
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4641 bind(try_rebias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4642 // At this point we know the epoch has expired, meaning that the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4643 // current "bias owner", if any, is actually invalid. Under these
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4644 // circumstances _only_, we are allowed to use the current header's
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4645 // value as the comparison value when doing the cas to acquire the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4646 // bias in the current epoch. In other words, we allow transfer of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4647 // the bias from one thread to another directly in this situation.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4648 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4649 // FIXME: due to a lack of registers we currently blow away the age
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4650 // bits in this situation. Should attempt to preserve them.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4651 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4652 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4653 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4654 get_thread(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4655 movl(swap_reg, klass_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4656 orl(tmp_reg, Address(swap_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4657 movl(swap_reg, saved_mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4658 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4659 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4660 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4661 cmpxchgptr(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4662 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4663 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4664 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4665 // If the biasing toward our thread failed, then another thread
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4666 // succeeded in biasing it toward itself and we need to revoke that
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4667 // bias. The revocation will occur in the runtime in the slow case.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4668 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4669 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4670 ExternalAddress((address)counters->rebiased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4671 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4672 if (slow_case != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4673 jcc(Assembler::notZero, *slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4674 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4675 jmp(done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4676
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4677 bind(try_revoke_bias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4678 // The prototype mark in the klass doesn't have the bias bit set any
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4679 // more, indicating that objects of this data type are not supposed
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4680 // to be biased any more. We are going to try to reset the mark of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4681 // this object to the prototype value and fall through to the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4682 // CAS-based locking scheme. Note that if our CAS fails, it means
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4683 // that another thread raced us for the privilege of revoking the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4684 // bias of this particular object, so it's okay to continue in the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4685 // normal locking code.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4686 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4687 // FIXME: due to a lack of registers we currently blow away the age
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4688 // bits in this situation. Should attempt to preserve them.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4689 movl(swap_reg, saved_mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4690 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4691 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4692 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4693 movl(tmp_reg, klass_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4694 movl(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4695 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4696 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4697 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4698 cmpxchgptr(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4699 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4700 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4701 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4702 // Fall through to the normal CAS-based lock, because no matter what
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4703 // the result of the above CAS, some thread must have succeeded in
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4704 // removing the bias bit from the object's header.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4705 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4706 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4707 ExternalAddress((address)counters->revoked_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4708 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4709
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4710 bind(cas_label);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4711
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4712 return null_check_offset;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4713 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4714 void MacroAssembler::call_VM_leaf_base(address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4715 int number_of_arguments) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4716 call(RuntimeAddress(entry_point));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4717 increment(rsp, number_of_arguments * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4718 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4719
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4720 void MacroAssembler::cmpoop(Address src1, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4721 cmp_literal32(src1, (int32_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4722 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4723
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4724 void MacroAssembler::cmpoop(Register src1, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4725 cmp_literal32(src1, (int32_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4726 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4727
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4728 void MacroAssembler::extend_sign(Register hi, Register lo) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4729 // According to Intel Doc. AP-526, "Integer Divide", p.18.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4730 if (VM_Version::is_P6() && hi == rdx && lo == rax) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4731 cdql();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4732 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4733 movl(hi, lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4734 sarl(hi, 31);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4735 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4736 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4737
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4738 void MacroAssembler::fat_nop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4739 // A 5 byte nop that is safe for patching (see patch_verified_entry)
a61af66fc99e Initial load
duke
parents:
diff changeset
4740 emit_byte(0x26); // es:
a61af66fc99e Initial load
duke
parents:
diff changeset
4741 emit_byte(0x2e); // cs:
a61af66fc99e Initial load
duke
parents:
diff changeset
4742 emit_byte(0x64); // fs:
a61af66fc99e Initial load
duke
parents:
diff changeset
4743 emit_byte(0x65); // gs:
a61af66fc99e Initial load
duke
parents:
diff changeset
4744 emit_byte(0x90);
a61af66fc99e Initial load
duke
parents:
diff changeset
4745 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4746
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4747 void MacroAssembler::jC2(Register tmp, Label& L) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4748 // set parity bit if FPU flag C2 is set (via rax)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4749 save_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4750 fwait(); fnstsw_ax();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4751 sahf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4752 restore_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4753 // branch
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4754 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4755 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4756
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4757 void MacroAssembler::jnC2(Register tmp, Label& L) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4758 // set parity bit if FPU flag C2 is set (via rax)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4759 save_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4760 fwait(); fnstsw_ax();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4761 sahf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4762 restore_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4763 // branch
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4764 jcc(Assembler::noParity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4765 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4766
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4767 // 32bit can do a case table jump in one instruction but we no longer allow the base
a61af66fc99e Initial load
duke
parents:
diff changeset
4768 // to be installed in the Address class
a61af66fc99e Initial load
duke
parents:
diff changeset
4769 void MacroAssembler::jump(ArrayAddress entry) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4770 jmp(as_Address(entry));
a61af66fc99e Initial load
duke
parents:
diff changeset
4771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4772
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4773 // Note: y_lo will be destroyed
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4774 void MacroAssembler::lcmp2int(Register x_hi, Register x_lo, Register y_hi, Register y_lo) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4775 // Long compare for Java (semantics as described in JVM spec.)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4776 Label high, low, done;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4777
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4778 cmpl(x_hi, y_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4779 jcc(Assembler::less, low);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4780 jcc(Assembler::greater, high);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4781 // x_hi is the return register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4782 xorl(x_hi, x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4783 cmpl(x_lo, y_lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4784 jcc(Assembler::below, low);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4785 jcc(Assembler::equal, done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4786
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4787 bind(high);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4788 xorl(x_hi, x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4789 increment(x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4790 jmp(done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4791
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4792 bind(low);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4793 xorl(x_hi, x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4794 decrementl(x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4795
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4796 bind(done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4797 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4798
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4799 void MacroAssembler::lea(Register dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4800 mov_literal32(dst, (int32_t)src.target(), src.rspec());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4801 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4802
a61af66fc99e Initial load
duke
parents:
diff changeset
4803 void MacroAssembler::lea(Address dst, AddressLiteral adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4804 // leal(dst, as_Address(adr));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4805 // see note in movl as to why we must use a move
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4806 mov_literal32(dst, (int32_t) adr.target(), adr.rspec());
a61af66fc99e Initial load
duke
parents:
diff changeset
4807 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4808
a61af66fc99e Initial load
duke
parents:
diff changeset
4809 void MacroAssembler::leave() {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4810 mov(rsp, rbp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4811 pop(rbp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4812 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4813
a61af66fc99e Initial load
duke
parents:
diff changeset
4814 void MacroAssembler::lmul(int x_rsp_offset, int y_rsp_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4815 // Multiplication of two Java long values stored on the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
4816 // as illustrated below. Result is in rdx:rax.
a61af66fc99e Initial load
duke
parents:
diff changeset
4817 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4818 // rsp ---> [ ?? ] \ \
a61af66fc99e Initial load
duke
parents:
diff changeset
4819 // .... | y_rsp_offset |
a61af66fc99e Initial load
duke
parents:
diff changeset
4820 // [ y_lo ] / (in bytes) | x_rsp_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
4821 // [ y_hi ] | (in bytes)
a61af66fc99e Initial load
duke
parents:
diff changeset
4822 // .... |
a61af66fc99e Initial load
duke
parents:
diff changeset
4823 // [ x_lo ] /
a61af66fc99e Initial load
duke
parents:
diff changeset
4824 // [ x_hi ]
a61af66fc99e Initial load
duke
parents:
diff changeset
4825 // ....
a61af66fc99e Initial load
duke
parents:
diff changeset
4826 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4827 // Basic idea: lo(result) = lo(x_lo * y_lo)
a61af66fc99e Initial load
duke
parents:
diff changeset
4828 // hi(result) = hi(x_lo * y_lo) + lo(x_hi * y_lo) + lo(x_lo * y_hi)
a61af66fc99e Initial load
duke
parents:
diff changeset
4829 Address x_hi(rsp, x_rsp_offset + wordSize); Address x_lo(rsp, x_rsp_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
4830 Address y_hi(rsp, y_rsp_offset + wordSize); Address y_lo(rsp, y_rsp_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
4831 Label quick;
a61af66fc99e Initial load
duke
parents:
diff changeset
4832 // load x_hi, y_hi and check if quick
a61af66fc99e Initial load
duke
parents:
diff changeset
4833 // multiplication is possible
a61af66fc99e Initial load
duke
parents:
diff changeset
4834 movl(rbx, x_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4835 movl(rcx, y_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4836 movl(rax, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
4837 orl(rbx, rcx); // rbx, = 0 <=> x_hi = 0 and y_hi = 0
a61af66fc99e Initial load
duke
parents:
diff changeset
4838 jcc(Assembler::zero, quick); // if rbx, = 0 do quick multiply
a61af66fc99e Initial load
duke
parents:
diff changeset
4839 // do full multiplication
a61af66fc99e Initial load
duke
parents:
diff changeset
4840 // 1st step
a61af66fc99e Initial load
duke
parents:
diff changeset
4841 mull(y_lo); // x_hi * y_lo
a61af66fc99e Initial load
duke
parents:
diff changeset
4842 movl(rbx, rax); // save lo(x_hi * y_lo) in rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
4843 // 2nd step
a61af66fc99e Initial load
duke
parents:
diff changeset
4844 movl(rax, x_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
4845 mull(rcx); // x_lo * y_hi
a61af66fc99e Initial load
duke
parents:
diff changeset
4846 addl(rbx, rax); // add lo(x_lo * y_hi) to rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
4847 // 3rd step
a61af66fc99e Initial load
duke
parents:
diff changeset
4848 bind(quick); // note: rbx, = 0 if quick multiply!
a61af66fc99e Initial load
duke
parents:
diff changeset
4849 movl(rax, x_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
4850 mull(y_lo); // x_lo * y_lo
a61af66fc99e Initial load
duke
parents:
diff changeset
4851 addl(rdx, rbx); // correct hi(x_lo * y_lo)
a61af66fc99e Initial load
duke
parents:
diff changeset
4852 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4853
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4854 void MacroAssembler::lneg(Register hi, Register lo) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4855 negl(lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4856 adcl(hi, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4857 negl(hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4858 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4859
a61af66fc99e Initial load
duke
parents:
diff changeset
4860 void MacroAssembler::lshl(Register hi, Register lo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4861 // Java shift left long support (semantics as described in JVM spec., p.305)
a61af66fc99e Initial load
duke
parents:
diff changeset
4862 // (basic idea for shift counts s >= n: x << s == (x << n) << (s - n))
a61af66fc99e Initial load
duke
parents:
diff changeset
4863 // shift value is in rcx !
a61af66fc99e Initial load
duke
parents:
diff changeset
4864 assert(hi != rcx, "must not use rcx");
a61af66fc99e Initial load
duke
parents:
diff changeset
4865 assert(lo != rcx, "must not use rcx");
a61af66fc99e Initial load
duke
parents:
diff changeset
4866 const Register s = rcx; // shift count
a61af66fc99e Initial load
duke
parents:
diff changeset
4867 const int n = BitsPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
4868 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
4869 andl(s, 0x3f); // s := s & 0x3f (s < 0x40)
a61af66fc99e Initial load
duke
parents:
diff changeset
4870 cmpl(s, n); // if (s < n)
a61af66fc99e Initial load
duke
parents:
diff changeset
4871 jcc(Assembler::less, L); // else (s >= n)
a61af66fc99e Initial load
duke
parents:
diff changeset
4872 movl(hi, lo); // x := x << n
a61af66fc99e Initial load
duke
parents:
diff changeset
4873 xorl(lo, lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
4874 // Note: subl(s, n) is not needed since the Intel shift instructions work rcx mod n!
a61af66fc99e Initial load
duke
parents:
diff changeset
4875 bind(L); // s (mod n) < n
a61af66fc99e Initial load
duke
parents:
diff changeset
4876 shldl(hi, lo); // x := x << s
a61af66fc99e Initial load
duke
parents:
diff changeset
4877 shll(lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
4878 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4879
a61af66fc99e Initial load
duke
parents:
diff changeset
4880
a61af66fc99e Initial load
duke
parents:
diff changeset
4881 void MacroAssembler::lshr(Register hi, Register lo, bool sign_extension) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4882 // Java shift right long support (semantics as described in JVM spec., p.306 & p.310)
a61af66fc99e Initial load
duke
parents:
diff changeset
4883 // (basic idea for shift counts s >= n: x >> s == (x >> n) >> (s - n))
a61af66fc99e Initial load
duke
parents:
diff changeset
4884 assert(hi != rcx, "must not use rcx");
a61af66fc99e Initial load
duke
parents:
diff changeset
4885 assert(lo != rcx, "must not use rcx");
a61af66fc99e Initial load
duke
parents:
diff changeset
4886 const Register s = rcx; // shift count
a61af66fc99e Initial load
duke
parents:
diff changeset
4887 const int n = BitsPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
4888 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
4889 andl(s, 0x3f); // s := s & 0x3f (s < 0x40)
a61af66fc99e Initial load
duke
parents:
diff changeset
4890 cmpl(s, n); // if (s < n)
a61af66fc99e Initial load
duke
parents:
diff changeset
4891 jcc(Assembler::less, L); // else (s >= n)
a61af66fc99e Initial load
duke
parents:
diff changeset
4892 movl(lo, hi); // x := x >> n
a61af66fc99e Initial load
duke
parents:
diff changeset
4893 if (sign_extension) sarl(hi, 31);
a61af66fc99e Initial load
duke
parents:
diff changeset
4894 else xorl(hi, hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4895 // Note: subl(s, n) is not needed since the Intel shift instructions work rcx mod n!
a61af66fc99e Initial load
duke
parents:
diff changeset
4896 bind(L); // s (mod n) < n
a61af66fc99e Initial load
duke
parents:
diff changeset
4897 shrdl(lo, hi); // x := x >> s
a61af66fc99e Initial load
duke
parents:
diff changeset
4898 if (sign_extension) sarl(hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4899 else shrl(hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4900 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4901
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4902 void MacroAssembler::movoop(Register dst, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4903 mov_literal32(dst, (int32_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4904 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4905
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4906 void MacroAssembler::movoop(Address dst, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4907 mov_literal32(dst, (int32_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4908 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4909
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4910 void MacroAssembler::movptr(Register dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4911 if (src.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4912 mov_literal32(dst, (intptr_t)src.target(), src.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4913 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4914 movl(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4915 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4916 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4917
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4918 void MacroAssembler::movptr(ArrayAddress dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4919 movl(as_Address(dst), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4920 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4921
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4922 void MacroAssembler::movptr(Register dst, ArrayAddress src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4923 movl(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4924 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4925
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4926 // src should NEVER be a real pointer. Use AddressLiteral for true pointers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4927 void MacroAssembler::movptr(Address dst, intptr_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4928 movl(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4929 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4930
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4931
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4932 void MacroAssembler::movsd(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4933 movsd(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4934 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4935
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4936 void MacroAssembler::pop_callee_saved_registers() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4937 pop(rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4938 pop(rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4939 pop(rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4940 pop(rsi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4941 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4942
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4943 void MacroAssembler::pop_fTOS() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4944 fld_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4945 addl(rsp, 2 * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4946 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4947
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4948 void MacroAssembler::push_callee_saved_registers() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4949 push(rsi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4950 push(rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4951 push(rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4952 push(rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4953 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4954
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4955 void MacroAssembler::push_fTOS() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4956 subl(rsp, 2 * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4957 fstp_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4958 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4959
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4960
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4961 void MacroAssembler::pushoop(jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4962 push_literal32((int32_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4963 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4964
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4965
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4966 void MacroAssembler::pushptr(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4967 if (src.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4968 push_literal32((int32_t)src.target(), src.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4969 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4970 pushl(as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4971 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4972 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4973
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4974 void MacroAssembler::set_word_if_not_zero(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4975 xorl(dst, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4976 set_byte_if_not_zero(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4977 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4978
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4979 static void pass_arg0(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4980 masm->push(arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4981 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4982
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4983 static void pass_arg1(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4984 masm->push(arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4985 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4986
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4987 static void pass_arg2(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4988 masm->push(arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4989 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4990
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4991 static void pass_arg3(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4992 masm->push(arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4993 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4994
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4995 #ifndef PRODUCT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4996 extern "C" void findpc(intptr_t x);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4997 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4998
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4999 void MacroAssembler::debug32(int rdi, int rsi, int rbp, int rsp, int rbx, int rdx, int rcx, int rax, int eip, char* msg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5000 // In order to get locks to work, we need to fake a in_VM state
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5001 JavaThread* thread = JavaThread::current();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5002 JavaThreadState saved_state = thread->thread_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5003 thread->set_thread_state(_thread_in_vm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5004 if (ShowMessageBoxOnError) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5005 JavaThread* thread = JavaThread::current();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5006 JavaThreadState saved_state = thread->thread_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5007 thread->set_thread_state(_thread_in_vm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5008 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5009 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5010 BytecodeCounter::print();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5011 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5012 // To see where a verify_oop failed, get $ebx+40/X for this frame.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5013 // This is the value of eip which points to where verify_oop will return.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5014 if (os::message_box(msg, "Execution stopped, print registers?")) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5015 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5016 tty->print_cr("eip = 0x%08x", eip);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5017 #ifndef PRODUCT
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5018 if ((WizardMode || Verbose) && PrintMiscellaneous) {
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5019 tty->cr();
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5020 findpc(eip);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5021 tty->cr();
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5022 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5023 #endif
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5024 tty->print_cr("rax = 0x%08x", rax);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5025 tty->print_cr("rbx = 0x%08x", rbx);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5026 tty->print_cr("rcx = 0x%08x", rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5027 tty->print_cr("rdx = 0x%08x", rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5028 tty->print_cr("rdi = 0x%08x", rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5029 tty->print_cr("rsi = 0x%08x", rsi);
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5030 tty->print_cr("rbp = 0x%08x", rbp);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5031 tty->print_cr("rsp = 0x%08x", rsp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5032 BREAKPOINT;
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5033 assert(false, "start up GDB");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5034 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5035 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5036 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5037 ::tty->print_cr("=============== DEBUG MESSAGE: %s ================\n", msg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5038 assert(false, "DEBUG MESSAGE");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5039 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5040 ThreadStateTransition::transition(thread, _thread_in_vm, saved_state);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5041 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5042
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5043 void MacroAssembler::stop(const char* msg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5044 ExternalAddress message((address)msg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5045 // push address of message
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5046 pushptr(message.addr());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5047 { Label L; call(L, relocInfo::none); bind(L); } // push eip
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5048 pusha(); // push registers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5049 call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug32)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5050 hlt();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5051 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5052
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5053 void MacroAssembler::warn(const char* msg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5054 push_CPU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5055
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5056 ExternalAddress message((address) msg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5057 // push address of message
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5058 pushptr(message.addr());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5059
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5060 call(RuntimeAddress(CAST_FROM_FN_PTR(address, warning)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5061 addl(rsp, wordSize); // discard argument
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5062 pop_CPU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5063 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5064
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5065 #else // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5066
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5067 // 64 bit versions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5068
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5069 Address MacroAssembler::as_Address(AddressLiteral adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5070 // amd64 always does this as a pc-rel
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5071 // we can be absolute or disp based on the instruction type
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5072 // jmp/call are displacements others are absolute
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5073 assert(!adr.is_lval(), "must be rval");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5074 assert(reachable(adr), "must be");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5075 return Address((int32_t)(intptr_t)(adr.target() - pc()), adr.target(), adr.reloc());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5076
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5077 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5078
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5079 Address MacroAssembler::as_Address(ArrayAddress adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5080 AddressLiteral base = adr.base();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5081 lea(rscratch1, base);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5082 Address index = adr.index();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5083 assert(index._disp == 0, "must not have disp"); // maybe it can?
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5084 Address array(rscratch1, index._index, index._scale, index._disp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5085 return array;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5086 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5087
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5088 int MacroAssembler::biased_locking_enter(Register lock_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5089 Register obj_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5090 Register swap_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5091 Register tmp_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5092 bool swap_reg_contains_mark,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5093 Label& done,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5094 Label* slow_case,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5095 BiasedLockingCounters* counters) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5096 assert(UseBiasedLocking, "why call this otherwise?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5097 assert(swap_reg == rax, "swap_reg must be rax for cmpxchgq");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5098 assert(tmp_reg != noreg, "tmp_reg must be supplied");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5099 assert_different_registers(lock_reg, obj_reg, swap_reg, tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5100 assert(markOopDesc::age_shift == markOopDesc::lock_bits + markOopDesc::biased_lock_bits, "biased locking makes assumptions about bit layout");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5101 Address mark_addr (obj_reg, oopDesc::mark_offset_in_bytes());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5102 Address saved_mark_addr(lock_reg, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5103
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5104 if (PrintBiasedLockingStatistics && counters == NULL)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5105 counters = BiasedLocking::counters();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5106
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5107 // Biased locking
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5108 // See whether the lock is currently biased toward our thread and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5109 // whether the epoch is still valid
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5110 // Note that the runtime guarantees sufficient alignment of JavaThread
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5111 // pointers to allow age to be placed into low bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5112 // First check to see whether biasing is even enabled for this object
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5113 Label cas_label;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5114 int null_check_offset = -1;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5115 if (!swap_reg_contains_mark) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5116 null_check_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5117 movq(swap_reg, mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5118 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5119 movq(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5120 andq(tmp_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5121 cmpq(tmp_reg, markOopDesc::biased_lock_pattern);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5122 jcc(Assembler::notEqual, cas_label);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5123 // The bias pattern is present in the object's header. Need to check
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5124 // whether the bias owner and the epoch are both still current.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5125 load_prototype_header(tmp_reg, obj_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5126 orq(tmp_reg, r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5127 xorq(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5128 andq(tmp_reg, ~((int) markOopDesc::age_mask_in_place));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5129 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5130 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5131 ExternalAddress((address) counters->anonymously_biased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5132 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5133 jcc(Assembler::equal, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
5134
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5135 Label try_revoke_bias;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5136 Label try_rebias;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5137
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5138 // At this point we know that the header has the bias pattern and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5139 // that we are not the bias owner in the current epoch. We need to
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5140 // figure out more details about the state of the header in order to
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5141 // know what operations can be legally performed on the object's
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5142 // header.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5143
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5144 // If the low three bits in the xor result aren't clear, that means
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5145 // the prototype header is no longer biased and we have to revoke
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5146 // the bias on this object.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5147 testq(tmp_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5148 jcc(Assembler::notZero, try_revoke_bias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5149
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5150 // Biasing is still enabled for this data type. See whether the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5151 // epoch of the current bias is still valid, meaning that the epoch
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5152 // bits of the mark word are equal to the epoch bits of the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5153 // prototype header. (Note that the prototype header's epoch bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5154 // only change at a safepoint.) If not, attempt to rebias the object
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5155 // toward the current thread. Note that we must be absolutely sure
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5156 // that the current epoch is invalid in order to do this because
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5157 // otherwise the manipulations it performs on the mark word are
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5158 // illegal.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5159 testq(tmp_reg, markOopDesc::epoch_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5160 jcc(Assembler::notZero, try_rebias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5161
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5162 // The epoch of the current bias is still valid but we know nothing
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5163 // about the owner; it might be set or it might be clear. Try to
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5164 // acquire the bias of the object using an atomic operation. If this
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5165 // fails we will go in to the runtime to revoke the object's bias.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5166 // Note that we first construct the presumed unbiased header so we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5167 // don't accidentally blow away another thread's valid bias.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5168 andq(swap_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5169 markOopDesc::biased_lock_mask_in_place | markOopDesc::age_mask_in_place | markOopDesc::epoch_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5170 movq(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5171 orq(tmp_reg, r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5172 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5173 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5174 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5175 cmpxchgq(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5176 // If the biasing toward our thread failed, this means that
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5177 // another thread succeeded in biasing it toward itself and we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5178 // need to revoke that bias. The revocation will occur in the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5179 // interpreter runtime in the slow case.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5180 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5181 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5182 ExternalAddress((address) counters->anonymously_biased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5183 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5184 if (slow_case != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5185 jcc(Assembler::notZero, *slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5186 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5187 jmp(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
5188
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5189 bind(try_rebias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5190 // At this point we know the epoch has expired, meaning that the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5191 // current "bias owner", if any, is actually invalid. Under these
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5192 // circumstances _only_, we are allowed to use the current header's
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5193 // value as the comparison value when doing the cas to acquire the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5194 // bias in the current epoch. In other words, we allow transfer of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5195 // the bias from one thread to another directly in this situation.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5196 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5197 // FIXME: due to a lack of registers we currently blow away the age
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5198 // bits in this situation. Should attempt to preserve them.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5199 load_prototype_header(tmp_reg, obj_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5200 orq(tmp_reg, r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5201 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5202 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5203 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5204 cmpxchgq(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5205 // If the biasing toward our thread failed, then another thread
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5206 // succeeded in biasing it toward itself and we need to revoke that
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5207 // bias. The revocation will occur in the runtime in the slow case.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5208 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5209 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5210 ExternalAddress((address) counters->rebiased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5211 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5212 if (slow_case != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5213 jcc(Assembler::notZero, *slow_case);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5215 jmp(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
5216
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5217 bind(try_revoke_bias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5218 // The prototype mark in the klass doesn't have the bias bit set any
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5219 // more, indicating that objects of this data type are not supposed
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5220 // to be biased any more. We are going to try to reset the mark of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5221 // this object to the prototype value and fall through to the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5222 // CAS-based locking scheme. Note that if our CAS fails, it means
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5223 // that another thread raced us for the privilege of revoking the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5224 // bias of this particular object, so it's okay to continue in the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5225 // normal locking code.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5226 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5227 // FIXME: due to a lack of registers we currently blow away the age
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5228 // bits in this situation. Should attempt to preserve them.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5229 load_prototype_header(tmp_reg, obj_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5230 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5231 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5232 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5233 cmpxchgq(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5234 // Fall through to the normal CAS-based lock, because no matter what
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5235 // the result of the above CAS, some thread must have succeeded in
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5236 // removing the bias bit from the object's header.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5237 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5238 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5239 ExternalAddress((address) counters->revoked_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5240 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5241
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5242 bind(cas_label);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5243
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5244 return null_check_offset;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5245 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5246
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5247 void MacroAssembler::call_VM_leaf_base(address entry_point, int num_args) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5248 Label L, E;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5249
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5250 #ifdef _WIN64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5251 // Windows always allocates space for it's register args
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5252 assert(num_args <= 4, "only register arguments supported");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5253 subq(rsp, frame::arg_reg_save_area_bytes);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5254 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5255
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5256 // Align stack if necessary
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5257 testl(rsp, 15);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5258 jcc(Assembler::zero, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5259
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5260 subq(rsp, 8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5261 {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5262 call(RuntimeAddress(entry_point));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5263 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5264 addq(rsp, 8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5265 jmp(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5266
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5267 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5268 {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5269 call(RuntimeAddress(entry_point));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5270 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5271
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5272 bind(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5273
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5274 #ifdef _WIN64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5275 // restore stack pointer
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5276 addq(rsp, frame::arg_reg_save_area_bytes);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5277 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5278
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5279 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5280
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5281 void MacroAssembler::cmp64(Register src1, AddressLiteral src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5282 assert(!src2.is_lval(), "should use cmpptr");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5283
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5284 if (reachable(src2)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5285 cmpq(src1, as_Address(src2));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5286 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5287 lea(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5288 Assembler::cmpq(src1, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5289 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5290 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5291
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5292 int MacroAssembler::corrected_idivq(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5293 // Full implementation of Java ldiv and lrem; checks for special
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5294 // case as described in JVM spec., p.243 & p.271. The function
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5295 // returns the (pc) offset of the idivl instruction - may be needed
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5296 // for implicit exceptions.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5297 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5298 // normal case special case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5299 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5300 // input : rax: dividend min_long
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5301 // reg: divisor (may not be eax/edx) -1
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5302 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5303 // output: rax: quotient (= rax idiv reg) min_long
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5304 // rdx: remainder (= rax irem reg) 0
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5305 assert(reg != rax && reg != rdx, "reg cannot be rax or rdx register");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5306 static const int64_t min_long = 0x8000000000000000;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5307 Label normal_case, special_case;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5308
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5309 // check for special case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5310 cmp64(rax, ExternalAddress((address) &min_long));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5311 jcc(Assembler::notEqual, normal_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5312 xorl(rdx, rdx); // prepare rdx for possible special case (where
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5313 // remainder = 0)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5314 cmpq(reg, -1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5315 jcc(Assembler::equal, special_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5316
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5317 // handle normal case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5318 bind(normal_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5319 cdqq();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5320 int idivq_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5321 idivq(reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5322
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5323 // normal and special case exit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5324 bind(special_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5325
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5326 return idivq_offset;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5327 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5328
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5329 void MacroAssembler::decrementq(Register reg, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5330 if (value == min_jint) { subq(reg, value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5331 if (value < 0) { incrementq(reg, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5332 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5333 if (value == 1 && UseIncDec) { decq(reg) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5334 /* else */ { subq(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5335 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5336
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5337 void MacroAssembler::decrementq(Address dst, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5338 if (value == min_jint) { subq(dst, value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5339 if (value < 0) { incrementq(dst, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5340 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5341 if (value == 1 && UseIncDec) { decq(dst) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5342 /* else */ { subq(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5343 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5344
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5345 void MacroAssembler::fat_nop() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5346 // A 5 byte nop that is safe for patching (see patch_verified_entry)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5347 // Recommened sequence from 'Software Optimization Guide for the AMD
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5348 // Hammer Processor'
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5349 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5350 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5351 emit_byte(0x90);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5352 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5353 emit_byte(0x90);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5354 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5355
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5356 void MacroAssembler::incrementq(Register reg, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5357 if (value == min_jint) { addq(reg, value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5358 if (value < 0) { decrementq(reg, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5359 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5360 if (value == 1 && UseIncDec) { incq(reg) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5361 /* else */ { addq(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5362 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5363
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5364 void MacroAssembler::incrementq(Address dst, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5365 if (value == min_jint) { addq(dst, value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5366 if (value < 0) { decrementq(dst, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5367 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5368 if (value == 1 && UseIncDec) { incq(dst) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5369 /* else */ { addq(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5370 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5371
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5372 // 32bit can do a case table jump in one instruction but we no longer allow the base
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5373 // to be installed in the Address class
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5374 void MacroAssembler::jump(ArrayAddress entry) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5375 lea(rscratch1, entry.base());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5376 Address dispatch = entry.index();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5377 assert(dispatch._base == noreg, "must be");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5378 dispatch._base = rscratch1;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5379 jmp(dispatch);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5380 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5381
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5382 void MacroAssembler::lcmp2int(Register x_hi, Register x_lo, Register y_hi, Register y_lo) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5383 ShouldNotReachHere(); // 64bit doesn't use two regs
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5384 cmpq(x_lo, y_lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5385 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5386
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5387 void MacroAssembler::lea(Register dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5388 mov_literal64(dst, (intptr_t)src.target(), src.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5389 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5390
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5391 void MacroAssembler::lea(Address dst, AddressLiteral adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5392 mov_literal64(rscratch1, (intptr_t)adr.target(), adr.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5393 movptr(dst, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5394 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5395
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5396 void MacroAssembler::leave() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5397 // %%% is this really better? Why not on 32bit too?
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5398 emit_byte(0xC9); // LEAVE
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5399 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5400
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5401 void MacroAssembler::lneg(Register hi, Register lo) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5402 ShouldNotReachHere(); // 64bit doesn't use two regs
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5403 negq(lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5404 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5405
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5406 void MacroAssembler::movoop(Register dst, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5407 mov_literal64(dst, (intptr_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5408 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5409
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5410 void MacroAssembler::movoop(Address dst, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5411 mov_literal64(rscratch1, (intptr_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5412 movq(dst, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5413 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5414
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5415 void MacroAssembler::movptr(Register dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5416 if (src.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5417 mov_literal64(dst, (intptr_t)src.target(), src.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5418 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5419 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5420 movq(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5421 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5422 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5423 movq(dst, Address(rscratch1,0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5424 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5425 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5426 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5427
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5428 void MacroAssembler::movptr(ArrayAddress dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5429 movq(as_Address(dst), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5430 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5431
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5432 void MacroAssembler::movptr(Register dst, ArrayAddress src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5433 movq(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5434 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5435
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5436 // src should NEVER be a real pointer. Use AddressLiteral for true pointers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5437 void MacroAssembler::movptr(Address dst, intptr_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5438 mov64(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5439 movq(dst, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5440 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5441
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5442 // These are mostly for initializing NULL
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5443 void MacroAssembler::movptr(Address dst, int32_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5444 movslq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5445 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5446
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5447 void MacroAssembler::movptr(Register dst, int32_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5448 mov64(dst, (intptr_t)src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5449 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5450
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5451 void MacroAssembler::pushoop(jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5452 movoop(rscratch1, obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5453 push(rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5454 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5455
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5456 void MacroAssembler::pushptr(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5457 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5458 if (src.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5459 push(rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5460 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5461 pushq(Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5462 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5463 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5464
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5465 void MacroAssembler::reset_last_Java_frame(bool clear_fp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5466 bool clear_pc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5467 // we must set sp to zero to clear frame
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 420
diff changeset
5468 movptr(Address(r15_thread, JavaThread::last_Java_sp_offset()), NULL_WORD);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5469 // must clear fp, so that compiled frames are not confused; it is
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5470 // possible that we need it only for debugging
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5471 if (clear_fp) {
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 420
diff changeset
5472 movptr(Address(r15_thread, JavaThread::last_Java_fp_offset()), NULL_WORD);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5473 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5474
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5475 if (clear_pc) {
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 420
diff changeset
5476 movptr(Address(r15_thread, JavaThread::last_Java_pc_offset()), NULL_WORD);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5477 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5478 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5479
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5480 void MacroAssembler::set_last_Java_frame(Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5481 Register last_java_fp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5482 address last_java_pc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5483 // determine last_java_sp register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5484 if (!last_java_sp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5485 last_java_sp = rsp;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5486 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5487
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5488 // last_java_fp is optional
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5489 if (last_java_fp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5490 movptr(Address(r15_thread, JavaThread::last_Java_fp_offset()),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5491 last_java_fp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5492 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5493
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5494 // last_java_pc is optional
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5495 if (last_java_pc != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5496 Address java_pc(r15_thread,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5497 JavaThread::frame_anchor_offset() + JavaFrameAnchor::last_Java_pc_offset());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5498 lea(rscratch1, InternalAddress(last_java_pc));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5499 movptr(java_pc, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5500 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5501
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5502 movptr(Address(r15_thread, JavaThread::last_Java_sp_offset()), last_java_sp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5503 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5504
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5505 static void pass_arg0(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5506 if (c_rarg0 != arg ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5507 masm->mov(c_rarg0, arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5508 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5509 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5510
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5511 static void pass_arg1(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5512 if (c_rarg1 != arg ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5513 masm->mov(c_rarg1, arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5514 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5515 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5516
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5517 static void pass_arg2(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5518 if (c_rarg2 != arg ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5519 masm->mov(c_rarg2, arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5520 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5521 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5522
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5523 static void pass_arg3(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5524 if (c_rarg3 != arg ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5525 masm->mov(c_rarg3, arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5526 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5527 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5528
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5529 void MacroAssembler::stop(const char* msg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5530 address rip = pc();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5531 pusha(); // get regs on stack
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5532 lea(c_rarg0, ExternalAddress((address) msg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5533 lea(c_rarg1, InternalAddress(rip));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5534 movq(c_rarg2, rsp); // pass pointer to regs array
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5535 andq(rsp, -16); // align stack as required by ABI
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5536 call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug64)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5537 hlt();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5538 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5539
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5540 void MacroAssembler::warn(const char* msg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5541 push(r12);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5542 movq(r12, rsp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5543 andq(rsp, -16); // align stack as required by push_CPU_state and call
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5544
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5545 push_CPU_state(); // keeps alignment at 16 bytes
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5546 lea(c_rarg0, ExternalAddress((address) msg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5547 call_VM_leaf(CAST_FROM_FN_PTR(address, warning), c_rarg0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5548 pop_CPU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5549
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5550 movq(rsp, r12);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5551 pop(r12);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5552 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5553
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5554 #ifndef PRODUCT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5555 extern "C" void findpc(intptr_t x);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5556 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5557
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5558 void MacroAssembler::debug64(char* msg, int64_t pc, int64_t regs[]) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5559 // In order to get locks to work, we need to fake a in_VM state
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5560 if (ShowMessageBoxOnError ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5561 JavaThread* thread = JavaThread::current();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5562 JavaThreadState saved_state = thread->thread_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5563 thread->set_thread_state(_thread_in_vm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5564 #ifndef PRODUCT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5565 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5566 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5567 BytecodeCounter::print();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5568 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5569 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5570 // To see where a verify_oop failed, get $ebx+40/X for this frame.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5571 // XXX correct this offset for amd64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5572 // This is the value of eip which points to where verify_oop will return.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5573 if (os::message_box(msg, "Execution stopped, print registers?")) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5574 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5575 tty->print_cr("rip = 0x%016lx", pc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5576 #ifndef PRODUCT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5577 tty->cr();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5578 findpc(pc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5579 tty->cr();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5580 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5581 tty->print_cr("rax = 0x%016lx", regs[15]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5582 tty->print_cr("rbx = 0x%016lx", regs[12]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5583 tty->print_cr("rcx = 0x%016lx", regs[14]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5584 tty->print_cr("rdx = 0x%016lx", regs[13]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5585 tty->print_cr("rdi = 0x%016lx", regs[8]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5586 tty->print_cr("rsi = 0x%016lx", regs[9]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5587 tty->print_cr("rbp = 0x%016lx", regs[10]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5588 tty->print_cr("rsp = 0x%016lx", regs[11]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5589 tty->print_cr("r8 = 0x%016lx", regs[7]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5590 tty->print_cr("r9 = 0x%016lx", regs[6]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5591 tty->print_cr("r10 = 0x%016lx", regs[5]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5592 tty->print_cr("r11 = 0x%016lx", regs[4]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5593 tty->print_cr("r12 = 0x%016lx", regs[3]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5594 tty->print_cr("r13 = 0x%016lx", regs[2]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5595 tty->print_cr("r14 = 0x%016lx", regs[1]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5596 tty->print_cr("r15 = 0x%016lx", regs[0]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5597 BREAKPOINT;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5598 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5599 ThreadStateTransition::transition(thread, _thread_in_vm, saved_state);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5600 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5601 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5602 ::tty->print_cr("=============== DEBUG MESSAGE: %s ================\n",
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5603 msg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5604 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5605 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5606
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5607 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5608
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5609 // Now versions that are common to 32/64 bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5610
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5611 void MacroAssembler::addptr(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5612 LP64_ONLY(addq(dst, imm32)) NOT_LP64(addl(dst, imm32));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5613 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5614
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5615 void MacroAssembler::addptr(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5616 LP64_ONLY(addq(dst, src)) NOT_LP64(addl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5617 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5618
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5619 void MacroAssembler::addptr(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5620 LP64_ONLY(addq(dst, src)) NOT_LP64(addl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5621 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5622
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5623 void MacroAssembler::align(int modulus) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5624 if (offset() % modulus != 0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5625 nop(modulus - (offset() % modulus));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5626 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5627 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5628
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5629 void MacroAssembler::andpd(XMMRegister dst, AddressLiteral src) {
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5630 if (reachable(src)) {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5631 andpd(dst, as_Address(src));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5632 } else {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5633 lea(rscratch1, src);
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5634 andpd(dst, Address(rscratch1, 0));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5635 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5636 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5637
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5638 void MacroAssembler::andptr(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5639 LP64_ONLY(andq(dst, imm32)) NOT_LP64(andl(dst, imm32));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5640 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5641
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5642 void MacroAssembler::atomic_incl(AddressLiteral counter_addr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5643 pushf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5644 if (os::is_MP())
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5645 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5646 incrementl(counter_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5647 popf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5648 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5649
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5650 // Writes to stack successive pages until offset reached to check for
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5651 // stack overflow + shadow pages. This clobbers tmp.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5652 void MacroAssembler::bang_stack_size(Register size, Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5653 movptr(tmp, rsp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5654 // Bang stack for total size given plus shadow page size.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5655 // Bang one page at a time because large size can bang beyond yellow and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5656 // red zones.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5657 Label loop;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5658 bind(loop);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5659 movl(Address(tmp, (-os::vm_page_size())), size );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5660 subptr(tmp, os::vm_page_size());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5661 subl(size, os::vm_page_size());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5662 jcc(Assembler::greater, loop);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5663
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5664 // Bang down shadow pages too.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5665 // The -1 because we already subtracted 1 page.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5666 for (int i = 0; i< StackShadowPages-1; i++) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5667 // this could be any sized move but this is can be a debugging crumb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5668 // so the bigger the better.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5669 movptr(Address(tmp, (-i*os::vm_page_size())), size );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5670 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5671 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5672
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5673 void MacroAssembler::biased_locking_exit(Register obj_reg, Register temp_reg, Label& done) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5674 assert(UseBiasedLocking, "why call this otherwise?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5675
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5676 // Check for biased locking unlock case, which is a no-op
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5677 // Note: we do not have to check the thread ID for two reasons.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5678 // First, the interpreter checks for IllegalMonitorStateException at
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5679 // a higher level. Second, if the bias was revoked while we held the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5680 // lock, the object could not be rebiased toward another thread, so
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5681 // the bias bit would be clear.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5682 movptr(temp_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5683 andptr(temp_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5684 cmpptr(temp_reg, markOopDesc::biased_lock_pattern);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5685 jcc(Assembler::equal, done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5686 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5687
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5688 void MacroAssembler::c2bool(Register x) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5689 // implements x == 0 ? 0 : 1
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5690 // note: must only look at least-significant byte of x
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5691 // since C-style booleans are stored in one byte
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5692 // only! (was bug)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5693 andl(x, 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5694 setb(Assembler::notZero, x);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5695 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5696
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5697 // Wouldn't need if AddressLiteral version had new name
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5698 void MacroAssembler::call(Label& L, relocInfo::relocType rtype) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5699 Assembler::call(L, rtype);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5700 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5701
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5702 void MacroAssembler::call(Register entry) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5703 Assembler::call(entry);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5704 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5705
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5706 void MacroAssembler::call(AddressLiteral entry) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5707 if (reachable(entry)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5708 Assembler::call_literal(entry.target(), entry.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5709 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5710 lea(rscratch1, entry);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5711 Assembler::call(rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5712 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5713 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5714
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5715 // Implementation of call_VM versions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5716
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5717 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5718 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5719 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5720 Label C, E;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5721 call(C, relocInfo::none);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5722 jmp(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5723
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5724 bind(C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5725 call_VM_helper(oop_result, entry_point, 0, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5726 ret(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5727
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5728 bind(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5729 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5730
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5731 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5732 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5733 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5734 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5735 Label C, E;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5736 call(C, relocInfo::none);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5737 jmp(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5738
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5739 bind(C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5740 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5741 call_VM_helper(oop_result, entry_point, 1, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5742 ret(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5743
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5744 bind(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5745 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5746
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5747 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5748 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5749 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5750 Register arg_2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5751 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5752 Label C, E;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5753 call(C, relocInfo::none);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5754 jmp(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5755
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5756 bind(C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5757
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5758 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5759
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5760 pass_arg2(this, arg_2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5761 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5762 call_VM_helper(oop_result, entry_point, 2, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5763 ret(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5764
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5765 bind(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5766 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5767
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5768 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5769 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5770 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5771 Register arg_2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5772 Register arg_3,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5773 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5774 Label C, E;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5775 call(C, relocInfo::none);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5776 jmp(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5777
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5778 bind(C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5779
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5780 LP64_ONLY(assert(arg_1 != c_rarg3, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5781 LP64_ONLY(assert(arg_2 != c_rarg3, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5782 pass_arg3(this, arg_3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5783
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5784 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5785 pass_arg2(this, arg_2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5786
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5787 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5788 call_VM_helper(oop_result, entry_point, 3, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5789 ret(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5790
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5791 bind(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5792 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5793
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5794 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5795 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5796 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5797 int number_of_arguments,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5798 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5799 Register thread = LP64_ONLY(r15_thread) NOT_LP64(noreg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5800 call_VM_base(oop_result, thread, last_java_sp, entry_point, number_of_arguments, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5801 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5802
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5803 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5804 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5805 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5806 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5807 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5808 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5809 call_VM(oop_result, last_java_sp, entry_point, 1, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5810 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5811
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5812 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5813 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5814 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5815 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5816 Register arg_2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5817 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5818
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5819 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5820 pass_arg2(this, arg_2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5821 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5822 call_VM(oop_result, last_java_sp, entry_point, 2, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5823 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5824
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5825 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5826 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5827 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5828 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5829 Register arg_2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5830 Register arg_3,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5831 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5832 LP64_ONLY(assert(arg_1 != c_rarg3, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5833 LP64_ONLY(assert(arg_2 != c_rarg3, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5834 pass_arg3(this, arg_3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5835 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5836 pass_arg2(this, arg_2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5837 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5838 call_VM(oop_result, last_java_sp, entry_point, 3, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5839 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5840
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5841 void MacroAssembler::call_VM_base(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5842 Register java_thread,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5843 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5844 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5845 int number_of_arguments,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5846 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5847 // determine java_thread register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5848 if (!java_thread->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5849 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5850 java_thread = r15_thread;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5851 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5852 java_thread = rdi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5853 get_thread(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5854 #endif // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5855 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5856 // determine last_java_sp register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5857 if (!last_java_sp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5858 last_java_sp = rsp;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5859 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5860 // debugging support
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5861 assert(number_of_arguments >= 0 , "cannot have negative number of arguments");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5862 LP64_ONLY(assert(java_thread == r15_thread, "unexpected register"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5863 assert(java_thread != oop_result , "cannot use the same register for java_thread & oop_result");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5864 assert(java_thread != last_java_sp, "cannot use the same register for java_thread & last_java_sp");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5865
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5866 // push java thread (becomes first argument of C function)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5867
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5868 NOT_LP64(push(java_thread); number_of_arguments++);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5869 LP64_ONLY(mov(c_rarg0, r15_thread));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5870
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5871 // set last Java frame before call
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5872 assert(last_java_sp != rbp, "can't use ebp/rbp");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5873
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5874 // Only interpreter should have to set fp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5875 set_last_Java_frame(java_thread, last_java_sp, rbp, NULL);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5876
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5877 // do the call, remove parameters
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5878 MacroAssembler::call_VM_leaf_base(entry_point, number_of_arguments);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5879
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5880 // restore the thread (cannot use the pushed argument since arguments
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5881 // may be overwritten by C code generated by an optimizing compiler);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5882 // however can use the register value directly if it is callee saved.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5883 if (LP64_ONLY(true ||) java_thread == rdi || java_thread == rsi) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5884 // rdi & rsi (also r15) are callee saved -> nothing to do
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5885 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5886 guarantee(java_thread != rax, "change this code");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5887 push(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5888 { Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5889 get_thread(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5890 cmpptr(java_thread, rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5891 jcc(Assembler::equal, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5892 stop("MacroAssembler::call_VM_base: rdi not callee saved?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5893 bind(L);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5894 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5895 pop(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5896 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5897 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5898 get_thread(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5899 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5900 // reset last Java frame
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5901 // Only interpreter should have to clear fp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5902 reset_last_Java_frame(java_thread, true, false);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5903
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5904 #ifndef CC_INTERP
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5905 // C++ interp handles this in the interpreter
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5906 check_and_handle_popframe(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5907 check_and_handle_earlyret(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5908 #endif /* CC_INTERP */
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5909
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5910 if (check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5911 // check for pending exceptions (java_thread is set upon return)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5912 cmpptr(Address(java_thread, Thread::pending_exception_offset()), (int32_t) NULL_WORD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5913 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5914 jump_cc(Assembler::notEqual,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5915 RuntimeAddress(StubRoutines::forward_exception_entry()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5916 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5917 // This used to conditionally jump to forward_exception however it is
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5918 // possible if we relocate that the branch will not reach. So we must jump
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5919 // around so we can always reach
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5920
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5921 Label ok;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5922 jcc(Assembler::equal, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5923 jump(RuntimeAddress(StubRoutines::forward_exception_entry()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5924 bind(ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5925 #endif // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5926 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5927
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5928 // get oop result if there is one and reset the value in the thread
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5929 if (oop_result->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5930 movptr(oop_result, Address(java_thread, JavaThread::vm_result_offset()));
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 420
diff changeset
5931 movptr(Address(java_thread, JavaThread::vm_result_offset()), NULL_WORD);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5932 verify_oop(oop_result, "broken oop in call_VM_base");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5933 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5934 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5935
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5936 void MacroAssembler::call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5937
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5938 // Calculate the value for last_Java_sp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5939 // somewhat subtle. call_VM does an intermediate call
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5940 // which places a return address on the stack just under the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5941 // stack pointer as the user finsihed with it. This allows
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5942 // use to retrieve last_Java_pc from last_Java_sp[-1].
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5943 // On 32bit we then have to push additional args on the stack to accomplish
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5944 // the actual requested call. On 64bit call_VM only can use register args
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5945 // so the only extra space is the return address that call_VM created.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5946 // This hopefully explains the calculations here.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5947
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5948 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5949 // We've pushed one address, correct last_Java_sp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5950 lea(rax, Address(rsp, wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5951 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5952 lea(rax, Address(rsp, (1 + number_of_arguments) * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5953 #endif // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5954
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5955 call_VM_base(oop_result, noreg, rax, entry_point, number_of_arguments, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5956
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5957 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5958
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5959 void MacroAssembler::call_VM_leaf(address entry_point, int number_of_arguments) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5960 call_VM_leaf_base(entry_point, number_of_arguments);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5961 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5962
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5963 void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5964 pass_arg0(this, arg_0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5965 call_VM_leaf(entry_point, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5966 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5967
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5968 void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0, Register arg_1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5969
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5970 LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5971 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5972 pass_arg0(this, arg_0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5973 call_VM_leaf(entry_point, 2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5974 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5975
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5976 void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0, Register arg_1, Register arg_2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5977 LP64_ONLY(assert(arg_0 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5978 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5979 pass_arg2(this, arg_2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5980 LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5981 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5982 pass_arg0(this, arg_0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5983 call_VM_leaf(entry_point, 3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5984 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5985
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5986 void MacroAssembler::check_and_handle_earlyret(Register java_thread) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5987 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5988
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5989 void MacroAssembler::check_and_handle_popframe(Register java_thread) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5990 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5991
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5992 void MacroAssembler::cmp32(AddressLiteral src1, int32_t imm) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5993 if (reachable(src1)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5994 cmpl(as_Address(src1), imm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5995 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5996 lea(rscratch1, src1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5997 cmpl(Address(rscratch1, 0), imm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5998 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5999 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6000
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6001 void MacroAssembler::cmp32(Register src1, AddressLiteral src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6002 assert(!src2.is_lval(), "use cmpptr");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6003 if (reachable(src2)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6004 cmpl(src1, as_Address(src2));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6005 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6006 lea(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6007 cmpl(src1, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6008 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6009 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6010
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6011 void MacroAssembler::cmp32(Register src1, int32_t imm) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6012 Assembler::cmpl(src1, imm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6013 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6014
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6015 void MacroAssembler::cmp32(Register src1, Address src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6016 Assembler::cmpl(src1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6017 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6018
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6019 void MacroAssembler::cmpsd2int(XMMRegister opr1, XMMRegister opr2, Register dst, bool unordered_is_less) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6020 ucomisd(opr1, opr2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6021
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6022 Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6023 if (unordered_is_less) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6024 movl(dst, -1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6025 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6026 jcc(Assembler::below , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6027 movl(dst, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6028 jcc(Assembler::equal , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6029 increment(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6030 } else { // unordered is greater
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6031 movl(dst, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6032 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6033 jcc(Assembler::above , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6034 movl(dst, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6035 jcc(Assembler::equal , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6036 decrementl(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6037 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6038 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6039 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6040
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6041 void MacroAssembler::cmpss2int(XMMRegister opr1, XMMRegister opr2, Register dst, bool unordered_is_less) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6042 ucomiss(opr1, opr2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6043
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6044 Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6045 if (unordered_is_less) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6046 movl(dst, -1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6047 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6048 jcc(Assembler::below , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6049 movl(dst, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6050 jcc(Assembler::equal , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6051 increment(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6052 } else { // unordered is greater
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6053 movl(dst, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6054 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6055 jcc(Assembler::above , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6056 movl(dst, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6057 jcc(Assembler::equal , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6058 decrementl(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6059 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6060 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6061 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6062
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6063
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6064 void MacroAssembler::cmp8(AddressLiteral src1, int imm) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6065 if (reachable(src1)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6066 cmpb(as_Address(src1), imm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6067 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6068 lea(rscratch1, src1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6069 cmpb(Address(rscratch1, 0), imm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6070 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6071 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6072
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6073 void MacroAssembler::cmpptr(Register src1, AddressLiteral src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6074 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6075 if (src2.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6076 movptr(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6077 Assembler::cmpq(src1, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6078 } else if (reachable(src2)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6079 cmpq(src1, as_Address(src2));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6080 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6081 lea(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6082 Assembler::cmpq(src1, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6083 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6084 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6085 if (src2.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6086 cmp_literal32(src1, (int32_t) src2.target(), src2.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6087 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6088 cmpl(src1, as_Address(src2));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6089 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6090 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6091 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6092
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6093 void MacroAssembler::cmpptr(Address src1, AddressLiteral src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6094 assert(src2.is_lval(), "not a mem-mem compare");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6095 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6096 // moves src2's literal address
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6097 movptr(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6098 Assembler::cmpq(src1, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6099 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6100 cmp_literal32(src1, (int32_t) src2.target(), src2.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6101 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6102 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6103
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6104 void MacroAssembler::locked_cmpxchgptr(Register reg, AddressLiteral adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6105 if (reachable(adr)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6106 if (os::is_MP())
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6107 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6108 cmpxchgptr(reg, as_Address(adr));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6109 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6110 lea(rscratch1, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6111 if (os::is_MP())
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6112 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6113 cmpxchgptr(reg, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6114 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6115 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6116
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6117 void MacroAssembler::cmpxchgptr(Register reg, Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6118 LP64_ONLY(cmpxchgq(reg, adr)) NOT_LP64(cmpxchgl(reg, adr));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6119 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6120
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6121 void MacroAssembler::comisd(XMMRegister dst, AddressLiteral src) {
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6122 if (reachable(src)) {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6123 comisd(dst, as_Address(src));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6124 } else {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6125 lea(rscratch1, src);
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6126 comisd(dst, Address(rscratch1, 0));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6127 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6128 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6129
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6130 void MacroAssembler::comiss(XMMRegister dst, AddressLiteral src) {
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6131 if (reachable(src)) {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6132 comiss(dst, as_Address(src));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6133 } else {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6134 lea(rscratch1, src);
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6135 comiss(dst, Address(rscratch1, 0));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6136 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6137 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6138
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6139
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6140 void MacroAssembler::cond_inc32(Condition cond, AddressLiteral counter_addr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6141 Condition negated_cond = negate_condition(cond);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6142 Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6143 jcc(negated_cond, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6144 atomic_incl(counter_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6145 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6146 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6147
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6148 int MacroAssembler::corrected_idivl(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6149 // Full implementation of Java idiv and irem; checks for
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6150 // special case as described in JVM spec., p.243 & p.271.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6151 // The function returns the (pc) offset of the idivl
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6152 // instruction - may be needed for implicit exceptions.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6153 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6154 // normal case special case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6155 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6156 // input : rax,: dividend min_int
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6157 // reg: divisor (may not be rax,/rdx) -1
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6158 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6159 // output: rax,: quotient (= rax, idiv reg) min_int
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6160 // rdx: remainder (= rax, irem reg) 0
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6161 assert(reg != rax && reg != rdx, "reg cannot be rax, or rdx register");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6162 const int min_int = 0x80000000;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6163 Label normal_case, special_case;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6164
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6165 // check for special case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6166 cmpl(rax, min_int);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6167 jcc(Assembler::notEqual, normal_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6168 xorl(rdx, rdx); // prepare rdx for possible special case (where remainder = 0)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6169 cmpl(reg, -1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6170 jcc(Assembler::equal, special_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6171
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6172 // handle normal case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6173 bind(normal_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6174 cdql();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6175 int idivl_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6176 idivl(reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6177
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6178 // normal and special case exit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6179 bind(special_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6180
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6181 return idivl_offset;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6182 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6183
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6184
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6185
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6186 void MacroAssembler::decrementl(Register reg, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6187 if (value == min_jint) {subl(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6188 if (value < 0) { incrementl(reg, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6189 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6190 if (value == 1 && UseIncDec) { decl(reg) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6191 /* else */ { subl(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6192 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6193
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6194 void MacroAssembler::decrementl(Address dst, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6195 if (value == min_jint) {subl(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6196 if (value < 0) { incrementl(dst, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6197 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6198 if (value == 1 && UseIncDec) { decl(dst) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6199 /* else */ { subl(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6200 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6201
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6202 void MacroAssembler::division_with_shift (Register reg, int shift_value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6203 assert (shift_value > 0, "illegal shift value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6204 Label _is_positive;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6205 testl (reg, reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6206 jcc (Assembler::positive, _is_positive);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6207 int offset = (1 << shift_value) - 1 ;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6208
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6209 if (offset == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6210 incrementl(reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6211 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6212 addl(reg, offset);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6213 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6214
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6215 bind (_is_positive);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6216 sarl(reg, shift_value);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6217 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6218
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6219 // !defined(COMPILER2) is because of stupid core builds
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6220 #if !defined(_LP64) || defined(COMPILER1) || !defined(COMPILER2)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6221 void MacroAssembler::empty_FPU_stack() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6222 if (VM_Version::supports_mmx()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6223 emms();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6224 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6225 for (int i = 8; i-- > 0; ) ffree(i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6226 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6227 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6228 #endif // !LP64 || C1 || !C2
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6229
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6230
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6231 // Defines obj, preserves var_size_in_bytes
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6232 void MacroAssembler::eden_allocate(Register obj,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6233 Register var_size_in_bytes,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6234 int con_size_in_bytes,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6235 Register t1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6236 Label& slow_case) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6237 assert(obj == rax, "obj must be in rax, for cmpxchg");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6238 assert_different_registers(obj, var_size_in_bytes, t1);
362
apetrusenko
parents: 356 304
diff changeset
6239 if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) {
apetrusenko
parents: 356 304
diff changeset
6240 jmp(slow_case);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6241 } else {
362
apetrusenko
parents: 356 304
diff changeset
6242 Register end = t1;
apetrusenko
parents: 356 304
diff changeset
6243 Label retry;
apetrusenko
parents: 356 304
diff changeset
6244 bind(retry);
apetrusenko
parents: 356 304
diff changeset
6245 ExternalAddress heap_top((address) Universe::heap()->top_addr());
apetrusenko
parents: 356 304
diff changeset
6246 movptr(obj, heap_top);
apetrusenko
parents: 356 304
diff changeset
6247 if (var_size_in_bytes == noreg) {
apetrusenko
parents: 356 304
diff changeset
6248 lea(end, Address(obj, con_size_in_bytes));
apetrusenko
parents: 356 304
diff changeset
6249 } else {
apetrusenko
parents: 356 304
diff changeset
6250 lea(end, Address(obj, var_size_in_bytes, Address::times_1));
apetrusenko
parents: 356 304
diff changeset
6251 }
apetrusenko
parents: 356 304
diff changeset
6252 // if end < obj then we wrapped around => object too long => slow case
apetrusenko
parents: 356 304
diff changeset
6253 cmpptr(end, obj);
apetrusenko
parents: 356 304
diff changeset
6254 jcc(Assembler::below, slow_case);
apetrusenko
parents: 356 304
diff changeset
6255 cmpptr(end, ExternalAddress((address) Universe::heap()->end_addr()));
apetrusenko
parents: 356 304
diff changeset
6256 jcc(Assembler::above, slow_case);
apetrusenko
parents: 356 304
diff changeset
6257 // Compare obj with the top addr, and if still equal, store the new top addr in
apetrusenko
parents: 356 304
diff changeset
6258 // end at the address of the top addr pointer. Sets ZF if was equal, and clears
apetrusenko
parents: 356 304
diff changeset
6259 // it otherwise. Use lock prefix for atomicity on MPs.
apetrusenko
parents: 356 304
diff changeset
6260 locked_cmpxchgptr(end, heap_top);
apetrusenko
parents: 356 304
diff changeset
6261 jcc(Assembler::notEqual, retry);
apetrusenko
parents: 356 304
diff changeset
6262 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6263 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6264
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6265 void MacroAssembler::enter() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6266 push(rbp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6267 mov(rbp, rsp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6268 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6269
a61af66fc99e Initial load
duke
parents:
diff changeset
6270 void MacroAssembler::fcmp(Register tmp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6271 fcmp(tmp, 1, true, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
6272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6273
a61af66fc99e Initial load
duke
parents:
diff changeset
6274 void MacroAssembler::fcmp(Register tmp, int index, bool pop_left, bool pop_right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6275 assert(!pop_right || pop_left, "usage error");
a61af66fc99e Initial load
duke
parents:
diff changeset
6276 if (VM_Version::supports_cmov()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6277 assert(tmp == noreg, "unneeded temp");
a61af66fc99e Initial load
duke
parents:
diff changeset
6278 if (pop_left) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6279 fucomip(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
6280 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
6281 fucomi(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
6282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6283 if (pop_right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6284 fpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
6285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6286 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
6287 assert(tmp != noreg, "need temp");
a61af66fc99e Initial load
duke
parents:
diff changeset
6288 if (pop_left) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6289 if (pop_right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6290 fcompp();
a61af66fc99e Initial load
duke
parents:
diff changeset
6291 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
6292 fcomp(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
6293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6294 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
6295 fcom(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
6296 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6297 // convert FPU condition into eflags condition via rax,
a61af66fc99e Initial load
duke
parents:
diff changeset
6298 save_rax(tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
6299 fwait(); fnstsw_ax();
a61af66fc99e Initial load
duke
parents:
diff changeset
6300 sahf();
a61af66fc99e Initial load
duke
parents:
diff changeset
6301 restore_rax(tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
6302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6303 // condition codes set as follows:
a61af66fc99e Initial load
duke
parents:
diff changeset
6304 //
a61af66fc99e Initial load
duke
parents:
diff changeset
6305 // CF (corresponds to C0) if x < y
a61af66fc99e Initial load
duke
parents:
diff changeset
6306 // PF (corresponds to C2) if unordered
a61af66fc99e Initial load
duke
parents:
diff changeset
6307 // ZF (corresponds to C3) if x = y
a61af66fc99e Initial load
duke
parents:
diff changeset
6308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6309
a61af66fc99e Initial load
duke
parents:
diff changeset
6310 void MacroAssembler::fcmp2int(Register dst, bool unordered_is_less) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6311 fcmp2int(dst, unordered_is_less, 1, true, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
6312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6313
a61af66fc99e Initial load
duke
parents:
diff changeset
6314 void MacroAssembler::fcmp2int(Register dst, bool unordered_is_less, int index, bool pop_left, bool pop_right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6315 fcmp(VM_Version::supports_cmov() ? noreg : dst, index, pop_left, pop_right);
a61af66fc99e Initial load
duke
parents:
diff changeset
6316 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
6317 if (unordered_is_less) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6318 movl(dst, -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
6319 jcc(Assembler::parity, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6320 jcc(Assembler::below , L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6321 movl(dst, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
6322 jcc(Assembler::equal , L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6323 increment(dst);
a61af66fc99e Initial load
duke
parents:
diff changeset
6324 } else { // unordered is greater
a61af66fc99e Initial load
duke
parents:
diff changeset
6325 movl(dst, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
6326 jcc(Assembler::parity, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6327 jcc(Assembler::above , L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6328 movl(dst, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
6329 jcc(Assembler::equal , L);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6330 decrementl(dst);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6332 bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6334
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6335 void MacroAssembler::fld_d(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6336 fld_d(as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6337 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6338
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6339 void MacroAssembler::fld_s(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6340 fld_s(as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6341 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6342
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6343 void MacroAssembler::fld_x(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6344 Assembler::fld_x(as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6345 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6346
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6347 void MacroAssembler::fldcw(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6348 Assembler::fldcw(as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6349 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6350
a61af66fc99e Initial load
duke
parents:
diff changeset
6351 void MacroAssembler::fpop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
6352 ffree();
a61af66fc99e Initial load
duke
parents:
diff changeset
6353 fincstp();
a61af66fc99e Initial load
duke
parents:
diff changeset
6354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6355
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6356 void MacroAssembler::fremr(Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6357 save_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6358 { Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6359 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6360 fprem();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6361 fwait(); fnstsw_ax();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6362 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6363 testl(rax, 0x400);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6364 jcc(Assembler::notEqual, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6365 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6366 sahf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6367 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6368 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6369 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6370 restore_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6371 // Result is in ST0.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6372 // Note: fxch & fpop to get rid of ST1
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6373 // (otherwise FPU stack could overflow eventually)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6374 fxch(1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6375 fpop();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6376 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6377
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6378
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6379 void MacroAssembler::incrementl(AddressLiteral dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6380 if (reachable(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6381 incrementl(as_Address(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6382 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6383 lea(rscratch1, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6384 incrementl(Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6385 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6386 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6387
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6388 void MacroAssembler::incrementl(ArrayAddress dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6389 incrementl(as_Address(dst));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6390 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6391
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6392 void MacroAssembler::incrementl(Register reg, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6393 if (value == min_jint) {addl(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6394 if (value < 0) { decrementl(reg, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6395 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6396 if (value == 1 && UseIncDec) { incl(reg) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6397 /* else */ { addl(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6398 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6399
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6400 void MacroAssembler::incrementl(Address dst, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6401 if (value == min_jint) {addl(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6402 if (value < 0) { decrementl(dst, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6403 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6404 if (value == 1 && UseIncDec) { incl(dst) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6405 /* else */ { addl(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6406 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6407
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6408 void MacroAssembler::jump(AddressLiteral dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6409 if (reachable(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6410 jmp_literal(dst.target(), dst.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6411 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6412 lea(rscratch1, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6413 jmp(rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6414 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6415 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6416
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6417 void MacroAssembler::jump_cc(Condition cc, AddressLiteral dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6418 if (reachable(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6419 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6420 relocate(dst.reloc());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6421 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6422 const int long_size = 6;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6423 int offs = (intptr_t)dst.target() - ((intptr_t)_code_pos);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6424 if (dst.reloc() == relocInfo::none && is8bit(offs - short_size)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6425 // 0111 tttn #8-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6426 emit_byte(0x70 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6427 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6428 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6429 // 0000 1111 1000 tttn #32-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6430 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6431 emit_byte(0x80 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6432 emit_long(offs - long_size);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6433 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6434 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6435 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6436 warning("reversing conditional branch");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6437 #endif /* ASSERT */
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6438 Label skip;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6439 jccb(reverse[cc], skip);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6440 lea(rscratch1, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6441 Assembler::jmp(rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6442 bind(skip);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6443 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6444 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6445
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6446 void MacroAssembler::ldmxcsr(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6447 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6448 Assembler::ldmxcsr(as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6449 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6450 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6451 Assembler::ldmxcsr(Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6452 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6453 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6454
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6455 int MacroAssembler::load_signed_byte(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6456 int off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6457 if (LP64_ONLY(true ||) VM_Version::is_P6()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6458 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6459 movsbl(dst, src); // movsxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6460 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6461 off = load_unsigned_byte(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6462 shll(dst, 24);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6463 sarl(dst, 24);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6464 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6465 return off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6466 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6467
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6468 // Note: load_signed_short used to be called load_signed_word.
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6469 // Although the 'w' in x86 opcodes refers to the term "word" in the assembler
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6470 // manual, which means 16 bits, that usage is found nowhere in HotSpot code.
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6471 // The term "word" in HotSpot means a 32- or 64-bit machine word.
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6472 int MacroAssembler::load_signed_short(Register dst, Address src) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6473 int off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6474 if (LP64_ONLY(true ||) VM_Version::is_P6()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6475 // This is dubious to me since it seems safe to do a signed 16 => 64 bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6476 // version but this is what 64bit has always done. This seems to imply
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6477 // that users are only using 32bits worth.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6478 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6479 movswl(dst, src); // movsxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6480 } else {
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6481 off = load_unsigned_short(dst, src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6482 shll(dst, 16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6483 sarl(dst, 16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6484 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6485 return off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6486 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6487
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6488 int MacroAssembler::load_unsigned_byte(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6489 // According to Intel Doc. AP-526, "Zero-Extension of Short", p.16,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6490 // and "3.9 Partial Register Penalties", p. 22).
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6491 int off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6492 if (LP64_ONLY(true || ) VM_Version::is_P6() || src.uses(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6493 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6494 movzbl(dst, src); // movzxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6495 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6496 xorl(dst, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6497 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6498 movb(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6499 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6500 return off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6501 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6502
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6503 // Note: load_unsigned_short used to be called load_unsigned_word.
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6504 int MacroAssembler::load_unsigned_short(Register dst, Address src) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6505 // According to Intel Doc. AP-526, "Zero-Extension of Short", p.16,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6506 // and "3.9 Partial Register Penalties", p. 22).
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6507 int off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6508 if (LP64_ONLY(true ||) VM_Version::is_P6() || src.uses(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6509 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6510 movzwl(dst, src); // movzxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6511 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6512 xorl(dst, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6513 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6514 movw(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6515 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6516 return off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6517 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6518
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6519 void MacroAssembler::load_sized_value(Register dst, Address src,
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1369
diff changeset
6520 size_t size_in_bytes, bool is_signed) {
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1369
diff changeset
6521 switch (size_in_bytes) {
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6522 #ifndef _LP64
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6523 // For case 8, caller is responsible for manually loading
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6524 // the second word into another register.
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1369
diff changeset
6525 case 8: movl(dst, src); break;
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6526 #else
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1369
diff changeset
6527 case 8: movq(dst, src); break;
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6528 #endif
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1369
diff changeset
6529 case 4: movl(dst, src); break;
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1369
diff changeset
6530 case 2: is_signed ? load_signed_short(dst, src) : load_unsigned_short(dst, src); break;
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1369
diff changeset
6531 case 1: is_signed ? load_signed_byte( dst, src) : load_unsigned_byte( dst, src); break;
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1369
diff changeset
6532 default: ShouldNotReachHere();
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6533 }
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6534 }
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6535
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6536 void MacroAssembler::mov32(AddressLiteral dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6537 if (reachable(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6538 movl(as_Address(dst), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6539 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6540 lea(rscratch1, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6541 movl(Address(rscratch1, 0), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6542 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6543 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6544
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6545 void MacroAssembler::mov32(Register dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6546 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6547 movl(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6548 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6549 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6550 movl(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6551 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6553
a61af66fc99e Initial load
duke
parents:
diff changeset
6554 // C++ bool manipulation
a61af66fc99e Initial load
duke
parents:
diff changeset
6555
a61af66fc99e Initial load
duke
parents:
diff changeset
6556 void MacroAssembler::movbool(Register dst, Address src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6557 if(sizeof(bool) == 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
6558 movb(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6559 else if(sizeof(bool) == 2)
a61af66fc99e Initial load
duke
parents:
diff changeset
6560 movw(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6561 else if(sizeof(bool) == 4)
a61af66fc99e Initial load
duke
parents:
diff changeset
6562 movl(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6563 else
a61af66fc99e Initial load
duke
parents:
diff changeset
6564 // unsupported
a61af66fc99e Initial load
duke
parents:
diff changeset
6565 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
6566 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6567
a61af66fc99e Initial load
duke
parents:
diff changeset
6568 void MacroAssembler::movbool(Address dst, bool boolconst) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6569 if(sizeof(bool) == 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
6570 movb(dst, (int) boolconst);
a61af66fc99e Initial load
duke
parents:
diff changeset
6571 else if(sizeof(bool) == 2)
a61af66fc99e Initial load
duke
parents:
diff changeset
6572 movw(dst, (int) boolconst);
a61af66fc99e Initial load
duke
parents:
diff changeset
6573 else if(sizeof(bool) == 4)
a61af66fc99e Initial load
duke
parents:
diff changeset
6574 movl(dst, (int) boolconst);
a61af66fc99e Initial load
duke
parents:
diff changeset
6575 else
a61af66fc99e Initial load
duke
parents:
diff changeset
6576 // unsupported
a61af66fc99e Initial load
duke
parents:
diff changeset
6577 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
6578 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6579
a61af66fc99e Initial load
duke
parents:
diff changeset
6580 void MacroAssembler::movbool(Address dst, Register src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6581 if(sizeof(bool) == 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
6582 movb(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6583 else if(sizeof(bool) == 2)
a61af66fc99e Initial load
duke
parents:
diff changeset
6584 movw(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6585 else if(sizeof(bool) == 4)
a61af66fc99e Initial load
duke
parents:
diff changeset
6586 movl(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6587 else
a61af66fc99e Initial load
duke
parents:
diff changeset
6588 // unsupported
a61af66fc99e Initial load
duke
parents:
diff changeset
6589 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
6590 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6591
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6592 void MacroAssembler::movbyte(ArrayAddress dst, int src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6593 movb(as_Address(dst), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6594 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6595
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6596 void MacroAssembler::movdbl(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6597 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6598 if (UseXmmLoadAndClearUpper) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6599 movsd (dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6600 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6601 movlpd(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6602 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6603 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6604 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6605 if (UseXmmLoadAndClearUpper) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6606 movsd (dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6607 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6608 movlpd(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6609 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6610 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6611 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6612
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6613 void MacroAssembler::movflt(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6614 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6615 movss(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6616 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6617 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6618 movss(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6619 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6620 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6621
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6622 void MacroAssembler::movptr(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6623 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6624 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6625
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6626 void MacroAssembler::movptr(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6627 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6628 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6629
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6630 // src should NEVER be a real pointer. Use AddressLiteral for true pointers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6631 void MacroAssembler::movptr(Register dst, intptr_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6632 LP64_ONLY(mov64(dst, src)) NOT_LP64(movl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6633 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6634
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6635 void MacroAssembler::movptr(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6636 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6637 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6638
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6639 void MacroAssembler::movss(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6640 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6641 movss(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6642 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6643 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6644 movss(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6645 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6646 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6647
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6648 void MacroAssembler::null_check(Register reg, int offset) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6649 if (needs_explicit_null_check(offset)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6650 // provoke OS NULL exception if reg = NULL by
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6651 // accessing M[reg] w/o changing any (non-CC) registers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6652 // NOTE: cmpl is plenty here to provoke a segv
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6653 cmpptr(rax, Address(reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6654 // Note: should probably use testl(rax, Address(reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6655 // may be shorter code (however, this version of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6656 // testl needs to be implemented first)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6657 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6658 // nothing to do, (later) access of M[reg + offset]
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6659 // will provoke OS NULL exception if reg = NULL
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6660 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6661 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6662
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6663 void MacroAssembler::os_breakpoint() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6664 // instead of directly emitting a breakpoint, call os:breakpoint for better debugability
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6665 // (e.g., MSVC can't call ps() otherwise)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6666 call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6667 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6668
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6669 void MacroAssembler::pop_CPU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6670 pop_FPU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6671 pop_IU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6672 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6673
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6674 void MacroAssembler::pop_FPU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6675 NOT_LP64(frstor(Address(rsp, 0));)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6676 LP64_ONLY(fxrstor(Address(rsp, 0));)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6677 addptr(rsp, FPUStateSizeInWords * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6678 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6679
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6680 void MacroAssembler::pop_IU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6681 popa();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6682 LP64_ONLY(addq(rsp, 8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6683 popf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6684 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6685
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6686 // Save Integer and Float state
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6687 // Warning: Stack must be 16 byte aligned (64bit)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6688 void MacroAssembler::push_CPU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6689 push_IU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6690 push_FPU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6691 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6692
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6693 void MacroAssembler::push_FPU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6694 subptr(rsp, FPUStateSizeInWords * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6695 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6696 fnsave(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6697 fwait();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6698 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6699 fxsave(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6700 #endif // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6701 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6702
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6703 void MacroAssembler::push_IU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6704 // Push flags first because pusha kills them
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6705 pushf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6706 // Make sure rsp stays 16-byte aligned
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6707 LP64_ONLY(subq(rsp, 8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6708 pusha();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6709 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6710
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6711 void MacroAssembler::reset_last_Java_frame(Register java_thread, bool clear_fp, bool clear_pc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6712 // determine java_thread register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6713 if (!java_thread->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6714 java_thread = rdi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6715 get_thread(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6716 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6717 // we must set sp to zero to clear frame
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 420
diff changeset
6718 movptr(Address(java_thread, JavaThread::last_Java_sp_offset()), NULL_WORD);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6719 if (clear_fp) {
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 420
diff changeset
6720 movptr(Address(java_thread, JavaThread::last_Java_fp_offset()), NULL_WORD);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6721 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6722
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6723 if (clear_pc)
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 420
diff changeset
6724 movptr(Address(java_thread, JavaThread::last_Java_pc_offset()), NULL_WORD);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6725
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6726 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6727
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6728 void MacroAssembler::restore_rax(Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6729 if (tmp == noreg) pop(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6730 else if (tmp != rax) mov(rax, tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6731 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6732
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6733 void MacroAssembler::round_to(Register reg, int modulus) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6734 addptr(reg, modulus - 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6735 andptr(reg, -modulus);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6736 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6737
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6738 void MacroAssembler::save_rax(Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6739 if (tmp == noreg) push(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6740 else if (tmp != rax) mov(tmp, rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6741 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6742
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6743 // Write serialization page so VM thread can do a pseudo remote membar.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6744 // We use the current thread pointer to calculate a thread specific
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6745 // offset to write to within the page. This minimizes bus traffic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6746 // due to cache line collision.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6747 void MacroAssembler::serialize_memory(Register thread, Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6748 movl(tmp, thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6749 shrl(tmp, os::get_serialize_page_shift_count());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6750 andl(tmp, (os::vm_page_size() - sizeof(int)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6751
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6752 Address index(noreg, tmp, Address::times_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6753 ExternalAddress page(os::get_memory_serialize_page());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6754
606
19962e74284f 6811384: MacroAssembler::serialize_memory may touch next page on amd64
never
parents: 520
diff changeset
6755 // Size of store must match masking code above
19962e74284f 6811384: MacroAssembler::serialize_memory may touch next page on amd64
never
parents: 520
diff changeset
6756 movl(as_Address(ArrayAddress(page, index)), tmp);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6757 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6758
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6759 // Calls to C land
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6760 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6761 // When entering C land, the rbp, & rsp of the last Java frame have to be recorded
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6762 // in the (thread-local) JavaThread object. When leaving C land, the last Java fp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6763 // has to be reset to 0. This is required to allow proper stack traversal.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6764 void MacroAssembler::set_last_Java_frame(Register java_thread,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6765 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6766 Register last_java_fp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6767 address last_java_pc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6768 // determine java_thread register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6769 if (!java_thread->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6770 java_thread = rdi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6771 get_thread(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6772 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6773 // determine last_java_sp register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6774 if (!last_java_sp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6775 last_java_sp = rsp;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6776 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6777
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6778 // last_java_fp is optional
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6779
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6780 if (last_java_fp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6781 movptr(Address(java_thread, JavaThread::last_Java_fp_offset()), last_java_fp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6782 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6783
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6784 // last_java_pc is optional
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6785
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6786 if (last_java_pc != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6787 lea(Address(java_thread,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6788 JavaThread::frame_anchor_offset() + JavaFrameAnchor::last_Java_pc_offset()),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6789 InternalAddress(last_java_pc));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6790
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6791 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6792 movptr(Address(java_thread, JavaThread::last_Java_sp_offset()), last_java_sp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6793 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6794
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6795 void MacroAssembler::shlptr(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6796 LP64_ONLY(shlq(dst, imm8)) NOT_LP64(shll(dst, imm8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6797 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6798
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6799 void MacroAssembler::shrptr(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6800 LP64_ONLY(shrq(dst, imm8)) NOT_LP64(shrl(dst, imm8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6801 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6802
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6803 void MacroAssembler::sign_extend_byte(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6804 if (LP64_ONLY(true ||) (VM_Version::is_P6() && reg->has_byte_register())) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6805 movsbl(reg, reg); // movsxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6806 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6807 shll(reg, 24);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6808 sarl(reg, 24);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6809 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6810 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6811
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6812 void MacroAssembler::sign_extend_short(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6813 if (LP64_ONLY(true ||) VM_Version::is_P6()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6814 movswl(reg, reg); // movsxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6815 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6816 shll(reg, 16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6817 sarl(reg, 16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6818 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6819 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6820
362
apetrusenko
parents: 356 304
diff changeset
6821 //////////////////////////////////////////////////////////////////////////////////
apetrusenko
parents: 356 304
diff changeset
6822 #ifndef SERIALGC
apetrusenko
parents: 356 304
diff changeset
6823
apetrusenko
parents: 356 304
diff changeset
6824 void MacroAssembler::g1_write_barrier_pre(Register obj,
apetrusenko
parents: 356 304
diff changeset
6825 #ifndef _LP64
apetrusenko
parents: 356 304
diff changeset
6826 Register thread,
apetrusenko
parents: 356 304
diff changeset
6827 #endif
apetrusenko
parents: 356 304
diff changeset
6828 Register tmp,
apetrusenko
parents: 356 304
diff changeset
6829 Register tmp2,
apetrusenko
parents: 356 304
diff changeset
6830 bool tosca_live) {
apetrusenko
parents: 356 304
diff changeset
6831 LP64_ONLY(Register thread = r15_thread;)
apetrusenko
parents: 356 304
diff changeset
6832 Address in_progress(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
6833 PtrQueue::byte_offset_of_active()));
apetrusenko
parents: 356 304
diff changeset
6834
apetrusenko
parents: 356 304
diff changeset
6835 Address index(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
6836 PtrQueue::byte_offset_of_index()));
apetrusenko
parents: 356 304
diff changeset
6837 Address buffer(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
6838 PtrQueue::byte_offset_of_buf()));
apetrusenko
parents: 356 304
diff changeset
6839
apetrusenko
parents: 356 304
diff changeset
6840
apetrusenko
parents: 356 304
diff changeset
6841 Label done;
apetrusenko
parents: 356 304
diff changeset
6842 Label runtime;
apetrusenko
parents: 356 304
diff changeset
6843
apetrusenko
parents: 356 304
diff changeset
6844 // if (!marking_in_progress) goto done;
apetrusenko
parents: 356 304
diff changeset
6845 if (in_bytes(PtrQueue::byte_width_of_active()) == 4) {
apetrusenko
parents: 356 304
diff changeset
6846 cmpl(in_progress, 0);
apetrusenko
parents: 356 304
diff changeset
6847 } else {
apetrusenko
parents: 356 304
diff changeset
6848 assert(in_bytes(PtrQueue::byte_width_of_active()) == 1, "Assumption");
apetrusenko
parents: 356 304
diff changeset
6849 cmpb(in_progress, 0);
apetrusenko
parents: 356 304
diff changeset
6850 }
apetrusenko
parents: 356 304
diff changeset
6851 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
6852
apetrusenko
parents: 356 304
diff changeset
6853 // if (x.f == NULL) goto done;
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 775
diff changeset
6854 #ifdef _LP64
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 775
diff changeset
6855 load_heap_oop(tmp2, Address(obj, 0));
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 775
diff changeset
6856 #else
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 775
diff changeset
6857 movptr(tmp2, Address(obj, 0));
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 775
diff changeset
6858 #endif
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 775
diff changeset
6859 cmpptr(tmp2, (int32_t) NULL_WORD);
362
apetrusenko
parents: 356 304
diff changeset
6860 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
6861
apetrusenko
parents: 356 304
diff changeset
6862 // Can we store original value in the thread's buffer?
apetrusenko
parents: 356 304
diff changeset
6863
apetrusenko
parents: 356 304
diff changeset
6864 #ifdef _LP64
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 775
diff changeset
6865 movslq(tmp, index);
362
apetrusenko
parents: 356 304
diff changeset
6866 cmpq(tmp, 0);
apetrusenko
parents: 356 304
diff changeset
6867 #else
apetrusenko
parents: 356 304
diff changeset
6868 cmpl(index, 0);
apetrusenko
parents: 356 304
diff changeset
6869 #endif
apetrusenko
parents: 356 304
diff changeset
6870 jcc(Assembler::equal, runtime);
apetrusenko
parents: 356 304
diff changeset
6871 #ifdef _LP64
apetrusenko
parents: 356 304
diff changeset
6872 subq(tmp, wordSize);
apetrusenko
parents: 356 304
diff changeset
6873 movl(index, tmp);
apetrusenko
parents: 356 304
diff changeset
6874 addq(tmp, buffer);
apetrusenko
parents: 356 304
diff changeset
6875 #else
apetrusenko
parents: 356 304
diff changeset
6876 subl(index, wordSize);
apetrusenko
parents: 356 304
diff changeset
6877 movl(tmp, buffer);
apetrusenko
parents: 356 304
diff changeset
6878 addl(tmp, index);
apetrusenko
parents: 356 304
diff changeset
6879 #endif
apetrusenko
parents: 356 304
diff changeset
6880 movptr(Address(tmp, 0), tmp2);
apetrusenko
parents: 356 304
diff changeset
6881 jmp(done);
apetrusenko
parents: 356 304
diff changeset
6882 bind(runtime);
apetrusenko
parents: 356 304
diff changeset
6883 // save the live input values
apetrusenko
parents: 356 304
diff changeset
6884 if(tosca_live) push(rax);
apetrusenko
parents: 356 304
diff changeset
6885 push(obj);
apetrusenko
parents: 356 304
diff changeset
6886 #ifdef _LP64
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 775
diff changeset
6887 call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), tmp2, r15_thread);
362
apetrusenko
parents: 356 304
diff changeset
6888 #else
apetrusenko
parents: 356 304
diff changeset
6889 push(thread);
apetrusenko
parents: 356 304
diff changeset
6890 call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), tmp2, thread);
apetrusenko
parents: 356 304
diff changeset
6891 pop(thread);
apetrusenko
parents: 356 304
diff changeset
6892 #endif
apetrusenko
parents: 356 304
diff changeset
6893 pop(obj);
apetrusenko
parents: 356 304
diff changeset
6894 if(tosca_live) pop(rax);
apetrusenko
parents: 356 304
diff changeset
6895 bind(done);
apetrusenko
parents: 356 304
diff changeset
6896
apetrusenko
parents: 356 304
diff changeset
6897 }
apetrusenko
parents: 356 304
diff changeset
6898
apetrusenko
parents: 356 304
diff changeset
6899 void MacroAssembler::g1_write_barrier_post(Register store_addr,
apetrusenko
parents: 356 304
diff changeset
6900 Register new_val,
apetrusenko
parents: 356 304
diff changeset
6901 #ifndef _LP64
apetrusenko
parents: 356 304
diff changeset
6902 Register thread,
apetrusenko
parents: 356 304
diff changeset
6903 #endif
apetrusenko
parents: 356 304
diff changeset
6904 Register tmp,
apetrusenko
parents: 356 304
diff changeset
6905 Register tmp2) {
apetrusenko
parents: 356 304
diff changeset
6906
apetrusenko
parents: 356 304
diff changeset
6907 LP64_ONLY(Register thread = r15_thread;)
apetrusenko
parents: 356 304
diff changeset
6908 Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
6909 PtrQueue::byte_offset_of_index()));
apetrusenko
parents: 356 304
diff changeset
6910 Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
6911 PtrQueue::byte_offset_of_buf()));
apetrusenko
parents: 356 304
diff changeset
6912 BarrierSet* bs = Universe::heap()->barrier_set();
apetrusenko
parents: 356 304
diff changeset
6913 CardTableModRefBS* ct = (CardTableModRefBS*)bs;
apetrusenko
parents: 356 304
diff changeset
6914 Label done;
apetrusenko
parents: 356 304
diff changeset
6915 Label runtime;
apetrusenko
parents: 356 304
diff changeset
6916
apetrusenko
parents: 356 304
diff changeset
6917 // Does store cross heap regions?
apetrusenko
parents: 356 304
diff changeset
6918
apetrusenko
parents: 356 304
diff changeset
6919 movptr(tmp, store_addr);
apetrusenko
parents: 356 304
diff changeset
6920 xorptr(tmp, new_val);
apetrusenko
parents: 356 304
diff changeset
6921 shrptr(tmp, HeapRegion::LogOfHRGrainBytes);
apetrusenko
parents: 356 304
diff changeset
6922 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
6923
apetrusenko
parents: 356 304
diff changeset
6924 // crosses regions, storing NULL?
apetrusenko
parents: 356 304
diff changeset
6925
apetrusenko
parents: 356 304
diff changeset
6926 cmpptr(new_val, (int32_t) NULL_WORD);
apetrusenko
parents: 356 304
diff changeset
6927 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
6928
apetrusenko
parents: 356 304
diff changeset
6929 // storing region crossing non-NULL, is card already dirty?
apetrusenko
parents: 356 304
diff changeset
6930
apetrusenko
parents: 356 304
diff changeset
6931 ExternalAddress cardtable((address) ct->byte_map_base);
apetrusenko
parents: 356 304
diff changeset
6932 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
apetrusenko
parents: 356 304
diff changeset
6933 #ifdef _LP64
apetrusenko
parents: 356 304
diff changeset
6934 const Register card_addr = tmp;
apetrusenko
parents: 356 304
diff changeset
6935
apetrusenko
parents: 356 304
diff changeset
6936 movq(card_addr, store_addr);
apetrusenko
parents: 356 304
diff changeset
6937 shrq(card_addr, CardTableModRefBS::card_shift);
apetrusenko
parents: 356 304
diff changeset
6938
apetrusenko
parents: 356 304
diff changeset
6939 lea(tmp2, cardtable);
apetrusenko
parents: 356 304
diff changeset
6940
apetrusenko
parents: 356 304
diff changeset
6941 // get the address of the card
apetrusenko
parents: 356 304
diff changeset
6942 addq(card_addr, tmp2);
apetrusenko
parents: 356 304
diff changeset
6943 #else
apetrusenko
parents: 356 304
diff changeset
6944 const Register card_index = tmp;
apetrusenko
parents: 356 304
diff changeset
6945
apetrusenko
parents: 356 304
diff changeset
6946 movl(card_index, store_addr);
apetrusenko
parents: 356 304
diff changeset
6947 shrl(card_index, CardTableModRefBS::card_shift);
apetrusenko
parents: 356 304
diff changeset
6948
apetrusenko
parents: 356 304
diff changeset
6949 Address index(noreg, card_index, Address::times_1);
apetrusenko
parents: 356 304
diff changeset
6950 const Register card_addr = tmp;
apetrusenko
parents: 356 304
diff changeset
6951 lea(card_addr, as_Address(ArrayAddress(cardtable, index)));
apetrusenko
parents: 356 304
diff changeset
6952 #endif
apetrusenko
parents: 356 304
diff changeset
6953 cmpb(Address(card_addr, 0), 0);
apetrusenko
parents: 356 304
diff changeset
6954 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
6955
apetrusenko
parents: 356 304
diff changeset
6956 // storing a region crossing, non-NULL oop, card is clean.
apetrusenko
parents: 356 304
diff changeset
6957 // dirty card and log.
apetrusenko
parents: 356 304
diff changeset
6958
apetrusenko
parents: 356 304
diff changeset
6959 movb(Address(card_addr, 0), 0);
apetrusenko
parents: 356 304
diff changeset
6960
apetrusenko
parents: 356 304
diff changeset
6961 cmpl(queue_index, 0);
apetrusenko
parents: 356 304
diff changeset
6962 jcc(Assembler::equal, runtime);
apetrusenko
parents: 356 304
diff changeset
6963 subl(queue_index, wordSize);
apetrusenko
parents: 356 304
diff changeset
6964 movptr(tmp2, buffer);
apetrusenko
parents: 356 304
diff changeset
6965 #ifdef _LP64
apetrusenko
parents: 356 304
diff changeset
6966 movslq(rscratch1, queue_index);
apetrusenko
parents: 356 304
diff changeset
6967 addq(tmp2, rscratch1);
apetrusenko
parents: 356 304
diff changeset
6968 movq(Address(tmp2, 0), card_addr);
apetrusenko
parents: 356 304
diff changeset
6969 #else
apetrusenko
parents: 356 304
diff changeset
6970 addl(tmp2, queue_index);
apetrusenko
parents: 356 304
diff changeset
6971 movl(Address(tmp2, 0), card_index);
apetrusenko
parents: 356 304
diff changeset
6972 #endif
apetrusenko
parents: 356 304
diff changeset
6973 jmp(done);
apetrusenko
parents: 356 304
diff changeset
6974
apetrusenko
parents: 356 304
diff changeset
6975 bind(runtime);
apetrusenko
parents: 356 304
diff changeset
6976 // save the live input values
apetrusenko
parents: 356 304
diff changeset
6977 push(store_addr);
apetrusenko
parents: 356 304
diff changeset
6978 push(new_val);
apetrusenko
parents: 356 304
diff changeset
6979 #ifdef _LP64
apetrusenko
parents: 356 304
diff changeset
6980 call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, r15_thread);
apetrusenko
parents: 356 304
diff changeset
6981 #else
apetrusenko
parents: 356 304
diff changeset
6982 push(thread);
apetrusenko
parents: 356 304
diff changeset
6983 call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, thread);
apetrusenko
parents: 356 304
diff changeset
6984 pop(thread);
apetrusenko
parents: 356 304
diff changeset
6985 #endif
apetrusenko
parents: 356 304
diff changeset
6986 pop(new_val);
apetrusenko
parents: 356 304
diff changeset
6987 pop(store_addr);
apetrusenko
parents: 356 304
diff changeset
6988
apetrusenko
parents: 356 304
diff changeset
6989 bind(done);
apetrusenko
parents: 356 304
diff changeset
6990
apetrusenko
parents: 356 304
diff changeset
6991 }
apetrusenko
parents: 356 304
diff changeset
6992
apetrusenko
parents: 356 304
diff changeset
6993 #endif // SERIALGC
apetrusenko
parents: 356 304
diff changeset
6994 //////////////////////////////////////////////////////////////////////////////////
apetrusenko
parents: 356 304
diff changeset
6995
apetrusenko
parents: 356 304
diff changeset
6996
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6997 void MacroAssembler::store_check(Register obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6998 // Does a store check for the oop in register obj. The content of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6999 // register obj is destroyed afterwards.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7000 store_check_part_1(obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7001 store_check_part_2(obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7002 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7003
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7004 void MacroAssembler::store_check(Register obj, Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7005 store_check(obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7006 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7007
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7008
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7009 // split the store check operation so that other instructions can be scheduled inbetween
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7010 void MacroAssembler::store_check_part_1(Register obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7011 BarrierSet* bs = Universe::heap()->barrier_set();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7012 assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7013 shrptr(obj, CardTableModRefBS::card_shift);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7014 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7015
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7016 void MacroAssembler::store_check_part_2(Register obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7017 BarrierSet* bs = Universe::heap()->barrier_set();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7018 assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7019 CardTableModRefBS* ct = (CardTableModRefBS*)bs;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7020 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7021
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7022 // The calculation for byte_map_base is as follows:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7023 // byte_map_base = _byte_map - (uintptr_t(low_bound) >> card_shift);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7024 // So this essentially converts an address to a displacement and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7025 // it will never need to be relocated. On 64bit however the value may be too
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7026 // large for a 32bit displacement
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7027
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7028 intptr_t disp = (intptr_t) ct->byte_map_base;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7029 if (is_simm32(disp)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7030 Address cardtable(noreg, obj, Address::times_1, disp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7031 movb(cardtable, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7032 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7033 // By doing it as an ExternalAddress disp could be converted to a rip-relative
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7034 // displacement and done in a single instruction given favorable mapping and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7035 // a smarter version of as_Address. Worst case it is two instructions which
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7036 // is no worse off then loading disp into a register and doing as a simple
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7037 // Address() as above.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7038 // We can't do as ExternalAddress as the only style since if disp == 0 we'll
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7039 // assert since NULL isn't acceptable in a reloci (see 6644928). In any case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7040 // in some cases we'll get a single instruction version.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7041
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7042 ExternalAddress cardtable((address)disp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7043 Address index(noreg, obj, Address::times_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7044 movb(as_Address(ArrayAddress(cardtable, index)), 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7045 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7046 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7047
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7048 void MacroAssembler::subptr(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7049 LP64_ONLY(subq(dst, imm32)) NOT_LP64(subl(dst, imm32));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7050 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7051
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7052 void MacroAssembler::subptr(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7053 LP64_ONLY(subq(dst, src)) NOT_LP64(subl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7054 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7055
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7056 void MacroAssembler::test32(Register src1, AddressLiteral src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7057 // src2 must be rval
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7058
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7059 if (reachable(src2)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7060 testl(src1, as_Address(src2));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7061 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7062 lea(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7063 testl(src1, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7064 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7065 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7066
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7067 // C++ bool manipulation
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7068 void MacroAssembler::testbool(Register dst) {
a61af66fc99e Initial load
duke
parents:
diff changeset
7069 if(sizeof(bool) == 1)
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7070 testb(dst, 0xff);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7071 else if(sizeof(bool) == 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
7072 // testw implementation needed for two byte bools
a61af66fc99e Initial load
duke
parents:
diff changeset
7073 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
7074 } else if(sizeof(bool) == 4)
a61af66fc99e Initial load
duke
parents:
diff changeset
7075 testl(dst, dst);
a61af66fc99e Initial load
duke
parents:
diff changeset
7076 else
a61af66fc99e Initial load
duke
parents:
diff changeset
7077 // unsupported
a61af66fc99e Initial load
duke
parents:
diff changeset
7078 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
7079 }
a61af66fc99e Initial load
duke
parents:
diff changeset
7080
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7081 void MacroAssembler::testptr(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7082 LP64_ONLY(testq(dst, src)) NOT_LP64(testl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7083 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7084
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7085 // Defines obj, preserves var_size_in_bytes, okay for t2 == var_size_in_bytes.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7086 void MacroAssembler::tlab_allocate(Register obj,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7087 Register var_size_in_bytes,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7088 int con_size_in_bytes,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7089 Register t1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7090 Register t2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7091 Label& slow_case) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7092 assert_different_registers(obj, t1, t2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7093 assert_different_registers(obj, var_size_in_bytes, t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7094 Register end = t2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7095 Register thread = NOT_LP64(t1) LP64_ONLY(r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7096
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7097 verify_tlab();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7098
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7099 NOT_LP64(get_thread(thread));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7100
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7101 movptr(obj, Address(thread, JavaThread::tlab_top_offset()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7102 if (var_size_in_bytes == noreg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7103 lea(end, Address(obj, con_size_in_bytes));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7104 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7105 lea(end, Address(obj, var_size_in_bytes, Address::times_1));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7106 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7107 cmpptr(end, Address(thread, JavaThread::tlab_end_offset()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7108 jcc(Assembler::above, slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7109
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7110 // update the tlab top pointer
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7111 movptr(Address(thread, JavaThread::tlab_top_offset()), end);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7112
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7113 // recover var_size_in_bytes if necessary
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7114 if (var_size_in_bytes == end) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7115 subptr(var_size_in_bytes, obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7116 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7117 verify_tlab();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7118 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7119
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7120 // Preserves rbx, and rdx.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7121 void MacroAssembler::tlab_refill(Label& retry,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7122 Label& try_eden,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7123 Label& slow_case) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7124 Register top = rax;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7125 Register t1 = rcx;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7126 Register t2 = rsi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7127 Register thread_reg = NOT_LP64(rdi) LP64_ONLY(r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7128 assert_different_registers(top, thread_reg, t1, t2, /* preserve: */ rbx, rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7129 Label do_refill, discard_tlab;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7130
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7131 if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7132 // No allocation in the shared eden.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7133 jmp(slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7134 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7135
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7136 NOT_LP64(get_thread(thread_reg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7137
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7138 movptr(top, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7139 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_end_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7140
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7141 // calculate amount of free space
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7142 subptr(t1, top);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7143 shrptr(t1, LogHeapWordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7144
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7145 // Retain tlab and allocate object in shared space if
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7146 // the amount free in the tlab is too large to discard.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7147 cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_refill_waste_limit_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7148 jcc(Assembler::lessEqual, discard_tlab);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7149
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7150 // Retain
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7151 // %%% yuck as movptr...
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7152 movptr(t2, (int32_t) ThreadLocalAllocBuffer::refill_waste_limit_increment());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7153 addptr(Address(thread_reg, in_bytes(JavaThread::tlab_refill_waste_limit_offset())), t2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7154 if (TLABStats) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7155 // increment number of slow_allocations
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7156 addl(Address(thread_reg, in_bytes(JavaThread::tlab_slow_allocations_offset())), 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7157 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7158 jmp(try_eden);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7159
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7160 bind(discard_tlab);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7161 if (TLABStats) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7162 // increment number of refills
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7163 addl(Address(thread_reg, in_bytes(JavaThread::tlab_number_of_refills_offset())), 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7164 // accumulate wastage -- t1 is amount free in tlab
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7165 addl(Address(thread_reg, in_bytes(JavaThread::tlab_fast_refill_waste_offset())), t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7166 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7167
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7168 // if tlab is currently allocated (top or end != null) then
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7169 // fill [top, end + alignment_reserve) with array object
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7170 testptr (top, top);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7171 jcc(Assembler::zero, do_refill);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7172
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7173 // set up the mark word
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7174 movptr(Address(top, oopDesc::mark_offset_in_bytes()), (intptr_t)markOopDesc::prototype()->copy_set_hash(0x2));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7175 // set the length to the remaining space
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7176 subptr(t1, typeArrayOopDesc::header_size(T_INT));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7177 addptr(t1, (int32_t)ThreadLocalAllocBuffer::alignment_reserve());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7178 shlptr(t1, log2_intptr(HeapWordSize/sizeof(jint)));
1690
36519c19beeb 6975027: use of movptr to set length of array
never
parents: 1684
diff changeset
7179 movl(Address(top, arrayOopDesc::length_offset_in_bytes()), t1);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7180 // set klass to intArrayKlass
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7181 // dubious reloc why not an oop reloc?
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7182 movptr(t1, ExternalAddress((address) Universe::intArrayKlassObj_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7183 // store klass last. concurrent gcs assumes klass length is valid if
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7184 // klass field is not null.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7185 store_klass(top, t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7186
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7187 // refill the tlab with an eden allocation
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7188 bind(do_refill);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7189 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_size_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7190 shlptr(t1, LogHeapWordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7191 // add object_size ??
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7192 eden_allocate(top, t1, 0, t2, slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7193
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7194 // Check that t1 was preserved in eden_allocate.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7195 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7196 if (UseTLAB) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7197 Label ok;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7198 Register tsize = rsi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7199 assert_different_registers(tsize, thread_reg, t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7200 push(tsize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7201 movptr(tsize, Address(thread_reg, in_bytes(JavaThread::tlab_size_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7202 shlptr(tsize, LogHeapWordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7203 cmpptr(t1, tsize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7204 jcc(Assembler::equal, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7205 stop("assert(t1 != tlab size)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7206 should_not_reach_here();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7207
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7208 bind(ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7209 pop(tsize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7210 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7211 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7212 movptr(Address(thread_reg, in_bytes(JavaThread::tlab_start_offset())), top);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7213 movptr(Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())), top);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7214 addptr(top, t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7215 subptr(top, (int32_t)ThreadLocalAllocBuffer::alignment_reserve_in_bytes());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7216 movptr(Address(thread_reg, in_bytes(JavaThread::tlab_end_offset())), top);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7217 verify_tlab();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7218 jmp(retry);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7219 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7220
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7221 static const double pi_4 = 0.7853981633974483;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7222
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7223 void MacroAssembler::trigfunc(char trig, int num_fpu_regs_in_use) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7224 // A hand-coded argument reduction for values in fabs(pi/4, pi/2)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7225 // was attempted in this code; unfortunately it appears that the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7226 // switch to 80-bit precision and back causes this to be
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7227 // unprofitable compared with simply performing a runtime call if
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7228 // the argument is out of the (-pi/4, pi/4) range.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7229
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7230 Register tmp = noreg;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7231 if (!VM_Version::supports_cmov()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7232 // fcmp needs a temporary so preserve rbx,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7233 tmp = rbx;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7234 push(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7235 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7236
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7237 Label slow_case, done;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7238
520
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7239 ExternalAddress pi4_adr = (address)&pi_4;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7240 if (reachable(pi4_adr)) {
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7241 // x ?<= pi/4
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7242 fld_d(pi4_adr);
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7243 fld_s(1); // Stack: X PI/4 X
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7244 fabs(); // Stack: |X| PI/4 X
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7245 fcmp(tmp);
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7246 jcc(Assembler::above, slow_case);
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7247
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7248 // fastest case: -pi/4 <= x <= pi/4
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7249 switch(trig) {
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7250 case 's':
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7251 fsin();
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7252 break;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7253 case 'c':
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7254 fcos();
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7255 break;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7256 case 't':
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7257 ftan();
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7258 break;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7259 default:
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7260 assert(false, "bad intrinsic");
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7261 break;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7262 }
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7263 jmp(done);
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7264 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7265
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7266 // slow case: runtime call
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7267 bind(slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7268 // Preserve registers across runtime call
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7269 pusha();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7270 int incoming_argument_and_return_value_offset = -1;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7271 if (num_fpu_regs_in_use > 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7272 // Must preserve all other FPU regs (could alternatively convert
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7273 // SharedRuntime::dsin and dcos into assembly routines known not to trash
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7274 // FPU state, but can not trust C compiler)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7275 NEEDS_CLEANUP;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7276 // NOTE that in this case we also push the incoming argument to
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7277 // the stack and restore it later; we also use this stack slot to
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7278 // hold the return value from dsin or dcos.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7279 for (int i = 0; i < num_fpu_regs_in_use; i++) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7280 subptr(rsp, sizeof(jdouble));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7281 fstp_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7282 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7283 incoming_argument_and_return_value_offset = sizeof(jdouble)*(num_fpu_regs_in_use-1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7284 fld_d(Address(rsp, incoming_argument_and_return_value_offset));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7285 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7286 subptr(rsp, sizeof(jdouble));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7287 fstp_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7288 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7289 movdbl(xmm0, Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7290 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7291
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7292 // NOTE: we must not use call_VM_leaf here because that requires a
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7293 // complete interpreter frame in debug mode -- same bug as 4387334
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7294 // MacroAssembler::call_VM_leaf_base is perfectly safe and will
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7295 // do proper 64bit abi
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7296
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7297 NEEDS_CLEANUP;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7298 // Need to add stack banging before this runtime call if it needs to
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7299 // be taken; however, there is no generic stack banging routine at
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7300 // the MacroAssembler level
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7301 switch(trig) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7302 case 's':
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7303 {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7304 MacroAssembler::call_VM_leaf_base(CAST_FROM_FN_PTR(address, SharedRuntime::dsin), 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7305 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7306 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7307 case 'c':
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7308 {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7309 MacroAssembler::call_VM_leaf_base(CAST_FROM_FN_PTR(address, SharedRuntime::dcos), 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7310 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7311 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7312 case 't':
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7313 {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7314 MacroAssembler::call_VM_leaf_base(CAST_FROM_FN_PTR(address, SharedRuntime::dtan), 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7315 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7316 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7317 default:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7318 assert(false, "bad intrinsic");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7319 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7320 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7321 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7322 movsd(Address(rsp, 0), xmm0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7323 fld_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7324 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7325 addptr(rsp, sizeof(jdouble));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7326 if (num_fpu_regs_in_use > 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7327 // Must save return value to stack and then restore entire FPU stack
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7328 fstp_d(Address(rsp, incoming_argument_and_return_value_offset));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7329 for (int i = 0; i < num_fpu_regs_in_use; i++) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7330 fld_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7331 addptr(rsp, sizeof(jdouble));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7332 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7333 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7334 popa();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7335
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7336 // Come here with result in F-TOS
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7337 bind(done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7338
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7339 if (tmp != noreg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7340 pop(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7341 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7342 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7343
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7344
623
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7345 // Look up the method for a megamorphic invokeinterface call.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7346 // The target method is determined by <intf_klass, itable_index>.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7347 // The receiver klass is in recv_klass.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7348 // On success, the result will be in method_result, and execution falls through.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7349 // On failure, execution transfers to the given label.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7350 void MacroAssembler::lookup_interface_method(Register recv_klass,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7351 Register intf_klass,
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7352 RegisterOrConstant itable_index,
623
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7353 Register method_result,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7354 Register scan_temp,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7355 Label& L_no_such_interface) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7356 assert_different_registers(recv_klass, intf_klass, method_result, scan_temp);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7357 assert(itable_index.is_constant() || itable_index.as_register() == method_result,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7358 "caller must use same register for non-constant itable index as for method");
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7359
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7360 // Compute start of first itableOffsetEntry (which is at the end of the vtable)
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7361 int vtable_base = instanceKlass::vtable_start_offset() * wordSize;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7362 int itentry_off = itableMethodEntry::method_offset_in_bytes();
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7363 int scan_step = itableOffsetEntry::size() * wordSize;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7364 int vte_size = vtableEntry::size() * wordSize;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7365 Address::ScaleFactor times_vte_scale = Address::times_ptr;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7366 assert(vte_size == wordSize, "else adjust times_vte_scale");
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7367
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7368 movl(scan_temp, Address(recv_klass, instanceKlass::vtable_length_offset() * wordSize));
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7369
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7370 // %%% Could store the aligned, prescaled offset in the klassoop.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7371 lea(scan_temp, Address(recv_klass, scan_temp, times_vte_scale, vtable_base));
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7372 if (HeapWordsPerLong > 1) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7373 // Round up to align_object_offset boundary
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7374 // see code for instanceKlass::start_of_itable!
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7375 round_to(scan_temp, BytesPerLong);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7376 }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7377
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7378 // Adjust recv_klass by scaled itable_index, so we can free itable_index.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7379 assert(itableMethodEntry::size() * wordSize == wordSize, "adjust the scaling in the code below");
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7380 lea(recv_klass, Address(recv_klass, itable_index, Address::times_ptr, itentry_off));
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7381
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7382 // for (scan = klass->itable(); scan->interface() != NULL; scan += scan_step) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7383 // if (scan->interface() == intf) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7384 // result = (klass + scan->offset() + itable_index);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7385 // }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7386 // }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7387 Label search, found_method;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7388
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7389 for (int peel = 1; peel >= 0; peel--) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7390 movptr(method_result, Address(scan_temp, itableOffsetEntry::interface_offset_in_bytes()));
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7391 cmpptr(intf_klass, method_result);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7392
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7393 if (peel) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7394 jccb(Assembler::equal, found_method);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7395 } else {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7396 jccb(Assembler::notEqual, search);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7397 // (invert the test to fall through to found_method...)
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7398 }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7399
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7400 if (!peel) break;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7401
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7402 bind(search);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7403
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7404 // Check that the previous entry is non-null. A null entry means that
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7405 // the receiver class doesn't implement the interface, and wasn't the
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7406 // same as when the caller was compiled.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7407 testptr(method_result, method_result);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7408 jcc(Assembler::zero, L_no_such_interface);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7409 addptr(scan_temp, scan_step);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7410 }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7411
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7412 bind(found_method);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7413
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7414 // Got a hit.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7415 movl(scan_temp, Address(scan_temp, itableOffsetEntry::offset_offset_in_bytes()));
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7416 movptr(method_result, Address(recv_klass, scan_temp, Address::times_1));
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7417 }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7418
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7419
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7420 void MacroAssembler::check_klass_subtype(Register sub_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7421 Register super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7422 Register temp_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7423 Label& L_success) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7424 Label L_failure;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7425 check_klass_subtype_fast_path(sub_klass, super_klass, temp_reg, &L_success, &L_failure, NULL);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7426 check_klass_subtype_slow_path(sub_klass, super_klass, temp_reg, noreg, &L_success, NULL);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7427 bind(L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7428 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7429
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7430
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7431 void MacroAssembler::check_klass_subtype_fast_path(Register sub_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7432 Register super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7433 Register temp_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7434 Label* L_success,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7435 Label* L_failure,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7436 Label* L_slow_path,
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7437 RegisterOrConstant super_check_offset) {
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7438 assert_different_registers(sub_klass, super_klass, temp_reg);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7439 bool must_load_sco = (super_check_offset.constant_or_zero() == -1);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7440 if (super_check_offset.is_register()) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7441 assert_different_registers(sub_klass, super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7442 super_check_offset.as_register());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7443 } else if (must_load_sco) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7444 assert(temp_reg != noreg, "supply either a temp or a register offset");
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7445 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7446
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7447 Label L_fallthrough;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7448 int label_nulls = 0;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7449 if (L_success == NULL) { L_success = &L_fallthrough; label_nulls++; }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7450 if (L_failure == NULL) { L_failure = &L_fallthrough; label_nulls++; }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7451 if (L_slow_path == NULL) { L_slow_path = &L_fallthrough; label_nulls++; }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7452 assert(label_nulls <= 1, "at most one NULL in the batch");
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7453
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7454 int sc_offset = (klassOopDesc::header_size() * HeapWordSize +
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7455 Klass::secondary_super_cache_offset_in_bytes());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7456 int sco_offset = (klassOopDesc::header_size() * HeapWordSize +
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7457 Klass::super_check_offset_offset_in_bytes());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7458 Address super_check_offset_addr(super_klass, sco_offset);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7459
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7460 // Hacked jcc, which "knows" that L_fallthrough, at least, is in
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7461 // range of a jccb. If this routine grows larger, reconsider at
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7462 // least some of these.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7463 #define local_jcc(assembler_cond, label) \
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7464 if (&(label) == &L_fallthrough) jccb(assembler_cond, label); \
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7465 else jcc( assembler_cond, label) /*omit semi*/
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7466
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7467 // Hacked jmp, which may only be used just before L_fallthrough.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7468 #define final_jmp(label) \
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7469 if (&(label) == &L_fallthrough) { /*do nothing*/ } \
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7470 else jmp(label) /*omit semi*/
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7471
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7472 // If the pointers are equal, we are done (e.g., String[] elements).
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7473 // This self-check enables sharing of secondary supertype arrays among
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7474 // non-primary types such as array-of-interface. Otherwise, each such
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7475 // type would need its own customized SSA.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7476 // We move this check to the front of the fast path because many
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7477 // type checks are in fact trivially successful in this manner,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7478 // so we get a nicely predicted branch right at the start of the check.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7479 cmpptr(sub_klass, super_klass);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7480 local_jcc(Assembler::equal, *L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7481
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7482 // Check the supertype display:
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7483 if (must_load_sco) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7484 // Positive movl does right thing on LP64.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7485 movl(temp_reg, super_check_offset_addr);
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7486 super_check_offset = RegisterOrConstant(temp_reg);
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7487 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7488 Address super_check_addr(sub_klass, super_check_offset, Address::times_1, 0);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7489 cmpptr(super_klass, super_check_addr); // load displayed supertype
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7490
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7491 // This check has worked decisively for primary supers.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7492 // Secondary supers are sought in the super_cache ('super_cache_addr').
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7493 // (Secondary supers are interfaces and very deeply nested subtypes.)
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7494 // This works in the same check above because of a tricky aliasing
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7495 // between the super_cache and the primary super display elements.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7496 // (The 'super_check_addr' can address either, as the case requires.)
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7497 // Note that the cache is updated below if it does not help us find
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7498 // what we need immediately.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7499 // So if it was a primary super, we can just fail immediately.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7500 // Otherwise, it's the slow path for us (no success at this point).
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7501
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7502 if (super_check_offset.is_register()) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7503 local_jcc(Assembler::equal, *L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7504 cmpl(super_check_offset.as_register(), sc_offset);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7505 if (L_failure == &L_fallthrough) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7506 local_jcc(Assembler::equal, *L_slow_path);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7507 } else {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7508 local_jcc(Assembler::notEqual, *L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7509 final_jmp(*L_slow_path);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7510 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7511 } else if (super_check_offset.as_constant() == sc_offset) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7512 // Need a slow path; fast failure is impossible.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7513 if (L_slow_path == &L_fallthrough) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7514 local_jcc(Assembler::equal, *L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7515 } else {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7516 local_jcc(Assembler::notEqual, *L_slow_path);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7517 final_jmp(*L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7518 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7519 } else {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7520 // No slow path; it's a fast decision.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7521 if (L_failure == &L_fallthrough) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7522 local_jcc(Assembler::equal, *L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7523 } else {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7524 local_jcc(Assembler::notEqual, *L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7525 final_jmp(*L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7526 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7527 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7528
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7529 bind(L_fallthrough);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7530
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7531 #undef local_jcc
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7532 #undef final_jmp
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7533 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7534
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7535
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7536 void MacroAssembler::check_klass_subtype_slow_path(Register sub_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7537 Register super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7538 Register temp_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7539 Register temp2_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7540 Label* L_success,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7541 Label* L_failure,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7542 bool set_cond_codes) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7543 assert_different_registers(sub_klass, super_klass, temp_reg);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7544 if (temp2_reg != noreg)
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7545 assert_different_registers(sub_klass, super_klass, temp_reg, temp2_reg);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7546 #define IS_A_TEMP(reg) ((reg) == temp_reg || (reg) == temp2_reg)
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7547
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7548 Label L_fallthrough;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7549 int label_nulls = 0;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7550 if (L_success == NULL) { L_success = &L_fallthrough; label_nulls++; }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7551 if (L_failure == NULL) { L_failure = &L_fallthrough; label_nulls++; }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7552 assert(label_nulls <= 1, "at most one NULL in the batch");
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7553
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7554 // a couple of useful fields in sub_klass:
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7555 int ss_offset = (klassOopDesc::header_size() * HeapWordSize +
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7556 Klass::secondary_supers_offset_in_bytes());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7557 int sc_offset = (klassOopDesc::header_size() * HeapWordSize +
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7558 Klass::secondary_super_cache_offset_in_bytes());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7559 Address secondary_supers_addr(sub_klass, ss_offset);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7560 Address super_cache_addr( sub_klass, sc_offset);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7561
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7562 // Do a linear scan of the secondary super-klass chain.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7563 // This code is rarely used, so simplicity is a virtue here.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7564 // The repne_scan instruction uses fixed registers, which we must spill.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7565 // Don't worry too much about pre-existing connections with the input regs.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7566
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7567 assert(sub_klass != rax, "killed reg"); // killed by mov(rax, super)
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7568 assert(sub_klass != rcx, "killed reg"); // killed by lea(rcx, &pst_counter)
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7569
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7570 // Get super_klass value into rax (even if it was in rdi or rcx).
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7571 bool pushed_rax = false, pushed_rcx = false, pushed_rdi = false;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7572 if (super_klass != rax || UseCompressedOops) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7573 if (!IS_A_TEMP(rax)) { push(rax); pushed_rax = true; }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7574 mov(rax, super_klass);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7575 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7576 if (!IS_A_TEMP(rcx)) { push(rcx); pushed_rcx = true; }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7577 if (!IS_A_TEMP(rdi)) { push(rdi); pushed_rdi = true; }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7578
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7579 #ifndef PRODUCT
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7580 int* pst_counter = &SharedRuntime::_partial_subtype_ctr;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7581 ExternalAddress pst_counter_addr((address) pst_counter);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7582 NOT_LP64( incrementl(pst_counter_addr) );
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7583 LP64_ONLY( lea(rcx, pst_counter_addr) );
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7584 LP64_ONLY( incrementl(Address(rcx, 0)) );
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7585 #endif //PRODUCT
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7586
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7587 // We will consult the secondary-super array.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7588 movptr(rdi, secondary_supers_addr);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7589 // Load the array length. (Positive movl does right thing on LP64.)
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7590 movl(rcx, Address(rdi, arrayOopDesc::length_offset_in_bytes()));
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7591 // Skip to start of data.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7592 addptr(rdi, arrayOopDesc::base_offset_in_bytes(T_OBJECT));
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7593
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7594 // Scan RCX words at [RDI] for an occurrence of RAX.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7595 // Set NZ/Z based on last compare.
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7596 // Z flag value will not be set by 'repne' if RCX == 0 since 'repne' does
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7597 // not change flags (only scas instruction which is repeated sets flags).
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7598 // Set Z = 0 (not equal) before 'repne' to indicate that class was not found.
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7599 #ifdef _LP64
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7600 // This part is tricky, as values in supers array could be 32 or 64 bit wide
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7601 // and we store values in objArrays always encoded, thus we need to encode
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7602 // the value of rax before repne. Note that rax is dead after the repne.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7603 if (UseCompressedOops) {
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7604 encode_heap_oop_not_null(rax); // Changes flags.
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7605 // The superclass is never null; it would be a basic system error if a null
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7606 // pointer were to sneak in here. Note that we have already loaded the
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7607 // Klass::super_check_offset from the super_klass in the fast path,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7608 // so if there is a null in that register, we are already in the afterlife.
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7609 testl(rax,rax); // Set Z = 0
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7610 repne_scanl();
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7611 } else
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7612 #endif // _LP64
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7613 {
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7614 testptr(rax,rax); // Set Z = 0
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7615 repne_scan();
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7616 }
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7617 // Unspill the temp. registers:
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7618 if (pushed_rdi) pop(rdi);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7619 if (pushed_rcx) pop(rcx);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7620 if (pushed_rax) pop(rax);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7621
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7622 if (set_cond_codes) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7623 // Special hack for the AD files: rdi is guaranteed non-zero.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7624 assert(!pushed_rdi, "rdi must be left non-NULL");
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7625 // Also, the condition codes are properly set Z/NZ on succeed/failure.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7626 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7627
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7628 if (L_failure == &L_fallthrough)
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7629 jccb(Assembler::notEqual, *L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7630 else jcc(Assembler::notEqual, *L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7631
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7632 // Success. Cache the super we found and proceed in triumph.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7633 movptr(super_cache_addr, super_klass);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7634
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7635 if (L_success != &L_fallthrough) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7636 jmp(*L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7637 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7638
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7639 #undef IS_A_TEMP
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7640
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7641 bind(L_fallthrough);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7642 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7643
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7644
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7645 void MacroAssembler::ucomisd(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7646 ucomisd(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7647 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7648
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7649 void MacroAssembler::ucomiss(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7650 ucomiss(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7651 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7652
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7653 void MacroAssembler::xorpd(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7654 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7655 xorpd(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7656 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7657 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7658 xorpd(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7659 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7660 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7661
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7662 void MacroAssembler::xorps(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7663 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7664 xorps(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7665 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7666 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7667 xorps(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7668 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7669 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7670
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7671 void MacroAssembler::verify_oop(Register reg, const char* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
7672 if (!VerifyOops) return;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7673
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7674 // Pass register number to verify_oop_subroutine
a61af66fc99e Initial load
duke
parents:
diff changeset
7675 char* b = new char[strlen(s) + 50];
a61af66fc99e Initial load
duke
parents:
diff changeset
7676 sprintf(b, "verify_oop: %s: %s", reg->name(), s);
1583
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7677 #ifdef _LP64
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7678 push(rscratch1); // save r10, trashed by movptr()
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7679 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7680 push(rax); // save rax,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7681 push(reg); // pass register argument
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7682 ExternalAddress buffer((address) b);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7683 // avoid using pushptr, as it modifies scratch registers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7684 // and our contract is not to modify anything
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7685 movptr(rax, buffer.addr());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7686 push(rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7687 // call indirectly to solve generation ordering problem
a61af66fc99e Initial load
duke
parents:
diff changeset
7688 movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address()));
a61af66fc99e Initial load
duke
parents:
diff changeset
7689 call(rax);
1583
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7690 // Caller pops the arguments (oop, message) and restores rax, r10
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7691 }
a61af66fc99e Initial load
duke
parents:
diff changeset
7692
a61af66fc99e Initial load
duke
parents:
diff changeset
7693
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7694 RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr,
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7695 Register tmp,
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7696 int offset) {
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7697 intptr_t value = *delayed_value_addr;
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7698 if (value != 0)
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7699 return RegisterOrConstant(value + offset);
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7700
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7701 // load indirectly to solve generation ordering problem
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7702 movptr(tmp, ExternalAddress((address) delayed_value_addr));
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7703
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7704 #ifdef ASSERT
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7705 { Label L;
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7706 testptr(tmp, tmp);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7707 if (WizardMode) {
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7708 jcc(Assembler::notZero, L);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7709 char* buf = new char[40];
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7710 sprintf(buf, "DelayedValue="INTPTR_FORMAT, delayed_value_addr[1]);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7711 stop(buf);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7712 } else {
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7713 jccb(Assembler::notZero, L);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7714 hlt();
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7715 }
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7716 bind(L);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7717 }
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7718 #endif
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7719
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7720 if (offset != 0)
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7721 addptr(tmp, offset);
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7722
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7723 return RegisterOrConstant(tmp);
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7724 }
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7725
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7726
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7727 // registers on entry:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7728 // - rax ('check' register): required MethodType
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7729 // - rcx: method handle
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7730 // - rdx, rsi, or ?: killable temp
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7731 void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7732 Register temp_reg,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7733 Label& wrong_method_type) {
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7734 Address type_addr(mh_reg, delayed_value(java_dyn_MethodHandle::type_offset_in_bytes, temp_reg));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7735 // compare method type against that of the receiver
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7736 if (UseCompressedOops) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7737 load_heap_oop(temp_reg, type_addr);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7738 cmpptr(mtype_reg, temp_reg);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7739 } else {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7740 cmpptr(mtype_reg, type_addr);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7741 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7742 jcc(Assembler::notEqual, wrong_method_type);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7743 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7744
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7745
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7746 // A method handle has a "vmslots" field which gives the size of its
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7747 // argument list in JVM stack slots. This field is either located directly
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7748 // in every method handle, or else is indirectly accessed through the
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7749 // method handle's MethodType. This macro hides the distinction.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7750 void MacroAssembler::load_method_handle_vmslots(Register vmslots_reg, Register mh_reg,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7751 Register temp_reg) {
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1369
diff changeset
7752 assert_different_registers(vmslots_reg, mh_reg, temp_reg);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7753 // load mh.type.form.vmslots
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7754 if (java_dyn_MethodHandle::vmslots_offset_in_bytes() != 0) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7755 // hoist vmslots into every mh to avoid dependent load chain
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7756 movl(vmslots_reg, Address(mh_reg, delayed_value(java_dyn_MethodHandle::vmslots_offset_in_bytes, temp_reg)));
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7757 } else {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7758 Register temp2_reg = vmslots_reg;
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7759 load_heap_oop(temp2_reg, Address(mh_reg, delayed_value(java_dyn_MethodHandle::type_offset_in_bytes, temp_reg)));
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7760 load_heap_oop(temp2_reg, Address(temp2_reg, delayed_value(java_dyn_MethodType::form_offset_in_bytes, temp_reg)));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7761 movl(vmslots_reg, Address(temp2_reg, delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, temp_reg)));
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7762 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7763 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7764
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7765
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7766 // registers on entry:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7767 // - rcx: method handle
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7768 // - rdx: killable temp (interpreted only)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7769 // - rax: killable temp (compiled only)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7770 void MacroAssembler::jump_to_method_handle_entry(Register mh_reg, Register temp_reg) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7771 assert(mh_reg == rcx, "caller must put MH object in rcx");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7772 assert_different_registers(mh_reg, temp_reg);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7773
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7774 // pick out the interpreted side of the handler
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7775 // NOTE: vmentry is not an oop!
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7776 movptr(temp_reg, Address(mh_reg, delayed_value(java_dyn_MethodHandle::vmentry_offset_in_bytes, temp_reg)));
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7777
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7778 // off we go...
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7779 jmp(Address(temp_reg, MethodHandleEntry::from_interpreted_entry_offset_in_bytes()));
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7780
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7781 // for the various stubs which take control at this point,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7782 // see MethodHandles::generate_method_handle_stub
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7783 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7784
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7785
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7786 Address MacroAssembler::argument_address(RegisterOrConstant arg_slot,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7787 int extra_slot_offset) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7788 // cf. TemplateTable::prepare_invoke(), if (load_receiver).
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
7789 int stackElementSize = Interpreter::stackElementSize;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7790 int offset = Interpreter::expr_offset_in_bytes(extra_slot_offset+0);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7791 #ifdef ASSERT
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7792 int offset1 = Interpreter::expr_offset_in_bytes(extra_slot_offset+1);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7793 assert(offset1 - offset == stackElementSize, "correct arithmetic");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7794 #endif
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7795 Register scale_reg = noreg;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7796 Address::ScaleFactor scale_factor = Address::no_scale;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7797 if (arg_slot.is_constant()) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7798 offset += arg_slot.as_constant() * stackElementSize;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7799 } else {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7800 scale_reg = arg_slot.as_register();
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7801 scale_factor = Address::times(stackElementSize);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7802 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7803 offset += wordSize; // return PC is on stack
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7804 return Address(rsp, scale_reg, scale_factor, offset);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7805 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7806
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7807
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7808 void MacroAssembler::verify_oop_addr(Address addr, const char* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
7809 if (!VerifyOops) return;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7810
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7811 // Address adjust(addr.base(), addr.index(), addr.scale(), addr.disp() + BytesPerWord);
a61af66fc99e Initial load
duke
parents:
diff changeset
7812 // Pass register number to verify_oop_subroutine
a61af66fc99e Initial load
duke
parents:
diff changeset
7813 char* b = new char[strlen(s) + 50];
a61af66fc99e Initial load
duke
parents:
diff changeset
7814 sprintf(b, "verify_oop_addr: %s", s);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7815
1583
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7816 #ifdef _LP64
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7817 push(rscratch1); // save r10, trashed by movptr()
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7818 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7819 push(rax); // save rax,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7820 // addr may contain rsp so we will have to adjust it based on the push
a61af66fc99e Initial load
duke
parents:
diff changeset
7821 // we just did
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7822 // NOTE: 64bit seemed to have had a bug in that it did movq(addr, rax); which
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7823 // stores rax into addr which is backwards of what was intended.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7824 if (addr.uses(rsp)) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7825 lea(rax, addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7826 pushptr(Address(rax, BytesPerWord));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7827 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7828 pushptr(addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7829 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7830
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7831 ExternalAddress buffer((address) b);
a61af66fc99e Initial load
duke
parents:
diff changeset
7832 // pass msg argument
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7833 // avoid using pushptr, as it modifies scratch registers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7834 // and our contract is not to modify anything
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7835 movptr(rax, buffer.addr());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7836 push(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7837
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7838 // call indirectly to solve generation ordering problem
a61af66fc99e Initial load
duke
parents:
diff changeset
7839 movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address()));
a61af66fc99e Initial load
duke
parents:
diff changeset
7840 call(rax);
1583
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7841 // Caller pops the arguments (addr, message) and restores rax, r10.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7842 }
a61af66fc99e Initial load
duke
parents:
diff changeset
7843
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7844 void MacroAssembler::verify_tlab() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7845 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7846 if (UseTLAB && VerifyOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7847 Label next, ok;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7848 Register t1 = rsi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7849 Register thread_reg = NOT_LP64(rbx) LP64_ONLY(r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7850
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7851 push(t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7852 NOT_LP64(push(thread_reg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7853 NOT_LP64(get_thread(thread_reg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7854
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7855 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7856 cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_start_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7857 jcc(Assembler::aboveEqual, next);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7858 stop("assert(top >= start)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7859 should_not_reach_here();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7860
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7861 bind(next);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7862 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_end_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7863 cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7864 jcc(Assembler::aboveEqual, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7865 stop("assert(top <= end)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7866 should_not_reach_here();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7867
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7868 bind(ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7869 NOT_LP64(pop(thread_reg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7870 pop(t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7871 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7872 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7873 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7874
a61af66fc99e Initial load
duke
parents:
diff changeset
7875 class ControlWord {
a61af66fc99e Initial load
duke
parents:
diff changeset
7876 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
7877 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
7878
a61af66fc99e Initial load
duke
parents:
diff changeset
7879 int rounding_control() const { return (_value >> 10) & 3 ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7880 int precision_control() const { return (_value >> 8) & 3 ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7881 bool precision() const { return ((_value >> 5) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7882 bool underflow() const { return ((_value >> 4) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7883 bool overflow() const { return ((_value >> 3) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7884 bool zero_divide() const { return ((_value >> 2) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7885 bool denormalized() const { return ((_value >> 1) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7886 bool invalid() const { return ((_value >> 0) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7887
a61af66fc99e Initial load
duke
parents:
diff changeset
7888 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
7889 // rounding control
a61af66fc99e Initial load
duke
parents:
diff changeset
7890 const char* rc;
a61af66fc99e Initial load
duke
parents:
diff changeset
7891 switch (rounding_control()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
7892 case 0: rc = "round near"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
7893 case 1: rc = "round down"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
7894 case 2: rc = "round up "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
7895 case 3: rc = "chop "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
7896 };
a61af66fc99e Initial load
duke
parents:
diff changeset
7897 // precision control
a61af66fc99e Initial load
duke
parents:
diff changeset
7898 const char* pc;
a61af66fc99e Initial load
duke
parents:
diff changeset
7899 switch (precision_control()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
7900 case 0: pc = "24 bits "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
7901 case 1: pc = "reserved"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
7902 case 2: pc = "53 bits "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
7903 case 3: pc = "64 bits "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
7904 };
a61af66fc99e Initial load
duke
parents:
diff changeset
7905 // flags
a61af66fc99e Initial load
duke
parents:
diff changeset
7906 char f[9];
a61af66fc99e Initial load
duke
parents:
diff changeset
7907 f[0] = ' ';
a61af66fc99e Initial load
duke
parents:
diff changeset
7908 f[1] = ' ';
a61af66fc99e Initial load
duke
parents:
diff changeset
7909 f[2] = (precision ()) ? 'P' : 'p';
a61af66fc99e Initial load
duke
parents:
diff changeset
7910 f[3] = (underflow ()) ? 'U' : 'u';
a61af66fc99e Initial load
duke
parents:
diff changeset
7911 f[4] = (overflow ()) ? 'O' : 'o';
a61af66fc99e Initial load
duke
parents:
diff changeset
7912 f[5] = (zero_divide ()) ? 'Z' : 'z';
a61af66fc99e Initial load
duke
parents:
diff changeset
7913 f[6] = (denormalized()) ? 'D' : 'd';
a61af66fc99e Initial load
duke
parents:
diff changeset
7914 f[7] = (invalid ()) ? 'I' : 'i';
a61af66fc99e Initial load
duke
parents:
diff changeset
7915 f[8] = '\x0';
a61af66fc99e Initial load
duke
parents:
diff changeset
7916 // output
a61af66fc99e Initial load
duke
parents:
diff changeset
7917 printf("%04x masks = %s, %s, %s", _value & 0xFFFF, f, rc, pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
7918 }
a61af66fc99e Initial load
duke
parents:
diff changeset
7919
a61af66fc99e Initial load
duke
parents:
diff changeset
7920 };
a61af66fc99e Initial load
duke
parents:
diff changeset
7921
a61af66fc99e Initial load
duke
parents:
diff changeset
7922 class StatusWord {
a61af66fc99e Initial load
duke
parents:
diff changeset
7923 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
7924 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
7925
a61af66fc99e Initial load
duke
parents:
diff changeset
7926 bool busy() const { return ((_value >> 15) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7927 bool C3() const { return ((_value >> 14) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7928 bool C2() const { return ((_value >> 10) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7929 bool C1() const { return ((_value >> 9) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7930 bool C0() const { return ((_value >> 8) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7931 int top() const { return (_value >> 11) & 7 ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7932 bool error_status() const { return ((_value >> 7) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7933 bool stack_fault() const { return ((_value >> 6) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7934 bool precision() const { return ((_value >> 5) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7935 bool underflow() const { return ((_value >> 4) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7936 bool overflow() const { return ((_value >> 3) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7937 bool zero_divide() const { return ((_value >> 2) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7938 bool denormalized() const { return ((_value >> 1) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7939 bool invalid() const { return ((_value >> 0) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7940
a61af66fc99e Initial load
duke
parents:
diff changeset
7941 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
7942 // condition codes
a61af66fc99e Initial load
duke
parents:
diff changeset
7943 char c[5];
a61af66fc99e Initial load
duke
parents:
diff changeset
7944 c[0] = (C3()) ? '3' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
7945 c[1] = (C2()) ? '2' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
7946 c[2] = (C1()) ? '1' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
7947 c[3] = (C0()) ? '0' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
7948 c[4] = '\x0';
a61af66fc99e Initial load
duke
parents:
diff changeset
7949 // flags
a61af66fc99e Initial load
duke
parents:
diff changeset
7950 char f[9];
a61af66fc99e Initial load
duke
parents:
diff changeset
7951 f[0] = (error_status()) ? 'E' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
7952 f[1] = (stack_fault ()) ? 'S' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
7953 f[2] = (precision ()) ? 'P' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
7954 f[3] = (underflow ()) ? 'U' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
7955 f[4] = (overflow ()) ? 'O' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
7956 f[5] = (zero_divide ()) ? 'Z' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
7957 f[6] = (denormalized()) ? 'D' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
7958 f[7] = (invalid ()) ? 'I' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
7959 f[8] = '\x0';
a61af66fc99e Initial load
duke
parents:
diff changeset
7960 // output
a61af66fc99e Initial load
duke
parents:
diff changeset
7961 printf("%04x flags = %s, cc = %s, top = %d", _value & 0xFFFF, f, c, top());
a61af66fc99e Initial load
duke
parents:
diff changeset
7962 }
a61af66fc99e Initial load
duke
parents:
diff changeset
7963
a61af66fc99e Initial load
duke
parents:
diff changeset
7964 };
a61af66fc99e Initial load
duke
parents:
diff changeset
7965
a61af66fc99e Initial load
duke
parents:
diff changeset
7966 class TagWord {
a61af66fc99e Initial load
duke
parents:
diff changeset
7967 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
7968 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
7969
a61af66fc99e Initial load
duke
parents:
diff changeset
7970 int tag_at(int i) const { return (_value >> (i*2)) & 3; }
a61af66fc99e Initial load
duke
parents:
diff changeset
7971
a61af66fc99e Initial load
duke
parents:
diff changeset
7972 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
7973 printf("%04x", _value & 0xFFFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
7974 }
a61af66fc99e Initial load
duke
parents:
diff changeset
7975
a61af66fc99e Initial load
duke
parents:
diff changeset
7976 };
a61af66fc99e Initial load
duke
parents:
diff changeset
7977
a61af66fc99e Initial load
duke
parents:
diff changeset
7978 class FPU_Register {
a61af66fc99e Initial load
duke
parents:
diff changeset
7979 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
7980 int32_t _m0;
a61af66fc99e Initial load
duke
parents:
diff changeset
7981 int32_t _m1;
a61af66fc99e Initial load
duke
parents:
diff changeset
7982 int16_t _ex;
a61af66fc99e Initial load
duke
parents:
diff changeset
7983
a61af66fc99e Initial load
duke
parents:
diff changeset
7984 bool is_indefinite() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
7985 return _ex == -1 && _m1 == (int32_t)0xC0000000 && _m0 == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
7986 }
a61af66fc99e Initial load
duke
parents:
diff changeset
7987
a61af66fc99e Initial load
duke
parents:
diff changeset
7988 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
7989 char sign = (_ex < 0) ? '-' : '+';
a61af66fc99e Initial load
duke
parents:
diff changeset
7990 const char* kind = (_ex == 0x7FFF || _ex == (int16_t)-1) ? "NaN" : " ";
a61af66fc99e Initial load
duke
parents:
diff changeset
7991 printf("%c%04hx.%08x%08x %s", sign, _ex, _m1, _m0, kind);
a61af66fc99e Initial load
duke
parents:
diff changeset
7992 };
a61af66fc99e Initial load
duke
parents:
diff changeset
7993
a61af66fc99e Initial load
duke
parents:
diff changeset
7994 };
a61af66fc99e Initial load
duke
parents:
diff changeset
7995
a61af66fc99e Initial load
duke
parents:
diff changeset
7996 class FPU_State {
a61af66fc99e Initial load
duke
parents:
diff changeset
7997 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
7998 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
7999 register_size = 10,
a61af66fc99e Initial load
duke
parents:
diff changeset
8000 number_of_registers = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
8001 register_mask = 7
a61af66fc99e Initial load
duke
parents:
diff changeset
8002 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8003
a61af66fc99e Initial load
duke
parents:
diff changeset
8004 ControlWord _control_word;
a61af66fc99e Initial load
duke
parents:
diff changeset
8005 StatusWord _status_word;
a61af66fc99e Initial load
duke
parents:
diff changeset
8006 TagWord _tag_word;
a61af66fc99e Initial load
duke
parents:
diff changeset
8007 int32_t _error_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
8008 int32_t _error_selector;
a61af66fc99e Initial load
duke
parents:
diff changeset
8009 int32_t _data_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
8010 int32_t _data_selector;
a61af66fc99e Initial load
duke
parents:
diff changeset
8011 int8_t _register[register_size * number_of_registers];
a61af66fc99e Initial load
duke
parents:
diff changeset
8012
a61af66fc99e Initial load
duke
parents:
diff changeset
8013 int tag_for_st(int i) const { return _tag_word.tag_at((_status_word.top() + i) & register_mask); }
a61af66fc99e Initial load
duke
parents:
diff changeset
8014 FPU_Register* st(int i) const { return (FPU_Register*)&_register[register_size * i]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8015
a61af66fc99e Initial load
duke
parents:
diff changeset
8016 const char* tag_as_string(int tag) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8017 switch (tag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8018 case 0: return "valid";
a61af66fc99e Initial load
duke
parents:
diff changeset
8019 case 1: return "zero";
a61af66fc99e Initial load
duke
parents:
diff changeset
8020 case 2: return "special";
a61af66fc99e Initial load
duke
parents:
diff changeset
8021 case 3: return "empty";
a61af66fc99e Initial load
duke
parents:
diff changeset
8022 }
1489
cff162798819 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 1369
diff changeset
8023 ShouldNotReachHere();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8024 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
8025 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8026
a61af66fc99e Initial load
duke
parents:
diff changeset
8027 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8028 // print computation registers
a61af66fc99e Initial load
duke
parents:
diff changeset
8029 { int t = _status_word.top();
a61af66fc99e Initial load
duke
parents:
diff changeset
8030 for (int i = 0; i < number_of_registers; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8031 int j = (i - t) & register_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
8032 printf("%c r%d = ST%d = ", (j == 0 ? '*' : ' '), i, j);
a61af66fc99e Initial load
duke
parents:
diff changeset
8033 st(j)->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8034 printf(" %s\n", tag_as_string(_tag_word.tag_at(i)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8035 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8036 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8037 printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8038 // print control registers
a61af66fc99e Initial load
duke
parents:
diff changeset
8039 printf("ctrl = "); _control_word.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8040 printf("stat = "); _status_word .print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8041 printf("tags = "); _tag_word .print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8042 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8043
a61af66fc99e Initial load
duke
parents:
diff changeset
8044 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8045
a61af66fc99e Initial load
duke
parents:
diff changeset
8046 class Flag_Register {
a61af66fc99e Initial load
duke
parents:
diff changeset
8047 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8048 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
8049
a61af66fc99e Initial load
duke
parents:
diff changeset
8050 bool overflow() const { return ((_value >> 11) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8051 bool direction() const { return ((_value >> 10) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8052 bool sign() const { return ((_value >> 7) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8053 bool zero() const { return ((_value >> 6) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8054 bool auxiliary_carry() const { return ((_value >> 4) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8055 bool parity() const { return ((_value >> 2) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8056 bool carry() const { return ((_value >> 0) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8057
a61af66fc99e Initial load
duke
parents:
diff changeset
8058 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8059 // flags
a61af66fc99e Initial load
duke
parents:
diff changeset
8060 char f[8];
a61af66fc99e Initial load
duke
parents:
diff changeset
8061 f[0] = (overflow ()) ? 'O' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8062 f[1] = (direction ()) ? 'D' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8063 f[2] = (sign ()) ? 'S' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8064 f[3] = (zero ()) ? 'Z' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8065 f[4] = (auxiliary_carry()) ? 'A' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8066 f[5] = (parity ()) ? 'P' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8067 f[6] = (carry ()) ? 'C' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8068 f[7] = '\x0';
a61af66fc99e Initial load
duke
parents:
diff changeset
8069 // output
a61af66fc99e Initial load
duke
parents:
diff changeset
8070 printf("%08x flags = %s", _value, f);
a61af66fc99e Initial load
duke
parents:
diff changeset
8071 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8072
a61af66fc99e Initial load
duke
parents:
diff changeset
8073 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8074
a61af66fc99e Initial load
duke
parents:
diff changeset
8075 class IU_Register {
a61af66fc99e Initial load
duke
parents:
diff changeset
8076 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8077 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
8078
a61af66fc99e Initial load
duke
parents:
diff changeset
8079 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8080 printf("%08x %11d", _value, _value);
a61af66fc99e Initial load
duke
parents:
diff changeset
8081 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8082
a61af66fc99e Initial load
duke
parents:
diff changeset
8083 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8084
a61af66fc99e Initial load
duke
parents:
diff changeset
8085 class IU_State {
a61af66fc99e Initial load
duke
parents:
diff changeset
8086 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8087 Flag_Register _eflags;
a61af66fc99e Initial load
duke
parents:
diff changeset
8088 IU_Register _rdi;
a61af66fc99e Initial load
duke
parents:
diff changeset
8089 IU_Register _rsi;
a61af66fc99e Initial load
duke
parents:
diff changeset
8090 IU_Register _rbp;
a61af66fc99e Initial load
duke
parents:
diff changeset
8091 IU_Register _rsp;
a61af66fc99e Initial load
duke
parents:
diff changeset
8092 IU_Register _rbx;
a61af66fc99e Initial load
duke
parents:
diff changeset
8093 IU_Register _rdx;
a61af66fc99e Initial load
duke
parents:
diff changeset
8094 IU_Register _rcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
8095 IU_Register _rax;
a61af66fc99e Initial load
duke
parents:
diff changeset
8096
a61af66fc99e Initial load
duke
parents:
diff changeset
8097 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8098 // computation registers
a61af66fc99e Initial load
duke
parents:
diff changeset
8099 printf("rax, = "); _rax.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8100 printf("rbx, = "); _rbx.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8101 printf("rcx = "); _rcx.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8102 printf("rdx = "); _rdx.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8103 printf("rdi = "); _rdi.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8104 printf("rsi = "); _rsi.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8105 printf("rbp, = "); _rbp.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8106 printf("rsp = "); _rsp.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8107 printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8108 // control registers
a61af66fc99e Initial load
duke
parents:
diff changeset
8109 printf("flgs = "); _eflags.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8111 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8112
a61af66fc99e Initial load
duke
parents:
diff changeset
8113
a61af66fc99e Initial load
duke
parents:
diff changeset
8114 class CPU_State {
a61af66fc99e Initial load
duke
parents:
diff changeset
8115 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8116 FPU_State _fpu_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
8117 IU_State _iu_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
8118
a61af66fc99e Initial load
duke
parents:
diff changeset
8119 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8120 printf("--------------------------------------------------\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8121 _iu_state .print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8122 printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8123 _fpu_state.print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8124 printf("--------------------------------------------------\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8126
a61af66fc99e Initial load
duke
parents:
diff changeset
8127 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8128
a61af66fc99e Initial load
duke
parents:
diff changeset
8129
a61af66fc99e Initial load
duke
parents:
diff changeset
8130 static void _print_CPU_state(CPU_State* state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8131 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8132 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8133
a61af66fc99e Initial load
duke
parents:
diff changeset
8134
a61af66fc99e Initial load
duke
parents:
diff changeset
8135 void MacroAssembler::print_CPU_state() {
a61af66fc99e Initial load
duke
parents:
diff changeset
8136 push_CPU_state();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8137 push(rsp); // pass CPU state
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8138 call(RuntimeAddress(CAST_FROM_FN_PTR(address, _print_CPU_state)));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8139 addptr(rsp, wordSize); // discard argument
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8140 pop_CPU_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
8141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8142
a61af66fc99e Initial load
duke
parents:
diff changeset
8143
a61af66fc99e Initial load
duke
parents:
diff changeset
8144 static bool _verify_FPU(int stack_depth, char* s, CPU_State* state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8145 static int counter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
8146 FPU_State* fs = &state->_fpu_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
8147 counter++;
a61af66fc99e Initial load
duke
parents:
diff changeset
8148 // For leaf calls, only verify that the top few elements remain empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
8149 // We only need 1 empty at the top for C2 code.
a61af66fc99e Initial load
duke
parents:
diff changeset
8150 if( stack_depth < 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8151 if( fs->tag_for_st(7) != 3 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8152 printf("FPR7 not empty\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8153 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8154 assert(false, "error");
a61af66fc99e Initial load
duke
parents:
diff changeset
8155 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
8156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8157 return true; // All other stack states do not matter
a61af66fc99e Initial load
duke
parents:
diff changeset
8158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8159
a61af66fc99e Initial load
duke
parents:
diff changeset
8160 assert((fs->_control_word._value & 0xffff) == StubRoutines::_fpu_cntrl_wrd_std,
a61af66fc99e Initial load
duke
parents:
diff changeset
8161 "bad FPU control word");
a61af66fc99e Initial load
duke
parents:
diff changeset
8162
a61af66fc99e Initial load
duke
parents:
diff changeset
8163 // compute stack depth
a61af66fc99e Initial load
duke
parents:
diff changeset
8164 int i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
8165 while (i < FPU_State::number_of_registers && fs->tag_for_st(i) < 3) i++;
a61af66fc99e Initial load
duke
parents:
diff changeset
8166 int d = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
8167 while (i < FPU_State::number_of_registers && fs->tag_for_st(i) == 3) i++;
a61af66fc99e Initial load
duke
parents:
diff changeset
8168 // verify findings
a61af66fc99e Initial load
duke
parents:
diff changeset
8169 if (i != FPU_State::number_of_registers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8170 // stack not contiguous
a61af66fc99e Initial load
duke
parents:
diff changeset
8171 printf("%s: stack not contiguous at ST%d\n", s, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
8172 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8173 assert(false, "error");
a61af66fc99e Initial load
duke
parents:
diff changeset
8174 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
8175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8176 // check if computed stack depth corresponds to expected stack depth
a61af66fc99e Initial load
duke
parents:
diff changeset
8177 if (stack_depth < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8178 // expected stack depth is -stack_depth or less
a61af66fc99e Initial load
duke
parents:
diff changeset
8179 if (d > -stack_depth) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8180 // too many elements on the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
8181 printf("%s: <= %d stack elements expected but found %d\n", s, -stack_depth, d);
a61af66fc99e Initial load
duke
parents:
diff changeset
8182 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8183 assert(false, "error");
a61af66fc99e Initial load
duke
parents:
diff changeset
8184 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
8185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8186 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
8187 // expected stack depth is stack_depth
a61af66fc99e Initial load
duke
parents:
diff changeset
8188 if (d != stack_depth) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8189 // wrong stack depth
a61af66fc99e Initial load
duke
parents:
diff changeset
8190 printf("%s: %d stack elements expected but found %d\n", s, stack_depth, d);
a61af66fc99e Initial load
duke
parents:
diff changeset
8191 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8192 assert(false, "error");
a61af66fc99e Initial load
duke
parents:
diff changeset
8193 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
8194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8196 // everything is cool
a61af66fc99e Initial load
duke
parents:
diff changeset
8197 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
8198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8199
a61af66fc99e Initial load
duke
parents:
diff changeset
8200
a61af66fc99e Initial load
duke
parents:
diff changeset
8201 void MacroAssembler::verify_FPU(int stack_depth, const char* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8202 if (!VerifyFPU) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
8203 push_CPU_state();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8204 push(rsp); // pass CPU state
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8205 ExternalAddress msg((address) s);
a61af66fc99e Initial load
duke
parents:
diff changeset
8206 // pass message string s
a61af66fc99e Initial load
duke
parents:
diff changeset
8207 pushptr(msg.addr());
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8208 push(stack_depth); // pass stack depth
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8209 call(RuntimeAddress(CAST_FROM_FN_PTR(address, _verify_FPU)));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8210 addptr(rsp, 3 * wordSize); // discard arguments
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8211 // check for error
a61af66fc99e Initial load
duke
parents:
diff changeset
8212 { Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
8213 testl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
8214 jcc(Assembler::notZero, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
8215 int3(); // break if error condition
a61af66fc99e Initial load
duke
parents:
diff changeset
8216 bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
8217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8218 pop_CPU_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
8219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8220
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8221 void MacroAssembler::load_klass(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8222 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8223 if (UseCompressedOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8224 movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8225 decode_heap_oop_not_null(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8226 } else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8227 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8228 movptr(dst, Address(src, oopDesc::klass_offset_in_bytes()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8229 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8230
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8231 void MacroAssembler::load_prototype_header(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8232 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8233 if (UseCompressedOops) {
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8234 assert (Universe::heap() != NULL, "java heap should be initialized");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8235 movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8236 if (Universe::narrow_oop_shift() != 0) {
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8237 assert(LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8238 if (LogMinObjAlignmentInBytes == Address::times_8) {
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8239 movq(dst, Address(r12_heapbase, dst, Address::times_8, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8240 } else {
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8241 // OK to use shift since we don't need to preserve flags.
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8242 shlq(dst, LogMinObjAlignmentInBytes);
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8243 movq(dst, Address(r12_heapbase, dst, Address::times_1, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8244 }
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8245 } else {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8246 movq(dst, Address(dst, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8247 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8248 } else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8249 #endif
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8250 {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8251 movptr(dst, Address(src, oopDesc::klass_offset_in_bytes()));
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8252 movptr(dst, Address(dst, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8253 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8254 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8255
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8256 void MacroAssembler::store_klass(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8257 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8258 if (UseCompressedOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8259 encode_heap_oop_not_null(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8260 movl(Address(dst, oopDesc::klass_offset_in_bytes()), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8261 } else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8262 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8263 movptr(Address(dst, oopDesc::klass_offset_in_bytes()), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8264 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8265
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8266 void MacroAssembler::load_heap_oop(Register dst, Address src) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8267 #ifdef _LP64
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8268 if (UseCompressedOops) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8269 movl(dst, src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8270 decode_heap_oop(dst);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8271 } else
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8272 #endif
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8273 movptr(dst, src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8274 }
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8275
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8276 void MacroAssembler::store_heap_oop(Address dst, Register src) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8277 #ifdef _LP64
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8278 if (UseCompressedOops) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8279 assert(!dst.uses(src), "not enough registers");
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8280 encode_heap_oop(src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8281 movl(dst, src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8282 } else
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8283 #endif
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8284 movptr(dst, src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8285 }
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8286
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8287 // Used for storing NULLs.
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8288 void MacroAssembler::store_heap_oop_null(Address dst) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8289 #ifdef _LP64
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8290 if (UseCompressedOops) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8291 movl(dst, (int32_t)NULL_WORD);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8292 } else {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8293 movslq(dst, (int32_t)NULL_WORD);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8294 }
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8295 #else
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8296 movl(dst, (int32_t)NULL_WORD);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8297 #endif
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8298 }
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8299
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8300 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8301 void MacroAssembler::store_klass_gap(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8302 if (UseCompressedOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8303 // Store to klass gap in destination
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8304 movl(Address(dst, oopDesc::klass_gap_offset_in_bytes()), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8305 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8306 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8307
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8308 #ifdef ASSERT
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8309 void MacroAssembler::verify_heapbase(const char* msg) {
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8310 assert (UseCompressedOops, "should be compressed");
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8311 assert (Universe::heap() != NULL, "java heap should be initialized");
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8312 if (CheckCompressedOops) {
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8313 Label ok;
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8314 push(rscratch1); // cmpptr trashes rscratch1
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8315 cmpptr(r12_heapbase, ExternalAddress((address)Universe::narrow_oop_base_addr()));
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8316 jcc(Assembler::equal, ok);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8317 stop(msg);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8318 bind(ok);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8319 pop(rscratch1);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8320 }
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8321 }
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8322 #endif
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8323
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8324 // Algorithm must match oop.inline.hpp encode_heap_oop.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8325 void MacroAssembler::encode_heap_oop(Register r) {
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8326 #ifdef ASSERT
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8327 verify_heapbase("MacroAssembler::encode_heap_oop: heap base corrupted?");
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8328 #endif
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8329 verify_oop(r, "broken oop in encode_heap_oop");
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8330 if (Universe::narrow_oop_base() == NULL) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8331 if (Universe::narrow_oop_shift() != 0) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8332 assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8333 shrq(r, LogMinObjAlignmentInBytes);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8334 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8335 return;
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8336 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8337 testq(r, r);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8338 cmovq(Assembler::equal, r, r12_heapbase);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8339 subq(r, r12_heapbase);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8340 shrq(r, LogMinObjAlignmentInBytes);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8341 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8342
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8343 void MacroAssembler::encode_heap_oop_not_null(Register r) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8344 #ifdef ASSERT
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8345 verify_heapbase("MacroAssembler::encode_heap_oop_not_null: heap base corrupted?");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8346 if (CheckCompressedOops) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8347 Label ok;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8348 testq(r, r);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8349 jcc(Assembler::notEqual, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8350 stop("null oop passed to encode_heap_oop_not_null");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8351 bind(ok);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8352 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8353 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8354 verify_oop(r, "broken oop in encode_heap_oop_not_null");
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8355 if (Universe::narrow_oop_base() != NULL) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8356 subq(r, r12_heapbase);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8357 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8358 if (Universe::narrow_oop_shift() != 0) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8359 assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8360 shrq(r, LogMinObjAlignmentInBytes);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8361 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8362 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8363
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8364 void MacroAssembler::encode_heap_oop_not_null(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8365 #ifdef ASSERT
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8366 verify_heapbase("MacroAssembler::encode_heap_oop_not_null2: heap base corrupted?");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8367 if (CheckCompressedOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8368 Label ok;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8369 testq(src, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8370 jcc(Assembler::notEqual, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8371 stop("null oop passed to encode_heap_oop_not_null2");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8372 bind(ok);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8374 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8375 verify_oop(src, "broken oop in encode_heap_oop_not_null2");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8376 if (dst != src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8377 movq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8378 }
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8379 if (Universe::narrow_oop_base() != NULL) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8380 subq(dst, r12_heapbase);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8381 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8382 if (Universe::narrow_oop_shift() != 0) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8383 assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8384 shrq(dst, LogMinObjAlignmentInBytes);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8385 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8386 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8387
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8388 void MacroAssembler::decode_heap_oop(Register r) {
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8389 #ifdef ASSERT
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8390 verify_heapbase("MacroAssembler::decode_heap_oop: heap base corrupted?");
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8391 #endif
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8392 if (Universe::narrow_oop_base() == NULL) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8393 if (Universe::narrow_oop_shift() != 0) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8394 assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8395 shlq(r, LogMinObjAlignmentInBytes);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8396 }
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8397 } else {
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8398 Label done;
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8399 shlq(r, LogMinObjAlignmentInBytes);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8400 jccb(Assembler::equal, done);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8401 addq(r, r12_heapbase);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8402 bind(done);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8403 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8404 verify_oop(r, "broken oop in decode_heap_oop");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8405 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8406
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8407 void MacroAssembler::decode_heap_oop_not_null(Register r) {
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8408 // Note: it will change flags
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8409 assert (UseCompressedOops, "should only be used for compressed headers");
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8410 assert (Universe::heap() != NULL, "java heap should be initialized");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8411 // Cannot assert, unverified entry point counts instructions (see .ad file)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8412 // vtableStubs also counts instructions in pd_code_size_limit.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8413 // Also do not verify_oop as this is called by verify_oop.
898
60fea60a6db5 6864914: SPECjvm2008 produces invalid result with zero based Compressed Oops
kvn
parents: 845
diff changeset
8414 if (Universe::narrow_oop_shift() != 0) {
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8415 assert(LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8416 shlq(r, LogMinObjAlignmentInBytes);
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8417 if (Universe::narrow_oop_base() != NULL) {
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8418 addq(r, r12_heapbase);
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8419 }
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8420 } else {
898
60fea60a6db5 6864914: SPECjvm2008 produces invalid result with zero based Compressed Oops
kvn
parents: 845
diff changeset
8421 assert (Universe::narrow_oop_base() == NULL, "sanity");
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8422 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8423 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8424
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8425 void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) {
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8426 // Note: it will change flags
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8427 assert (UseCompressedOops, "should only be used for compressed headers");
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8428 assert (Universe::heap() != NULL, "java heap should be initialized");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8429 // Cannot assert, unverified entry point counts instructions (see .ad file)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8430 // vtableStubs also counts instructions in pd_code_size_limit.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8431 // Also do not verify_oop as this is called by verify_oop.
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8432 if (Universe::narrow_oop_shift() != 0) {
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8433 assert(LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8434 if (LogMinObjAlignmentInBytes == Address::times_8) {
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8435 leaq(dst, Address(r12_heapbase, src, Address::times_8, 0));
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8436 } else {
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8437 if (dst != src) {
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8438 movq(dst, src);
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8439 }
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8440 shlq(dst, LogMinObjAlignmentInBytes);
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8441 if (Universe::narrow_oop_base() != NULL) {
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8442 addq(dst, r12_heapbase);
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8443 }
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8444 }
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8445 } else {
898
60fea60a6db5 6864914: SPECjvm2008 produces invalid result with zero based Compressed Oops
kvn
parents: 845
diff changeset
8446 assert (Universe::narrow_oop_base() == NULL, "sanity");
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8447 if (dst != src) {
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8448 movq(dst, src);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8449 }
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8450 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8451 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8452
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8453 void MacroAssembler::set_narrow_oop(Register dst, jobject obj) {
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8454 assert (UseCompressedOops, "should only be used for compressed headers");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8455 assert (Universe::heap() != NULL, "java heap should be initialized");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8456 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8457 int oop_index = oop_recorder()->find_index(obj);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8458 RelocationHolder rspec = oop_Relocation::spec(oop_index);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8459 mov_narrow_oop(dst, oop_index, rspec);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8460 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8461
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8462 void MacroAssembler::set_narrow_oop(Address dst, jobject obj) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8463 assert (UseCompressedOops, "should only be used for compressed headers");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8464 assert (Universe::heap() != NULL, "java heap should be initialized");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8465 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8466 int oop_index = oop_recorder()->find_index(obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8467 RelocationHolder rspec = oop_Relocation::spec(oop_index);
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8468 mov_narrow_oop(dst, oop_index, rspec);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8469 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8470
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8471 void MacroAssembler::cmp_narrow_oop(Register dst, jobject obj) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8472 assert (UseCompressedOops, "should only be used for compressed headers");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8473 assert (Universe::heap() != NULL, "java heap should be initialized");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8474 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8475 int oop_index = oop_recorder()->find_index(obj);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8476 RelocationHolder rspec = oop_Relocation::spec(oop_index);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8477 Assembler::cmp_narrow_oop(dst, oop_index, rspec);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8478 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8479
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8480 void MacroAssembler::cmp_narrow_oop(Address dst, jobject obj) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8481 assert (UseCompressedOops, "should only be used for compressed headers");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8482 assert (Universe::heap() != NULL, "java heap should be initialized");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8483 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8484 int oop_index = oop_recorder()->find_index(obj);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8485 RelocationHolder rspec = oop_Relocation::spec(oop_index);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8486 Assembler::cmp_narrow_oop(dst, oop_index, rspec);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8487 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8488
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8489 void MacroAssembler::reinit_heapbase() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8490 if (UseCompressedOops) {
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8491 movptr(r12_heapbase, ExternalAddress((address)Universe::narrow_oop_base_addr()));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8492 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8493 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8494 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8495
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8496 // IndexOf substring.
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8497 void MacroAssembler::string_indexof(Register str1, Register str2,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8498 Register cnt1, Register cnt2, Register result,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8499 XMMRegister vec, Register tmp) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8500 assert(UseSSE42Intrinsics, "SSE4.2 is required");
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8501
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8502 Label RELOAD_SUBSTR, PREP_FOR_SCAN, SCAN_TO_SUBSTR,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8503 SCAN_SUBSTR, RET_NOT_FOUND, CLEANUP;
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8504
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8505 push(str1); // string addr
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8506 push(str2); // substr addr
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8507 push(cnt2); // substr count
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8508 jmpb(PREP_FOR_SCAN);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8509
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8510 // Substr count saved at sp
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8511 // Substr saved at sp+1*wordSize
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8512 // String saved at sp+2*wordSize
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8513
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8514 // Reload substr for rescan
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8515 bind(RELOAD_SUBSTR);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8516 movl(cnt2, Address(rsp, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8517 movptr(str2, Address(rsp, wordSize));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8518 // We came here after the beginninig of the substring was
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8519 // matched but the rest of it was not so we need to search
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8520 // again. Start from the next element after the previous match.
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8521 subptr(str1, result); // Restore counter
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8522 shrl(str1, 1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8523 addl(cnt1, str1);
1302
2484f4d6a54e 6935535: String.indexOf() returns incorrect result on x86 with SSE4.2
kvn
parents: 1108
diff changeset
8524 decrementl(cnt1);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8525 lea(str1, Address(result, 2)); // Reload string
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8526
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8527 // Load substr
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8528 bind(PREP_FOR_SCAN);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8529 movdqu(vec, Address(str2, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8530 addl(cnt1, 8); // prime the loop
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8531 subptr(str1, 16);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8532
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8533 // Scan string for substr in 16-byte vectors
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8534 bind(SCAN_TO_SUBSTR);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8535 subl(cnt1, 8);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8536 addptr(str1, 16);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8537
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8538 // pcmpestri
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8539 // inputs:
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8540 // xmm - substring
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8541 // rax - substring length (elements count)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8542 // mem - scaned string
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8543 // rdx - string length (elements count)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8544 // 0xd - mode: 1100 (substring search) + 01 (unsigned shorts)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8545 // outputs:
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8546 // rcx - matched index in string
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8547 assert(cnt1 == rdx && cnt2 == rax && tmp == rcx, "pcmpestri");
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8548
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8549 pcmpestri(vec, Address(str1, 0), 0x0d);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8550 jcc(Assembler::above, SCAN_TO_SUBSTR); // CF == 0 && ZF == 0
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8551 jccb(Assembler::aboveEqual, RET_NOT_FOUND); // CF == 0
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8552
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8553 // Fallthrough: found a potential substr
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8554
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8555 // Make sure string is still long enough
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8556 subl(cnt1, tmp);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8557 cmpl(cnt1, cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8558 jccb(Assembler::negative, RET_NOT_FOUND);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8559 // Compute start addr of substr
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8560 lea(str1, Address(str1, tmp, Address::times_2));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8561 movptr(result, str1); // save
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8562
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8563 // Compare potential substr
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8564 addl(cnt1, 8); // prime the loop
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8565 addl(cnt2, 8);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8566 subptr(str1, 16);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8567 subptr(str2, 16);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8568
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8569 // Scan 16-byte vectors of string and substr
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8570 bind(SCAN_SUBSTR);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8571 subl(cnt1, 8);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8572 subl(cnt2, 8);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8573 addptr(str1, 16);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8574 addptr(str2, 16);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8575 movdqu(vec, Address(str2, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8576 pcmpestri(vec, Address(str1, 0), 0x0d);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8577 jcc(Assembler::noOverflow, RELOAD_SUBSTR); // OF == 0
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8578 jcc(Assembler::positive, SCAN_SUBSTR); // SF == 0
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8579
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8580 // Compute substr offset
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8581 subptr(result, Address(rsp, 2*wordSize));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8582 shrl(result, 1); // index
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8583 jmpb(CLEANUP);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8584
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8585 bind(RET_NOT_FOUND);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8586 movl(result, -1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8587
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8588 bind(CLEANUP);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8589 addptr(rsp, 3*wordSize);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8590 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8591
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8592 // Compare strings.
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8593 void MacroAssembler::string_compare(Register str1, Register str2,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8594 Register cnt1, Register cnt2, Register result,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8595 XMMRegister vec1, XMMRegister vec2) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8596 Label LENGTH_DIFF_LABEL, POP_LABEL, DONE_LABEL, WHILE_HEAD_LABEL;
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8597
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8598 // Compute the minimum of the string lengths and the
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8599 // difference of the string lengths (stack).
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8600 // Do the conditional move stuff
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8601 movl(result, cnt1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8602 subl(cnt1, cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8603 push(cnt1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8604 if (VM_Version::supports_cmov()) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8605 cmovl(Assembler::lessEqual, cnt2, result);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8606 } else {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8607 Label GT_LABEL;
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8608 jccb(Assembler::greater, GT_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8609 movl(cnt2, result);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8610 bind(GT_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8611 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8612
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8613 // Is the minimum length zero?
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8614 testl(cnt2, cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8615 jcc(Assembler::zero, LENGTH_DIFF_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8616
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8617 // Load first characters
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8618 load_unsigned_short(result, Address(str1, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8619 load_unsigned_short(cnt1, Address(str2, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8620
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8621 // Compare first characters
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8622 subl(result, cnt1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8623 jcc(Assembler::notZero, POP_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8624 decrementl(cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8625 jcc(Assembler::zero, LENGTH_DIFF_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8626
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8627 {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8628 // Check after comparing first character to see if strings are equivalent
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8629 Label LSkip2;
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8630 // Check if the strings start at same location
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8631 cmpptr(str1, str2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8632 jccb(Assembler::notEqual, LSkip2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8633
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8634 // Check if the length difference is zero (from stack)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8635 cmpl(Address(rsp, 0), 0x0);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8636 jcc(Assembler::equal, LENGTH_DIFF_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8637
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8638 // Strings might not be equivalent
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8639 bind(LSkip2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8640 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8641
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8642 // Advance to next character
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8643 addptr(str1, 2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8644 addptr(str2, 2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8645
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8646 if (UseSSE42Intrinsics) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8647 // With SSE4.2, use double quad vector compare
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8648 Label COMPARE_VECTORS, VECTOR_NOT_EQUAL, COMPARE_TAIL;
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8649 // Setup to compare 16-byte vectors
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8650 movl(cnt1, cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8651 andl(cnt2, 0xfffffff8); // cnt2 holds the vector count
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8652 andl(cnt1, 0x00000007); // cnt1 holds the tail count
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8653 testl(cnt2, cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8654 jccb(Assembler::zero, COMPARE_TAIL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8655
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8656 lea(str2, Address(str2, cnt2, Address::times_2));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8657 lea(str1, Address(str1, cnt2, Address::times_2));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8658 negptr(cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8659
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8660 bind(COMPARE_VECTORS);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8661 movdqu(vec1, Address(str1, cnt2, Address::times_2));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8662 movdqu(vec2, Address(str2, cnt2, Address::times_2));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8663 pxor(vec1, vec2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8664 ptest(vec1, vec1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8665 jccb(Assembler::notZero, VECTOR_NOT_EQUAL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8666 addptr(cnt2, 8);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8667 jcc(Assembler::notZero, COMPARE_VECTORS);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8668 jmpb(COMPARE_TAIL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8669
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8670 // Mismatched characters in the vectors
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8671 bind(VECTOR_NOT_EQUAL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8672 lea(str1, Address(str1, cnt2, Address::times_2));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8673 lea(str2, Address(str2, cnt2, Address::times_2));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8674 movl(cnt1, 8);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8675
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8676 // Compare tail (< 8 chars), or rescan last vectors to
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8677 // find 1st mismatched characters
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8678 bind(COMPARE_TAIL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8679 testl(cnt1, cnt1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8680 jccb(Assembler::zero, LENGTH_DIFF_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8681 movl(cnt2, cnt1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8682 // Fallthru to tail compare
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8683 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8684
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8685 // Shift str2 and str1 to the end of the arrays, negate min
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8686 lea(str1, Address(str1, cnt2, Address::times_2, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8687 lea(str2, Address(str2, cnt2, Address::times_2, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8688 negptr(cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8689
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8690 // Compare the rest of the characters
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8691 bind(WHILE_HEAD_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8692 load_unsigned_short(result, Address(str1, cnt2, Address::times_2, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8693 load_unsigned_short(cnt1, Address(str2, cnt2, Address::times_2, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8694 subl(result, cnt1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8695 jccb(Assembler::notZero, POP_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8696 increment(cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8697 jcc(Assembler::notZero, WHILE_HEAD_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8698
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8699 // Strings are equal up to min length. Return the length difference.
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8700 bind(LENGTH_DIFF_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8701 pop(result);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8702 jmpb(DONE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8703
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8704 // Discard the stored length difference
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8705 bind(POP_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8706 addptr(rsp, wordSize);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8707
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8708 // That's it
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8709 bind(DONE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8710 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8711
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8712 // Compare char[] arrays aligned to 4 bytes or substrings.
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8713 void MacroAssembler::char_arrays_equals(bool is_array_equ, Register ary1, Register ary2,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8714 Register limit, Register result, Register chr,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8715 XMMRegister vec1, XMMRegister vec2) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8716 Label TRUE_LABEL, FALSE_LABEL, DONE, COMPARE_VECTORS, COMPARE_CHAR;
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8717
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8718 int length_offset = arrayOopDesc::length_offset_in_bytes();
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8719 int base_offset = arrayOopDesc::base_offset_in_bytes(T_CHAR);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8720
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8721 // Check the input args
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8722 cmpptr(ary1, ary2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8723 jcc(Assembler::equal, TRUE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8724
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8725 if (is_array_equ) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8726 // Need additional checks for arrays_equals.
1016
d40f03b57795 6890984: Comparison of 2 arrays could cause VM crash
kvn
parents: 986
diff changeset
8727 testptr(ary1, ary1);
d40f03b57795 6890984: Comparison of 2 arrays could cause VM crash
kvn
parents: 986
diff changeset
8728 jcc(Assembler::zero, FALSE_LABEL);
d40f03b57795 6890984: Comparison of 2 arrays could cause VM crash
kvn
parents: 986
diff changeset
8729 testptr(ary2, ary2);
d40f03b57795 6890984: Comparison of 2 arrays could cause VM crash
kvn
parents: 986
diff changeset
8730 jcc(Assembler::zero, FALSE_LABEL);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8731
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8732 // Check the lengths
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8733 movl(limit, Address(ary1, length_offset));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8734 cmpl(limit, Address(ary2, length_offset));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8735 jcc(Assembler::notEqual, FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8736 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8737
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8738 // count == 0
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8739 testl(limit, limit);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8740 jcc(Assembler::zero, TRUE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8741
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8742 if (is_array_equ) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8743 // Load array address
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8744 lea(ary1, Address(ary1, base_offset));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8745 lea(ary2, Address(ary2, base_offset));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8746 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8747
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8748 shll(limit, 1); // byte count != 0
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8749 movl(result, limit); // copy
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8750
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8751 if (UseSSE42Intrinsics) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8752 // With SSE4.2, use double quad vector compare
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8753 Label COMPARE_WIDE_VECTORS, COMPARE_TAIL;
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8754 // Compare 16-byte vectors
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8755 andl(result, 0x0000000e); // tail count (in bytes)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8756 andl(limit, 0xfffffff0); // vector count (in bytes)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8757 jccb(Assembler::zero, COMPARE_TAIL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8758
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8759 lea(ary1, Address(ary1, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8760 lea(ary2, Address(ary2, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8761 negptr(limit);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8762
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8763 bind(COMPARE_WIDE_VECTORS);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8764 movdqu(vec1, Address(ary1, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8765 movdqu(vec2, Address(ary2, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8766 pxor(vec1, vec2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8767 ptest(vec1, vec1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8768 jccb(Assembler::notZero, FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8769 addptr(limit, 16);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8770 jcc(Assembler::notZero, COMPARE_WIDE_VECTORS);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8771
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8772 bind(COMPARE_TAIL); // limit is zero
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8773 movl(limit, result);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8774 // Fallthru to tail compare
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8775 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8776
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8777 // Compare 4-byte vectors
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8778 andl(limit, 0xfffffffc); // vector count (in bytes)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8779 jccb(Assembler::zero, COMPARE_CHAR);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8780
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8781 lea(ary1, Address(ary1, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8782 lea(ary2, Address(ary2, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8783 negptr(limit);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8784
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8785 bind(COMPARE_VECTORS);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8786 movl(chr, Address(ary1, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8787 cmpl(chr, Address(ary2, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8788 jccb(Assembler::notEqual, FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8789 addptr(limit, 4);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8790 jcc(Assembler::notZero, COMPARE_VECTORS);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8791
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8792 // Compare trailing char (final 2 bytes), if any
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8793 bind(COMPARE_CHAR);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8794 testl(result, 0x2); // tail char
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8795 jccb(Assembler::zero, TRUE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8796 load_unsigned_short(chr, Address(ary1, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8797 load_unsigned_short(limit, Address(ary2, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8798 cmpl(chr, limit);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8799 jccb(Assembler::notEqual, FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8800
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8801 bind(TRUE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8802 movl(result, 1); // return true
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8803 jmpb(DONE);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8804
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8805 bind(FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8806 xorl(result, result); // return false
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8807
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8808 // That's it
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8809 bind(DONE);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8810 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8811
1763
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8812 #ifdef PRODUCT
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8813 #define BLOCK_COMMENT(str) /* nothing */
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8814 #else
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8815 #define BLOCK_COMMENT(str) block_comment(str)
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8816 #endif
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8817
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8818 #define BIND(label) bind(label); BLOCK_COMMENT(#label ":")
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8819 void MacroAssembler::generate_fill(BasicType t, bool aligned,
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8820 Register to, Register value, Register count,
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8821 Register rtmp, XMMRegister xtmp) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8822 assert_different_registers(to, value, count, rtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8823 Label L_exit, L_skip_align1, L_skip_align2, L_fill_byte;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8824 Label L_fill_2_bytes, L_fill_4_bytes;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8825
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8826 int shift = -1;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8827 switch (t) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8828 case T_BYTE:
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8829 shift = 2;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8830 break;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8831 case T_SHORT:
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8832 shift = 1;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8833 break;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8834 case T_INT:
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8835 shift = 0;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8836 break;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8837 default: ShouldNotReachHere();
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8838 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8839
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8840 if (t == T_BYTE) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8841 andl(value, 0xff);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8842 movl(rtmp, value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8843 shll(rtmp, 8);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8844 orl(value, rtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8845 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8846 if (t == T_SHORT) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8847 andl(value, 0xffff);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8848 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8849 if (t == T_BYTE || t == T_SHORT) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8850 movl(rtmp, value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8851 shll(rtmp, 16);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8852 orl(value, rtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8853 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8854
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8855 cmpl(count, 2<<shift); // Short arrays (< 8 bytes) fill by element
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8856 jcc(Assembler::below, L_fill_4_bytes); // use unsigned cmp
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8857 if (!UseUnalignedLoadStores && !aligned && (t == T_BYTE || t == T_SHORT)) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8858 // align source address at 4 bytes address boundary
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8859 if (t == T_BYTE) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8860 // One byte misalignment happens only for byte arrays
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8861 testptr(to, 1);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8862 jccb(Assembler::zero, L_skip_align1);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8863 movb(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8864 increment(to);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8865 decrement(count);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8866 BIND(L_skip_align1);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8867 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8868 // Two bytes misalignment happens only for byte and short (char) arrays
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8869 testptr(to, 2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8870 jccb(Assembler::zero, L_skip_align2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8871 movw(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8872 addptr(to, 2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8873 subl(count, 1<<(shift-1));
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8874 BIND(L_skip_align2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8875 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8876 if (UseSSE < 2) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8877 Label L_fill_32_bytes_loop, L_check_fill_8_bytes, L_fill_8_bytes_loop, L_fill_8_bytes;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8878 // Fill 32-byte chunks
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8879 subl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8880 jcc(Assembler::less, L_check_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8881 align(16);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8882
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8883 BIND(L_fill_32_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8884
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8885 for (int i = 0; i < 32; i += 4) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8886 movl(Address(to, i), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8887 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8888
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8889 addptr(to, 32);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8890 subl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8891 jcc(Assembler::greaterEqual, L_fill_32_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8892 BIND(L_check_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8893 addl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8894 jccb(Assembler::zero, L_exit);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8895 jmpb(L_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8896
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8897 //
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8898 // length is too short, just fill qwords
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8899 //
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8900 BIND(L_fill_8_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8901 movl(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8902 movl(Address(to, 4), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8903 addptr(to, 8);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8904 BIND(L_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8905 subl(count, 1 << (shift + 1));
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8906 jcc(Assembler::greaterEqual, L_fill_8_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8907 // fall through to fill 4 bytes
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8908 } else {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8909 Label L_fill_32_bytes;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8910 if (!UseUnalignedLoadStores) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8911 // align to 8 bytes, we know we are 4 byte aligned to start
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8912 testptr(to, 4);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8913 jccb(Assembler::zero, L_fill_32_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8914 movl(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8915 addptr(to, 4);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8916 subl(count, 1<<shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8917 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8918 BIND(L_fill_32_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8919 {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8920 assert( UseSSE >= 2, "supported cpu only" );
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8921 Label L_fill_32_bytes_loop, L_check_fill_8_bytes, L_fill_8_bytes_loop, L_fill_8_bytes;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8922 // Fill 32-byte chunks
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8923 movdl(xtmp, value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8924 pshufd(xtmp, xtmp, 0);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8925
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8926 subl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8927 jcc(Assembler::less, L_check_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8928 align(16);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8929
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8930 BIND(L_fill_32_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8931
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8932 if (UseUnalignedLoadStores) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8933 movdqu(Address(to, 0), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8934 movdqu(Address(to, 16), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8935 } else {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8936 movq(Address(to, 0), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8937 movq(Address(to, 8), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8938 movq(Address(to, 16), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8939 movq(Address(to, 24), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8940 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8941
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8942 addptr(to, 32);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8943 subl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8944 jcc(Assembler::greaterEqual, L_fill_32_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8945 BIND(L_check_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8946 addl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8947 jccb(Assembler::zero, L_exit);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8948 jmpb(L_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8949
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8950 //
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8951 // length is too short, just fill qwords
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8952 //
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8953 BIND(L_fill_8_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8954 movq(Address(to, 0), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8955 addptr(to, 8);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8956 BIND(L_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8957 subl(count, 1 << (shift + 1));
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8958 jcc(Assembler::greaterEqual, L_fill_8_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8959 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8960 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8961 // fill trailing 4 bytes
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8962 BIND(L_fill_4_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8963 testl(count, 1<<shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8964 jccb(Assembler::zero, L_fill_2_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8965 movl(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8966 if (t == T_BYTE || t == T_SHORT) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8967 addptr(to, 4);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8968 BIND(L_fill_2_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8969 // fill trailing 2 bytes
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8970 testl(count, 1<<(shift-1));
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8971 jccb(Assembler::zero, L_fill_byte);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8972 movw(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8973 if (t == T_BYTE) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8974 addptr(to, 2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8975 BIND(L_fill_byte);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8976 // fill trailing byte
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8977 testl(count, 1);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8978 jccb(Assembler::zero, L_exit);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8979 movb(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8980 } else {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8981 BIND(L_fill_byte);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8982 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8983 } else {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8984 BIND(L_fill_2_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8985 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8986 BIND(L_exit);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8987 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8988 #undef BIND
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8989 #undef BLOCK_COMMENT
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8990
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
8991
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8992 Assembler::Condition MacroAssembler::negate_condition(Assembler::Condition cond) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8993 switch (cond) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8994 // Note some conditions are synonyms for others
a61af66fc99e Initial load
duke
parents:
diff changeset
8995 case Assembler::zero: return Assembler::notZero;
a61af66fc99e Initial load
duke
parents:
diff changeset
8996 case Assembler::notZero: return Assembler::zero;
a61af66fc99e Initial load
duke
parents:
diff changeset
8997 case Assembler::less: return Assembler::greaterEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
8998 case Assembler::lessEqual: return Assembler::greater;
a61af66fc99e Initial load
duke
parents:
diff changeset
8999 case Assembler::greater: return Assembler::lessEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
9000 case Assembler::greaterEqual: return Assembler::less;
a61af66fc99e Initial load
duke
parents:
diff changeset
9001 case Assembler::below: return Assembler::aboveEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
9002 case Assembler::belowEqual: return Assembler::above;
a61af66fc99e Initial load
duke
parents:
diff changeset
9003 case Assembler::above: return Assembler::belowEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
9004 case Assembler::aboveEqual: return Assembler::below;
a61af66fc99e Initial load
duke
parents:
diff changeset
9005 case Assembler::overflow: return Assembler::noOverflow;
a61af66fc99e Initial load
duke
parents:
diff changeset
9006 case Assembler::noOverflow: return Assembler::overflow;
a61af66fc99e Initial load
duke
parents:
diff changeset
9007 case Assembler::negative: return Assembler::positive;
a61af66fc99e Initial load
duke
parents:
diff changeset
9008 case Assembler::positive: return Assembler::negative;
a61af66fc99e Initial load
duke
parents:
diff changeset
9009 case Assembler::parity: return Assembler::noParity;
a61af66fc99e Initial load
duke
parents:
diff changeset
9010 case Assembler::noParity: return Assembler::parity;
a61af66fc99e Initial load
duke
parents:
diff changeset
9011 }
a61af66fc99e Initial load
duke
parents:
diff changeset
9012 ShouldNotReachHere(); return Assembler::overflow;
a61af66fc99e Initial load
duke
parents:
diff changeset
9013 }
a61af66fc99e Initial load
duke
parents:
diff changeset
9014
a61af66fc99e Initial load
duke
parents:
diff changeset
9015 SkipIfEqual::SkipIfEqual(
a61af66fc99e Initial load
duke
parents:
diff changeset
9016 MacroAssembler* masm, const bool* flag_addr, bool value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
9017 _masm = masm;
a61af66fc99e Initial load
duke
parents:
diff changeset
9018 _masm->cmp8(ExternalAddress((address)flag_addr), value);
a61af66fc99e Initial load
duke
parents:
diff changeset
9019 _masm->jcc(Assembler::equal, _label);
a61af66fc99e Initial load
duke
parents:
diff changeset
9020 }
a61af66fc99e Initial load
duke
parents:
diff changeset
9021
a61af66fc99e Initial load
duke
parents:
diff changeset
9022 SkipIfEqual::~SkipIfEqual() {
a61af66fc99e Initial load
duke
parents:
diff changeset
9023 _masm->bind(_label);
a61af66fc99e Initial load
duke
parents:
diff changeset
9024 }