annotate src/cpu/x86/vm/assembler_x86.cpp @ 3249:e1162778c1c8

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer. Reviewed-by: kvn, iveresov, never, tonyp, dholmes
author johnc
date Thu, 07 Apr 2011 09:53:20 -0700
parents 8033953d67ff
children 92add02409c9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 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
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
823 // Now the Assembler instructions (identical for 32/64 bits)
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
824
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
825 void Assembler::adcl(Address dst, int32_t imm32) {
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
826 InstructionMark im(this);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
827 prefix(dst);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
828 emit_arith_operand(0x81, rdx, dst, imm32);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
829 }
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
830
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
831 void Assembler::adcl(Address dst, Register src) {
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
832 InstructionMark im(this);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
833 prefix(dst, src);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
834 emit_byte(0x11);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
835 emit_operand(src, dst);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
836 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
837
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
838 void Assembler::adcl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
839 prefix(dst);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
840 emit_arith(0x81, 0xD0, dst, imm32);
a61af66fc99e Initial load
duke
parents:
diff changeset
841 }
a61af66fc99e Initial load
duke
parents:
diff changeset
842
a61af66fc99e Initial load
duke
parents:
diff changeset
843 void Assembler::adcl(Register dst, Address src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
844 InstructionMark im(this);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
845 prefix(src, dst);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
846 emit_byte(0x13);
a61af66fc99e Initial load
duke
parents:
diff changeset
847 emit_operand(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
848 }
a61af66fc99e Initial load
duke
parents:
diff changeset
849
a61af66fc99e Initial load
duke
parents:
diff changeset
850 void Assembler::adcl(Register dst, Register src) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
851 (void) prefix_and_encode(dst->encoding(), src->encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
852 emit_arith(0x13, 0xC0, dst, src);
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(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
856 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
857 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
858 emit_arith_operand(0x81, rax, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
859 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
860
a61af66fc99e Initial load
duke
parents:
diff changeset
861 void Assembler::addl(Address dst, Register src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
862 InstructionMark im(this);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
863 prefix(dst, src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
864 emit_byte(0x01);
a61af66fc99e Initial load
duke
parents:
diff changeset
865 emit_operand(src, dst);
a61af66fc99e Initial load
duke
parents:
diff changeset
866 }
a61af66fc99e Initial load
duke
parents:
diff changeset
867
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
868 void Assembler::addl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
869 prefix(dst);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
870 emit_arith(0x81, 0xC0, dst, imm32);
a61af66fc99e Initial load
duke
parents:
diff changeset
871 }
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 void Assembler::addl(Register dst, Address src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
874 InstructionMark im(this);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
875 prefix(src, dst);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
876 emit_byte(0x03);
a61af66fc99e Initial load
duke
parents:
diff changeset
877 emit_operand(dst, src);
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::addl(Register dst, Register src) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
881 (void) prefix_and_encode(dst->encoding(), src->encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
882 emit_arith(0x03, 0xC0, dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
883 }
a61af66fc99e Initial load
duke
parents:
diff changeset
884
a61af66fc99e Initial load
duke
parents:
diff changeset
885 void Assembler::addr_nop_4() {
a61af66fc99e Initial load
duke
parents:
diff changeset
886 // 4 bytes: NOP DWORD PTR [EAX+0]
a61af66fc99e Initial load
duke
parents:
diff changeset
887 emit_byte(0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
888 emit_byte(0x1F);
a61af66fc99e Initial load
duke
parents:
diff changeset
889 emit_byte(0x40); // emit_rm(cbuf, 0x1, EAX_enc, EAX_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
890 emit_byte(0); // 8-bits offset (1 byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
891 }
a61af66fc99e Initial load
duke
parents:
diff changeset
892
a61af66fc99e Initial load
duke
parents:
diff changeset
893 void Assembler::addr_nop_5() {
a61af66fc99e Initial load
duke
parents:
diff changeset
894 // 5 bytes: NOP DWORD PTR [EAX+EAX*0+0] 8-bits offset
a61af66fc99e Initial load
duke
parents:
diff changeset
895 emit_byte(0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
896 emit_byte(0x1F);
a61af66fc99e Initial load
duke
parents:
diff changeset
897 emit_byte(0x44); // emit_rm(cbuf, 0x1, EAX_enc, 0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
898 emit_byte(0x00); // emit_rm(cbuf, 0x0, EAX_enc, EAX_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
899 emit_byte(0); // 8-bits offset (1 byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
900 }
a61af66fc99e Initial load
duke
parents:
diff changeset
901
a61af66fc99e Initial load
duke
parents:
diff changeset
902 void Assembler::addr_nop_7() {
a61af66fc99e Initial load
duke
parents:
diff changeset
903 // 7 bytes: NOP DWORD PTR [EAX+0] 32-bits offset
a61af66fc99e Initial load
duke
parents:
diff changeset
904 emit_byte(0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
905 emit_byte(0x1F);
a61af66fc99e Initial load
duke
parents:
diff changeset
906 emit_byte(0x80); // emit_rm(cbuf, 0x2, EAX_enc, EAX_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
907 emit_long(0); // 32-bits offset (4 bytes)
a61af66fc99e Initial load
duke
parents:
diff changeset
908 }
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910 void Assembler::addr_nop_8() {
a61af66fc99e Initial load
duke
parents:
diff changeset
911 // 8 bytes: NOP DWORD PTR [EAX+EAX*0+0] 32-bits offset
a61af66fc99e Initial load
duke
parents:
diff changeset
912 emit_byte(0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
913 emit_byte(0x1F);
a61af66fc99e Initial load
duke
parents:
diff changeset
914 emit_byte(0x84); // emit_rm(cbuf, 0x2, EAX_enc, 0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
915 emit_byte(0x00); // emit_rm(cbuf, 0x0, EAX_enc, EAX_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
916 emit_long(0); // 32-bits offset (4 bytes)
a61af66fc99e Initial load
duke
parents:
diff changeset
917 }
a61af66fc99e Initial load
duke
parents:
diff changeset
918
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
919 void Assembler::addsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
920 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
921 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
922 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
923 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
924 emit_byte(0x58);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
925 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
926 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
927
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
928 void Assembler::addsd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
929 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
930 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
931 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
932 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
933 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
934 emit_byte(0x58);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
935 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
936 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
937
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
938 void Assembler::addss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
939 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
940 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
941 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
942 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
943 emit_byte(0x58);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
944 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
945 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
946
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
947 void Assembler::addss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
948 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
949 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
950 emit_byte(0xF3);
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(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
953 emit_byte(0x58);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
954 emit_operand(dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
957 void Assembler::andl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
958 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
959 emit_arith(0x81, 0xE0, dst, imm32);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
962 void Assembler::andl(Register dst, Address src) {
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 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
965 emit_byte(0x23);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
966 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
967 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
968
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
969 void Assembler::andl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
970 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
971 emit_arith(0x23, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
972 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
973
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
974 void Assembler::andpd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
975 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
976 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
977 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
978 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
979 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
980 emit_byte(0x54);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
981 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
982 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
983
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
984 void Assembler::bsfl(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
985 int encode = prefix_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
986 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
987 emit_byte(0xBC);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
988 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
989 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
990
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
991 void Assembler::bsrl(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
992 assert(!VM_Version::supports_lzcnt(), "encoding is treated as LZCNT");
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
993 int encode = prefix_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
994 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
995 emit_byte(0xBD);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
996 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
997 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
998
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
999 void Assembler::bswapl(Register reg) { // bswap
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1000 int encode = prefix_and_encode(reg->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1001 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1002 emit_byte(0xC8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1003 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1004
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1005 void Assembler::call(Label& L, relocInfo::relocType rtype) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1006 // suspect disp32 is always good
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1007 int operand = LP64_ONLY(disp32_operand) NOT_LP64(imm_operand);
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 if (L.is_bound()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1010 const int long_size = 5;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1011 int offs = (int)( target(L) - pc() );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1012 assert(offs <= 0, "assembler error");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1013 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1014 // 1110 1000 #32-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1015 emit_byte(0xE8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1016 emit_data(offs - long_size, rtype, operand);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1017 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1018 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1019 // 1110 1000 #32-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1020 L.add_patch_at(code(), locator());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1021
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1022 emit_byte(0xE8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1023 emit_data(int(0), rtype, operand);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1024 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1025 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1026
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1027 void Assembler::call(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1028 // This was originally using a 32bit register encoding
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1029 // and surely we want 64bit!
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1030 // this is a 32bit encoding but in 64bit mode the default
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1031 // operand size is 64bit so there is no need for the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1032 // wide prefix. So prefix only happens if we use the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1033 // new registers. Much like push/pop.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1034 int x = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1035 // this may be true but dbx disassembles it as if it
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1036 // were 32bits...
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1037 // int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1038 // if (offset() != x) assert(dst->encoding() >= 8, "what?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1039 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1040
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1041 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1042 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1043 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1044
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1045
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1046 void Assembler::call(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1047 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1048 prefix(adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1049 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1050 emit_operand(rdx, adr);
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::call_literal(address entry, RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1054 assert(entry != NULL, "call most probably wrong");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1055 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1056 emit_byte(0xE8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1057 intptr_t disp = entry - (_code_pos + sizeof(int32_t));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1058 assert(is_simm32(disp), "must be 32bit offset (call2)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1059 // Technically, should use call32_operand, but this format is
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1060 // implied by the fact that we're emitting a call instruction.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1061
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1062 int operand = LP64_ONLY(disp32_operand) NOT_LP64(call32_operand);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1063 emit_data((int) disp, rspec, operand);
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::cdql() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1067 emit_byte(0x99);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1068 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1069
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1070 void Assembler::cmovl(Condition cc, Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1071 NOT_LP64(guarantee(VM_Version::supports_cmov(), "illegal instruction"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1072 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1073 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1074 emit_byte(0x40 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1075 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1076 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1077
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1078
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1079 void Assembler::cmovl(Condition cc, Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1080 NOT_LP64(guarantee(VM_Version::supports_cmov(), "illegal instruction"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1081 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1082 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1083 emit_byte(0x40 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1084 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1085 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1086
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1087 void Assembler::cmpb(Address dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1088 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1089 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1090 emit_byte(0x80);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1091 emit_operand(rdi, dst, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1092 emit_byte(imm8);
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(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1096 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1097 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1098 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1099 emit_operand(rdi, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1100 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1101 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1102
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1103 void Assembler::cmpl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1104 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1105 emit_arith(0x81, 0xF8, dst, imm32);
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::cmpl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1109 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1110 emit_arith(0x3B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1111 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1112
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1113
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1114 void Assembler::cmpl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1115 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1116 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1117 emit_byte(0x3B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1118 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1119 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1120
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1121 void Assembler::cmpw(Address dst, int imm16) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1122 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1123 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
1124 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1125 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1126 emit_operand(rdi, dst, 2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1127 emit_word(imm16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1128 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1129
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1130 // 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
1131 // 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
1132 // 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
1133 void Assembler::cmpxchgl(Register reg, Address adr) { // cmpxchg
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1134 if (Atomics & 2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1135 // caveat: no instructionmark, so this isn't relocatable.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1136 // Emit a synthetic, non-atomic, CAS equivalent.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1137 // Beware. The synthetic form sets all ICCs, not just ZF.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1138 // cmpxchg r,[m] is equivalent to rax, = CAS (m, rax, r)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1139 cmpl(rax, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1140 movl(rax, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1141 if (reg != rax) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1142 Label L ;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1143 jcc(Assembler::notEqual, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1144 movl(adr, reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1145 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1146 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1147 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1148 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1149 prefix(adr, reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1150 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1151 emit_byte(0xB1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1152 emit_operand(reg, adr);
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 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1155
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1156 void Assembler::comisd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1157 // NOTE: dbx seems to decode this as comiss even though the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1158 // 0x66 is there. Strangly ucomisd comes out correct
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1159 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1160 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1161 comiss(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1162 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1163
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1164 void Assembler::comiss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1165 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1166
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1167 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1168 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1169 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1170 emit_byte(0x2F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1171 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1172 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1173
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1174 void Assembler::cvtdq2pd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1175 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1176 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1177 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1178 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1179 emit_byte(0xE6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1180 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1181 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1182
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1183 void Assembler::cvtdq2ps(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1184 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1185 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1186 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1187 emit_byte(0x5B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1188 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1189 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1190
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1191 void Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1192 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1193 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1194 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1195 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1196 emit_byte(0x5A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1197 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1198 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1199
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1200 void Assembler::cvtsi2sdl(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1201 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1202 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1203 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1204 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1205 emit_byte(0x2A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1206 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1207 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1208
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1209 void Assembler::cvtsi2ssl(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1210 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1211 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1212 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1213 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1214 emit_byte(0x2A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1215 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1216 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1217
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1218 void Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1219 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1220 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1221 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1222 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1223 emit_byte(0x5A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1224 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1225 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1226
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1227 void Assembler::cvttsd2sil(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1228 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1229 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1230 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1231 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1232 emit_byte(0x2C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1233 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1234 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1235
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1236 void Assembler::cvttss2sil(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1237 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1238 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1239 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1240 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1241 emit_byte(0x2C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1242 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1243 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1244
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1245 void Assembler::decl(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1246 // Don't use it directly. Use MacroAssembler::decrement() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1247 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1248 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1249 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1250 emit_operand(rcx, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1251 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1252
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1253 void Assembler::divsd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1254 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1255 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1256 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1257 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1258 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1259 emit_byte(0x5E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1260 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1261 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1262
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1263 void Assembler::divsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1264 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1265 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1266 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1267 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1268 emit_byte(0x5E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1269 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1270 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1271
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1272 void Assembler::divss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1273 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1274 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1275 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1276 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1277 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1278 emit_byte(0x5E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1279 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1280 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1281
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1282 void Assembler::divss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1283 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1284 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1285 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1286 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1287 emit_byte(0x5E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1288 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1289 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1290
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1291 void Assembler::emms() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1292 NOT_LP64(assert(VM_Version::supports_mmx(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1293 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1294 emit_byte(0x77);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1295 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1296
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1297 void Assembler::hlt() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1298 emit_byte(0xF4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1299 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1300
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1301 void Assembler::idivl(Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1302 int encode = prefix_and_encode(src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1303 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1304 emit_byte(0xF8 | 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
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
1307 void Assembler::divl(Register src) { // Unsigned
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
1308 int encode = prefix_and_encode(src->encoding());
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
1309 emit_byte(0xF7);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
1310 emit_byte(0xF0 | encode);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
1311 }
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
1312
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1313 void Assembler::imull(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1314 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1315 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1316 emit_byte(0xAF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1317 emit_byte(0xC0 | encode);
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::imull(Register dst, Register src, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1322 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1323 if (is8bit(value)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1324 emit_byte(0x6B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1325 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
1326 emit_byte(value & 0xFF);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1327 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1328 emit_byte(0x69);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1329 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1330 emit_long(value);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1331 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1332 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1333
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1334 void Assembler::incl(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1335 // Don't use it directly. Use MacroAssembler::increment() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1336 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1337 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1338 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1339 emit_operand(rax, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1340 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1341
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1342 void Assembler::jcc(Condition cc, Label& L, relocInfo::relocType rtype) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1343 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1344 relocate(rtype);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1345 assert((0 <= cc) && (cc < 16), "illegal cc");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1346 if (L.is_bound()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1347 address dst = target(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1348 assert(dst != NULL, "jcc most probably wrong");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1349
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1350 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1351 const int long_size = 6;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1352 intptr_t offs = (intptr_t)dst - (intptr_t)_code_pos;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1353 if (rtype == relocInfo::none && is8bit(offs - short_size)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1354 // 0111 tttn #8-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1355 emit_byte(0x70 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1356 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1357 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1358 // 0000 1111 1000 tttn #32-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1359 assert(is_simm32(offs - long_size),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1360 "must be 32bit offset (call4)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1361 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1362 emit_byte(0x80 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1363 emit_long(offs - long_size);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1364 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1365 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1366 // Note: could eliminate cond. jumps to this jump if condition
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1367 // is the same however, seems to be rather unlikely case.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1368 // 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
1369 // an 8-bit displacement
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1370 L.add_patch_at(code(), locator());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1371 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1372 emit_byte(0x80 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1373 emit_long(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1374 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1375 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1376
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1377 void Assembler::jccb(Condition cc, Label& L) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1378 if (L.is_bound()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1379 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1380 address entry = target(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1381 assert(is8bit((intptr_t)entry - ((intptr_t)_code_pos + short_size)),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1382 "Dispacement too large for a short jmp");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1383 intptr_t offs = (intptr_t)entry - (intptr_t)_code_pos;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1384 // 0111 tttn #8-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1385 emit_byte(0x70 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1386 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1387 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1388 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1389 L.add_patch_at(code(), locator());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1390 emit_byte(0x70 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1391 emit_byte(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1392 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1393 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1394
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1395 void Assembler::jmp(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1396 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1397 prefix(adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1398 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1399 emit_operand(rsp, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1400 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1401
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1402 void Assembler::jmp(Label& L, relocInfo::relocType rtype) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1403 if (L.is_bound()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1404 address entry = target(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1405 assert(entry != NULL, "jmp most probably wrong");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1406 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1407 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1408 const int long_size = 5;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1409 intptr_t offs = entry - _code_pos;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1410 if (rtype == relocInfo::none && is8bit(offs - short_size)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1411 emit_byte(0xEB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1412 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1413 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1414 emit_byte(0xE9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1415 emit_long(offs - long_size);
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1418 // By default, forward jumps are always 32-bit displacements, since
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1419 // 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
1420 // 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
1421 // force an 8-bit displacement.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1422 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1423 relocate(rtype);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1424 L.add_patch_at(code(), locator());
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 emit_long(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1427 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1428 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1429
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1430 void Assembler::jmp(Register entry) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1431 int encode = prefix_and_encode(entry->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1432 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1433 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1434 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1435
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1436 void Assembler::jmp_literal(address dest, RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1437 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1438 emit_byte(0xE9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1439 assert(dest != NULL, "must have a target");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1440 intptr_t disp = dest - (_code_pos + sizeof(int32_t));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1441 assert(is_simm32(disp), "must be 32bit offset (jmp)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1442 emit_data(disp, rspec.reloc(), call32_operand);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1443 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1444
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1445 void Assembler::jmpb(Label& L) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1446 if (L.is_bound()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1447 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1448 address entry = target(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1449 assert(is8bit((entry - _code_pos) + short_size),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1450 "Dispacement too large for a short jmp");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1451 assert(entry != NULL, "jmp most probably wrong");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1452 intptr_t offs = entry - _code_pos;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1453 emit_byte(0xEB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1454 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1455 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1456 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1457 L.add_patch_at(code(), locator());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1458 emit_byte(0xEB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1459 emit_byte(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1460 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1461 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1462
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1463 void Assembler::ldmxcsr( Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1464 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1465 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1466 prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1467 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1468 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1469 emit_operand(as_Register(2), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1470 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1471
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1472 void Assembler::leal(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1473 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1474 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1475 emit_byte(0x67); // addr32
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1476 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1477 #endif // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1478 emit_byte(0x8D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1479 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1480 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1481
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1482 void Assembler::lock() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1483 if (Atomics & 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1484 // Emit either nothing, a NOP, or a NOP: prefix
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1485 emit_byte(0x90) ;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1486 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1487 emit_byte(0xF0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1488 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1489 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1490
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1491 void Assembler::lzcntl(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1492 assert(VM_Version::supports_lzcnt(), "encoding is treated as BSR");
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1493 emit_byte(0xF3);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1494 int encode = prefix_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1495 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1496 emit_byte(0xBD);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1497 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1498 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1499
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1500 // Emit mfence instruction
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1501 void Assembler::mfence() {
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1502 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
1503 emit_byte( 0x0F );
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1504 emit_byte( 0xAE );
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1505 emit_byte( 0xF0 );
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1506 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1507
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1508 void Assembler::mov(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1509 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1510 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1511
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1512 void Assembler::movapd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1513 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1514 int dstenc = dst->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1515 int srcenc = src->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1516 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1517 if (dstenc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1518 if (srcenc >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1519 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1520 srcenc -= 8;
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1523 if (srcenc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1524 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1525 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1526 prefix(REX_RB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1527 srcenc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1528 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1529 dstenc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1530 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1531 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1532 emit_byte(0x28);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1533 emit_byte(0xC0 | dstenc << 3 | srcenc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1534 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1535
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1536 void Assembler::movaps(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1537 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1538 int dstenc = dst->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1539 int srcenc = src->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1540 if (dstenc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1541 if (srcenc >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1542 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1543 srcenc -= 8;
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1546 if (srcenc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1547 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1548 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1549 prefix(REX_RB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1550 srcenc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1551 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1552 dstenc -= 8;
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 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1555 emit_byte(0x28);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1556 emit_byte(0xC0 | dstenc << 3 | srcenc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1557 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1558
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1559 void Assembler::movb(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1560 NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1561 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1562 prefix(src, dst, true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1563 emit_byte(0x8A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1564 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1565 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1566
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1567
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1568 void Assembler::movb(Address dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1569 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1570 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1571 emit_byte(0xC6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1572 emit_operand(rax, dst, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1573 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1574 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1575
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1576
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1577 void Assembler::movb(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1578 assert(src->has_byte_register(), "must have byte register");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1579 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1580 prefix(dst, src, true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1581 emit_byte(0x88);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1582 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1583 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1584
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1585 void Assembler::movdl(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1586 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1587 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1588 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1589 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1590 emit_byte(0x6E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1591 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1592 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1593
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1594 void Assembler::movdl(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1595 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1596 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1597 // swap src/dst to get correct prefix
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1598 int encode = prefix_and_encode(src->encoding(), dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1599 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1600 emit_byte(0x7E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1601 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1602 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1603
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1604 void Assembler::movdl(XMMRegister dst, Address src) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1605 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1606 InstructionMark im(this);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1607 emit_byte(0x66);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1608 prefix(src, dst);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1609 emit_byte(0x0F);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1610 emit_byte(0x6E);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1611 emit_operand(dst, src);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1612 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1613
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1614
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1615 void Assembler::movdqa(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1616 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1617 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1618 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1619 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1620 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1621 emit_byte(0x6F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1622 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1623 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1624
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1625 void Assembler::movdqa(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1626 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1627 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1628 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1629 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1630 emit_byte(0x6F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1631 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1632 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1633
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1634 void Assembler::movdqa(Address dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1635 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1636 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1637 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1638 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1639 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1640 emit_byte(0x7F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1641 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1642 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1643
405
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1644 void Assembler::movdqu(XMMRegister dst, Address src) {
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1645 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1646 InstructionMark im(this);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1647 emit_byte(0xF3);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1648 prefix(src, dst);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1649 emit_byte(0x0F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1650 emit_byte(0x6F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1651 emit_operand(dst, src);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1652 }
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1653
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1654 void Assembler::movdqu(XMMRegister dst, XMMRegister src) {
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1655 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1656 emit_byte(0xF3);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1657 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1658 emit_byte(0x0F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1659 emit_byte(0x6F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1660 emit_byte(0xC0 | encode);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1661 }
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1662
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1663 void Assembler::movdqu(Address dst, XMMRegister src) {
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1664 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1665 InstructionMark im(this);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1666 emit_byte(0xF3);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1667 prefix(dst, src);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1668 emit_byte(0x0F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1669 emit_byte(0x7F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1670 emit_operand(src, dst);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1671 }
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1672
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1673 // Uses zero extension on 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1674
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1675 void Assembler::movl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1676 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1677 emit_byte(0xB8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1678 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1679 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1680
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1681 void Assembler::movl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1682 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1683 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1684 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1685 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1686
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1687 void Assembler::movl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1688 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1689 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1690 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1691 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1692 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1693
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1694 void Assembler::movl(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1695 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1696 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1697 emit_byte(0xC7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1698 emit_operand(rax, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1699 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1700 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1701
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1702 void Assembler::movl(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1703 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1704 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1705 emit_byte(0x89);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1706 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1707 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1708
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1709 // 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
1710 // 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
1711 // The selection is done in MacroAssembler::movdbl() and movflt().
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1712 void Assembler::movlpd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1713 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1714 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1715 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1716 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1717 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1718 emit_byte(0x12);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1719 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1720 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1721
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1722 void Assembler::movq( MMXRegister dst, Address src ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1723 assert( VM_Version::supports_mmx(), "" );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1724 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1725 emit_byte(0x6F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1726 emit_operand(dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1729 void Assembler::movq( Address dst, MMXRegister src ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1730 assert( VM_Version::supports_mmx(), "" );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1731 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1732 emit_byte(0x7F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1733 // workaround gcc (3.2.1-7a) bug
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1734 // 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
1735 // gcc will tail jump and try and reverse the parameters completely
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1736 // obliterating dst in the process. By having a version available
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1737 // 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
1738 // avoided.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1739 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1740 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1741
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1742 void Assembler::movq(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1743 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1744 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1745 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1746 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1747 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1748 emit_byte(0x7E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1749 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1750 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1751
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1752 void Assembler::movq(Address dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1753 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1754 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1755 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1756 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1757 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1758 emit_byte(0xD6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1759 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1760 }
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 void Assembler::movsbl(Register dst, Address src) { // movsxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1763 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1764 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1765 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1766 emit_byte(0xBE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1767 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1768 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1769
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1770 void Assembler::movsbl(Register dst, Register src) { // movsxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1771 NOT_LP64(assert(src->has_byte_register(), "must have byte register"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1772 int encode = prefix_and_encode(dst->encoding(), src->encoding(), true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1773 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1774 emit_byte(0xBE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1775 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1776 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1777
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1778 void Assembler::movsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1779 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1780 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1781 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1782 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1783 emit_byte(0x10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1784 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1785 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1786
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1787 void Assembler::movsd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1788 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1789 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1790 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1791 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1792 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1793 emit_byte(0x10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1794 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1795 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1796
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1797 void Assembler::movsd(Address dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1798 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1799 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1800 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1801 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1802 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1803 emit_byte(0x11);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1804 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1805 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1806
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1807 void Assembler::movss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1808 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1809 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1810 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1811 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1812 emit_byte(0x10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1813 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1814 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1815
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1816 void Assembler::movss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1817 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1818 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1819 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1820 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1821 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1822 emit_byte(0x10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1823 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1824 }
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 void Assembler::movss(Address dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1827 NOT_LP64(assert(VM_Version::supports_sse(), ""));
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 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1830 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1831 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1832 emit_byte(0x11);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1833 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1834 }
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 void Assembler::movswl(Register dst, Address src) { // movsxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1837 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1838 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1839 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1840 emit_byte(0xBF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1841 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1842 }
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 void Assembler::movswl(Register dst, Register src) { // movsxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1845 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1846 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1847 emit_byte(0xBF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1848 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1849 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1850
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1851 void Assembler::movw(Address dst, int imm16) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1852 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1853
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1854 emit_byte(0x66); // switch to 16-bit mode
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1855 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1856 emit_byte(0xC7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1857 emit_operand(rax, dst, 2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1858 emit_word(imm16);
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::movw(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1862 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1863 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1864 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1865 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1866 emit_operand(dst, src);
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::movw(Address dst, Register src) {
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 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1872 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1873 emit_byte(0x89);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1874 emit_operand(src, dst);
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::movzbl(Register dst, Address src) { // movzxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1878 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1879 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1880 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1881 emit_byte(0xB6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1882 emit_operand(dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1885 void Assembler::movzbl(Register dst, Register src) { // movzxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1886 NOT_LP64(assert(src->has_byte_register(), "must have byte register"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1887 int encode = prefix_and_encode(dst->encoding(), src->encoding(), true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1888 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1889 emit_byte(0xB6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1890 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1891 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1892
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1893 void Assembler::movzwl(Register dst, Address src) { // movzxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1894 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1895 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1896 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1897 emit_byte(0xB7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1898 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1899 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1900
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1901 void Assembler::movzwl(Register dst, Register src) { // movzxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1902 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1903 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1904 emit_byte(0xB7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1905 emit_byte(0xC0 | encode);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1908 void Assembler::mull(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1909 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1910 prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1911 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1912 emit_operand(rsp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1913 }
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 void Assembler::mull(Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1916 int encode = prefix_and_encode(src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1917 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1918 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1919 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1920
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1921 void Assembler::mulsd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1922 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1923 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1924 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1925 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1926 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1927 emit_byte(0x59);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1928 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1929 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1930
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1931 void Assembler::mulsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1932 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1933 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1934 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1935 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1936 emit_byte(0x59);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1937 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1938 }
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 void Assembler::mulss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1941 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1942 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1943 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1944 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1945 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1946 emit_byte(0x59);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1947 emit_operand(dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1950 void Assembler::mulss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1951 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1952 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1953 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1954 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1955 emit_byte(0x59);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1956 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1957 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1958
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1959 void Assembler::negl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1960 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1961 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1962 emit_byte(0xD8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1963 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1964
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 void Assembler::nop(int i) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1966 #ifdef ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 assert(i > 0, " ");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1968 // 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
1969 // pain to disassemble code while debugging. If asserts are on clearly
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1970 // 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
1971 // to do alignment.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1972
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1973 for (; i > 0 ; i--) emit_byte(0x90);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1974 return;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1975
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1976 #endif // ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1977
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 if (UseAddressNop && VM_Version::is_intel()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 // Using multi-bytes nops "0x0F 0x1F [address]" for Intel
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 // 1: 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 // 2: 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 // 3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 // 4: 0x0F 0x1F 0x40 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 // 5: 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 // 6: 0x66 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 // 7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 // 8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 // 9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 // 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 // 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1992
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 // The rest coding is Intel specific - don't use consecutive address nops
a61af66fc99e Initial load
duke
parents:
diff changeset
1994
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 // 12: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 // 13: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 // 14: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 // 15: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1999
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 while(i >= 15) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 // For Intel don't generate consecutive addess nops (mix with regular nops)
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 i -= 15;
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 switch (i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 case 14:
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 case 13:
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 case 12:
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 case 11:
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2026 case 10:
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 case 9:
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 case 8:
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 case 7:
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 addr_nop_7();
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 case 6:
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 case 5:
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 addr_nop_5();
a61af66fc99e Initial load
duke
parents:
diff changeset
2040 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 case 4:
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 addr_nop_4();
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 case 3:
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 // Don't use "0x0F 0x1F 0x00" - need patching safe padding
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 assert(i == 0, " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 if (UseAddressNop && VM_Version::is_amd()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 // Using multi-bytes nops "0x0F 0x1F [address]" for AMD.
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 // 1: 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 // 2: 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 // 3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 // 4: 0x0F 0x1F 0x40 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 // 5: 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 // 6: 0x66 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 // 7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 // 8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 // 9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 // 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 // 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2071
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 // The rest coding is AMD specific - use consecutive address nops
a61af66fc99e Initial load
duke
parents:
diff changeset
2073
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 // 12: 0x66 0x0F 0x1F 0x44 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 // 13: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 // 14: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 // 15: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 // 16: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 // Size prefixes (0x66) are added for larger sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
2080
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 while(i >= 22) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 i -= 11;
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2086 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 // Generate first nop for size between 21-12
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 switch (i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 case 21:
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 case 20:
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 case 19:
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2096 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 case 18:
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 case 17:
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 case 16:
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 case 15:
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 i -= 8;
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 case 14:
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 case 13:
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 i -= 7;
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 addr_nop_7();
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 case 12:
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 i -= 6;
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 addr_nop_5();
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 assert(i < 12, " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2119
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 // Generate second nop for size between 11-1
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 switch (i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 case 11:
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 case 10:
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 case 9:
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 case 8:
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 case 7:
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 addr_nop_7();
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 case 6:
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 case 5:
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 addr_nop_5();
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 case 4:
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 addr_nop_4();
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 case 3:
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 // Don't use "0x0F 0x1F 0x00" - need patching safe padding
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 assert(i == 0, " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2155
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 // Using nops with size prefixes "0x66 0x90".
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 // From AMD Optimization Guide:
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 // 1: 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 // 2: 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 // 3: 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 // 4: 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 // 5: 0x66 0x66 0x90 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 // 6: 0x66 0x66 0x90 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 // 7: 0x66 0x66 0x66 0x90 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 // 8: 0x66 0x66 0x66 0x90 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 // 9: 0x66 0x66 0x90 0x66 0x66 0x90 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 // 10: 0x66 0x66 0x66 0x90 0x66 0x66 0x90 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 while(i > 12) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 i -= 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 // 1 - 12 nops
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 if(i > 8) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 if(i > 9) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 i -= 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 emit_byte(0x90);
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 // 1 - 8 nops
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 if(i > 4) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 if(i > 6) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 i -= 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 emit_byte(0x90);
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 switch (i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 case 4:
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 case 3:
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 emit_byte(0x90);
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 assert(i == 0, " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2212
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2213 void Assembler::notl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2214 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2215 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2216 emit_byte(0xD0 | encode );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2217 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2218
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2219 void Assembler::orl(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2220 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2221 prefix(dst);
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
2222 emit_arith_operand(0x81, rcx, dst, imm32);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2223 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2224
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2225 void Assembler::orl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2226 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2227 emit_arith(0x81, 0xC8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2228 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2229
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2230 void Assembler::orl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2231 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2232 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2233 emit_byte(0x0B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2234 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2235 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2236
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2237 void Assembler::orl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2238 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2239 emit_arith(0x0B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2240 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2241
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2242 void Assembler::pcmpestri(XMMRegister dst, Address src, int imm8) {
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2243 assert(VM_Version::supports_sse4_2(), "");
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2244
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2245 InstructionMark im(this);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2246 emit_byte(0x66);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2247 prefix(src, dst);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2248 emit_byte(0x0F);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2249 emit_byte(0x3A);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2250 emit_byte(0x61);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2251 emit_operand(dst, src);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2252 emit_byte(imm8);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2253 }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2254
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2255 void Assembler::pcmpestri(XMMRegister dst, XMMRegister src, int imm8) {
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2256 assert(VM_Version::supports_sse4_2(), "");
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2257
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2258 emit_byte(0x66);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2259 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2260 emit_byte(0x0F);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2261 emit_byte(0x3A);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2262 emit_byte(0x61);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2263 emit_byte(0xC0 | encode);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2264 emit_byte(imm8);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2265 }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2266
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2267 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2268 void Assembler::pop(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2269 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2270 emit_byte(0x58 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2271 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2272
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2273 void Assembler::popcntl(Register dst, Address src) {
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2274 assert(VM_Version::supports_popcnt(), "must support");
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2275 InstructionMark im(this);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2276 emit_byte(0xF3);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2277 prefix(src, dst);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2278 emit_byte(0x0F);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2279 emit_byte(0xB8);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2280 emit_operand(dst, src);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2281 }
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2282
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2283 void Assembler::popcntl(Register dst, Register src) {
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2284 assert(VM_Version::supports_popcnt(), "must support");
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2285 emit_byte(0xF3);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2286 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
2287 emit_byte(0x0F);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2288 emit_byte(0xB8);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2289 emit_byte(0xC0 | encode);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2290 }
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2291
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2292 void Assembler::popf() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2293 emit_byte(0x9D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2294 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2295
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
2296 #ifndef _LP64 // no 32bit push/pop on amd64
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2297 void Assembler::popl(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2298 // NOTE: this will adjust stack by 8byte on 64bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2299 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2300 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2301 emit_byte(0x8F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2302 emit_operand(rax, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2303 }
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
2304 #endif
304
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 void Assembler::prefetch_prefix(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2307 prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2308 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2309 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2310
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2311 void Assembler::prefetchnta(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2312 NOT_LP64(assert(VM_Version::supports_sse2(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2313 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2314 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2315 emit_byte(0x18);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2316 emit_operand(rax, src); // 0, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2317 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2318
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2319 void Assembler::prefetchr(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2320 NOT_LP64(assert(VM_Version::supports_3dnow(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2321 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2322 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2323 emit_byte(0x0D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2324 emit_operand(rax, src); // 0, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2325 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2326
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2327 void Assembler::prefetcht0(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2328 NOT_LP64(assert(VM_Version::supports_sse(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2329 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2330 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2331 emit_byte(0x18);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2332 emit_operand(rcx, src); // 1, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2333 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2334
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2335 void Assembler::prefetcht1(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2336 NOT_LP64(assert(VM_Version::supports_sse(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2337 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2338 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2339 emit_byte(0x18);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2340 emit_operand(rdx, src); // 2, src
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::prefetcht2(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2344 NOT_LP64(assert(VM_Version::supports_sse(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2345 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2346 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2347 emit_byte(0x18);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2348 emit_operand(rbx, src); // 3, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2349 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2350
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2351 void Assembler::prefetchw(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2352 NOT_LP64(assert(VM_Version::supports_3dnow(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2353 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2354 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2355 emit_byte(0x0D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2356 emit_operand(rcx, src); // 1, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2357 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2358
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2359 void Assembler::prefix(Prefix p) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2360 a_byte(p);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2361 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2362
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2363 void Assembler::por(XMMRegister dst, XMMRegister src) {
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2364 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2365
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2366 emit_byte(0x66);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2367 int encode = prefix_and_encode(dst->encoding(), src->encoding());
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2368 emit_byte(0x0F);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2369
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2370 emit_byte(0xEB);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2371 emit_byte(0xC0 | encode);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2372 }
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2373
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2374 void Assembler::pshufd(XMMRegister dst, XMMRegister src, int mode) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2375 assert(isByte(mode), "invalid value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2376 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2377
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2378 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2379 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2380 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2381 emit_byte(0x70);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2382 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2383 emit_byte(mode & 0xFF);
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 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2386
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2387 void Assembler::pshufd(XMMRegister dst, Address src, int mode) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2388 assert(isByte(mode), "invalid value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2389 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2390
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2391 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2392 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2393 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2394 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2395 emit_byte(0x70);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2396 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2397 emit_byte(mode & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2398 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2399
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2400 void Assembler::pshuflw(XMMRegister dst, XMMRegister src, int mode) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2401 assert(isByte(mode), "invalid value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2402 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2403
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2404 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2405 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2406 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2407 emit_byte(0x70);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2408 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2409 emit_byte(mode & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2410 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2411
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2412 void Assembler::pshuflw(XMMRegister dst, Address src, int mode) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2413 assert(isByte(mode), "invalid value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2414 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2415
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2416 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2417 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2418 prefix(src, dst); // QQ new
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2419 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2420 emit_byte(0x70);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2421 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2422 emit_byte(mode & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2423 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2424
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2425 void Assembler::psrlq(XMMRegister dst, int shift) {
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2426 // Shift 64 bit value logically right by specified number of bits.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2427 // HMM Table D-1 says sse2 or mmx.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2428 // Do not confuse it with psrldq SSE2 instruction which
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2429 // shifts 128 bit value in xmm register by number of bytes.
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2430 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2431
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2432 int encode = prefixq_and_encode(xmm2->encoding(), dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2433 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2434 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2435 emit_byte(0x73);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2436 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2437 emit_byte(shift);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2438 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2439
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2440 void Assembler::psrldq(XMMRegister dst, int shift) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2441 // Shift 128 bit value in xmm register by number of bytes.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2442 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2443
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2444 int encode = prefixq_and_encode(xmm3->encoding(), dst->encoding());
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2445 emit_byte(0x66);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2446 emit_byte(0x0F);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2447 emit_byte(0x73);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2448 emit_byte(0xC0 | encode);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2449 emit_byte(shift);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2450 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2451
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2452 void Assembler::ptest(XMMRegister dst, Address src) {
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2453 assert(VM_Version::supports_sse4_1(), "");
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2454
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2455 InstructionMark im(this);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2456 emit_byte(0x66);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2457 prefix(src, dst);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2458 emit_byte(0x0F);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2459 emit_byte(0x38);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2460 emit_byte(0x17);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2461 emit_operand(dst, src);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2462 }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2463
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2464 void Assembler::ptest(XMMRegister dst, XMMRegister src) {
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2465 assert(VM_Version::supports_sse4_1(), "");
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2466
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2467 emit_byte(0x66);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2468 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2469 emit_byte(0x0F);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2470 emit_byte(0x38);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2471 emit_byte(0x17);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2472 emit_byte(0xC0 | encode);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2473 }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2474
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2475 void Assembler::punpcklbw(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 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2478 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2479 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2480 emit_byte(0x60);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2481 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2482 }
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 void Assembler::push(int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2485 // in 64bits we push 64bits onto the stack but only
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2486 // take a 32bit immediate
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2487 emit_byte(0x68);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2488 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2489 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2490
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2491 void Assembler::push(Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2492 int encode = prefix_and_encode(src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2493
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2494 emit_byte(0x50 | encode);
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 void Assembler::pushf() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2498 emit_byte(0x9C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2499 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2500
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
2501 #ifndef _LP64 // no 32bit push/pop on amd64
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2502 void Assembler::pushl(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2503 // Note this will push 64bit on 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2504 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2505 prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2506 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2507 emit_operand(rsi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2508 }
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
2509 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2510
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2511 void Assembler::pxor(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2512 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2513 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2514 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2515 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2516 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2517 emit_byte(0xEF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2518 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2519 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2520
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2521 void Assembler::pxor(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2522 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2523 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2524 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2525 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2526 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2527 emit_byte(0xEF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2528 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2529 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2530
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2531 void Assembler::rcll(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2532 assert(isShiftCount(imm8), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2533 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2534 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2535 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2536 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2537 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2538 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2539 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2540 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2541 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2542 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2543
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2544 // copies data from [esi] to [edi] using rcx pointer sized words
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2545 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2546 void Assembler::rep_mov() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2547 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2548 // MOVSQ
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2549 LP64_ONLY(prefix(REX_W));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2550 emit_byte(0xA5);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2553 // sets rcx pointer sized words with rax, value at [edi]
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2554 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2555 void Assembler::rep_set() { // rep_set
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2556 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2557 // STOSQ
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2558 LP64_ONLY(prefix(REX_W));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2559 emit_byte(0xAB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2560 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2561
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2562 // scans rcx pointer sized words at [edi] for occurance of rax,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2563 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2564 void Assembler::repne_scan() { // repne_scan
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2565 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2566 // SCASQ
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2567 LP64_ONLY(prefix(REX_W));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2568 emit_byte(0xAF);
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 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2572 // scans rcx 4 byte words at [edi] for occurance of rax,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2573 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2574 void Assembler::repne_scanl() { // repne_scan
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2575 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2576 // SCASL
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2577 emit_byte(0xAF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2578 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2579 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2580
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 void Assembler::ret(int imm16) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 if (imm16 == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2583 emit_byte(0xC3);
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2585 emit_byte(0xC2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 emit_word(imm16);
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2589
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2590 void Assembler::sahf() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2591 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2592 // Not supported in 64bit mode
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2593 ShouldNotReachHere();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2594 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2595 emit_byte(0x9E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2596 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2597
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2598 void Assembler::sarl(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2599 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2600 assert(isShiftCount(imm8), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2601 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2602 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2603 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2604 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2605 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2606 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2607 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2608 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2609 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2610
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2611 void Assembler::sarl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2612 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2613 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2614 emit_byte(0xF8 | encode);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2617 void Assembler::sbbl(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2618 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2619 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2620 emit_arith_operand(0x81, rbx, dst, imm32);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2623 void Assembler::sbbl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2624 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2625 emit_arith(0x81, 0xD8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2626 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2627
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 void Assembler::sbbl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2630 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2631 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2632 emit_byte(0x1B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2633 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2634 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2635
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2636 void Assembler::sbbl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2637 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2638 emit_arith(0x1B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2639 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2640
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2641 void Assembler::setb(Condition cc, Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2642 assert(0 <= cc && cc < 16, "illegal cc");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2643 int encode = prefix_and_encode(dst->encoding(), true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2644 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2645 emit_byte(0x90 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2646 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2647 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2648
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2649 void Assembler::shll(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2650 assert(isShiftCount(imm8), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2651 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2652 if (imm8 == 1 ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2653 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2654 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2655 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2656 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2657 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2658 emit_byte(imm8);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2662 void Assembler::shll(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2663 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2664 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2665 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2666 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2667
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2668 void Assembler::shrl(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2669 assert(isShiftCount(imm8), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2670 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2671 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2672 emit_byte(0xE8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2673 emit_byte(imm8);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2676 void Assembler::shrl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2677 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2678 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2679 emit_byte(0xE8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2680 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2681
a61af66fc99e Initial load
duke
parents:
diff changeset
2682 // copies a single word from [esi] to [edi]
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 void Assembler::smovl() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 emit_byte(0xA5);
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2686
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2687 void Assembler::sqrtsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2688 // HMM Table D-1 says sse2
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2689 // NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2690 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2691 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2692 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2693 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2694 emit_byte(0x51);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2695 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2696 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2697
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2698 void Assembler::sqrtsd(XMMRegister dst, Address src) {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2699 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2700 InstructionMark im(this);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2701 emit_byte(0xF2);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2702 prefix(src, dst);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2703 emit_byte(0x0F);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2704 emit_byte(0x51);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2705 emit_operand(dst, src);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2706 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2707
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2708 void Assembler::sqrtss(XMMRegister dst, XMMRegister src) {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2709 // HMM Table D-1 says sse2
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2710 // NOT_LP64(assert(VM_Version::supports_sse(), ""));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2711 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2712 emit_byte(0xF3);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2713 int encode = prefix_and_encode(dst->encoding(), src->encoding());
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2714 emit_byte(0x0F);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2715 emit_byte(0x51);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2716 emit_byte(0xC0 | encode);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2717 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2718
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2719 void Assembler::sqrtss(XMMRegister dst, Address src) {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2720 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2721 InstructionMark im(this);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2722 emit_byte(0xF3);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2723 prefix(src, dst);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2724 emit_byte(0x0F);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2725 emit_byte(0x51);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2726 emit_operand(dst, src);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2727 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2728
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2729 void Assembler::stmxcsr( Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2730 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2731 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2732 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2733 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2734 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2735 emit_operand(as_Register(3), dst);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2738 void Assembler::subl(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2739 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2740 prefix(dst);
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
2741 emit_arith_operand(0x81, rbp, dst, imm32);
304
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2744 void Assembler::subl(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2745 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2746 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2747 emit_byte(0x29);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2748 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2749 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2750
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
2751 void Assembler::subl(Register dst, int32_t imm32) {
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
2752 prefix(dst);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
2753 emit_arith(0x81, 0xE8, dst, imm32);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
2754 }
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
2755
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2756 void Assembler::subl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2757 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2758 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2759 emit_byte(0x2B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2760 emit_operand(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::subl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2764 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2765 emit_arith(0x2B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2766 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2767
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2768 void Assembler::subsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2769 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2770 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2771 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2772 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2773 emit_byte(0x5C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2774 emit_byte(0xC0 | encode);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2777 void Assembler::subsd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2778 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2779 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2780 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2781 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2782 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2783 emit_byte(0x5C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2784 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2785 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2786
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2787 void Assembler::subss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2788 NOT_LP64(assert(VM_Version::supports_sse(), ""));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2789 emit_byte(0xF3);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2790 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2791 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2792 emit_byte(0x5C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2793 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2794 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2795
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2796 void Assembler::subss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2797 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2798 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2799 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2800 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2801 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2802 emit_byte(0x5C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2803 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2804 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2805
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2806 void Assembler::testb(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2807 NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2808 (void) prefix_and_encode(dst->encoding(), true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2809 emit_arith_b(0xF6, 0xC0, dst, imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2810 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2811
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2812 void Assembler::testl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2813 // not using emit_arith because test
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2814 // doesn't support sign-extension of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2815 // 8bit operands
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2816 int encode = dst->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2817 if (encode == 0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2818 emit_byte(0xA9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2819 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2820 encode = prefix_and_encode(encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2821 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2822 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2823 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2824 emit_long(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::testl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2828 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2829 emit_arith(0x85, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2830 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2831
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2832 void Assembler::testl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2833 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2834 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2835 emit_byte(0x85);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2836 emit_operand(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::ucomisd(XMMRegister dst, Address 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 ucomiss(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::ucomisd(XMMRegister dst, XMMRegister 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 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2848 ucomiss(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2849 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2850
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2851 void Assembler::ucomiss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2852 NOT_LP64(assert(VM_Version::supports_sse(), ""));
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 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2855 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2856 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2857 emit_byte(0x2E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2858 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2859 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2860
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2861 void Assembler::ucomiss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2862 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2863 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2864 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2865 emit_byte(0x2E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2866 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2867 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2868
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2869
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2870 void Assembler::xaddl(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2871 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2872 prefix(dst, src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2873 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2874 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2875 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2876 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2877
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2878 void Assembler::xchgl(Register dst, Address src) { // xchg
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2879 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2880 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2881 emit_byte(0x87);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2882 emit_operand(dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2885 void Assembler::xchgl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2886 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2887 emit_byte(0x87);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2888 emit_byte(0xc0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2889 }
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 void Assembler::xorl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2892 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2893 emit_arith(0x81, 0xF0, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2894 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2895
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2896 void Assembler::xorl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2897 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2898 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2899 emit_byte(0x33);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2900 emit_operand(dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2903 void Assembler::xorl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2904 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2905 emit_arith(0x33, 0xC0, dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2908 void Assembler::xorpd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2909 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2910 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2911 xorps(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2912 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2913
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2914 void Assembler::xorpd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2915 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2916 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2917 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2918 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2919 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2920 emit_byte(0x57);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2921 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2922 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2923
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 void Assembler::xorps(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2926 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2927 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2928 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2929 emit_byte(0x57);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2930 emit_byte(0xC0 | encode);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2933 void Assembler::xorps(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2934 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2935 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2936 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2937 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2938 emit_byte(0x57);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2939 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2940 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2941
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2942 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2943 // 32bit only pieces of the assembler
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::cmp_literal32(Register src1, int32_t imm32, RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2946 // NO PREFIX AS NEVER 64BIT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2947 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2948 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2949 emit_byte(0xF8 | src1->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2950 emit_data(imm32, rspec, 0);
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::cmp_literal32(Address src1, int32_t imm32, RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2954 // 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
2955 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2956 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2957 emit_operand(rdi, src1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2958 emit_data(imm32, rspec, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2959 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2960
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2961 // 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
2962 // 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
2963 // 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
2964 void Assembler::cmpxchg8(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2965 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2966 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2967 emit_byte(0xc7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2968 emit_operand(rcx, adr);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2971 void Assembler::decl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2972 // Don't use it directly. Use MacroAssembler::decrementl() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2973 emit_byte(0x48 | dst->encoding());
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2976 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2977
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2978 // 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
2979
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2980 void Assembler::fabs() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2981 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2982 emit_byte(0xE1);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2985 void Assembler::fadd(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2986 emit_farith(0xD8, 0xC0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2987 }
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 void Assembler::fadd_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2990 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2991 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2992 emit_operand32(rax, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2993 }
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 void Assembler::fadd_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2996 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2997 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2998 emit_operand32(rax, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3001 void Assembler::fadda(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3002 emit_farith(0xDC, 0xC0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3003 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3004
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3005 void Assembler::faddp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3006 emit_farith(0xDE, 0xC0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3007 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3008
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3009 void Assembler::fchs() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3010 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3011 emit_byte(0xE0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3012 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3013
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3014 void Assembler::fcom(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3015 emit_farith(0xD8, 0xD0, i);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3018 void Assembler::fcomp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3019 emit_farith(0xD8, 0xD8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3020 }
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 void Assembler::fcomp_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3023 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3024 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3025 emit_operand32(rbx, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3028 void Assembler::fcomp_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3029 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3030 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3031 emit_operand32(rbx, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3032 }
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 void Assembler::fcompp() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3035 emit_byte(0xDE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3036 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3037 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3038
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3039 void Assembler::fcos() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3040 emit_byte(0xD9);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3041 emit_byte(0xFF);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3042 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3043
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3044 void Assembler::fdecstp() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3045 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3046 emit_byte(0xF6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3047 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3048
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3049 void Assembler::fdiv(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3050 emit_farith(0xD8, 0xF0, i);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3053 void Assembler::fdiv_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3054 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3055 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3056 emit_operand32(rsi, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3059 void Assembler::fdiv_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3060 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3061 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3062 emit_operand32(rsi, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3065 void Assembler::fdiva(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3066 emit_farith(0xDC, 0xF8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3067 }
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 // 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
3070 // is erroneous for some of the floating-point instructions below.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3071
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3072 void Assembler::fdivp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3073 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
3074 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3075
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3076 void Assembler::fdivr(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3077 emit_farith(0xD8, 0xF8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3078 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3079
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3080 void Assembler::fdivr_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3081 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3082 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3083 emit_operand32(rdi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3084 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3085
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3086 void Assembler::fdivr_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3087 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3088 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3089 emit_operand32(rdi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3090 }
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 void Assembler::fdivra(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3093 emit_farith(0xDC, 0xF0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3094 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3095
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3096 void Assembler::fdivrp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3097 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
3098 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3099
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3100 void Assembler::ffree(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3101 emit_farith(0xDD, 0xC0, i);
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::fild_d(Address adr) {
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(0xDF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3107 emit_operand32(rbp, adr);
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::fild_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3111 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3112 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3113 emit_operand32(rax, adr);
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::fincstp() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3117 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3118 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3119 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3120
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3121 void Assembler::finit() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3122 emit_byte(0x9B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3123 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3124 emit_byte(0xE3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3125 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3126
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3127 void Assembler::fist_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3128 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3129 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3130 emit_operand32(rdx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3131 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3132
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3133 void Assembler::fistp_d(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3134 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3135 emit_byte(0xDF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3136 emit_operand32(rdi, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3137 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3138
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3139 void Assembler::fistp_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3140 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3141 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3142 emit_operand32(rbx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3143 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3144
a61af66fc99e Initial load
duke
parents:
diff changeset
3145 void Assembler::fld1() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3146 emit_byte(0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
3147 emit_byte(0xE8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3149
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3150 void Assembler::fld_d(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3151 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3152 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3153 emit_operand32(rax, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3154 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3155
a61af66fc99e Initial load
duke
parents:
diff changeset
3156 void Assembler::fld_s(Address adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3157 InstructionMark im(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3158 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3159 emit_operand32(rax, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3160 }
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::fld_s(int index) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3164 emit_farith(0xD9, 0xC0, index);
a61af66fc99e Initial load
duke
parents:
diff changeset
3165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3166
a61af66fc99e Initial load
duke
parents:
diff changeset
3167 void Assembler::fld_x(Address adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3168 InstructionMark im(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3169 emit_byte(0xDB);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3170 emit_operand32(rbp, adr);
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::fldcw(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(0xd9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3176 emit_operand32(rbp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3177 }
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 void Assembler::fldenv(Address src) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3180 InstructionMark im(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3181 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3182 emit_operand32(rsp, src);
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::fldlg2() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3186 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3187 emit_byte(0xEC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3188 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3189
a61af66fc99e Initial load
duke
parents:
diff changeset
3190 void Assembler::fldln2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3191 emit_byte(0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
3192 emit_byte(0xED);
a61af66fc99e Initial load
duke
parents:
diff changeset
3193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3194
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3195 void Assembler::fldz() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3196 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3197 emit_byte(0xEE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3198 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3199
a61af66fc99e Initial load
duke
parents:
diff changeset
3200 void Assembler::flog() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3201 fldln2();
a61af66fc99e Initial load
duke
parents:
diff changeset
3202 fxch();
a61af66fc99e Initial load
duke
parents:
diff changeset
3203 fyl2x();
a61af66fc99e Initial load
duke
parents:
diff changeset
3204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3205
a61af66fc99e Initial load
duke
parents:
diff changeset
3206 void Assembler::flog10() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3207 fldlg2();
a61af66fc99e Initial load
duke
parents:
diff changeset
3208 fxch();
a61af66fc99e Initial load
duke
parents:
diff changeset
3209 fyl2x();
a61af66fc99e Initial load
duke
parents:
diff changeset
3210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3211
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3212 void Assembler::fmul(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3213 emit_farith(0xD8, 0xC8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3214 }
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 void Assembler::fmul_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3217 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3218 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3219 emit_operand32(rcx, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3220 }
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 void Assembler::fmul_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3223 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3224 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3225 emit_operand32(rcx, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3226 }
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 void Assembler::fmula(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3229 emit_farith(0xDC, 0xC8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3230 }
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 void Assembler::fmulp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3233 emit_farith(0xDE, 0xC8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3234 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3235
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3236 void Assembler::fnsave(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3237 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3238 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3239 emit_operand32(rsi, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3240 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3241
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3242 void Assembler::fnstcw(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3243 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3244 emit_byte(0x9B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3245 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3246 emit_operand32(rdi, src);
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::fnstsw_ax() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3250 emit_byte(0xdF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3251 emit_byte(0xE0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3252 }
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 void Assembler::fprem() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3255 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3256 emit_byte(0xF8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3257 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3258
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3259 void Assembler::fprem1() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3260 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3261 emit_byte(0xF5);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3262 }
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 void Assembler::frstor(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3265 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3266 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3267 emit_operand32(rsp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3268 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3269
a61af66fc99e Initial load
duke
parents:
diff changeset
3270 void Assembler::fsin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3271 emit_byte(0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
3272 emit_byte(0xFE);
a61af66fc99e Initial load
duke
parents:
diff changeset
3273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3274
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3275 void Assembler::fsqrt() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3276 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3277 emit_byte(0xFA);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3280 void Assembler::fst_d(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3281 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3282 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3283 emit_operand32(rdx, adr);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3286 void Assembler::fst_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3287 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3288 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3289 emit_operand32(rdx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3290 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3291
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3292 void Assembler::fstp_d(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3293 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3294 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3295 emit_operand32(rbx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3296 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3297
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3298 void Assembler::fstp_d(int index) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3299 emit_farith(0xDD, 0xD8, index);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3300 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3301
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3302 void Assembler::fstp_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3303 InstructionMark im(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3304 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3305 emit_operand32(rbx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3306 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3307
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3308 void Assembler::fstp_x(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3309 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3310 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3311 emit_operand32(rdi, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3312 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3313
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3314 void Assembler::fsub(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3315 emit_farith(0xD8, 0xE0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3316 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3317
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3318 void Assembler::fsub_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3319 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3320 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3321 emit_operand32(rsp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3322 }
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 void Assembler::fsub_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3325 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3326 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3327 emit_operand32(rsp, src);
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 void Assembler::fsuba(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3331 emit_farith(0xDC, 0xE8, i);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3334 void Assembler::fsubp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3335 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
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::fsubr(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3339 emit_farith(0xD8, 0xE8, i);
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::fsubr_d(Address src) {
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(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3345 emit_operand32(rbp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3346 }
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 void Assembler::fsubr_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3349 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3350 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3351 emit_operand32(rbp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3352 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3353
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3354 void Assembler::fsubra(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3355 emit_farith(0xDC, 0xE0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3356 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3357
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3358 void Assembler::fsubrp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3359 emit_farith(0xDE, 0xE0, i); // ST(0) <- ST(1) - ST(0) and pop (Intel manual wrong)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3361
a61af66fc99e Initial load
duke
parents:
diff changeset
3362 void Assembler::ftan() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3363 emit_byte(0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
3364 emit_byte(0xF2);
a61af66fc99e Initial load
duke
parents:
diff changeset
3365 emit_byte(0xDD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3366 emit_byte(0xD8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3368
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3369 void Assembler::ftst() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3370 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3371 emit_byte(0xE4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3372 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3373
a61af66fc99e Initial load
duke
parents:
diff changeset
3374 void Assembler::fucomi(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3375 // make sure the instruction is supported (introduced for P6, together with cmov)
a61af66fc99e Initial load
duke
parents:
diff changeset
3376 guarantee(VM_Version::supports_cmov(), "illegal instruction");
a61af66fc99e Initial load
duke
parents:
diff changeset
3377 emit_farith(0xDB, 0xE8, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3379
a61af66fc99e Initial load
duke
parents:
diff changeset
3380 void Assembler::fucomip(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3381 // make sure the instruction is supported (introduced for P6, together with cmov)
a61af66fc99e Initial load
duke
parents:
diff changeset
3382 guarantee(VM_Version::supports_cmov(), "illegal instruction");
a61af66fc99e Initial load
duke
parents:
diff changeset
3383 emit_farith(0xDF, 0xE8, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3385
a61af66fc99e Initial load
duke
parents:
diff changeset
3386 void Assembler::fwait() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3387 emit_byte(0x9B);
a61af66fc99e Initial load
duke
parents:
diff changeset
3388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3389
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3390 void Assembler::fxch(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3391 emit_farith(0xD9, 0xC8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3392 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3393
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3394 void Assembler::fyl2x() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3395 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3396 emit_byte(0xF1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3397 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3398
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3399
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3400 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3401
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3402 void Assembler::incl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3403 // Don't use it directly. Use MacroAssembler::incrementl() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3404 emit_byte(0x40 | dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3405 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3406
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3407 void Assembler::lea(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3408 leal(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3409 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3410
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3411 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
3412 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3413 emit_byte(0xC7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3414 emit_operand(rax, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3415 emit_data((int)imm32, rspec, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3416 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3417
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3418 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
3419 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3420 int encode = prefix_and_encode(dst->encoding());
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3421 emit_byte(0xB8 | encode);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3422 emit_data((int)imm32, rspec, 0);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3423 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3424
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3425 void Assembler::popa() { // 32bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3426 emit_byte(0x61);
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 void Assembler::push_literal32(int32_t imm32, RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3430 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3431 emit_byte(0x68);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3432 emit_data(imm32, rspec, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3433 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3434
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3435 void Assembler::pusha() { // 32bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3436 emit_byte(0x60);
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 void Assembler::set_byte_if_not_zero(Register dst) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3440 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3441 emit_byte(0x95);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3442 emit_byte(0xE0 | dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3443 }
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 void Assembler::shldl(Register dst, Register src) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3446 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3447 emit_byte(0xA5);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3448 emit_byte(0xC0 | src->encoding() << 3 | dst->encoding());
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3451 void Assembler::shrdl(Register dst, Register src) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3452 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3453 emit_byte(0xAD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3454 emit_byte(0xC0 | src->encoding() << 3 | dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3455 }
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 #else // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3458
1369
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3459 void Assembler::set_byte_if_not_zero(Register dst) {
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3460 int enc = prefix_and_encode(dst->encoding(), true);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3461 emit_byte(0x0F);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3462 emit_byte(0x95);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3463 emit_byte(0xE0 | enc);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3464 }
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3465
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3466 // 64bit only pieces of the assembler
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3467 // 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
3468 // it cannot be used by instructions that want an immediate value.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3469
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3470 bool Assembler::reachable(AddressLiteral adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3471 int64_t disp;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3472 // 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
3473 // 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
3474 // always be reachable.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3475 if (adr.reloc() == relocInfo::none) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3476 return false;
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 if (adr.reloc() == relocInfo::internal_word_type) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3479 // This should be rip relative and easily reachable.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3480 return true;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3481 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3482 if (adr.reloc() == relocInfo::virtual_call_type ||
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3483 adr.reloc() == relocInfo::opt_virtual_call_type ||
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3484 adr.reloc() == relocInfo::static_call_type ||
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3485 adr.reloc() == relocInfo::static_stub_type ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3486 // This should be rip relative within the code cache and easily
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3487 // reachable until we get huge code caches. (At which point
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3488 // ic code is going to have issues).
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3489 return true;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3490 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3491 if (adr.reloc() != relocInfo::external_word_type &&
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3492 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
3493 adr.reloc() != relocInfo::poll_type && // relocs to identify them
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3494 adr.reloc() != relocInfo::runtime_call_type ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3495 return false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3496 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3497
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3498 // Stress the correction code
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3499 if (ForceUnreachable) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3500 // Must be runtimecall reloc, see if it is in the codecache
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3501 // Flipping stuff in the codecache to be unreachable causes issues
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3502 // with things like inline caches where the additional instructions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3503 // are not handled.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3504 if (CodeCache::find_blob(adr._target) == NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3505 return false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3506 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3507 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3508 // 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
3509 // 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
3510 // anywhere in the codeCache then we are always reachable.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3511 // 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
3512 // to be more pessimistic.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3513
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3514 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
3515 if (!is_simm32(disp)) return false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3516 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
3517 if (!is_simm32(disp)) return false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3518
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3519 disp = (int64_t)adr._target - ((int64_t)_code_pos + sizeof(int));
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 // 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
3522 // 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
3523 // 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
3524 // 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
3525
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3526 // 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
3527 // + 4 because better safe than sorry.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3528 const int fudge = 12 + 4;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3529 if (disp < 0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3530 disp -= fudge;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3531 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3532 disp += fudge;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3533 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3534 return is_simm32(disp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3535 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3536
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3537 void Assembler::emit_data64(jlong data,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3538 relocInfo::relocType rtype,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3539 int format) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3540 if (rtype == relocInfo::none) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3541 emit_long64(data);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3542 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3543 emit_data64(data, Relocation::spec_simple(rtype), format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3544 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3545 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3546
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3547 void Assembler::emit_data64(jlong data,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3548 RelocationHolder const& rspec,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3549 int format) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3550 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
3551 assert(imm_operand == format, "must be immediate");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3552 assert(inst_mark() != NULL, "must be inside InstructionMark");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3553 // Do not use AbstractAssembler::relocate, which is not intended for
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3554 // embedded words. Instead, relocate to the enclosing instruction.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3555 code_section()->relocate(inst_mark(), rspec, format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3556 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3557 check_relocation(rspec, format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3558 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3559 emit_long64(data);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3560 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3561
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3562 int Assembler::prefix_and_encode(int reg_enc, bool byteinst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3563 if (reg_enc >= 8) {
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 reg_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3566 } else if (byteinst && reg_enc >= 4) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3567 prefix(REX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3568 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3569 return reg_enc;
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 int Assembler::prefixq_and_encode(int reg_enc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3573 if (reg_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3574 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3575 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3576 prefix(REX_WB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3577 reg_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3578 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3579 return reg_enc;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3580 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3581
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3582 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
3583 if (dst_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3584 if (src_enc >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3585 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3586 src_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3587 } else if (byteinst && src_enc >= 4) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3588 prefix(REX);
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3591 if (src_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3592 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3593 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3594 prefix(REX_RB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3595 src_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3596 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3597 dst_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3598 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3599 return dst_enc << 3 | src_enc;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3600 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3601
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3602 int Assembler::prefixq_and_encode(int dst_enc, int src_enc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3603 if (dst_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3604 if (src_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3605 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3606 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3607 prefix(REX_WB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3608 src_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3609 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3610 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3611 if (src_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3612 prefix(REX_WR);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3613 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3614 prefix(REX_WRB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3615 src_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3616 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3617 dst_enc -= 8;
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 return dst_enc << 3 | src_enc;
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::prefix(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3623 if (reg->encoding() >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3624 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3625 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3626 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3627
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3628 void Assembler::prefix(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3629 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3630 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3631 prefix(REX_XB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3632 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3633 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3634 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3635 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3636 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3637 prefix(REX_X);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3638 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3639 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3640 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3641
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3642 void Assembler::prefixq(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3643 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3644 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3645 prefix(REX_WXB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3646 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3647 prefix(REX_WB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3648 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3649 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3650 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3651 prefix(REX_WX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3652 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3653 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3654 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3655 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3656 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3657
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3658
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3659 void Assembler::prefix(Address adr, Register reg, bool byteinst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3660 if (reg->encoding() < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3661 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3662 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3663 prefix(REX_XB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3664 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3665 prefix(REX_B);
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.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3669 prefix(REX_X);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3670 } else if (reg->encoding() >= 4 ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3671 prefix(REX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3672 }
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.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3676 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3677 prefix(REX_RXB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3678 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3679 prefix(REX_RB);
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3682 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3683 prefix(REX_RX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3684 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3685 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3686 }
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 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3690
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3691 void Assembler::prefixq(Address adr, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3692 if (src->encoding() < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3693 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3694 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3695 prefix(REX_WXB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3696 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3697 prefix(REX_WB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3698 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3699 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3700 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3701 prefix(REX_WX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3702 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3703 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3704 }
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3707 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3708 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3709 prefix(REX_WRXB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3710 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3711 prefix(REX_WRB);
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3714 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3715 prefix(REX_WRX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3716 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3717 prefix(REX_WR);
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 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3720 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3721 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3722
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3723 void Assembler::prefix(Address adr, XMMRegister reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3724 if (reg->encoding() < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3725 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3726 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3727 prefix(REX_XB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3728 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3729 prefix(REX_B);
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3732 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3733 prefix(REX_X);
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3737 if (adr.base_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3738 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3739 prefix(REX_RXB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3740 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3741 prefix(REX_RB);
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3744 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3745 prefix(REX_RX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3746 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3747 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3748 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3749 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3750 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3751 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3752
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3753 void Assembler::adcq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3754 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3755 emit_arith(0x81, 0xD0, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3756 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3757
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3758 void Assembler::adcq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3759 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3760 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3761 emit_byte(0x13);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3762 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3763 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3764
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3765 void Assembler::adcq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3766 (int) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3767 emit_arith(0x13, 0xC0, dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3770 void Assembler::addq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3771 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3772 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3773 emit_arith_operand(0x81, rax, dst,imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3774 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3775
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3776 void Assembler::addq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3777 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3778 prefixq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3779 emit_byte(0x01);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3780 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3781 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3782
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3783 void Assembler::addq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3784 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3785 emit_arith(0x81, 0xC0, dst, imm32);
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::addq(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(0x03);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3792 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3793 }
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 void Assembler::addq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3796 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3797 emit_arith(0x03, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3798 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3799
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3800 void Assembler::andq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3801 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3802 emit_arith(0x81, 0xE0, dst, imm32);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3805 void Assembler::andq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3806 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3807 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3808 emit_byte(0x23);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3809 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3810 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3811
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3812 void Assembler::andq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3813 (int) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3814 emit_arith(0x23, 0xC0, dst, src);
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
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3817 void Assembler::bsfq(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3818 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3819 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3820 emit_byte(0xBC);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3821 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3822 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3823
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3824 void Assembler::bsrq(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3825 assert(!VM_Version::supports_lzcnt(), "encoding is treated as LZCNT");
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3826 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3827 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3828 emit_byte(0xBD);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3829 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3830 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3831
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3832 void Assembler::bswapq(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3833 int encode = prefixq_and_encode(reg->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3834 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3835 emit_byte(0xC8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3836 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3837
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3838 void Assembler::cdqq() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3839 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3840 emit_byte(0x99);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3841 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3842
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3843 void Assembler::clflush(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3844 prefix(adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3845 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3846 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3847 emit_operand(rdi, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3848 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3849
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3850 void Assembler::cmovq(Condition cc, Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3851 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3852 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3853 emit_byte(0x40 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3854 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3855 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3856
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3857 void Assembler::cmovq(Condition cc, Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3858 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3859 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3860 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3861 emit_byte(0x40 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3862 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3863 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3864
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3865 void Assembler::cmpq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3866 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3867 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3868 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3869 emit_operand(rdi, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3870 emit_long(imm32);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3873 void Assembler::cmpq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3874 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3875 emit_arith(0x81, 0xF8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3876 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3877
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3878 void Assembler::cmpq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3879 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3880 prefixq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3881 emit_byte(0x3B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3882 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3883 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3884
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3885 void Assembler::cmpq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3886 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3887 emit_arith(0x3B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3888 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3889
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3890 void Assembler::cmpq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3891 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3892 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3893 emit_byte(0x3B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3894 emit_operand(dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3897 void Assembler::cmpxchgq(Register reg, Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3898 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3899 prefixq(adr, reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3900 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3901 emit_byte(0xB1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3902 emit_operand(reg, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3903 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3904
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3905 void Assembler::cvtsi2sdq(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3906 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3907 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3908 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3909 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3910 emit_byte(0x2A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3911 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3912 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3913
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3914 void Assembler::cvtsi2ssq(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3915 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3916 emit_byte(0xF3);
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(0x2A);
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::cvttsd2siq(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3924 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3925 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3926 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3927 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3928 emit_byte(0x2C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3929 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3930 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3931
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3932 void Assembler::cvttss2siq(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3933 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3934 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3935 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3936 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3937 emit_byte(0x2C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3938 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3939 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3940
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3941 void Assembler::decl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3942 // Don't use it directly. Use MacroAssembler::decrementl() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3943 // 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
3944 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3945 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3946 emit_byte(0xC8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3947 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3948
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3949 void Assembler::decq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3950 // Don't use it directly. Use MacroAssembler::decrementq() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3951 // 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
3952 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3953 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3954 emit_byte(0xC8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3955 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3956
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3957 void Assembler::decq(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3958 // Don't use it directly. Use MacroAssembler::decrementq() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3959 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3960 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3961 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3962 emit_operand(rcx, dst);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3965 void Assembler::fxrstor(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3966 prefixq(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3967 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3968 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3969 emit_operand(as_Register(1), src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3972 void Assembler::fxsave(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3973 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3974 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3975 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3976 emit_operand(as_Register(0), dst);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3979 void Assembler::idivq(Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3980 int encode = prefixq_and_encode(src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3981 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3982 emit_byte(0xF8 | encode);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3985 void Assembler::imulq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3986 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3987 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3988 emit_byte(0xAF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3989 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3990 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3991
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3992 void Assembler::imulq(Register dst, Register src, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3993 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3994 if (is8bit(value)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3995 emit_byte(0x6B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3996 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
3997 emit_byte(value & 0xFF);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3998 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3999 emit_byte(0x69);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4000 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4001 emit_long(value);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4002 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4003 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4004
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4005 void Assembler::incl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4006 // Don't use it directly. Use MacroAssembler::incrementl() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4007 // 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
4008 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4009 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4010 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4011 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4012
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4013 void Assembler::incq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4014 // Don't use it directly. Use MacroAssembler::incrementq() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4015 // 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
4016 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4017 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4018 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4019 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4020
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4021 void Assembler::incq(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4022 // Don't use it directly. Use MacroAssembler::incrementq() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4023 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4024 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4025 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4026 emit_operand(rax, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4027 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4028
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4029 void Assembler::lea(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4030 leaq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4031 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4032
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4033 void Assembler::leaq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4034 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4035 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4036 emit_byte(0x8D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4037 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4038 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4039
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4040 void Assembler::mov64(Register dst, int64_t imm64) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4041 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4042 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4043 emit_byte(0xB8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4044 emit_long64(imm64);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4047 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
4048 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4049 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4050 emit_byte(0xB8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4051 emit_data64(imm64, rspec);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4052 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4053
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4054 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
4055 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4056 int encode = prefix_and_encode(dst->encoding());
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4057 emit_byte(0xB8 | encode);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4058 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
4059 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4060
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4061 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
4062 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4063 prefix(dst);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4064 emit_byte(0xC7);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4065 emit_operand(rax, dst, 4);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4066 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
4067 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4068
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4069 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
4070 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4071 int encode = prefix_and_encode(src1->encoding());
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4072 emit_byte(0x81);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4073 emit_byte(0xF8 | encode);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4074 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
4075 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4076
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4077 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
4078 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4079 prefix(src1);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4080 emit_byte(0x81);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4081 emit_operand(rax, src1, 4);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4082 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
4083 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4084
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4085 void Assembler::lzcntq(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4086 assert(VM_Version::supports_lzcnt(), "encoding is treated as BSR");
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4087 emit_byte(0xF3);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4088 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4089 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4090 emit_byte(0xBD);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4091 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4092 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4093
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4094 void Assembler::movdq(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4095 // table D-1 says MMX/SSE2
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4096 NOT_LP64(assert(VM_Version::supports_sse2() || VM_Version::supports_mmx(), ""));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4097 emit_byte(0x66);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4098 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4099 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4100 emit_byte(0x6E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4101 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4102 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4103
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4104 void Assembler::movdq(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4105 // table D-1 says MMX/SSE2
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4106 NOT_LP64(assert(VM_Version::supports_sse2() || VM_Version::supports_mmx(), ""));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4107 emit_byte(0x66);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4108 // swap src/dst to get correct prefix
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4109 int encode = prefixq_and_encode(src->encoding(), dst->encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4110 emit_byte(0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
4111 emit_byte(0x7E);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4112 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4113 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4114
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4115 void Assembler::movq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4116 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4117 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4118 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4119 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4120
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4121 void Assembler::movq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4122 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4123 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4124 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4125 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4126 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4127
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4128 void Assembler::movq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4129 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4130 prefixq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4131 emit_byte(0x89);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4132 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4133 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4134
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4135 void Assembler::movsbq(Register dst, Address src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4136 InstructionMark im(this);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4137 prefixq(src, dst);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4138 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4139 emit_byte(0xBE);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4140 emit_operand(dst, src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4141 }
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 void Assembler::movsbq(Register dst, Register src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4144 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4145 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4146 emit_byte(0xBE);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4147 emit_byte(0xC0 | encode);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4148 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4149
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4150 void Assembler::movslq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4151 // dbx shows movslq(rcx, 3) as movq $0x0000000049000000,(%rbx)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4152 // and movslq(r8, 3); as movl $0x0000000048000000,(%rbx)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4153 // as a result we shouldn't use until tested at runtime...
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4154 ShouldNotReachHere();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4155 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4156 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4157 emit_byte(0xC7 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4158 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4159 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4160
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4161 void Assembler::movslq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4162 assert(is_simm32(imm32), "lost bits");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4163 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4164 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4165 emit_byte(0xC7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4166 emit_operand(rax, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4167 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4168 }
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 void Assembler::movslq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4171 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4172 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4173 emit_byte(0x63);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4174 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4175 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4176
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4177 void Assembler::movslq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4178 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4179 emit_byte(0x63);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4180 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4181 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4182
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4183 void Assembler::movswq(Register dst, Address src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4184 InstructionMark im(this);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4185 prefixq(src, dst);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4186 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4187 emit_byte(0xBF);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4188 emit_operand(dst, src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4189 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4190
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4191 void Assembler::movswq(Register dst, Register src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4192 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4193 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4194 emit_byte(0xBF);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4195 emit_byte(0xC0 | encode);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4196 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4197
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4198 void Assembler::movzbq(Register dst, Address src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4199 InstructionMark im(this);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4200 prefixq(src, dst);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4201 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4202 emit_byte(0xB6);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4203 emit_operand(dst, src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4204 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4205
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4206 void Assembler::movzbq(Register dst, Register src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4207 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4208 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4209 emit_byte(0xB6);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4210 emit_byte(0xC0 | encode);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4211 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4212
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4213 void Assembler::movzwq(Register dst, Address src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4214 InstructionMark im(this);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4215 prefixq(src, dst);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4216 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4217 emit_byte(0xB7);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4218 emit_operand(dst, src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4219 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4220
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4221 void Assembler::movzwq(Register dst, Register src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4222 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4223 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4224 emit_byte(0xB7);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4225 emit_byte(0xC0 | encode);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4226 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4227
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4228 void Assembler::negq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4229 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4230 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4231 emit_byte(0xD8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4232 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4233
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4234 void Assembler::notq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4235 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4236 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4237 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4238 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4239
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4240 void Assembler::orq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4241 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4242 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4243 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4244 emit_operand(rcx, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4245 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4246 }
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 void Assembler::orq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4249 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4250 emit_arith(0x81, 0xC8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4251 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4252
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4253 void Assembler::orq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4254 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4255 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4256 emit_byte(0x0B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4257 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4258 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4259
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4260 void Assembler::orq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4261 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4262 emit_arith(0x0B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4263 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4264
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4265 void Assembler::popa() { // 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4266 movq(r15, Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4267 movq(r14, Address(rsp, wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4268 movq(r13, Address(rsp, 2 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4269 movq(r12, Address(rsp, 3 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4270 movq(r11, Address(rsp, 4 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4271 movq(r10, Address(rsp, 5 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4272 movq(r9, Address(rsp, 6 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4273 movq(r8, Address(rsp, 7 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4274 movq(rdi, Address(rsp, 8 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4275 movq(rsi, Address(rsp, 9 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4276 movq(rbp, Address(rsp, 10 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4277 // skip rsp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4278 movq(rbx, Address(rsp, 12 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4279 movq(rdx, Address(rsp, 13 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4280 movq(rcx, Address(rsp, 14 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4281 movq(rax, Address(rsp, 15 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4282
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4283 addq(rsp, 16 * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4284 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4285
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4286 void Assembler::popcntq(Register dst, Address src) {
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4287 assert(VM_Version::supports_popcnt(), "must support");
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4288 InstructionMark im(this);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4289 emit_byte(0xF3);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4290 prefixq(src, dst);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4291 emit_byte(0x0F);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4292 emit_byte(0xB8);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4293 emit_operand(dst, src);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4294 }
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4295
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4296 void Assembler::popcntq(Register dst, Register src) {
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4297 assert(VM_Version::supports_popcnt(), "must support");
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4298 emit_byte(0xF3);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4299 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
4300 emit_byte(0x0F);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4301 emit_byte(0xB8);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4302 emit_byte(0xC0 | encode);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4303 }
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4304
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4305 void Assembler::popq(Address dst) {
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_byte(0x8F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4309 emit_operand(rax, dst);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4312 void Assembler::pusha() { // 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4313 // we have to store original rsp. ABI says that 128 bytes
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4314 // below rsp are local scratch.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4315 movq(Address(rsp, -5 * wordSize), rsp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4316
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4317 subq(rsp, 16 * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4318
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4319 movq(Address(rsp, 15 * wordSize), rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4320 movq(Address(rsp, 14 * wordSize), rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4321 movq(Address(rsp, 13 * wordSize), rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4322 movq(Address(rsp, 12 * wordSize), rbx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4323 // skip rsp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4324 movq(Address(rsp, 10 * wordSize), rbp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4325 movq(Address(rsp, 9 * wordSize), rsi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4326 movq(Address(rsp, 8 * wordSize), rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4327 movq(Address(rsp, 7 * wordSize), r8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4328 movq(Address(rsp, 6 * wordSize), r9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4329 movq(Address(rsp, 5 * wordSize), r10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4330 movq(Address(rsp, 4 * wordSize), r11);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4331 movq(Address(rsp, 3 * wordSize), r12);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4332 movq(Address(rsp, 2 * wordSize), r13);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4333 movq(Address(rsp, wordSize), r14);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4334 movq(Address(rsp, 0), r15);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4335 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4336
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4337 void Assembler::pushq(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4338 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4339 prefixq(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4340 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4341 emit_operand(rsi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4342 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4343
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4344 void Assembler::rclq(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4345 assert(isShiftCount(imm8 >> 1), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4346 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4347 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4348 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4349 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4350 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4351 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4352 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4353 emit_byte(imm8);
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 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4356 void Assembler::sarq(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4357 assert(isShiftCount(imm8 >> 1), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4358 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4359 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4360 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4361 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4362 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4363 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4364 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4365 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4366 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4367 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4368
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4369 void Assembler::sarq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4370 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4371 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4372 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4373 }
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
4374
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4375 void Assembler::sbbq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4376 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4377 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4378 emit_arith_operand(0x81, rbx, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4379 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4380
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4381 void Assembler::sbbq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4382 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4383 emit_arith(0x81, 0xD8, dst, imm32);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4386 void Assembler::sbbq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4387 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4388 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4389 emit_byte(0x1B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4390 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4391 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4392
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4393 void Assembler::sbbq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4394 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4395 emit_arith(0x1B, 0xC0, dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4398 void Assembler::shlq(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4399 assert(isShiftCount(imm8 >> 1), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4400 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4401 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4402 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4403 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4404 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4405 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4406 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4407 emit_byte(imm8);
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 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4410
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4411 void Assembler::shlq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4412 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4413 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4414 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4415 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4416
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4417 void Assembler::shrq(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4418 assert(isShiftCount(imm8 >> 1), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4419 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4420 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4421 emit_byte(0xE8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4422 emit_byte(imm8);
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::shrq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4426 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4427 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4428 emit_byte(0xE8 | encode);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4431 void Assembler::subq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4432 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4433 prefixq(dst);
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
4434 emit_arith_operand(0x81, rbp, dst, imm32);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4435 }
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 void Assembler::subq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4438 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4439 prefixq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4440 emit_byte(0x29);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4441 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4442 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4443
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
4444 void Assembler::subq(Register dst, int32_t imm32) {
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
4445 (void) prefixq_and_encode(dst->encoding());
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
4446 emit_arith(0x81, 0xE8, dst, imm32);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
4447 }
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
4448
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4449 void Assembler::subq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4450 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4451 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4452 emit_byte(0x2B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4453 emit_operand(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::subq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4457 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4458 emit_arith(0x2B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4459 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4460
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4461 void Assembler::testq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4462 // not using emit_arith because test
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4463 // doesn't support sign-extension of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4464 // 8bit operands
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4465 int encode = dst->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4466 if (encode == 0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4467 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4468 emit_byte(0xA9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4469 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4470 encode = prefixq_and_encode(encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4471 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4472 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4473 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4474 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4475 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4476
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4477 void Assembler::testq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4478 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4479 emit_arith(0x85, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4480 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4481
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4482 void Assembler::xaddq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4483 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4484 prefixq(dst, src);
71
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
4485 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4486 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4487 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4488 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4489
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4490 void Assembler::xchgq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4491 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4492 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4493 emit_byte(0x87);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4494 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4495 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4496
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4497 void Assembler::xchgq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4498 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4499 emit_byte(0x87);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4500 emit_byte(0xc0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4501 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4502
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4503 void Assembler::xorq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4504 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4505 emit_arith(0x33, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4506 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4507
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4508 void Assembler::xorq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4509 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4510 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4511 emit_byte(0x33);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4512 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4513 }
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 #endif // !LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4516
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4517 static Assembler::Condition reverse[] = {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4518 Assembler::noOverflow /* overflow = 0x0 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4519 Assembler::overflow /* noOverflow = 0x1 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4520 Assembler::aboveEqual /* carrySet = 0x2, below = 0x2 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4521 Assembler::below /* aboveEqual = 0x3, carryClear = 0x3 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4522 Assembler::notZero /* zero = 0x4, equal = 0x4 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4523 Assembler::zero /* notZero = 0x5, notEqual = 0x5 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4524 Assembler::above /* belowEqual = 0x6 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4525 Assembler::belowEqual /* above = 0x7 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4526 Assembler::positive /* negative = 0x8 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4527 Assembler::negative /* positive = 0x9 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4528 Assembler::noParity /* parity = 0xa */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4529 Assembler::parity /* noParity = 0xb */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4530 Assembler::greaterEqual /* less = 0xc */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4531 Assembler::less /* greaterEqual = 0xd */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4532 Assembler::greater /* lessEqual = 0xe */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4533 Assembler::lessEqual /* greater = 0xf, */
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4534
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4535 };
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4536
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4537
a61af66fc99e Initial load
duke
parents:
diff changeset
4538 // Implementation of MacroAssembler
a61af66fc99e Initial load
duke
parents:
diff changeset
4539
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4540 // 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
4541 // Unless the difference is trivial (1 line or so).
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4542
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4543 #ifndef _LP64
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 // 32bit versions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4546
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4547 Address MacroAssembler::as_Address(AddressLiteral adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4548 return Address(adr.target(), adr.rspec());
a61af66fc99e Initial load
duke
parents:
diff changeset
4549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4550
a61af66fc99e Initial load
duke
parents:
diff changeset
4551 Address MacroAssembler::as_Address(ArrayAddress adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4552 return Address::make_array(adr);
a61af66fc99e Initial load
duke
parents:
diff changeset
4553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4554
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4555 int MacroAssembler::biased_locking_enter(Register lock_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4556 Register obj_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4557 Register swap_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4558 Register tmp_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4559 bool swap_reg_contains_mark,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4560 Label& done,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4561 Label* slow_case,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4562 BiasedLockingCounters* counters) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4563 assert(UseBiasedLocking, "why call this otherwise?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4564 assert(swap_reg == rax, "swap_reg must be rax, for cmpxchg");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4565 assert_different_registers(lock_reg, obj_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4566
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4567 if (PrintBiasedLockingStatistics && counters == NULL)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4568 counters = BiasedLocking::counters();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4569
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4570 bool need_tmp_reg = false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4571 if (tmp_reg == noreg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4572 need_tmp_reg = true;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4573 tmp_reg = lock_reg;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4574 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4575 assert_different_registers(lock_reg, obj_reg, swap_reg, tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4576 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4577 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
4578 Address mark_addr (obj_reg, oopDesc::mark_offset_in_bytes());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4579 Address klass_addr (obj_reg, oopDesc::klass_offset_in_bytes());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4580 Address saved_mark_addr(lock_reg, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4581
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4582 // Biased locking
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4583 // See whether the lock is currently biased toward our thread and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4584 // whether the epoch is still valid
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4585 // Note that the runtime guarantees sufficient alignment of JavaThread
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4586 // pointers to allow age to be placed into low bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4587 // 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
4588 Label cas_label;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4589 int null_check_offset = -1;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4590 if (!swap_reg_contains_mark) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4591 null_check_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4592 movl(swap_reg, mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4593 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4594 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4595 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4596 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4597 movl(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4598 andl(tmp_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4599 cmpl(tmp_reg, markOopDesc::biased_lock_pattern);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4600 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4601 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4602 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4603 jcc(Assembler::notEqual, cas_label);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4604 // 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
4605 // whether the bias owner and the epoch are both still current.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4606 // 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
4607 // 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
4608 // avoid reloading it and needing to recheck invariants below. This
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4609 // store is unfortunate but it makes the overall code shorter and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4610 // simpler.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4611 movl(saved_mark_addr, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4612 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4613 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4614 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4615 get_thread(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4616 xorl(swap_reg, tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4617 if (swap_reg_contains_mark) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4618 null_check_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4619 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4620 movl(tmp_reg, klass_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4621 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
4622 andl(swap_reg, ~((int) markOopDesc::age_mask_in_place));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4623 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4624 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4625 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4626 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4627 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4628 ExternalAddress((address)counters->biased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4629 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4630 jcc(Assembler::equal, done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4631
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4632 Label try_revoke_bias;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4633 Label try_rebias;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4634
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4635 // 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
4636 // 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
4637 // 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
4638 // know what operations can be legally performed on the object's
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4639 // header.
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 // 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
4642 // 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
4643 // the bias on this object.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4644 testl(swap_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4645 jcc(Assembler::notZero, try_revoke_bias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4646
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4647 // Biasing is still enabled for this data type. See whether the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4648 // 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
4649 // 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
4650 // prototype header. (Note that the prototype header's epoch bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4651 // 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
4652 // toward the current thread. Note that we must be absolutely sure
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4653 // 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
4654 // otherwise the manipulations it performs on the mark word are
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4655 // illegal.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4656 testl(swap_reg, markOopDesc::epoch_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4657 jcc(Assembler::notZero, try_rebias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4658
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4659 // 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
4660 // 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
4661 // 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
4662 // 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
4663 // Note that we first construct the presumed unbiased header so we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4664 // don't accidentally blow away another thread's valid bias.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4665 movl(swap_reg, saved_mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4666 andl(swap_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4667 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
4668 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4669 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4670 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4671 get_thread(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4672 orl(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4673 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4674 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4675 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4676 cmpxchgptr(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4677 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4678 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4679 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4680 // If the biasing toward our thread failed, this means that
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4681 // another thread succeeded in biasing it toward itself and we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4682 // need to revoke that bias. The revocation will occur in the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4683 // interpreter runtime in the slow case.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4684 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4685 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4686 ExternalAddress((address)counters->anonymously_biased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4687 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4688 if (slow_case != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4689 jcc(Assembler::notZero, *slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4690 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4691 jmp(done);
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 bind(try_rebias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4694 // 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
4695 // current "bias owner", if any, is actually invalid. Under these
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4696 // circumstances _only_, we are allowed to use the current header's
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4697 // 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
4698 // 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
4699 // the bias from one thread to another directly in this situation.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4700 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4701 // 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
4702 // bits in this situation. Should attempt to preserve them.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4703 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4704 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4705 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4706 get_thread(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4707 movl(swap_reg, klass_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4708 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
4709 movl(swap_reg, saved_mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4710 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4711 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4712 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4713 cmpxchgptr(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4714 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4715 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4716 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4717 // If the biasing toward our thread failed, then another thread
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4718 // 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
4719 // 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
4720 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4721 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4722 ExternalAddress((address)counters->rebiased_lock_entry_count_addr()));
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 if (slow_case != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4725 jcc(Assembler::notZero, *slow_case);
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 jmp(done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4728
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4729 bind(try_revoke_bias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4730 // 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
4731 // more, indicating that objects of this data type are not supposed
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4732 // 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
4733 // this object to the prototype value and fall through to the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4734 // 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
4735 // that another thread raced us for the privilege of revoking the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4736 // 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
4737 // normal locking code.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4738 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4739 // 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
4740 // bits in this situation. Should attempt to preserve them.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4741 movl(swap_reg, saved_mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4742 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4743 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4744 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4745 movl(tmp_reg, klass_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4746 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
4747 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4748 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4749 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4750 cmpxchgptr(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4751 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4752 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4753 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4754 // 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
4755 // 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
4756 // removing the bias bit from the object's header.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4757 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4758 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4759 ExternalAddress((address)counters->revoked_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4760 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4761
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4762 bind(cas_label);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4763
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4764 return null_check_offset;
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 void MacroAssembler::call_VM_leaf_base(address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4767 int number_of_arguments) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4768 call(RuntimeAddress(entry_point));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4769 increment(rsp, number_of_arguments * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4770 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4771
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4772 void MacroAssembler::cmpoop(Address src1, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4773 cmp_literal32(src1, (int32_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4774 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4775
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4776 void MacroAssembler::cmpoop(Register src1, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4777 cmp_literal32(src1, (int32_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4778 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4779
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4780 void MacroAssembler::extend_sign(Register hi, Register lo) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4781 // According to Intel Doc. AP-526, "Integer Divide", p.18.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4782 if (VM_Version::is_P6() && hi == rdx && lo == rax) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4783 cdql();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4784 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4785 movl(hi, lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4786 sarl(hi, 31);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4787 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4788 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4789
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4790 void MacroAssembler::fat_nop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4791 // A 5 byte nop that is safe for patching (see patch_verified_entry)
a61af66fc99e Initial load
duke
parents:
diff changeset
4792 emit_byte(0x26); // es:
a61af66fc99e Initial load
duke
parents:
diff changeset
4793 emit_byte(0x2e); // cs:
a61af66fc99e Initial load
duke
parents:
diff changeset
4794 emit_byte(0x64); // fs:
a61af66fc99e Initial load
duke
parents:
diff changeset
4795 emit_byte(0x65); // gs:
a61af66fc99e Initial load
duke
parents:
diff changeset
4796 emit_byte(0x90);
a61af66fc99e Initial load
duke
parents:
diff changeset
4797 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4798
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4799 void MacroAssembler::jC2(Register tmp, Label& L) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4800 // set parity bit if FPU flag C2 is set (via rax)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4801 save_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4802 fwait(); fnstsw_ax();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4803 sahf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4804 restore_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4805 // branch
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4806 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4807 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4808
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4809 void MacroAssembler::jnC2(Register tmp, Label& L) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4810 // set parity bit if FPU flag C2 is set (via rax)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4811 save_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4812 fwait(); fnstsw_ax();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4813 sahf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4814 restore_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4815 // branch
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4816 jcc(Assembler::noParity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4817 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4818
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4819 // 32bit can do a case table jump in one instruction but we no longer allow the base
a61af66fc99e Initial load
duke
parents:
diff changeset
4820 // to be installed in the Address class
a61af66fc99e Initial load
duke
parents:
diff changeset
4821 void MacroAssembler::jump(ArrayAddress entry) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4822 jmp(as_Address(entry));
a61af66fc99e Initial load
duke
parents:
diff changeset
4823 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4824
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4825 // Note: y_lo will be destroyed
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4826 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
4827 // Long compare for Java (semantics as described in JVM spec.)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4828 Label high, low, done;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4829
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4830 cmpl(x_hi, y_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4831 jcc(Assembler::less, low);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4832 jcc(Assembler::greater, high);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4833 // x_hi is the return register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4834 xorl(x_hi, x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4835 cmpl(x_lo, y_lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4836 jcc(Assembler::below, low);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4837 jcc(Assembler::equal, done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4838
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4839 bind(high);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4840 xorl(x_hi, x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4841 increment(x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4842 jmp(done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4843
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4844 bind(low);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4845 xorl(x_hi, x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4846 decrementl(x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4847
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4848 bind(done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4849 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4850
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4851 void MacroAssembler::lea(Register dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4852 mov_literal32(dst, (int32_t)src.target(), src.rspec());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4853 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4854
a61af66fc99e Initial load
duke
parents:
diff changeset
4855 void MacroAssembler::lea(Address dst, AddressLiteral adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4856 // leal(dst, as_Address(adr));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4857 // see note in movl as to why we must use a move
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4858 mov_literal32(dst, (int32_t) adr.target(), adr.rspec());
a61af66fc99e Initial load
duke
parents:
diff changeset
4859 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4860
a61af66fc99e Initial load
duke
parents:
diff changeset
4861 void MacroAssembler::leave() {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4862 mov(rsp, rbp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4863 pop(rbp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4864 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4865
a61af66fc99e Initial load
duke
parents:
diff changeset
4866 void MacroAssembler::lmul(int x_rsp_offset, int y_rsp_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4867 // Multiplication of two Java long values stored on the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
4868 // as illustrated below. Result is in rdx:rax.
a61af66fc99e Initial load
duke
parents:
diff changeset
4869 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4870 // rsp ---> [ ?? ] \ \
a61af66fc99e Initial load
duke
parents:
diff changeset
4871 // .... | y_rsp_offset |
a61af66fc99e Initial load
duke
parents:
diff changeset
4872 // [ y_lo ] / (in bytes) | x_rsp_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
4873 // [ y_hi ] | (in bytes)
a61af66fc99e Initial load
duke
parents:
diff changeset
4874 // .... |
a61af66fc99e Initial load
duke
parents:
diff changeset
4875 // [ x_lo ] /
a61af66fc99e Initial load
duke
parents:
diff changeset
4876 // [ x_hi ]
a61af66fc99e Initial load
duke
parents:
diff changeset
4877 // ....
a61af66fc99e Initial load
duke
parents:
diff changeset
4878 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4879 // Basic idea: lo(result) = lo(x_lo * y_lo)
a61af66fc99e Initial load
duke
parents:
diff changeset
4880 // hi(result) = hi(x_lo * y_lo) + lo(x_hi * y_lo) + lo(x_lo * y_hi)
a61af66fc99e Initial load
duke
parents:
diff changeset
4881 Address x_hi(rsp, x_rsp_offset + wordSize); Address x_lo(rsp, x_rsp_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
4882 Address y_hi(rsp, y_rsp_offset + wordSize); Address y_lo(rsp, y_rsp_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
4883 Label quick;
a61af66fc99e Initial load
duke
parents:
diff changeset
4884 // load x_hi, y_hi and check if quick
a61af66fc99e Initial load
duke
parents:
diff changeset
4885 // multiplication is possible
a61af66fc99e Initial load
duke
parents:
diff changeset
4886 movl(rbx, x_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4887 movl(rcx, y_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4888 movl(rax, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
4889 orl(rbx, rcx); // rbx, = 0 <=> x_hi = 0 and y_hi = 0
a61af66fc99e Initial load
duke
parents:
diff changeset
4890 jcc(Assembler::zero, quick); // if rbx, = 0 do quick multiply
a61af66fc99e Initial load
duke
parents:
diff changeset
4891 // do full multiplication
a61af66fc99e Initial load
duke
parents:
diff changeset
4892 // 1st step
a61af66fc99e Initial load
duke
parents:
diff changeset
4893 mull(y_lo); // x_hi * y_lo
a61af66fc99e Initial load
duke
parents:
diff changeset
4894 movl(rbx, rax); // save lo(x_hi * y_lo) in rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
4895 // 2nd step
a61af66fc99e Initial load
duke
parents:
diff changeset
4896 movl(rax, x_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
4897 mull(rcx); // x_lo * y_hi
a61af66fc99e Initial load
duke
parents:
diff changeset
4898 addl(rbx, rax); // add lo(x_lo * y_hi) to rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
4899 // 3rd step
a61af66fc99e Initial load
duke
parents:
diff changeset
4900 bind(quick); // note: rbx, = 0 if quick multiply!
a61af66fc99e Initial load
duke
parents:
diff changeset
4901 movl(rax, x_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
4902 mull(y_lo); // x_lo * y_lo
a61af66fc99e Initial load
duke
parents:
diff changeset
4903 addl(rdx, rbx); // correct hi(x_lo * y_lo)
a61af66fc99e Initial load
duke
parents:
diff changeset
4904 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4905
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4906 void MacroAssembler::lneg(Register hi, Register lo) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4907 negl(lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4908 adcl(hi, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4909 negl(hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4910 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4911
a61af66fc99e Initial load
duke
parents:
diff changeset
4912 void MacroAssembler::lshl(Register hi, Register lo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4913 // Java shift left long support (semantics as described in JVM spec., p.305)
a61af66fc99e Initial load
duke
parents:
diff changeset
4914 // (basic idea for shift counts s >= n: x << s == (x << n) << (s - n))
a61af66fc99e Initial load
duke
parents:
diff changeset
4915 // shift value is in rcx !
a61af66fc99e Initial load
duke
parents:
diff changeset
4916 assert(hi != rcx, "must not use rcx");
a61af66fc99e Initial load
duke
parents:
diff changeset
4917 assert(lo != rcx, "must not use rcx");
a61af66fc99e Initial load
duke
parents:
diff changeset
4918 const Register s = rcx; // shift count
a61af66fc99e Initial load
duke
parents:
diff changeset
4919 const int n = BitsPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
4920 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
4921 andl(s, 0x3f); // s := s & 0x3f (s < 0x40)
a61af66fc99e Initial load
duke
parents:
diff changeset
4922 cmpl(s, n); // if (s < n)
a61af66fc99e Initial load
duke
parents:
diff changeset
4923 jcc(Assembler::less, L); // else (s >= n)
a61af66fc99e Initial load
duke
parents:
diff changeset
4924 movl(hi, lo); // x := x << n
a61af66fc99e Initial load
duke
parents:
diff changeset
4925 xorl(lo, lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
4926 // Note: subl(s, n) is not needed since the Intel shift instructions work rcx mod n!
a61af66fc99e Initial load
duke
parents:
diff changeset
4927 bind(L); // s (mod n) < n
a61af66fc99e Initial load
duke
parents:
diff changeset
4928 shldl(hi, lo); // x := x << s
a61af66fc99e Initial load
duke
parents:
diff changeset
4929 shll(lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
4930 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4931
a61af66fc99e Initial load
duke
parents:
diff changeset
4932
a61af66fc99e Initial load
duke
parents:
diff changeset
4933 void MacroAssembler::lshr(Register hi, Register lo, bool sign_extension) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4934 // Java shift right long support (semantics as described in JVM spec., p.306 & p.310)
a61af66fc99e Initial load
duke
parents:
diff changeset
4935 // (basic idea for shift counts s >= n: x >> s == (x >> n) >> (s - n))
a61af66fc99e Initial load
duke
parents:
diff changeset
4936 assert(hi != rcx, "must not use rcx");
a61af66fc99e Initial load
duke
parents:
diff changeset
4937 assert(lo != rcx, "must not use rcx");
a61af66fc99e Initial load
duke
parents:
diff changeset
4938 const Register s = rcx; // shift count
a61af66fc99e Initial load
duke
parents:
diff changeset
4939 const int n = BitsPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
4940 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
4941 andl(s, 0x3f); // s := s & 0x3f (s < 0x40)
a61af66fc99e Initial load
duke
parents:
diff changeset
4942 cmpl(s, n); // if (s < n)
a61af66fc99e Initial load
duke
parents:
diff changeset
4943 jcc(Assembler::less, L); // else (s >= n)
a61af66fc99e Initial load
duke
parents:
diff changeset
4944 movl(lo, hi); // x := x >> n
a61af66fc99e Initial load
duke
parents:
diff changeset
4945 if (sign_extension) sarl(hi, 31);
a61af66fc99e Initial load
duke
parents:
diff changeset
4946 else xorl(hi, hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4947 // Note: subl(s, n) is not needed since the Intel shift instructions work rcx mod n!
a61af66fc99e Initial load
duke
parents:
diff changeset
4948 bind(L); // s (mod n) < n
a61af66fc99e Initial load
duke
parents:
diff changeset
4949 shrdl(lo, hi); // x := x >> s
a61af66fc99e Initial load
duke
parents:
diff changeset
4950 if (sign_extension) sarl(hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4951 else shrl(hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4952 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4953
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4954 void MacroAssembler::movoop(Register dst, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4955 mov_literal32(dst, (int32_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4956 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4957
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4958 void MacroAssembler::movoop(Address dst, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4959 mov_literal32(dst, (int32_t)obj, oop_Relocation::spec_for_immediate());
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4962 void MacroAssembler::movptr(Register dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4963 if (src.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4964 mov_literal32(dst, (intptr_t)src.target(), src.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4965 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4966 movl(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4967 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4968 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4969
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4970 void MacroAssembler::movptr(ArrayAddress dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4971 movl(as_Address(dst), src);
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::movptr(Register dst, ArrayAddress src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4975 movl(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4976 }
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 // 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
4979 void MacroAssembler::movptr(Address dst, intptr_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4980 movl(dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4984 void MacroAssembler::pop_callee_saved_registers() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4985 pop(rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4986 pop(rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4987 pop(rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4988 pop(rsi);
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 void MacroAssembler::pop_fTOS() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4992 fld_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4993 addl(rsp, 2 * wordSize);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4996 void MacroAssembler::push_callee_saved_registers() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4997 push(rsi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4998 push(rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4999 push(rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5000 push(rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5001 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5002
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5003 void MacroAssembler::push_fTOS() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5004 subl(rsp, 2 * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5005 fstp_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5006 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5007
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5008
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5009 void MacroAssembler::pushoop(jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5010 push_literal32((int32_t)obj, oop_Relocation::spec_for_immediate());
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5013
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5014 void MacroAssembler::pushptr(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5015 if (src.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5016 push_literal32((int32_t)src.target(), src.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5017 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5018 pushl(as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5019 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5020 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5021
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5022 void MacroAssembler::set_word_if_not_zero(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5023 xorl(dst, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5024 set_byte_if_not_zero(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5025 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5026
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5027 static void pass_arg0(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5028 masm->push(arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5029 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5030
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5031 static void pass_arg1(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5032 masm->push(arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5033 }
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 static void pass_arg2(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5036 masm->push(arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5037 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5038
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5039 static void pass_arg3(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5040 masm->push(arg);
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 #ifndef PRODUCT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5044 extern "C" void findpc(intptr_t x);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5045 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5046
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5047 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
5048 // 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
5049 JavaThread* thread = JavaThread::current();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5050 JavaThreadState saved_state = thread->thread_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5051 thread->set_thread_state(_thread_in_vm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5052 if (ShowMessageBoxOnError) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5053 JavaThread* thread = JavaThread::current();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5054 JavaThreadState saved_state = thread->thread_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5055 thread->set_thread_state(_thread_in_vm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5056 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5057 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5058 BytecodeCounter::print();
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 // 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
5061 // 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
5062 if (os::message_box(msg, "Execution stopped, print registers?")) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5063 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5064 tty->print_cr("eip = 0x%08x", eip);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5065 #ifndef PRODUCT
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5066 if ((WizardMode || Verbose) && PrintMiscellaneous) {
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5067 tty->cr();
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5068 findpc(eip);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5069 tty->cr();
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5070 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5071 #endif
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5072 tty->print_cr("rax = 0x%08x", rax);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5073 tty->print_cr("rbx = 0x%08x", rbx);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5074 tty->print_cr("rcx = 0x%08x", rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5075 tty->print_cr("rdx = 0x%08x", rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5076 tty->print_cr("rdi = 0x%08x", rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5077 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
5078 tty->print_cr("rbp = 0x%08x", rbp);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5079 tty->print_cr("rsp = 0x%08x", rsp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5080 BREAKPOINT;
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5081 assert(false, "start up GDB");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5082 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5083 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5084 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5085 ::tty->print_cr("=============== DEBUG MESSAGE: %s ================\n", msg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5086 assert(false, "DEBUG MESSAGE");
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 ThreadStateTransition::transition(thread, _thread_in_vm, saved_state);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5089 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5090
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5091 void MacroAssembler::stop(const char* msg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5092 ExternalAddress message((address)msg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5093 // push address of message
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5094 pushptr(message.addr());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5095 { Label L; call(L, relocInfo::none); bind(L); } // push eip
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5096 pusha(); // push registers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5097 call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug32)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5098 hlt();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5099 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5100
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5101 void MacroAssembler::warn(const char* msg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5102 push_CPU_state();
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 ExternalAddress message((address) msg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5105 // push address of message
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5106 pushptr(message.addr());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5107
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5108 call(RuntimeAddress(CAST_FROM_FN_PTR(address, warning)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5109 addl(rsp, wordSize); // discard argument
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5110 pop_CPU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5111 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5112
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5113 #else // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5114
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5115 // 64 bit versions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5116
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5117 Address MacroAssembler::as_Address(AddressLiteral adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5118 // amd64 always does this as a pc-rel
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5119 // we can be absolute or disp based on the instruction type
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5120 // jmp/call are displacements others are absolute
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5121 assert(!adr.is_lval(), "must be rval");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5122 assert(reachable(adr), "must be");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5123 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
5124
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5125 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5126
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5127 Address MacroAssembler::as_Address(ArrayAddress adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5128 AddressLiteral base = adr.base();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5129 lea(rscratch1, base);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5130 Address index = adr.index();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5131 assert(index._disp == 0, "must not have disp"); // maybe it can?
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5132 Address array(rscratch1, index._index, index._scale, index._disp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5133 return array;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5134 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5135
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5136 int MacroAssembler::biased_locking_enter(Register lock_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5137 Register obj_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5138 Register swap_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5139 Register tmp_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5140 bool swap_reg_contains_mark,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5141 Label& done,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5142 Label* slow_case,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5143 BiasedLockingCounters* counters) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5144 assert(UseBiasedLocking, "why call this otherwise?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5145 assert(swap_reg == rax, "swap_reg must be rax for cmpxchgq");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5146 assert(tmp_reg != noreg, "tmp_reg must be supplied");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5147 assert_different_registers(lock_reg, obj_reg, swap_reg, tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5148 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
5149 Address mark_addr (obj_reg, oopDesc::mark_offset_in_bytes());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5150 Address saved_mark_addr(lock_reg, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5151
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5152 if (PrintBiasedLockingStatistics && counters == NULL)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5153 counters = BiasedLocking::counters();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5154
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5155 // Biased locking
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5156 // See whether the lock is currently biased toward our thread and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5157 // whether the epoch is still valid
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5158 // Note that the runtime guarantees sufficient alignment of JavaThread
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5159 // pointers to allow age to be placed into low bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5160 // 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
5161 Label cas_label;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5162 int null_check_offset = -1;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5163 if (!swap_reg_contains_mark) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5164 null_check_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5165 movq(swap_reg, mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5166 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5167 movq(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5168 andq(tmp_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5169 cmpq(tmp_reg, markOopDesc::biased_lock_pattern);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5170 jcc(Assembler::notEqual, cas_label);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5171 // 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
5172 // whether the bias owner and the epoch are both still current.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5173 load_prototype_header(tmp_reg, obj_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5174 orq(tmp_reg, r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5175 xorq(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5176 andq(tmp_reg, ~((int) markOopDesc::age_mask_in_place));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5177 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5178 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5179 ExternalAddress((address) counters->anonymously_biased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5180 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5181 jcc(Assembler::equal, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
5182
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5183 Label try_revoke_bias;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5184 Label try_rebias;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5185
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5186 // 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
5187 // 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
5188 // 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
5189 // know what operations can be legally performed on the object's
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5190 // header.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5191
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5192 // 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
5193 // 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
5194 // the bias on this object.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5195 testq(tmp_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5196 jcc(Assembler::notZero, try_revoke_bias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5197
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5198 // Biasing is still enabled for this data type. See whether the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5199 // 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
5200 // 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
5201 // prototype header. (Note that the prototype header's epoch bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5202 // 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
5203 // toward the current thread. Note that we must be absolutely sure
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5204 // 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
5205 // otherwise the manipulations it performs on the mark word are
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5206 // illegal.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5207 testq(tmp_reg, markOopDesc::epoch_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5208 jcc(Assembler::notZero, try_rebias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5209
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5210 // 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
5211 // 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
5212 // 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
5213 // 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
5214 // Note that we first construct the presumed unbiased header so we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5215 // don't accidentally blow away another thread's valid bias.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5216 andq(swap_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5217 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
5218 movq(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5219 orq(tmp_reg, r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5220 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5221 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5222 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5223 cmpxchgq(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5224 // If the biasing toward our thread failed, this means that
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5225 // another thread succeeded in biasing it toward itself and we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5226 // need to revoke that bias. The revocation will occur in the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5227 // interpreter runtime in the slow case.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5228 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5229 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5230 ExternalAddress((address) counters->anonymously_biased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5231 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5232 if (slow_case != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5233 jcc(Assembler::notZero, *slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5234 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5235 jmp(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
5236
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5237 bind(try_rebias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5238 // 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
5239 // current "bias owner", if any, is actually invalid. Under these
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5240 // circumstances _only_, we are allowed to use the current header's
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5241 // 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
5242 // 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
5243 // the bias from one thread to another directly in this situation.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5244 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5245 // 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
5246 // bits in this situation. Should attempt to preserve them.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5247 load_prototype_header(tmp_reg, obj_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5248 orq(tmp_reg, r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5249 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5250 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5251 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5252 cmpxchgq(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5253 // If the biasing toward our thread failed, then another thread
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5254 // 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
5255 // 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
5256 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5257 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5258 ExternalAddress((address) counters->rebiased_lock_entry_count_addr()));
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 if (slow_case != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5261 jcc(Assembler::notZero, *slow_case);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5263 jmp(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
5264
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5265 bind(try_revoke_bias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5266 // 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
5267 // more, indicating that objects of this data type are not supposed
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5268 // 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
5269 // this object to the prototype value and fall through to the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5270 // 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
5271 // that another thread raced us for the privilege of revoking the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5272 // 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
5273 // normal locking code.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5274 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5275 // 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
5276 // bits in this situation. Should attempt to preserve them.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5277 load_prototype_header(tmp_reg, obj_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5278 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5279 lock();
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 cmpxchgq(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5282 // 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
5283 // 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
5284 // removing the bias bit from the object's header.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5285 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5286 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5287 ExternalAddress((address) counters->revoked_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5288 }
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 bind(cas_label);
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 return null_check_offset;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5293 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5294
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5295 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
5296 Label L, E;
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 #ifdef _WIN64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5299 // Windows always allocates space for it's register args
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5300 assert(num_args <= 4, "only register arguments supported");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5301 subq(rsp, frame::arg_reg_save_area_bytes);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5302 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5303
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5304 // Align stack if necessary
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5305 testl(rsp, 15);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5306 jcc(Assembler::zero, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5307
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5308 subq(rsp, 8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5309 {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5310 call(RuntimeAddress(entry_point));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5311 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5312 addq(rsp, 8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5313 jmp(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5314
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5315 bind(L);
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 call(RuntimeAddress(entry_point));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5318 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5319
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5320 bind(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5321
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5322 #ifdef _WIN64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5323 // restore stack pointer
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5324 addq(rsp, frame::arg_reg_save_area_bytes);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5325 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5326
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::cmp64(Register src1, AddressLiteral src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5330 assert(!src2.is_lval(), "should use cmpptr");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5331
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5332 if (reachable(src2)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5333 cmpq(src1, as_Address(src2));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5334 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5335 lea(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5336 Assembler::cmpq(src1, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5337 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5338 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5339
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5340 int MacroAssembler::corrected_idivq(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5341 // Full implementation of Java ldiv and lrem; checks for special
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5342 // 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
5343 // returns the (pc) offset of the idivl instruction - may be needed
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5344 // for implicit exceptions.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5345 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5346 // normal case special case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5347 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5348 // input : rax: dividend min_long
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5349 // reg: divisor (may not be eax/edx) -1
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5350 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5351 // output: rax: quotient (= rax idiv reg) min_long
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5352 // rdx: remainder (= rax irem reg) 0
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5353 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
5354 static const int64_t min_long = 0x8000000000000000;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5355 Label normal_case, special_case;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5356
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5357 // check for special case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5358 cmp64(rax, ExternalAddress((address) &min_long));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5359 jcc(Assembler::notEqual, normal_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5360 xorl(rdx, rdx); // prepare rdx for possible special case (where
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5361 // remainder = 0)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5362 cmpq(reg, -1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5363 jcc(Assembler::equal, special_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5364
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5365 // handle normal case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5366 bind(normal_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5367 cdqq();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5368 int idivq_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5369 idivq(reg);
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 // normal and special case exit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5372 bind(special_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5373
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5374 return idivq_offset;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5375 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5376
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5377 void MacroAssembler::decrementq(Register reg, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5378 if (value == min_jint) { subq(reg, value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5379 if (value < 0) { incrementq(reg, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5380 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5381 if (value == 1 && UseIncDec) { decq(reg) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5382 /* else */ { subq(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5383 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5384
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5385 void MacroAssembler::decrementq(Address dst, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5386 if (value == min_jint) { subq(dst, value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5387 if (value < 0) { incrementq(dst, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5388 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5389 if (value == 1 && UseIncDec) { decq(dst) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5390 /* else */ { subq(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5391 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5392
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5393 void MacroAssembler::fat_nop() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5394 // 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
5395 // Recommened sequence from 'Software Optimization Guide for the AMD
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5396 // Hammer Processor'
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5397 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5398 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5399 emit_byte(0x90);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5400 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5401 emit_byte(0x90);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5402 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5403
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5404 void MacroAssembler::incrementq(Register reg, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5405 if (value == min_jint) { addq(reg, value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5406 if (value < 0) { decrementq(reg, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5407 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5408 if (value == 1 && UseIncDec) { incq(reg) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5409 /* else */ { addq(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5410 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5411
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5412 void MacroAssembler::incrementq(Address dst, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5413 if (value == min_jint) { addq(dst, value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5414 if (value < 0) { decrementq(dst, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5415 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5416 if (value == 1 && UseIncDec) { incq(dst) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5417 /* else */ { addq(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5418 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5419
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5420 // 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
5421 // to be installed in the Address class
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5422 void MacroAssembler::jump(ArrayAddress entry) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5423 lea(rscratch1, entry.base());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5424 Address dispatch = entry.index();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5425 assert(dispatch._base == noreg, "must be");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5426 dispatch._base = rscratch1;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5427 jmp(dispatch);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5428 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5429
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5430 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
5431 ShouldNotReachHere(); // 64bit doesn't use two regs
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5432 cmpq(x_lo, y_lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5433 }
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 void MacroAssembler::lea(Register dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5436 mov_literal64(dst, (intptr_t)src.target(), src.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5437 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5438
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5439 void MacroAssembler::lea(Address dst, AddressLiteral adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5440 mov_literal64(rscratch1, (intptr_t)adr.target(), adr.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5441 movptr(dst, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5442 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5443
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5444 void MacroAssembler::leave() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5445 // %%% is this really better? Why not on 32bit too?
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5446 emit_byte(0xC9); // LEAVE
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5447 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5448
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5449 void MacroAssembler::lneg(Register hi, Register lo) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5450 ShouldNotReachHere(); // 64bit doesn't use two regs
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5451 negq(lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5452 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5453
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5454 void MacroAssembler::movoop(Register dst, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5455 mov_literal64(dst, (intptr_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5456 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5457
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5458 void MacroAssembler::movoop(Address dst, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5459 mov_literal64(rscratch1, (intptr_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5460 movq(dst, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5461 }
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 void MacroAssembler::movptr(Register dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5464 if (src.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5465 mov_literal64(dst, (intptr_t)src.target(), src.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5466 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5467 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5468 movq(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5469 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5470 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5471 movq(dst, Address(rscratch1,0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5472 }
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5476 void MacroAssembler::movptr(ArrayAddress dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5477 movq(as_Address(dst), src);
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::movptr(Register dst, ArrayAddress src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5481 movq(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5482 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5483
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5484 // 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
5485 void MacroAssembler::movptr(Address dst, intptr_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5486 mov64(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5487 movq(dst, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5488 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5489
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5490 // These are mostly for initializing NULL
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5491 void MacroAssembler::movptr(Address dst, int32_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5492 movslq(dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5495 void MacroAssembler::movptr(Register dst, int32_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5496 mov64(dst, (intptr_t)src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5497 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5498
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5499 void MacroAssembler::pushoop(jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5500 movoop(rscratch1, obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5501 push(rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5502 }
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 void MacroAssembler::pushptr(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5505 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5506 if (src.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5507 push(rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5508 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5509 pushq(Address(rscratch1, 0));
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 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5512
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5513 void MacroAssembler::reset_last_Java_frame(bool clear_fp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5514 bool clear_pc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5515 // 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
5516 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
5517 // 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
5518 // possible that we need it only for debugging
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5519 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
5520 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
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 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
5524 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
5525 }
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 void MacroAssembler::set_last_Java_frame(Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5529 Register last_java_fp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5530 address last_java_pc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5531 // determine last_java_sp register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5532 if (!last_java_sp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5533 last_java_sp = rsp;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5534 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5535
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5536 // last_java_fp is optional
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5537 if (last_java_fp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5538 movptr(Address(r15_thread, JavaThread::last_Java_fp_offset()),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5539 last_java_fp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5540 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5541
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5542 // last_java_pc is optional
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5543 if (last_java_pc != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5544 Address java_pc(r15_thread,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5545 JavaThread::frame_anchor_offset() + JavaFrameAnchor::last_Java_pc_offset());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5546 lea(rscratch1, InternalAddress(last_java_pc));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5547 movptr(java_pc, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5548 }
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 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
5551 }
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 static void pass_arg0(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5554 if (c_rarg0 != arg ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5555 masm->mov(c_rarg0, arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5556 }
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5559 static void pass_arg1(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5560 if (c_rarg1 != arg ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5561 masm->mov(c_rarg1, arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5562 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5563 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5564
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5565 static void pass_arg2(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5566 if (c_rarg2 != arg ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5567 masm->mov(c_rarg2, arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5568 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5569 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5570
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5571 static void pass_arg3(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5572 if (c_rarg3 != arg ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5573 masm->mov(c_rarg3, arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5574 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5575 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5576
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5577 void MacroAssembler::stop(const char* msg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5578 address rip = pc();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5579 pusha(); // get regs on stack
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5580 lea(c_rarg0, ExternalAddress((address) msg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5581 lea(c_rarg1, InternalAddress(rip));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5582 movq(c_rarg2, rsp); // pass pointer to regs array
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5583 andq(rsp, -16); // align stack as required by ABI
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5584 call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug64)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5585 hlt();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5586 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5587
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5588 void MacroAssembler::warn(const char* msg) {
1976
0fc262af204f 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 1972
diff changeset
5589 push(rsp);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5590 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
5591
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5592 push_CPU_state(); // keeps alignment at 16 bytes
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5593 lea(c_rarg0, ExternalAddress((address) msg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5594 call_VM_leaf(CAST_FROM_FN_PTR(address, warning), c_rarg0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5595 pop_CPU_state();
1976
0fc262af204f 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 1972
diff changeset
5596 pop(rsp);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5597 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5598
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5599 #ifndef PRODUCT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5600 extern "C" void findpc(intptr_t x);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5601 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5602
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5603 void MacroAssembler::debug64(char* msg, int64_t pc, int64_t regs[]) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5604 // 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
5605 if (ShowMessageBoxOnError ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5606 JavaThread* thread = JavaThread::current();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5607 JavaThreadState saved_state = thread->thread_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5608 thread->set_thread_state(_thread_in_vm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5609 #ifndef PRODUCT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5610 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5611 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5612 BytecodeCounter::print();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5613 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5614 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5615 // 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
5616 // XXX correct this offset for amd64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5617 // 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
5618 if (os::message_box(msg, "Execution stopped, print registers?")) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5619 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5620 tty->print_cr("rip = 0x%016lx", pc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5621 #ifndef PRODUCT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5622 tty->cr();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5623 findpc(pc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5624 tty->cr();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5625 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5626 tty->print_cr("rax = 0x%016lx", regs[15]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5627 tty->print_cr("rbx = 0x%016lx", regs[12]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5628 tty->print_cr("rcx = 0x%016lx", regs[14]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5629 tty->print_cr("rdx = 0x%016lx", regs[13]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5630 tty->print_cr("rdi = 0x%016lx", regs[8]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5631 tty->print_cr("rsi = 0x%016lx", regs[9]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5632 tty->print_cr("rbp = 0x%016lx", regs[10]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5633 tty->print_cr("rsp = 0x%016lx", regs[11]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5634 tty->print_cr("r8 = 0x%016lx", regs[7]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5635 tty->print_cr("r9 = 0x%016lx", regs[6]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5636 tty->print_cr("r10 = 0x%016lx", regs[5]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5637 tty->print_cr("r11 = 0x%016lx", regs[4]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5638 tty->print_cr("r12 = 0x%016lx", regs[3]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5639 tty->print_cr("r13 = 0x%016lx", regs[2]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5640 tty->print_cr("r14 = 0x%016lx", regs[1]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5641 tty->print_cr("r15 = 0x%016lx", regs[0]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5642 BREAKPOINT;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5643 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5644 ThreadStateTransition::transition(thread, _thread_in_vm, saved_state);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5645 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5646 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5647 ::tty->print_cr("=============== DEBUG MESSAGE: %s ================\n",
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5648 msg);
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 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5651
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5652 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5653
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5654 // Now versions that are common to 32/64 bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5655
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5656 void MacroAssembler::addptr(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5657 LP64_ONLY(addq(dst, imm32)) NOT_LP64(addl(dst, imm32));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5658 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5659
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5660 void MacroAssembler::addptr(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5661 LP64_ONLY(addq(dst, src)) NOT_LP64(addl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5662 }
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 void MacroAssembler::addptr(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5665 LP64_ONLY(addq(dst, src)) NOT_LP64(addl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5666 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5667
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5668 void MacroAssembler::align(int modulus) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5669 if (offset() % modulus != 0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5670 nop(modulus - (offset() % modulus));
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5674 void MacroAssembler::andpd(XMMRegister dst, AddressLiteral src) {
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5675 if (reachable(src)) {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5676 andpd(dst, as_Address(src));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5677 } else {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5678 lea(rscratch1, src);
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5679 andpd(dst, Address(rscratch1, 0));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5680 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5681 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5682
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5683 void MacroAssembler::andptr(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5684 LP64_ONLY(andq(dst, imm32)) NOT_LP64(andl(dst, imm32));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5685 }
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 void MacroAssembler::atomic_incl(AddressLiteral counter_addr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5688 pushf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5689 if (os::is_MP())
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5690 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5691 incrementl(counter_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5692 popf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5693 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5694
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5695 // Writes to stack successive pages until offset reached to check for
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5696 // stack overflow + shadow pages. This clobbers tmp.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5697 void MacroAssembler::bang_stack_size(Register size, Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5698 movptr(tmp, rsp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5699 // Bang stack for total size given plus shadow page size.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5700 // 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
5701 // red zones.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5702 Label loop;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5703 bind(loop);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5704 movl(Address(tmp, (-os::vm_page_size())), size );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5705 subptr(tmp, os::vm_page_size());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5706 subl(size, os::vm_page_size());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5707 jcc(Assembler::greater, loop);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5708
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5709 // Bang down shadow pages too.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5710 // The -1 because we already subtracted 1 page.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5711 for (int i = 0; i< StackShadowPages-1; i++) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5712 // 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
5713 // so the bigger the better.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5714 movptr(Address(tmp, (-i*os::vm_page_size())), size );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5715 }
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5718 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
5719 assert(UseBiasedLocking, "why call this otherwise?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5720
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5721 // Check for biased locking unlock case, which is a no-op
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5722 // 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
5723 // First, the interpreter checks for IllegalMonitorStateException at
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5724 // 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
5725 // lock, the object could not be rebiased toward another thread, so
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5726 // the bias bit would be clear.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5727 movptr(temp_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5728 andptr(temp_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5729 cmpptr(temp_reg, markOopDesc::biased_lock_pattern);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5730 jcc(Assembler::equal, done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5731 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5732
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5733 void MacroAssembler::c2bool(Register x) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5734 // implements x == 0 ? 0 : 1
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5735 // note: must only look at least-significant byte of x
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5736 // since C-style booleans are stored in one byte
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5737 // only! (was bug)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5738 andl(x, 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5739 setb(Assembler::notZero, x);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5740 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5741
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5742 // Wouldn't need if AddressLiteral version had new name
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5743 void MacroAssembler::call(Label& L, relocInfo::relocType rtype) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5744 Assembler::call(L, rtype);
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(Register entry) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5748 Assembler::call(entry);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5749 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5750
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5751 void MacroAssembler::call(AddressLiteral entry) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5752 if (reachable(entry)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5753 Assembler::call_literal(entry.target(), entry.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5754 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5755 lea(rscratch1, entry);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5756 Assembler::call(rscratch1);
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 }
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 // Implementation of call_VM versions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5761
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5762 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5763 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5764 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5765 Label C, E;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5766 call(C, relocInfo::none);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5767 jmp(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5768
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5769 bind(C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5770 call_VM_helper(oop_result, entry_point, 0, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5771 ret(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5772
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5773 bind(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5774 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5775
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5776 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5777 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5778 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5779 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5780 Label C, E;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5781 call(C, relocInfo::none);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5782 jmp(E);
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 bind(C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5785 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5786 call_VM_helper(oop_result, entry_point, 1, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5787 ret(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5788
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5789 bind(E);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5792 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5793 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5794 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5795 Register arg_2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5796 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5797 Label C, E;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5798 call(C, relocInfo::none);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5799 jmp(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5800
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5801 bind(C);
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 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5804
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5805 pass_arg2(this, arg_2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5806 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5807 call_VM_helper(oop_result, entry_point, 2, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5808 ret(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5809
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5810 bind(E);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5813 void MacroAssembler::call_VM(Register oop_result,
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 Register arg_3,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5818 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5819 Label C, E;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5820 call(C, relocInfo::none);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5821 jmp(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5822
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5823 bind(C);
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 LP64_ONLY(assert(arg_1 != c_rarg3, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5826 LP64_ONLY(assert(arg_2 != c_rarg3, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5827 pass_arg3(this, arg_3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5828
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5829 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5830 pass_arg2(this, arg_2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5831
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5832 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5833 call_VM_helper(oop_result, entry_point, 3, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5834 ret(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5835
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5836 bind(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5837 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5838
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5839 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5840 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5841 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5842 int number_of_arguments,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5843 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5844 Register thread = LP64_ONLY(r15_thread) NOT_LP64(noreg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5845 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
5846 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5847
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5848 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5849 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5850 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5851 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5852 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5853 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5854 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
5855 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5856
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5857 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5858 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5859 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5860 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5861 Register arg_2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5862 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5863
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5864 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5865 pass_arg2(this, arg_2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5866 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5867 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
5868 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5869
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5870 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5871 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5872 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5873 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5874 Register arg_2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5875 Register arg_3,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5876 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5877 LP64_ONLY(assert(arg_1 != c_rarg3, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5878 LP64_ONLY(assert(arg_2 != c_rarg3, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5879 pass_arg3(this, arg_3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5880 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5881 pass_arg2(this, arg_2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5882 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5883 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
5884 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5885
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5886 void MacroAssembler::call_VM_base(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5887 Register java_thread,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5888 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5889 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5890 int number_of_arguments,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5891 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5892 // determine java_thread register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5893 if (!java_thread->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5894 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5895 java_thread = r15_thread;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5896 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5897 java_thread = rdi;
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 #endif // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5900 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5901 // determine last_java_sp register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5902 if (!last_java_sp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5903 last_java_sp = rsp;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5904 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5905 // debugging support
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5906 assert(number_of_arguments >= 0 , "cannot have negative number of arguments");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5907 LP64_ONLY(assert(java_thread == r15_thread, "unexpected register"));
1976
0fc262af204f 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 1972
diff changeset
5908 #ifdef ASSERT
0fc262af204f 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 1972
diff changeset
5909 LP64_ONLY(if (UseCompressedOops) verify_heapbase("call_VM_base");)
0fc262af204f 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 1972
diff changeset
5910 #endif // ASSERT
0fc262af204f 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 1972
diff changeset
5911
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5912 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
5913 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
5914
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5915 // push java thread (becomes first argument of C function)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5916
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5917 NOT_LP64(push(java_thread); number_of_arguments++);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5918 LP64_ONLY(mov(c_rarg0, r15_thread));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5919
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5920 // set last Java frame before call
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5921 assert(last_java_sp != rbp, "can't use ebp/rbp");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5922
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5923 // Only interpreter should have to set fp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5924 set_last_Java_frame(java_thread, last_java_sp, rbp, NULL);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5925
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5926 // do the call, remove parameters
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5927 MacroAssembler::call_VM_leaf_base(entry_point, number_of_arguments);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5928
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5929 // restore the thread (cannot use the pushed argument since arguments
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5930 // may be overwritten by C code generated by an optimizing compiler);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5931 // 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
5932 if (LP64_ONLY(true ||) java_thread == rdi || java_thread == rsi) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5933 // rdi & rsi (also r15) are callee saved -> nothing to do
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5934 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5935 guarantee(java_thread != rax, "change this code");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5936 push(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5937 { Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5938 get_thread(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5939 cmpptr(java_thread, rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5940 jcc(Assembler::equal, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5941 stop("MacroAssembler::call_VM_base: rdi not callee saved?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5942 bind(L);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5943 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5944 pop(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5945 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5946 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5947 get_thread(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5948 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5949 // reset last Java frame
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5950 // Only interpreter should have to clear fp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5951 reset_last_Java_frame(java_thread, true, false);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5952
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5953 #ifndef CC_INTERP
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5954 // C++ interp handles this in the interpreter
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5955 check_and_handle_popframe(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5956 check_and_handle_earlyret(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5957 #endif /* CC_INTERP */
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 if (check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5960 // check for pending exceptions (java_thread is set upon return)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5961 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
5962 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5963 jump_cc(Assembler::notEqual,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5964 RuntimeAddress(StubRoutines::forward_exception_entry()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5965 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5966 // This used to conditionally jump to forward_exception however it is
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5967 // 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
5968 // around so we can always reach
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 Label ok;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5971 jcc(Assembler::equal, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5972 jump(RuntimeAddress(StubRoutines::forward_exception_entry()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5973 bind(ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5974 #endif // LP64
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5977 // 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
5978 if (oop_result->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5979 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
5980 movptr(Address(java_thread, JavaThread::vm_result_offset()), NULL_WORD);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5981 verify_oop(oop_result, "broken oop in call_VM_base");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5982 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5983 }
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 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
5986
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5987 // Calculate the value for last_Java_sp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5988 // somewhat subtle. call_VM does an intermediate call
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5989 // which places a return address on the stack just under the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5990 // stack pointer as the user finsihed with it. This allows
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5991 // use to retrieve last_Java_pc from last_Java_sp[-1].
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5992 // 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
5993 // 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
5994 // 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
5995 // This hopefully explains the calculations here.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5996
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5997 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5998 // We've pushed one address, correct last_Java_sp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5999 lea(rax, Address(rsp, wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6000 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6001 lea(rax, Address(rsp, (1 + number_of_arguments) * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6002 #endif // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6003
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6004 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
6005
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6006 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6007
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6008 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
6009 call_VM_leaf_base(entry_point, number_of_arguments);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6012 void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6013 pass_arg0(this, arg_0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6014 call_VM_leaf(entry_point, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6015 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6016
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6017 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
6018
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6019 LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6020 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6021 pass_arg0(this, arg_0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6022 call_VM_leaf(entry_point, 2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6023 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6024
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6025 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
6026 LP64_ONLY(assert(arg_0 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6027 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6028 pass_arg2(this, arg_2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6029 LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6030 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6031 pass_arg0(this, arg_0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6032 call_VM_leaf(entry_point, 3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6033 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6034
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6035 void MacroAssembler::check_and_handle_earlyret(Register java_thread) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6036 }
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 void MacroAssembler::check_and_handle_popframe(Register java_thread) {
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::cmp32(AddressLiteral src1, int32_t imm) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6042 if (reachable(src1)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6043 cmpl(as_Address(src1), imm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6044 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6045 lea(rscratch1, src1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6046 cmpl(Address(rscratch1, 0), imm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6047 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6048 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6049
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6050 void MacroAssembler::cmp32(Register src1, AddressLiteral src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6051 assert(!src2.is_lval(), "use cmpptr");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6052 if (reachable(src2)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6053 cmpl(src1, as_Address(src2));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6054 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6055 lea(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6056 cmpl(src1, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6057 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6058 }
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 void MacroAssembler::cmp32(Register src1, int32_t imm) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6061 Assembler::cmpl(src1, imm);
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::cmp32(Register src1, Address src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6065 Assembler::cmpl(src1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6066 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6067
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6068 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
6069 ucomisd(opr1, opr2);
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 Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6072 if (unordered_is_less) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6073 movl(dst, -1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6074 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6075 jcc(Assembler::below , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6076 movl(dst, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6077 jcc(Assembler::equal , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6078 increment(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6079 } else { // unordered is greater
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6080 movl(dst, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6081 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6082 jcc(Assembler::above , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6083 movl(dst, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6084 jcc(Assembler::equal , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6085 decrementl(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6086 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6087 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6088 }
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 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
6091 ucomiss(opr1, opr2);
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 Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6094 if (unordered_is_less) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6095 movl(dst, -1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6096 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6097 jcc(Assembler::below , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6098 movl(dst, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6099 jcc(Assembler::equal , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6100 increment(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6101 } else { // unordered is greater
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6102 movl(dst, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6103 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6104 jcc(Assembler::above , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6105 movl(dst, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6106 jcc(Assembler::equal , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6107 decrementl(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6108 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6109 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6110 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6111
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6112
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6113 void MacroAssembler::cmp8(AddressLiteral src1, int imm) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6114 if (reachable(src1)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6115 cmpb(as_Address(src1), imm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6116 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6117 lea(rscratch1, src1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6118 cmpb(Address(rscratch1, 0), imm);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6122 void MacroAssembler::cmpptr(Register src1, AddressLiteral src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6123 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6124 if (src2.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6125 movptr(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6126 Assembler::cmpq(src1, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6127 } else if (reachable(src2)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6128 cmpq(src1, as_Address(src2));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6129 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6130 lea(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6131 Assembler::cmpq(src1, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6132 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6133 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6134 if (src2.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6135 cmp_literal32(src1, (int32_t) src2.target(), src2.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6136 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6137 cmpl(src1, as_Address(src2));
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 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6140 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6141
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6142 void MacroAssembler::cmpptr(Address src1, AddressLiteral src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6143 assert(src2.is_lval(), "not a mem-mem compare");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6144 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6145 // moves src2's literal address
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6146 movptr(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6147 Assembler::cmpq(src1, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6148 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6149 cmp_literal32(src1, (int32_t) src2.target(), src2.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6150 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6151 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6152
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6153 void MacroAssembler::locked_cmpxchgptr(Register reg, AddressLiteral adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6154 if (reachable(adr)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6155 if (os::is_MP())
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6156 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6157 cmpxchgptr(reg, as_Address(adr));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6158 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6159 lea(rscratch1, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6160 if (os::is_MP())
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6161 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6162 cmpxchgptr(reg, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6163 }
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6166 void MacroAssembler::cmpxchgptr(Register reg, Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6167 LP64_ONLY(cmpxchgq(reg, adr)) NOT_LP64(cmpxchgl(reg, adr));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6168 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6169
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6170 void MacroAssembler::comisd(XMMRegister dst, AddressLiteral src) {
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6171 if (reachable(src)) {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6172 comisd(dst, as_Address(src));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6173 } else {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6174 lea(rscratch1, src);
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6175 comisd(dst, Address(rscratch1, 0));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6176 }
304
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6179 void MacroAssembler::comiss(XMMRegister dst, AddressLiteral src) {
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6180 if (reachable(src)) {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6181 comiss(dst, as_Address(src));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6182 } else {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6183 lea(rscratch1, src);
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6184 comiss(dst, Address(rscratch1, 0));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6185 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6186 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6187
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6188
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6189 void MacroAssembler::cond_inc32(Condition cond, AddressLiteral counter_addr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6190 Condition negated_cond = negate_condition(cond);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6191 Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6192 jcc(negated_cond, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6193 atomic_incl(counter_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6194 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6195 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6196
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6197 int MacroAssembler::corrected_idivl(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6198 // Full implementation of Java idiv and irem; checks for
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6199 // special case as described in JVM spec., p.243 & p.271.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6200 // The function returns the (pc) offset of the idivl
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6201 // instruction - may be needed for implicit exceptions.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6202 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6203 // normal case special case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6204 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6205 // input : rax,: dividend min_int
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6206 // reg: divisor (may not be rax,/rdx) -1
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6207 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6208 // output: rax,: quotient (= rax, idiv reg) min_int
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6209 // rdx: remainder (= rax, irem reg) 0
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6210 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
6211 const int min_int = 0x80000000;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6212 Label normal_case, special_case;
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 // check for special case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6215 cmpl(rax, min_int);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6216 jcc(Assembler::notEqual, normal_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6217 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
6218 cmpl(reg, -1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6219 jcc(Assembler::equal, special_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6220
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6221 // handle normal case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6222 bind(normal_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6223 cdql();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6224 int idivl_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6225 idivl(reg);
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 // normal and special case exit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6228 bind(special_case);
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 return idivl_offset;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6231 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6232
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6233
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6234
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6235 void MacroAssembler::decrementl(Register reg, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6236 if (value == min_jint) {subl(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6237 if (value < 0) { incrementl(reg, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6238 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6239 if (value == 1 && UseIncDec) { decl(reg) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6240 /* else */ { subl(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6241 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6242
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6243 void MacroAssembler::decrementl(Address dst, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6244 if (value == min_jint) {subl(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6245 if (value < 0) { incrementl(dst, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6246 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6247 if (value == 1 && UseIncDec) { decl(dst) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6248 /* else */ { subl(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6249 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6250
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6251 void MacroAssembler::division_with_shift (Register reg, int shift_value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6252 assert (shift_value > 0, "illegal shift value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6253 Label _is_positive;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6254 testl (reg, reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6255 jcc (Assembler::positive, _is_positive);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6256 int offset = (1 << shift_value) - 1 ;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6257
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6258 if (offset == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6259 incrementl(reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6260 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6261 addl(reg, offset);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6262 }
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 bind (_is_positive);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6265 sarl(reg, shift_value);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6266 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6267
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6268 // !defined(COMPILER2) is because of stupid core builds
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6269 #if !defined(_LP64) || defined(COMPILER1) || !defined(COMPILER2)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6270 void MacroAssembler::empty_FPU_stack() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6271 if (VM_Version::supports_mmx()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6272 emms();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6273 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6274 for (int i = 8; i-- > 0; ) ffree(i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6275 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6276 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6277 #endif // !LP64 || C1 || !C2
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6278
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6279
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6280 // Defines obj, preserves var_size_in_bytes
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6281 void MacroAssembler::eden_allocate(Register obj,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6282 Register var_size_in_bytes,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6283 int con_size_in_bytes,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6284 Register t1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6285 Label& slow_case) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6286 assert(obj == rax, "obj must be in rax, for cmpxchg");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6287 assert_different_registers(obj, var_size_in_bytes, t1);
362
apetrusenko
parents: 356 304
diff changeset
6288 if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) {
apetrusenko
parents: 356 304
diff changeset
6289 jmp(slow_case);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6290 } else {
362
apetrusenko
parents: 356 304
diff changeset
6291 Register end = t1;
apetrusenko
parents: 356 304
diff changeset
6292 Label retry;
apetrusenko
parents: 356 304
diff changeset
6293 bind(retry);
apetrusenko
parents: 356 304
diff changeset
6294 ExternalAddress heap_top((address) Universe::heap()->top_addr());
apetrusenko
parents: 356 304
diff changeset
6295 movptr(obj, heap_top);
apetrusenko
parents: 356 304
diff changeset
6296 if (var_size_in_bytes == noreg) {
apetrusenko
parents: 356 304
diff changeset
6297 lea(end, Address(obj, con_size_in_bytes));
apetrusenko
parents: 356 304
diff changeset
6298 } else {
apetrusenko
parents: 356 304
diff changeset
6299 lea(end, Address(obj, var_size_in_bytes, Address::times_1));
apetrusenko
parents: 356 304
diff changeset
6300 }
apetrusenko
parents: 356 304
diff changeset
6301 // if end < obj then we wrapped around => object too long => slow case
apetrusenko
parents: 356 304
diff changeset
6302 cmpptr(end, obj);
apetrusenko
parents: 356 304
diff changeset
6303 jcc(Assembler::below, slow_case);
apetrusenko
parents: 356 304
diff changeset
6304 cmpptr(end, ExternalAddress((address) Universe::heap()->end_addr()));
apetrusenko
parents: 356 304
diff changeset
6305 jcc(Assembler::above, slow_case);
apetrusenko
parents: 356 304
diff changeset
6306 // Compare obj with the top addr, and if still equal, store the new top addr in
apetrusenko
parents: 356 304
diff changeset
6307 // end at the address of the top addr pointer. Sets ZF if was equal, and clears
apetrusenko
parents: 356 304
diff changeset
6308 // it otherwise. Use lock prefix for atomicity on MPs.
apetrusenko
parents: 356 304
diff changeset
6309 locked_cmpxchgptr(end, heap_top);
apetrusenko
parents: 356 304
diff changeset
6310 jcc(Assembler::notEqual, retry);
apetrusenko
parents: 356 304
diff changeset
6311 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6312 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6313
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6314 void MacroAssembler::enter() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6315 push(rbp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6316 mov(rbp, rsp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6317 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6318
a61af66fc99e Initial load
duke
parents:
diff changeset
6319 void MacroAssembler::fcmp(Register tmp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6320 fcmp(tmp, 1, true, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
6321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6322
a61af66fc99e Initial load
duke
parents:
diff changeset
6323 void MacroAssembler::fcmp(Register tmp, int index, bool pop_left, bool pop_right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6324 assert(!pop_right || pop_left, "usage error");
a61af66fc99e Initial load
duke
parents:
diff changeset
6325 if (VM_Version::supports_cmov()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6326 assert(tmp == noreg, "unneeded temp");
a61af66fc99e Initial load
duke
parents:
diff changeset
6327 if (pop_left) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6328 fucomip(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
6329 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
6330 fucomi(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
6331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6332 if (pop_right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6333 fpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
6334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6335 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
6336 assert(tmp != noreg, "need temp");
a61af66fc99e Initial load
duke
parents:
diff changeset
6337 if (pop_left) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6338 if (pop_right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6339 fcompp();
a61af66fc99e Initial load
duke
parents:
diff changeset
6340 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
6341 fcomp(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
6342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6343 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
6344 fcom(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
6345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6346 // convert FPU condition into eflags condition via rax,
a61af66fc99e Initial load
duke
parents:
diff changeset
6347 save_rax(tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
6348 fwait(); fnstsw_ax();
a61af66fc99e Initial load
duke
parents:
diff changeset
6349 sahf();
a61af66fc99e Initial load
duke
parents:
diff changeset
6350 restore_rax(tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
6351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6352 // condition codes set as follows:
a61af66fc99e Initial load
duke
parents:
diff changeset
6353 //
a61af66fc99e Initial load
duke
parents:
diff changeset
6354 // CF (corresponds to C0) if x < y
a61af66fc99e Initial load
duke
parents:
diff changeset
6355 // PF (corresponds to C2) if unordered
a61af66fc99e Initial load
duke
parents:
diff changeset
6356 // ZF (corresponds to C3) if x = y
a61af66fc99e Initial load
duke
parents:
diff changeset
6357 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6358
a61af66fc99e Initial load
duke
parents:
diff changeset
6359 void MacroAssembler::fcmp2int(Register dst, bool unordered_is_less) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6360 fcmp2int(dst, unordered_is_less, 1, true, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
6361 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6362
a61af66fc99e Initial load
duke
parents:
diff changeset
6363 void MacroAssembler::fcmp2int(Register dst, bool unordered_is_less, int index, bool pop_left, bool pop_right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6364 fcmp(VM_Version::supports_cmov() ? noreg : dst, index, pop_left, pop_right);
a61af66fc99e Initial load
duke
parents:
diff changeset
6365 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
6366 if (unordered_is_less) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6367 movl(dst, -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
6368 jcc(Assembler::parity, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6369 jcc(Assembler::below , L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6370 movl(dst, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
6371 jcc(Assembler::equal , L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6372 increment(dst);
a61af66fc99e Initial load
duke
parents:
diff changeset
6373 } else { // unordered is greater
a61af66fc99e Initial load
duke
parents:
diff changeset
6374 movl(dst, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
6375 jcc(Assembler::parity, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6376 jcc(Assembler::above , L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6377 movl(dst, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
6378 jcc(Assembler::equal , L);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6379 decrementl(dst);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6381 bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6383
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6384 void MacroAssembler::fld_d(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6385 fld_d(as_Address(src));
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::fld_s(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6389 fld_s(as_Address(src));
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::fld_x(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6393 Assembler::fld_x(as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6394 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6395
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6396 void MacroAssembler::fldcw(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6397 Assembler::fldcw(as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6398 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6399
a61af66fc99e Initial load
duke
parents:
diff changeset
6400 void MacroAssembler::fpop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
6401 ffree();
a61af66fc99e Initial load
duke
parents:
diff changeset
6402 fincstp();
a61af66fc99e Initial load
duke
parents:
diff changeset
6403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6404
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6405 void MacroAssembler::fremr(Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6406 save_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6407 { Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6408 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6409 fprem();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6410 fwait(); fnstsw_ax();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6411 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6412 testl(rax, 0x400);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6413 jcc(Assembler::notEqual, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6414 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6415 sahf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6416 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6417 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6418 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6419 restore_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6420 // Result is in ST0.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6421 // Note: fxch & fpop to get rid of ST1
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6422 // (otherwise FPU stack could overflow eventually)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6423 fxch(1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6424 fpop();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6425 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6426
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6427
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6428 void MacroAssembler::incrementl(AddressLiteral dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6429 if (reachable(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6430 incrementl(as_Address(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6431 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6432 lea(rscratch1, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6433 incrementl(Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6434 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6435 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6436
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6437 void MacroAssembler::incrementl(ArrayAddress dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6438 incrementl(as_Address(dst));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6439 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6440
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6441 void MacroAssembler::incrementl(Register reg, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6442 if (value == min_jint) {addl(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6443 if (value < 0) { decrementl(reg, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6444 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6445 if (value == 1 && UseIncDec) { incl(reg) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6446 /* else */ { addl(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6447 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6448
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6449 void MacroAssembler::incrementl(Address dst, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6450 if (value == min_jint) {addl(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6451 if (value < 0) { decrementl(dst, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6452 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6453 if (value == 1 && UseIncDec) { incl(dst) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6454 /* else */ { addl(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6455 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6456
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6457 void MacroAssembler::jump(AddressLiteral dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6458 if (reachable(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6459 jmp_literal(dst.target(), dst.rspec());
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 lea(rscratch1, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6462 jmp(rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6463 }
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6466 void MacroAssembler::jump_cc(Condition cc, AddressLiteral dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6467 if (reachable(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6468 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6469 relocate(dst.reloc());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6470 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6471 const int long_size = 6;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6472 int offs = (intptr_t)dst.target() - ((intptr_t)_code_pos);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6473 if (dst.reloc() == relocInfo::none && is8bit(offs - short_size)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6474 // 0111 tttn #8-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6475 emit_byte(0x70 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6476 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6477 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6478 // 0000 1111 1000 tttn #32-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6479 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6480 emit_byte(0x80 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6481 emit_long(offs - long_size);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6482 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6483 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6484 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6485 warning("reversing conditional branch");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6486 #endif /* ASSERT */
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6487 Label skip;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6488 jccb(reverse[cc], skip);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6489 lea(rscratch1, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6490 Assembler::jmp(rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6491 bind(skip);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6492 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6493 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6494
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6495 void MacroAssembler::ldmxcsr(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6496 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6497 Assembler::ldmxcsr(as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6498 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6499 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6500 Assembler::ldmxcsr(Address(rscratch1, 0));
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 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6503
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6504 int MacroAssembler::load_signed_byte(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6505 int off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6506 if (LP64_ONLY(true ||) VM_Version::is_P6()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6507 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6508 movsbl(dst, src); // movsxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6509 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6510 off = load_unsigned_byte(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6511 shll(dst, 24);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6512 sarl(dst, 24);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6513 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6514 return off;
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
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6517 // 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
6518 // 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
6519 // 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
6520 // 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
6521 int MacroAssembler::load_signed_short(Register dst, Address src) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6522 int off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6523 if (LP64_ONLY(true ||) VM_Version::is_P6()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6524 // 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
6525 // 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
6526 // that users are only using 32bits worth.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6527 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6528 movswl(dst, src); // movsxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6529 } else {
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6530 off = load_unsigned_short(dst, src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6531 shll(dst, 16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6532 sarl(dst, 16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6533 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6534 return off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6535 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6536
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6537 int MacroAssembler::load_unsigned_byte(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6538 // 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
6539 // and "3.9 Partial Register Penalties", p. 22).
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6540 int off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6541 if (LP64_ONLY(true || ) VM_Version::is_P6() || src.uses(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6542 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6543 movzbl(dst, src); // movzxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6544 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6545 xorl(dst, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6546 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6547 movb(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6548 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6549 return off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6550 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6551
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6552 // 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
6553 int MacroAssembler::load_unsigned_short(Register dst, Address src) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6554 // 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
6555 // and "3.9 Partial Register Penalties", p. 22).
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6556 int off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6557 if (LP64_ONLY(true ||) VM_Version::is_P6() || src.uses(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6558 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6559 movzwl(dst, src); // movzxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6560 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6561 xorl(dst, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6562 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6563 movw(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6564 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6565 return off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6566 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6567
2258
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6568 void MacroAssembler::load_sized_value(Register dst, Address src, size_t size_in_bytes, bool is_signed, Register dst2) {
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1369
diff changeset
6569 switch (size_in_bytes) {
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6570 #ifndef _LP64
2258
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6571 case 8:
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6572 assert(dst2 != noreg, "second dest register required");
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6573 movl(dst, src);
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6574 movl(dst2, src.plus_disp(BytesPerInt));
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6575 break;
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6576 #else
2258
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6577 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
6578 #endif
2258
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6579 case 4: movl(dst, src); break;
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6580 case 2: is_signed ? load_signed_short(dst, src) : load_unsigned_short(dst, src); break;
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6581 case 1: is_signed ? load_signed_byte( dst, src) : load_unsigned_byte( dst, src); break;
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6582 default: ShouldNotReachHere();
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6583 }
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6584 }
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6585
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6586 void MacroAssembler::store_sized_value(Address dst, Register src, size_t size_in_bytes, Register src2) {
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6587 switch (size_in_bytes) {
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6588 #ifndef _LP64
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6589 case 8:
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6590 assert(src2 != noreg, "second source register required");
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6591 movl(dst, src);
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6592 movl(dst.plus_disp(BytesPerInt), src2);
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6593 break;
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6594 #else
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6595 case 8: movq(dst, src); break;
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6596 #endif
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6597 case 4: movl(dst, src); break;
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6598 case 2: movw(dst, src); break;
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6599 case 1: movb(dst, src); break;
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6600 default: ShouldNotReachHere();
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6601 }
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6602 }
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6603
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6604 void MacroAssembler::mov32(AddressLiteral dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6605 if (reachable(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6606 movl(as_Address(dst), src);
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 lea(rscratch1, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6609 movl(Address(rscratch1, 0), src);
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::mov32(Register 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 movl(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 movl(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6619 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6621
a61af66fc99e Initial load
duke
parents:
diff changeset
6622 // C++ bool manipulation
a61af66fc99e Initial load
duke
parents:
diff changeset
6623
a61af66fc99e Initial load
duke
parents:
diff changeset
6624 void MacroAssembler::movbool(Register dst, Address src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6625 if(sizeof(bool) == 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
6626 movb(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6627 else if(sizeof(bool) == 2)
a61af66fc99e Initial load
duke
parents:
diff changeset
6628 movw(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6629 else if(sizeof(bool) == 4)
a61af66fc99e Initial load
duke
parents:
diff changeset
6630 movl(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6631 else
a61af66fc99e Initial load
duke
parents:
diff changeset
6632 // unsupported
a61af66fc99e Initial load
duke
parents:
diff changeset
6633 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
6634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6635
a61af66fc99e Initial load
duke
parents:
diff changeset
6636 void MacroAssembler::movbool(Address dst, bool boolconst) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6637 if(sizeof(bool) == 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
6638 movb(dst, (int) boolconst);
a61af66fc99e Initial load
duke
parents:
diff changeset
6639 else if(sizeof(bool) == 2)
a61af66fc99e Initial load
duke
parents:
diff changeset
6640 movw(dst, (int) boolconst);
a61af66fc99e Initial load
duke
parents:
diff changeset
6641 else if(sizeof(bool) == 4)
a61af66fc99e Initial load
duke
parents:
diff changeset
6642 movl(dst, (int) boolconst);
a61af66fc99e Initial load
duke
parents:
diff changeset
6643 else
a61af66fc99e Initial load
duke
parents:
diff changeset
6644 // unsupported
a61af66fc99e Initial load
duke
parents:
diff changeset
6645 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
6646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6647
a61af66fc99e Initial load
duke
parents:
diff changeset
6648 void MacroAssembler::movbool(Address dst, Register src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6649 if(sizeof(bool) == 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
6650 movb(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6651 else if(sizeof(bool) == 2)
a61af66fc99e Initial load
duke
parents:
diff changeset
6652 movw(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6653 else if(sizeof(bool) == 4)
a61af66fc99e Initial load
duke
parents:
diff changeset
6654 movl(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6655 else
a61af66fc99e Initial load
duke
parents:
diff changeset
6656 // unsupported
a61af66fc99e Initial load
duke
parents:
diff changeset
6657 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
6658 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6659
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6660 void MacroAssembler::movbyte(ArrayAddress dst, int src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6661 movb(as_Address(dst), src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6664 void MacroAssembler::movdbl(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6665 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6666 if (UseXmmLoadAndClearUpper) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6667 movsd (dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6668 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6669 movlpd(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6670 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6671 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6672 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6673 if (UseXmmLoadAndClearUpper) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6674 movsd (dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6675 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6676 movlpd(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6677 }
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6681 void MacroAssembler::movflt(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6682 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6683 movss(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6684 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6685 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6686 movss(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6687 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6688 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6689
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6690 void MacroAssembler::movptr(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6691 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6694 void MacroAssembler::movptr(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6695 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6696 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6697
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6698 // 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
6699 void MacroAssembler::movptr(Register dst, intptr_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6700 LP64_ONLY(mov64(dst, src)) NOT_LP64(movl(dst, src));
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::movptr(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6704 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6705 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6706
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6707 void MacroAssembler::movss(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6708 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6709 movss(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6710 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6711 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6712 movss(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6713 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6714 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6715
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6716 void MacroAssembler::null_check(Register reg, int offset) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6717 if (needs_explicit_null_check(offset)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6718 // provoke OS NULL exception if reg = NULL by
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6719 // accessing M[reg] w/o changing any (non-CC) registers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6720 // NOTE: cmpl is plenty here to provoke a segv
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6721 cmpptr(rax, Address(reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6722 // Note: should probably use testl(rax, Address(reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6723 // may be shorter code (however, this version of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6724 // testl needs to be implemented first)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6725 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6726 // nothing to do, (later) access of M[reg + offset]
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6727 // will provoke OS NULL exception if reg = NULL
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6728 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6729 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6730
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6731 void MacroAssembler::os_breakpoint() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6732 // 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
6733 // (e.g., MSVC can't call ps() otherwise)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6734 call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6735 }
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 void MacroAssembler::pop_CPU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6738 pop_FPU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6739 pop_IU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6740 }
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 void MacroAssembler::pop_FPU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6743 NOT_LP64(frstor(Address(rsp, 0));)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6744 LP64_ONLY(fxrstor(Address(rsp, 0));)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6745 addptr(rsp, FPUStateSizeInWords * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6746 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6747
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6748 void MacroAssembler::pop_IU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6749 popa();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6750 LP64_ONLY(addq(rsp, 8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6751 popf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6752 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6753
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6754 // Save Integer and Float state
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6755 // Warning: Stack must be 16 byte aligned (64bit)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6756 void MacroAssembler::push_CPU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6757 push_IU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6758 push_FPU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6759 }
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 void MacroAssembler::push_FPU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6762 subptr(rsp, FPUStateSizeInWords * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6763 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6764 fnsave(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6765 fwait();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6766 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6767 fxsave(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6768 #endif // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6769 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6770
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6771 void MacroAssembler::push_IU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6772 // Push flags first because pusha kills them
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6773 pushf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6774 // Make sure rsp stays 16-byte aligned
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6775 LP64_ONLY(subq(rsp, 8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6776 pusha();
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6779 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
6780 // determine java_thread register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6781 if (!java_thread->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6782 java_thread = rdi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6783 get_thread(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6784 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6785 // 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
6786 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
6787 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
6788 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
6789 }
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 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
6792 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
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6796 void MacroAssembler::restore_rax(Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6797 if (tmp == noreg) pop(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6798 else if (tmp != rax) mov(rax, tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6799 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6800
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6801 void MacroAssembler::round_to(Register reg, int modulus) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6802 addptr(reg, modulus - 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6803 andptr(reg, -modulus);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6804 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6805
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6806 void MacroAssembler::save_rax(Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6807 if (tmp == noreg) push(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6808 else if (tmp != rax) mov(tmp, rax);
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 // 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
6812 // We use the current thread pointer to calculate a thread specific
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6813 // offset to write to within the page. This minimizes bus traffic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6814 // due to cache line collision.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6815 void MacroAssembler::serialize_memory(Register thread, Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6816 movl(tmp, thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6817 shrl(tmp, os::get_serialize_page_shift_count());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6818 andl(tmp, (os::vm_page_size() - sizeof(int)));
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 Address index(noreg, tmp, Address::times_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6821 ExternalAddress page(os::get_memory_serialize_page());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6822
606
19962e74284f 6811384: MacroAssembler::serialize_memory may touch next page on amd64
never
parents: 520
diff changeset
6823 // Size of store must match masking code above
19962e74284f 6811384: MacroAssembler::serialize_memory may touch next page on amd64
never
parents: 520
diff changeset
6824 movl(as_Address(ArrayAddress(page, index)), tmp);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6825 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6826
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6827 // Calls to C land
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6828 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6829 // 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
6830 // 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
6831 // 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
6832 void MacroAssembler::set_last_Java_frame(Register java_thread,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6833 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6834 Register last_java_fp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6835 address last_java_pc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6836 // determine java_thread register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6837 if (!java_thread->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6838 java_thread = rdi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6839 get_thread(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6840 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6841 // determine last_java_sp register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6842 if (!last_java_sp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6843 last_java_sp = rsp;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6844 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6845
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6846 // last_java_fp is optional
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6847
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6848 if (last_java_fp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6849 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
6850 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6851
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6852 // last_java_pc is optional
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6853
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6854 if (last_java_pc != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6855 lea(Address(java_thread,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6856 JavaThread::frame_anchor_offset() + JavaFrameAnchor::last_Java_pc_offset()),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6857 InternalAddress(last_java_pc));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6858
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6859 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6860 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
6861 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6862
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6863 void MacroAssembler::shlptr(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6864 LP64_ONLY(shlq(dst, imm8)) NOT_LP64(shll(dst, imm8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6865 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6866
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6867 void MacroAssembler::shrptr(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6868 LP64_ONLY(shrq(dst, imm8)) NOT_LP64(shrl(dst, imm8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6869 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6870
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6871 void MacroAssembler::sign_extend_byte(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6872 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
6873 movsbl(reg, reg); // movsxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6874 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6875 shll(reg, 24);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6876 sarl(reg, 24);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6877 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6878 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6879
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6880 void MacroAssembler::sign_extend_short(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6881 if (LP64_ONLY(true ||) VM_Version::is_P6()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6882 movswl(reg, reg); // movsxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6883 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6884 shll(reg, 16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6885 sarl(reg, 16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6886 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6887 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6888
362
apetrusenko
parents: 356 304
diff changeset
6889 //////////////////////////////////////////////////////////////////////////////////
apetrusenko
parents: 356 304
diff changeset
6890 #ifndef SERIALGC
apetrusenko
parents: 356 304
diff changeset
6891
apetrusenko
parents: 356 304
diff changeset
6892 void MacroAssembler::g1_write_barrier_pre(Register obj,
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6893 Register pre_val,
362
apetrusenko
parents: 356 304
diff changeset
6894 Register thread,
apetrusenko
parents: 356 304
diff changeset
6895 Register tmp,
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6896 bool tosca_live,
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6897 bool expand_call) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6898
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6899 // If expand_call is true then we expand the call_VM_leaf macro
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6900 // directly to skip generating the check by
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6901 // InterpreterMacroAssembler::call_VM_leaf_base that checks _last_sp.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6902
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6903 #ifdef _LP64
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6904 assert(thread == r15_thread, "must be");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6905 #endif // _LP64
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6906
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6907 Label done;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6908 Label runtime;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6909
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6910 assert(pre_val != noreg, "check this code");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6911
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6912 if (obj != noreg) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6913 assert_different_registers(obj, pre_val, tmp);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6914 assert(pre_val != rax, "check this code");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6915 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6916
362
apetrusenko
parents: 356 304
diff changeset
6917 Address in_progress(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
6918 PtrQueue::byte_offset_of_active()));
apetrusenko
parents: 356 304
diff changeset
6919 Address index(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
6920 PtrQueue::byte_offset_of_index()));
apetrusenko
parents: 356 304
diff changeset
6921 Address buffer(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
6922 PtrQueue::byte_offset_of_buf()));
apetrusenko
parents: 356 304
diff changeset
6923
apetrusenko
parents: 356 304
diff changeset
6924
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6925 // Is marking active?
362
apetrusenko
parents: 356 304
diff changeset
6926 if (in_bytes(PtrQueue::byte_width_of_active()) == 4) {
apetrusenko
parents: 356 304
diff changeset
6927 cmpl(in_progress, 0);
apetrusenko
parents: 356 304
diff changeset
6928 } else {
apetrusenko
parents: 356 304
diff changeset
6929 assert(in_bytes(PtrQueue::byte_width_of_active()) == 1, "Assumption");
apetrusenko
parents: 356 304
diff changeset
6930 cmpb(in_progress, 0);
apetrusenko
parents: 356 304
diff changeset
6931 }
apetrusenko
parents: 356 304
diff changeset
6932 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
6933
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6934 // Do we need to load the previous value?
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6935 if (obj != noreg) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6936 load_heap_oop(pre_val, Address(obj, 0));
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6937 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6938
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6939 // Is the previous value null?
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6940 cmpptr(pre_val, (int32_t) NULL_WORD);
362
apetrusenko
parents: 356 304
diff changeset
6941 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
6942
apetrusenko
parents: 356 304
diff changeset
6943 // Can we store original value in the thread's buffer?
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6944 // Is index == 0?
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6945 // (The index field is typed as size_t.)
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6946
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6947 movptr(tmp, index); // tmp := *index_adr
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6948 cmpptr(tmp, 0); // tmp == 0?
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6949 jcc(Assembler::equal, runtime); // If yes, goto runtime
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6950
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6951 subptr(tmp, wordSize); // tmp := tmp - wordSize
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6952 movptr(index, tmp); // *index_adr := tmp
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6953 addptr(tmp, buffer); // tmp := tmp + *buffer_adr
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6954
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6955 // Record the previous value
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6956 movptr(Address(tmp, 0), pre_val);
362
apetrusenko
parents: 356 304
diff changeset
6957 jmp(done);
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6958
362
apetrusenko
parents: 356 304
diff changeset
6959 bind(runtime);
apetrusenko
parents: 356 304
diff changeset
6960 // save the live input values
apetrusenko
parents: 356 304
diff changeset
6961 if(tosca_live) push(rax);
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6962
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6963 if (obj != noreg && obj != rax)
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6964 push(obj);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6965
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6966 if (pre_val != rax)
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6967 push(pre_val);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6968
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6969 // Calling the runtime using the regular call_VM_leaf mechanism generates
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6970 // code (generated by InterpreterMacroAssember::call_VM_leaf_base)
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6971 // that checks that the *(ebp+frame::interpreter_frame_last_sp) == NULL.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6972 //
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6973 // If we care generating the pre-barrier without a frame (e.g. in the
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6974 // intrinsified Reference.get() routine) then ebp might be pointing to
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6975 // the caller frame and so this check will most likely fail at runtime.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6976 //
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6977 // Expanding the call directly bypasses the generation of the check.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6978 // So when we do not have have a full interpreter frame on the stack
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6979 // expand_call should be passed true.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6980
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6981 NOT_LP64( push(thread); )
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6982
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6983 if (expand_call) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6984 LP64_ONLY( assert(pre_val != c_rarg1, "smashed arg"); )
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6985 pass_arg1(this, thread);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6986 pass_arg0(this, pre_val);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6987 MacroAssembler::call_VM_leaf_base(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), 2);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6988 } else {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6989 call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), pre_val, thread);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6990 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6991
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6992 NOT_LP64( pop(thread); )
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6993
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6994 // save the live input values
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6995 if (pre_val != rax)
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6996 pop(pre_val);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6997
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6998 if (obj != noreg && obj != rax)
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
6999 pop(obj);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7000
362
apetrusenko
parents: 356 304
diff changeset
7001 if(tosca_live) pop(rax);
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7002
362
apetrusenko
parents: 356 304
diff changeset
7003 bind(done);
apetrusenko
parents: 356 304
diff changeset
7004 }
apetrusenko
parents: 356 304
diff changeset
7005
apetrusenko
parents: 356 304
diff changeset
7006 void MacroAssembler::g1_write_barrier_post(Register store_addr,
apetrusenko
parents: 356 304
diff changeset
7007 Register new_val,
apetrusenko
parents: 356 304
diff changeset
7008 Register thread,
apetrusenko
parents: 356 304
diff changeset
7009 Register tmp,
apetrusenko
parents: 356 304
diff changeset
7010 Register tmp2) {
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7011 #ifdef _LP64
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7012 assert(thread == r15_thread, "must be");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7013 #endif // _LP64
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7014
362
apetrusenko
parents: 356 304
diff changeset
7015 Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
7016 PtrQueue::byte_offset_of_index()));
apetrusenko
parents: 356 304
diff changeset
7017 Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
7018 PtrQueue::byte_offset_of_buf()));
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7019
362
apetrusenko
parents: 356 304
diff changeset
7020 BarrierSet* bs = Universe::heap()->barrier_set();
apetrusenko
parents: 356 304
diff changeset
7021 CardTableModRefBS* ct = (CardTableModRefBS*)bs;
apetrusenko
parents: 356 304
diff changeset
7022 Label done;
apetrusenko
parents: 356 304
diff changeset
7023 Label runtime;
apetrusenko
parents: 356 304
diff changeset
7024
apetrusenko
parents: 356 304
diff changeset
7025 // Does store cross heap regions?
apetrusenko
parents: 356 304
diff changeset
7026
apetrusenko
parents: 356 304
diff changeset
7027 movptr(tmp, store_addr);
apetrusenko
parents: 356 304
diff changeset
7028 xorptr(tmp, new_val);
apetrusenko
parents: 356 304
diff changeset
7029 shrptr(tmp, HeapRegion::LogOfHRGrainBytes);
apetrusenko
parents: 356 304
diff changeset
7030 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
7031
apetrusenko
parents: 356 304
diff changeset
7032 // crosses regions, storing NULL?
apetrusenko
parents: 356 304
diff changeset
7033
apetrusenko
parents: 356 304
diff changeset
7034 cmpptr(new_val, (int32_t) NULL_WORD);
apetrusenko
parents: 356 304
diff changeset
7035 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
7036
apetrusenko
parents: 356 304
diff changeset
7037 // storing region crossing non-NULL, is card already dirty?
apetrusenko
parents: 356 304
diff changeset
7038
apetrusenko
parents: 356 304
diff changeset
7039 ExternalAddress cardtable((address) ct->byte_map_base);
apetrusenko
parents: 356 304
diff changeset
7040 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
apetrusenko
parents: 356 304
diff changeset
7041 #ifdef _LP64
apetrusenko
parents: 356 304
diff changeset
7042 const Register card_addr = tmp;
apetrusenko
parents: 356 304
diff changeset
7043
apetrusenko
parents: 356 304
diff changeset
7044 movq(card_addr, store_addr);
apetrusenko
parents: 356 304
diff changeset
7045 shrq(card_addr, CardTableModRefBS::card_shift);
apetrusenko
parents: 356 304
diff changeset
7046
apetrusenko
parents: 356 304
diff changeset
7047 lea(tmp2, cardtable);
apetrusenko
parents: 356 304
diff changeset
7048
apetrusenko
parents: 356 304
diff changeset
7049 // get the address of the card
apetrusenko
parents: 356 304
diff changeset
7050 addq(card_addr, tmp2);
apetrusenko
parents: 356 304
diff changeset
7051 #else
apetrusenko
parents: 356 304
diff changeset
7052 const Register card_index = tmp;
apetrusenko
parents: 356 304
diff changeset
7053
apetrusenko
parents: 356 304
diff changeset
7054 movl(card_index, store_addr);
apetrusenko
parents: 356 304
diff changeset
7055 shrl(card_index, CardTableModRefBS::card_shift);
apetrusenko
parents: 356 304
diff changeset
7056
apetrusenko
parents: 356 304
diff changeset
7057 Address index(noreg, card_index, Address::times_1);
apetrusenko
parents: 356 304
diff changeset
7058 const Register card_addr = tmp;
apetrusenko
parents: 356 304
diff changeset
7059 lea(card_addr, as_Address(ArrayAddress(cardtable, index)));
apetrusenko
parents: 356 304
diff changeset
7060 #endif
apetrusenko
parents: 356 304
diff changeset
7061 cmpb(Address(card_addr, 0), 0);
apetrusenko
parents: 356 304
diff changeset
7062 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
7063
apetrusenko
parents: 356 304
diff changeset
7064 // storing a region crossing, non-NULL oop, card is clean.
apetrusenko
parents: 356 304
diff changeset
7065 // dirty card and log.
apetrusenko
parents: 356 304
diff changeset
7066
apetrusenko
parents: 356 304
diff changeset
7067 movb(Address(card_addr, 0), 0);
apetrusenko
parents: 356 304
diff changeset
7068
apetrusenko
parents: 356 304
diff changeset
7069 cmpl(queue_index, 0);
apetrusenko
parents: 356 304
diff changeset
7070 jcc(Assembler::equal, runtime);
apetrusenko
parents: 356 304
diff changeset
7071 subl(queue_index, wordSize);
apetrusenko
parents: 356 304
diff changeset
7072 movptr(tmp2, buffer);
apetrusenko
parents: 356 304
diff changeset
7073 #ifdef _LP64
apetrusenko
parents: 356 304
diff changeset
7074 movslq(rscratch1, queue_index);
apetrusenko
parents: 356 304
diff changeset
7075 addq(tmp2, rscratch1);
apetrusenko
parents: 356 304
diff changeset
7076 movq(Address(tmp2, 0), card_addr);
apetrusenko
parents: 356 304
diff changeset
7077 #else
apetrusenko
parents: 356 304
diff changeset
7078 addl(tmp2, queue_index);
apetrusenko
parents: 356 304
diff changeset
7079 movl(Address(tmp2, 0), card_index);
apetrusenko
parents: 356 304
diff changeset
7080 #endif
apetrusenko
parents: 356 304
diff changeset
7081 jmp(done);
apetrusenko
parents: 356 304
diff changeset
7082
apetrusenko
parents: 356 304
diff changeset
7083 bind(runtime);
apetrusenko
parents: 356 304
diff changeset
7084 // save the live input values
apetrusenko
parents: 356 304
diff changeset
7085 push(store_addr);
apetrusenko
parents: 356 304
diff changeset
7086 push(new_val);
apetrusenko
parents: 356 304
diff changeset
7087 #ifdef _LP64
apetrusenko
parents: 356 304
diff changeset
7088 call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, r15_thread);
apetrusenko
parents: 356 304
diff changeset
7089 #else
apetrusenko
parents: 356 304
diff changeset
7090 push(thread);
apetrusenko
parents: 356 304
diff changeset
7091 call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, thread);
apetrusenko
parents: 356 304
diff changeset
7092 pop(thread);
apetrusenko
parents: 356 304
diff changeset
7093 #endif
apetrusenko
parents: 356 304
diff changeset
7094 pop(new_val);
apetrusenko
parents: 356 304
diff changeset
7095 pop(store_addr);
apetrusenko
parents: 356 304
diff changeset
7096
apetrusenko
parents: 356 304
diff changeset
7097 bind(done);
apetrusenko
parents: 356 304
diff changeset
7098 }
apetrusenko
parents: 356 304
diff changeset
7099
apetrusenko
parents: 356 304
diff changeset
7100 #endif // SERIALGC
apetrusenko
parents: 356 304
diff changeset
7101 //////////////////////////////////////////////////////////////////////////////////
apetrusenko
parents: 356 304
diff changeset
7102
apetrusenko
parents: 356 304
diff changeset
7103
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7104 void MacroAssembler::store_check(Register obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7105 // 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
7106 // register obj is destroyed afterwards.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7107 store_check_part_1(obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7108 store_check_part_2(obj);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7111 void MacroAssembler::store_check(Register obj, Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7112 store_check(obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7113 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7114
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7115
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7116 // 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
7117 void MacroAssembler::store_check_part_1(Register obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7118 BarrierSet* bs = Universe::heap()->barrier_set();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7119 assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7120 shrptr(obj, CardTableModRefBS::card_shift);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7121 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7122
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7123 void MacroAssembler::store_check_part_2(Register obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7124 BarrierSet* bs = Universe::heap()->barrier_set();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7125 assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7126 CardTableModRefBS* ct = (CardTableModRefBS*)bs;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7127 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7128
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7129 // The calculation for byte_map_base is as follows:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7130 // byte_map_base = _byte_map - (uintptr_t(low_bound) >> card_shift);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7131 // So this essentially converts an address to a displacement and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7132 // 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
7133 // large for a 32bit displacement
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 intptr_t disp = (intptr_t) ct->byte_map_base;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7136 if (is_simm32(disp)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7137 Address cardtable(noreg, obj, Address::times_1, disp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7138 movb(cardtable, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7139 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7140 // 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
7141 // displacement and done in a single instruction given favorable mapping and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7142 // 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
7143 // 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
7144 // Address() as above.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7145 // 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
7146 // 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
7147 // in some cases we'll get a single instruction version.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7148
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7149 ExternalAddress cardtable((address)disp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7150 Address index(noreg, obj, Address::times_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7151 movb(as_Address(ArrayAddress(cardtable, index)), 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7152 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7153 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7154
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7155 void MacroAssembler::subptr(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7156 LP64_ONLY(subq(dst, imm32)) NOT_LP64(subl(dst, imm32));
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7159 void MacroAssembler::subptr(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7160 LP64_ONLY(subq(dst, src)) NOT_LP64(subl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7161 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7162
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7163 void MacroAssembler::test32(Register src1, AddressLiteral src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7164 // src2 must be rval
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7165
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7166 if (reachable(src2)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7167 testl(src1, as_Address(src2));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7168 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7169 lea(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7170 testl(src1, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7171 }
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7174 // C++ bool manipulation
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7175 void MacroAssembler::testbool(Register dst) {
a61af66fc99e Initial load
duke
parents:
diff changeset
7176 if(sizeof(bool) == 1)
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7177 testb(dst, 0xff);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7178 else if(sizeof(bool) == 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
7179 // testw implementation needed for two byte bools
a61af66fc99e Initial load
duke
parents:
diff changeset
7180 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
7181 } else if(sizeof(bool) == 4)
a61af66fc99e Initial load
duke
parents:
diff changeset
7182 testl(dst, dst);
a61af66fc99e Initial load
duke
parents:
diff changeset
7183 else
a61af66fc99e Initial load
duke
parents:
diff changeset
7184 // unsupported
a61af66fc99e Initial load
duke
parents:
diff changeset
7185 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
7186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
7187
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7188 void MacroAssembler::testptr(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7189 LP64_ONLY(testq(dst, src)) NOT_LP64(testl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7190 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7191
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7192 // 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
7193 void MacroAssembler::tlab_allocate(Register obj,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7194 Register var_size_in_bytes,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7195 int con_size_in_bytes,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7196 Register t1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7197 Register t2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7198 Label& slow_case) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7199 assert_different_registers(obj, t1, t2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7200 assert_different_registers(obj, var_size_in_bytes, t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7201 Register end = t2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7202 Register thread = NOT_LP64(t1) LP64_ONLY(r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7203
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7204 verify_tlab();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7205
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7206 NOT_LP64(get_thread(thread));
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 movptr(obj, Address(thread, JavaThread::tlab_top_offset()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7209 if (var_size_in_bytes == noreg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7210 lea(end, Address(obj, con_size_in_bytes));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7211 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7212 lea(end, Address(obj, var_size_in_bytes, Address::times_1));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7213 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7214 cmpptr(end, Address(thread, JavaThread::tlab_end_offset()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7215 jcc(Assembler::above, slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7216
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7217 // update the tlab top pointer
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7218 movptr(Address(thread, JavaThread::tlab_top_offset()), end);
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 // recover var_size_in_bytes if necessary
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7221 if (var_size_in_bytes == end) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7222 subptr(var_size_in_bytes, obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7223 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7224 verify_tlab();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7225 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7226
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7227 // Preserves rbx, and rdx.
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7228 Register MacroAssembler::tlab_refill(Label& retry,
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7229 Label& try_eden,
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7230 Label& slow_case) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7231 Register top = rax;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7232 Register t1 = rcx;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7233 Register t2 = rsi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7234 Register thread_reg = NOT_LP64(rdi) LP64_ONLY(r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7235 assert_different_registers(top, thread_reg, t1, t2, /* preserve: */ rbx, rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7236 Label do_refill, discard_tlab;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7237
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7238 if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7239 // No allocation in the shared eden.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7240 jmp(slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7241 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7242
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7243 NOT_LP64(get_thread(thread_reg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7244
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7245 movptr(top, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7246 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_end_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7247
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7248 // calculate amount of free space
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7249 subptr(t1, top);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7250 shrptr(t1, LogHeapWordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7251
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7252 // Retain tlab and allocate object in shared space if
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7253 // the amount free in the tlab is too large to discard.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7254 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
7255 jcc(Assembler::lessEqual, discard_tlab);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7256
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7257 // Retain
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7258 // %%% yuck as movptr...
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7259 movptr(t2, (int32_t) ThreadLocalAllocBuffer::refill_waste_limit_increment());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7260 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
7261 if (TLABStats) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7262 // increment number of slow_allocations
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7263 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
7264 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7265 jmp(try_eden);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7266
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7267 bind(discard_tlab);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7268 if (TLABStats) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7269 // increment number of refills
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7270 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
7271 // accumulate wastage -- t1 is amount free in tlab
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7272 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
7273 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7274
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7275 // if tlab is currently allocated (top or end != null) then
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7276 // fill [top, end + alignment_reserve) with array object
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7277 testptr(top, top);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7278 jcc(Assembler::zero, do_refill);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7279
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7280 // set up the mark word
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7281 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
7282 // set the length to the remaining space
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7283 subptr(t1, typeArrayOopDesc::header_size(T_INT));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7284 addptr(t1, (int32_t)ThreadLocalAllocBuffer::alignment_reserve());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7285 shlptr(t1, log2_intptr(HeapWordSize/sizeof(jint)));
1690
36519c19beeb 6975027: use of movptr to set length of array
never
parents: 1684
diff changeset
7286 movl(Address(top, arrayOopDesc::length_offset_in_bytes()), t1);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7287 // set klass to intArrayKlass
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7288 // dubious reloc why not an oop reloc?
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7289 movptr(t1, ExternalAddress((address)Universe::intArrayKlassObj_addr()));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7290 // store klass last. concurrent gcs assumes klass length is valid if
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7291 // klass field is not null.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7292 store_klass(top, t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7293
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7294 movptr(t1, top);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7295 subptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_start_offset())));
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7296 incr_allocated_bytes(thread_reg, t1, 0);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7297
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7298 // refill the tlab with an eden allocation
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7299 bind(do_refill);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7300 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_size_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7301 shlptr(t1, LogHeapWordSize);
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7302 // allocate new tlab, address returned in top
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7303 eden_allocate(top, t1, 0, t2, slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7305 // Check that t1 was preserved in eden_allocate.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7306 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7307 if (UseTLAB) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7308 Label ok;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7309 Register tsize = rsi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7310 assert_different_registers(tsize, thread_reg, t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7311 push(tsize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7312 movptr(tsize, Address(thread_reg, in_bytes(JavaThread::tlab_size_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7313 shlptr(tsize, LogHeapWordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7314 cmpptr(t1, tsize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7315 jcc(Assembler::equal, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7316 stop("assert(t1 != tlab size)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7317 should_not_reach_here();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7318
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7319 bind(ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7320 pop(tsize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7321 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7322 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7323 movptr(Address(thread_reg, in_bytes(JavaThread::tlab_start_offset())), top);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7324 movptr(Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())), top);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7325 addptr(top, t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7326 subptr(top, (int32_t)ThreadLocalAllocBuffer::alignment_reserve_in_bytes());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7327 movptr(Address(thread_reg, in_bytes(JavaThread::tlab_end_offset())), top);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7328 verify_tlab();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7329 jmp(retry);
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7330
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7331 return thread_reg; // for use by caller
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7332 }
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7333
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7334 void MacroAssembler::incr_allocated_bytes(Register thread,
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7335 Register var_size_in_bytes,
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7336 int con_size_in_bytes,
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7337 Register t1) {
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7338 #ifdef _LP64
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7339 if (var_size_in_bytes->is_valid()) {
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7340 addq(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), var_size_in_bytes);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7341 } else {
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7342 addq(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), con_size_in_bytes);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7343 }
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7344 #else
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7345 if (!thread->is_valid()) {
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7346 assert(t1->is_valid(), "need temp reg");
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7347 thread = t1;
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7348 get_thread(thread);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7349 }
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7350
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7351 if (var_size_in_bytes->is_valid()) {
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7352 addl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), var_size_in_bytes);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7353 } else {
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7354 addl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), con_size_in_bytes);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7355 }
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7356 adcl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())+4), 0);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7357 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7358 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7359
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7360 static const double pi_4 = 0.7853981633974483;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7361
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7362 void MacroAssembler::trigfunc(char trig, int num_fpu_regs_in_use) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7363 // 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
7364 // was attempted in this code; unfortunately it appears that the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7365 // switch to 80-bit precision and back causes this to be
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7366 // unprofitable compared with simply performing a runtime call if
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7367 // the argument is out of the (-pi/4, pi/4) range.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7368
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7369 Register tmp = noreg;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7370 if (!VM_Version::supports_cmov()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7371 // fcmp needs a temporary so preserve rbx,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7372 tmp = rbx;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7373 push(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7374 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7375
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7376 Label slow_case, done;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7377
520
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7378 ExternalAddress pi4_adr = (address)&pi_4;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7379 if (reachable(pi4_adr)) {
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7380 // x ?<= pi/4
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7381 fld_d(pi4_adr);
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7382 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
7383 fabs(); // Stack: |X| PI/4 X
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7384 fcmp(tmp);
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7385 jcc(Assembler::above, slow_case);
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7386
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7387 // fastest case: -pi/4 <= x <= pi/4
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7388 switch(trig) {
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7389 case 's':
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7390 fsin();
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7391 break;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7392 case 'c':
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7393 fcos();
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7394 break;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7395 case 't':
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7396 ftan();
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7397 break;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7398 default:
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7399 assert(false, "bad intrinsic");
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7400 break;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7401 }
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7402 jmp(done);
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7403 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7404
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7405 // slow case: runtime call
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7406 bind(slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7407 // Preserve registers across runtime call
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7408 pusha();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7409 int incoming_argument_and_return_value_offset = -1;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7410 if (num_fpu_regs_in_use > 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7411 // Must preserve all other FPU regs (could alternatively convert
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7412 // SharedRuntime::dsin and dcos into assembly routines known not to trash
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7413 // FPU state, but can not trust C compiler)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7414 NEEDS_CLEANUP;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7415 // 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
7416 // 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
7417 // hold the return value from dsin or dcos.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7418 for (int i = 0; i < num_fpu_regs_in_use; i++) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7419 subptr(rsp, sizeof(jdouble));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7420 fstp_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7421 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7422 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
7423 fld_d(Address(rsp, incoming_argument_and_return_value_offset));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7424 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7425 subptr(rsp, sizeof(jdouble));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7426 fstp_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7427 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7428 movdbl(xmm0, Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7429 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7430
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7431 // 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
7432 // complete interpreter frame in debug mode -- same bug as 4387334
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7433 // MacroAssembler::call_VM_leaf_base is perfectly safe and will
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7434 // do proper 64bit abi
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7435
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7436 NEEDS_CLEANUP;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7437 // 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
7438 // be taken; however, there is no generic stack banging routine at
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7439 // the MacroAssembler level
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7440 switch(trig) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7441 case 's':
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7442 {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7443 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
7444 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7445 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7446 case 'c':
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7447 {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7448 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
7449 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7450 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7451 case 't':
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7452 {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7453 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
7454 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7455 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7456 default:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7457 assert(false, "bad intrinsic");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7458 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7459 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7460 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7461 movsd(Address(rsp, 0), xmm0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7462 fld_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7463 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7464 addptr(rsp, sizeof(jdouble));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7465 if (num_fpu_regs_in_use > 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7466 // 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
7467 fstp_d(Address(rsp, incoming_argument_and_return_value_offset));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7468 for (int i = 0; i < num_fpu_regs_in_use; i++) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7469 fld_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7470 addptr(rsp, sizeof(jdouble));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7471 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7472 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7473 popa();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7474
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7475 // Come here with result in F-TOS
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7476 bind(done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7477
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7478 if (tmp != noreg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7479 pop(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7480 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7481 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7482
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7483
623
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7484 // 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
7485 // 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
7486 // The receiver klass is in recv_klass.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7487 // 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
7488 // On failure, execution transfers to the given label.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7489 void MacroAssembler::lookup_interface_method(Register recv_klass,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7490 Register intf_klass,
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7491 RegisterOrConstant itable_index,
623
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7492 Register method_result,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7493 Register scan_temp,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7494 Label& L_no_such_interface) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7495 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
7496 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
7497 "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
7498
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7499 // 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
7500 int vtable_base = instanceKlass::vtable_start_offset() * wordSize;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7501 int itentry_off = itableMethodEntry::method_offset_in_bytes();
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7502 int scan_step = itableOffsetEntry::size() * wordSize;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7503 int vte_size = vtableEntry::size() * wordSize;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7504 Address::ScaleFactor times_vte_scale = Address::times_ptr;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7505 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
7506
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7507 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
7508
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7509 // %%% 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
7510 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
7511 if (HeapWordsPerLong > 1) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7512 // Round up to align_object_offset boundary
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7513 // see code for instanceKlass::start_of_itable!
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7514 round_to(scan_temp, BytesPerLong);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7515 }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7516
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7517 // 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
7518 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
7519 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
7520
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7521 // 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
7522 // if (scan->interface() == intf) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7523 // result = (klass + scan->offset() + itable_index);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7524 // }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7525 // }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7526 Label search, found_method;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7527
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7528 for (int peel = 1; peel >= 0; peel--) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7529 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
7530 cmpptr(intf_klass, method_result);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7531
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7532 if (peel) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7533 jccb(Assembler::equal, found_method);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7534 } else {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7535 jccb(Assembler::notEqual, search);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7536 // (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
7537 }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7538
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7539 if (!peel) break;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7540
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7541 bind(search);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7542
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7543 // 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
7544 // 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
7545 // same as when the caller was compiled.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7546 testptr(method_result, method_result);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7547 jcc(Assembler::zero, L_no_such_interface);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7548 addptr(scan_temp, scan_step);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7549 }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7550
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7551 bind(found_method);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7552
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7553 // Got a hit.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7554 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
7555 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
7556 }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7557
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7558
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7559 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
7560 Register super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7561 Register temp_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7562 Label& L_success) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7563 Label L_failure;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7564 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
7565 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
7566 bind(L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7567 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7568
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 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
7571 Register super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7572 Register temp_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7573 Label* L_success,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7574 Label* L_failure,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7575 Label* L_slow_path,
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7576 RegisterOrConstant super_check_offset) {
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7577 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
7578 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
7579 if (super_check_offset.is_register()) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7580 assert_different_registers(sub_klass, super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7581 super_check_offset.as_register());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7582 } else if (must_load_sco) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7583 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
7584 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7585
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7586 Label L_fallthrough;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7587 int label_nulls = 0;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7588 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
7589 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
7590 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
7591 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
7592
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7593 int sc_offset = (klassOopDesc::header_size() * HeapWordSize +
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7594 Klass::secondary_super_cache_offset_in_bytes());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7595 int sco_offset = (klassOopDesc::header_size() * HeapWordSize +
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7596 Klass::super_check_offset_offset_in_bytes());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7597 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
7598
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7599 // 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
7600 // 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
7601 // least some of these.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7602 #define local_jcc(assembler_cond, label) \
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7603 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
7604 else jcc( assembler_cond, label) /*omit semi*/
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7605
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7606 // 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
7607 #define final_jmp(label) \
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7608 if (&(label) == &L_fallthrough) { /*do nothing*/ } \
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7609 else jmp(label) /*omit semi*/
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7610
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7611 // 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
7612 // 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
7613 // 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
7614 // type would need its own customized SSA.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7615 // 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
7616 // 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
7617 // 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
7618 cmpptr(sub_klass, super_klass);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7619 local_jcc(Assembler::equal, *L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7620
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7621 // Check the supertype display:
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7622 if (must_load_sco) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7623 // Positive movl does right thing on LP64.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7624 movl(temp_reg, super_check_offset_addr);
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7625 super_check_offset = RegisterOrConstant(temp_reg);
644
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 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
7628 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
7629
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7630 // 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
7631 // 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
7632 // (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
7633 // 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
7634 // 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
7635 // (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
7636 // 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
7637 // what we need immediately.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7638 // 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
7639 // 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
7640
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7641 if (super_check_offset.is_register()) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7642 local_jcc(Assembler::equal, *L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7643 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
7644 if (L_failure == &L_fallthrough) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7645 local_jcc(Assembler::equal, *L_slow_path);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7646 } else {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7647 local_jcc(Assembler::notEqual, *L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7648 final_jmp(*L_slow_path);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7649 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7650 } 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
7651 // 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
7652 if (L_slow_path == &L_fallthrough) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7653 local_jcc(Assembler::equal, *L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7654 } else {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7655 local_jcc(Assembler::notEqual, *L_slow_path);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7656 final_jmp(*L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7657 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7658 } else {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7659 // 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
7660 if (L_failure == &L_fallthrough) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7661 local_jcc(Assembler::equal, *L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7662 } else {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7663 local_jcc(Assembler::notEqual, *L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7664 final_jmp(*L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7665 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7666 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7667
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7668 bind(L_fallthrough);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7669
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7670 #undef local_jcc
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7671 #undef final_jmp
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7672 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7673
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7674
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7675 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
7676 Register super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7677 Register temp_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7678 Register temp2_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7679 Label* L_success,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7680 Label* L_failure,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7681 bool set_cond_codes) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7682 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
7683 if (temp2_reg != noreg)
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7684 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
7685 #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
7686
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7687 Label L_fallthrough;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7688 int label_nulls = 0;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7689 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
7690 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
7691 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
7692
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7693 // 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
7694 int ss_offset = (klassOopDesc::header_size() * HeapWordSize +
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7695 Klass::secondary_supers_offset_in_bytes());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7696 int sc_offset = (klassOopDesc::header_size() * HeapWordSize +
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7697 Klass::secondary_super_cache_offset_in_bytes());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7698 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
7699 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
7700
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7701 // 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
7702 // 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
7703 // 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
7704 // 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
7705
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7706 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
7707 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
7708
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7709 // 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
7710 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
7711 if (super_klass != rax || UseCompressedOops) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7712 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
7713 mov(rax, super_klass);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7714 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7715 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
7716 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
7717
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7718 #ifndef PRODUCT
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7719 int* pst_counter = &SharedRuntime::_partial_subtype_ctr;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7720 ExternalAddress pst_counter_addr((address) pst_counter);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7721 NOT_LP64( incrementl(pst_counter_addr) );
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7722 LP64_ONLY( lea(rcx, pst_counter_addr) );
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7723 LP64_ONLY( incrementl(Address(rcx, 0)) );
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7724 #endif //PRODUCT
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7725
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7726 // We will consult the secondary-super array.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7727 movptr(rdi, secondary_supers_addr);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7728 // 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
7729 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
7730 // Skip to start of data.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7731 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
7732
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7733 // 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
7734 // 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
7735 // 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
7736 // 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
7737 // 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
7738 #ifdef _LP64
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7739 // 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
7740 // 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
7741 // 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
7742 if (UseCompressedOops) {
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7743 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
7744 // 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
7745 // 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
7746 // 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
7747 // 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
7748 testl(rax,rax); // Set Z = 0
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7749 repne_scanl();
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7750 } else
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7751 #endif // _LP64
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7752 {
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7753 testptr(rax,rax); // Set Z = 0
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7754 repne_scan();
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7755 }
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7756 // Unspill the temp. registers:
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7757 if (pushed_rdi) pop(rdi);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7758 if (pushed_rcx) pop(rcx);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7759 if (pushed_rax) pop(rax);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7760
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7761 if (set_cond_codes) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7762 // 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
7763 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
7764 // 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
7765 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7766
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7767 if (L_failure == &L_fallthrough)
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7768 jccb(Assembler::notEqual, *L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7769 else jcc(Assembler::notEqual, *L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7770
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7771 // 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
7772 movptr(super_cache_addr, super_klass);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7773
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7774 if (L_success != &L_fallthrough) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7775 jmp(*L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7776 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7777
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7778 #undef IS_A_TEMP
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7779
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7780 bind(L_fallthrough);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7781 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7782
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7783
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7784 void MacroAssembler::ucomisd(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7785 ucomisd(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7786 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7787
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7788 void MacroAssembler::ucomiss(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7789 ucomiss(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7790 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7791
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7792 void MacroAssembler::xorpd(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7793 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7794 xorpd(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7795 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7796 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7797 xorpd(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7798 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7799 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7800
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7801 void MacroAssembler::xorps(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7802 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7803 xorps(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7804 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7805 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7806 xorps(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7807 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7808 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7809
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7810 void MacroAssembler::verify_oop(Register reg, const char* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
7811 if (!VerifyOops) return;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7812
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7813 // Pass register number to verify_oop_subroutine
a61af66fc99e Initial load
duke
parents:
diff changeset
7814 char* b = new char[strlen(s) + 50];
a61af66fc99e Initial load
duke
parents:
diff changeset
7815 sprintf(b, "verify_oop: %s: %s", reg->name(), s);
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,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7820 push(reg); // pass register argument
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7821 ExternalAddress buffer((address) b);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7822 // avoid using pushptr, as it modifies scratch registers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7823 // and our contract is not to modify anything
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7824 movptr(rax, buffer.addr());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7825 push(rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7826 // call indirectly to solve generation ordering problem
a61af66fc99e Initial load
duke
parents:
diff changeset
7827 movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address()));
a61af66fc99e Initial load
duke
parents:
diff changeset
7828 call(rax);
1583
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7829 // Caller pops the arguments (oop, message) and restores rax, r10
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7830 }
a61af66fc99e Initial load
duke
parents:
diff changeset
7831
a61af66fc99e Initial load
duke
parents:
diff changeset
7832
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7833 RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr,
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7834 Register tmp,
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7835 int offset) {
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7836 intptr_t value = *delayed_value_addr;
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7837 if (value != 0)
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7838 return RegisterOrConstant(value + offset);
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7839
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7840 // 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
7841 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
7842
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7843 #ifdef ASSERT
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7844 { Label L;
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7845 testptr(tmp, tmp);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7846 if (WizardMode) {
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7847 jcc(Assembler::notZero, L);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7848 char* buf = new char[40];
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7849 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
7850 stop(buf);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7851 } else {
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7852 jccb(Assembler::notZero, L);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7853 hlt();
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7854 }
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7855 bind(L);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7856 }
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7857 #endif
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7858
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7859 if (offset != 0)
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7860 addptr(tmp, offset);
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7861
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7862 return RegisterOrConstant(tmp);
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7863 }
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7864
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7865
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7866 // registers on entry:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7867 // - rax ('check' register): required MethodType
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7868 // - rcx: method handle
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7869 // - rdx, rsi, or ?: killable temp
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7870 void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7871 Register temp_reg,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7872 Label& wrong_method_type) {
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2320
diff changeset
7873 Address type_addr(mh_reg, delayed_value(java_lang_invoke_MethodHandle::type_offset_in_bytes, temp_reg));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7874 // compare method type against that of the receiver
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7875 if (UseCompressedOops) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7876 load_heap_oop(temp_reg, type_addr);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7877 cmpptr(mtype_reg, temp_reg);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7878 } else {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7879 cmpptr(mtype_reg, type_addr);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7880 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7881 jcc(Assembler::notEqual, wrong_method_type);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7882 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7883
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7884
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7885 // 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
7886 // argument list in JVM stack slots. This field is either located directly
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7887 // in every method handle, or else is indirectly accessed through the
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7888 // method handle's MethodType. This macro hides the distinction.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7889 void MacroAssembler::load_method_handle_vmslots(Register vmslots_reg, Register mh_reg,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7890 Register temp_reg) {
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1369
diff changeset
7891 assert_different_registers(vmslots_reg, mh_reg, temp_reg);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7892 // load mh.type.form.vmslots
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2320
diff changeset
7893 if (java_lang_invoke_MethodHandle::vmslots_offset_in_bytes() != 0) {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7894 // hoist vmslots into every mh to avoid dependent load chain
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2320
diff changeset
7895 movl(vmslots_reg, Address(mh_reg, delayed_value(java_lang_invoke_MethodHandle::vmslots_offset_in_bytes, temp_reg)));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7896 } else {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7897 Register temp2_reg = vmslots_reg;
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2320
diff changeset
7898 load_heap_oop(temp2_reg, Address(mh_reg, delayed_value(java_lang_invoke_MethodHandle::type_offset_in_bytes, temp_reg)));
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2320
diff changeset
7899 load_heap_oop(temp2_reg, Address(temp2_reg, delayed_value(java_lang_invoke_MethodType::form_offset_in_bytes, temp_reg)));
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2320
diff changeset
7900 movl(vmslots_reg, Address(temp2_reg, delayed_value(java_lang_invoke_MethodTypeForm::vmslots_offset_in_bytes, temp_reg)));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7901 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7902 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7903
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7904
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7905 // registers on entry:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7906 // - rcx: method handle
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7907 // - rdx: killable temp (interpreted only)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7908 // - rax: killable temp (compiled only)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7909 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
7910 assert(mh_reg == rcx, "caller must put MH object in rcx");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7911 assert_different_registers(mh_reg, temp_reg);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7912
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7913 // pick out the interpreted side of the handler
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7914 // NOTE: vmentry is not an oop!
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2320
diff changeset
7915 movptr(temp_reg, Address(mh_reg, delayed_value(java_lang_invoke_MethodHandle::vmentry_offset_in_bytes, temp_reg)));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7916
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7917 // off we go...
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7918 jmp(Address(temp_reg, MethodHandleEntry::from_interpreted_entry_offset_in_bytes()));
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7919
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7920 // for the various stubs which take control at this point,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7921 // see MethodHandles::generate_method_handle_stub
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7922 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7923
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7924
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7925 Address MacroAssembler::argument_address(RegisterOrConstant arg_slot,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7926 int extra_slot_offset) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7927 // cf. TemplateTable::prepare_invoke(), if (load_receiver).
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
7928 int stackElementSize = Interpreter::stackElementSize;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7929 int offset = Interpreter::expr_offset_in_bytes(extra_slot_offset+0);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7930 #ifdef ASSERT
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7931 int offset1 = Interpreter::expr_offset_in_bytes(extra_slot_offset+1);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7932 assert(offset1 - offset == stackElementSize, "correct arithmetic");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7933 #endif
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7934 Register scale_reg = noreg;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7935 Address::ScaleFactor scale_factor = Address::no_scale;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7936 if (arg_slot.is_constant()) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7937 offset += arg_slot.as_constant() * stackElementSize;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7938 } else {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7939 scale_reg = arg_slot.as_register();
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7940 scale_factor = Address::times(stackElementSize);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7941 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7942 offset += wordSize; // return PC is on stack
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7943 return Address(rsp, scale_reg, scale_factor, offset);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7944 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7945
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7946
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7947 void MacroAssembler::verify_oop_addr(Address addr, const char* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
7948 if (!VerifyOops) return;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7949
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7950 // Address adjust(addr.base(), addr.index(), addr.scale(), addr.disp() + BytesPerWord);
a61af66fc99e Initial load
duke
parents:
diff changeset
7951 // Pass register number to verify_oop_subroutine
a61af66fc99e Initial load
duke
parents:
diff changeset
7952 char* b = new char[strlen(s) + 50];
a61af66fc99e Initial load
duke
parents:
diff changeset
7953 sprintf(b, "verify_oop_addr: %s", s);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7954
1583
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7955 #ifdef _LP64
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7956 push(rscratch1); // save r10, trashed by movptr()
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7957 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7958 push(rax); // save rax,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7959 // addr may contain rsp so we will have to adjust it based on the push
a61af66fc99e Initial load
duke
parents:
diff changeset
7960 // we just did
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7961 // 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
7962 // stores rax into addr which is backwards of what was intended.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7963 if (addr.uses(rsp)) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7964 lea(rax, addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7965 pushptr(Address(rax, BytesPerWord));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7966 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7967 pushptr(addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7968 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7969
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7970 ExternalAddress buffer((address) b);
a61af66fc99e Initial load
duke
parents:
diff changeset
7971 // pass msg argument
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7972 // avoid using pushptr, as it modifies scratch registers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7973 // and our contract is not to modify anything
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7974 movptr(rax, buffer.addr());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7975 push(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7976
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7977 // call indirectly to solve generation ordering problem
a61af66fc99e Initial load
duke
parents:
diff changeset
7978 movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address()));
a61af66fc99e Initial load
duke
parents:
diff changeset
7979 call(rax);
1583
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7980 // Caller pops the arguments (addr, message) and restores rax, r10.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7981 }
a61af66fc99e Initial load
duke
parents:
diff changeset
7982
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7983 void MacroAssembler::verify_tlab() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7984 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7985 if (UseTLAB && VerifyOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7986 Label next, ok;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7987 Register t1 = rsi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7988 Register thread_reg = NOT_LP64(rbx) LP64_ONLY(r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7989
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7990 push(t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7991 NOT_LP64(push(thread_reg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7992 NOT_LP64(get_thread(thread_reg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7993
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7994 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7995 cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_start_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7996 jcc(Assembler::aboveEqual, next);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7997 stop("assert(top >= start)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7998 should_not_reach_here();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7999
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8000 bind(next);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8001 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_end_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8002 cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8003 jcc(Assembler::aboveEqual, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8004 stop("assert(top <= end)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8005 should_not_reach_here();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8006
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8007 bind(ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8008 NOT_LP64(pop(thread_reg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8009 pop(t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8010 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8011 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8012 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8013
a61af66fc99e Initial load
duke
parents:
diff changeset
8014 class ControlWord {
a61af66fc99e Initial load
duke
parents:
diff changeset
8015 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8016 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
8017
a61af66fc99e Initial load
duke
parents:
diff changeset
8018 int rounding_control() const { return (_value >> 10) & 3 ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8019 int precision_control() const { return (_value >> 8) & 3 ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8020 bool precision() const { return ((_value >> 5) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8021 bool underflow() const { return ((_value >> 4) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8022 bool overflow() const { return ((_value >> 3) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8023 bool zero_divide() const { return ((_value >> 2) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8024 bool denormalized() const { return ((_value >> 1) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8025 bool invalid() const { return ((_value >> 0) & 1) != 0; }
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 // rounding control
a61af66fc99e Initial load
duke
parents:
diff changeset
8029 const char* rc;
a61af66fc99e Initial load
duke
parents:
diff changeset
8030 switch (rounding_control()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8031 case 0: rc = "round near"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8032 case 1: rc = "round down"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8033 case 2: rc = "round up "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8034 case 3: rc = "chop "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8035 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8036 // precision control
a61af66fc99e Initial load
duke
parents:
diff changeset
8037 const char* pc;
a61af66fc99e Initial load
duke
parents:
diff changeset
8038 switch (precision_control()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8039 case 0: pc = "24 bits "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8040 case 1: pc = "reserved"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8041 case 2: pc = "53 bits "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8042 case 3: pc = "64 bits "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8043 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8044 // flags
a61af66fc99e Initial load
duke
parents:
diff changeset
8045 char f[9];
a61af66fc99e Initial load
duke
parents:
diff changeset
8046 f[0] = ' ';
a61af66fc99e Initial load
duke
parents:
diff changeset
8047 f[1] = ' ';
a61af66fc99e Initial load
duke
parents:
diff changeset
8048 f[2] = (precision ()) ? 'P' : 'p';
a61af66fc99e Initial load
duke
parents:
diff changeset
8049 f[3] = (underflow ()) ? 'U' : 'u';
a61af66fc99e Initial load
duke
parents:
diff changeset
8050 f[4] = (overflow ()) ? 'O' : 'o';
a61af66fc99e Initial load
duke
parents:
diff changeset
8051 f[5] = (zero_divide ()) ? 'Z' : 'z';
a61af66fc99e Initial load
duke
parents:
diff changeset
8052 f[6] = (denormalized()) ? 'D' : 'd';
a61af66fc99e Initial load
duke
parents:
diff changeset
8053 f[7] = (invalid ()) ? 'I' : 'i';
a61af66fc99e Initial load
duke
parents:
diff changeset
8054 f[8] = '\x0';
a61af66fc99e Initial load
duke
parents:
diff changeset
8055 // output
a61af66fc99e Initial load
duke
parents:
diff changeset
8056 printf("%04x masks = %s, %s, %s", _value & 0xFFFF, f, rc, pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
8057 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8058
a61af66fc99e Initial load
duke
parents:
diff changeset
8059 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8060
a61af66fc99e Initial load
duke
parents:
diff changeset
8061 class StatusWord {
a61af66fc99e Initial load
duke
parents:
diff changeset
8062 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8063 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
8064
a61af66fc99e Initial load
duke
parents:
diff changeset
8065 bool busy() const { return ((_value >> 15) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8066 bool C3() const { return ((_value >> 14) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8067 bool C2() const { return ((_value >> 10) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8068 bool C1() const { return ((_value >> 9) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8069 bool C0() const { return ((_value >> 8) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8070 int top() const { return (_value >> 11) & 7 ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8071 bool error_status() const { return ((_value >> 7) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8072 bool stack_fault() const { return ((_value >> 6) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8073 bool precision() const { return ((_value >> 5) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8074 bool underflow() const { return ((_value >> 4) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8075 bool overflow() const { return ((_value >> 3) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8076 bool zero_divide() const { return ((_value >> 2) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8077 bool denormalized() const { return ((_value >> 1) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8078 bool invalid() const { return ((_value >> 0) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8079
a61af66fc99e Initial load
duke
parents:
diff changeset
8080 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8081 // condition codes
a61af66fc99e Initial load
duke
parents:
diff changeset
8082 char c[5];
a61af66fc99e Initial load
duke
parents:
diff changeset
8083 c[0] = (C3()) ? '3' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8084 c[1] = (C2()) ? '2' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8085 c[2] = (C1()) ? '1' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8086 c[3] = (C0()) ? '0' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8087 c[4] = '\x0';
a61af66fc99e Initial load
duke
parents:
diff changeset
8088 // flags
a61af66fc99e Initial load
duke
parents:
diff changeset
8089 char f[9];
a61af66fc99e Initial load
duke
parents:
diff changeset
8090 f[0] = (error_status()) ? 'E' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8091 f[1] = (stack_fault ()) ? 'S' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8092 f[2] = (precision ()) ? 'P' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8093 f[3] = (underflow ()) ? 'U' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8094 f[4] = (overflow ()) ? 'O' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8095 f[5] = (zero_divide ()) ? 'Z' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8096 f[6] = (denormalized()) ? 'D' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8097 f[7] = (invalid ()) ? 'I' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8098 f[8] = '\x0';
a61af66fc99e Initial load
duke
parents:
diff changeset
8099 // output
a61af66fc99e Initial load
duke
parents:
diff changeset
8100 printf("%04x flags = %s, cc = %s, top = %d", _value & 0xFFFF, f, c, top());
a61af66fc99e Initial load
duke
parents:
diff changeset
8101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8102
a61af66fc99e Initial load
duke
parents:
diff changeset
8103 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8104
a61af66fc99e Initial load
duke
parents:
diff changeset
8105 class TagWord {
a61af66fc99e Initial load
duke
parents:
diff changeset
8106 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8107 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
8108
a61af66fc99e Initial load
duke
parents:
diff changeset
8109 int tag_at(int i) const { return (_value >> (i*2)) & 3; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8110
a61af66fc99e Initial load
duke
parents:
diff changeset
8111 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8112 printf("%04x", _value & 0xFFFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
8113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8114
a61af66fc99e Initial load
duke
parents:
diff changeset
8115 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8116
a61af66fc99e Initial load
duke
parents:
diff changeset
8117 class FPU_Register {
a61af66fc99e Initial load
duke
parents:
diff changeset
8118 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8119 int32_t _m0;
a61af66fc99e Initial load
duke
parents:
diff changeset
8120 int32_t _m1;
a61af66fc99e Initial load
duke
parents:
diff changeset
8121 int16_t _ex;
a61af66fc99e Initial load
duke
parents:
diff changeset
8122
a61af66fc99e Initial load
duke
parents:
diff changeset
8123 bool is_indefinite() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8124 return _ex == -1 && _m1 == (int32_t)0xC0000000 && _m0 == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
8125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8126
a61af66fc99e Initial load
duke
parents:
diff changeset
8127 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8128 char sign = (_ex < 0) ? '-' : '+';
a61af66fc99e Initial load
duke
parents:
diff changeset
8129 const char* kind = (_ex == 0x7FFF || _ex == (int16_t)-1) ? "NaN" : " ";
a61af66fc99e Initial load
duke
parents:
diff changeset
8130 printf("%c%04hx.%08x%08x %s", sign, _ex, _m1, _m0, kind);
a61af66fc99e Initial load
duke
parents:
diff changeset
8131 };
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 class FPU_State {
a61af66fc99e Initial load
duke
parents:
diff changeset
8136 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8137 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
8138 register_size = 10,
a61af66fc99e Initial load
duke
parents:
diff changeset
8139 number_of_registers = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
8140 register_mask = 7
a61af66fc99e Initial load
duke
parents:
diff changeset
8141 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8142
a61af66fc99e Initial load
duke
parents:
diff changeset
8143 ControlWord _control_word;
a61af66fc99e Initial load
duke
parents:
diff changeset
8144 StatusWord _status_word;
a61af66fc99e Initial load
duke
parents:
diff changeset
8145 TagWord _tag_word;
a61af66fc99e Initial load
duke
parents:
diff changeset
8146 int32_t _error_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
8147 int32_t _error_selector;
a61af66fc99e Initial load
duke
parents:
diff changeset
8148 int32_t _data_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
8149 int32_t _data_selector;
a61af66fc99e Initial load
duke
parents:
diff changeset
8150 int8_t _register[register_size * number_of_registers];
a61af66fc99e Initial load
duke
parents:
diff changeset
8151
a61af66fc99e Initial load
duke
parents:
diff changeset
8152 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
8153 FPU_Register* st(int i) const { return (FPU_Register*)&_register[register_size * i]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8154
a61af66fc99e Initial load
duke
parents:
diff changeset
8155 const char* tag_as_string(int tag) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8156 switch (tag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8157 case 0: return "valid";
a61af66fc99e Initial load
duke
parents:
diff changeset
8158 case 1: return "zero";
a61af66fc99e Initial load
duke
parents:
diff changeset
8159 case 2: return "special";
a61af66fc99e Initial load
duke
parents:
diff changeset
8160 case 3: return "empty";
a61af66fc99e Initial load
duke
parents:
diff changeset
8161 }
1489
cff162798819 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 1369
diff changeset
8162 ShouldNotReachHere();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8163 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
8164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8165
a61af66fc99e Initial load
duke
parents:
diff changeset
8166 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8167 // print computation registers
a61af66fc99e Initial load
duke
parents:
diff changeset
8168 { int t = _status_word.top();
a61af66fc99e Initial load
duke
parents:
diff changeset
8169 for (int i = 0; i < number_of_registers; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8170 int j = (i - t) & register_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
8171 printf("%c r%d = ST%d = ", (j == 0 ? '*' : ' '), i, j);
a61af66fc99e Initial load
duke
parents:
diff changeset
8172 st(j)->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8173 printf(" %s\n", tag_as_string(_tag_word.tag_at(i)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8176 printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8177 // print control registers
a61af66fc99e Initial load
duke
parents:
diff changeset
8178 printf("ctrl = "); _control_word.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8179 printf("stat = "); _status_word .print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8180 printf("tags = "); _tag_word .print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8182
a61af66fc99e Initial load
duke
parents:
diff changeset
8183 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8184
a61af66fc99e Initial load
duke
parents:
diff changeset
8185 class Flag_Register {
a61af66fc99e Initial load
duke
parents:
diff changeset
8186 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8187 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
8188
a61af66fc99e Initial load
duke
parents:
diff changeset
8189 bool overflow() const { return ((_value >> 11) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8190 bool direction() const { return ((_value >> 10) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8191 bool sign() const { return ((_value >> 7) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8192 bool zero() const { return ((_value >> 6) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8193 bool auxiliary_carry() const { return ((_value >> 4) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8194 bool parity() const { return ((_value >> 2) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8195 bool carry() const { return ((_value >> 0) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8196
a61af66fc99e Initial load
duke
parents:
diff changeset
8197 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8198 // flags
a61af66fc99e Initial load
duke
parents:
diff changeset
8199 char f[8];
a61af66fc99e Initial load
duke
parents:
diff changeset
8200 f[0] = (overflow ()) ? 'O' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8201 f[1] = (direction ()) ? 'D' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8202 f[2] = (sign ()) ? 'S' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8203 f[3] = (zero ()) ? 'Z' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8204 f[4] = (auxiliary_carry()) ? 'A' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8205 f[5] = (parity ()) ? 'P' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8206 f[6] = (carry ()) ? 'C' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8207 f[7] = '\x0';
a61af66fc99e Initial load
duke
parents:
diff changeset
8208 // output
a61af66fc99e Initial load
duke
parents:
diff changeset
8209 printf("%08x flags = %s", _value, f);
a61af66fc99e Initial load
duke
parents:
diff changeset
8210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8211
a61af66fc99e Initial load
duke
parents:
diff changeset
8212 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8213
a61af66fc99e Initial load
duke
parents:
diff changeset
8214 class IU_Register {
a61af66fc99e Initial load
duke
parents:
diff changeset
8215 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8216 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
8217
a61af66fc99e Initial load
duke
parents:
diff changeset
8218 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8219 printf("%08x %11d", _value, _value);
a61af66fc99e Initial load
duke
parents:
diff changeset
8220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8221
a61af66fc99e Initial load
duke
parents:
diff changeset
8222 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8223
a61af66fc99e Initial load
duke
parents:
diff changeset
8224 class IU_State {
a61af66fc99e Initial load
duke
parents:
diff changeset
8225 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8226 Flag_Register _eflags;
a61af66fc99e Initial load
duke
parents:
diff changeset
8227 IU_Register _rdi;
a61af66fc99e Initial load
duke
parents:
diff changeset
8228 IU_Register _rsi;
a61af66fc99e Initial load
duke
parents:
diff changeset
8229 IU_Register _rbp;
a61af66fc99e Initial load
duke
parents:
diff changeset
8230 IU_Register _rsp;
a61af66fc99e Initial load
duke
parents:
diff changeset
8231 IU_Register _rbx;
a61af66fc99e Initial load
duke
parents:
diff changeset
8232 IU_Register _rdx;
a61af66fc99e Initial load
duke
parents:
diff changeset
8233 IU_Register _rcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
8234 IU_Register _rax;
a61af66fc99e Initial load
duke
parents:
diff changeset
8235
a61af66fc99e Initial load
duke
parents:
diff changeset
8236 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8237 // computation registers
a61af66fc99e Initial load
duke
parents:
diff changeset
8238 printf("rax, = "); _rax.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8239 printf("rbx, = "); _rbx.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8240 printf("rcx = "); _rcx.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8241 printf("rdx = "); _rdx.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8242 printf("rdi = "); _rdi.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8243 printf("rsi = "); _rsi.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8244 printf("rbp, = "); _rbp.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8245 printf("rsp = "); _rsp.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8246 printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8247 // control registers
a61af66fc99e Initial load
duke
parents:
diff changeset
8248 printf("flgs = "); _eflags.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8250 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8251
a61af66fc99e Initial load
duke
parents:
diff changeset
8252
a61af66fc99e Initial load
duke
parents:
diff changeset
8253 class CPU_State {
a61af66fc99e Initial load
duke
parents:
diff changeset
8254 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8255 FPU_State _fpu_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
8256 IU_State _iu_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
8257
a61af66fc99e Initial load
duke
parents:
diff changeset
8258 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8259 printf("--------------------------------------------------\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8260 _iu_state .print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8261 printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8262 _fpu_state.print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8263 printf("--------------------------------------------------\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8265
a61af66fc99e Initial load
duke
parents:
diff changeset
8266 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8267
a61af66fc99e Initial load
duke
parents:
diff changeset
8268
a61af66fc99e Initial load
duke
parents:
diff changeset
8269 static void _print_CPU_state(CPU_State* state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8270 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8271 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8272
a61af66fc99e Initial load
duke
parents:
diff changeset
8273
a61af66fc99e Initial load
duke
parents:
diff changeset
8274 void MacroAssembler::print_CPU_state() {
a61af66fc99e Initial load
duke
parents:
diff changeset
8275 push_CPU_state();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8276 push(rsp); // pass CPU state
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8277 call(RuntimeAddress(CAST_FROM_FN_PTR(address, _print_CPU_state)));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8278 addptr(rsp, wordSize); // discard argument
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8279 pop_CPU_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
8280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8281
a61af66fc99e Initial load
duke
parents:
diff changeset
8282
a61af66fc99e Initial load
duke
parents:
diff changeset
8283 static bool _verify_FPU(int stack_depth, char* s, CPU_State* state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8284 static int counter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
8285 FPU_State* fs = &state->_fpu_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
8286 counter++;
a61af66fc99e Initial load
duke
parents:
diff changeset
8287 // For leaf calls, only verify that the top few elements remain empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
8288 // We only need 1 empty at the top for C2 code.
a61af66fc99e Initial load
duke
parents:
diff changeset
8289 if( stack_depth < 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8290 if( fs->tag_for_st(7) != 3 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8291 printf("FPR7 not empty\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8292 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8293 assert(false, "error");
a61af66fc99e Initial load
duke
parents:
diff changeset
8294 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
8295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8296 return true; // All other stack states do not matter
a61af66fc99e Initial load
duke
parents:
diff changeset
8297 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8298
a61af66fc99e Initial load
duke
parents:
diff changeset
8299 assert((fs->_control_word._value & 0xffff) == StubRoutines::_fpu_cntrl_wrd_std,
a61af66fc99e Initial load
duke
parents:
diff changeset
8300 "bad FPU control word");
a61af66fc99e Initial load
duke
parents:
diff changeset
8301
a61af66fc99e Initial load
duke
parents:
diff changeset
8302 // compute stack depth
a61af66fc99e Initial load
duke
parents:
diff changeset
8303 int i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
8304 while (i < FPU_State::number_of_registers && fs->tag_for_st(i) < 3) i++;
a61af66fc99e Initial load
duke
parents:
diff changeset
8305 int d = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
8306 while (i < FPU_State::number_of_registers && fs->tag_for_st(i) == 3) i++;
a61af66fc99e Initial load
duke
parents:
diff changeset
8307 // verify findings
a61af66fc99e Initial load
duke
parents:
diff changeset
8308 if (i != FPU_State::number_of_registers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8309 // stack not contiguous
a61af66fc99e Initial load
duke
parents:
diff changeset
8310 printf("%s: stack not contiguous at ST%d\n", s, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
8311 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8312 assert(false, "error");
a61af66fc99e Initial load
duke
parents:
diff changeset
8313 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
8314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8315 // check if computed stack depth corresponds to expected stack depth
a61af66fc99e Initial load
duke
parents:
diff changeset
8316 if (stack_depth < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8317 // expected stack depth is -stack_depth or less
a61af66fc99e Initial load
duke
parents:
diff changeset
8318 if (d > -stack_depth) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8319 // too many elements on the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
8320 printf("%s: <= %d stack elements expected but found %d\n", s, -stack_depth, d);
a61af66fc99e Initial load
duke
parents:
diff changeset
8321 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8322 assert(false, "error");
a61af66fc99e Initial load
duke
parents:
diff changeset
8323 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
8324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8325 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
8326 // expected stack depth is stack_depth
a61af66fc99e Initial load
duke
parents:
diff changeset
8327 if (d != stack_depth) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8328 // wrong stack depth
a61af66fc99e Initial load
duke
parents:
diff changeset
8329 printf("%s: %d stack elements expected but found %d\n", s, stack_depth, d);
a61af66fc99e Initial load
duke
parents:
diff changeset
8330 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8331 assert(false, "error");
a61af66fc99e Initial load
duke
parents:
diff changeset
8332 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
8333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8335 // everything is cool
a61af66fc99e Initial load
duke
parents:
diff changeset
8336 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
8337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8338
a61af66fc99e Initial load
duke
parents:
diff changeset
8339
a61af66fc99e Initial load
duke
parents:
diff changeset
8340 void MacroAssembler::verify_FPU(int stack_depth, const char* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8341 if (!VerifyFPU) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
8342 push_CPU_state();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8343 push(rsp); // pass CPU state
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8344 ExternalAddress msg((address) s);
a61af66fc99e Initial load
duke
parents:
diff changeset
8345 // pass message string s
a61af66fc99e Initial load
duke
parents:
diff changeset
8346 pushptr(msg.addr());
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8347 push(stack_depth); // pass stack depth
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8348 call(RuntimeAddress(CAST_FROM_FN_PTR(address, _verify_FPU)));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8349 addptr(rsp, 3 * wordSize); // discard arguments
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8350 // check for error
a61af66fc99e Initial load
duke
parents:
diff changeset
8351 { Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
8352 testl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
8353 jcc(Assembler::notZero, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
8354 int3(); // break if error condition
a61af66fc99e Initial load
duke
parents:
diff changeset
8355 bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
8356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8357 pop_CPU_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
8358 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8359
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8360 void MacroAssembler::load_klass(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8361 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8362 if (UseCompressedOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8363 movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8364 decode_heap_oop_not_null(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8365 } else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8366 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8367 movptr(dst, Address(src, oopDesc::klass_offset_in_bytes()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8368 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8369
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8370 void MacroAssembler::load_prototype_header(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8371 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8372 if (UseCompressedOops) {
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8373 assert (Universe::heap() != NULL, "java heap should be initialized");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8374 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
8375 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
8376 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
8377 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
8378 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
8379 } else {
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8380 // 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
8381 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
8382 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
8383 }
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8384 } else {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8385 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
8386 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8387 } else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8388 #endif
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8389 {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8390 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
8391 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
8392 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8393 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8394
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8395 void MacroAssembler::store_klass(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8396 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8397 if (UseCompressedOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8398 encode_heap_oop_not_null(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8399 movl(Address(dst, oopDesc::klass_offset_in_bytes()), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8400 } else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8401 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8402 movptr(Address(dst, oopDesc::klass_offset_in_bytes()), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8403 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8404
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8405 void MacroAssembler::load_heap_oop(Register dst, Address src) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8406 #ifdef _LP64
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8407 if (UseCompressedOops) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8408 movl(dst, src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8409 decode_heap_oop(dst);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8410 } else
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8411 #endif
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8412 movptr(dst, src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8413 }
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8414
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8415 void MacroAssembler::store_heap_oop(Address dst, Register src) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8416 #ifdef _LP64
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8417 if (UseCompressedOops) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8418 assert(!dst.uses(src), "not enough registers");
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8419 encode_heap_oop(src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8420 movl(dst, src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8421 } else
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8422 #endif
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8423 movptr(dst, src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8424 }
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8425
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8426 // Used for storing NULLs.
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8427 void MacroAssembler::store_heap_oop_null(Address dst) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8428 #ifdef _LP64
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8429 if (UseCompressedOops) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8430 movl(dst, (int32_t)NULL_WORD);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8431 } else {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8432 movslq(dst, (int32_t)NULL_WORD);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8433 }
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8434 #else
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8435 movl(dst, (int32_t)NULL_WORD);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8436 #endif
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8437 }
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8438
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8439 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8440 void MacroAssembler::store_klass_gap(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8441 if (UseCompressedOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8442 // Store to klass gap in destination
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8443 movl(Address(dst, oopDesc::klass_gap_offset_in_bytes()), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8444 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8445 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8446
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8447 #ifdef ASSERT
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8448 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
8449 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
8450 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
8451 if (CheckCompressedOops) {
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8452 Label ok;
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8453 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
8454 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
8455 jcc(Assembler::equal, ok);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8456 stop(msg);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8457 bind(ok);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8458 pop(rscratch1);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8459 }
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8460 }
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8461 #endif
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8462
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8463 // Algorithm must match oop.inline.hpp encode_heap_oop.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8464 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
8465 #ifdef ASSERT
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8466 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
8467 #endif
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8468 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
8469 if (Universe::narrow_oop_base() == NULL) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8470 if (Universe::narrow_oop_shift() != 0) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8471 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
8472 shrq(r, LogMinObjAlignmentInBytes);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8473 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8474 return;
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8475 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8476 testq(r, r);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8477 cmovq(Assembler::equal, r, r12_heapbase);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8478 subq(r, r12_heapbase);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8479 shrq(r, LogMinObjAlignmentInBytes);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8480 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8481
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8482 void MacroAssembler::encode_heap_oop_not_null(Register r) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8483 #ifdef ASSERT
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8484 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
8485 if (CheckCompressedOops) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8486 Label ok;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8487 testq(r, r);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8488 jcc(Assembler::notEqual, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8489 stop("null oop passed to encode_heap_oop_not_null");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8490 bind(ok);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8491 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8492 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8493 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
8494 if (Universe::narrow_oop_base() != NULL) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8495 subq(r, r12_heapbase);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8496 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8497 if (Universe::narrow_oop_shift() != 0) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8498 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
8499 shrq(r, LogMinObjAlignmentInBytes);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8500 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8501 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8502
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8503 void MacroAssembler::encode_heap_oop_not_null(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8504 #ifdef ASSERT
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8505 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
8506 if (CheckCompressedOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8507 Label ok;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8508 testq(src, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8509 jcc(Assembler::notEqual, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8510 stop("null oop passed to encode_heap_oop_not_null2");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8511 bind(ok);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8512 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8513 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8514 verify_oop(src, "broken oop in encode_heap_oop_not_null2");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8515 if (dst != src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8516 movq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8517 }
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8518 if (Universe::narrow_oop_base() != NULL) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8519 subq(dst, r12_heapbase);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8520 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8521 if (Universe::narrow_oop_shift() != 0) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8522 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
8523 shrq(dst, LogMinObjAlignmentInBytes);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8524 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8525 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8526
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8527 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
8528 #ifdef ASSERT
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8529 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
8530 #endif
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8531 if (Universe::narrow_oop_base() == NULL) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8532 if (Universe::narrow_oop_shift() != 0) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8533 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
8534 shlq(r, LogMinObjAlignmentInBytes);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8535 }
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8536 } else {
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8537 Label done;
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8538 shlq(r, LogMinObjAlignmentInBytes);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8539 jccb(Assembler::equal, done);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8540 addq(r, r12_heapbase);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8541 bind(done);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8542 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8543 verify_oop(r, "broken oop in decode_heap_oop");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8544 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8545
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8546 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
8547 // Note: it will change flags
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8548 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
8549 assert (Universe::heap() != NULL, "java heap should be initialized");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8550 // Cannot assert, unverified entry point counts instructions (see .ad file)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8551 // vtableStubs also counts instructions in pd_code_size_limit.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8552 // 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
8553 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
8554 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
8555 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
8556 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
8557 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
8558 }
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8559 } else {
898
60fea60a6db5 6864914: SPECjvm2008 produces invalid result with zero based Compressed Oops
kvn
parents: 845
diff changeset
8560 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
8561 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8562 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8563
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8564 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
8565 // Note: it will change flags
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8566 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
8567 assert (Universe::heap() != NULL, "java heap should be initialized");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8568 // Cannot assert, unverified entry point counts instructions (see .ad file)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8569 // vtableStubs also counts instructions in pd_code_size_limit.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8570 // 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
8571 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
8572 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
8573 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
8574 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
8575 } else {
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8576 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
8577 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
8578 }
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8579 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
8580 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
8581 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
8582 }
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8583 }
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8584 } else {
898
60fea60a6db5 6864914: SPECjvm2008 produces invalid result with zero based Compressed Oops
kvn
parents: 845
diff changeset
8585 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
8586 if (dst != src) {
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8587 movq(dst, src);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8588 }
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8589 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8590 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8591
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8592 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
8593 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
8594 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
8595 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
8596 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
8597 RelocationHolder rspec = oop_Relocation::spec(oop_index);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8598 mov_narrow_oop(dst, oop_index, rspec);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8599 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8600
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8601 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
8602 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
8603 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
8604 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8605 int oop_index = oop_recorder()->find_index(obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8606 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
8607 mov_narrow_oop(dst, oop_index, rspec);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8608 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8609
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8610 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
8611 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
8612 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
8613 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
8614 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
8615 RelocationHolder rspec = oop_Relocation::spec(oop_index);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8616 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
8617 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8618
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8619 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
8620 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
8621 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
8622 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
8623 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
8624 RelocationHolder rspec = oop_Relocation::spec(oop_index);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8625 Assembler::cmp_narrow_oop(dst, oop_index, rspec);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8626 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8627
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8628 void MacroAssembler::reinit_heapbase() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8629 if (UseCompressedOops) {
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8630 movptr(r12_heapbase, ExternalAddress((address)Universe::narrow_oop_base_addr()));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8631 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8632 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8633 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8634
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8635 // IndexOf for constant substrings with size >= 8 chars
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8636 // which don't need to be loaded through stack.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8637 void MacroAssembler::string_indexofC8(Register str1, Register str2,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8638 Register cnt1, Register cnt2,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8639 int int_cnt2, Register result,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8640 XMMRegister vec, Register tmp) {
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8641 assert(UseSSE42Intrinsics, "SSE4.2 is required");
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8642
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8643 // This method uses pcmpestri inxtruction with bound registers
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8644 // inputs:
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8645 // xmm - substring
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8646 // rax - substring length (elements count)
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8647 // mem - scanned string
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8648 // rdx - string length (elements count)
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8649 // 0xd - mode: 1100 (substring search) + 01 (unsigned shorts)
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8650 // outputs:
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8651 // rcx - matched index in string
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8652 assert(cnt1 == rdx && cnt2 == rax && tmp == rcx, "pcmpestri");
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8653
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8654 Label RELOAD_SUBSTR, SCAN_TO_SUBSTR, SCAN_SUBSTR,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8655 RET_FOUND, RET_NOT_FOUND, EXIT, FOUND_SUBSTR,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8656 MATCH_SUBSTR_HEAD, RELOAD_STR, FOUND_CANDIDATE;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8657
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8658 // Note, inline_string_indexOf() generates checks:
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8659 // if (substr.count > string.count) return -1;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8660 // if (substr.count == 0) return 0;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8661 assert(int_cnt2 >= 8, "this code isused only for cnt2 >= 8 chars");
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8662
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8663 // Load substring.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8664 movdqu(vec, Address(str2, 0));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8665 movl(cnt2, int_cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8666 movptr(result, str1); // string addr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8667
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8668 if (int_cnt2 > 8) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8669 jmpb(SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8670
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8671 // Reload substr for rescan, this code
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8672 // is executed only for large substrings (> 8 chars)
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8673 bind(RELOAD_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8674 movdqu(vec, Address(str2, 0));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8675 negptr(cnt2); // Jumped here with negative cnt2, convert to positive
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8676
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8677 bind(RELOAD_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8678 // We came here after the beginning of the substring was
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8679 // matched but the rest of it was not so we need to search
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8680 // again. Start from the next element after the previous match.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8681
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8682 // cnt2 is number of substring reminding elements and
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8683 // cnt1 is number of string reminding elements when cmp failed.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8684 // Restored cnt1 = cnt1 - cnt2 + int_cnt2
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8685 subl(cnt1, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8686 addl(cnt1, int_cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8687 movl(cnt2, int_cnt2); // Now restore cnt2
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8688
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8689 decrementl(cnt1); // Shift to next element
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8690 cmpl(cnt1, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8691 jccb(Assembler::negative, RET_NOT_FOUND); // Left less then substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8692
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8693 addptr(result, 2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8694
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8695 } // (int_cnt2 > 8)
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8696
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8697 // Scan string for start of substr in 16-byte vectors
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8698 bind(SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8699 pcmpestri(vec, Address(result, 0), 0x0d);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8700 jccb(Assembler::below, FOUND_CANDIDATE); // CF == 1
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8701 subl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8702 jccb(Assembler::lessEqual, RET_NOT_FOUND); // Scanned full string
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8703 cmpl(cnt1, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8704 jccb(Assembler::negative, RET_NOT_FOUND); // Left less then substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8705 addptr(result, 16);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8706 jmpb(SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8707
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8708 // Found a potential substr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8709 bind(FOUND_CANDIDATE);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8710 // Matched whole vector if first element matched (tmp(rcx) == 0).
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8711 if (int_cnt2 == 8) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8712 jccb(Assembler::overflow, RET_FOUND); // OF == 1
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8713 } else { // int_cnt2 > 8
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8714 jccb(Assembler::overflow, FOUND_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8715 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8716 // After pcmpestri tmp(rcx) contains matched element index
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8717 // Compute start addr of substr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8718 lea(result, Address(result, tmp, Address::times_2));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8719
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8720 // Make sure string is still long enough
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8721 subl(cnt1, tmp);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8722 cmpl(cnt1, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8723 if (int_cnt2 == 8) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8724 jccb(Assembler::greaterEqual, SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8725 } else { // int_cnt2 > 8
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8726 jccb(Assembler::greaterEqual, MATCH_SUBSTR_HEAD);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8727 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8728 // Left less then substring.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8729
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8730 bind(RET_NOT_FOUND);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8731 movl(result, -1);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8732 jmpb(EXIT);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8733
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8734 if (int_cnt2 > 8) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8735 // This code is optimized for the case when whole substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8736 // is matched if its head is matched.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8737 bind(MATCH_SUBSTR_HEAD);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8738 pcmpestri(vec, Address(result, 0), 0x0d);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8739 // Reload only string if does not match
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8740 jccb(Assembler::noOverflow, RELOAD_STR); // OF == 0
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8741
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8742 Label CONT_SCAN_SUBSTR;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8743 // Compare the rest of substring (> 8 chars).
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8744 bind(FOUND_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8745 // First 8 chars are already matched.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8746 negptr(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8747 addptr(cnt2, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8748
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8749 bind(SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8750 subl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8751 cmpl(cnt2, -8); // Do not read beyond substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8752 jccb(Assembler::lessEqual, CONT_SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8753 // Back-up strings to avoid reading beyond substring:
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8754 // cnt1 = cnt1 - cnt2 + 8
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8755 addl(cnt1, cnt2); // cnt2 is negative
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8756 addl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8757 movl(cnt2, 8); negptr(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8758 bind(CONT_SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8759 if (int_cnt2 < (int)G) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8760 movdqu(vec, Address(str2, cnt2, Address::times_2, int_cnt2*2));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8761 pcmpestri(vec, Address(result, cnt2, Address::times_2, int_cnt2*2), 0x0d);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8762 } else {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8763 // calculate index in register to avoid integer overflow (int_cnt2*2)
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8764 movl(tmp, int_cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8765 addptr(tmp, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8766 movdqu(vec, Address(str2, tmp, Address::times_2, 0));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8767 pcmpestri(vec, Address(result, tmp, Address::times_2, 0), 0x0d);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8768 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8769 // Need to reload strings pointers if not matched whole vector
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8770 jccb(Assembler::noOverflow, RELOAD_SUBSTR); // OF == 0
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8771 addptr(cnt2, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8772 jccb(Assembler::negative, SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8773 // Fall through if found full substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8774
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8775 } // (int_cnt2 > 8)
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8776
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8777 bind(RET_FOUND);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8778 // Found result if we matched full small substring.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8779 // Compute substr offset
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8780 subptr(result, str1);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8781 shrl(result, 1); // index
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8782 bind(EXIT);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8783
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8784 } // string_indexofC8
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8785
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8786 // Small strings are loaded through stack if they cross page boundary.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8787 void MacroAssembler::string_indexof(Register str1, Register str2,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8788 Register cnt1, Register cnt2,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8789 int int_cnt2, Register result,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8790 XMMRegister vec, Register tmp) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8791 assert(UseSSE42Intrinsics, "SSE4.2 is required");
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8792 //
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8793 // int_cnt2 is length of small (< 8 chars) constant substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8794 // or (-1) for non constant substring in which case its length
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8795 // is in cnt2 register.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8796 //
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8797 // Note, inline_string_indexOf() generates checks:
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8798 // if (substr.count > string.count) return -1;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8799 // if (substr.count == 0) return 0;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8800 //
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8801 assert(int_cnt2 == -1 || (0 < int_cnt2 && int_cnt2 < 8), "should be != 0");
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8802
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8803 // This method uses pcmpestri inxtruction with bound registers
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8804 // inputs:
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8805 // xmm - substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8806 // rax - substring length (elements count)
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8807 // mem - scanned string
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8808 // rdx - string length (elements count)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8809 // 0xd - mode: 1100 (substring search) + 01 (unsigned shorts)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8810 // outputs:
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8811 // rcx - matched index in string
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8812 assert(cnt1 == rdx && cnt2 == rax && tmp == rcx, "pcmpestri");
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8813
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8814 Label RELOAD_SUBSTR, SCAN_TO_SUBSTR, SCAN_SUBSTR, ADJUST_STR,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8815 RET_FOUND, RET_NOT_FOUND, CLEANUP, FOUND_SUBSTR,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8816 FOUND_CANDIDATE;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8817
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8818 { //========================================================
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8819 // We don't know where these strings are located
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8820 // and we can't read beyond them. Load them through stack.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8821 Label BIG_STRINGS, CHECK_STR, COPY_SUBSTR, COPY_STR;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8822
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8823 movptr(tmp, rsp); // save old SP
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8824
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8825 if (int_cnt2 > 0) { // small (< 8 chars) constant substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8826 if (int_cnt2 == 1) { // One char
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8827 load_unsigned_short(result, Address(str2, 0));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8828 movdl(vec, result); // move 32 bits
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8829 } else if (int_cnt2 == 2) { // Two chars
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8830 movdl(vec, Address(str2, 0)); // move 32 bits
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8831 } else if (int_cnt2 == 4) { // Four chars
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8832 movq(vec, Address(str2, 0)); // move 64 bits
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8833 } else { // cnt2 = { 3, 5, 6, 7 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8834 // Array header size is 12 bytes in 32-bit VM
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8835 // + 6 bytes for 3 chars == 18 bytes,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8836 // enough space to load vec and shift.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8837 assert(HeapWordSize*typeArrayKlass::header_size() >= 12,"sanity");
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8838 movdqu(vec, Address(str2, (int_cnt2*2)-16));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8839 psrldq(vec, 16-(int_cnt2*2));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8840 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8841 } else { // not constant substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8842 cmpl(cnt2, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8843 jccb(Assembler::aboveEqual, BIG_STRINGS); // Both strings are big enough
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8844
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8845 // We can read beyond string if srt+16 does not cross page boundary
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8846 // since heaps are aligned and mapped by pages.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8847 assert(os::vm_page_size() < (int)G, "default page should be small");
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8848 movl(result, str2); // We need only low 32 bits
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8849 andl(result, (os::vm_page_size()-1));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8850 cmpl(result, (os::vm_page_size()-16));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8851 jccb(Assembler::belowEqual, CHECK_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8852
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8853 // Move small strings to stack to allow load 16 bytes into vec.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8854 subptr(rsp, 16);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8855 int stk_offset = wordSize-2;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8856 push(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8857
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8858 bind(COPY_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8859 load_unsigned_short(result, Address(str2, cnt2, Address::times_2, -2));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8860 movw(Address(rsp, cnt2, Address::times_2, stk_offset), result);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8861 decrement(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8862 jccb(Assembler::notZero, COPY_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8863
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8864 pop(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8865 movptr(str2, rsp); // New substring address
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8866 } // non constant
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8867
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8868 bind(CHECK_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8869 cmpl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8870 jccb(Assembler::aboveEqual, BIG_STRINGS);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8871
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8872 // Check cross page boundary.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8873 movl(result, str1); // We need only low 32 bits
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8874 andl(result, (os::vm_page_size()-1));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8875 cmpl(result, (os::vm_page_size()-16));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8876 jccb(Assembler::belowEqual, BIG_STRINGS);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8877
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8878 subptr(rsp, 16);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8879 int stk_offset = -2;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8880 if (int_cnt2 < 0) { // not constant
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8881 push(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8882 stk_offset += wordSize;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8883 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8884 movl(cnt2, cnt1);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8885
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8886 bind(COPY_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8887 load_unsigned_short(result, Address(str1, cnt2, Address::times_2, -2));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8888 movw(Address(rsp, cnt2, Address::times_2, stk_offset), result);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8889 decrement(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8890 jccb(Assembler::notZero, COPY_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8891
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8892 if (int_cnt2 < 0) { // not constant
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8893 pop(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8894 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8895 movptr(str1, rsp); // New string address
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8896
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8897 bind(BIG_STRINGS);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8898 // Load substring.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8899 if (int_cnt2 < 0) { // -1
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8900 movdqu(vec, Address(str2, 0));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8901 push(cnt2); // substr count
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8902 push(str2); // substr addr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8903 push(str1); // string addr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8904 } else {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8905 // Small (< 8 chars) constant substrings are loaded already.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8906 movl(cnt2, int_cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8907 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8908 push(tmp); // original SP
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8909
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8910 } // Finished loading
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8911
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8912 //========================================================
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8913 // Start search
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8914 //
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8915
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8916 movptr(result, str1); // string addr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8917
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8918 if (int_cnt2 < 0) { // Only for non constant substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8919 jmpb(SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8920
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8921 // SP saved at sp+0
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8922 // String saved at sp+1*wordSize
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8923 // Substr saved at sp+2*wordSize
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8924 // Substr count saved at sp+3*wordSize
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8925
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8926 // Reload substr for rescan, this code
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8927 // is executed only for large substrings (> 8 chars)
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8928 bind(RELOAD_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8929 movptr(str2, Address(rsp, 2*wordSize));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8930 movl(cnt2, Address(rsp, 3*wordSize));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8931 movdqu(vec, Address(str2, 0));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8932 // We came here after the beginning of the substring was
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8933 // matched but the rest of it was not so we need to search
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8934 // again. Start from the next element after the previous match.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8935 subptr(str1, result); // Restore counter
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8936 shrl(str1, 1);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8937 addl(cnt1, str1);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8938 decrementl(cnt1); // Shift to next element
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8939 cmpl(cnt1, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8940 jccb(Assembler::negative, RET_NOT_FOUND); // Left less then substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8941
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8942 addptr(result, 2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8943 } // non constant
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8944
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8945 // Scan string for start of substr in 16-byte vectors
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8946 bind(SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8947 assert(cnt1 == rdx && cnt2 == rax && tmp == rcx, "pcmpestri");
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8948 pcmpestri(vec, Address(result, 0), 0x0d);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8949 jccb(Assembler::below, FOUND_CANDIDATE); // CF == 1
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8950 subl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8951 jccb(Assembler::lessEqual, RET_NOT_FOUND); // Scanned full string
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8952 cmpl(cnt1, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8953 jccb(Assembler::negative, RET_NOT_FOUND); // Left less then substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8954 addptr(result, 16);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8955
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8956 bind(ADJUST_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8957 cmpl(cnt1, 8); // Do not read beyond string
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8958 jccb(Assembler::greaterEqual, SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8959 // Back-up string to avoid reading beyond string.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8960 lea(result, Address(result, cnt1, Address::times_2, -16));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8961 movl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8962 jmpb(SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8963
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8964 // Found a potential substr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8965 bind(FOUND_CANDIDATE);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8966 // After pcmpestri tmp(rcx) contains matched element index
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8967
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8968 // Make sure string is still long enough
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8969 subl(cnt1, tmp);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8970 cmpl(cnt1, cnt2);
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8971 jccb(Assembler::greaterEqual, FOUND_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8972 // Left less then substring.
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8973
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8974 bind(RET_NOT_FOUND);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8975 movl(result, -1);
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8976 jmpb(CLEANUP);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8977
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8978 bind(FOUND_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8979 // Compute start addr of substr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8980 lea(result, Address(result, tmp, Address::times_2));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8981
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8982 if (int_cnt2 > 0) { // Constant substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8983 // Repeat search for small substring (< 8 chars)
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8984 // from new point without reloading substring.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8985 // Have to check that we don't read beyond string.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8986 cmpl(tmp, 8-int_cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8987 jccb(Assembler::greater, ADJUST_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8988 // Fall through if matched whole substring.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8989 } else { // non constant
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8990 assert(int_cnt2 == -1, "should be != 0");
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8991
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8992 addl(tmp, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8993 // Found result if we matched whole substring.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8994 cmpl(tmp, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8995 jccb(Assembler::lessEqual, RET_FOUND);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8996
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8997 // Repeat search for small substring (<= 8 chars)
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8998 // from new point 'str1' without reloading substring.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8999 cmpl(cnt2, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9000 // Have to check that we don't read beyond string.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9001 jccb(Assembler::lessEqual, ADJUST_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9002
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9003 Label CHECK_NEXT, CONT_SCAN_SUBSTR, RET_FOUND_LONG;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9004 // Compare the rest of substring (> 8 chars).
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9005 movptr(str1, result);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9006
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9007 cmpl(tmp, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9008 // First 8 chars are already matched.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9009 jccb(Assembler::equal, CHECK_NEXT);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9010
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9011 bind(SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9012 pcmpestri(vec, Address(str1, 0), 0x0d);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9013 // Need to reload strings pointers if not matched whole vector
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9014 jcc(Assembler::noOverflow, RELOAD_SUBSTR); // OF == 0
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9015
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9016 bind(CHECK_NEXT);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9017 subl(cnt2, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9018 jccb(Assembler::lessEqual, RET_FOUND_LONG); // Found full substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9019 addptr(str1, 16);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9020 addptr(str2, 16);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9021 subl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9022 cmpl(cnt2, 8); // Do not read beyond substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9023 jccb(Assembler::greaterEqual, CONT_SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9024 // Back-up strings to avoid reading beyond substring.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9025 lea(str2, Address(str2, cnt2, Address::times_2, -16));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9026 lea(str1, Address(str1, cnt2, Address::times_2, -16));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9027 subl(cnt1, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9028 movl(cnt2, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9029 addl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9030 bind(CONT_SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9031 movdqu(vec, Address(str2, 0));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9032 jmpb(SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9033
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9034 bind(RET_FOUND_LONG);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9035 movptr(str1, Address(rsp, wordSize));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9036 } // non constant
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9037
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9038 bind(RET_FOUND);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9039 // Compute substr offset
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9040 subptr(result, str1);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9041 shrl(result, 1); // index
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9042
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9043 bind(CLEANUP);
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9044 pop(rsp); // restore SP
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9045
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9046 } // string_indexof
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9047
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9048 // Compare strings.
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9049 void MacroAssembler::string_compare(Register str1, Register str2,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9050 Register cnt1, Register cnt2, Register result,
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9051 XMMRegister vec1) {
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9052 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
9053
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9054 // Compute the minimum of the string lengths and the
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9055 // difference of the string lengths (stack).
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9056 // Do the conditional move stuff
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9057 movl(result, cnt1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9058 subl(cnt1, cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9059 push(cnt1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9060 if (VM_Version::supports_cmov()) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9061 cmovl(Assembler::lessEqual, cnt2, result);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9062 } else {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9063 Label GT_LABEL;
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9064 jccb(Assembler::greater, GT_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9065 movl(cnt2, result);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9066 bind(GT_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9067 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9068
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9069 // Is the minimum length zero?
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9070 testl(cnt2, cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9071 jcc(Assembler::zero, LENGTH_DIFF_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9072
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9073 // Load first characters
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9074 load_unsigned_short(result, Address(str1, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9075 load_unsigned_short(cnt1, Address(str2, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9076
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9077 // Compare first characters
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9078 subl(result, cnt1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9079 jcc(Assembler::notZero, POP_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9080 decrementl(cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9081 jcc(Assembler::zero, LENGTH_DIFF_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9082
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9083 {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9084 // 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
9085 Label LSkip2;
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9086 // Check if the strings start at same location
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9087 cmpptr(str1, str2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9088 jccb(Assembler::notEqual, LSkip2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9089
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9090 // Check if the length difference is zero (from stack)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9091 cmpl(Address(rsp, 0), 0x0);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9092 jcc(Assembler::equal, LENGTH_DIFF_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9093
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9094 // Strings might not be equivalent
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9095 bind(LSkip2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9096 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9097
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9098 Address::ScaleFactor scale = Address::times_2;
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9099 int stride = 8;
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9100
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9101 // Advance to next element
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9102 addptr(str1, 16/stride);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9103 addptr(str2, 16/stride);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9104
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9105 if (UseSSE42Intrinsics) {
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9106 Label COMPARE_WIDE_VECTORS, VECTOR_NOT_EQUAL, COMPARE_TAIL;
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9107 int pcmpmask = 0x19;
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9108 // Setup to compare 16-byte vectors
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9109 movl(result, cnt2);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9110 andl(cnt2, ~(stride - 1)); // cnt2 holds the vector count
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9111 jccb(Assembler::zero, COMPARE_TAIL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9112
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9113 lea(str1, Address(str1, result, scale));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9114 lea(str2, Address(str2, result, scale));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9115 negptr(result);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9116
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9117 // pcmpestri
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9118 // inputs:
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9119 // vec1- substring
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9120 // rax - negative string length (elements count)
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9121 // mem - scaned string
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9122 // rdx - string length (elements count)
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9123 // pcmpmask - cmp mode: 11000 (string compare with negated result)
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9124 // + 00 (unsigned bytes) or + 01 (unsigned shorts)
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9125 // outputs:
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9126 // rcx - first mismatched element index
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9127 assert(result == rax && cnt2 == rdx && cnt1 == rcx, "pcmpestri");
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9128
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9129 bind(COMPARE_WIDE_VECTORS);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9130 movdqu(vec1, Address(str1, result, scale));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9131 pcmpestri(vec1, Address(str2, result, scale), pcmpmask);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9132 // After pcmpestri cnt1(rcx) contains mismatched element index
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9133
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9134 jccb(Assembler::below, VECTOR_NOT_EQUAL); // CF==1
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9135 addptr(result, stride);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9136 subptr(cnt2, stride);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9137 jccb(Assembler::notZero, COMPARE_WIDE_VECTORS);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9138
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9139 // compare wide vectors tail
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9140 testl(result, result);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9141 jccb(Assembler::zero, LENGTH_DIFF_LABEL);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9142
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9143 movl(cnt2, stride);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9144 movl(result, stride);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9145 negptr(result);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9146 movdqu(vec1, Address(str1, result, scale));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9147 pcmpestri(vec1, Address(str2, result, scale), pcmpmask);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9148 jccb(Assembler::aboveEqual, LENGTH_DIFF_LABEL);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9149
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9150 // Mismatched characters in the vectors
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9151 bind(VECTOR_NOT_EQUAL);
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9152 addptr(result, cnt1);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9153 movptr(cnt2, result);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9154 load_unsigned_short(result, Address(str1, cnt2, scale));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9155 load_unsigned_short(cnt1, Address(str2, cnt2, scale));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9156 subl(result, cnt1);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9157 jmpb(POP_LABEL);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9158
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9159 bind(COMPARE_TAIL); // limit is zero
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9160 movl(cnt2, result);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9161 // Fallthru to tail compare
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9162 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9163
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9164 // Shift str2 and str1 to the end of the arrays, negate min
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9165 lea(str1, Address(str1, cnt2, scale, 0));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9166 lea(str2, Address(str2, cnt2, scale, 0));
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9167 negptr(cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9168
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9169 // Compare the rest of the elements
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9170 bind(WHILE_HEAD_LABEL);
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9171 load_unsigned_short(result, Address(str1, cnt2, scale, 0));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9172 load_unsigned_short(cnt1, Address(str2, cnt2, scale, 0));
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9173 subl(result, cnt1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9174 jccb(Assembler::notZero, POP_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9175 increment(cnt2);
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9176 jccb(Assembler::notZero, WHILE_HEAD_LABEL);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9177
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9178 // 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
9179 bind(LENGTH_DIFF_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9180 pop(result);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9181 jmpb(DONE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9182
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9183 // Discard the stored length difference
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9184 bind(POP_LABEL);
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9185 pop(cnt1);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9186
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9187 // That's it
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9188 bind(DONE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9189 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9190
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9191 // Compare char[] arrays aligned to 4 bytes or substrings.
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9192 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
9193 Register limit, Register result, Register chr,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9194 XMMRegister vec1, XMMRegister vec2) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9195 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
9196
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9197 int length_offset = arrayOopDesc::length_offset_in_bytes();
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9198 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
9199
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9200 // Check the input args
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9201 cmpptr(ary1, ary2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9202 jcc(Assembler::equal, TRUE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9203
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9204 if (is_array_equ) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9205 // Need additional checks for arrays_equals.
1016
d40f03b57795 6890984: Comparison of 2 arrays could cause VM crash
kvn
parents: 986
diff changeset
9206 testptr(ary1, ary1);
d40f03b57795 6890984: Comparison of 2 arrays could cause VM crash
kvn
parents: 986
diff changeset
9207 jcc(Assembler::zero, FALSE_LABEL);
d40f03b57795 6890984: Comparison of 2 arrays could cause VM crash
kvn
parents: 986
diff changeset
9208 testptr(ary2, ary2);
d40f03b57795 6890984: Comparison of 2 arrays could cause VM crash
kvn
parents: 986
diff changeset
9209 jcc(Assembler::zero, FALSE_LABEL);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9210
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9211 // Check the lengths
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9212 movl(limit, Address(ary1, length_offset));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9213 cmpl(limit, Address(ary2, length_offset));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9214 jcc(Assembler::notEqual, FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9215 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9216
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9217 // count == 0
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9218 testl(limit, limit);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9219 jcc(Assembler::zero, TRUE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9220
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9221 if (is_array_equ) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9222 // Load array address
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9223 lea(ary1, Address(ary1, base_offset));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9224 lea(ary2, Address(ary2, base_offset));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9225 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9226
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9227 shll(limit, 1); // byte count != 0
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9228 movl(result, limit); // copy
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9229
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9230 if (UseSSE42Intrinsics) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9231 // With SSE4.2, use double quad vector compare
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9232 Label COMPARE_WIDE_VECTORS, COMPARE_TAIL;
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9233
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9234 // Compare 16-byte vectors
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9235 andl(result, 0x0000000e); // tail count (in bytes)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9236 andl(limit, 0xfffffff0); // vector count (in bytes)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9237 jccb(Assembler::zero, COMPARE_TAIL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9238
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9239 lea(ary1, Address(ary1, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9240 lea(ary2, Address(ary2, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9241 negptr(limit);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9242
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9243 bind(COMPARE_WIDE_VECTORS);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9244 movdqu(vec1, Address(ary1, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9245 movdqu(vec2, Address(ary2, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9246 pxor(vec1, vec2);
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9247
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9248 ptest(vec1, vec1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9249 jccb(Assembler::notZero, FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9250 addptr(limit, 16);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9251 jcc(Assembler::notZero, COMPARE_WIDE_VECTORS);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9252
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9253 testl(result, result);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9254 jccb(Assembler::zero, TRUE_LABEL);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9255
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9256 movdqu(vec1, Address(ary1, result, Address::times_1, -16));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9257 movdqu(vec2, Address(ary2, result, Address::times_1, -16));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9258 pxor(vec1, vec2);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9259
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9260 ptest(vec1, vec1);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9261 jccb(Assembler::notZero, FALSE_LABEL);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9262 jmpb(TRUE_LABEL);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9263
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9264 bind(COMPARE_TAIL); // limit is zero
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9265 movl(limit, result);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9266 // Fallthru to tail compare
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9267 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9268
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9269 // Compare 4-byte vectors
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9270 andl(limit, 0xfffffffc); // vector count (in bytes)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9271 jccb(Assembler::zero, COMPARE_CHAR);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9272
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9273 lea(ary1, Address(ary1, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9274 lea(ary2, Address(ary2, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9275 negptr(limit);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9276
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9277 bind(COMPARE_VECTORS);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9278 movl(chr, Address(ary1, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9279 cmpl(chr, Address(ary2, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9280 jccb(Assembler::notEqual, FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9281 addptr(limit, 4);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9282 jcc(Assembler::notZero, COMPARE_VECTORS);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9283
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9284 // Compare trailing char (final 2 bytes), if any
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9285 bind(COMPARE_CHAR);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9286 testl(result, 0x2); // tail char
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9287 jccb(Assembler::zero, TRUE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9288 load_unsigned_short(chr, Address(ary1, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9289 load_unsigned_short(limit, Address(ary2, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9290 cmpl(chr, limit);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9291 jccb(Assembler::notEqual, FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9292
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9293 bind(TRUE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9294 movl(result, 1); // return true
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9295 jmpb(DONE);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9296
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9297 bind(FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9298 xorl(result, result); // return false
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9299
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9300 // That's it
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9301 bind(DONE);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9302 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9303
1763
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9304 #ifdef PRODUCT
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9305 #define BLOCK_COMMENT(str) /* nothing */
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9306 #else
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9307 #define BLOCK_COMMENT(str) block_comment(str)
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9308 #endif
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9309
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9310 #define BIND(label) bind(label); BLOCK_COMMENT(#label ":")
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9311 void MacroAssembler::generate_fill(BasicType t, bool aligned,
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9312 Register to, Register value, Register count,
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9313 Register rtmp, XMMRegister xtmp) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9314 assert_different_registers(to, value, count, rtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9315 Label L_exit, L_skip_align1, L_skip_align2, L_fill_byte;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9316 Label L_fill_2_bytes, L_fill_4_bytes;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9317
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9318 int shift = -1;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9319 switch (t) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9320 case T_BYTE:
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9321 shift = 2;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9322 break;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9323 case T_SHORT:
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9324 shift = 1;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9325 break;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9326 case T_INT:
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9327 shift = 0;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9328 break;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9329 default: ShouldNotReachHere();
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9330 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9331
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9332 if (t == T_BYTE) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9333 andl(value, 0xff);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9334 movl(rtmp, value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9335 shll(rtmp, 8);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9336 orl(value, rtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9337 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9338 if (t == T_SHORT) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9339 andl(value, 0xffff);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9340 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9341 if (t == T_BYTE || t == T_SHORT) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9342 movl(rtmp, value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9343 shll(rtmp, 16);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9344 orl(value, rtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9345 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9346
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9347 cmpl(count, 2<<shift); // Short arrays (< 8 bytes) fill by element
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9348 jcc(Assembler::below, L_fill_4_bytes); // use unsigned cmp
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9349 if (!UseUnalignedLoadStores && !aligned && (t == T_BYTE || t == T_SHORT)) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9350 // align source address at 4 bytes address boundary
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9351 if (t == T_BYTE) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9352 // One byte misalignment happens only for byte arrays
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9353 testptr(to, 1);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9354 jccb(Assembler::zero, L_skip_align1);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9355 movb(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9356 increment(to);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9357 decrement(count);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9358 BIND(L_skip_align1);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9359 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9360 // Two bytes misalignment happens only for byte and short (char) arrays
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9361 testptr(to, 2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9362 jccb(Assembler::zero, L_skip_align2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9363 movw(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9364 addptr(to, 2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9365 subl(count, 1<<(shift-1));
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9366 BIND(L_skip_align2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9367 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9368 if (UseSSE < 2) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9369 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
9370 // Fill 32-byte chunks
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9371 subl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9372 jcc(Assembler::less, L_check_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9373 align(16);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9374
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9375 BIND(L_fill_32_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9376
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9377 for (int i = 0; i < 32; i += 4) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9378 movl(Address(to, i), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9379 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9380
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9381 addptr(to, 32);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9382 subl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9383 jcc(Assembler::greaterEqual, L_fill_32_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9384 BIND(L_check_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9385 addl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9386 jccb(Assembler::zero, L_exit);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9387 jmpb(L_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9388
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9389 //
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9390 // length is too short, just fill qwords
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9391 //
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9392 BIND(L_fill_8_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9393 movl(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9394 movl(Address(to, 4), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9395 addptr(to, 8);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9396 BIND(L_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9397 subl(count, 1 << (shift + 1));
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9398 jcc(Assembler::greaterEqual, L_fill_8_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9399 // fall through to fill 4 bytes
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9400 } else {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9401 Label L_fill_32_bytes;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9402 if (!UseUnalignedLoadStores) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9403 // align to 8 bytes, we know we are 4 byte aligned to start
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9404 testptr(to, 4);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9405 jccb(Assembler::zero, L_fill_32_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9406 movl(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9407 addptr(to, 4);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9408 subl(count, 1<<shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9409 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9410 BIND(L_fill_32_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9411 {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9412 assert( UseSSE >= 2, "supported cpu only" );
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9413 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
9414 // Fill 32-byte chunks
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9415 movdl(xtmp, value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9416 pshufd(xtmp, xtmp, 0);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9417
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9418 subl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9419 jcc(Assembler::less, L_check_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9420 align(16);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9421
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9422 BIND(L_fill_32_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9423
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9424 if (UseUnalignedLoadStores) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9425 movdqu(Address(to, 0), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9426 movdqu(Address(to, 16), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9427 } else {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9428 movq(Address(to, 0), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9429 movq(Address(to, 8), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9430 movq(Address(to, 16), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9431 movq(Address(to, 24), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9432 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9433
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9434 addptr(to, 32);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9435 subl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9436 jcc(Assembler::greaterEqual, L_fill_32_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9437 BIND(L_check_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9438 addl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9439 jccb(Assembler::zero, L_exit);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9440 jmpb(L_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9441
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9442 //
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9443 // length is too short, just fill qwords
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9444 //
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9445 BIND(L_fill_8_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9446 movq(Address(to, 0), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9447 addptr(to, 8);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9448 BIND(L_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9449 subl(count, 1 << (shift + 1));
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9450 jcc(Assembler::greaterEqual, L_fill_8_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9451 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9452 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9453 // fill trailing 4 bytes
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9454 BIND(L_fill_4_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9455 testl(count, 1<<shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9456 jccb(Assembler::zero, L_fill_2_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9457 movl(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9458 if (t == T_BYTE || t == T_SHORT) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9459 addptr(to, 4);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9460 BIND(L_fill_2_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9461 // fill trailing 2 bytes
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9462 testl(count, 1<<(shift-1));
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9463 jccb(Assembler::zero, L_fill_byte);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9464 movw(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9465 if (t == T_BYTE) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9466 addptr(to, 2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9467 BIND(L_fill_byte);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9468 // fill trailing byte
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9469 testl(count, 1);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9470 jccb(Assembler::zero, L_exit);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9471 movb(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9472 } else {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9473 BIND(L_fill_byte);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9474 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9475 } else {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9476 BIND(L_fill_2_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9477 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9478 BIND(L_exit);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9479 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9480 #undef BIND
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9481 #undef BLOCK_COMMENT
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9482
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9483
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9484 Assembler::Condition MacroAssembler::negate_condition(Assembler::Condition cond) {
a61af66fc99e Initial load
duke
parents:
diff changeset
9485 switch (cond) {
a61af66fc99e Initial load
duke
parents:
diff changeset
9486 // Note some conditions are synonyms for others
a61af66fc99e Initial load
duke
parents:
diff changeset
9487 case Assembler::zero: return Assembler::notZero;
a61af66fc99e Initial load
duke
parents:
diff changeset
9488 case Assembler::notZero: return Assembler::zero;
a61af66fc99e Initial load
duke
parents:
diff changeset
9489 case Assembler::less: return Assembler::greaterEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
9490 case Assembler::lessEqual: return Assembler::greater;
a61af66fc99e Initial load
duke
parents:
diff changeset
9491 case Assembler::greater: return Assembler::lessEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
9492 case Assembler::greaterEqual: return Assembler::less;
a61af66fc99e Initial load
duke
parents:
diff changeset
9493 case Assembler::below: return Assembler::aboveEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
9494 case Assembler::belowEqual: return Assembler::above;
a61af66fc99e Initial load
duke
parents:
diff changeset
9495 case Assembler::above: return Assembler::belowEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
9496 case Assembler::aboveEqual: return Assembler::below;
a61af66fc99e Initial load
duke
parents:
diff changeset
9497 case Assembler::overflow: return Assembler::noOverflow;
a61af66fc99e Initial load
duke
parents:
diff changeset
9498 case Assembler::noOverflow: return Assembler::overflow;
a61af66fc99e Initial load
duke
parents:
diff changeset
9499 case Assembler::negative: return Assembler::positive;
a61af66fc99e Initial load
duke
parents:
diff changeset
9500 case Assembler::positive: return Assembler::negative;
a61af66fc99e Initial load
duke
parents:
diff changeset
9501 case Assembler::parity: return Assembler::noParity;
a61af66fc99e Initial load
duke
parents:
diff changeset
9502 case Assembler::noParity: return Assembler::parity;
a61af66fc99e Initial load
duke
parents:
diff changeset
9503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
9504 ShouldNotReachHere(); return Assembler::overflow;
a61af66fc99e Initial load
duke
parents:
diff changeset
9505 }
a61af66fc99e Initial load
duke
parents:
diff changeset
9506
a61af66fc99e Initial load
duke
parents:
diff changeset
9507 SkipIfEqual::SkipIfEqual(
a61af66fc99e Initial load
duke
parents:
diff changeset
9508 MacroAssembler* masm, const bool* flag_addr, bool value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
9509 _masm = masm;
a61af66fc99e Initial load
duke
parents:
diff changeset
9510 _masm->cmp8(ExternalAddress((address)flag_addr), value);
a61af66fc99e Initial load
duke
parents:
diff changeset
9511 _masm->jcc(Assembler::equal, _label);
a61af66fc99e Initial load
duke
parents:
diff changeset
9512 }
a61af66fc99e Initial load
duke
parents:
diff changeset
9513
a61af66fc99e Initial load
duke
parents:
diff changeset
9514 SkipIfEqual::~SkipIfEqual() {
a61af66fc99e Initial load
duke
parents:
diff changeset
9515 _masm->bind(_label);
a61af66fc99e Initial load
duke
parents:
diff changeset
9516 }