annotate src/cpu/x86/vm/assembler_x86.cpp @ 4582:b24386206122

Made all vm builds go into subdirectories, even product builds to simplify building the various types of VMs (server, client and graal). Made HotSpot build jobs use the number of CPUs on the host machine.
author Doug Simon <doug.simon@oracle.com>
date Mon, 13 Feb 2012 23:13:37 +0100
parents 04b9a2566eec
children 33df1aeaebbf
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
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3457
diff changeset
1342 void Assembler::jcc(Condition cc, Label& L, bool maybe_short) {
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3457
diff changeset
1343 InstructionMark im(this);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1344 assert((0 <= cc) && (cc < 16), "illegal cc");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1345 if (L.is_bound()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1346 address dst = target(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1347 assert(dst != NULL, "jcc most probably wrong");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1348
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1349 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1350 const int long_size = 6;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1351 intptr_t offs = (intptr_t)dst - (intptr_t)_code_pos;
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3457
diff changeset
1352 if (maybe_short && is8bit(offs - short_size)) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1353 // 0111 tttn #8-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1354 emit_byte(0x70 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1355 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1356 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1357 // 0000 1111 1000 tttn #32-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1358 assert(is_simm32(offs - long_size),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1359 "must be 32bit offset (call4)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1360 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1361 emit_byte(0x80 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1362 emit_long(offs - long_size);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1363 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1364 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1365 // Note: could eliminate cond. jumps to this jump if condition
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1366 // is the same however, seems to be rather unlikely case.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1367 // 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
1368 // an 8-bit displacement
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1369 L.add_patch_at(code(), locator());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1370 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1371 emit_byte(0x80 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1372 emit_long(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1373 }
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 void Assembler::jccb(Condition cc, Label& L) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1377 if (L.is_bound()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1378 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1379 address entry = target(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1380 assert(is8bit((intptr_t)entry - ((intptr_t)_code_pos + short_size)),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1381 "Dispacement too large for a short jmp");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1382 intptr_t offs = (intptr_t)entry - (intptr_t)_code_pos;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1383 // 0111 tttn #8-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1384 emit_byte(0x70 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1385 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1386 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1387 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1388 L.add_patch_at(code(), locator());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1389 emit_byte(0x70 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1390 emit_byte(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1391 }
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 void Assembler::jmp(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1395 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1396 prefix(adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1397 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1398 emit_operand(rsp, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1399 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1400
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3457
diff changeset
1401 void Assembler::jmp(Label& L, bool maybe_short) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1402 if (L.is_bound()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1403 address entry = target(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1404 assert(entry != NULL, "jmp most probably wrong");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1405 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1406 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1407 const int long_size = 5;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1408 intptr_t offs = entry - _code_pos;
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3457
diff changeset
1409 if (maybe_short && is8bit(offs - short_size)) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1410 emit_byte(0xEB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1411 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1412 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1413 emit_byte(0xE9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1414 emit_long(offs - long_size);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1415 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1416 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1417 // By default, forward jumps are always 32-bit displacements, since
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1418 // 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
1419 // 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
1420 // force an 8-bit displacement.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1421 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1422 L.add_patch_at(code(), locator());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1423 emit_byte(0xE9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1424 emit_long(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1425 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1426 }
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 void Assembler::jmp(Register entry) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1429 int encode = prefix_and_encode(entry->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1430 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1431 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1432 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1433
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1434 void Assembler::jmp_literal(address dest, RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1435 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1436 emit_byte(0xE9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1437 assert(dest != NULL, "must have a target");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1438 intptr_t disp = dest - (_code_pos + sizeof(int32_t));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1439 assert(is_simm32(disp), "must be 32bit offset (jmp)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1440 emit_data(disp, rspec.reloc(), call32_operand);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1441 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1442
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1443 void Assembler::jmpb(Label& L) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1444 if (L.is_bound()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1445 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1446 address entry = target(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1447 assert(is8bit((entry - _code_pos) + short_size),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1448 "Dispacement too large for a short jmp");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1449 assert(entry != NULL, "jmp most probably wrong");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1450 intptr_t offs = entry - _code_pos;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1451 emit_byte(0xEB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1452 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1453 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1454 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1455 L.add_patch_at(code(), locator());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1456 emit_byte(0xEB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1457 emit_byte(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1458 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1459 }
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 void Assembler::ldmxcsr( Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1462 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1463 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1464 prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1465 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1466 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1467 emit_operand(as_Register(2), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1468 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1469
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1470 void Assembler::leal(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1471 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1472 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1473 emit_byte(0x67); // addr32
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1474 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1475 #endif // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1476 emit_byte(0x8D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1477 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1478 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1479
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1480 void Assembler::lock() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1481 if (Atomics & 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1482 // Emit either nothing, a NOP, or a NOP: prefix
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1483 emit_byte(0x90) ;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1484 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1485 emit_byte(0xF0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1486 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1487 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1488
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1489 void Assembler::lzcntl(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1490 assert(VM_Version::supports_lzcnt(), "encoding is treated as BSR");
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1491 emit_byte(0xF3);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1492 int encode = prefix_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1493 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1494 emit_byte(0xBD);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1495 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1496 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1497
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1498 // Emit mfence instruction
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1499 void Assembler::mfence() {
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1500 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
1501 emit_byte( 0x0F );
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1502 emit_byte( 0xAE );
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1503 emit_byte( 0xF0 );
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1504 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1505
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1506 void Assembler::mov(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1507 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1508 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1509
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1510 void Assembler::movapd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1511 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1512 int dstenc = dst->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1513 int srcenc = src->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1514 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1515 if (dstenc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1516 if (srcenc >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1517 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1518 srcenc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1519 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1520 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1521 if (srcenc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1522 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1523 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1524 prefix(REX_RB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1525 srcenc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1526 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1527 dstenc -= 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 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1530 emit_byte(0x28);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1531 emit_byte(0xC0 | dstenc << 3 | srcenc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1532 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1533
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1534 void Assembler::movaps(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1535 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1536 int dstenc = dst->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1537 int srcenc = src->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1538 if (dstenc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1539 if (srcenc >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1540 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1541 srcenc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1542 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1543 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1544 if (srcenc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1545 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1546 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1547 prefix(REX_RB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1548 srcenc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1549 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1550 dstenc -= 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 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1553 emit_byte(0x28);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1554 emit_byte(0xC0 | dstenc << 3 | srcenc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1555 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1556
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1557 void Assembler::movb(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1558 NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1559 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1560 prefix(src, dst, true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1561 emit_byte(0x8A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1562 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1563 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1564
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 void Assembler::movb(Address dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1567 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1568 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1569 emit_byte(0xC6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1570 emit_operand(rax, dst, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1571 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1572 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1573
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 void Assembler::movb(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1576 assert(src->has_byte_register(), "must have byte register");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1577 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1578 prefix(dst, src, true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1579 emit_byte(0x88);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1580 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1581 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1582
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1583 void Assembler::movdl(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1584 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1585 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1586 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1587 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1588 emit_byte(0x6E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1589 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1590 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1591
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1592 void Assembler::movdl(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1593 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1594 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1595 // swap src/dst to get correct prefix
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1596 int encode = prefix_and_encode(src->encoding(), dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1597 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1598 emit_byte(0x7E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1599 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1600 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1601
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1602 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
1603 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
1604 InstructionMark im(this);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1605 emit_byte(0x66);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1606 prefix(src, dst);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1607 emit_byte(0x0F);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1608 emit_byte(0x6E);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1609 emit_operand(dst, src);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1610 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1611
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1612
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1613 void Assembler::movdqa(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1614 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1615 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1616 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1617 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1618 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1619 emit_byte(0x6F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1620 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1621 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1622
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1623 void Assembler::movdqa(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1624 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1625 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1626 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1627 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1628 emit_byte(0x6F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1629 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1630 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1631
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1632 void Assembler::movdqa(Address dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1633 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1634 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1635 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1636 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1637 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1638 emit_byte(0x7F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1639 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1640 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1641
405
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1642 void Assembler::movdqu(XMMRegister dst, Address src) {
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1643 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1644 InstructionMark im(this);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1645 emit_byte(0xF3);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1646 prefix(src, dst);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1647 emit_byte(0x0F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1648 emit_byte(0x6F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1649 emit_operand(dst, src);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1650 }
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1651
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1652 void Assembler::movdqu(XMMRegister dst, XMMRegister src) {
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1653 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1654 emit_byte(0xF3);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1655 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1656 emit_byte(0x0F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1657 emit_byte(0x6F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1658 emit_byte(0xC0 | encode);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1659 }
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1660
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1661 void Assembler::movdqu(Address dst, XMMRegister src) {
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1662 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1663 InstructionMark im(this);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1664 emit_byte(0xF3);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1665 prefix(dst, src);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1666 emit_byte(0x0F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1667 emit_byte(0x7F);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1668 emit_operand(src, dst);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1669 }
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1670
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1671 // Uses zero extension on 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1672
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1673 void Assembler::movl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1674 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1675 emit_byte(0xB8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1676 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1677 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1678
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1679 void Assembler::movl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1680 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1681 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1682 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1683 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1684
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1685 void Assembler::movl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1686 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1687 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1688 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1689 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1690 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1691
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1692 void Assembler::movl(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1693 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1694 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1695 emit_byte(0xC7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1696 emit_operand(rax, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1697 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1698 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1699
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1700 void Assembler::movl(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1701 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1702 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1703 emit_byte(0x89);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1704 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1705 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1706
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1707 // 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
1708 // 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
1709 // The selection is done in MacroAssembler::movdbl() and movflt().
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1710 void Assembler::movlpd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1711 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1712 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1713 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1714 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1715 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1716 emit_byte(0x12);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1717 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1718 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1719
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1720 void Assembler::movq( MMXRegister dst, Address src ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1721 assert( VM_Version::supports_mmx(), "" );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1722 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1723 emit_byte(0x6F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1724 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1725 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1726
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1727 void Assembler::movq( Address dst, MMXRegister src ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1728 assert( VM_Version::supports_mmx(), "" );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1729 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1730 emit_byte(0x7F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1731 // workaround gcc (3.2.1-7a) bug
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1732 // 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
1733 // gcc will tail jump and try and reverse the parameters completely
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1734 // obliterating dst in the process. By having a version available
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1735 // 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
1736 // avoided.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1737 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1738 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1739
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1740 void Assembler::movq(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1741 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1742 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1743 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1744 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1745 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1746 emit_byte(0x7E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1747 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1748 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1749
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1750 void Assembler::movq(Address dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1751 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1752 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1753 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1754 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1755 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1756 emit_byte(0xD6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1757 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1758 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1759
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1760 void Assembler::movsbl(Register dst, Address src) { // movsxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1761 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1762 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1763 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1764 emit_byte(0xBE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1765 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1766 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1767
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1768 void Assembler::movsbl(Register dst, Register src) { // movsxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1769 NOT_LP64(assert(src->has_byte_register(), "must have byte register"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1770 int encode = prefix_and_encode(dst->encoding(), src->encoding(), true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1771 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1772 emit_byte(0xBE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1773 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1774 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1775
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1776 void Assembler::movsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1777 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1778 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1779 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1780 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1781 emit_byte(0x10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1782 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1783 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1784
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1785 void Assembler::movsd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1786 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1787 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1788 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1789 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1790 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1791 emit_byte(0x10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1792 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1793 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1794
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1795 void Assembler::movsd(Address dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1796 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1797 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1798 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1799 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1800 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1801 emit_byte(0x11);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1802 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1803 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1804
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1805 void Assembler::movss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1806 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1807 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1808 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1809 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1810 emit_byte(0x10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1811 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1812 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1813
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1814 void Assembler::movss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1815 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1816 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1817 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1818 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1819 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1820 emit_byte(0x10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1821 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1822 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1823
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1824 void Assembler::movss(Address dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1825 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1826 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1827 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1828 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1829 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1830 emit_byte(0x11);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1831 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1832 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1833
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1834 void Assembler::movswl(Register dst, Address src) { // movsxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1835 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1836 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1837 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1838 emit_byte(0xBF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1839 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1840 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1841
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1842 void Assembler::movswl(Register dst, Register src) { // movsxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1843 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1844 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1845 emit_byte(0xBF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1846 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1847 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1848
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1849 void Assembler::movw(Address dst, int imm16) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1850 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1851
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1852 emit_byte(0x66); // switch to 16-bit mode
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1853 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1854 emit_byte(0xC7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1855 emit_operand(rax, dst, 2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1856 emit_word(imm16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1857 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1858
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1859 void Assembler::movw(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1860 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1861 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1862 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1863 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1864 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1865 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1866
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1867 void Assembler::movw(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1868 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1869 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1870 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1871 emit_byte(0x89);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1872 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1873 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1874
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1875 void Assembler::movzbl(Register dst, Address src) { // movzxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1876 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1877 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1878 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1879 emit_byte(0xB6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1880 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1881 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1882
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1883 void Assembler::movzbl(Register dst, Register src) { // movzxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1884 NOT_LP64(assert(src->has_byte_register(), "must have byte register"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1885 int encode = prefix_and_encode(dst->encoding(), src->encoding(), true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1886 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1887 emit_byte(0xB6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1888 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1889 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1890
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1891 void Assembler::movzwl(Register dst, Address src) { // movzxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1892 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1893 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1894 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1895 emit_byte(0xB7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1896 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1897 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1898
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1899 void Assembler::movzwl(Register dst, Register src) { // movzxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1900 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1901 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1902 emit_byte(0xB7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1903 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1904 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1905
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1906 void Assembler::mull(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1907 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1908 prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1909 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1910 emit_operand(rsp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1911 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1912
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1913 void Assembler::mull(Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1914 int encode = prefix_and_encode(src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1915 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1916 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1917 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1918
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1919 void Assembler::mulsd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1920 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1921 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1922 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1923 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1924 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1925 emit_byte(0x59);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1926 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1927 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1928
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1929 void Assembler::mulsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1930 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1931 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1932 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1933 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1934 emit_byte(0x59);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1935 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1936 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1937
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1938 void Assembler::mulss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1939 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1940 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1941 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1942 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1943 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1944 emit_byte(0x59);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1945 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1946 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1947
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1948 void Assembler::mulss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1949 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1950 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1951 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1952 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1953 emit_byte(0x59);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1954 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1955 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1956
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1957 void Assembler::negl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1958 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1959 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1960 emit_byte(0xD8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1961 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1962
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 void Assembler::nop(int i) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1964 #ifdef ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 assert(i > 0, " ");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1966 // 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
1967 // pain to disassemble code while debugging. If asserts are on clearly
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1968 // 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
1969 // to do alignment.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1970
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1971 for (; i > 0 ; i--) emit_byte(0x90);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1972 return;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1973
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1974 #endif // ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1975
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 if (UseAddressNop && VM_Version::is_intel()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 // Using multi-bytes nops "0x0F 0x1F [address]" for Intel
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 // 1: 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 // 2: 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 // 3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 // 4: 0x0F 0x1F 0x40 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 // 5: 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 // 6: 0x66 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 // 7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 // 8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 // 9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 // 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 // 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
1990
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 // The rest coding is Intel specific - don't use consecutive address nops
a61af66fc99e Initial load
duke
parents:
diff changeset
1992
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 // 12: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 // 13: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 // 14: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 // 15: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
1997
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 while(i >= 15) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 // For Intel don't generate consecutive addess nops (mix with regular nops)
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 i -= 15;
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 switch (i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 case 14:
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 case 13:
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 case 12:
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 case 11:
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 case 10:
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2026 case 9:
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 case 8:
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 case 7:
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 addr_nop_7();
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 case 6:
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 case 5:
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 addr_nop_5();
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 case 4:
a61af66fc99e Initial load
duke
parents:
diff changeset
2040 addr_nop_4();
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 case 3:
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 // Don't use "0x0F 0x1F 0x00" - need patching safe padding
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 assert(i == 0, " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 if (UseAddressNop && VM_Version::is_amd()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 // Using multi-bytes nops "0x0F 0x1F [address]" for AMD.
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 // 1: 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 // 2: 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 // 3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 // 4: 0x0F 0x1F 0x40 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 // 5: 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 // 6: 0x66 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 // 7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 // 8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 // 9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 // 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 // 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2069
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 // The rest coding is AMD specific - use consecutive address nops
a61af66fc99e Initial load
duke
parents:
diff changeset
2071
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 // 12: 0x66 0x0F 0x1F 0x44 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 // 13: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 // 14: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 // 15: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 // 16: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 // Size prefixes (0x66) are added for larger sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
2078
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 while(i >= 22) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 i -= 11;
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2086 // Generate first nop for size between 21-12
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 switch (i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 case 21:
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 case 20:
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 case 19:
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 case 18:
a61af66fc99e Initial load
duke
parents:
diff changeset
2096 case 17:
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 case 16:
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 case 15:
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 i -= 8;
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 case 14:
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 case 13:
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 i -= 7;
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 addr_nop_7();
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 case 12:
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 i -= 6;
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 addr_nop_5();
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 assert(i < 12, " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2117
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 // Generate second nop for size between 11-1
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 switch (i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 case 11:
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 case 10:
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 case 9:
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 case 8:
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 case 7:
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 addr_nop_7();
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 case 6:
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 case 5:
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 addr_nop_5();
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 case 4:
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 addr_nop_4();
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 case 3:
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 // Don't use "0x0F 0x1F 0x00" - need patching safe padding
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 assert(i == 0, " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2153
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 // Using nops with size prefixes "0x66 0x90".
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 // From AMD Optimization Guide:
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 // 1: 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 // 2: 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 // 3: 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 // 4: 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 // 5: 0x66 0x66 0x90 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 // 6: 0x66 0x66 0x90 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 // 7: 0x66 0x66 0x66 0x90 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 // 8: 0x66 0x66 0x66 0x90 0x66 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 // 9: 0x66 0x66 0x90 0x66 0x66 0x90 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 // 10: 0x66 0x66 0x66 0x90 0x66 0x66 0x90 0x66 0x66 0x90
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 while(i > 12) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 i -= 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 emit_byte(0x66); // size prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 emit_byte(0x90); // nop
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 // 1 - 12 nops
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 if(i > 8) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 if(i > 9) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 i -= 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 emit_byte(0x90);
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 // 1 - 8 nops
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 if(i > 4) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 if(i > 6) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 i -= 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 i -= 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 emit_byte(0x90);
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 switch (i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 case 4:
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 case 3:
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 emit_byte(0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 emit_byte(0x90);
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 assert(i == 0, " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2210
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2211 void Assembler::notl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2212 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2213 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2214 emit_byte(0xD0 | encode );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2215 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2216
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2217 void Assembler::orl(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2218 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2219 prefix(dst);
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
2220 emit_arith_operand(0x81, rcx, dst, imm32);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2221 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2222
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2223 void Assembler::orl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2224 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2225 emit_arith(0x81, 0xC8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2226 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2227
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2228 void Assembler::orl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2229 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2230 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2231 emit_byte(0x0B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2232 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2233 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2234
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2235 void Assembler::orl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2236 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2237 emit_arith(0x0B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2238 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2239
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2240 void Assembler::pcmpestri(XMMRegister dst, Address src, int imm8) {
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2241 assert(VM_Version::supports_sse4_2(), "");
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2242
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2243 InstructionMark im(this);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2244 emit_byte(0x66);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2245 prefix(src, dst);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2246 emit_byte(0x0F);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2247 emit_byte(0x3A);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2248 emit_byte(0x61);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2249 emit_operand(dst, src);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2250 emit_byte(imm8);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2251 }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2252
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2253 void Assembler::pcmpestri(XMMRegister dst, XMMRegister src, int imm8) {
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2254 assert(VM_Version::supports_sse4_2(), "");
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2255
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2256 emit_byte(0x66);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2257 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2258 emit_byte(0x0F);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2259 emit_byte(0x3A);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2260 emit_byte(0x61);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2261 emit_byte(0xC0 | encode);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2262 emit_byte(imm8);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2263 }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2264
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2265 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2266 void Assembler::pop(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2267 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2268 emit_byte(0x58 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2269 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2270
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2271 void Assembler::popcntl(Register dst, Address src) {
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2272 assert(VM_Version::supports_popcnt(), "must support");
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2273 InstructionMark im(this);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2274 emit_byte(0xF3);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2275 prefix(src, dst);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2276 emit_byte(0x0F);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2277 emit_byte(0xB8);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2278 emit_operand(dst, src);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2279 }
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2280
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2281 void Assembler::popcntl(Register dst, Register src) {
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2282 assert(VM_Version::supports_popcnt(), "must support");
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2283 emit_byte(0xF3);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2284 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
2285 emit_byte(0x0F);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2286 emit_byte(0xB8);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2287 emit_byte(0xC0 | encode);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2288 }
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
2289
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2290 void Assembler::popf() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2291 emit_byte(0x9D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2292 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2293
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
2294 #ifndef _LP64 // no 32bit push/pop on amd64
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2295 void Assembler::popl(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2296 // NOTE: this will adjust stack by 8byte on 64bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2297 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2298 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2299 emit_byte(0x8F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2300 emit_operand(rax, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2301 }
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
2302 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2303
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2304 void Assembler::prefetch_prefix(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2305 prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2306 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2307 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2308
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2309 void Assembler::prefetchnta(Address src) {
3873
a594deb1d6dc 7081926: assert(VM_Version::supports_sse2()) failed: must support
kvn
parents: 3855
diff changeset
2310 NOT_LP64(assert(VM_Version::supports_sse(), "must support"));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2311 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2312 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2313 emit_byte(0x18);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2314 emit_operand(rax, src); // 0, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2315 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2316
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2317 void Assembler::prefetchr(Address src) {
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
2318 assert(VM_Version::supports_3dnow_prefetch(), "must support");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2319 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2320 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2321 emit_byte(0x0D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2322 emit_operand(rax, src); // 0, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2323 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2324
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2325 void Assembler::prefetcht0(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2326 NOT_LP64(assert(VM_Version::supports_sse(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2327 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2328 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2329 emit_byte(0x18);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2330 emit_operand(rcx, src); // 1, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2331 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2332
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2333 void Assembler::prefetcht1(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2334 NOT_LP64(assert(VM_Version::supports_sse(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2335 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2336 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2337 emit_byte(0x18);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2338 emit_operand(rdx, src); // 2, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2339 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2340
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2341 void Assembler::prefetcht2(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2342 NOT_LP64(assert(VM_Version::supports_sse(), "must support"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2343 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2344 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2345 emit_byte(0x18);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2346 emit_operand(rbx, src); // 3, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2347 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2348
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2349 void Assembler::prefetchw(Address src) {
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
2350 assert(VM_Version::supports_3dnow_prefetch(), "must support");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2351 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2352 prefetch_prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2353 emit_byte(0x0D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2354 emit_operand(rcx, src); // 1, src
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2355 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2356
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2357 void Assembler::prefix(Prefix p) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2358 a_byte(p);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2359 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2360
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2361 void Assembler::por(XMMRegister dst, XMMRegister src) {
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2362 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2363
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2364 emit_byte(0x66);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2365 int encode = prefix_and_encode(dst->encoding(), src->encoding());
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2366 emit_byte(0x0F);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2367
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2368 emit_byte(0xEB);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2369 emit_byte(0xC0 | encode);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2370 }
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
2371
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2372 void Assembler::pshufd(XMMRegister dst, XMMRegister src, int mode) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2373 assert(isByte(mode), "invalid value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2374 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2375
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2376 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2377 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2378 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2379 emit_byte(0x70);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2380 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2381 emit_byte(mode & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2382
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2383 }
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 void Assembler::pshufd(XMMRegister dst, Address src, int mode) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2386 assert(isByte(mode), "invalid value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2387 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2388
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2389 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2390 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2391 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2392 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2393 emit_byte(0x70);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2394 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2395 emit_byte(mode & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2396 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2397
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2398 void Assembler::pshuflw(XMMRegister dst, XMMRegister src, int mode) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2399 assert(isByte(mode), "invalid value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2400 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2401
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2402 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2403 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2404 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2405 emit_byte(0x70);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2406 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2407 emit_byte(mode & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2408 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2409
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2410 void Assembler::pshuflw(XMMRegister dst, Address src, int mode) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2411 assert(isByte(mode), "invalid value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2412 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2413
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2414 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2415 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2416 prefix(src, dst); // QQ new
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2417 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2418 emit_byte(0x70);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2419 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2420 emit_byte(mode & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2421 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2422
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2423 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
2424 // 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
2425 // 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
2426 // 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
2427 // 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
2428 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2429
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2430 int encode = prefixq_and_encode(xmm2->encoding(), dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2431 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2432 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2433 emit_byte(0x73);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2434 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2435 emit_byte(shift);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2436 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2437
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2438 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
2439 // 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
2440 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
2441
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2442 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
2443 emit_byte(0x66);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2444 emit_byte(0x0F);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2445 emit_byte(0x73);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2446 emit_byte(0xC0 | encode);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2447 emit_byte(shift);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2448 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
2449
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2450 void Assembler::ptest(XMMRegister dst, Address src) {
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2451 assert(VM_Version::supports_sse4_1(), "");
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2452
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2453 InstructionMark im(this);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2454 emit_byte(0x66);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2455 prefix(src, dst);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2456 emit_byte(0x0F);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2457 emit_byte(0x38);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2458 emit_byte(0x17);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2459 emit_operand(dst, src);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2460 }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2461
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2462 void Assembler::ptest(XMMRegister dst, XMMRegister src) {
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2463 assert(VM_Version::supports_sse4_1(), "");
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2464
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2465 emit_byte(0x66);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2466 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2467 emit_byte(0x0F);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2468 emit_byte(0x38);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2469 emit_byte(0x17);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2470 emit_byte(0xC0 | encode);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2471 }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
2472
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2473 void Assembler::punpcklbw(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2474 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2475 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2476 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2477 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2478 emit_byte(0x60);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2479 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2480 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2481
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2482 void Assembler::push(int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2483 // in 64bits we push 64bits onto the stack but only
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2484 // take a 32bit immediate
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2485 emit_byte(0x68);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2486 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2487 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2488
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2489 void Assembler::push(Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2490 int encode = prefix_and_encode(src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2491
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2492 emit_byte(0x50 | encode);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2495 void Assembler::pushf() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2496 emit_byte(0x9C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2497 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2498
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
2499 #ifndef _LP64 // no 32bit push/pop on amd64
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2500 void Assembler::pushl(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2501 // Note this will push 64bit on 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2502 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2503 prefix(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2504 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2505 emit_operand(rsi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2506 }
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
2507 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2508
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2509 void Assembler::pxor(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2510 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2511 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2512 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2513 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2514 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2515 emit_byte(0xEF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2516 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2517 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2518
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2519 void Assembler::pxor(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2520 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2521 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2522 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2523 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2524 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2525 emit_byte(0xEF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2526 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2527 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2528
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2529 void Assembler::rcll(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2530 assert(isShiftCount(imm8), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2531 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2532 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2533 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2534 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2535 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2536 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2537 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2538 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2539 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2540 }
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 // copies data from [esi] to [edi] using rcx pointer sized words
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2543 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2544 void Assembler::rep_mov() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2545 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2546 // MOVSQ
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2547 LP64_ONLY(prefix(REX_W));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2548 emit_byte(0xA5);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2549 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2550
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2551 // sets rcx pointer sized words with rax, value at [edi]
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2552 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2553 void Assembler::rep_set() { // rep_set
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2554 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2555 // STOSQ
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2556 LP64_ONLY(prefix(REX_W));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2557 emit_byte(0xAB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2558 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2559
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2560 // scans rcx pointer sized words at [edi] for occurance of rax,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2561 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2562 void Assembler::repne_scan() { // repne_scan
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2563 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2564 // SCASQ
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2565 LP64_ONLY(prefix(REX_W));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2566 emit_byte(0xAF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2567 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2568
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2569 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2570 // scans rcx 4 byte words at [edi] for occurance of rax,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2571 // generic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2572 void Assembler::repne_scanl() { // repne_scan
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2573 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2574 // SCASL
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2575 emit_byte(0xAF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2576 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2577 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2578
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2579 void Assembler::ret(int imm16) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2580 if (imm16 == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 emit_byte(0xC3);
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2583 emit_byte(0xC2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 emit_word(imm16);
a61af66fc99e Initial load
duke
parents:
diff changeset
2585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2587
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2588 void Assembler::sahf() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2589 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2590 // Not supported in 64bit mode
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2591 ShouldNotReachHere();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2592 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2593 emit_byte(0x9E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2594 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2595
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2596 void Assembler::sarl(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2597 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2598 assert(isShiftCount(imm8), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2599 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2600 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2601 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2602 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2603 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2604 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2605 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2606 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2607 }
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 void Assembler::sarl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2610 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2611 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2612 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2613 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2614
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2615 void Assembler::sbbl(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2616 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2617 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2618 emit_arith_operand(0x81, rbx, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2619 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2620
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2621 void Assembler::sbbl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2622 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2623 emit_arith(0x81, 0xD8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2624 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2625
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 void Assembler::sbbl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2628 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2629 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2630 emit_byte(0x1B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2631 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2632 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2633
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2634 void Assembler::sbbl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2635 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2636 emit_arith(0x1B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2637 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2638
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2639 void Assembler::setb(Condition cc, Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2640 assert(0 <= cc && cc < 16, "illegal cc");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2641 int encode = prefix_and_encode(dst->encoding(), true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2643 emit_byte(0x90 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2644 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2645 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2646
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2647 void Assembler::shll(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2648 assert(isShiftCount(imm8), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2649 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2650 if (imm8 == 1 ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2651 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2652 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2653 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2654 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2655 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2656 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2657 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2658 }
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 void Assembler::shll(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2661 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2662 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2663 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2664 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2665
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2666 void Assembler::shrl(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2667 assert(isShiftCount(imm8), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2668 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2669 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2670 emit_byte(0xE8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2671 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2672 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2673
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2674 void Assembler::shrl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2675 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2676 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2677 emit_byte(0xE8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2678 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2679
a61af66fc99e Initial load
duke
parents:
diff changeset
2680 // copies a single word from [esi] to [edi]
a61af66fc99e Initial load
duke
parents:
diff changeset
2681 void Assembler::smovl() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2682 emit_byte(0xA5);
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2684
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2685 void Assembler::sqrtsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2686 // HMM Table D-1 says sse2
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2687 // NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2688 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2689 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2690 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2691 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2692 emit_byte(0x51);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2693 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2694 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2695
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2696 void Assembler::sqrtsd(XMMRegister dst, Address src) {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2697 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2698 InstructionMark im(this);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2699 emit_byte(0xF2);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2700 prefix(src, dst);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2701 emit_byte(0x0F);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2702 emit_byte(0x51);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2703 emit_operand(dst, src);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2704 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2705
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2706 void Assembler::sqrtss(XMMRegister dst, XMMRegister src) {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2707 // HMM Table D-1 says sse2
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2708 // NOT_LP64(assert(VM_Version::supports_sse(), ""));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2709 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2710 emit_byte(0xF3);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2711 int encode = prefix_and_encode(dst->encoding(), src->encoding());
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2712 emit_byte(0x0F);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2713 emit_byte(0x51);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2714 emit_byte(0xC0 | encode);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2715 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2716
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2717 void Assembler::sqrtss(XMMRegister dst, Address src) {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2718 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2719 InstructionMark im(this);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2720 emit_byte(0xF3);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2721 prefix(src, dst);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2722 emit_byte(0x0F);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2723 emit_byte(0x51);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2724 emit_operand(dst, src);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2725 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
2726
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2727 void Assembler::stmxcsr( Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2728 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2729 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2730 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2731 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2732 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2733 emit_operand(as_Register(3), dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2734 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2735
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2736 void Assembler::subl(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2737 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2738 prefix(dst);
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
2739 emit_arith_operand(0x81, rbp, dst, imm32);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2740 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2741
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2742 void Assembler::subl(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2743 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2744 prefix(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2745 emit_byte(0x29);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2746 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2747 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2748
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
2749 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
2750 prefix(dst);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
2751 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
2752 }
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
2753
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2754 void Assembler::subl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2755 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2756 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2757 emit_byte(0x2B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2758 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2759 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2760
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2761 void Assembler::subl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2762 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2763 emit_arith(0x2B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2764 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2765
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2766 void Assembler::subsd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2767 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2768 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2769 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2770 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2771 emit_byte(0x5C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2772 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2773 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2774
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2775 void Assembler::subsd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2776 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2777 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2778 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2779 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2780 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2781 emit_byte(0x5C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2782 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2783 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2784
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2785 void Assembler::subss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2786 NOT_LP64(assert(VM_Version::supports_sse(), ""));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2787 emit_byte(0xF3);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2788 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2789 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2790 emit_byte(0x5C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2791 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2792 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2793
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2794 void Assembler::subss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2795 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2796 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2797 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2798 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2799 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2800 emit_byte(0x5C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2801 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2802 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2803
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2804 void Assembler::testb(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2805 NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2806 (void) prefix_and_encode(dst->encoding(), true);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2807 emit_arith_b(0xF6, 0xC0, dst, imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2808 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2809
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2810 void Assembler::testl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2811 // not using emit_arith because test
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2812 // doesn't support sign-extension of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2813 // 8bit operands
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2814 int encode = dst->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2815 if (encode == 0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2816 emit_byte(0xA9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2817 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2818 encode = prefix_and_encode(encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2819 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2820 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2821 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2822 emit_long(imm32);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2825 void Assembler::testl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2826 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2827 emit_arith(0x85, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2828 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2829
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2830 void Assembler::testl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2831 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2832 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2833 emit_byte(0x85);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2834 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2835 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2836
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2837 void Assembler::ucomisd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2838 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2839 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2840 ucomiss(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2841 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2842
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2843 void Assembler::ucomisd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2844 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2845 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2846 ucomiss(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2847 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2848
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2849 void Assembler::ucomiss(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2850 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2851
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2852 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2853 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2854 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2855 emit_byte(0x2E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2856 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2857 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2858
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2859 void Assembler::ucomiss(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2860 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2861 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2862 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2863 emit_byte(0x2E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2864 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2865 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2866
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 void Assembler::xaddl(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2869 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2870 prefix(dst, src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2871 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2872 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2873 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2874 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2875
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2876 void Assembler::xchgl(Register dst, Address src) { // xchg
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2877 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2878 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2879 emit_byte(0x87);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2880 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2881 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2882
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2883 void Assembler::xchgl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2884 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2885 emit_byte(0x87);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2886 emit_byte(0xc0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2887 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2888
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2889 void Assembler::xorl(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2890 prefix(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2891 emit_arith(0x81, 0xF0, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2892 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2893
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2894 void Assembler::xorl(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2895 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2896 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2897 emit_byte(0x33);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2898 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2899 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2900
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2901 void Assembler::xorl(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2902 (void) prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2903 emit_arith(0x33, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2904 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2905
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2906 void Assembler::xorpd(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2907 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2908 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2909 xorps(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2910 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2911
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2912 void Assembler::xorpd(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2913 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2914 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2915 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2916 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2917 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2918 emit_byte(0x57);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2919 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2920 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2921
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 void Assembler::xorps(XMMRegister dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2924 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2925 int encode = prefix_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2926 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2927 emit_byte(0x57);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2928 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2929 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2930
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2931 void Assembler::xorps(XMMRegister dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2932 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2933 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2934 prefix(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2935 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2936 emit_byte(0x57);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2937 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2938 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2939
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2940 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2941 // 32bit only pieces of the assembler
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2942
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2943 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
2944 // NO PREFIX AS NEVER 64BIT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2945 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2946 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2947 emit_byte(0xF8 | src1->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2948 emit_data(imm32, rspec, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2949 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2950
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2951 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
2952 // 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
2953 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2954 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2955 emit_operand(rdi, src1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2956 emit_data(imm32, rspec, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2957 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2958
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2959 // 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
2960 // 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
2961 // 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
2962 void Assembler::cmpxchg8(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2963 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2964 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2965 emit_byte(0xc7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2966 emit_operand(rcx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2967 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2968
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2969 void Assembler::decl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2970 // Don't use it directly. Use MacroAssembler::decrementl() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2971 emit_byte(0x48 | dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2972 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2973
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2974 #endif // _LP64
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 // 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
2977
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2978 void Assembler::fabs() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2979 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2980 emit_byte(0xE1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2981 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2982
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2983 void Assembler::fadd(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2984 emit_farith(0xD8, 0xC0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2985 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2986
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2987 void Assembler::fadd_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2988 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2989 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2990 emit_operand32(rax, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2991 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2992
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2993 void Assembler::fadd_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2994 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2995 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2996 emit_operand32(rax, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2997 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2998
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2999 void Assembler::fadda(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3000 emit_farith(0xDC, 0xC0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3001 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3002
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3003 void Assembler::faddp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3004 emit_farith(0xDE, 0xC0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3005 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3006
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3007 void Assembler::fchs() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3008 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3009 emit_byte(0xE0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3010 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3011
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3012 void Assembler::fcom(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3013 emit_farith(0xD8, 0xD0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3014 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3015
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3016 void Assembler::fcomp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3017 emit_farith(0xD8, 0xD8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3018 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3019
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3020 void Assembler::fcomp_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3021 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3022 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3023 emit_operand32(rbx, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3024 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3025
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3026 void Assembler::fcomp_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3027 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3028 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3029 emit_operand32(rbx, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3030 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3031
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3032 void Assembler::fcompp() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3033 emit_byte(0xDE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3034 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3035 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3036
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3037 void Assembler::fcos() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3038 emit_byte(0xD9);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3039 emit_byte(0xFF);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3040 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3041
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3042 void Assembler::fdecstp() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3043 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3044 emit_byte(0xF6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3045 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3046
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3047 void Assembler::fdiv(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3048 emit_farith(0xD8, 0xF0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3049 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3050
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3051 void Assembler::fdiv_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3052 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3053 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3054 emit_operand32(rsi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3055 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3056
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3057 void Assembler::fdiv_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3058 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3059 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3060 emit_operand32(rsi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3061 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3062
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3063 void Assembler::fdiva(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3064 emit_farith(0xDC, 0xF8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3065 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3066
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3067 // 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
3068 // is erroneous for some of the floating-point instructions below.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3069
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3070 void Assembler::fdivp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3071 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
3072 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3073
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3074 void Assembler::fdivr(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3075 emit_farith(0xD8, 0xF8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3076 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3077
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3078 void Assembler::fdivr_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3079 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3080 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3081 emit_operand32(rdi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3082 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3083
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3084 void Assembler::fdivr_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3085 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3086 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3087 emit_operand32(rdi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3088 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3089
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3090 void Assembler::fdivra(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3091 emit_farith(0xDC, 0xF0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3092 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3093
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3094 void Assembler::fdivrp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3095 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
3096 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3097
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3098 void Assembler::ffree(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3099 emit_farith(0xDD, 0xC0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3100 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3101
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3102 void Assembler::fild_d(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3103 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3104 emit_byte(0xDF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3105 emit_operand32(rbp, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3106 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3107
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3108 void Assembler::fild_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3109 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3110 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3111 emit_operand32(rax, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3112 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3113
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3114 void Assembler::fincstp() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3115 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3116 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3117 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3118
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3119 void Assembler::finit() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3120 emit_byte(0x9B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3121 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3122 emit_byte(0xE3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3123 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3124
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3125 void Assembler::fist_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3126 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3127 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3128 emit_operand32(rdx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3129 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3130
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3131 void Assembler::fistp_d(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3132 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3133 emit_byte(0xDF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3134 emit_operand32(rdi, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3135 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3136
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3137 void Assembler::fistp_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3138 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3139 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3140 emit_operand32(rbx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3141 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3142
a61af66fc99e Initial load
duke
parents:
diff changeset
3143 void Assembler::fld1() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3144 emit_byte(0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
3145 emit_byte(0xE8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3147
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3148 void Assembler::fld_d(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3149 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3150 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3151 emit_operand32(rax, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3152 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3153
a61af66fc99e Initial load
duke
parents:
diff changeset
3154 void Assembler::fld_s(Address adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3155 InstructionMark im(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3156 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3157 emit_operand32(rax, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3158 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3159
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 void Assembler::fld_s(int index) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3162 emit_farith(0xD9, 0xC0, index);
a61af66fc99e Initial load
duke
parents:
diff changeset
3163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3164
a61af66fc99e Initial load
duke
parents:
diff changeset
3165 void Assembler::fld_x(Address adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3166 InstructionMark im(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3167 emit_byte(0xDB);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3168 emit_operand32(rbp, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3169 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3170
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3171 void Assembler::fldcw(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3172 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3173 emit_byte(0xd9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3174 emit_operand32(rbp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3175 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3176
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3177 void Assembler::fldenv(Address src) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3178 InstructionMark im(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3179 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3180 emit_operand32(rsp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3181 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3182
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3183 void Assembler::fldlg2() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3184 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3185 emit_byte(0xEC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3186 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3187
a61af66fc99e Initial load
duke
parents:
diff changeset
3188 void Assembler::fldln2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3189 emit_byte(0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
3190 emit_byte(0xED);
a61af66fc99e Initial load
duke
parents:
diff changeset
3191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3192
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3193 void Assembler::fldz() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3194 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3195 emit_byte(0xEE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3196 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3197
a61af66fc99e Initial load
duke
parents:
diff changeset
3198 void Assembler::flog() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3199 fldln2();
a61af66fc99e Initial load
duke
parents:
diff changeset
3200 fxch();
a61af66fc99e Initial load
duke
parents:
diff changeset
3201 fyl2x();
a61af66fc99e Initial load
duke
parents:
diff changeset
3202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3203
a61af66fc99e Initial load
duke
parents:
diff changeset
3204 void Assembler::flog10() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3205 fldlg2();
a61af66fc99e Initial load
duke
parents:
diff changeset
3206 fxch();
a61af66fc99e Initial load
duke
parents:
diff changeset
3207 fyl2x();
a61af66fc99e Initial load
duke
parents:
diff changeset
3208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3209
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3210 void Assembler::fmul(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3211 emit_farith(0xD8, 0xC8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3212 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3213
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3214 void Assembler::fmul_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3215 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3216 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3217 emit_operand32(rcx, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3218 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3219
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3220 void Assembler::fmul_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3221 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3222 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3223 emit_operand32(rcx, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3224 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3225
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3226 void Assembler::fmula(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3227 emit_farith(0xDC, 0xC8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3228 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3229
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3230 void Assembler::fmulp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3231 emit_farith(0xDE, 0xC8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3232 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3233
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3234 void Assembler::fnsave(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3235 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3236 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3237 emit_operand32(rsi, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3238 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3239
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3240 void Assembler::fnstcw(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3241 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3242 emit_byte(0x9B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3243 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3244 emit_operand32(rdi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3245 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3246
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3247 void Assembler::fnstsw_ax() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3248 emit_byte(0xdF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3249 emit_byte(0xE0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3250 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3251
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3252 void Assembler::fprem() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3253 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3254 emit_byte(0xF8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3255 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3256
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3257 void Assembler::fprem1() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3258 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3259 emit_byte(0xF5);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3260 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3261
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3262 void Assembler::frstor(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3263 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3264 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3265 emit_operand32(rsp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3266 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3267
a61af66fc99e Initial load
duke
parents:
diff changeset
3268 void Assembler::fsin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3269 emit_byte(0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
3270 emit_byte(0xFE);
a61af66fc99e Initial load
duke
parents:
diff changeset
3271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3272
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3273 void Assembler::fsqrt() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3274 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3275 emit_byte(0xFA);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3276 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3277
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3278 void Assembler::fst_d(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3279 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3280 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3281 emit_operand32(rdx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3282 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3283
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3284 void Assembler::fst_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3285 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3286 emit_byte(0xD9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3287 emit_operand32(rdx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3288 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3289
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3290 void Assembler::fstp_d(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3291 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3292 emit_byte(0xDD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3293 emit_operand32(rbx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3294 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3295
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3296 void Assembler::fstp_d(int index) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3297 emit_farith(0xDD, 0xD8, index);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3298 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3299
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3300 void Assembler::fstp_s(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3301 InstructionMark im(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3302 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3303 emit_operand32(rbx, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3304 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3305
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3306 void Assembler::fstp_x(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3307 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3308 emit_byte(0xDB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3309 emit_operand32(rdi, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3310 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3311
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3312 void Assembler::fsub(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3313 emit_farith(0xD8, 0xE0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3314 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3315
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3316 void Assembler::fsub_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3317 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3318 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3319 emit_operand32(rsp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3320 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3321
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3322 void Assembler::fsub_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3323 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3324 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3325 emit_operand32(rsp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3326 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3327
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3328 void Assembler::fsuba(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3329 emit_farith(0xDC, 0xE8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3330 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3331
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3332 void Assembler::fsubp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3333 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
3334 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3335
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3336 void Assembler::fsubr(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3337 emit_farith(0xD8, 0xE8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3338 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3339
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3340 void Assembler::fsubr_d(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3341 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3342 emit_byte(0xDC);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3343 emit_operand32(rbp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3344 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3345
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3346 void Assembler::fsubr_s(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3347 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3348 emit_byte(0xD8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3349 emit_operand32(rbp, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3350 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3351
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3352 void Assembler::fsubra(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3353 emit_farith(0xDC, 0xE0, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3354 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3355
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3356 void Assembler::fsubrp(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3357 emit_farith(0xDE, 0xE0, i); // ST(0) <- ST(1) - ST(0) and pop (Intel manual wrong)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3358 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3359
a61af66fc99e Initial load
duke
parents:
diff changeset
3360 void Assembler::ftan() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3361 emit_byte(0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
3362 emit_byte(0xF2);
a61af66fc99e Initial load
duke
parents:
diff changeset
3363 emit_byte(0xDD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3364 emit_byte(0xD8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3366
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3367 void Assembler::ftst() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3368 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3369 emit_byte(0xE4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3370 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3371
a61af66fc99e Initial load
duke
parents:
diff changeset
3372 void Assembler::fucomi(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3373 // make sure the instruction is supported (introduced for P6, together with cmov)
a61af66fc99e Initial load
duke
parents:
diff changeset
3374 guarantee(VM_Version::supports_cmov(), "illegal instruction");
a61af66fc99e Initial load
duke
parents:
diff changeset
3375 emit_farith(0xDB, 0xE8, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3377
a61af66fc99e Initial load
duke
parents:
diff changeset
3378 void Assembler::fucomip(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3379 // make sure the instruction is supported (introduced for P6, together with cmov)
a61af66fc99e Initial load
duke
parents:
diff changeset
3380 guarantee(VM_Version::supports_cmov(), "illegal instruction");
a61af66fc99e Initial load
duke
parents:
diff changeset
3381 emit_farith(0xDF, 0xE8, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3383
a61af66fc99e Initial load
duke
parents:
diff changeset
3384 void Assembler::fwait() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3385 emit_byte(0x9B);
a61af66fc99e Initial load
duke
parents:
diff changeset
3386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3387
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3388 void Assembler::fxch(int i) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3389 emit_farith(0xD9, 0xC8, i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3390 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3391
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3392 void Assembler::fyl2x() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3393 emit_byte(0xD9);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3394 emit_byte(0xF1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3395 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3396
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 #ifndef _LP64
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 void Assembler::incl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3401 // Don't use it directly. Use MacroAssembler::incrementl() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3402 emit_byte(0x40 | dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3403 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3404
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3405 void Assembler::lea(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3406 leal(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3407 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3408
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3409 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
3410 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3411 emit_byte(0xC7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3412 emit_operand(rax, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3413 emit_data((int)imm32, rspec, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3414 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3415
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3416 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
3417 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3418 int encode = prefix_and_encode(dst->encoding());
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3419 emit_byte(0xB8 | encode);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3420 emit_data((int)imm32, rspec, 0);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
3421 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3422
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3423 void Assembler::popa() { // 32bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3424 emit_byte(0x61);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3425 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3426
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3427 void Assembler::push_literal32(int32_t imm32, RelocationHolder const& rspec) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3428 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3429 emit_byte(0x68);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3430 emit_data(imm32, rspec, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3431 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3432
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3433 void Assembler::pusha() { // 32bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3434 emit_byte(0x60);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3435 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3436
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3437 void Assembler::set_byte_if_not_zero(Register dst) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3438 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3439 emit_byte(0x95);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3440 emit_byte(0xE0 | dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3441 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3442
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3443 void Assembler::shldl(Register dst, Register src) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3444 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3445 emit_byte(0xA5);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3446 emit_byte(0xC0 | src->encoding() << 3 | dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3447 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3448
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3449 void Assembler::shrdl(Register dst, Register src) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3450 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3451 emit_byte(0xAD);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3452 emit_byte(0xC0 | src->encoding() << 3 | dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3453 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3454
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3455 #else // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3456
1369
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3457 void Assembler::set_byte_if_not_zero(Register dst) {
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3458 int enc = prefix_and_encode(dst->encoding(), true);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3459 emit_byte(0x0F);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3460 emit_byte(0x95);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3461 emit_byte(0xE0 | enc);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3462 }
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1302
diff changeset
3463
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3464 // 64bit only pieces of the assembler
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3465 // 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
3466 // it cannot be used by instructions that want an immediate value.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3467
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3468 bool Assembler::reachable(AddressLiteral adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3469 int64_t disp;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3470 // 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
3471 // 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
3472 // always be reachable.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3473 if (adr.reloc() == relocInfo::none) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3474 return false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3475 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3476 if (adr.reloc() == relocInfo::internal_word_type) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3477 // This should be rip relative and easily reachable.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3478 return true;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3479 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3480 if (adr.reloc() == relocInfo::virtual_call_type ||
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3481 adr.reloc() == relocInfo::opt_virtual_call_type ||
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3482 adr.reloc() == relocInfo::static_call_type ||
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3483 adr.reloc() == relocInfo::static_stub_type ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3484 // This should be rip relative within the code cache and easily
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3485 // reachable until we get huge code caches. (At which point
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3486 // ic code is going to have issues).
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3487 return true;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3488 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3489 if (adr.reloc() != relocInfo::external_word_type &&
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3490 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
3491 adr.reloc() != relocInfo::poll_type && // relocs to identify them
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3492 adr.reloc() != relocInfo::runtime_call_type ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3493 return false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3494 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3495
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3496 // Stress the correction code
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3497 if (ForceUnreachable) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3498 // Must be runtimecall reloc, see if it is in the codecache
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3499 // Flipping stuff in the codecache to be unreachable causes issues
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3500 // with things like inline caches where the additional instructions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3501 // are not handled.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3502 if (CodeCache::find_blob(adr._target) == NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3503 return false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3504 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3505 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3506 // 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
3507 // 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
3508 // anywhere in the codeCache then we are always reachable.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3509 // 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
3510 // to be more pessimistic.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3511 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
3512 if (!is_simm32(disp)) return false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3513 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
3514 if (!is_simm32(disp)) return false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3515
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3516 disp = (int64_t)adr._target - ((int64_t)_code_pos + sizeof(int));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3517
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3518 // 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
3519 // 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
3520 // 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
3521 // 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
3522
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3523 // 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
3524 // + 4 because better safe than sorry.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3525 const int fudge = 12 + 4;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3526 if (disp < 0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3527 disp -= fudge;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3528 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3529 disp += fudge;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3530 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3531 return is_simm32(disp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3532 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3533
2404
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2357
diff changeset
3534 // Check if the polling page is not reachable from the code cache using rip-relative
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2357
diff changeset
3535 // addressing.
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2357
diff changeset
3536 bool Assembler::is_polling_page_far() {
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2357
diff changeset
3537 intptr_t addr = (intptr_t)os::get_polling_page();
4118
59bc0d4d9ea3 7110489: C1: 64-bit tiered with ForceUnreachable: assert(reachable(src)) failed: Address should be reachable
never
parents: 3938
diff changeset
3538 return ForceUnreachable ||
59bc0d4d9ea3 7110489: C1: 64-bit tiered with ForceUnreachable: assert(reachable(src)) failed: Address should be reachable
never
parents: 3938
diff changeset
3539 !is_simm32(addr - (intptr_t)CodeCache::low_bound()) ||
2404
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2357
diff changeset
3540 !is_simm32(addr - (intptr_t)CodeCache::high_bound());
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2357
diff changeset
3541 }
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2357
diff changeset
3542
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3543 void Assembler::emit_data64(jlong data,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3544 relocInfo::relocType rtype,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3545 int format) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3546 if (rtype == relocInfo::none) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3547 emit_long64(data);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3548 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3549 emit_data64(data, Relocation::spec_simple(rtype), format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3550 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3551 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3552
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3553 void Assembler::emit_data64(jlong data,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3554 RelocationHolder const& rspec,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3555 int format) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3556 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
3557 assert(imm_operand == format, "must be immediate");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3558 assert(inst_mark() != NULL, "must be inside InstructionMark");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3559 // Do not use AbstractAssembler::relocate, which is not intended for
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3560 // embedded words. Instead, relocate to the enclosing instruction.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3561 code_section()->relocate(inst_mark(), rspec, format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3562 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3563 check_relocation(rspec, format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3564 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3565 emit_long64(data);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3566 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3567
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3568 int Assembler::prefix_and_encode(int reg_enc, bool byteinst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3569 if (reg_enc >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3570 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3571 reg_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3572 } else if (byteinst && reg_enc >= 4) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3573 prefix(REX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3574 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3575 return reg_enc;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3576 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3577
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3578 int Assembler::prefixq_and_encode(int reg_enc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3579 if (reg_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3580 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3581 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3582 prefix(REX_WB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3583 reg_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3584 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3585 return reg_enc;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3586 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3587
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3588 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
3589 if (dst_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3590 if (src_enc >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3591 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3592 src_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3593 } else if (byteinst && src_enc >= 4) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3594 prefix(REX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3595 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3596 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3597 if (src_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3598 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3599 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3600 prefix(REX_RB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3601 src_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3602 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3603 dst_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3604 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3605 return dst_enc << 3 | src_enc;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3606 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3607
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3608 int Assembler::prefixq_and_encode(int dst_enc, int src_enc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3609 if (dst_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3610 if (src_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3611 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3612 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3613 prefix(REX_WB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3614 src_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3615 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3616 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3617 if (src_enc < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3618 prefix(REX_WR);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3619 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3620 prefix(REX_WRB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3621 src_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3622 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3623 dst_enc -= 8;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3624 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3625 return dst_enc << 3 | src_enc;
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(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3629 if (reg->encoding() >= 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3630 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3631 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3632 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3633
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3634 void Assembler::prefix(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3635 if (adr.base_needs_rex()) {
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_XB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3638 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3639 prefix(REX_B);
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3642 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3643 prefix(REX_X);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3644 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3645 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3646 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3647
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3648 void Assembler::prefixq(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3649 if (adr.base_needs_rex()) {
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_WXB);
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_WB);
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3656 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3657 prefix(REX_WX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3658 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3659 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3660 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3661 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3662 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3663
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3664
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3665 void Assembler::prefix(Address adr, Register reg, bool byteinst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3666 if (reg->encoding() < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3667 if (adr.base_needs_rex()) {
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_XB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3670 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3671 prefix(REX_B);
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3674 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3675 prefix(REX_X);
3855
381bf869f784 7079626: x64 emits unnecessary REX prefix
twisti
parents: 3854
diff changeset
3676 } else if (byteinst && reg->encoding() >= 4 ) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3677 prefix(REX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3678 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3679 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3680 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3681 if (adr.base_needs_rex()) {
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_RXB);
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_RB);
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3688 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3689 prefix(REX_RX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3690 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3691 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3692 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3693 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3694 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3695 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3696
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3697 void Assembler::prefixq(Address adr, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3698 if (src->encoding() < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3699 if (adr.base_needs_rex()) {
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_WXB);
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_WB);
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3706 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3707 prefix(REX_WX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3708 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3709 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3710 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3711 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3712 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3713 if (adr.base_needs_rex()) {
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_WRXB);
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_WRB);
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3720 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3721 prefix(REX_WRX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3722 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3723 prefix(REX_WR);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3724 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3725 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3726 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3727 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3728
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3729 void Assembler::prefix(Address adr, XMMRegister reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3730 if (reg->encoding() < 8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3731 if (adr.base_needs_rex()) {
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_XB);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3734 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3735 prefix(REX_B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3736 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3737 } else {
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_X);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3740 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3741 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3742 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3743 if (adr.base_needs_rex()) {
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_RXB);
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_RB);
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3750 if (adr.index_needs_rex()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3751 prefix(REX_RX);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3752 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3753 prefix(REX_R);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3754 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3755 }
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3759 void Assembler::adcq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3760 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3761 emit_arith(0x81, 0xD0, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3762 }
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 void Assembler::adcq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3765 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3766 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3767 emit_byte(0x13);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3768 emit_operand(dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3771 void Assembler::adcq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3772 (int) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3773 emit_arith(0x13, 0xC0, dst, src);
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, int32_t imm32) {
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);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3779 emit_arith_operand(0x81, rax, dst,imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3780 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3781
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3782 void Assembler::addq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3783 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3784 prefixq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3785 emit_byte(0x01);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3786 emit_operand(src, dst);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3789 void Assembler::addq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3790 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3791 emit_arith(0x81, 0xC0, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3792 }
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 void Assembler::addq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3795 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3796 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3797 emit_byte(0x03);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3798 emit_operand(dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3801 void Assembler::addq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3802 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3803 emit_arith(0x03, 0xC0, dst, src);
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
3457
a3081a3a2b54 7056380: VM crashes with SIGSEGV in compiled code
never
parents: 3446
diff changeset
3806 void Assembler::andq(Address dst, int32_t imm32) {
a3081a3a2b54 7056380: VM crashes with SIGSEGV in compiled code
never
parents: 3446
diff changeset
3807 InstructionMark im(this);
a3081a3a2b54 7056380: VM crashes with SIGSEGV in compiled code
never
parents: 3446
diff changeset
3808 prefixq(dst);
a3081a3a2b54 7056380: VM crashes with SIGSEGV in compiled code
never
parents: 3446
diff changeset
3809 emit_byte(0x81);
a3081a3a2b54 7056380: VM crashes with SIGSEGV in compiled code
never
parents: 3446
diff changeset
3810 emit_operand(rsp, dst, 4);
a3081a3a2b54 7056380: VM crashes with SIGSEGV in compiled code
never
parents: 3446
diff changeset
3811 emit_long(imm32);
a3081a3a2b54 7056380: VM crashes with SIGSEGV in compiled code
never
parents: 3446
diff changeset
3812 }
a3081a3a2b54 7056380: VM crashes with SIGSEGV in compiled code
never
parents: 3446
diff changeset
3813
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3814 void Assembler::andq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3815 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3816 emit_arith(0x81, 0xE0, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3817 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3818
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3819 void Assembler::andq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3820 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3821 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3822 emit_byte(0x23);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3823 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3824 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3825
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3826 void Assembler::andq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3827 (int) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3828 emit_arith(0x23, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3829 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3830
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3831 void Assembler::bsfq(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3832 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3833 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3834 emit_byte(0xBC);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3835 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3836 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3837
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3838 void Assembler::bsrq(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3839 assert(!VM_Version::supports_lzcnt(), "encoding is treated as LZCNT");
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3840 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3841 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3842 emit_byte(0xBD);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3843 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3844 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
3845
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3846 void Assembler::bswapq(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3847 int encode = prefixq_and_encode(reg->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3848 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3849 emit_byte(0xC8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3850 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3851
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3852 void Assembler::cdqq() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3853 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3854 emit_byte(0x99);
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::clflush(Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3858 prefix(adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3859 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3860 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3861 emit_operand(rdi, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3862 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3863
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3864 void Assembler::cmovq(Condition cc, Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3865 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3866 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3867 emit_byte(0x40 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3868 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3869 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3870
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3871 void Assembler::cmovq(Condition cc, Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3872 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3873 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3874 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3875 emit_byte(0x40 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3876 emit_operand(dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3879 void Assembler::cmpq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3880 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3881 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3882 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3883 emit_operand(rdi, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3884 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3885 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3886
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3887 void Assembler::cmpq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3888 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3889 emit_arith(0x81, 0xF8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3890 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3891
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3892 void Assembler::cmpq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3893 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3894 prefixq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3895 emit_byte(0x3B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3896 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3897 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3898
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3899 void Assembler::cmpq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3900 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3901 emit_arith(0x3B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3902 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3903
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3904 void Assembler::cmpq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3905 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3906 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3907 emit_byte(0x3B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3908 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3909 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3910
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3911 void Assembler::cmpxchgq(Register reg, Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3912 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3913 prefixq(adr, reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3914 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3915 emit_byte(0xB1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3916 emit_operand(reg, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3917 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3918
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3919 void Assembler::cvtsi2sdq(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3920 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3921 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3922 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3923 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3924 emit_byte(0x2A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3925 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3926 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3927
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3928 void Assembler::cvtsi2ssq(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3929 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3930 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3931 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3932 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3933 emit_byte(0x2A);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3934 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3935 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3936
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3937 void Assembler::cvttsd2siq(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3938 NOT_LP64(assert(VM_Version::supports_sse2(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3939 emit_byte(0xF2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3940 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3941 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3942 emit_byte(0x2C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3943 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3944 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3945
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3946 void Assembler::cvttss2siq(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3947 NOT_LP64(assert(VM_Version::supports_sse(), ""));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3948 emit_byte(0xF3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3949 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3950 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3951 emit_byte(0x2C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3952 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3953 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3954
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3955 void Assembler::decl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3956 // Don't use it directly. Use MacroAssembler::decrementl() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3957 // 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
3958 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3959 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3960 emit_byte(0xC8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3961 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3962
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3963 void Assembler::decq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3964 // Don't use it directly. Use MacroAssembler::decrementq() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3965 // 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
3966 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3967 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3968 emit_byte(0xC8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3969 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3970
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3971 void Assembler::decq(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3972 // Don't use it directly. Use MacroAssembler::decrementq() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3973 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3974 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3975 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3976 emit_operand(rcx, 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::fxrstor(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3980 prefixq(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3981 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3982 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3983 emit_operand(as_Register(1), src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3986 void Assembler::fxsave(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3987 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3988 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3989 emit_byte(0xAE);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3990 emit_operand(as_Register(0), dst);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3993 void Assembler::idivq(Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3994 int encode = prefixq_and_encode(src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3995 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3996 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3997 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3998
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3999 void Assembler::imulq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4000 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4001 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4002 emit_byte(0xAF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4003 emit_byte(0xC0 | encode);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4006 void Assembler::imulq(Register dst, Register src, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4007 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4008 if (is8bit(value)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4009 emit_byte(0x6B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4010 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
4011 emit_byte(value & 0xFF);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4012 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4013 emit_byte(0x69);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4014 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4015 emit_long(value);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4016 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4017 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4018
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4019 void Assembler::incl(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4020 // Don't use it directly. Use MacroAssembler::incrementl() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4021 // 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
4022 int encode = prefix_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4023 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4024 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4025 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4026
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4027 void Assembler::incq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4028 // Don't use it directly. Use MacroAssembler::incrementq() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4029 // 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
4030 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4031 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4032 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4033 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4034
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4035 void Assembler::incq(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4036 // Don't use it directly. Use MacroAssembler::incrementq() instead.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4037 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4038 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4039 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4040 emit_operand(rax, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4041 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4042
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4043 void Assembler::lea(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4044 leaq(dst, src);
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::leaq(Register dst, Address src) {
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 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4050 emit_byte(0x8D);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4051 emit_operand(dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4054 void Assembler::mov64(Register dst, int64_t imm64) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4055 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4056 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4057 emit_byte(0xB8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4058 emit_long64(imm64);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4059 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4060
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4061 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
4062 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4063 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4064 emit_byte(0xB8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4065 emit_data64(imm64, rspec);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4066 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4067
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4068 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
4069 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4070 int encode = prefix_and_encode(dst->encoding());
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4071 emit_byte(0xB8 | encode);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4072 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
4073 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4074
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4075 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
4076 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4077 prefix(dst);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4078 emit_byte(0xC7);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4079 emit_operand(rax, dst, 4);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4080 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
4081 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4082
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4083 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
4084 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4085 int encode = prefix_and_encode(src1->encoding());
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4086 emit_byte(0x81);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4087 emit_byte(0xF8 | encode);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4088 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
4089 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4090
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4091 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
4092 InstructionMark im(this);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4093 prefix(src1);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4094 emit_byte(0x81);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4095 emit_operand(rax, src1, 4);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4096 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
4097 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
4098
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4099 void Assembler::lzcntq(Register dst, Register src) {
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4100 assert(VM_Version::supports_lzcnt(), "encoding is treated as BSR");
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4101 emit_byte(0xF3);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4102 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4103 emit_byte(0x0F);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4104 emit_byte(0xBD);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4105 emit_byte(0xC0 | encode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4106 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
4107
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4108 void Assembler::movdq(XMMRegister dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4109 // table D-1 says MMX/SSE2
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4110 NOT_LP64(assert(VM_Version::supports_sse2() || VM_Version::supports_mmx(), ""));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4111 emit_byte(0x66);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4112 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4113 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4114 emit_byte(0x6E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4115 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4116 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4117
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4118 void Assembler::movdq(Register dst, XMMRegister src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4119 // table D-1 says MMX/SSE2
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4120 NOT_LP64(assert(VM_Version::supports_sse2() || VM_Version::supports_mmx(), ""));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4121 emit_byte(0x66);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4122 // swap src/dst to get correct prefix
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4123 int encode = prefixq_and_encode(src->encoding(), dst->encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4124 emit_byte(0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
4125 emit_byte(0x7E);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4126 emit_byte(0xC0 | encode);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4129 void Assembler::movq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4130 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4131 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4132 emit_byte(0xC0 | encode);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4135 void Assembler::movq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4136 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4137 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4138 emit_byte(0x8B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4139 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4140 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4141
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4142 void Assembler::movq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4143 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4144 prefixq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4145 emit_byte(0x89);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4146 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4147 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4148
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4149 void Assembler::movsbq(Register dst, Address src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4150 InstructionMark im(this);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4151 prefixq(src, dst);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4152 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4153 emit_byte(0xBE);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4154 emit_operand(dst, src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4155 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4156
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4157 void Assembler::movsbq(Register dst, Register src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4158 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4159 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4160 emit_byte(0xBE);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4161 emit_byte(0xC0 | encode);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4162 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4163
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4164 void Assembler::movslq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4165 // dbx shows movslq(rcx, 3) as movq $0x0000000049000000,(%rbx)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4166 // and movslq(r8, 3); as movl $0x0000000048000000,(%rbx)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4167 // as a result we shouldn't use until tested at runtime...
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4168 ShouldNotReachHere();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4169 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4170 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4171 emit_byte(0xC7 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4172 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4173 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4174
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4175 void Assembler::movslq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4176 assert(is_simm32(imm32), "lost bits");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4177 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4178 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4179 emit_byte(0xC7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4180 emit_operand(rax, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4181 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4182 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4183
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4184 void Assembler::movslq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4185 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4186 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4187 emit_byte(0x63);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4188 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4189 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4190
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4191 void Assembler::movslq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4192 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4193 emit_byte(0x63);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4194 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4195 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4196
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4197 void Assembler::movswq(Register dst, Address src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4198 InstructionMark im(this);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4199 prefixq(src, dst);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4200 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4201 emit_byte(0xBF);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4202 emit_operand(dst, src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4203 }
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 void Assembler::movswq(Register dst, Register src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4206 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4207 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4208 emit_byte(0xBF);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4209 emit_byte(0xC0 | encode);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4210 }
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 void Assembler::movzbq(Register dst, Address src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4213 InstructionMark im(this);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4214 prefixq(src, dst);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4215 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4216 emit_byte(0xB6);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4217 emit_operand(dst, src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4218 }
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 void Assembler::movzbq(Register dst, Register src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4221 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4222 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4223 emit_byte(0xB6);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4224 emit_byte(0xC0 | encode);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4225 }
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 void Assembler::movzwq(Register dst, Address src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4228 InstructionMark im(this);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4229 prefixq(src, dst);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4230 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4231 emit_byte(0xB7);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4232 emit_operand(dst, src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4233 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4234
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4235 void Assembler::movzwq(Register dst, Register src) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4236 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4237 emit_byte(0x0F);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4238 emit_byte(0xB7);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4239 emit_byte(0xC0 | encode);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4240 }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
4241
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4242 void Assembler::negq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4243 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4244 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4245 emit_byte(0xD8 | encode);
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::notq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4249 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4250 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4251 emit_byte(0xD0 | encode);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4254 void Assembler::orq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4255 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4256 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4257 emit_byte(0x81);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4258 emit_operand(rcx, dst, 4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4259 emit_long(imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4260 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4261
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4262 void Assembler::orq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4263 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4264 emit_arith(0x81, 0xC8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4265 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4266
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4267 void Assembler::orq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4268 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4269 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4270 emit_byte(0x0B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4271 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4272 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4273
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4274 void Assembler::orq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4275 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4276 emit_arith(0x0B, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4277 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4278
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4279 void Assembler::popa() { // 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4280 movq(r15, Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4281 movq(r14, Address(rsp, wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4282 movq(r13, Address(rsp, 2 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4283 movq(r12, Address(rsp, 3 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4284 movq(r11, Address(rsp, 4 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4285 movq(r10, Address(rsp, 5 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4286 movq(r9, Address(rsp, 6 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4287 movq(r8, Address(rsp, 7 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4288 movq(rdi, Address(rsp, 8 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4289 movq(rsi, Address(rsp, 9 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4290 movq(rbp, Address(rsp, 10 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4291 // skip rsp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4292 movq(rbx, Address(rsp, 12 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4293 movq(rdx, Address(rsp, 13 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4294 movq(rcx, Address(rsp, 14 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4295 movq(rax, Address(rsp, 15 * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4296
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4297 addq(rsp, 16 * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4298 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4299
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4300 void Assembler::popcntq(Register dst, Address src) {
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4301 assert(VM_Version::supports_popcnt(), "must support");
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4302 InstructionMark im(this);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4303 emit_byte(0xF3);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4304 prefixq(src, dst);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4305 emit_byte(0x0F);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4306 emit_byte(0xB8);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4307 emit_operand(dst, src);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4308 }
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4309
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4310 void Assembler::popcntq(Register dst, Register src) {
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4311 assert(VM_Version::supports_popcnt(), "must support");
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4312 emit_byte(0xF3);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4313 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
4314 emit_byte(0x0F);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4315 emit_byte(0xB8);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4316 emit_byte(0xC0 | encode);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4317 }
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
4318
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4319 void Assembler::popq(Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4320 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4321 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4322 emit_byte(0x8F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4323 emit_operand(rax, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4324 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4325
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4326 void Assembler::pusha() { // 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4327 // we have to store original rsp. ABI says that 128 bytes
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4328 // below rsp are local scratch.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4329 movq(Address(rsp, -5 * wordSize), rsp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4330
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4331 subq(rsp, 16 * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4332
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4333 movq(Address(rsp, 15 * wordSize), rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4334 movq(Address(rsp, 14 * wordSize), rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4335 movq(Address(rsp, 13 * wordSize), rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4336 movq(Address(rsp, 12 * wordSize), rbx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4337 // skip rsp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4338 movq(Address(rsp, 10 * wordSize), rbp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4339 movq(Address(rsp, 9 * wordSize), rsi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4340 movq(Address(rsp, 8 * wordSize), rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4341 movq(Address(rsp, 7 * wordSize), r8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4342 movq(Address(rsp, 6 * wordSize), r9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4343 movq(Address(rsp, 5 * wordSize), r10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4344 movq(Address(rsp, 4 * wordSize), r11);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4345 movq(Address(rsp, 3 * wordSize), r12);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4346 movq(Address(rsp, 2 * wordSize), r13);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4347 movq(Address(rsp, wordSize), r14);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4348 movq(Address(rsp, 0), r15);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4349 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4350
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4351 void Assembler::pushq(Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4352 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4353 prefixq(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4354 emit_byte(0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4355 emit_operand(rsi, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4356 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4357
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4358 void Assembler::rclq(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4359 assert(isShiftCount(imm8 >> 1), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4360 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4361 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4362 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4363 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4364 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4365 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4366 emit_byte(0xD0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4367 emit_byte(imm8);
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 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4370 void Assembler::sarq(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4371 assert(isShiftCount(imm8 >> 1), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4372 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4373 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4374 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4375 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4376 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4377 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4378 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4379 emit_byte(imm8);
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 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4382
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4383 void Assembler::sarq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4384 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4385 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4386 emit_byte(0xF8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4387 }
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
4388
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4389 void Assembler::sbbq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4390 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4391 prefixq(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4392 emit_arith_operand(0x81, rbx, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4393 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4394
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4395 void Assembler::sbbq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4396 (void) prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4397 emit_arith(0x81, 0xD8, dst, imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4398 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4399
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4400 void Assembler::sbbq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4401 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4402 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4403 emit_byte(0x1B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4404 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4405 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4406
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4407 void Assembler::sbbq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4408 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4409 emit_arith(0x1B, 0xC0, dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4412 void Assembler::shlq(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4413 assert(isShiftCount(imm8 >> 1), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4414 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4415 if (imm8 == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4416 emit_byte(0xD1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4417 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4418 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4419 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4420 emit_byte(0xE0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4421 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4422 }
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::shlq(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(0xE0 | 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::shrq(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4432 assert(isShiftCount(imm8 >> 1), "illegal shift count");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4433 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4434 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4435 emit_byte(0xE8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4436 emit_byte(imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4437 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4438
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4439 void Assembler::shrq(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4440 int encode = prefixq_and_encode(dst->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4441 emit_byte(0xD3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4442 emit_byte(0xE8 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4443 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4444
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4445 void Assembler::subq(Address dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4446 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4447 prefixq(dst);
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
4448 emit_arith_operand(0x81, rbp, dst, imm32);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4449 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4450
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4451 void Assembler::subq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4452 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4453 prefixq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4454 emit_byte(0x29);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4455 emit_operand(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4456 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4457
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
4458 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
4459 (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
4460 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
4461 }
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
4462
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4463 void Assembler::subq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4464 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4465 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4466 emit_byte(0x2B);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4467 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4468 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4469
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4470 void Assembler::subq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4471 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4472 emit_arith(0x2B, 0xC0, dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4475 void Assembler::testq(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4476 // not using emit_arith because test
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4477 // doesn't support sign-extension of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4478 // 8bit operands
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4479 int encode = dst->encoding();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4480 if (encode == 0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4481 prefix(REX_W);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4482 emit_byte(0xA9);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4483 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4484 encode = prefixq_and_encode(encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4485 emit_byte(0xF7);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4486 emit_byte(0xC0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4487 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4488 emit_long(imm32);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4491 void Assembler::testq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4492 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4493 emit_arith(0x85, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4494 }
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 void Assembler::xaddq(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4497 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4498 prefixq(dst, src);
71
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
4499 emit_byte(0x0F);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4500 emit_byte(0xC1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4501 emit_operand(src, dst);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4504 void Assembler::xchgq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4505 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4506 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4507 emit_byte(0x87);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4508 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4509 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4510
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4511 void Assembler::xchgq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4512 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4513 emit_byte(0x87);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4514 emit_byte(0xc0 | encode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4515 }
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 void Assembler::xorq(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4518 (void) prefixq_and_encode(dst->encoding(), src->encoding());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4519 emit_arith(0x33, 0xC0, dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4520 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4521
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4522 void Assembler::xorq(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4523 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4524 prefixq(src, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4525 emit_byte(0x33);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4526 emit_operand(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4527 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4528
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4529 #endif // !LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4530
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4531 static Assembler::Condition reverse[] = {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4532 Assembler::noOverflow /* overflow = 0x0 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4533 Assembler::overflow /* noOverflow = 0x1 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4534 Assembler::aboveEqual /* carrySet = 0x2, below = 0x2 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4535 Assembler::below /* aboveEqual = 0x3, carryClear = 0x3 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4536 Assembler::notZero /* zero = 0x4, equal = 0x4 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4537 Assembler::zero /* notZero = 0x5, notEqual = 0x5 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4538 Assembler::above /* belowEqual = 0x6 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4539 Assembler::belowEqual /* above = 0x7 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4540 Assembler::positive /* negative = 0x8 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4541 Assembler::negative /* positive = 0x9 */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4542 Assembler::noParity /* parity = 0xa */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4543 Assembler::parity /* noParity = 0xb */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4544 Assembler::greaterEqual /* less = 0xc */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4545 Assembler::less /* greaterEqual = 0xd */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4546 Assembler::greater /* lessEqual = 0xe */ ,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4547 Assembler::lessEqual /* greater = 0xf, */
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4548
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4549 };
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4550
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4551
a61af66fc99e Initial load
duke
parents:
diff changeset
4552 // Implementation of MacroAssembler
a61af66fc99e Initial load
duke
parents:
diff changeset
4553
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4554 // 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
4555 // Unless the difference is trivial (1 line or so).
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4556
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4557 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4558
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4559 // 32bit versions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4560
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4561 Address MacroAssembler::as_Address(AddressLiteral adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4562 return Address(adr.target(), adr.rspec());
a61af66fc99e Initial load
duke
parents:
diff changeset
4563 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4564
a61af66fc99e Initial load
duke
parents:
diff changeset
4565 Address MacroAssembler::as_Address(ArrayAddress adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4566 return Address::make_array(adr);
a61af66fc99e Initial load
duke
parents:
diff changeset
4567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4568
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4569 int MacroAssembler::biased_locking_enter(Register lock_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4570 Register obj_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4571 Register swap_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4572 Register tmp_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4573 bool swap_reg_contains_mark,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4574 Label& done,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4575 Label* slow_case,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4576 BiasedLockingCounters* counters) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4577 assert(UseBiasedLocking, "why call this otherwise?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4578 assert(swap_reg == rax, "swap_reg must be rax, for cmpxchg");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4579 assert_different_registers(lock_reg, obj_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4580
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4581 if (PrintBiasedLockingStatistics && counters == NULL)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4582 counters = BiasedLocking::counters();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4583
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4584 bool need_tmp_reg = false;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4585 if (tmp_reg == noreg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4586 need_tmp_reg = true;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4587 tmp_reg = lock_reg;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4588 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4589 assert_different_registers(lock_reg, obj_reg, swap_reg, tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4590 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4591 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
4592 Address mark_addr (obj_reg, oopDesc::mark_offset_in_bytes());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4593 Address klass_addr (obj_reg, oopDesc::klass_offset_in_bytes());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4594 Address saved_mark_addr(lock_reg, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4595
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4596 // Biased locking
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4597 // See whether the lock is currently biased toward our thread and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4598 // whether the epoch is still valid
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4599 // Note that the runtime guarantees sufficient alignment of JavaThread
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4600 // pointers to allow age to be placed into low bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4601 // 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
4602 Label cas_label;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4603 int null_check_offset = -1;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4604 if (!swap_reg_contains_mark) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4605 null_check_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4606 movl(swap_reg, mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4607 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4608 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4609 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4610 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4611 movl(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4612 andl(tmp_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4613 cmpl(tmp_reg, markOopDesc::biased_lock_pattern);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4614 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4615 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4616 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4617 jcc(Assembler::notEqual, cas_label);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4618 // 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
4619 // whether the bias owner and the epoch are both still current.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4620 // 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
4621 // 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
4622 // avoid reloading it and needing to recheck invariants below. This
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4623 // store is unfortunate but it makes the overall code shorter and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4624 // simpler.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4625 movl(saved_mark_addr, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4626 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4627 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4628 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4629 get_thread(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4630 xorl(swap_reg, tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4631 if (swap_reg_contains_mark) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4632 null_check_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4633 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4634 movl(tmp_reg, klass_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4635 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
4636 andl(swap_reg, ~((int) markOopDesc::age_mask_in_place));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4637 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4638 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4639 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4640 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4641 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4642 ExternalAddress((address)counters->biased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4643 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4644 jcc(Assembler::equal, done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4645
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4646 Label try_revoke_bias;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4647 Label try_rebias;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4648
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4649 // 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
4650 // 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
4651 // 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
4652 // know what operations can be legally performed on the object's
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4653 // header.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4654
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4655 // 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
4656 // 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
4657 // the bias on this object.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4658 testl(swap_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4659 jcc(Assembler::notZero, try_revoke_bias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4660
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4661 // Biasing is still enabled for this data type. See whether the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4662 // 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
4663 // 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
4664 // prototype header. (Note that the prototype header's epoch bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4665 // 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
4666 // toward the current thread. Note that we must be absolutely sure
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4667 // 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
4668 // otherwise the manipulations it performs on the mark word are
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4669 // illegal.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4670 testl(swap_reg, markOopDesc::epoch_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4671 jcc(Assembler::notZero, try_rebias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4672
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4673 // 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
4674 // 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
4675 // 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
4676 // 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
4677 // Note that we first construct the presumed unbiased header so we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4678 // don't accidentally blow away another thread's valid bias.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4679 movl(swap_reg, saved_mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4680 andl(swap_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4681 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
4682 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4683 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4684 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4685 get_thread(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4686 orl(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4687 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4688 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4689 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4690 cmpxchgptr(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4691 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4692 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4693 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4694 // If the biasing toward our thread failed, this means that
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4695 // another thread succeeded in biasing it toward itself and we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4696 // need to revoke that bias. The revocation will occur in the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4697 // interpreter runtime in the slow case.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4698 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4699 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4700 ExternalAddress((address)counters->anonymously_biased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4701 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4702 if (slow_case != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4703 jcc(Assembler::notZero, *slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4704 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4705 jmp(done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4706
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4707 bind(try_rebias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4708 // 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
4709 // current "bias owner", if any, is actually invalid. Under these
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4710 // circumstances _only_, we are allowed to use the current header's
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4711 // 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
4712 // 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
4713 // the bias from one thread to another directly in this situation.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4714 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4715 // 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
4716 // bits in this situation. Should attempt to preserve them.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4717 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4718 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4719 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4720 get_thread(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4721 movl(swap_reg, klass_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4722 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
4723 movl(swap_reg, saved_mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4724 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4725 lock();
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 cmpxchgptr(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4728 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4729 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4730 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4731 // If the biasing toward our thread failed, then another thread
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4732 // 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
4733 // 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
4734 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4735 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4736 ExternalAddress((address)counters->rebiased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4737 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4738 if (slow_case != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4739 jcc(Assembler::notZero, *slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4740 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4741 jmp(done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4742
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4743 bind(try_revoke_bias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4744 // 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
4745 // more, indicating that objects of this data type are not supposed
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4746 // 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
4747 // this object to the prototype value and fall through to the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4748 // 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
4749 // that another thread raced us for the privilege of revoking the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4750 // 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
4751 // normal locking code.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4752 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4753 // 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
4754 // bits in this situation. Should attempt to preserve them.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4755 movl(swap_reg, saved_mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4756 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4757 push(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4758 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4759 movl(tmp_reg, klass_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4760 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
4761 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4762 lock();
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 cmpxchgptr(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4765 if (need_tmp_reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4766 pop(tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4767 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4768 // 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
4769 // 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
4770 // removing the bias bit from the object's header.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4771 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4772 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4773 ExternalAddress((address)counters->revoked_lock_entry_count_addr()));
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 bind(cas_label);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4777
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4778 return null_check_offset;
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::call_VM_leaf_base(address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4781 int number_of_arguments) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4782 call(RuntimeAddress(entry_point));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4783 increment(rsp, number_of_arguments * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4784 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4785
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4786 void MacroAssembler::cmpoop(Address src1, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4787 cmp_literal32(src1, (int32_t)obj, oop_Relocation::spec_for_immediate());
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4790 void MacroAssembler::cmpoop(Register src1, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4791 cmp_literal32(src1, (int32_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4792 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4793
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4794 void MacroAssembler::extend_sign(Register hi, Register lo) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4795 // According to Intel Doc. AP-526, "Integer Divide", p.18.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4796 if (VM_Version::is_P6() && hi == rdx && lo == rax) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4797 cdql();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4798 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4799 movl(hi, lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4800 sarl(hi, 31);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4801 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4802 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4803
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4804 void MacroAssembler::fat_nop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4805 // A 5 byte nop that is safe for patching (see patch_verified_entry)
a61af66fc99e Initial load
duke
parents:
diff changeset
4806 emit_byte(0x26); // es:
a61af66fc99e Initial load
duke
parents:
diff changeset
4807 emit_byte(0x2e); // cs:
a61af66fc99e Initial load
duke
parents:
diff changeset
4808 emit_byte(0x64); // fs:
a61af66fc99e Initial load
duke
parents:
diff changeset
4809 emit_byte(0x65); // gs:
a61af66fc99e Initial load
duke
parents:
diff changeset
4810 emit_byte(0x90);
a61af66fc99e Initial load
duke
parents:
diff changeset
4811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4812
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4813 void MacroAssembler::jC2(Register tmp, Label& L) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4814 // set parity bit if FPU flag C2 is set (via rax)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4815 save_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4816 fwait(); fnstsw_ax();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4817 sahf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4818 restore_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4819 // branch
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4820 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4821 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4822
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4823 void MacroAssembler::jnC2(Register tmp, Label& L) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4824 // set parity bit if FPU flag C2 is set (via rax)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4825 save_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4826 fwait(); fnstsw_ax();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4827 sahf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4828 restore_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4829 // branch
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4830 jcc(Assembler::noParity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4831 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4832
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4833 // 32bit can do a case table jump in one instruction but we no longer allow the base
a61af66fc99e Initial load
duke
parents:
diff changeset
4834 // to be installed in the Address class
a61af66fc99e Initial load
duke
parents:
diff changeset
4835 void MacroAssembler::jump(ArrayAddress entry) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4836 jmp(as_Address(entry));
a61af66fc99e Initial load
duke
parents:
diff changeset
4837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4838
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4839 // Note: y_lo will be destroyed
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4840 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
4841 // Long compare for Java (semantics as described in JVM spec.)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4842 Label high, low, 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 cmpl(x_hi, y_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4845 jcc(Assembler::less, low);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4846 jcc(Assembler::greater, high);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4847 // x_hi is the return register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4848 xorl(x_hi, x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4849 cmpl(x_lo, y_lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4850 jcc(Assembler::below, low);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4851 jcc(Assembler::equal, done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4852
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4853 bind(high);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4854 xorl(x_hi, x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4855 increment(x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4856 jmp(done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4857
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4858 bind(low);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4859 xorl(x_hi, x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4860 decrementl(x_hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4861
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4862 bind(done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4863 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4864
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4865 void MacroAssembler::lea(Register dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4866 mov_literal32(dst, (int32_t)src.target(), src.rspec());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4867 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4868
a61af66fc99e Initial load
duke
parents:
diff changeset
4869 void MacroAssembler::lea(Address dst, AddressLiteral adr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4870 // leal(dst, as_Address(adr));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4871 // see note in movl as to why we must use a move
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4872 mov_literal32(dst, (int32_t) adr.target(), adr.rspec());
a61af66fc99e Initial load
duke
parents:
diff changeset
4873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4874
a61af66fc99e Initial load
duke
parents:
diff changeset
4875 void MacroAssembler::leave() {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4876 mov(rsp, rbp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4877 pop(rbp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4878 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4879
a61af66fc99e Initial load
duke
parents:
diff changeset
4880 void MacroAssembler::lmul(int x_rsp_offset, int y_rsp_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4881 // Multiplication of two Java long values stored on the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
4882 // as illustrated below. Result is in rdx:rax.
a61af66fc99e Initial load
duke
parents:
diff changeset
4883 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4884 // rsp ---> [ ?? ] \ \
a61af66fc99e Initial load
duke
parents:
diff changeset
4885 // .... | y_rsp_offset |
a61af66fc99e Initial load
duke
parents:
diff changeset
4886 // [ y_lo ] / (in bytes) | x_rsp_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
4887 // [ y_hi ] | (in bytes)
a61af66fc99e Initial load
duke
parents:
diff changeset
4888 // .... |
a61af66fc99e Initial load
duke
parents:
diff changeset
4889 // [ x_lo ] /
a61af66fc99e Initial load
duke
parents:
diff changeset
4890 // [ x_hi ]
a61af66fc99e Initial load
duke
parents:
diff changeset
4891 // ....
a61af66fc99e Initial load
duke
parents:
diff changeset
4892 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4893 // Basic idea: lo(result) = lo(x_lo * y_lo)
a61af66fc99e Initial load
duke
parents:
diff changeset
4894 // hi(result) = hi(x_lo * y_lo) + lo(x_hi * y_lo) + lo(x_lo * y_hi)
a61af66fc99e Initial load
duke
parents:
diff changeset
4895 Address x_hi(rsp, x_rsp_offset + wordSize); Address x_lo(rsp, x_rsp_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
4896 Address y_hi(rsp, y_rsp_offset + wordSize); Address y_lo(rsp, y_rsp_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
4897 Label quick;
a61af66fc99e Initial load
duke
parents:
diff changeset
4898 // load x_hi, y_hi and check if quick
a61af66fc99e Initial load
duke
parents:
diff changeset
4899 // multiplication is possible
a61af66fc99e Initial load
duke
parents:
diff changeset
4900 movl(rbx, x_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4901 movl(rcx, y_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4902 movl(rax, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
4903 orl(rbx, rcx); // rbx, = 0 <=> x_hi = 0 and y_hi = 0
a61af66fc99e Initial load
duke
parents:
diff changeset
4904 jcc(Assembler::zero, quick); // if rbx, = 0 do quick multiply
a61af66fc99e Initial load
duke
parents:
diff changeset
4905 // do full multiplication
a61af66fc99e Initial load
duke
parents:
diff changeset
4906 // 1st step
a61af66fc99e Initial load
duke
parents:
diff changeset
4907 mull(y_lo); // x_hi * y_lo
a61af66fc99e Initial load
duke
parents:
diff changeset
4908 movl(rbx, rax); // save lo(x_hi * y_lo) in rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
4909 // 2nd step
a61af66fc99e Initial load
duke
parents:
diff changeset
4910 movl(rax, x_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
4911 mull(rcx); // x_lo * y_hi
a61af66fc99e Initial load
duke
parents:
diff changeset
4912 addl(rbx, rax); // add lo(x_lo * y_hi) to rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
4913 // 3rd step
a61af66fc99e Initial load
duke
parents:
diff changeset
4914 bind(quick); // note: rbx, = 0 if quick multiply!
a61af66fc99e Initial load
duke
parents:
diff changeset
4915 movl(rax, x_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
4916 mull(y_lo); // x_lo * y_lo
a61af66fc99e Initial load
duke
parents:
diff changeset
4917 addl(rdx, rbx); // correct hi(x_lo * y_lo)
a61af66fc99e Initial load
duke
parents:
diff changeset
4918 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4919
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4920 void MacroAssembler::lneg(Register hi, Register lo) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4921 negl(lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4922 adcl(hi, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4923 negl(hi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4924 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4925
a61af66fc99e Initial load
duke
parents:
diff changeset
4926 void MacroAssembler::lshl(Register hi, Register lo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4927 // Java shift left long support (semantics as described in JVM spec., p.305)
a61af66fc99e Initial load
duke
parents:
diff changeset
4928 // (basic idea for shift counts s >= n: x << s == (x << n) << (s - n))
a61af66fc99e Initial load
duke
parents:
diff changeset
4929 // shift value is in rcx !
a61af66fc99e Initial load
duke
parents:
diff changeset
4930 assert(hi != rcx, "must not use rcx");
a61af66fc99e Initial load
duke
parents:
diff changeset
4931 assert(lo != rcx, "must not use rcx");
a61af66fc99e Initial load
duke
parents:
diff changeset
4932 const Register s = rcx; // shift count
a61af66fc99e Initial load
duke
parents:
diff changeset
4933 const int n = BitsPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
4934 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
4935 andl(s, 0x3f); // s := s & 0x3f (s < 0x40)
a61af66fc99e Initial load
duke
parents:
diff changeset
4936 cmpl(s, n); // if (s < n)
a61af66fc99e Initial load
duke
parents:
diff changeset
4937 jcc(Assembler::less, L); // else (s >= n)
a61af66fc99e Initial load
duke
parents:
diff changeset
4938 movl(hi, lo); // x := x << n
a61af66fc99e Initial load
duke
parents:
diff changeset
4939 xorl(lo, lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
4940 // Note: subl(s, n) is not needed since the Intel shift instructions work rcx mod n!
a61af66fc99e Initial load
duke
parents:
diff changeset
4941 bind(L); // s (mod n) < n
a61af66fc99e Initial load
duke
parents:
diff changeset
4942 shldl(hi, lo); // x := x << s
a61af66fc99e Initial load
duke
parents:
diff changeset
4943 shll(lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
4944 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4945
a61af66fc99e Initial load
duke
parents:
diff changeset
4946
a61af66fc99e Initial load
duke
parents:
diff changeset
4947 void MacroAssembler::lshr(Register hi, Register lo, bool sign_extension) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4948 // Java shift right long support (semantics as described in JVM spec., p.306 & p.310)
a61af66fc99e Initial load
duke
parents:
diff changeset
4949 // (basic idea for shift counts s >= n: x >> s == (x >> n) >> (s - n))
a61af66fc99e Initial load
duke
parents:
diff changeset
4950 assert(hi != rcx, "must not use rcx");
a61af66fc99e Initial load
duke
parents:
diff changeset
4951 assert(lo != rcx, "must not use rcx");
a61af66fc99e Initial load
duke
parents:
diff changeset
4952 const Register s = rcx; // shift count
a61af66fc99e Initial load
duke
parents:
diff changeset
4953 const int n = BitsPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
4954 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
4955 andl(s, 0x3f); // s := s & 0x3f (s < 0x40)
a61af66fc99e Initial load
duke
parents:
diff changeset
4956 cmpl(s, n); // if (s < n)
a61af66fc99e Initial load
duke
parents:
diff changeset
4957 jcc(Assembler::less, L); // else (s >= n)
a61af66fc99e Initial load
duke
parents:
diff changeset
4958 movl(lo, hi); // x := x >> n
a61af66fc99e Initial load
duke
parents:
diff changeset
4959 if (sign_extension) sarl(hi, 31);
a61af66fc99e Initial load
duke
parents:
diff changeset
4960 else xorl(hi, hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4961 // Note: subl(s, n) is not needed since the Intel shift instructions work rcx mod n!
a61af66fc99e Initial load
duke
parents:
diff changeset
4962 bind(L); // s (mod n) < n
a61af66fc99e Initial load
duke
parents:
diff changeset
4963 shrdl(lo, hi); // x := x >> s
a61af66fc99e Initial load
duke
parents:
diff changeset
4964 if (sign_extension) sarl(hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4965 else shrl(hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
4966 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4967
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4968 void MacroAssembler::movoop(Register dst, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4969 mov_literal32(dst, (int32_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4970 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4971
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4972 void MacroAssembler::movoop(Address dst, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4973 mov_literal32(dst, (int32_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4974 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4975
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4976 void MacroAssembler::movptr(Register dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4977 if (src.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4978 mov_literal32(dst, (intptr_t)src.target(), src.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4979 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4980 movl(dst, as_Address(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::movptr(ArrayAddress dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4985 movl(as_Address(dst), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4986 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4987
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4988 void MacroAssembler::movptr(Register dst, ArrayAddress src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4989 movl(dst, as_Address(src));
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4992 // 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
4993 void MacroAssembler::movptr(Address dst, intptr_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4994 movl(dst, src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4997
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4998 void MacroAssembler::pop_callee_saved_registers() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
4999 pop(rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5000 pop(rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5001 pop(rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5002 pop(rsi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5003 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5004
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5005 void MacroAssembler::pop_fTOS() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5006 fld_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5007 addl(rsp, 2 * wordSize);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5010 void MacroAssembler::push_callee_saved_registers() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5011 push(rsi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5012 push(rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5013 push(rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5014 push(rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5015 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5016
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5017 void MacroAssembler::push_fTOS() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5018 subl(rsp, 2 * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5019 fstp_d(Address(rsp, 0));
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5023 void MacroAssembler::pushoop(jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5024 push_literal32((int32_t)obj, oop_Relocation::spec_for_immediate());
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5028 void MacroAssembler::pushptr(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5029 if (src.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5030 push_literal32((int32_t)src.target(), src.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5031 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5032 pushl(as_Address(src));
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5036 void MacroAssembler::set_word_if_not_zero(Register dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5037 xorl(dst, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5038 set_byte_if_not_zero(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5039 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5040
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5041 static void pass_arg0(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5042 masm->push(arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5043 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5044
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5045 static void pass_arg1(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5046 masm->push(arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5047 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5048
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5049 static void pass_arg2(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5050 masm->push(arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5051 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5052
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5053 static void pass_arg3(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5054 masm->push(arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5055 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5056
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5057 #ifndef PRODUCT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5058 extern "C" void findpc(intptr_t x);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5059 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5060
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5061 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
5062 // 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
5063 JavaThread* thread = JavaThread::current();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5064 JavaThreadState saved_state = thread->thread_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5065 thread->set_thread_state(_thread_in_vm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5066 if (ShowMessageBoxOnError) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5067 JavaThread* thread = JavaThread::current();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5068 JavaThreadState saved_state = thread->thread_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5069 thread->set_thread_state(_thread_in_vm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5070 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5071 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5072 BytecodeCounter::print();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5073 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5074 // 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
5075 // 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
5076 if (os::message_box(msg, "Execution stopped, print registers?")) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5077 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5078 tty->print_cr("eip = 0x%08x", eip);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5079 #ifndef PRODUCT
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5080 if ((WizardMode || Verbose) && PrintMiscellaneous) {
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5081 tty->cr();
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5082 findpc(eip);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5083 tty->cr();
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5084 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5085 #endif
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5086 tty->print_cr("rax = 0x%08x", rax);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5087 tty->print_cr("rbx = 0x%08x", rbx);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5088 tty->print_cr("rcx = 0x%08x", rcx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5089 tty->print_cr("rdx = 0x%08x", rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5090 tty->print_cr("rdi = 0x%08x", rdi);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5091 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
5092 tty->print_cr("rbp = 0x%08x", rbp);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5093 tty->print_cr("rsp = 0x%08x", rsp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5094 BREAKPOINT;
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
5095 assert(false, "start up GDB");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5096 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5097 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5098 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5099 ::tty->print_cr("=============== DEBUG MESSAGE: %s ================\n", msg);
3442
f7d55ea6ee56 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3336
diff changeset
5100 assert(false, err_msg("DEBUG MESSAGE: %s", msg));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5101 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5102 ThreadStateTransition::transition(thread, _thread_in_vm, saved_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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5105 void MacroAssembler::stop(const char* msg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5106 ExternalAddress message((address)msg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5107 // push address of message
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5108 pushptr(message.addr());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5109 { Label L; call(L, relocInfo::none); bind(L); } // push eip
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5110 pusha(); // push registers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5111 call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug32)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5112 hlt();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5113 }
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 void MacroAssembler::warn(const char* msg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5116 push_CPU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5117
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5118 ExternalAddress message((address) msg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5119 // push address of message
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5120 pushptr(message.addr());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5121
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5122 call(RuntimeAddress(CAST_FROM_FN_PTR(address, warning)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5123 addl(rsp, wordSize); // discard argument
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5124 pop_CPU_state();
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 #else // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5128
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5129 // 64 bit versions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5130
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5131 Address MacroAssembler::as_Address(AddressLiteral adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5132 // amd64 always does this as a pc-rel
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5133 // we can be absolute or disp based on the instruction type
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5134 // jmp/call are displacements others are absolute
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5135 assert(!adr.is_lval(), "must be rval");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5136 assert(reachable(adr), "must be");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5137 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
5138
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5139 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5140
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5141 Address MacroAssembler::as_Address(ArrayAddress adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5142 AddressLiteral base = adr.base();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5143 lea(rscratch1, base);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5144 Address index = adr.index();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5145 assert(index._disp == 0, "must not have disp"); // maybe it can?
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5146 Address array(rscratch1, index._index, index._scale, index._disp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5147 return array;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5148 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5149
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5150 int MacroAssembler::biased_locking_enter(Register lock_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5151 Register obj_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5152 Register swap_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5153 Register tmp_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5154 bool swap_reg_contains_mark,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5155 Label& done,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5156 Label* slow_case,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5157 BiasedLockingCounters* counters) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5158 assert(UseBiasedLocking, "why call this otherwise?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5159 assert(swap_reg == rax, "swap_reg must be rax for cmpxchgq");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5160 assert(tmp_reg != noreg, "tmp_reg must be supplied");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5161 assert_different_registers(lock_reg, obj_reg, swap_reg, tmp_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5162 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
5163 Address mark_addr (obj_reg, oopDesc::mark_offset_in_bytes());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5164 Address saved_mark_addr(lock_reg, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5165
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5166 if (PrintBiasedLockingStatistics && counters == NULL)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5167 counters = BiasedLocking::counters();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5168
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5169 // Biased locking
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5170 // See whether the lock is currently biased toward our thread and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5171 // whether the epoch is still valid
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5172 // Note that the runtime guarantees sufficient alignment of JavaThread
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5173 // pointers to allow age to be placed into low bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5174 // 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
5175 Label cas_label;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5176 int null_check_offset = -1;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5177 if (!swap_reg_contains_mark) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5178 null_check_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5179 movq(swap_reg, mark_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5180 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5181 movq(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5182 andq(tmp_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5183 cmpq(tmp_reg, markOopDesc::biased_lock_pattern);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5184 jcc(Assembler::notEqual, cas_label);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5185 // 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
5186 // whether the bias owner and the epoch are both still current.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5187 load_prototype_header(tmp_reg, obj_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5188 orq(tmp_reg, r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5189 xorq(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5190 andq(tmp_reg, ~((int) markOopDesc::age_mask_in_place));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5191 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5192 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5193 ExternalAddress((address) counters->anonymously_biased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5194 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5195 jcc(Assembler::equal, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
5196
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5197 Label try_revoke_bias;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5198 Label try_rebias;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5199
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5200 // 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
5201 // 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
5202 // 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
5203 // know what operations can be legally performed on the object's
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5204 // header.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5205
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5206 // 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
5207 // 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
5208 // the bias on this object.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5209 testq(tmp_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5210 jcc(Assembler::notZero, try_revoke_bias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5211
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5212 // Biasing is still enabled for this data type. See whether the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5213 // 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
5214 // 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
5215 // prototype header. (Note that the prototype header's epoch bits
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5216 // 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
5217 // toward the current thread. Note that we must be absolutely sure
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5218 // 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
5219 // otherwise the manipulations it performs on the mark word are
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5220 // illegal.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5221 testq(tmp_reg, markOopDesc::epoch_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5222 jcc(Assembler::notZero, try_rebias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5223
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5224 // 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
5225 // 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
5226 // 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
5227 // 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
5228 // Note that we first construct the presumed unbiased header so we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5229 // don't accidentally blow away another thread's valid bias.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5230 andq(swap_reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5231 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
5232 movq(tmp_reg, swap_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5233 orq(tmp_reg, r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5234 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5235 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5236 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5237 cmpxchgq(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5238 // If the biasing toward our thread failed, this means that
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5239 // another thread succeeded in biasing it toward itself and we
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5240 // need to revoke that bias. The revocation will occur in the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5241 // interpreter runtime in the slow case.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5242 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5243 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5244 ExternalAddress((address) counters->anonymously_biased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5245 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5246 if (slow_case != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5247 jcc(Assembler::notZero, *slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5248 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5249 jmp(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
5250
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5251 bind(try_rebias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5252 // 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
5253 // current "bias owner", if any, is actually invalid. Under these
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5254 // circumstances _only_, we are allowed to use the current header's
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5255 // 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
5256 // 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
5257 // the bias from one thread to another directly in this situation.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5258 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5259 // 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
5260 // bits in this situation. Should attempt to preserve them.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5261 load_prototype_header(tmp_reg, obj_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5262 orq(tmp_reg, r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5263 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5264 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5265 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5266 cmpxchgq(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5267 // If the biasing toward our thread failed, then another thread
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5268 // 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
5269 // 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
5270 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5271 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5272 ExternalAddress((address) counters->rebiased_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5273 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5274 if (slow_case != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5275 jcc(Assembler::notZero, *slow_case);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5277 jmp(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
5278
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5279 bind(try_revoke_bias);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5280 // 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
5281 // more, indicating that objects of this data type are not supposed
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5282 // 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
5283 // this object to the prototype value and fall through to the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5284 // 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
5285 // that another thread raced us for the privilege of revoking the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5286 // 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
5287 // normal locking code.
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 // 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
5290 // bits in this situation. Should attempt to preserve them.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5291 load_prototype_header(tmp_reg, obj_reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5292 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5293 lock();
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 cmpxchgq(tmp_reg, Address(obj_reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5296 // 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
5297 // 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
5298 // removing the bias bit from the object's header.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5299 if (counters != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5300 cond_inc32(Assembler::zero,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5301 ExternalAddress((address) counters->revoked_lock_entry_count_addr()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5302 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5303
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5304 bind(cas_label);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5305
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5306 return null_check_offset;
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5309 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
5310 Label L, E;
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 #ifdef _WIN64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5313 // Windows always allocates space for it's register args
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5314 assert(num_args <= 4, "only register arguments supported");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5315 subq(rsp, frame::arg_reg_save_area_bytes);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5316 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5317
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5318 // Align stack if necessary
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5319 testl(rsp, 15);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5320 jcc(Assembler::zero, L);
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 subq(rsp, 8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5323 {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5324 call(RuntimeAddress(entry_point));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5325 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5326 addq(rsp, 8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5327 jmp(E);
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 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5330 {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5331 call(RuntimeAddress(entry_point));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5332 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5333
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5334 bind(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5335
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5336 #ifdef _WIN64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5337 // restore stack pointer
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5338 addq(rsp, frame::arg_reg_save_area_bytes);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5339 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5340
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5341 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5342
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5343 void MacroAssembler::cmp64(Register src1, AddressLiteral src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5344 assert(!src2.is_lval(), "should use cmpptr");
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 if (reachable(src2)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5347 cmpq(src1, as_Address(src2));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5348 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5349 lea(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5350 Assembler::cmpq(src1, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5351 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5352 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5353
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5354 int MacroAssembler::corrected_idivq(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5355 // Full implementation of Java ldiv and lrem; checks for special
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5356 // 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
5357 // returns the (pc) offset of the idivl instruction - may be needed
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5358 // for implicit exceptions.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5359 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5360 // normal case special case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5361 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5362 // input : rax: dividend min_long
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5363 // reg: divisor (may not be eax/edx) -1
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 // output: rax: quotient (= rax idiv reg) min_long
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5366 // rdx: remainder (= rax irem reg) 0
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5367 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
5368 static const int64_t min_long = 0x8000000000000000;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5369 Label normal_case, special_case;
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 // check for special case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5372 cmp64(rax, ExternalAddress((address) &min_long));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5373 jcc(Assembler::notEqual, normal_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5374 xorl(rdx, rdx); // prepare rdx for possible special case (where
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5375 // remainder = 0)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5376 cmpq(reg, -1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5377 jcc(Assembler::equal, special_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5378
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5379 // handle normal case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5380 bind(normal_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5381 cdqq();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5382 int idivq_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5383 idivq(reg);
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 // normal and special case exit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5386 bind(special_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5387
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5388 return idivq_offset;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5389 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5390
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5391 void MacroAssembler::decrementq(Register reg, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5392 if (value == min_jint) { subq(reg, value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5393 if (value < 0) { incrementq(reg, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5394 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5395 if (value == 1 && UseIncDec) { decq(reg) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5396 /* else */ { subq(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5397 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5398
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5399 void MacroAssembler::decrementq(Address dst, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5400 if (value == min_jint) { subq(dst, value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5401 if (value < 0) { incrementq(dst, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5402 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5403 if (value == 1 && UseIncDec) { decq(dst) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5404 /* else */ { subq(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5405 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5406
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5407 void MacroAssembler::fat_nop() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5408 // 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
5409 // Recommened sequence from 'Software Optimization Guide for the AMD
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5410 // Hammer Processor'
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5411 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5412 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5413 emit_byte(0x90);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5414 emit_byte(0x66);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5415 emit_byte(0x90);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5416 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5417
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5418 void MacroAssembler::incrementq(Register reg, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5419 if (value == min_jint) { addq(reg, value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5420 if (value < 0) { decrementq(reg, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5421 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5422 if (value == 1 && UseIncDec) { incq(reg) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5423 /* else */ { addq(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5424 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5425
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5426 void MacroAssembler::incrementq(Address dst, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5427 if (value == min_jint) { addq(dst, value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5428 if (value < 0) { decrementq(dst, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5429 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5430 if (value == 1 && UseIncDec) { incq(dst) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5431 /* else */ { addq(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5432 }
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 // 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
5435 // to be installed in the Address class
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5436 void MacroAssembler::jump(ArrayAddress entry) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5437 lea(rscratch1, entry.base());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5438 Address dispatch = entry.index();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5439 assert(dispatch._base == noreg, "must be");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5440 dispatch._base = rscratch1;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5441 jmp(dispatch);
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::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
5445 ShouldNotReachHere(); // 64bit doesn't use two regs
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5446 cmpq(x_lo, y_lo);
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::lea(Register dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5450 mov_literal64(dst, (intptr_t)src.target(), src.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5451 }
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 void MacroAssembler::lea(Address dst, AddressLiteral adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5454 mov_literal64(rscratch1, (intptr_t)adr.target(), adr.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5455 movptr(dst, rscratch1);
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::leave() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5459 // %%% is this really better? Why not on 32bit too?
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5460 emit_byte(0xC9); // LEAVE
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::lneg(Register hi, Register lo) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5464 ShouldNotReachHere(); // 64bit doesn't use two regs
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5465 negq(lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5466 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5467
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5468 void MacroAssembler::movoop(Register dst, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5469 mov_literal64(dst, (intptr_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5470 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5471
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5472 void MacroAssembler::movoop(Address dst, jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5473 mov_literal64(rscratch1, (intptr_t)obj, oop_Relocation::spec_for_immediate());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5474 movq(dst, rscratch1);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5477 void MacroAssembler::movptr(Register dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5478 if (src.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5479 mov_literal64(dst, (intptr_t)src.target(), src.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5480 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5481 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5482 movq(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5483 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5484 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5485 movq(dst, Address(rscratch1,0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5486 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5487 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5488 }
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 void MacroAssembler::movptr(ArrayAddress dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5491 movq(as_Address(dst), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5492 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5493
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5494 void MacroAssembler::movptr(Register dst, ArrayAddress src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5495 movq(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5496 }
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 // 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
5499 void MacroAssembler::movptr(Address dst, intptr_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5500 mov64(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5501 movq(dst, 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 // These are mostly for initializing NULL
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5505 void MacroAssembler::movptr(Address dst, int32_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5506 movslq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5507 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5508
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5509 void MacroAssembler::movptr(Register dst, int32_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5510 mov64(dst, (intptr_t)src);
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::pushoop(jobject obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5514 movoop(rscratch1, obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5515 push(rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5516 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5517
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5518 void MacroAssembler::pushptr(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5519 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5520 if (src.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5521 push(rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5522 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5523 pushq(Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5524 }
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 void MacroAssembler::reset_last_Java_frame(bool clear_fp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5528 bool clear_pc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5529 // 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
5530 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
5531 // 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
5532 // possible that we need it only for debugging
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5533 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
5534 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
5535 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5536
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5537 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
5538 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
5539 }
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 void MacroAssembler::set_last_Java_frame(Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5543 Register last_java_fp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5544 address last_java_pc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5545 // determine last_java_sp register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5546 if (!last_java_sp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5547 last_java_sp = rsp;
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 // last_java_fp is optional
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5551 if (last_java_fp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5552 movptr(Address(r15_thread, JavaThread::last_Java_fp_offset()),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5553 last_java_fp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5554 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5555
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5556 // last_java_pc is optional
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5557 if (last_java_pc != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5558 Address java_pc(r15_thread,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5559 JavaThread::frame_anchor_offset() + JavaFrameAnchor::last_Java_pc_offset());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5560 lea(rscratch1, InternalAddress(last_java_pc));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5561 movptr(java_pc, rscratch1);
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 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
5565 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5566
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5567 static void pass_arg0(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5568 if (c_rarg0 != arg ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5569 masm->mov(c_rarg0, arg);
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 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5572
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5573 static void pass_arg1(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5574 if (c_rarg1 != arg ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5575 masm->mov(c_rarg1, arg);
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 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5578
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5579 static void pass_arg2(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5580 if (c_rarg2 != arg ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5581 masm->mov(c_rarg2, arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5582 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5583 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5584
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5585 static void pass_arg3(MacroAssembler* masm, Register arg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5586 if (c_rarg3 != arg ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5587 masm->mov(c_rarg3, arg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5588 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5589 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5590
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5591 void MacroAssembler::stop(const char* msg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5592 address rip = pc();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5593 pusha(); // get regs on stack
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5594 lea(c_rarg0, ExternalAddress((address) msg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5595 lea(c_rarg1, InternalAddress(rip));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5596 movq(c_rarg2, rsp); // pass pointer to regs array
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5597 andq(rsp, -16); // align stack as required by ABI
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5598 call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug64)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5599 hlt();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5600 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5601
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5602 void MacroAssembler::warn(const char* msg) {
1976
0fc262af204f 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 1972
diff changeset
5603 push(rsp);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5604 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
5605
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5606 push_CPU_state(); // keeps alignment at 16 bytes
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5607 lea(c_rarg0, ExternalAddress((address) msg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5608 call_VM_leaf(CAST_FROM_FN_PTR(address, warning), c_rarg0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5609 pop_CPU_state();
1976
0fc262af204f 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 1972
diff changeset
5610 pop(rsp);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5611 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5612
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5613 #ifndef PRODUCT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5614 extern "C" void findpc(intptr_t x);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5615 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5616
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5617 void MacroAssembler::debug64(char* msg, int64_t pc, int64_t regs[]) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5618 // 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
5619 if (ShowMessageBoxOnError ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5620 JavaThread* thread = JavaThread::current();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5621 JavaThreadState saved_state = thread->thread_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5622 thread->set_thread_state(_thread_in_vm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5623 #ifndef PRODUCT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5624 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5625 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5626 BytecodeCounter::print();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5627 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5628 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5629 // 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
5630 // XXX correct this offset for amd64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5631 // 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
5632 if (os::message_box(msg, "Execution stopped, print registers?")) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5633 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5634 tty->print_cr("rip = 0x%016lx", pc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5635 #ifndef PRODUCT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5636 tty->cr();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5637 findpc(pc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5638 tty->cr();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5639 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5640 tty->print_cr("rax = 0x%016lx", regs[15]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5641 tty->print_cr("rbx = 0x%016lx", regs[12]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5642 tty->print_cr("rcx = 0x%016lx", regs[14]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5643 tty->print_cr("rdx = 0x%016lx", regs[13]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5644 tty->print_cr("rdi = 0x%016lx", regs[8]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5645 tty->print_cr("rsi = 0x%016lx", regs[9]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5646 tty->print_cr("rbp = 0x%016lx", regs[10]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5647 tty->print_cr("rsp = 0x%016lx", regs[11]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5648 tty->print_cr("r8 = 0x%016lx", regs[7]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5649 tty->print_cr("r9 = 0x%016lx", regs[6]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5650 tty->print_cr("r10 = 0x%016lx", regs[5]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5651 tty->print_cr("r11 = 0x%016lx", regs[4]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5652 tty->print_cr("r12 = 0x%016lx", regs[3]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5653 tty->print_cr("r13 = 0x%016lx", regs[2]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5654 tty->print_cr("r14 = 0x%016lx", regs[1]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5655 tty->print_cr("r15 = 0x%016lx", regs[0]);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5656 BREAKPOINT;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5657 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5658 ThreadStateTransition::transition(thread, _thread_in_vm, saved_state);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5659 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5660 ttyLocker ttyl;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5661 ::tty->print_cr("=============== DEBUG MESSAGE: %s ================\n",
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5662 msg);
3442
f7d55ea6ee56 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 3336
diff changeset
5663 assert(false, err_msg("DEBUG MESSAGE: %s", msg));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5664 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5665 }
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 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5668
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5669 // Now versions that are common to 32/64 bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5670
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5671 void MacroAssembler::addptr(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5672 LP64_ONLY(addq(dst, imm32)) NOT_LP64(addl(dst, imm32));
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5675 void MacroAssembler::addptr(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5676 LP64_ONLY(addq(dst, src)) NOT_LP64(addl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5677 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5678
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5679 void MacroAssembler::addptr(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5680 LP64_ONLY(addq(dst, src)) NOT_LP64(addl(dst, src));
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::align(int modulus) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5684 if (offset() % modulus != 0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5685 nop(modulus - (offset() % modulus));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5686 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5687 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5688
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5689 void MacroAssembler::andpd(XMMRegister dst, AddressLiteral src) {
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5690 if (reachable(src)) {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5691 andpd(dst, as_Address(src));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5692 } else {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5693 lea(rscratch1, src);
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5694 andpd(dst, Address(rscratch1, 0));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
5695 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5696 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5697
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5698 void MacroAssembler::andptr(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5699 LP64_ONLY(andq(dst, imm32)) NOT_LP64(andl(dst, imm32));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5700 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5701
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5702 void MacroAssembler::atomic_incl(AddressLiteral counter_addr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5703 pushf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5704 if (os::is_MP())
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5705 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5706 incrementl(counter_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5707 popf();
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5710 // Writes to stack successive pages until offset reached to check for
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5711 // stack overflow + shadow pages. This clobbers tmp.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5712 void MacroAssembler::bang_stack_size(Register size, Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5713 movptr(tmp, rsp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5714 // Bang stack for total size given plus shadow page size.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5715 // 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
5716 // red zones.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5717 Label loop;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5718 bind(loop);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5719 movl(Address(tmp, (-os::vm_page_size())), size );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5720 subptr(tmp, os::vm_page_size());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5721 subl(size, os::vm_page_size());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5722 jcc(Assembler::greater, loop);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5723
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5724 // Bang down shadow pages too.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5725 // The -1 because we already subtracted 1 page.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5726 for (int i = 0; i< StackShadowPages-1; i++) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5727 // 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
5728 // so the bigger the better.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5729 movptr(Address(tmp, (-i*os::vm_page_size())), size );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5730 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5731 }
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::biased_locking_exit(Register obj_reg, Register temp_reg, Label& done) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5734 assert(UseBiasedLocking, "why call this otherwise?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5735
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5736 // Check for biased locking unlock case, which is a no-op
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5737 // 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
5738 // First, the interpreter checks for IllegalMonitorStateException at
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5739 // 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
5740 // lock, the object could not be rebiased toward another thread, so
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5741 // the bias bit would be clear.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5742 movptr(temp_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5743 andptr(temp_reg, markOopDesc::biased_lock_mask_in_place);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5744 cmpptr(temp_reg, markOopDesc::biased_lock_pattern);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5745 jcc(Assembler::equal, done);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5748 void MacroAssembler::c2bool(Register x) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5749 // implements x == 0 ? 0 : 1
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5750 // note: must only look at least-significant byte of x
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5751 // since C-style booleans are stored in one byte
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5752 // only! (was bug)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5753 andl(x, 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5754 setb(Assembler::notZero, x);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5755 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5756
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5757 // Wouldn't need if AddressLiteral version had new name
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5758 void MacroAssembler::call(Label& L, relocInfo::relocType rtype) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5759 Assembler::call(L, rtype);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5760 }
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(Register entry) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5763 Assembler::call(entry);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5764 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5765
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5766 void MacroAssembler::call(AddressLiteral entry) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5767 if (reachable(entry)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5768 Assembler::call_literal(entry.target(), entry.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5769 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5770 lea(rscratch1, entry);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5771 Assembler::call(rscratch1);
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 }
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 // Implementation of call_VM versions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5776
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5777 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5778 address entry_point,
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 call_VM_helper(oop_result, entry_point, 0, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5786 ret(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5787
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5788 bind(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5789 }
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 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5792 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5793 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5794 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5795 Label C, E;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5796 call(C, relocInfo::none);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5797 jmp(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5798
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5799 bind(C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5800 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5801 call_VM_helper(oop_result, entry_point, 1, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5802 ret(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5803
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5804 bind(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5805 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5806
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5807 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5808 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5809 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5810 Register arg_2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5811 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5812 Label C, E;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5813 call(C, relocInfo::none);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5814 jmp(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5815
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5816 bind(C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5817
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5818 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5819
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5820 pass_arg2(this, arg_2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5821 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5822 call_VM_helper(oop_result, entry_point, 2, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5823 ret(0);
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 bind(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5826 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5827
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5828 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5829 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5830 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5831 Register arg_2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5832 Register arg_3,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5833 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5834 Label C, E;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5835 call(C, relocInfo::none);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5836 jmp(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 bind(C);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5839
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5840 LP64_ONLY(assert(arg_1 != c_rarg3, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5841 LP64_ONLY(assert(arg_2 != c_rarg3, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5842 pass_arg3(this, arg_3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5843
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5844 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5845 pass_arg2(this, arg_2);
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 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5848 call_VM_helper(oop_result, entry_point, 3, check_exceptions);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5849 ret(0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5850
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5851 bind(E);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5852 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5853
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5854 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5855 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5856 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5857 int number_of_arguments,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5858 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5859 Register thread = LP64_ONLY(r15_thread) NOT_LP64(noreg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5860 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
5861 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5862
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5863 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5864 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5865 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5866 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5867 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5868 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5869 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
5870 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5871
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5872 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5873 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5874 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5875 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5876 Register arg_2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5877 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5878
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5879 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5880 pass_arg2(this, arg_2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5881 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5882 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
5883 }
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 void MacroAssembler::call_VM(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5886 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5887 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5888 Register arg_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5889 Register arg_2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5890 Register arg_3,
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 LP64_ONLY(assert(arg_1 != c_rarg3, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5893 LP64_ONLY(assert(arg_2 != c_rarg3, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5894 pass_arg3(this, arg_3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5895 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5896 pass_arg2(this, arg_2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5897 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5898 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
5899 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5900
3446
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5901 void MacroAssembler::super_call_VM(Register oop_result,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5902 Register last_java_sp,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5903 address entry_point,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5904 int number_of_arguments,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5905 bool check_exceptions) {
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5906 Register thread = LP64_ONLY(r15_thread) NOT_LP64(noreg);
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5907 MacroAssembler::call_VM_base(oop_result, thread, last_java_sp, entry_point, number_of_arguments, check_exceptions);
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5908 }
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5909
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5910 void MacroAssembler::super_call_VM(Register oop_result,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5911 Register last_java_sp,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5912 address entry_point,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5913 Register arg_1,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5914 bool check_exceptions) {
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5915 pass_arg1(this, arg_1);
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5916 super_call_VM(oop_result, last_java_sp, entry_point, 1, check_exceptions);
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5917 }
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5918
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5919 void MacroAssembler::super_call_VM(Register oop_result,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5920 Register last_java_sp,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5921 address entry_point,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5922 Register arg_1,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5923 Register arg_2,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5924 bool check_exceptions) {
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5925
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5926 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5927 pass_arg2(this, arg_2);
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5928 pass_arg1(this, arg_1);
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5929 super_call_VM(oop_result, last_java_sp, entry_point, 2, check_exceptions);
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5930 }
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5931
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5932 void MacroAssembler::super_call_VM(Register oop_result,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5933 Register last_java_sp,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5934 address entry_point,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5935 Register arg_1,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5936 Register arg_2,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5937 Register arg_3,
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5938 bool check_exceptions) {
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5939 LP64_ONLY(assert(arg_1 != c_rarg3, "smashed arg"));
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5940 LP64_ONLY(assert(arg_2 != c_rarg3, "smashed arg"));
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5941 pass_arg3(this, arg_3);
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5942 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5943 pass_arg2(this, arg_2);
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5944 pass_arg1(this, arg_1);
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5945 super_call_VM(oop_result, last_java_sp, entry_point, 3, check_exceptions);
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5946 }
07c2e7ffd1fc 7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents: 3442
diff changeset
5947
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5948 void MacroAssembler::call_VM_base(Register oop_result,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5949 Register java_thread,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5950 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5951 address entry_point,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5952 int number_of_arguments,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5953 bool check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5954 // determine java_thread register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5955 if (!java_thread->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5956 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5957 java_thread = r15_thread;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5958 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5959 java_thread = rdi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5960 get_thread(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5961 #endif // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5962 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5963 // determine last_java_sp register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5964 if (!last_java_sp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5965 last_java_sp = rsp;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5966 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5967 // debugging support
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5968 assert(number_of_arguments >= 0 , "cannot have negative number of arguments");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5969 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
5970 #ifdef ASSERT
0fc262af204f 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 1972
diff changeset
5971 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
5972 #endif // ASSERT
0fc262af204f 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 1972
diff changeset
5973
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5974 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
5975 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
5976
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5977 // push java thread (becomes first argument of C function)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5978
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5979 NOT_LP64(push(java_thread); number_of_arguments++);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5980 LP64_ONLY(mov(c_rarg0, r15_thread));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5981
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5982 // set last Java frame before call
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5983 assert(last_java_sp != rbp, "can't use ebp/rbp");
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 // Only interpreter should have to set fp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5986 set_last_Java_frame(java_thread, last_java_sp, rbp, NULL);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5987
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5988 // do the call, remove parameters
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5989 MacroAssembler::call_VM_leaf_base(entry_point, number_of_arguments);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5990
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5991 // restore the thread (cannot use the pushed argument since arguments
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5992 // may be overwritten by C code generated by an optimizing compiler);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5993 // 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
5994 if (LP64_ONLY(true ||) java_thread == rdi || java_thread == rsi) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5995 // rdi & rsi (also r15) are callee saved -> nothing to do
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5996 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5997 guarantee(java_thread != rax, "change this code");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5998 push(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
5999 { Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6000 get_thread(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6001 cmpptr(java_thread, rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6002 jcc(Assembler::equal, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6003 stop("MacroAssembler::call_VM_base: rdi not callee saved?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6004 bind(L);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6005 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6006 pop(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6007 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6008 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6009 get_thread(java_thread);
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 // reset last Java frame
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6012 // Only interpreter should have to clear fp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6013 reset_last_Java_frame(java_thread, true, false);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6014
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6015 #ifndef CC_INTERP
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6016 // C++ interp handles this in the interpreter
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6017 check_and_handle_popframe(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6018 check_and_handle_earlyret(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6019 #endif /* CC_INTERP */
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6020
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6021 if (check_exceptions) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6022 // check for pending exceptions (java_thread is set upon return)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6023 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
6024 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6025 jump_cc(Assembler::notEqual,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6026 RuntimeAddress(StubRoutines::forward_exception_entry()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6027 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6028 // This used to conditionally jump to forward_exception however it is
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6029 // 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
6030 // around so we can always reach
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6031
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6032 Label ok;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6033 jcc(Assembler::equal, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6034 jump(RuntimeAddress(StubRoutines::forward_exception_entry()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6035 bind(ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6036 #endif // LP64
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6039 // 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
6040 if (oop_result->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6041 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
6042 movptr(Address(java_thread, JavaThread::vm_result_offset()), NULL_WORD);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6043 verify_oop(oop_result, "broken oop in call_VM_base");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6044 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6045 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6046
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6047 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
6048
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6049 // Calculate the value for last_Java_sp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6050 // somewhat subtle. call_VM does an intermediate call
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6051 // which places a return address on the stack just under the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6052 // stack pointer as the user finsihed with it. This allows
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6053 // use to retrieve last_Java_pc from last_Java_sp[-1].
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6054 // 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
6055 // 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
6056 // 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
6057 // This hopefully explains the calculations here.
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 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6060 // We've pushed one address, correct last_Java_sp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6061 lea(rax, Address(rsp, wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6062 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6063 lea(rax, Address(rsp, (1 + number_of_arguments) * wordSize));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6064 #endif // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6065
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6066 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
6067
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6068 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6069
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6070 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
6071 call_VM_leaf_base(entry_point, number_of_arguments);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6072 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6073
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6074 void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6075 pass_arg0(this, arg_0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6076 call_VM_leaf(entry_point, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6077 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6078
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6079 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
6080
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6081 LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6082 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6083 pass_arg0(this, arg_0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6084 call_VM_leaf(entry_point, 2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6085 }
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 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
6088 LP64_ONLY(assert(arg_0 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6089 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6090 pass_arg2(this, arg_2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6091 LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6092 pass_arg1(this, arg_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6093 pass_arg0(this, arg_0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6094 call_VM_leaf(entry_point, 3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6095 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6096
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6097 void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6098 pass_arg0(this, arg_0);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6099 MacroAssembler::call_VM_leaf_base(entry_point, 1);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6100 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6101
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6102 void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6103
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6104 LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6105 pass_arg1(this, arg_1);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6106 pass_arg0(this, arg_0);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6107 MacroAssembler::call_VM_leaf_base(entry_point, 2);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6108 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6109
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6110 void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1, Register arg_2) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6111 LP64_ONLY(assert(arg_0 != c_rarg2, "smashed arg"));
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6112 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6113 pass_arg2(this, arg_2);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6114 LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6115 pass_arg1(this, arg_1);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6116 pass_arg0(this, arg_0);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6117 MacroAssembler::call_VM_leaf_base(entry_point, 3);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6118 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6119
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6120 void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1, Register arg_2, Register arg_3) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6121 LP64_ONLY(assert(arg_0 != c_rarg3, "smashed arg"));
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6122 LP64_ONLY(assert(arg_1 != c_rarg3, "smashed arg"));
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6123 LP64_ONLY(assert(arg_2 != c_rarg3, "smashed arg"));
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6124 pass_arg3(this, arg_3);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6125 LP64_ONLY(assert(arg_0 != c_rarg2, "smashed arg"));
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6126 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6127 pass_arg2(this, arg_2);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6128 LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6129 pass_arg1(this, arg_1);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6130 pass_arg0(this, arg_0);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6131 MacroAssembler::call_VM_leaf_base(entry_point, 4);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6132 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 3261
diff changeset
6133
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6134 void MacroAssembler::check_and_handle_earlyret(Register java_thread) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6135 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6136
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6137 void MacroAssembler::check_and_handle_popframe(Register java_thread) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6138 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6139
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6140 void MacroAssembler::cmp32(AddressLiteral src1, int32_t imm) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6141 if (reachable(src1)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6142 cmpl(as_Address(src1), imm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6143 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6144 lea(rscratch1, src1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6145 cmpl(Address(rscratch1, 0), imm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6146 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6147 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6148
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6149 void MacroAssembler::cmp32(Register src1, AddressLiteral src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6150 assert(!src2.is_lval(), "use cmpptr");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6151 if (reachable(src2)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6152 cmpl(src1, as_Address(src2));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6153 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6154 lea(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6155 cmpl(src1, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6156 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6157 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6158
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6159 void MacroAssembler::cmp32(Register src1, int32_t imm) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6160 Assembler::cmpl(src1, imm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6161 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6162
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6163 void MacroAssembler::cmp32(Register src1, Address src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6164 Assembler::cmpl(src1, src2);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6167 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
6168 ucomisd(opr1, opr2);
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 Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6171 if (unordered_is_less) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6172 movl(dst, -1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6173 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6174 jcc(Assembler::below , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6175 movl(dst, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6176 jcc(Assembler::equal , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6177 increment(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6178 } else { // unordered is greater
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6179 movl(dst, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6180 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6181 jcc(Assembler::above , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6182 movl(dst, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6183 jcc(Assembler::equal , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6184 decrementl(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6185 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6186 bind(L);
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::cmpss2int(XMMRegister opr1, XMMRegister opr2, Register dst, bool unordered_is_less) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6190 ucomiss(opr1, opr2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6191
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6192 Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6193 if (unordered_is_less) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6194 movl(dst, -1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6195 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6196 jcc(Assembler::below , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6197 movl(dst, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6198 jcc(Assembler::equal , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6199 increment(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6200 } else { // unordered is greater
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6201 movl(dst, 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6202 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6203 jcc(Assembler::above , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6204 movl(dst, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6205 jcc(Assembler::equal , L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6206 decrementl(dst);
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 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6209 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6210
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6211
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6212 void MacroAssembler::cmp8(AddressLiteral src1, int imm) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6213 if (reachable(src1)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6214 cmpb(as_Address(src1), imm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6215 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6216 lea(rscratch1, src1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6217 cmpb(Address(rscratch1, 0), imm);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6218 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6219 }
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 void MacroAssembler::cmpptr(Register src1, AddressLiteral src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6222 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6223 if (src2.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6224 movptr(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6225 Assembler::cmpq(src1, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6226 } else if (reachable(src2)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6227 cmpq(src1, as_Address(src2));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6228 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6229 lea(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6230 Assembler::cmpq(src1, Address(rscratch1, 0));
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 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6233 if (src2.is_lval()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6234 cmp_literal32(src1, (int32_t) src2.target(), src2.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6235 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6236 cmpl(src1, as_Address(src2));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6237 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6238 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6239 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6240
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6241 void MacroAssembler::cmpptr(Address src1, AddressLiteral src2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6242 assert(src2.is_lval(), "not a mem-mem compare");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6243 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6244 // moves src2's literal address
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6245 movptr(rscratch1, src2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6246 Assembler::cmpq(src1, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6247 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6248 cmp_literal32(src1, (int32_t) src2.target(), src2.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6249 #endif // _LP64
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6252 void MacroAssembler::locked_cmpxchgptr(Register reg, AddressLiteral adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6253 if (reachable(adr)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6254 if (os::is_MP())
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6255 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6256 cmpxchgptr(reg, as_Address(adr));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6257 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6258 lea(rscratch1, adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6259 if (os::is_MP())
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6260 lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6261 cmpxchgptr(reg, Address(rscratch1, 0));
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6265 void MacroAssembler::cmpxchgptr(Register reg, Address adr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6266 LP64_ONLY(cmpxchgq(reg, adr)) NOT_LP64(cmpxchgl(reg, adr));
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6269 void MacroAssembler::comisd(XMMRegister dst, AddressLiteral src) {
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6270 if (reachable(src)) {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6271 comisd(dst, as_Address(src));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6272 } else {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6273 lea(rscratch1, src);
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6274 comisd(dst, Address(rscratch1, 0));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6275 }
304
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6278 void MacroAssembler::comiss(XMMRegister dst, AddressLiteral src) {
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6279 if (reachable(src)) {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6280 comiss(dst, as_Address(src));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6281 } else {
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6282 lea(rscratch1, src);
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6283 comiss(dst, Address(rscratch1, 0));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 1016
diff changeset
6284 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6285 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6286
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6287
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6288 void MacroAssembler::cond_inc32(Condition cond, AddressLiteral counter_addr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6289 Condition negated_cond = negate_condition(cond);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6290 Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6291 jcc(negated_cond, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6292 atomic_incl(counter_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6293 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6294 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6295
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6296 int MacroAssembler::corrected_idivl(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6297 // Full implementation of Java idiv and irem; checks for
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6298 // special case as described in JVM spec., p.243 & p.271.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6299 // The function returns the (pc) offset of the idivl
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6300 // instruction - may be needed for implicit exceptions.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6301 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6302 // normal case special case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6303 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6304 // input : rax,: dividend min_int
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6305 // reg: divisor (may not be rax,/rdx) -1
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6306 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6307 // output: rax,: quotient (= rax, idiv reg) min_int
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6308 // rdx: remainder (= rax, irem reg) 0
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6309 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
6310 const int min_int = 0x80000000;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6311 Label normal_case, special_case;
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 // check for special case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6314 cmpl(rax, min_int);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6315 jcc(Assembler::notEqual, normal_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6316 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
6317 cmpl(reg, -1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6318 jcc(Assembler::equal, special_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6319
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6320 // handle normal case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6321 bind(normal_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6322 cdql();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6323 int idivl_offset = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6324 idivl(reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6325
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6326 // normal and special case exit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6327 bind(special_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6328
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6329 return idivl_offset;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6330 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6331
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6332
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6333
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6334 void MacroAssembler::decrementl(Register reg, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6335 if (value == min_jint) {subl(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6336 if (value < 0) { incrementl(reg, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6337 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6338 if (value == 1 && UseIncDec) { decl(reg) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6339 /* else */ { subl(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6340 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6341
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6342 void MacroAssembler::decrementl(Address dst, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6343 if (value == min_jint) {subl(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6344 if (value < 0) { incrementl(dst, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6345 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6346 if (value == 1 && UseIncDec) { decl(dst) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6347 /* else */ { subl(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6348 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6349
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6350 void MacroAssembler::division_with_shift (Register reg, int shift_value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6351 assert (shift_value > 0, "illegal shift value");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6352 Label _is_positive;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6353 testl (reg, reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6354 jcc (Assembler::positive, _is_positive);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6355 int offset = (1 << shift_value) - 1 ;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6356
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6357 if (offset == 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6358 incrementl(reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6359 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6360 addl(reg, offset);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6361 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6362
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6363 bind (_is_positive);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6364 sarl(reg, shift_value);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6365 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6366
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6367 // !defined(COMPILER2) is because of stupid core builds
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6368 #if !defined(_LP64) || defined(COMPILER1) || !defined(COMPILER2)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6369 void MacroAssembler::empty_FPU_stack() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6370 if (VM_Version::supports_mmx()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6371 emms();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6372 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6373 for (int i = 8; i-- > 0; ) ffree(i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6374 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6375 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6376 #endif // !LP64 || C1 || !C2
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6377
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6378
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6379 // Defines obj, preserves var_size_in_bytes
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6380 void MacroAssembler::eden_allocate(Register obj,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6381 Register var_size_in_bytes,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6382 int con_size_in_bytes,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6383 Register t1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6384 Label& slow_case) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6385 assert(obj == rax, "obj must be in rax, for cmpxchg");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6386 assert_different_registers(obj, var_size_in_bytes, t1);
362
apetrusenko
parents: 356 304
diff changeset
6387 if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) {
apetrusenko
parents: 356 304
diff changeset
6388 jmp(slow_case);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6389 } else {
362
apetrusenko
parents: 356 304
diff changeset
6390 Register end = t1;
apetrusenko
parents: 356 304
diff changeset
6391 Label retry;
apetrusenko
parents: 356 304
diff changeset
6392 bind(retry);
apetrusenko
parents: 356 304
diff changeset
6393 ExternalAddress heap_top((address) Universe::heap()->top_addr());
apetrusenko
parents: 356 304
diff changeset
6394 movptr(obj, heap_top);
apetrusenko
parents: 356 304
diff changeset
6395 if (var_size_in_bytes == noreg) {
apetrusenko
parents: 356 304
diff changeset
6396 lea(end, Address(obj, con_size_in_bytes));
apetrusenko
parents: 356 304
diff changeset
6397 } else {
apetrusenko
parents: 356 304
diff changeset
6398 lea(end, Address(obj, var_size_in_bytes, Address::times_1));
apetrusenko
parents: 356 304
diff changeset
6399 }
apetrusenko
parents: 356 304
diff changeset
6400 // if end < obj then we wrapped around => object too long => slow case
apetrusenko
parents: 356 304
diff changeset
6401 cmpptr(end, obj);
apetrusenko
parents: 356 304
diff changeset
6402 jcc(Assembler::below, slow_case);
apetrusenko
parents: 356 304
diff changeset
6403 cmpptr(end, ExternalAddress((address) Universe::heap()->end_addr()));
apetrusenko
parents: 356 304
diff changeset
6404 jcc(Assembler::above, slow_case);
apetrusenko
parents: 356 304
diff changeset
6405 // Compare obj with the top addr, and if still equal, store the new top addr in
apetrusenko
parents: 356 304
diff changeset
6406 // end at the address of the top addr pointer. Sets ZF if was equal, and clears
apetrusenko
parents: 356 304
diff changeset
6407 // it otherwise. Use lock prefix for atomicity on MPs.
apetrusenko
parents: 356 304
diff changeset
6408 locked_cmpxchgptr(end, heap_top);
apetrusenko
parents: 356 304
diff changeset
6409 jcc(Assembler::notEqual, retry);
apetrusenko
parents: 356 304
diff changeset
6410 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6411 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6412
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6413 void MacroAssembler::enter() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6414 push(rbp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6415 mov(rbp, rsp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6416 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6417
a61af66fc99e Initial load
duke
parents:
diff changeset
6418 void MacroAssembler::fcmp(Register tmp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6419 fcmp(tmp, 1, true, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
6420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6421
a61af66fc99e Initial load
duke
parents:
diff changeset
6422 void MacroAssembler::fcmp(Register tmp, int index, bool pop_left, bool pop_right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6423 assert(!pop_right || pop_left, "usage error");
a61af66fc99e Initial load
duke
parents:
diff changeset
6424 if (VM_Version::supports_cmov()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6425 assert(tmp == noreg, "unneeded temp");
a61af66fc99e Initial load
duke
parents:
diff changeset
6426 if (pop_left) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6427 fucomip(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
6428 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
6429 fucomi(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
6430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6431 if (pop_right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6432 fpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
6433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6434 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
6435 assert(tmp != noreg, "need temp");
a61af66fc99e Initial load
duke
parents:
diff changeset
6436 if (pop_left) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6437 if (pop_right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6438 fcompp();
a61af66fc99e Initial load
duke
parents:
diff changeset
6439 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
6440 fcomp(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
6441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6442 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
6443 fcom(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
6444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6445 // convert FPU condition into eflags condition via rax,
a61af66fc99e Initial load
duke
parents:
diff changeset
6446 save_rax(tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
6447 fwait(); fnstsw_ax();
a61af66fc99e Initial load
duke
parents:
diff changeset
6448 sahf();
a61af66fc99e Initial load
duke
parents:
diff changeset
6449 restore_rax(tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
6450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6451 // condition codes set as follows:
a61af66fc99e Initial load
duke
parents:
diff changeset
6452 //
a61af66fc99e Initial load
duke
parents:
diff changeset
6453 // CF (corresponds to C0) if x < y
a61af66fc99e Initial load
duke
parents:
diff changeset
6454 // PF (corresponds to C2) if unordered
a61af66fc99e Initial load
duke
parents:
diff changeset
6455 // ZF (corresponds to C3) if x = y
a61af66fc99e Initial load
duke
parents:
diff changeset
6456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6457
a61af66fc99e Initial load
duke
parents:
diff changeset
6458 void MacroAssembler::fcmp2int(Register dst, bool unordered_is_less) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6459 fcmp2int(dst, unordered_is_less, 1, true, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
6460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6461
a61af66fc99e Initial load
duke
parents:
diff changeset
6462 void MacroAssembler::fcmp2int(Register dst, bool unordered_is_less, int index, bool pop_left, bool pop_right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6463 fcmp(VM_Version::supports_cmov() ? noreg : dst, index, pop_left, pop_right);
a61af66fc99e Initial load
duke
parents:
diff changeset
6464 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
6465 if (unordered_is_less) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6466 movl(dst, -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
6467 jcc(Assembler::parity, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6468 jcc(Assembler::below , L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6469 movl(dst, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
6470 jcc(Assembler::equal , L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6471 increment(dst);
a61af66fc99e Initial load
duke
parents:
diff changeset
6472 } else { // unordered is greater
a61af66fc99e Initial load
duke
parents:
diff changeset
6473 movl(dst, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
6474 jcc(Assembler::parity, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6475 jcc(Assembler::above , L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6476 movl(dst, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
6477 jcc(Assembler::equal , L);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6478 decrementl(dst);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6480 bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
6481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6482
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6483 void MacroAssembler::fld_d(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6484 fld_d(as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6485 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6486
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6487 void MacroAssembler::fld_s(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6488 fld_s(as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6489 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6490
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6491 void MacroAssembler::fld_x(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6492 Assembler::fld_x(as_Address(src));
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::fldcw(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6496 Assembler::fldcw(as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6497 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6498
a61af66fc99e Initial load
duke
parents:
diff changeset
6499 void MacroAssembler::fpop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
6500 ffree();
a61af66fc99e Initial load
duke
parents:
diff changeset
6501 fincstp();
a61af66fc99e Initial load
duke
parents:
diff changeset
6502 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6503
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6504 void MacroAssembler::fremr(Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6505 save_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6506 { Label L;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6507 bind(L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6508 fprem();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6509 fwait(); fnstsw_ax();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6510 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6511 testl(rax, 0x400);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6512 jcc(Assembler::notEqual, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6513 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6514 sahf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6515 jcc(Assembler::parity, L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6516 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6517 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6518 restore_rax(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6519 // Result is in ST0.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6520 // Note: fxch & fpop to get rid of ST1
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6521 // (otherwise FPU stack could overflow eventually)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6522 fxch(1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6523 fpop();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6524 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6525
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6526
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6527 void MacroAssembler::incrementl(AddressLiteral dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6528 if (reachable(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6529 incrementl(as_Address(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6530 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6531 lea(rscratch1, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6532 incrementl(Address(rscratch1, 0));
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 }
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 void MacroAssembler::incrementl(ArrayAddress dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6537 incrementl(as_Address(dst));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6538 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6539
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6540 void MacroAssembler::incrementl(Register reg, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6541 if (value == min_jint) {addl(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6542 if (value < 0) { decrementl(reg, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6543 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6544 if (value == 1 && UseIncDec) { incl(reg) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6545 /* else */ { addl(reg, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6546 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6547
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6548 void MacroAssembler::incrementl(Address dst, int value) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6549 if (value == min_jint) {addl(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6550 if (value < 0) { decrementl(dst, -value); return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6551 if (value == 0) { ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6552 if (value == 1 && UseIncDec) { incl(dst) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6553 /* else */ { addl(dst, value) ; return; }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6554 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6555
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6556 void MacroAssembler::jump(AddressLiteral dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6557 if (reachable(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6558 jmp_literal(dst.target(), dst.rspec());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6559 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6560 lea(rscratch1, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6561 jmp(rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6562 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6563 }
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 void MacroAssembler::jump_cc(Condition cc, AddressLiteral dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6566 if (reachable(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6567 InstructionMark im(this);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6568 relocate(dst.reloc());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6569 const int short_size = 2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6570 const int long_size = 6;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6571 int offs = (intptr_t)dst.target() - ((intptr_t)_code_pos);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6572 if (dst.reloc() == relocInfo::none && is8bit(offs - short_size)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6573 // 0111 tttn #8-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6574 emit_byte(0x70 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6575 emit_byte((offs - short_size) & 0xFF);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6576 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6577 // 0000 1111 1000 tttn #32-bit disp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6578 emit_byte(0x0F);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6579 emit_byte(0x80 | cc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6580 emit_long(offs - long_size);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6581 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6582 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6583 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6584 warning("reversing conditional branch");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6585 #endif /* ASSERT */
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6586 Label skip;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6587 jccb(reverse[cc], skip);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6588 lea(rscratch1, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6589 Assembler::jmp(rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6590 bind(skip);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6591 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6592 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6593
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6594 void MacroAssembler::ldmxcsr(AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6595 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6596 Assembler::ldmxcsr(as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6597 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6598 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6599 Assembler::ldmxcsr(Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6600 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6601 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6602
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6603 int MacroAssembler::load_signed_byte(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6604 int off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6605 if (LP64_ONLY(true ||) VM_Version::is_P6()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6606 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6607 movsbl(dst, src); // movsxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6608 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6609 off = load_unsigned_byte(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6610 shll(dst, 24);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6611 sarl(dst, 24);
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 return off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6614 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6615
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6616 // 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
6617 // 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
6618 // 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
6619 // 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
6620 int MacroAssembler::load_signed_short(Register dst, Address src) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6621 int off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6622 if (LP64_ONLY(true ||) VM_Version::is_P6()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6623 // 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
6624 // 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
6625 // that users are only using 32bits worth.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6626 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6627 movswl(dst, src); // movsxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6628 } else {
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6629 off = load_unsigned_short(dst, src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6630 shll(dst, 16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6631 sarl(dst, 16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6632 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6633 return off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6634 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6635
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6636 int MacroAssembler::load_unsigned_byte(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6637 // 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
6638 // and "3.9 Partial Register Penalties", p. 22).
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6639 int off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6640 if (LP64_ONLY(true || ) VM_Version::is_P6() || src.uses(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6641 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6642 movzbl(dst, src); // movzxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6643 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6644 xorl(dst, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6645 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6646 movb(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6647 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6648 return off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6649 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6650
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6651 // 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
6652 int MacroAssembler::load_unsigned_short(Register dst, Address src) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6653 // 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
6654 // and "3.9 Partial Register Penalties", p. 22).
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6655 int off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6656 if (LP64_ONLY(true ||) VM_Version::is_P6() || src.uses(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6657 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6658 movzwl(dst, src); // movzxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6659 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6660 xorl(dst, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6661 off = offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6662 movw(dst, src);
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 return off;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6665 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6666
2258
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6667 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
6668 switch (size_in_bytes) {
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6669 #ifndef _LP64
2258
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6670 case 8:
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6671 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
6672 movl(dst, src);
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6673 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
6674 break;
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6675 #else
2258
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6676 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
6677 #endif
2258
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6678 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
6679 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
6680 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
6681 default: ShouldNotReachHere();
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6682 }
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6683 }
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6684
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6685 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
6686 switch (size_in_bytes) {
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6687 #ifndef _LP64
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6688 case 8:
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6689 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
6690 movl(dst, src);
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6691 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
6692 break;
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6693 #else
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6694 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
6695 #endif
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2100
diff changeset
6696 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
6697 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
6698 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
6699 default: ShouldNotReachHere();
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6700 }
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6701 }
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
6702
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6703 void MacroAssembler::mov32(AddressLiteral dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6704 if (reachable(dst)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6705 movl(as_Address(dst), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6706 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6707 lea(rscratch1, dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6708 movl(Address(rscratch1, 0), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6709 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6710 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6711
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6712 void MacroAssembler::mov32(Register dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6713 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6714 movl(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6715 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6716 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6717 movl(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6718 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6720
a61af66fc99e Initial load
duke
parents:
diff changeset
6721 // C++ bool manipulation
a61af66fc99e Initial load
duke
parents:
diff changeset
6722
a61af66fc99e Initial load
duke
parents:
diff changeset
6723 void MacroAssembler::movbool(Register dst, Address src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6724 if(sizeof(bool) == 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
6725 movb(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6726 else if(sizeof(bool) == 2)
a61af66fc99e Initial load
duke
parents:
diff changeset
6727 movw(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6728 else if(sizeof(bool) == 4)
a61af66fc99e Initial load
duke
parents:
diff changeset
6729 movl(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6730 else
a61af66fc99e Initial load
duke
parents:
diff changeset
6731 // unsupported
a61af66fc99e Initial load
duke
parents:
diff changeset
6732 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
6733 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6734
a61af66fc99e Initial load
duke
parents:
diff changeset
6735 void MacroAssembler::movbool(Address dst, bool boolconst) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6736 if(sizeof(bool) == 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
6737 movb(dst, (int) boolconst);
a61af66fc99e Initial load
duke
parents:
diff changeset
6738 else if(sizeof(bool) == 2)
a61af66fc99e Initial load
duke
parents:
diff changeset
6739 movw(dst, (int) boolconst);
a61af66fc99e Initial load
duke
parents:
diff changeset
6740 else if(sizeof(bool) == 4)
a61af66fc99e Initial load
duke
parents:
diff changeset
6741 movl(dst, (int) boolconst);
a61af66fc99e Initial load
duke
parents:
diff changeset
6742 else
a61af66fc99e Initial load
duke
parents:
diff changeset
6743 // unsupported
a61af66fc99e Initial load
duke
parents:
diff changeset
6744 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
6745 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6746
a61af66fc99e Initial load
duke
parents:
diff changeset
6747 void MacroAssembler::movbool(Address dst, Register src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
6748 if(sizeof(bool) == 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
6749 movb(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6750 else if(sizeof(bool) == 2)
a61af66fc99e Initial load
duke
parents:
diff changeset
6751 movw(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6752 else if(sizeof(bool) == 4)
a61af66fc99e Initial load
duke
parents:
diff changeset
6753 movl(dst, src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6754 else
a61af66fc99e Initial load
duke
parents:
diff changeset
6755 // unsupported
a61af66fc99e Initial load
duke
parents:
diff changeset
6756 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
6757 }
a61af66fc99e Initial load
duke
parents:
diff changeset
6758
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6759 void MacroAssembler::movbyte(ArrayAddress dst, int src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6760 movb(as_Address(dst), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6761 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6762
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6763 void MacroAssembler::movdbl(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6764 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6765 if (UseXmmLoadAndClearUpper) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6766 movsd (dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6767 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6768 movlpd(dst, as_Address(src));
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 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6771 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6772 if (UseXmmLoadAndClearUpper) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6773 movsd (dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6774 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6775 movlpd(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6776 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6777 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6778 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6779
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6780 void MacroAssembler::movflt(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6781 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6782 movss(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6783 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6784 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6785 movss(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6786 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6787 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6788
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6789 void MacroAssembler::movptr(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6790 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6791 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6792
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6793 void MacroAssembler::movptr(Register dst, Address src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6794 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6797 // 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
6798 void MacroAssembler::movptr(Register dst, intptr_t src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6799 LP64_ONLY(mov64(dst, src)) NOT_LP64(movl(dst, src));
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6802 void MacroAssembler::movptr(Address dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6803 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
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::movss(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6807 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6808 movss(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6809 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6810 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6811 movss(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6812 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6813 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6814
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6815 void MacroAssembler::null_check(Register reg, int offset) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6816 if (needs_explicit_null_check(offset)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6817 // provoke OS NULL exception if reg = NULL by
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6818 // accessing M[reg] w/o changing any (non-CC) registers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6819 // NOTE: cmpl is plenty here to provoke a segv
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6820 cmpptr(rax, Address(reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6821 // Note: should probably use testl(rax, Address(reg, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6822 // may be shorter code (however, this version of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6823 // testl needs to be implemented first)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6824 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6825 // nothing to do, (later) access of M[reg + offset]
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6826 // will provoke OS NULL exception if reg = NULL
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6827 }
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6830 void MacroAssembler::os_breakpoint() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6831 // 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
6832 // (e.g., MSVC can't call ps() otherwise)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6833 call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6834 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6835
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6836 void MacroAssembler::pop_CPU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6837 pop_FPU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6838 pop_IU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6839 }
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 void MacroAssembler::pop_FPU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6842 NOT_LP64(frstor(Address(rsp, 0));)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6843 LP64_ONLY(fxrstor(Address(rsp, 0));)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6844 addptr(rsp, FPUStateSizeInWords * wordSize);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6847 void MacroAssembler::pop_IU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6848 popa();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6849 LP64_ONLY(addq(rsp, 8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6850 popf();
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6853 // Save Integer and Float state
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6854 // Warning: Stack must be 16 byte aligned (64bit)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6855 void MacroAssembler::push_CPU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6856 push_IU_state();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6857 push_FPU_state();
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 void MacroAssembler::push_FPU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6861 subptr(rsp, FPUStateSizeInWords * wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6862 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6863 fnsave(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6864 fwait();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6865 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6866 fxsave(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6867 #endif // LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6868 }
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 void MacroAssembler::push_IU_state() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6871 // Push flags first because pusha kills them
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6872 pushf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6873 // Make sure rsp stays 16-byte aligned
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6874 LP64_ONLY(subq(rsp, 8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6875 pusha();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6876 }
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 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
6879 // determine java_thread register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6880 if (!java_thread->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6881 java_thread = rdi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6882 get_thread(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6883 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6884 // 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
6885 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
6886 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
6887 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
6888 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6889
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6890 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
6891 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
6892
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6893 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6894
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6895 void MacroAssembler::restore_rax(Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6896 if (tmp == noreg) pop(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6897 else if (tmp != rax) mov(rax, tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6898 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6899
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6900 void MacroAssembler::round_to(Register reg, int modulus) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6901 addptr(reg, modulus - 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6902 andptr(reg, -modulus);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6903 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6904
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6905 void MacroAssembler::save_rax(Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6906 if (tmp == noreg) push(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6907 else if (tmp != rax) mov(tmp, rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6908 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6909
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6910 // 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
6911 // We use the current thread pointer to calculate a thread specific
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6912 // offset to write to within the page. This minimizes bus traffic
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6913 // due to cache line collision.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6914 void MacroAssembler::serialize_memory(Register thread, Register tmp) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6915 movl(tmp, thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6916 shrl(tmp, os::get_serialize_page_shift_count());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6917 andl(tmp, (os::vm_page_size() - sizeof(int)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6918
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6919 Address index(noreg, tmp, Address::times_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6920 ExternalAddress page(os::get_memory_serialize_page());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6921
606
19962e74284f 6811384: MacroAssembler::serialize_memory may touch next page on amd64
never
parents: 520
diff changeset
6922 // Size of store must match masking code above
19962e74284f 6811384: MacroAssembler::serialize_memory may touch next page on amd64
never
parents: 520
diff changeset
6923 movl(as_Address(ArrayAddress(page, index)), tmp);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6924 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6925
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6926 // Calls to C land
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6927 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6928 // 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
6929 // 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
6930 // 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
6931 void MacroAssembler::set_last_Java_frame(Register java_thread,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6932 Register last_java_sp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6933 Register last_java_fp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6934 address last_java_pc) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6935 // determine java_thread register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6936 if (!java_thread->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6937 java_thread = rdi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6938 get_thread(java_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6939 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6940 // determine last_java_sp register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6941 if (!last_java_sp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6942 last_java_sp = rsp;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6943 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6944
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6945 // last_java_fp is optional
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6946
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6947 if (last_java_fp->is_valid()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6948 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
6949 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6950
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6951 // last_java_pc is optional
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6952
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6953 if (last_java_pc != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6954 lea(Address(java_thread,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6955 JavaThread::frame_anchor_offset() + JavaFrameAnchor::last_Java_pc_offset()),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6956 InternalAddress(last_java_pc));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6957
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6958 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6959 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
6960 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6961
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6962 void MacroAssembler::shlptr(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6963 LP64_ONLY(shlq(dst, imm8)) NOT_LP64(shll(dst, imm8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6964 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6965
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6966 void MacroAssembler::shrptr(Register dst, int imm8) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6967 LP64_ONLY(shrq(dst, imm8)) NOT_LP64(shrl(dst, imm8));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6968 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6969
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6970 void MacroAssembler::sign_extend_byte(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6971 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
6972 movsbl(reg, reg); // movsxb
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6973 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6974 shll(reg, 24);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6975 sarl(reg, 24);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6976 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6977 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6978
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6979 void MacroAssembler::sign_extend_short(Register reg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6980 if (LP64_ONLY(true ||) VM_Version::is_P6()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6981 movswl(reg, reg); // movsxw
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6982 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6983 shll(reg, 16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6984 sarl(reg, 16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6985 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6986 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
6987
2404
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2357
diff changeset
6988 void MacroAssembler::testl(Register dst, AddressLiteral src) {
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2357
diff changeset
6989 assert(reachable(src), "Address should be reachable");
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2357
diff changeset
6990 testl(dst, as_Address(src));
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2357
diff changeset
6991 }
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2357
diff changeset
6992
362
apetrusenko
parents: 356 304
diff changeset
6993 //////////////////////////////////////////////////////////////////////////////////
apetrusenko
parents: 356 304
diff changeset
6994 #ifndef SERIALGC
apetrusenko
parents: 356 304
diff changeset
6995
apetrusenko
parents: 356 304
diff changeset
6996 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
6997 Register pre_val,
362
apetrusenko
parents: 356 304
diff changeset
6998 Register thread,
apetrusenko
parents: 356 304
diff changeset
6999 Register tmp,
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7000 bool tosca_live,
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7001 bool expand_call) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7002
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7003 // 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
7004 // directly to skip generating the check by
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7005 // 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
7006
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7007 #ifdef _LP64
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7008 assert(thread == r15_thread, "must be");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7009 #endif // _LP64
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7010
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7011 Label done;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7012 Label runtime;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7013
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7014 assert(pre_val != noreg, "check this code");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7015
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7016 if (obj != noreg) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7017 assert_different_registers(obj, pre_val, tmp);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7018 assert(pre_val != rax, "check this code");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7019 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7020
362
apetrusenko
parents: 356 304
diff changeset
7021 Address in_progress(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
7022 PtrQueue::byte_offset_of_active()));
apetrusenko
parents: 356 304
diff changeset
7023 Address index(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
7024 PtrQueue::byte_offset_of_index()));
apetrusenko
parents: 356 304
diff changeset
7025 Address buffer(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
7026 PtrQueue::byte_offset_of_buf()));
apetrusenko
parents: 356 304
diff changeset
7027
apetrusenko
parents: 356 304
diff changeset
7028
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7029 // Is marking active?
362
apetrusenko
parents: 356 304
diff changeset
7030 if (in_bytes(PtrQueue::byte_width_of_active()) == 4) {
apetrusenko
parents: 356 304
diff changeset
7031 cmpl(in_progress, 0);
apetrusenko
parents: 356 304
diff changeset
7032 } else {
apetrusenko
parents: 356 304
diff changeset
7033 assert(in_bytes(PtrQueue::byte_width_of_active()) == 1, "Assumption");
apetrusenko
parents: 356 304
diff changeset
7034 cmpb(in_progress, 0);
apetrusenko
parents: 356 304
diff changeset
7035 }
apetrusenko
parents: 356 304
diff changeset
7036 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
7037
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7038 // 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
7039 if (obj != noreg) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7040 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
7041 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7042
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7043 // Is the previous value null?
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7044 cmpptr(pre_val, (int32_t) NULL_WORD);
362
apetrusenko
parents: 356 304
diff changeset
7045 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
7046
apetrusenko
parents: 356 304
diff changeset
7047 // 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
7048 // Is index == 0?
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7049 // (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
7050
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7051 movptr(tmp, index); // tmp := *index_adr
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7052 cmpptr(tmp, 0); // tmp == 0?
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7053 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
7054
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7055 subptr(tmp, wordSize); // tmp := tmp - wordSize
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7056 movptr(index, tmp); // *index_adr := tmp
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7057 addptr(tmp, buffer); // tmp := tmp + *buffer_adr
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7058
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7059 // Record the previous value
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7060 movptr(Address(tmp, 0), pre_val);
362
apetrusenko
parents: 356 304
diff changeset
7061 jmp(done);
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7062
362
apetrusenko
parents: 356 304
diff changeset
7063 bind(runtime);
apetrusenko
parents: 356 304
diff changeset
7064 // save the live input values
apetrusenko
parents: 356 304
diff changeset
7065 if(tosca_live) push(rax);
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7066
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7067 if (obj != noreg && obj != rax)
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7068 push(obj);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7069
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7070 if (pre_val != rax)
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7071 push(pre_val);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7072
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7073 // 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
7074 // 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
7075 // 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
7076 //
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7077 // 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
7078 // 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
7079 // 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
7080 //
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7081 // 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
7082 // 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
7083 // expand_call should be passed true.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7084
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7085 NOT_LP64( push(thread); )
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7086
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7087 if (expand_call) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7088 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
7089 pass_arg1(this, thread);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7090 pass_arg0(this, pre_val);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7091 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
7092 } else {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7093 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
7094 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7095
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7096 NOT_LP64( pop(thread); )
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7097
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7098 // save the live input values
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7099 if (pre_val != rax)
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7100 pop(pre_val);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7101
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7102 if (obj != noreg && obj != rax)
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7103 pop(obj);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7104
362
apetrusenko
parents: 356 304
diff changeset
7105 if(tosca_live) pop(rax);
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7106
362
apetrusenko
parents: 356 304
diff changeset
7107 bind(done);
apetrusenko
parents: 356 304
diff changeset
7108 }
apetrusenko
parents: 356 304
diff changeset
7109
apetrusenko
parents: 356 304
diff changeset
7110 void MacroAssembler::g1_write_barrier_post(Register store_addr,
apetrusenko
parents: 356 304
diff changeset
7111 Register new_val,
apetrusenko
parents: 356 304
diff changeset
7112 Register thread,
apetrusenko
parents: 356 304
diff changeset
7113 Register tmp,
apetrusenko
parents: 356 304
diff changeset
7114 Register tmp2) {
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7115 #ifdef _LP64
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7116 assert(thread == r15_thread, "must be");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7117 #endif // _LP64
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7118
362
apetrusenko
parents: 356 304
diff changeset
7119 Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
7120 PtrQueue::byte_offset_of_index()));
apetrusenko
parents: 356 304
diff changeset
7121 Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
apetrusenko
parents: 356 304
diff changeset
7122 PtrQueue::byte_offset_of_buf()));
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
7123
362
apetrusenko
parents: 356 304
diff changeset
7124 BarrierSet* bs = Universe::heap()->barrier_set();
apetrusenko
parents: 356 304
diff changeset
7125 CardTableModRefBS* ct = (CardTableModRefBS*)bs;
apetrusenko
parents: 356 304
diff changeset
7126 Label done;
apetrusenko
parents: 356 304
diff changeset
7127 Label runtime;
apetrusenko
parents: 356 304
diff changeset
7128
apetrusenko
parents: 356 304
diff changeset
7129 // Does store cross heap regions?
apetrusenko
parents: 356 304
diff changeset
7130
apetrusenko
parents: 356 304
diff changeset
7131 movptr(tmp, store_addr);
apetrusenko
parents: 356 304
diff changeset
7132 xorptr(tmp, new_val);
apetrusenko
parents: 356 304
diff changeset
7133 shrptr(tmp, HeapRegion::LogOfHRGrainBytes);
apetrusenko
parents: 356 304
diff changeset
7134 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
7135
apetrusenko
parents: 356 304
diff changeset
7136 // crosses regions, storing NULL?
apetrusenko
parents: 356 304
diff changeset
7137
apetrusenko
parents: 356 304
diff changeset
7138 cmpptr(new_val, (int32_t) NULL_WORD);
apetrusenko
parents: 356 304
diff changeset
7139 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
7140
apetrusenko
parents: 356 304
diff changeset
7141 // storing region crossing non-NULL, is card already dirty?
apetrusenko
parents: 356 304
diff changeset
7142
apetrusenko
parents: 356 304
diff changeset
7143 ExternalAddress cardtable((address) ct->byte_map_base);
apetrusenko
parents: 356 304
diff changeset
7144 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
apetrusenko
parents: 356 304
diff changeset
7145 #ifdef _LP64
apetrusenko
parents: 356 304
diff changeset
7146 const Register card_addr = tmp;
apetrusenko
parents: 356 304
diff changeset
7147
apetrusenko
parents: 356 304
diff changeset
7148 movq(card_addr, store_addr);
apetrusenko
parents: 356 304
diff changeset
7149 shrq(card_addr, CardTableModRefBS::card_shift);
apetrusenko
parents: 356 304
diff changeset
7150
apetrusenko
parents: 356 304
diff changeset
7151 lea(tmp2, cardtable);
apetrusenko
parents: 356 304
diff changeset
7152
apetrusenko
parents: 356 304
diff changeset
7153 // get the address of the card
apetrusenko
parents: 356 304
diff changeset
7154 addq(card_addr, tmp2);
apetrusenko
parents: 356 304
diff changeset
7155 #else
apetrusenko
parents: 356 304
diff changeset
7156 const Register card_index = tmp;
apetrusenko
parents: 356 304
diff changeset
7157
apetrusenko
parents: 356 304
diff changeset
7158 movl(card_index, store_addr);
apetrusenko
parents: 356 304
diff changeset
7159 shrl(card_index, CardTableModRefBS::card_shift);
apetrusenko
parents: 356 304
diff changeset
7160
apetrusenko
parents: 356 304
diff changeset
7161 Address index(noreg, card_index, Address::times_1);
apetrusenko
parents: 356 304
diff changeset
7162 const Register card_addr = tmp;
apetrusenko
parents: 356 304
diff changeset
7163 lea(card_addr, as_Address(ArrayAddress(cardtable, index)));
apetrusenko
parents: 356 304
diff changeset
7164 #endif
apetrusenko
parents: 356 304
diff changeset
7165 cmpb(Address(card_addr, 0), 0);
apetrusenko
parents: 356 304
diff changeset
7166 jcc(Assembler::equal, done);
apetrusenko
parents: 356 304
diff changeset
7167
apetrusenko
parents: 356 304
diff changeset
7168 // storing a region crossing, non-NULL oop, card is clean.
apetrusenko
parents: 356 304
diff changeset
7169 // dirty card and log.
apetrusenko
parents: 356 304
diff changeset
7170
apetrusenko
parents: 356 304
diff changeset
7171 movb(Address(card_addr, 0), 0);
apetrusenko
parents: 356 304
diff changeset
7172
apetrusenko
parents: 356 304
diff changeset
7173 cmpl(queue_index, 0);
apetrusenko
parents: 356 304
diff changeset
7174 jcc(Assembler::equal, runtime);
apetrusenko
parents: 356 304
diff changeset
7175 subl(queue_index, wordSize);
apetrusenko
parents: 356 304
diff changeset
7176 movptr(tmp2, buffer);
apetrusenko
parents: 356 304
diff changeset
7177 #ifdef _LP64
apetrusenko
parents: 356 304
diff changeset
7178 movslq(rscratch1, queue_index);
apetrusenko
parents: 356 304
diff changeset
7179 addq(tmp2, rscratch1);
apetrusenko
parents: 356 304
diff changeset
7180 movq(Address(tmp2, 0), card_addr);
apetrusenko
parents: 356 304
diff changeset
7181 #else
apetrusenko
parents: 356 304
diff changeset
7182 addl(tmp2, queue_index);
apetrusenko
parents: 356 304
diff changeset
7183 movl(Address(tmp2, 0), card_index);
apetrusenko
parents: 356 304
diff changeset
7184 #endif
apetrusenko
parents: 356 304
diff changeset
7185 jmp(done);
apetrusenko
parents: 356 304
diff changeset
7186
apetrusenko
parents: 356 304
diff changeset
7187 bind(runtime);
apetrusenko
parents: 356 304
diff changeset
7188 // save the live input values
apetrusenko
parents: 356 304
diff changeset
7189 push(store_addr);
apetrusenko
parents: 356 304
diff changeset
7190 push(new_val);
apetrusenko
parents: 356 304
diff changeset
7191 #ifdef _LP64
apetrusenko
parents: 356 304
diff changeset
7192 call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, r15_thread);
apetrusenko
parents: 356 304
diff changeset
7193 #else
apetrusenko
parents: 356 304
diff changeset
7194 push(thread);
apetrusenko
parents: 356 304
diff changeset
7195 call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, thread);
apetrusenko
parents: 356 304
diff changeset
7196 pop(thread);
apetrusenko
parents: 356 304
diff changeset
7197 #endif
apetrusenko
parents: 356 304
diff changeset
7198 pop(new_val);
apetrusenko
parents: 356 304
diff changeset
7199 pop(store_addr);
apetrusenko
parents: 356 304
diff changeset
7200
apetrusenko
parents: 356 304
diff changeset
7201 bind(done);
apetrusenko
parents: 356 304
diff changeset
7202 }
apetrusenko
parents: 356 304
diff changeset
7203
apetrusenko
parents: 356 304
diff changeset
7204 #endif // SERIALGC
apetrusenko
parents: 356 304
diff changeset
7205 //////////////////////////////////////////////////////////////////////////////////
apetrusenko
parents: 356 304
diff changeset
7206
apetrusenko
parents: 356 304
diff changeset
7207
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7208 void MacroAssembler::store_check(Register obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7209 // 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
7210 // register obj is destroyed afterwards.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7211 store_check_part_1(obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7212 store_check_part_2(obj);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7215 void MacroAssembler::store_check(Register obj, Address dst) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7216 store_check(obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7217 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7218
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 // 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
7221 void MacroAssembler::store_check_part_1(Register obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7222 BarrierSet* bs = Universe::heap()->barrier_set();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7223 assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7224 shrptr(obj, CardTableModRefBS::card_shift);
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 void MacroAssembler::store_check_part_2(Register obj) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7228 BarrierSet* bs = Universe::heap()->barrier_set();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7229 assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7230 CardTableModRefBS* ct = (CardTableModRefBS*)bs;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7231 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7232
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7233 // The calculation for byte_map_base is as follows:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7234 // byte_map_base = _byte_map - (uintptr_t(low_bound) >> card_shift);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7235 // So this essentially converts an address to a displacement and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7236 // 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
7237 // large for a 32bit displacement
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7238
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7239 intptr_t disp = (intptr_t) ct->byte_map_base;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7240 if (is_simm32(disp)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7241 Address cardtable(noreg, obj, Address::times_1, disp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7242 movb(cardtable, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7243 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7244 // 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
7245 // displacement and done in a single instruction given favorable mapping and
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7246 // 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
7247 // 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
7248 // Address() as above.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7249 // 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
7250 // 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
7251 // in some cases we'll get a single instruction version.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7252
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7253 ExternalAddress cardtable((address)disp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7254 Address index(noreg, obj, Address::times_1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7255 movb(as_Address(ArrayAddress(cardtable, index)), 0);
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 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7258
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7259 void MacroAssembler::subptr(Register dst, int32_t imm32) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7260 LP64_ONLY(subq(dst, imm32)) NOT_LP64(subl(dst, imm32));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7261 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7262
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7263 void MacroAssembler::subptr(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7264 LP64_ONLY(subq(dst, src)) NOT_LP64(subl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7265 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7266
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7267 // C++ bool manipulation
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7268 void MacroAssembler::testbool(Register dst) {
a61af66fc99e Initial load
duke
parents:
diff changeset
7269 if(sizeof(bool) == 1)
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7270 testb(dst, 0xff);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7271 else if(sizeof(bool) == 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
7272 // testw implementation needed for two byte bools
a61af66fc99e Initial load
duke
parents:
diff changeset
7273 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
7274 } else if(sizeof(bool) == 4)
a61af66fc99e Initial load
duke
parents:
diff changeset
7275 testl(dst, dst);
a61af66fc99e Initial load
duke
parents:
diff changeset
7276 else
a61af66fc99e Initial load
duke
parents:
diff changeset
7277 // unsupported
a61af66fc99e Initial load
duke
parents:
diff changeset
7278 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
7279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
7280
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7281 void MacroAssembler::testptr(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7282 LP64_ONLY(testq(dst, src)) NOT_LP64(testl(dst, src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7283 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7284
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7285 // 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
7286 void MacroAssembler::tlab_allocate(Register obj,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7287 Register var_size_in_bytes,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7288 int con_size_in_bytes,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7289 Register t1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7290 Register t2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7291 Label& slow_case) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7292 assert_different_registers(obj, t1, t2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7293 assert_different_registers(obj, var_size_in_bytes, t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7294 Register end = t2;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7295 Register thread = NOT_LP64(t1) LP64_ONLY(r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7296
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7297 verify_tlab();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7298
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7299 NOT_LP64(get_thread(thread));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7300
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7301 movptr(obj, Address(thread, JavaThread::tlab_top_offset()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7302 if (var_size_in_bytes == noreg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7303 lea(end, Address(obj, con_size_in_bytes));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7304 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7305 lea(end, Address(obj, var_size_in_bytes, Address::times_1));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7306 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7307 cmpptr(end, Address(thread, JavaThread::tlab_end_offset()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7308 jcc(Assembler::above, slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7309
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7310 // update the tlab top pointer
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7311 movptr(Address(thread, JavaThread::tlab_top_offset()), end);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7312
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7313 // recover var_size_in_bytes if necessary
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7314 if (var_size_in_bytes == end) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7315 subptr(var_size_in_bytes, obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7316 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7317 verify_tlab();
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7320 // 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
7321 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
7322 Label& try_eden,
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7323 Label& slow_case) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7324 Register top = rax;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7325 Register t1 = rcx;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7326 Register t2 = rsi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7327 Register thread_reg = NOT_LP64(rdi) LP64_ONLY(r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7328 assert_different_registers(top, thread_reg, t1, t2, /* preserve: */ rbx, rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7329 Label do_refill, discard_tlab;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7330
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7331 if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7332 // No allocation in the shared eden.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7333 jmp(slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7334 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7335
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7336 NOT_LP64(get_thread(thread_reg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7337
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7338 movptr(top, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7339 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_end_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7340
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7341 // calculate amount of free space
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7342 subptr(t1, top);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7343 shrptr(t1, LogHeapWordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7344
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7345 // Retain tlab and allocate object in shared space if
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7346 // the amount free in the tlab is too large to discard.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7347 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
7348 jcc(Assembler::lessEqual, discard_tlab);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7349
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7350 // Retain
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7351 // %%% yuck as movptr...
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7352 movptr(t2, (int32_t) ThreadLocalAllocBuffer::refill_waste_limit_increment());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7353 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
7354 if (TLABStats) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7355 // increment number of slow_allocations
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7356 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
7357 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7358 jmp(try_eden);
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 bind(discard_tlab);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7361 if (TLABStats) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7362 // increment number of refills
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7363 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
7364 // accumulate wastage -- t1 is amount free in tlab
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7365 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
7366 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7367
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7368 // if tlab is currently allocated (top or end != null) then
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7369 // 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
7370 testptr(top, top);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7371 jcc(Assembler::zero, do_refill);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7372
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7373 // set up the mark word
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7374 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
7375 // set the length to the remaining space
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7376 subptr(t1, typeArrayOopDesc::header_size(T_INT));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7377 addptr(t1, (int32_t)ThreadLocalAllocBuffer::alignment_reserve());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7378 shlptr(t1, log2_intptr(HeapWordSize/sizeof(jint)));
1690
36519c19beeb 6975027: use of movptr to set length of array
never
parents: 1684
diff changeset
7379 movl(Address(top, arrayOopDesc::length_offset_in_bytes()), t1);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7380 // set klass to intArrayKlass
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7381 // 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
7382 movptr(t1, ExternalAddress((address)Universe::intArrayKlassObj_addr()));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7383 // store klass last. concurrent gcs assumes klass length is valid if
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7384 // klass field is not null.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7385 store_klass(top, t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7386
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7387 movptr(t1, top);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7388 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
7389 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
7390
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7391 // refill the tlab with an eden allocation
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7392 bind(do_refill);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7393 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_size_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7394 shlptr(t1, LogHeapWordSize);
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7395 // allocate new tlab, address returned in top
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7396 eden_allocate(top, t1, 0, t2, slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7397
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7398 // Check that t1 was preserved in eden_allocate.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7399 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7400 if (UseTLAB) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7401 Label ok;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7402 Register tsize = rsi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7403 assert_different_registers(tsize, thread_reg, t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7404 push(tsize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7405 movptr(tsize, Address(thread_reg, in_bytes(JavaThread::tlab_size_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7406 shlptr(tsize, LogHeapWordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7407 cmpptr(t1, tsize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7408 jcc(Assembler::equal, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7409 stop("assert(t1 != tlab size)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7410 should_not_reach_here();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7411
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7412 bind(ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7413 pop(tsize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7414 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7415 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7416 movptr(Address(thread_reg, in_bytes(JavaThread::tlab_start_offset())), top);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7417 movptr(Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())), top);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7418 addptr(top, t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7419 subptr(top, (int32_t)ThreadLocalAllocBuffer::alignment_reserve_in_bytes());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7420 movptr(Address(thread_reg, in_bytes(JavaThread::tlab_end_offset())), top);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7421 verify_tlab();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7422 jmp(retry);
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7423
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7424 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
7425 }
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7426
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7427 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
7428 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
7429 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
7430 Register t1) {
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7431 #ifdef _LP64
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7432 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
7433 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
7434 } else {
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7435 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
7436 }
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7437 #else
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7438 if (!thread->is_valid()) {
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7439 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
7440 thread = t1;
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7441 get_thread(thread);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7442 }
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7443
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7444 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
7445 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
7446 } else {
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7447 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
7448 }
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
7449 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
7450 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7451 }
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 static const double pi_4 = 0.7853981633974483;
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 void MacroAssembler::trigfunc(char trig, int num_fpu_regs_in_use) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7456 // 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
7457 // was attempted in this code; unfortunately it appears that the
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7458 // switch to 80-bit precision and back causes this to be
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7459 // unprofitable compared with simply performing a runtime call if
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7460 // the argument is out of the (-pi/4, pi/4) range.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7461
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7462 Register tmp = noreg;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7463 if (!VM_Version::supports_cmov()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7464 // fcmp needs a temporary so preserve rbx,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7465 tmp = rbx;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7466 push(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7467 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7468
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7469 Label slow_case, done;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7470
520
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7471 ExternalAddress pi4_adr = (address)&pi_4;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7472 if (reachable(pi4_adr)) {
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7473 // x ?<= pi/4
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7474 fld_d(pi4_adr);
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7475 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
7476 fabs(); // Stack: |X| PI/4 X
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7477 fcmp(tmp);
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7478 jcc(Assembler::above, slow_case);
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7479
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7480 // fastest case: -pi/4 <= x <= pi/4
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7481 switch(trig) {
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7482 case 's':
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7483 fsin();
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7484 break;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7485 case 'c':
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7486 fcos();
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7487 break;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7488 case 't':
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7489 ftan();
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7490 break;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7491 default:
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7492 assert(false, "bad intrinsic");
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7493 break;
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7494 }
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7495 jmp(done);
52a431267315 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 512
diff changeset
7496 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7497
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7498 // slow case: runtime call
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7499 bind(slow_case);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7500 // Preserve registers across runtime call
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7501 pusha();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7502 int incoming_argument_and_return_value_offset = -1;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7503 if (num_fpu_regs_in_use > 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7504 // Must preserve all other FPU regs (could alternatively convert
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7505 // SharedRuntime::dsin and dcos into assembly routines known not to trash
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7506 // FPU state, but can not trust C compiler)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7507 NEEDS_CLEANUP;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7508 // 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
7509 // 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
7510 // hold the return value from dsin or dcos.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7511 for (int i = 0; i < num_fpu_regs_in_use; i++) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7512 subptr(rsp, sizeof(jdouble));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7513 fstp_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7514 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7515 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
7516 fld_d(Address(rsp, incoming_argument_and_return_value_offset));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7517 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7518 subptr(rsp, sizeof(jdouble));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7519 fstp_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7520 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7521 movdbl(xmm0, Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7522 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7523
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7524 // 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
7525 // complete interpreter frame in debug mode -- same bug as 4387334
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7526 // MacroAssembler::call_VM_leaf_base is perfectly safe and will
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7527 // do proper 64bit abi
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7528
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7529 NEEDS_CLEANUP;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7530 // 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
7531 // be taken; however, there is no generic stack banging routine at
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7532 // the MacroAssembler level
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7533 switch(trig) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7534 case 's':
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7535 {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7536 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
7537 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7538 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7539 case 'c':
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7540 {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7541 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
7542 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7543 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7544 case 't':
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7545 {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7546 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
7547 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7548 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7549 default:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7550 assert(false, "bad intrinsic");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7551 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7552 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7553 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7554 movsd(Address(rsp, 0), xmm0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7555 fld_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7556 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7557 addptr(rsp, sizeof(jdouble));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7558 if (num_fpu_regs_in_use > 1) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7559 // 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
7560 fstp_d(Address(rsp, incoming_argument_and_return_value_offset));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7561 for (int i = 0; i < num_fpu_regs_in_use; i++) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7562 fld_d(Address(rsp, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7563 addptr(rsp, sizeof(jdouble));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7564 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7565 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7566 popa();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7567
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7568 // Come here with result in F-TOS
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7569 bind(done);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7570
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7571 if (tmp != noreg) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7572 pop(tmp);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7573 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7574 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7575
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7576
623
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7577 // 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
7578 // 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
7579 // The receiver klass is in recv_klass.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7580 // 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
7581 // On failure, execution transfers to the given label.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7582 void MacroAssembler::lookup_interface_method(Register recv_klass,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7583 Register intf_klass,
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7584 RegisterOrConstant itable_index,
623
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7585 Register method_result,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7586 Register scan_temp,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7587 Label& L_no_such_interface) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7588 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
7589 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
7590 "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
7591
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7592 // 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
7593 int vtable_base = instanceKlass::vtable_start_offset() * wordSize;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7594 int itentry_off = itableMethodEntry::method_offset_in_bytes();
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7595 int scan_step = itableOffsetEntry::size() * wordSize;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7596 int vte_size = vtableEntry::size() * wordSize;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7597 Address::ScaleFactor times_vte_scale = Address::times_ptr;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7598 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
7599
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7600 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
7601
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7602 // %%% 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
7603 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
7604 if (HeapWordsPerLong > 1) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7605 // Round up to align_object_offset boundary
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7606 // see code for instanceKlass::start_of_itable!
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7607 round_to(scan_temp, BytesPerLong);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7608 }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7609
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7610 // 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
7611 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
7612 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
7613
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7614 // 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
7615 // if (scan->interface() == intf) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7616 // result = (klass + scan->offset() + itable_index);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7617 // }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7618 // }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7619 Label search, found_method;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7620
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7621 for (int peel = 1; peel >= 0; peel--) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7622 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
7623 cmpptr(intf_klass, method_result);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7624
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7625 if (peel) {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7626 jccb(Assembler::equal, found_method);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7627 } else {
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7628 jccb(Assembler::notEqual, search);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7629 // (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
7630 }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7631
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7632 if (!peel) break;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7633
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7634 bind(search);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7635
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7636 // 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
7637 // 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
7638 // same as when the caller was compiled.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7639 testptr(method_result, method_result);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7640 jcc(Assembler::zero, L_no_such_interface);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7641 addptr(scan_temp, scan_step);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7642 }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7643
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7644 bind(found_method);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7645
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7646 // Got a hit.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7647 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
7648 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
7649 }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7650
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
7651
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7652 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
7653 Register super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7654 Register temp_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7655 Label& L_success) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7656 Label L_failure;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7657 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
7658 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
7659 bind(L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7660 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7661
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7662
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7663 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
7664 Register super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7665 Register temp_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7666 Label* L_success,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7667 Label* L_failure,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7668 Label* L_slow_path,
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7669 RegisterOrConstant super_check_offset) {
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7670 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
7671 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
7672 if (super_check_offset.is_register()) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7673 assert_different_registers(sub_klass, super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7674 super_check_offset.as_register());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7675 } else if (must_load_sco) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7676 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
7677 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7678
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7679 Label L_fallthrough;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7680 int label_nulls = 0;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7681 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
7682 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
7683 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
7684 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
7685
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7686 int sc_offset = (klassOopDesc::header_size() * HeapWordSize +
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7687 Klass::secondary_super_cache_offset_in_bytes());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7688 int sco_offset = (klassOopDesc::header_size() * HeapWordSize +
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7689 Klass::super_check_offset_offset_in_bytes());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7690 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
7691
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7692 // 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
7693 // 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
7694 // least some of these.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7695 #define local_jcc(assembler_cond, label) \
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7696 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
7697 else jcc( assembler_cond, label) /*omit semi*/
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7698
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7699 // 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
7700 #define final_jmp(label) \
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7701 if (&(label) == &L_fallthrough) { /*do nothing*/ } \
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7702 else jmp(label) /*omit semi*/
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7703
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7704 // 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
7705 // 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
7706 // 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
7707 // type would need its own customized SSA.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7708 // 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
7709 // 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
7710 // 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
7711 cmpptr(sub_klass, super_klass);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7712 local_jcc(Assembler::equal, *L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7713
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7714 // Check the supertype display:
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7715 if (must_load_sco) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7716 // Positive movl does right thing on LP64.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7717 movl(temp_reg, super_check_offset_addr);
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7718 super_check_offset = RegisterOrConstant(temp_reg);
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7719 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7720 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
7721 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
7722
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7723 // 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
7724 // 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
7725 // (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
7726 // 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
7727 // 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
7728 // (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
7729 // 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
7730 // what we need immediately.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7731 // 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
7732 // 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
7733
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7734 if (super_check_offset.is_register()) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7735 local_jcc(Assembler::equal, *L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7736 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
7737 if (L_failure == &L_fallthrough) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7738 local_jcc(Assembler::equal, *L_slow_path);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7739 } else {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7740 local_jcc(Assembler::notEqual, *L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7741 final_jmp(*L_slow_path);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7742 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7743 } 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
7744 // 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
7745 if (L_slow_path == &L_fallthrough) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7746 local_jcc(Assembler::equal, *L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7747 } else {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7748 local_jcc(Assembler::notEqual, *L_slow_path);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7749 final_jmp(*L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7750 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7751 } else {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7752 // 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
7753 if (L_failure == &L_fallthrough) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7754 local_jcc(Assembler::equal, *L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7755 } else {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7756 local_jcc(Assembler::notEqual, *L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7757 final_jmp(*L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7758 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7759 }
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 bind(L_fallthrough);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7762
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7763 #undef local_jcc
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7764 #undef final_jmp
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
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7768 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
7769 Register super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7770 Register temp_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7771 Register temp2_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7772 Label* L_success,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7773 Label* L_failure,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7774 bool set_cond_codes) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7775 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
7776 if (temp2_reg != noreg)
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7777 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
7778 #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
7779
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7780 Label L_fallthrough;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7781 int label_nulls = 0;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7782 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
7783 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
7784 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
7785
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7786 // 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
7787 int ss_offset = (klassOopDesc::header_size() * HeapWordSize +
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7788 Klass::secondary_supers_offset_in_bytes());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7789 int sc_offset = (klassOopDesc::header_size() * HeapWordSize +
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7790 Klass::secondary_super_cache_offset_in_bytes());
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7791 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
7792 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
7793
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7794 // 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
7795 // 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
7796 // 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
7797 // 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
7798
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7799 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
7800 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
7801
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7802 // 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
7803 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
7804 if (super_klass != rax || UseCompressedOops) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7805 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
7806 mov(rax, super_klass);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7807 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7808 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
7809 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
7810
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7811 #ifndef PRODUCT
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7812 int* pst_counter = &SharedRuntime::_partial_subtype_ctr;
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7813 ExternalAddress pst_counter_addr((address) pst_counter);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7814 NOT_LP64( incrementl(pst_counter_addr) );
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7815 LP64_ONLY( lea(rcx, pst_counter_addr) );
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7816 LP64_ONLY( incrementl(Address(rcx, 0)) );
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7817 #endif //PRODUCT
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7818
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7819 // We will consult the secondary-super array.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7820 movptr(rdi, secondary_supers_addr);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7821 // 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
7822 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
7823 // Skip to start of data.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7824 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
7825
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7826 // 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
7827 // 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
7828 // 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
7829 // 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
7830 // 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
7831 #ifdef _LP64
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7832 // 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
7833 // 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
7834 // 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
7835 if (UseCompressedOops) {
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7836 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
7837 // 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
7838 // 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
7839 // 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
7840 // 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
7841 testl(rax,rax); // Set Z = 0
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7842 repne_scanl();
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7843 } else
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7844 #endif // _LP64
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7845 {
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7846 testptr(rax,rax); // Set Z = 0
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7847 repne_scan();
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
7848 }
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7849 // Unspill the temp. registers:
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7850 if (pushed_rdi) pop(rdi);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7851 if (pushed_rcx) pop(rcx);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7852 if (pushed_rax) pop(rax);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7853
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7854 if (set_cond_codes) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7855 // 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
7856 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
7857 // 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
7858 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7859
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7860 if (L_failure == &L_fallthrough)
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7861 jccb(Assembler::notEqual, *L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7862 else jcc(Assembler::notEqual, *L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7863
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7864 // 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
7865 movptr(super_cache_addr, super_klass);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7866
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7867 if (L_success != &L_fallthrough) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7868 jmp(*L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7869 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7870
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7871 #undef IS_A_TEMP
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7872
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7873 bind(L_fallthrough);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7874 }
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7875
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
7876
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7877 void MacroAssembler::ucomisd(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7878 ucomisd(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7879 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7880
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7881 void MacroAssembler::ucomiss(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7882 ucomiss(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7883 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7884
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7885 void MacroAssembler::xorpd(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7886 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7887 xorpd(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7888 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7889 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7890 xorpd(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7891 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7892 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7893
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7894 void MacroAssembler::xorps(XMMRegister dst, AddressLiteral src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7895 if (reachable(src)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7896 xorps(dst, as_Address(src));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7897 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7898 lea(rscratch1, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7899 xorps(dst, Address(rscratch1, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7900 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7901 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7902
2415
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7903 void MacroAssembler::cmov32(Condition cc, Register dst, Address src) {
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7904 if (VM_Version::supports_cmov()) {
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7905 cmovl(cc, dst, src);
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7906 } else {
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7907 Label L;
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7908 jccb(negate_condition(cc), L);
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7909 movl(dst, src);
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7910 bind(L);
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7911 }
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7912 }
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7913
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7914 void MacroAssembler::cmov32(Condition cc, Register dst, Register src) {
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7915 if (VM_Version::supports_cmov()) {
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7916 cmovl(cc, dst, src);
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7917 } else {
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7918 Label L;
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7919 jccb(negate_condition(cc), L);
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7920 movl(dst, src);
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7921 bind(L);
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7922 }
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7923 }
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
7924
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7925 void MacroAssembler::verify_oop(Register reg, const char* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
7926 if (!VerifyOops) return;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7927
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7928 // Pass register number to verify_oop_subroutine
a61af66fc99e Initial load
duke
parents:
diff changeset
7929 char* b = new char[strlen(s) + 50];
a61af66fc99e Initial load
duke
parents:
diff changeset
7930 sprintf(b, "verify_oop: %s: %s", reg->name(), s);
1583
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7931 #ifdef _LP64
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7932 push(rscratch1); // save r10, trashed by movptr()
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7933 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7934 push(rax); // save rax,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7935 push(reg); // pass register argument
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7936 ExternalAddress buffer((address) b);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7937 // avoid using pushptr, as it modifies scratch registers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7938 // and our contract is not to modify anything
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7939 movptr(rax, buffer.addr());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
7940 push(rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7941 // call indirectly to solve generation ordering problem
a61af66fc99e Initial load
duke
parents:
diff changeset
7942 movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address()));
a61af66fc99e Initial load
duke
parents:
diff changeset
7943 call(rax);
1583
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
7944 // Caller pops the arguments (oop, message) and restores rax, r10
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7945 }
a61af66fc99e Initial load
duke
parents:
diff changeset
7946
a61af66fc99e Initial load
duke
parents:
diff changeset
7947
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7948 RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr,
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7949 Register tmp,
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7950 int offset) {
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7951 intptr_t value = *delayed_value_addr;
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7952 if (value != 0)
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7953 return RegisterOrConstant(value + offset);
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7954
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7955 // 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
7956 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
7957
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7958 #ifdef ASSERT
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7959 { Label L;
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7960 testptr(tmp, tmp);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7961 if (WizardMode) {
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7962 jcc(Assembler::notZero, L);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7963 char* buf = new char[40];
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7964 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
7965 stop(buf);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7966 } else {
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7967 jccb(Assembler::notZero, L);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7968 hlt();
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7969 }
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7970 bind(L);
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1763
diff changeset
7971 }
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7972 #endif
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7973
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7974 if (offset != 0)
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7975 addptr(tmp, offset);
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7976
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 647
diff changeset
7977 return RegisterOrConstant(tmp);
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7978 }
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7979
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 606
diff changeset
7980
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7981 // registers on entry:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7982 // - rax ('check' register): required MethodType
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7983 // - rcx: method handle
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7984 // - rdx, rsi, or ?: killable temp
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7985 void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7986 Register temp_reg,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7987 Label& wrong_method_type) {
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2320
diff changeset
7988 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
7989 // compare method type against that of the receiver
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7990 if (UseCompressedOops) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7991 load_heap_oop(temp_reg, type_addr);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7992 cmpptr(mtype_reg, temp_reg);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7993 } else {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7994 cmpptr(mtype_reg, type_addr);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
7995 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7996 jcc(Assembler::notEqual, wrong_method_type);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7997 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7998
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
7999
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8000 // 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
8001 // argument list in JVM stack slots. This field is either located directly
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8002 // in every method handle, or else is indirectly accessed through the
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8003 // method handle's MethodType. This macro hides the distinction.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8004 void MacroAssembler::load_method_handle_vmslots(Register vmslots_reg, Register mh_reg,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8005 Register temp_reg) {
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1369
diff changeset
8006 assert_different_registers(vmslots_reg, mh_reg, temp_reg);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8007 // load mh.type.form.vmslots
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3873
diff changeset
8008 Register temp2_reg = vmslots_reg;
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3873
diff changeset
8009 load_heap_oop(temp2_reg, Address(mh_reg, delayed_value(java_lang_invoke_MethodHandle::type_offset_in_bytes, temp_reg)));
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3873
diff changeset
8010 load_heap_oop(temp2_reg, Address(temp2_reg, delayed_value(java_lang_invoke_MethodType::form_offset_in_bytes, temp_reg)));
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3873
diff changeset
8011 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
8012 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8013
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8014
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8015 // registers on entry:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8016 // - rcx: method handle
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8017 // - rdx: killable temp (interpreted only)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8018 // - rax: killable temp (compiled only)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8019 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
8020 assert(mh_reg == rcx, "caller must put MH object in rcx");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8021 assert_different_registers(mh_reg, temp_reg);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8022
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8023 // pick out the interpreted side of the handler
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8024 // 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
8025 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
8026
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8027 // off we go...
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8028 jmp(Address(temp_reg, MethodHandleEntry::from_interpreted_entry_offset_in_bytes()));
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8029
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8030 // for the various stubs which take control at this point,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8031 // see MethodHandles::generate_method_handle_stub
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8032 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8033
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8034
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8035 Address MacroAssembler::argument_address(RegisterOrConstant arg_slot,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8036 int extra_slot_offset) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8037 // cf. TemplateTable::prepare_invoke(), if (load_receiver).
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
8038 int stackElementSize = Interpreter::stackElementSize;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8039 int offset = Interpreter::expr_offset_in_bytes(extra_slot_offset+0);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8040 #ifdef ASSERT
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8041 int offset1 = Interpreter::expr_offset_in_bytes(extra_slot_offset+1);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8042 assert(offset1 - offset == stackElementSize, "correct arithmetic");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8043 #endif
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8044 Register scale_reg = noreg;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8045 Address::ScaleFactor scale_factor = Address::no_scale;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8046 if (arg_slot.is_constant()) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8047 offset += arg_slot.as_constant() * stackElementSize;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8048 } else {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8049 scale_reg = arg_slot.as_register();
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8050 scale_factor = Address::times(stackElementSize);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8051 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8052 offset += wordSize; // return PC is on stack
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8053 return Address(rsp, scale_reg, scale_factor, offset);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8054 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8055
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 681
diff changeset
8056
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8057 void MacroAssembler::verify_oop_addr(Address addr, const char* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8058 if (!VerifyOops) return;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8059
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8060 // Address adjust(addr.base(), addr.index(), addr.scale(), addr.disp() + BytesPerWord);
a61af66fc99e Initial load
duke
parents:
diff changeset
8061 // Pass register number to verify_oop_subroutine
a61af66fc99e Initial load
duke
parents:
diff changeset
8062 char* b = new char[strlen(s) + 50];
a61af66fc99e Initial load
duke
parents:
diff changeset
8063 sprintf(b, "verify_oop_addr: %s", s);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8064
1583
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
8065 #ifdef _LP64
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
8066 push(rscratch1); // save r10, trashed by movptr()
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
8067 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8068 push(rax); // save rax,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8069 // addr may contain rsp so we will have to adjust it based on the push
2464
d86923d96dca 7034967: C1: assert(false) failed: error (assembler_sparc.cpp:2043)
iveresov
parents: 2415
diff changeset
8070 // we just did (and on 64 bit we do two pushes)
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8071 // 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
8072 // stores rax into addr which is backwards of what was intended.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8073 if (addr.uses(rsp)) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8074 lea(rax, addr);
2464
d86923d96dca 7034967: C1: assert(false) failed: error (assembler_sparc.cpp:2043)
iveresov
parents: 2415
diff changeset
8075 pushptr(Address(rax, LP64_ONLY(2 *) BytesPerWord));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8076 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8077 pushptr(addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8078 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8079
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8080 ExternalAddress buffer((address) b);
a61af66fc99e Initial load
duke
parents:
diff changeset
8081 // pass msg argument
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8082 // avoid using pushptr, as it modifies scratch registers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8083 // and our contract is not to modify anything
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8084 movptr(rax, buffer.addr());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8085 push(rax);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8086
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8087 // call indirectly to solve generation ordering problem
a61af66fc99e Initial load
duke
parents:
diff changeset
8088 movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address()));
a61af66fc99e Initial load
duke
parents:
diff changeset
8089 call(rax);
1583
02e771df338e 6958254: -XX:+VerifyOops is broken on x86
kvn
parents: 1579
diff changeset
8090 // Caller pops the arguments (addr, message) and restores rax, r10.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8091 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8092
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8093 void MacroAssembler::verify_tlab() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8094 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8095 if (UseTLAB && VerifyOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8096 Label next, ok;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8097 Register t1 = rsi;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8098 Register thread_reg = NOT_LP64(rbx) LP64_ONLY(r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8099
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8100 push(t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8101 NOT_LP64(push(thread_reg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8102 NOT_LP64(get_thread(thread_reg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8103
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8104 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8105 cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_start_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8106 jcc(Assembler::aboveEqual, next);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8107 stop("assert(top >= start)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8108 should_not_reach_here();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8109
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8110 bind(next);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8111 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_end_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8112 cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8113 jcc(Assembler::aboveEqual, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8114 stop("assert(top <= end)");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8115 should_not_reach_here();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8116
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8117 bind(ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8118 NOT_LP64(pop(thread_reg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8119 pop(t1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8120 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8121 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8122 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8123
a61af66fc99e Initial load
duke
parents:
diff changeset
8124 class ControlWord {
a61af66fc99e Initial load
duke
parents:
diff changeset
8125 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8126 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
8127
a61af66fc99e Initial load
duke
parents:
diff changeset
8128 int rounding_control() const { return (_value >> 10) & 3 ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8129 int precision_control() const { return (_value >> 8) & 3 ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8130 bool precision() const { return ((_value >> 5) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8131 bool underflow() const { return ((_value >> 4) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8132 bool overflow() const { return ((_value >> 3) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8133 bool zero_divide() const { return ((_value >> 2) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8134 bool denormalized() const { return ((_value >> 1) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8135 bool invalid() const { return ((_value >> 0) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8136
a61af66fc99e Initial load
duke
parents:
diff changeset
8137 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8138 // rounding control
a61af66fc99e Initial load
duke
parents:
diff changeset
8139 const char* rc;
a61af66fc99e Initial load
duke
parents:
diff changeset
8140 switch (rounding_control()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8141 case 0: rc = "round near"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8142 case 1: rc = "round down"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8143 case 2: rc = "round up "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8144 case 3: rc = "chop "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8145 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8146 // precision control
a61af66fc99e Initial load
duke
parents:
diff changeset
8147 const char* pc;
a61af66fc99e Initial load
duke
parents:
diff changeset
8148 switch (precision_control()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8149 case 0: pc = "24 bits "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8150 case 1: pc = "reserved"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8151 case 2: pc = "53 bits "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8152 case 3: pc = "64 bits "; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
8153 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8154 // flags
a61af66fc99e Initial load
duke
parents:
diff changeset
8155 char f[9];
a61af66fc99e Initial load
duke
parents:
diff changeset
8156 f[0] = ' ';
a61af66fc99e Initial load
duke
parents:
diff changeset
8157 f[1] = ' ';
a61af66fc99e Initial load
duke
parents:
diff changeset
8158 f[2] = (precision ()) ? 'P' : 'p';
a61af66fc99e Initial load
duke
parents:
diff changeset
8159 f[3] = (underflow ()) ? 'U' : 'u';
a61af66fc99e Initial load
duke
parents:
diff changeset
8160 f[4] = (overflow ()) ? 'O' : 'o';
a61af66fc99e Initial load
duke
parents:
diff changeset
8161 f[5] = (zero_divide ()) ? 'Z' : 'z';
a61af66fc99e Initial load
duke
parents:
diff changeset
8162 f[6] = (denormalized()) ? 'D' : 'd';
a61af66fc99e Initial load
duke
parents:
diff changeset
8163 f[7] = (invalid ()) ? 'I' : 'i';
a61af66fc99e Initial load
duke
parents:
diff changeset
8164 f[8] = '\x0';
a61af66fc99e Initial load
duke
parents:
diff changeset
8165 // output
a61af66fc99e Initial load
duke
parents:
diff changeset
8166 printf("%04x masks = %s, %s, %s", _value & 0xFFFF, f, rc, pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
8167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8168
a61af66fc99e Initial load
duke
parents:
diff changeset
8169 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8170
a61af66fc99e Initial load
duke
parents:
diff changeset
8171 class StatusWord {
a61af66fc99e Initial load
duke
parents:
diff changeset
8172 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8173 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
8174
a61af66fc99e Initial load
duke
parents:
diff changeset
8175 bool busy() const { return ((_value >> 15) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8176 bool C3() const { return ((_value >> 14) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8177 bool C2() const { return ((_value >> 10) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8178 bool C1() const { return ((_value >> 9) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8179 bool C0() const { return ((_value >> 8) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8180 int top() const { return (_value >> 11) & 7 ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8181 bool error_status() const { return ((_value >> 7) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8182 bool stack_fault() const { return ((_value >> 6) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8183 bool precision() const { return ((_value >> 5) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8184 bool underflow() const { return ((_value >> 4) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8185 bool overflow() const { return ((_value >> 3) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8186 bool zero_divide() const { return ((_value >> 2) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8187 bool denormalized() const { return ((_value >> 1) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8188 bool invalid() const { return ((_value >> 0) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8189
a61af66fc99e Initial load
duke
parents:
diff changeset
8190 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8191 // condition codes
a61af66fc99e Initial load
duke
parents:
diff changeset
8192 char c[5];
a61af66fc99e Initial load
duke
parents:
diff changeset
8193 c[0] = (C3()) ? '3' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8194 c[1] = (C2()) ? '2' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8195 c[2] = (C1()) ? '1' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8196 c[3] = (C0()) ? '0' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8197 c[4] = '\x0';
a61af66fc99e Initial load
duke
parents:
diff changeset
8198 // flags
a61af66fc99e Initial load
duke
parents:
diff changeset
8199 char f[9];
a61af66fc99e Initial load
duke
parents:
diff changeset
8200 f[0] = (error_status()) ? 'E' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8201 f[1] = (stack_fault ()) ? 'S' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8202 f[2] = (precision ()) ? 'P' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8203 f[3] = (underflow ()) ? 'U' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8204 f[4] = (overflow ()) ? 'O' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8205 f[5] = (zero_divide ()) ? 'Z' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8206 f[6] = (denormalized()) ? 'D' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8207 f[7] = (invalid ()) ? 'I' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8208 f[8] = '\x0';
a61af66fc99e Initial load
duke
parents:
diff changeset
8209 // output
a61af66fc99e Initial load
duke
parents:
diff changeset
8210 printf("%04x flags = %s, cc = %s, top = %d", _value & 0xFFFF, f, c, top());
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
a61af66fc99e Initial load
duke
parents:
diff changeset
8215 class TagWord {
a61af66fc99e Initial load
duke
parents:
diff changeset
8216 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8217 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
8218
a61af66fc99e Initial load
duke
parents:
diff changeset
8219 int tag_at(int i) const { return (_value >> (i*2)) & 3; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8220
a61af66fc99e Initial load
duke
parents:
diff changeset
8221 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8222 printf("%04x", _value & 0xFFFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
8223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8224
a61af66fc99e Initial load
duke
parents:
diff changeset
8225 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8226
a61af66fc99e Initial load
duke
parents:
diff changeset
8227 class FPU_Register {
a61af66fc99e Initial load
duke
parents:
diff changeset
8228 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8229 int32_t _m0;
a61af66fc99e Initial load
duke
parents:
diff changeset
8230 int32_t _m1;
a61af66fc99e Initial load
duke
parents:
diff changeset
8231 int16_t _ex;
a61af66fc99e Initial load
duke
parents:
diff changeset
8232
a61af66fc99e Initial load
duke
parents:
diff changeset
8233 bool is_indefinite() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8234 return _ex == -1 && _m1 == (int32_t)0xC0000000 && _m0 == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
8235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8236
a61af66fc99e Initial load
duke
parents:
diff changeset
8237 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8238 char sign = (_ex < 0) ? '-' : '+';
a61af66fc99e Initial load
duke
parents:
diff changeset
8239 const char* kind = (_ex == 0x7FFF || _ex == (int16_t)-1) ? "NaN" : " ";
a61af66fc99e Initial load
duke
parents:
diff changeset
8240 printf("%c%04hx.%08x%08x %s", sign, _ex, _m1, _m0, kind);
a61af66fc99e Initial load
duke
parents:
diff changeset
8241 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8242
a61af66fc99e Initial load
duke
parents:
diff changeset
8243 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8244
a61af66fc99e Initial load
duke
parents:
diff changeset
8245 class FPU_State {
a61af66fc99e Initial load
duke
parents:
diff changeset
8246 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8247 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
8248 register_size = 10,
a61af66fc99e Initial load
duke
parents:
diff changeset
8249 number_of_registers = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
8250 register_mask = 7
a61af66fc99e Initial load
duke
parents:
diff changeset
8251 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8252
a61af66fc99e Initial load
duke
parents:
diff changeset
8253 ControlWord _control_word;
a61af66fc99e Initial load
duke
parents:
diff changeset
8254 StatusWord _status_word;
a61af66fc99e Initial load
duke
parents:
diff changeset
8255 TagWord _tag_word;
a61af66fc99e Initial load
duke
parents:
diff changeset
8256 int32_t _error_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
8257 int32_t _error_selector;
a61af66fc99e Initial load
duke
parents:
diff changeset
8258 int32_t _data_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
8259 int32_t _data_selector;
a61af66fc99e Initial load
duke
parents:
diff changeset
8260 int8_t _register[register_size * number_of_registers];
a61af66fc99e Initial load
duke
parents:
diff changeset
8261
a61af66fc99e Initial load
duke
parents:
diff changeset
8262 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
8263 FPU_Register* st(int i) const { return (FPU_Register*)&_register[register_size * i]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8264
a61af66fc99e Initial load
duke
parents:
diff changeset
8265 const char* tag_as_string(int tag) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8266 switch (tag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8267 case 0: return "valid";
a61af66fc99e Initial load
duke
parents:
diff changeset
8268 case 1: return "zero";
a61af66fc99e Initial load
duke
parents:
diff changeset
8269 case 2: return "special";
a61af66fc99e Initial load
duke
parents:
diff changeset
8270 case 3: return "empty";
a61af66fc99e Initial load
duke
parents:
diff changeset
8271 }
1489
cff162798819 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 1369
diff changeset
8272 ShouldNotReachHere();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8273 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
8274 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8275
a61af66fc99e Initial load
duke
parents:
diff changeset
8276 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8277 // print computation registers
a61af66fc99e Initial load
duke
parents:
diff changeset
8278 { int t = _status_word.top();
a61af66fc99e Initial load
duke
parents:
diff changeset
8279 for (int i = 0; i < number_of_registers; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8280 int j = (i - t) & register_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
8281 printf("%c r%d = ST%d = ", (j == 0 ? '*' : ' '), i, j);
a61af66fc99e Initial load
duke
parents:
diff changeset
8282 st(j)->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8283 printf(" %s\n", tag_as_string(_tag_word.tag_at(i)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8286 printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8287 // print control registers
a61af66fc99e Initial load
duke
parents:
diff changeset
8288 printf("ctrl = "); _control_word.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8289 printf("stat = "); _status_word .print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8290 printf("tags = "); _tag_word .print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8292
a61af66fc99e Initial load
duke
parents:
diff changeset
8293 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8294
a61af66fc99e Initial load
duke
parents:
diff changeset
8295 class Flag_Register {
a61af66fc99e Initial load
duke
parents:
diff changeset
8296 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8297 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
8298
a61af66fc99e Initial load
duke
parents:
diff changeset
8299 bool overflow() const { return ((_value >> 11) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8300 bool direction() const { return ((_value >> 10) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8301 bool sign() const { return ((_value >> 7) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8302 bool zero() const { return ((_value >> 6) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8303 bool auxiliary_carry() const { return ((_value >> 4) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8304 bool parity() const { return ((_value >> 2) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8305 bool carry() const { return ((_value >> 0) & 1) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
8306
a61af66fc99e Initial load
duke
parents:
diff changeset
8307 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8308 // flags
a61af66fc99e Initial load
duke
parents:
diff changeset
8309 char f[8];
a61af66fc99e Initial load
duke
parents:
diff changeset
8310 f[0] = (overflow ()) ? 'O' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8311 f[1] = (direction ()) ? 'D' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8312 f[2] = (sign ()) ? 'S' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8313 f[3] = (zero ()) ? 'Z' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8314 f[4] = (auxiliary_carry()) ? 'A' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8315 f[5] = (parity ()) ? 'P' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8316 f[6] = (carry ()) ? 'C' : '-';
a61af66fc99e Initial load
duke
parents:
diff changeset
8317 f[7] = '\x0';
a61af66fc99e Initial load
duke
parents:
diff changeset
8318 // output
a61af66fc99e Initial load
duke
parents:
diff changeset
8319 printf("%08x flags = %s", _value, f);
a61af66fc99e Initial load
duke
parents:
diff changeset
8320 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8321
a61af66fc99e Initial load
duke
parents:
diff changeset
8322 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8323
a61af66fc99e Initial load
duke
parents:
diff changeset
8324 class IU_Register {
a61af66fc99e Initial load
duke
parents:
diff changeset
8325 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8326 int32_t _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
8327
a61af66fc99e Initial load
duke
parents:
diff changeset
8328 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8329 printf("%08x %11d", _value, _value);
a61af66fc99e Initial load
duke
parents:
diff changeset
8330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8331
a61af66fc99e Initial load
duke
parents:
diff changeset
8332 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8333
a61af66fc99e Initial load
duke
parents:
diff changeset
8334 class IU_State {
a61af66fc99e Initial load
duke
parents:
diff changeset
8335 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8336 Flag_Register _eflags;
a61af66fc99e Initial load
duke
parents:
diff changeset
8337 IU_Register _rdi;
a61af66fc99e Initial load
duke
parents:
diff changeset
8338 IU_Register _rsi;
a61af66fc99e Initial load
duke
parents:
diff changeset
8339 IU_Register _rbp;
a61af66fc99e Initial load
duke
parents:
diff changeset
8340 IU_Register _rsp;
a61af66fc99e Initial load
duke
parents:
diff changeset
8341 IU_Register _rbx;
a61af66fc99e Initial load
duke
parents:
diff changeset
8342 IU_Register _rdx;
a61af66fc99e Initial load
duke
parents:
diff changeset
8343 IU_Register _rcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
8344 IU_Register _rax;
a61af66fc99e Initial load
duke
parents:
diff changeset
8345
a61af66fc99e Initial load
duke
parents:
diff changeset
8346 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8347 // computation registers
a61af66fc99e Initial load
duke
parents:
diff changeset
8348 printf("rax, = "); _rax.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8349 printf("rbx, = "); _rbx.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8350 printf("rcx = "); _rcx.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8351 printf("rdx = "); _rdx.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8352 printf("rdi = "); _rdi.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8353 printf("rsi = "); _rsi.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8354 printf("rbp, = "); _rbp.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8355 printf("rsp = "); _rsp.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8356 printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8357 // control registers
a61af66fc99e Initial load
duke
parents:
diff changeset
8358 printf("flgs = "); _eflags.print(); printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8360 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8361
a61af66fc99e Initial load
duke
parents:
diff changeset
8362
a61af66fc99e Initial load
duke
parents:
diff changeset
8363 class CPU_State {
a61af66fc99e Initial load
duke
parents:
diff changeset
8364 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
8365 FPU_State _fpu_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
8366 IU_State _iu_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
8367
a61af66fc99e Initial load
duke
parents:
diff changeset
8368 void print() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
8369 printf("--------------------------------------------------\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8370 _iu_state .print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8371 printf("\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8372 _fpu_state.print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8373 printf("--------------------------------------------------\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8374 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8375
a61af66fc99e Initial load
duke
parents:
diff changeset
8376 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8377
a61af66fc99e Initial load
duke
parents:
diff changeset
8378
a61af66fc99e Initial load
duke
parents:
diff changeset
8379 static void _print_CPU_state(CPU_State* state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8380 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8381 };
a61af66fc99e Initial load
duke
parents:
diff changeset
8382
a61af66fc99e Initial load
duke
parents:
diff changeset
8383
a61af66fc99e Initial load
duke
parents:
diff changeset
8384 void MacroAssembler::print_CPU_state() {
a61af66fc99e Initial load
duke
parents:
diff changeset
8385 push_CPU_state();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8386 push(rsp); // pass CPU state
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8387 call(RuntimeAddress(CAST_FROM_FN_PTR(address, _print_CPU_state)));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8388 addptr(rsp, wordSize); // discard argument
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8389 pop_CPU_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
8390 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8391
a61af66fc99e Initial load
duke
parents:
diff changeset
8392
a61af66fc99e Initial load
duke
parents:
diff changeset
8393 static bool _verify_FPU(int stack_depth, char* s, CPU_State* state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8394 static int counter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
8395 FPU_State* fs = &state->_fpu_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
8396 counter++;
a61af66fc99e Initial load
duke
parents:
diff changeset
8397 // For leaf calls, only verify that the top few elements remain empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
8398 // We only need 1 empty at the top for C2 code.
a61af66fc99e Initial load
duke
parents:
diff changeset
8399 if( stack_depth < 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8400 if( fs->tag_for_st(7) != 3 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8401 printf("FPR7 not empty\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
8402 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8403 assert(false, "error");
a61af66fc99e Initial load
duke
parents:
diff changeset
8404 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
8405 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8406 return true; // All other stack states do not matter
a61af66fc99e Initial load
duke
parents:
diff changeset
8407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8408
a61af66fc99e Initial load
duke
parents:
diff changeset
8409 assert((fs->_control_word._value & 0xffff) == StubRoutines::_fpu_cntrl_wrd_std,
a61af66fc99e Initial load
duke
parents:
diff changeset
8410 "bad FPU control word");
a61af66fc99e Initial load
duke
parents:
diff changeset
8411
a61af66fc99e Initial load
duke
parents:
diff changeset
8412 // compute stack depth
a61af66fc99e Initial load
duke
parents:
diff changeset
8413 int i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
8414 while (i < FPU_State::number_of_registers && fs->tag_for_st(i) < 3) i++;
a61af66fc99e Initial load
duke
parents:
diff changeset
8415 int d = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
8416 while (i < FPU_State::number_of_registers && fs->tag_for_st(i) == 3) i++;
a61af66fc99e Initial load
duke
parents:
diff changeset
8417 // verify findings
a61af66fc99e Initial load
duke
parents:
diff changeset
8418 if (i != FPU_State::number_of_registers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8419 // stack not contiguous
a61af66fc99e Initial load
duke
parents:
diff changeset
8420 printf("%s: stack not contiguous at ST%d\n", s, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
8421 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8422 assert(false, "error");
a61af66fc99e Initial load
duke
parents:
diff changeset
8423 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
8424 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8425 // check if computed stack depth corresponds to expected stack depth
a61af66fc99e Initial load
duke
parents:
diff changeset
8426 if (stack_depth < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8427 // expected stack depth is -stack_depth or less
a61af66fc99e Initial load
duke
parents:
diff changeset
8428 if (d > -stack_depth) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8429 // too many elements on the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
8430 printf("%s: <= %d stack elements expected but found %d\n", s, -stack_depth, d);
a61af66fc99e Initial load
duke
parents:
diff changeset
8431 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8432 assert(false, "error");
a61af66fc99e Initial load
duke
parents:
diff changeset
8433 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
8434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8435 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
8436 // expected stack depth is stack_depth
a61af66fc99e Initial load
duke
parents:
diff changeset
8437 if (d != stack_depth) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8438 // wrong stack depth
a61af66fc99e Initial load
duke
parents:
diff changeset
8439 printf("%s: %d stack elements expected but found %d\n", s, stack_depth, d);
a61af66fc99e Initial load
duke
parents:
diff changeset
8440 state->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
8441 assert(false, "error");
a61af66fc99e Initial load
duke
parents:
diff changeset
8442 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
8443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8445 // everything is cool
a61af66fc99e Initial load
duke
parents:
diff changeset
8446 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
8447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8448
a61af66fc99e Initial load
duke
parents:
diff changeset
8449
a61af66fc99e Initial load
duke
parents:
diff changeset
8450 void MacroAssembler::verify_FPU(int stack_depth, const char* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
8451 if (!VerifyFPU) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
8452 push_CPU_state();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8453 push(rsp); // pass CPU state
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8454 ExternalAddress msg((address) s);
a61af66fc99e Initial load
duke
parents:
diff changeset
8455 // pass message string s
a61af66fc99e Initial load
duke
parents:
diff changeset
8456 pushptr(msg.addr());
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8457 push(stack_depth); // pass stack depth
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8458 call(RuntimeAddress(CAST_FROM_FN_PTR(address, _verify_FPU)));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8459 addptr(rsp, 3 * wordSize); // discard arguments
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8460 // check for error
a61af66fc99e Initial load
duke
parents:
diff changeset
8461 { Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
8462 testl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
8463 jcc(Assembler::notZero, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
8464 int3(); // break if error condition
a61af66fc99e Initial load
duke
parents:
diff changeset
8465 bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
8466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8467 pop_CPU_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
8468 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8469
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8470 void MacroAssembler::load_klass(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8471 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8472 if (UseCompressedOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8473 movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8474 decode_heap_oop_not_null(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8475 } else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8476 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8477 movptr(dst, Address(src, oopDesc::klass_offset_in_bytes()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8478 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8479
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8480 void MacroAssembler::load_prototype_header(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8481 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8482 if (UseCompressedOops) {
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8483 assert (Universe::heap() != NULL, "java heap should be initialized");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8484 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
8485 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
8486 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
8487 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
8488 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
8489 } else {
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8490 // 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
8491 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
8492 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
8493 }
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8494 } else {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8495 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
8496 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8497 } else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8498 #endif
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8499 {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8500 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
8501 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
8502 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8503 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8504
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8505 void MacroAssembler::store_klass(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8506 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8507 if (UseCompressedOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8508 encode_heap_oop_not_null(src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8509 movl(Address(dst, oopDesc::klass_offset_in_bytes()), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8510 } else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8511 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8512 movptr(Address(dst, oopDesc::klass_offset_in_bytes()), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8513 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8514
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8515 void MacroAssembler::load_heap_oop(Register dst, Address src) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8516 #ifdef _LP64
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8517 if (UseCompressedOops) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8518 movl(dst, src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8519 decode_heap_oop(dst);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8520 } else
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8521 #endif
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8522 movptr(dst, src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8523 }
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8524
2464
d86923d96dca 7034967: C1: assert(false) failed: error (assembler_sparc.cpp:2043)
iveresov
parents: 2415
diff changeset
8525 // Doesn't do verfication, generates fixed size code
d86923d96dca 7034967: C1: assert(false) failed: error (assembler_sparc.cpp:2043)
iveresov
parents: 2415
diff changeset
8526 void MacroAssembler::load_heap_oop_not_null(Register dst, Address src) {
d86923d96dca 7034967: C1: assert(false) failed: error (assembler_sparc.cpp:2043)
iveresov
parents: 2415
diff changeset
8527 #ifdef _LP64
d86923d96dca 7034967: C1: assert(false) failed: error (assembler_sparc.cpp:2043)
iveresov
parents: 2415
diff changeset
8528 if (UseCompressedOops) {
d86923d96dca 7034967: C1: assert(false) failed: error (assembler_sparc.cpp:2043)
iveresov
parents: 2415
diff changeset
8529 movl(dst, src);
d86923d96dca 7034967: C1: assert(false) failed: error (assembler_sparc.cpp:2043)
iveresov
parents: 2415
diff changeset
8530 decode_heap_oop_not_null(dst);
d86923d96dca 7034967: C1: assert(false) failed: error (assembler_sparc.cpp:2043)
iveresov
parents: 2415
diff changeset
8531 } else
d86923d96dca 7034967: C1: assert(false) failed: error (assembler_sparc.cpp:2043)
iveresov
parents: 2415
diff changeset
8532 #endif
d86923d96dca 7034967: C1: assert(false) failed: error (assembler_sparc.cpp:2043)
iveresov
parents: 2415
diff changeset
8533 movptr(dst, src);
d86923d96dca 7034967: C1: assert(false) failed: error (assembler_sparc.cpp:2043)
iveresov
parents: 2415
diff changeset
8534 }
d86923d96dca 7034967: C1: assert(false) failed: error (assembler_sparc.cpp:2043)
iveresov
parents: 2415
diff changeset
8535
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8536 void MacroAssembler::store_heap_oop(Address dst, Register src) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8537 #ifdef _LP64
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8538 if (UseCompressedOops) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8539 assert(!dst.uses(src), "not enough registers");
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8540 encode_heap_oop(src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8541 movl(dst, src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8542 } else
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8543 #endif
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8544 movptr(dst, src);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8545 }
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8546
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8547 // Used for storing NULLs.
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8548 void MacroAssembler::store_heap_oop_null(Address dst) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8549 #ifdef _LP64
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8550 if (UseCompressedOops) {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8551 movl(dst, (int32_t)NULL_WORD);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8552 } else {
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8553 movslq(dst, (int32_t)NULL_WORD);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8554 }
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8555 #else
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8556 movl(dst, (int32_t)NULL_WORD);
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8557 #endif
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8558 }
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1793
diff changeset
8559
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8560 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8561 void MacroAssembler::store_klass_gap(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8562 if (UseCompressedOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8563 // Store to klass gap in destination
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8564 movl(Address(dst, oopDesc::klass_gap_offset_in_bytes()), src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8565 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8566 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8567
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8568 #ifdef ASSERT
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8569 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
8570 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
8571 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
8572 if (CheckCompressedOops) {
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8573 Label ok;
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8574 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
8575 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
8576 jcc(Assembler::equal, ok);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8577 stop(msg);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8578 bind(ok);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8579 pop(rscratch1);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8580 }
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8581 }
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8582 #endif
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8583
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8584 // Algorithm must match oop.inline.hpp encode_heap_oop.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8585 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
8586 #ifdef ASSERT
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8587 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
8588 #endif
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8589 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
8590 if (Universe::narrow_oop_base() == NULL) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8591 if (Universe::narrow_oop_shift() != 0) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8592 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
8593 shrq(r, LogMinObjAlignmentInBytes);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8594 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8595 return;
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8596 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8597 testq(r, r);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8598 cmovq(Assembler::equal, r, r12_heapbase);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8599 subq(r, r12_heapbase);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8600 shrq(r, LogMinObjAlignmentInBytes);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8601 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8602
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8603 void MacroAssembler::encode_heap_oop_not_null(Register r) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8604 #ifdef ASSERT
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8605 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
8606 if (CheckCompressedOops) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8607 Label ok;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8608 testq(r, r);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8609 jcc(Assembler::notEqual, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8610 stop("null oop passed to encode_heap_oop_not_null");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8611 bind(ok);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8612 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8613 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8614 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
8615 if (Universe::narrow_oop_base() != NULL) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8616 subq(r, r12_heapbase);
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 if (Universe::narrow_oop_shift() != 0) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8619 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
8620 shrq(r, LogMinObjAlignmentInBytes);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8621 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8622 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8623
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8624 void MacroAssembler::encode_heap_oop_not_null(Register dst, Register src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8625 #ifdef ASSERT
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8626 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
8627 if (CheckCompressedOops) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8628 Label ok;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8629 testq(src, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8630 jcc(Assembler::notEqual, ok);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8631 stop("null oop passed to encode_heap_oop_not_null2");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8632 bind(ok);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8633 }
a61af66fc99e Initial load
duke
parents:
diff changeset
8634 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8635 verify_oop(src, "broken oop in encode_heap_oop_not_null2");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8636 if (dst != src) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8637 movq(dst, src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8638 }
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8639 if (Universe::narrow_oop_base() != NULL) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8640 subq(dst, r12_heapbase);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8641 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8642 if (Universe::narrow_oop_shift() != 0) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8643 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
8644 shrq(dst, LogMinObjAlignmentInBytes);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8645 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8646 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8647
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8648 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
8649 #ifdef ASSERT
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8650 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
8651 #endif
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8652 if (Universe::narrow_oop_base() == NULL) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8653 if (Universe::narrow_oop_shift() != 0) {
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8654 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
8655 shlq(r, LogMinObjAlignmentInBytes);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8656 }
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8657 } else {
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8658 Label done;
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8659 shlq(r, LogMinObjAlignmentInBytes);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8660 jccb(Assembler::equal, done);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8661 addq(r, r12_heapbase);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8662 bind(done);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8663 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8664 verify_oop(r, "broken oop in decode_heap_oop");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8665 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8666
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8667 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
8668 // Note: it will change flags
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8669 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
8670 assert (Universe::heap() != NULL, "java heap should be initialized");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8671 // Cannot assert, unverified entry point counts instructions (see .ad file)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8672 // vtableStubs also counts instructions in pd_code_size_limit.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8673 // 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
8674 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
8675 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
8676 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
8677 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
8678 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
8679 }
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8680 } else {
898
60fea60a6db5 6864914: SPECjvm2008 produces invalid result with zero based Compressed Oops
kvn
parents: 845
diff changeset
8681 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
8682 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8683 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8684
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8685 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
8686 // Note: it will change flags
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8687 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
8688 assert (Universe::heap() != NULL, "java heap should be initialized");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8689 // Cannot assert, unverified entry point counts instructions (see .ad file)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8690 // vtableStubs also counts instructions in pd_code_size_limit.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8691 // 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
8692 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
8693 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
8694 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
8695 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
8696 } else {
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8697 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
8698 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
8699 }
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8700 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
8701 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
8702 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
8703 }
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1513
diff changeset
8704 }
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8705 } else {
898
60fea60a6db5 6864914: SPECjvm2008 produces invalid result with zero based Compressed Oops
kvn
parents: 845
diff changeset
8706 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
8707 if (dst != src) {
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8708 movq(dst, src);
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1583
diff changeset
8709 }
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8710 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8711 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8712
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8713 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
8714 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
8715 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
8716 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
8717 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
8718 RelocationHolder rspec = oop_Relocation::spec(oop_index);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8719 mov_narrow_oop(dst, oop_index, rspec);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8720 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8721
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8722 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
8723 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
8724 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
8725 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8726 int oop_index = oop_recorder()->find_index(obj);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8727 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
8728 mov_narrow_oop(dst, oop_index, rspec);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8729 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8730
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8731 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
8732 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
8733 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
8734 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
8735 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
8736 RelocationHolder rspec = oop_Relocation::spec(oop_index);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8737 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
8738 }
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8739
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8740 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
8741 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
8742 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
8743 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
8744 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
8745 RelocationHolder rspec = oop_Relocation::spec(oop_index);
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8746 Assembler::cmp_narrow_oop(dst, oop_index, rspec);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8747 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8748
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8749 void MacroAssembler::reinit_heapbase() {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8750 if (UseCompressedOops) {
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
8751 movptr(r12_heapbase, ExternalAddress((address)Universe::narrow_oop_base_addr()));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8752 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8753 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
8754 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8755
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8756 // 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
8757 // 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
8758 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
8759 Register cnt1, Register cnt2,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8760 int int_cnt2, Register result,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8761 XMMRegister vec, Register tmp) {
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8762 assert(UseSSE42Intrinsics, "SSE4.2 is required");
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8763
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8764 // This method uses pcmpestri inxtruction with bound registers
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8765 // inputs:
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8766 // xmm - substring
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8767 // rax - substring length (elements count)
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8768 // mem - scanned string
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8769 // rdx - string length (elements count)
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8770 // 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
8771 // outputs:
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8772 // rcx - matched index in string
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8773 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
8774
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8775 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
8776 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
8777 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
8778
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8779 // Note, inline_string_indexOf() generates checks:
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8780 // 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
8781 // if (substr.count == 0) return 0;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8782 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
8783
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8784 // Load substring.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8785 movdqu(vec, Address(str2, 0));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8786 movl(cnt2, int_cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8787 movptr(result, str1); // string addr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8788
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8789 if (int_cnt2 > 8) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8790 jmpb(SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8791
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8792 // Reload substr for rescan, this code
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8793 // 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
8794 bind(RELOAD_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8795 movdqu(vec, Address(str2, 0));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8796 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
8797
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8798 bind(RELOAD_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8799 // 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
8800 // 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
8801 // 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
8802
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8803 // 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
8804 // 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
8805 // Restored cnt1 = cnt1 - cnt2 + int_cnt2
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8806 subl(cnt1, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8807 addl(cnt1, int_cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8808 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
8809
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8810 decrementl(cnt1); // Shift to next element
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8811 cmpl(cnt1, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8812 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
8813
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8814 addptr(result, 2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8815
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8816 } // (int_cnt2 > 8)
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 // 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
8819 bind(SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8820 pcmpestri(vec, Address(result, 0), 0x0d);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8821 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
8822 subl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8823 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
8824 cmpl(cnt1, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8825 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
8826 addptr(result, 16);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8827 jmpb(SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8828
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8829 // Found a potential substr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8830 bind(FOUND_CANDIDATE);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8831 // 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
8832 if (int_cnt2 == 8) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8833 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
8834 } else { // int_cnt2 > 8
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8835 jccb(Assembler::overflow, FOUND_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8836 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8837 // 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
8838 // Compute start addr of substr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8839 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
8840
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8841 // 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
8842 subl(cnt1, tmp);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8843 cmpl(cnt1, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8844 if (int_cnt2 == 8) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8845 jccb(Assembler::greaterEqual, SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8846 } else { // int_cnt2 > 8
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8847 jccb(Assembler::greaterEqual, MATCH_SUBSTR_HEAD);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8848 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8849 // Left less then substring.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8850
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8851 bind(RET_NOT_FOUND);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8852 movl(result, -1);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8853 jmpb(EXIT);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8854
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8855 if (int_cnt2 > 8) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8856 // 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
8857 // 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
8858 bind(MATCH_SUBSTR_HEAD);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8859 pcmpestri(vec, Address(result, 0), 0x0d);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8860 // 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
8861 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
8862
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8863 Label CONT_SCAN_SUBSTR;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8864 // 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
8865 bind(FOUND_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8866 // First 8 chars are already matched.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8867 negptr(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8868 addptr(cnt2, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8869
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8870 bind(SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8871 subl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8872 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
8873 jccb(Assembler::lessEqual, CONT_SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8874 // 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
8875 // cnt1 = cnt1 - cnt2 + 8
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8876 addl(cnt1, cnt2); // cnt2 is negative
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8877 addl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8878 movl(cnt2, 8); negptr(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8879 bind(CONT_SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8880 if (int_cnt2 < (int)G) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8881 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
8882 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
8883 } else {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8884 // 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
8885 movl(tmp, int_cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8886 addptr(tmp, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8887 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
8888 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
8889 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8890 // 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
8891 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
8892 addptr(cnt2, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8893 jccb(Assembler::negative, SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8894 // Fall through if found full substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8895
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8896 } // (int_cnt2 > 8)
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8897
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8898 bind(RET_FOUND);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8899 // 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
8900 // Compute substr offset
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8901 subptr(result, str1);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8902 shrl(result, 1); // index
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8903 bind(EXIT);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8904
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8905 } // string_indexofC8
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8906
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8907 // 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
8908 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
8909 Register cnt1, Register cnt2,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8910 int int_cnt2, Register result,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8911 XMMRegister vec, Register tmp) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8912 assert(UseSSE42Intrinsics, "SSE4.2 is required");
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8913 //
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8914 // 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
8915 // 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
8916 // is in cnt2 register.
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 // Note, inline_string_indexOf() generates checks:
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8919 // 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
8920 // if (substr.count == 0) return 0;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8921 //
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8922 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
8923
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8924 // 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
8925 // inputs:
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8926 // xmm - substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8927 // rax - substring length (elements count)
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8928 // mem - scanned string
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8929 // rdx - string length (elements count)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8930 // 0xd - mode: 1100 (substring search) + 01 (unsigned shorts)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8931 // outputs:
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8932 // rcx - matched index in string
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8933 assert(cnt1 == rdx && cnt2 == rax && tmp == rcx, "pcmpestri");
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
8934
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8935 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
8936 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
8937 FOUND_CANDIDATE;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8938
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8939 { //========================================================
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8940 // 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
8941 // 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
8942 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
8943
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8944 movptr(tmp, rsp); // save old SP
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8945
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8946 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
8947 if (int_cnt2 == 1) { // One char
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8948 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
8949 movdl(vec, result); // move 32 bits
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8950 } 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
8951 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
8952 } 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
8953 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
8954 } else { // cnt2 = { 3, 5, 6, 7 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8955 // 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
8956 // + 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
8957 // 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
8958 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
8959 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
8960 psrldq(vec, 16-(int_cnt2*2));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8961 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8962 } else { // not constant substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8963 cmpl(cnt2, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8964 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
8965
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8966 // 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
8967 // 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
8968 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
8969 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
8970 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
8971 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
8972 jccb(Assembler::belowEqual, CHECK_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8973
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8974 // 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
8975 subptr(rsp, 16);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8976 int stk_offset = wordSize-2;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8977 push(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8978
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8979 bind(COPY_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8980 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
8981 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
8982 decrement(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8983 jccb(Assembler::notZero, COPY_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8984
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8985 pop(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8986 movptr(str2, rsp); // New substring address
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8987 } // non constant
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8988
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8989 bind(CHECK_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8990 cmpl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8991 jccb(Assembler::aboveEqual, BIG_STRINGS);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8992
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8993 // Check cross page boundary.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8994 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
8995 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
8996 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
8997 jccb(Assembler::belowEqual, BIG_STRINGS);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8998
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
8999 subptr(rsp, 16);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9000 int stk_offset = -2;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9001 if (int_cnt2 < 0) { // not constant
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9002 push(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9003 stk_offset += wordSize;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9004 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9005 movl(cnt2, cnt1);
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 bind(COPY_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9008 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
9009 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
9010 decrement(cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9011 jccb(Assembler::notZero, COPY_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9012
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9013 if (int_cnt2 < 0) { // not constant
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9014 pop(cnt2);
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 movptr(str1, rsp); // New string address
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9017
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9018 bind(BIG_STRINGS);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9019 // Load substring.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9020 if (int_cnt2 < 0) { // -1
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9021 movdqu(vec, Address(str2, 0));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9022 push(cnt2); // substr count
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9023 push(str2); // substr addr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9024 push(str1); // string addr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9025 } else {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9026 // 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
9027 movl(cnt2, int_cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9028 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9029 push(tmp); // original SP
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9030
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9031 } // Finished loading
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9032
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 // Start search
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9035 //
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9036
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9037 movptr(result, str1); // string addr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9038
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9039 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
9040 jmpb(SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9041
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9042 // SP saved at sp+0
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9043 // String saved at sp+1*wordSize
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9044 // Substr saved at sp+2*wordSize
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9045 // 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
9046
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9047 // Reload substr for rescan, this code
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9048 // 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
9049 bind(RELOAD_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9050 movptr(str2, Address(rsp, 2*wordSize));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9051 movl(cnt2, Address(rsp, 3*wordSize));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9052 movdqu(vec, Address(str2, 0));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9053 // 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
9054 // 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
9055 // 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
9056 subptr(str1, result); // Restore counter
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9057 shrl(str1, 1);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9058 addl(cnt1, str1);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9059 decrementl(cnt1); // Shift to next element
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9060 cmpl(cnt1, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9061 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
9062
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9063 addptr(result, 2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9064 } // non constant
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9065
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9066 // 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
9067 bind(SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9068 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
9069 pcmpestri(vec, Address(result, 0), 0x0d);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9070 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
9071 subl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9072 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
9073 cmpl(cnt1, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9074 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
9075 addptr(result, 16);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9076
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9077 bind(ADJUST_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9078 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
9079 jccb(Assembler::greaterEqual, SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9080 // 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
9081 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
9082 movl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9083 jmpb(SCAN_TO_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9084
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9085 // Found a potential substr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9086 bind(FOUND_CANDIDATE);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9087 // After pcmpestri tmp(rcx) contains matched element index
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9088
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9089 // Make sure string is still long enough
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9090 subl(cnt1, tmp);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9091 cmpl(cnt1, cnt2);
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9092 jccb(Assembler::greaterEqual, FOUND_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9093 // Left less then substring.
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9094
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9095 bind(RET_NOT_FOUND);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9096 movl(result, -1);
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9097 jmpb(CLEANUP);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9098
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9099 bind(FOUND_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9100 // Compute start addr of substr
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9101 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
9102
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9103 if (int_cnt2 > 0) { // Constant substring
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9104 // 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
9105 // from new point without reloading substring.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9106 // 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
9107 cmpl(tmp, 8-int_cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9108 jccb(Assembler::greater, ADJUST_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9109 // Fall through if matched whole substring.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9110 } else { // non constant
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9111 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
9112
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9113 addl(tmp, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9114 // 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
9115 cmpl(tmp, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9116 jccb(Assembler::lessEqual, RET_FOUND);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9117
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9118 // 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
9119 // 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
9120 cmpl(cnt2, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9121 // 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
9122 jccb(Assembler::lessEqual, ADJUST_STR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9123
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9124 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
9125 // 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
9126 movptr(str1, result);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9127
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9128 cmpl(tmp, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9129 // First 8 chars are already matched.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9130 jccb(Assembler::equal, CHECK_NEXT);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9131
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9132 bind(SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9133 pcmpestri(vec, Address(str1, 0), 0x0d);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9134 // 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
9135 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
9136
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9137 bind(CHECK_NEXT);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9138 subl(cnt2, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9139 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
9140 addptr(str1, 16);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9141 addptr(str2, 16);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9142 subl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9143 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
9144 jccb(Assembler::greaterEqual, CONT_SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9145 // 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
9146 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
9147 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
9148 subl(cnt1, cnt2);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9149 movl(cnt2, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9150 addl(cnt1, 8);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9151 bind(CONT_SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9152 movdqu(vec, Address(str2, 0));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9153 jmpb(SCAN_SUBSTR);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9154
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9155 bind(RET_FOUND_LONG);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9156 movptr(str1, Address(rsp, wordSize));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9157 } // non constant
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9158
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9159 bind(RET_FOUND);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9160 // Compute substr offset
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9161 subptr(result, str1);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9162 shrl(result, 1); // index
986
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 bind(CLEANUP);
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9165 pop(rsp); // restore SP
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9166
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
9167 } // string_indexof
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9168
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9169 // Compare strings.
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9170 void MacroAssembler::string_compare(Register str1, Register str2,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9171 Register cnt1, Register cnt2, Register result,
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9172 XMMRegister vec1) {
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9173 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
9174
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9175 // Compute the minimum of the string lengths and the
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9176 // difference of the string lengths (stack).
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9177 // Do the conditional move stuff
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9178 movl(result, cnt1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9179 subl(cnt1, cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9180 push(cnt1);
2415
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
9181 cmov32(Assembler::lessEqual, cnt2, result);
986
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 // Is the minimum length zero?
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9184 testl(cnt2, cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9185 jcc(Assembler::zero, LENGTH_DIFF_LABEL);
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 // Load first characters
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9188 load_unsigned_short(result, Address(str1, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9189 load_unsigned_short(cnt1, Address(str2, 0));
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 first characters
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9192 subl(result, cnt1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9193 jcc(Assembler::notZero, POP_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9194 decrementl(cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9195 jcc(Assembler::zero, LENGTH_DIFF_LABEL);
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 {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9198 // 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
9199 Label LSkip2;
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9200 // Check if the strings start at same location
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9201 cmpptr(str1, str2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9202 jccb(Assembler::notEqual, LSkip2);
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 // Check if the length difference is zero (from stack)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9205 cmpl(Address(rsp, 0), 0x0);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9206 jcc(Assembler::equal, LENGTH_DIFF_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9207
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9208 // Strings might not be equivalent
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9209 bind(LSkip2);
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
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9212 Address::ScaleFactor scale = Address::times_2;
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9213 int stride = 8;
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9214
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9215 // Advance to next element
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9216 addptr(str1, 16/stride);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9217 addptr(str2, 16/stride);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9218
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9219 if (UseSSE42Intrinsics) {
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9220 Label COMPARE_WIDE_VECTORS, VECTOR_NOT_EQUAL, COMPARE_TAIL;
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9221 int pcmpmask = 0x19;
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9222 // Setup to compare 16-byte vectors
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9223 movl(result, cnt2);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9224 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
9225 jccb(Assembler::zero, COMPARE_TAIL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9226
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9227 lea(str1, Address(str1, result, scale));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9228 lea(str2, Address(str2, result, scale));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9229 negptr(result);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9230
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9231 // pcmpestri
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9232 // inputs:
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9233 // vec1- substring
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9234 // rax - negative string length (elements count)
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9235 // mem - scaned string
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9236 // rdx - string length (elements count)
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9237 // pcmpmask - cmp mode: 11000 (string compare with negated result)
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9238 // + 00 (unsigned bytes) or + 01 (unsigned shorts)
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9239 // outputs:
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9240 // rcx - first mismatched element index
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9241 assert(result == rax && cnt2 == rdx && cnt1 == rcx, "pcmpestri");
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9242
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9243 bind(COMPARE_WIDE_VECTORS);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9244 movdqu(vec1, Address(str1, result, scale));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9245 pcmpestri(vec1, Address(str2, result, scale), pcmpmask);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9246 // After pcmpestri cnt1(rcx) contains mismatched element index
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9247
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9248 jccb(Assembler::below, VECTOR_NOT_EQUAL); // CF==1
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9249 addptr(result, stride);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9250 subptr(cnt2, stride);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9251 jccb(Assembler::notZero, COMPARE_WIDE_VECTORS);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9252
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9253 // compare wide vectors tail
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9254 testl(result, result);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9255 jccb(Assembler::zero, LENGTH_DIFF_LABEL);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9256
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9257 movl(cnt2, stride);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9258 movl(result, stride);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9259 negptr(result);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9260 movdqu(vec1, Address(str1, result, scale));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9261 pcmpestri(vec1, Address(str2, result, scale), pcmpmask);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9262 jccb(Assembler::aboveEqual, LENGTH_DIFF_LABEL);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9263
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9264 // Mismatched characters in the vectors
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9265 bind(VECTOR_NOT_EQUAL);
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9266 addptr(result, cnt1);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9267 movptr(cnt2, result);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9268 load_unsigned_short(result, Address(str1, cnt2, scale));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9269 load_unsigned_short(cnt1, Address(str2, cnt2, scale));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9270 subl(result, cnt1);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9271 jmpb(POP_LABEL);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9272
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9273 bind(COMPARE_TAIL); // limit is zero
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9274 movl(cnt2, result);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9275 // Fallthru to tail compare
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
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9278 // Shift str2 and str1 to the end of the arrays, negate min
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9279 lea(str1, Address(str1, cnt2, scale, 0));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9280 lea(str2, Address(str2, cnt2, scale, 0));
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9281 negptr(cnt2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9282
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9283 // Compare the rest of the elements
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9284 bind(WHILE_HEAD_LABEL);
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9285 load_unsigned_short(result, Address(str1, cnt2, scale, 0));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9286 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
9287 subl(result, cnt1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9288 jccb(Assembler::notZero, POP_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9289 increment(cnt2);
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9290 jccb(Assembler::notZero, WHILE_HEAD_LABEL);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9291
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9292 // 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
9293 bind(LENGTH_DIFF_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9294 pop(result);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9295 jmpb(DONE_LABEL);
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 // Discard the stored length difference
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9298 bind(POP_LABEL);
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9299 pop(cnt1);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9300
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9301 // That's it
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9302 bind(DONE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9303 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9304
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9305 // Compare char[] arrays aligned to 4 bytes or substrings.
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9306 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
9307 Register limit, Register result, Register chr,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9308 XMMRegister vec1, XMMRegister vec2) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9309 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
9310
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9311 int length_offset = arrayOopDesc::length_offset_in_bytes();
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9312 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
9313
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9314 // Check the input args
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9315 cmpptr(ary1, ary2);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9316 jcc(Assembler::equal, TRUE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9317
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9318 if (is_array_equ) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9319 // Need additional checks for arrays_equals.
1016
d40f03b57795 6890984: Comparison of 2 arrays could cause VM crash
kvn
parents: 986
diff changeset
9320 testptr(ary1, ary1);
d40f03b57795 6890984: Comparison of 2 arrays could cause VM crash
kvn
parents: 986
diff changeset
9321 jcc(Assembler::zero, FALSE_LABEL);
d40f03b57795 6890984: Comparison of 2 arrays could cause VM crash
kvn
parents: 986
diff changeset
9322 testptr(ary2, ary2);
d40f03b57795 6890984: Comparison of 2 arrays could cause VM crash
kvn
parents: 986
diff changeset
9323 jcc(Assembler::zero, FALSE_LABEL);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9324
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9325 // Check the lengths
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9326 movl(limit, Address(ary1, length_offset));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9327 cmpl(limit, Address(ary2, length_offset));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9328 jcc(Assembler::notEqual, FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9329 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9330
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9331 // count == 0
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9332 testl(limit, limit);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9333 jcc(Assembler::zero, TRUE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9334
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9335 if (is_array_equ) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9336 // Load array address
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9337 lea(ary1, Address(ary1, base_offset));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9338 lea(ary2, Address(ary2, base_offset));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9339 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9340
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9341 shll(limit, 1); // byte count != 0
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9342 movl(result, limit); // copy
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9343
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9344 if (UseSSE42Intrinsics) {
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9345 // With SSE4.2, use double quad vector compare
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9346 Label COMPARE_WIDE_VECTORS, COMPARE_TAIL;
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9347
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9348 // Compare 16-byte vectors
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9349 andl(result, 0x0000000e); // tail count (in bytes)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9350 andl(limit, 0xfffffff0); // vector count (in bytes)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9351 jccb(Assembler::zero, COMPARE_TAIL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9352
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9353 lea(ary1, Address(ary1, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9354 lea(ary2, Address(ary2, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9355 negptr(limit);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9356
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9357 bind(COMPARE_WIDE_VECTORS);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9358 movdqu(vec1, Address(ary1, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9359 movdqu(vec2, Address(ary2, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9360 pxor(vec1, vec2);
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9361
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9362 ptest(vec1, vec1);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9363 jccb(Assembler::notZero, FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9364 addptr(limit, 16);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9365 jcc(Assembler::notZero, COMPARE_WIDE_VECTORS);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9366
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9367 testl(result, result);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9368 jccb(Assembler::zero, TRUE_LABEL);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9369
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9370 movdqu(vec1, Address(ary1, result, Address::times_1, -16));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9371 movdqu(vec2, Address(ary2, result, Address::times_1, -16));
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9372 pxor(vec1, vec2);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9373
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9374 ptest(vec1, vec1);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9375 jccb(Assembler::notZero, FALSE_LABEL);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9376 jmpb(TRUE_LABEL);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2258
diff changeset
9377
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9378 bind(COMPARE_TAIL); // limit is zero
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9379 movl(limit, result);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9380 // Fallthru to tail compare
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9381 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9382
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9383 // Compare 4-byte vectors
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9384 andl(limit, 0xfffffffc); // vector count (in bytes)
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9385 jccb(Assembler::zero, COMPARE_CHAR);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9386
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9387 lea(ary1, Address(ary1, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9388 lea(ary2, Address(ary2, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9389 negptr(limit);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9390
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9391 bind(COMPARE_VECTORS);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9392 movl(chr, Address(ary1, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9393 cmpl(chr, Address(ary2, limit, Address::times_1));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9394 jccb(Assembler::notEqual, FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9395 addptr(limit, 4);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9396 jcc(Assembler::notZero, COMPARE_VECTORS);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9397
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9398 // Compare trailing char (final 2 bytes), if any
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9399 bind(COMPARE_CHAR);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9400 testl(result, 0x2); // tail char
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9401 jccb(Assembler::zero, TRUE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9402 load_unsigned_short(chr, Address(ary1, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9403 load_unsigned_short(limit, Address(ary2, 0));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9404 cmpl(chr, limit);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9405 jccb(Assembler::notEqual, FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9406
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9407 bind(TRUE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9408 movl(result, 1); // return true
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9409 jmpb(DONE);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9410
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9411 bind(FALSE_LABEL);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9412 xorl(result, result); // return false
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9413
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9414 // That's it
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9415 bind(DONE);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9416 }
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 898
diff changeset
9417
1763
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9418 #ifdef PRODUCT
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9419 #define BLOCK_COMMENT(str) /* nothing */
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9420 #else
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9421 #define BLOCK_COMMENT(str) block_comment(str)
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9422 #endif
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9423
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9424 #define BIND(label) bind(label); BLOCK_COMMENT(#label ":")
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9425 void MacroAssembler::generate_fill(BasicType t, bool aligned,
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9426 Register to, Register value, Register count,
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9427 Register rtmp, XMMRegister xtmp) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9428 assert_different_registers(to, value, count, rtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9429 Label L_exit, L_skip_align1, L_skip_align2, L_fill_byte;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9430 Label L_fill_2_bytes, L_fill_4_bytes;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9431
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9432 int shift = -1;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9433 switch (t) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9434 case T_BYTE:
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9435 shift = 2;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9436 break;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9437 case T_SHORT:
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9438 shift = 1;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9439 break;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9440 case T_INT:
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9441 shift = 0;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9442 break;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9443 default: ShouldNotReachHere();
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9444 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9445
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9446 if (t == T_BYTE) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9447 andl(value, 0xff);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9448 movl(rtmp, value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9449 shll(rtmp, 8);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9450 orl(value, rtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9451 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9452 if (t == T_SHORT) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9453 andl(value, 0xffff);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9454 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9455 if (t == T_BYTE || t == T_SHORT) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9456 movl(rtmp, value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9457 shll(rtmp, 16);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9458 orl(value, rtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9459 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9460
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9461 cmpl(count, 2<<shift); // Short arrays (< 8 bytes) fill by element
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9462 jcc(Assembler::below, L_fill_4_bytes); // use unsigned cmp
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9463 if (!UseUnalignedLoadStores && !aligned && (t == T_BYTE || t == T_SHORT)) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9464 // align source address at 4 bytes address boundary
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 // One byte misalignment happens only for byte arrays
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9467 testptr(to, 1);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9468 jccb(Assembler::zero, L_skip_align1);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9469 movb(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9470 increment(to);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9471 decrement(count);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9472 BIND(L_skip_align1);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9473 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9474 // Two bytes misalignment happens only for byte and short (char) arrays
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9475 testptr(to, 2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9476 jccb(Assembler::zero, L_skip_align2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9477 movw(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9478 addptr(to, 2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9479 subl(count, 1<<(shift-1));
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9480 BIND(L_skip_align2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9481 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9482 if (UseSSE < 2) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9483 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
9484 // Fill 32-byte chunks
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9485 subl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9486 jcc(Assembler::less, L_check_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9487 align(16);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9488
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9489 BIND(L_fill_32_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9490
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9491 for (int i = 0; i < 32; i += 4) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9492 movl(Address(to, i), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9493 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9494
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9495 addptr(to, 32);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9496 subl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9497 jcc(Assembler::greaterEqual, L_fill_32_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9498 BIND(L_check_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9499 addl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9500 jccb(Assembler::zero, L_exit);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9501 jmpb(L_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9502
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9503 //
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9504 // length is too short, just fill qwords
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9505 //
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9506 BIND(L_fill_8_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9507 movl(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9508 movl(Address(to, 4), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9509 addptr(to, 8);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9510 BIND(L_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9511 subl(count, 1 << (shift + 1));
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9512 jcc(Assembler::greaterEqual, L_fill_8_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9513 // fall through to fill 4 bytes
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9514 } else {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9515 Label L_fill_32_bytes;
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9516 if (!UseUnalignedLoadStores) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9517 // align to 8 bytes, we know we are 4 byte aligned to start
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9518 testptr(to, 4);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9519 jccb(Assembler::zero, L_fill_32_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9520 movl(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9521 addptr(to, 4);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9522 subl(count, 1<<shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9523 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9524 BIND(L_fill_32_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9525 {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9526 assert( UseSSE >= 2, "supported cpu only" );
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9527 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
9528 // Fill 32-byte chunks
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9529 movdl(xtmp, value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9530 pshufd(xtmp, xtmp, 0);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9531
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9532 subl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9533 jcc(Assembler::less, L_check_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9534 align(16);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9535
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9536 BIND(L_fill_32_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9537
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9538 if (UseUnalignedLoadStores) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9539 movdqu(Address(to, 0), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9540 movdqu(Address(to, 16), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9541 } else {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9542 movq(Address(to, 0), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9543 movq(Address(to, 8), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9544 movq(Address(to, 16), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9545 movq(Address(to, 24), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9546 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9547
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9548 addptr(to, 32);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9549 subl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9550 jcc(Assembler::greaterEqual, L_fill_32_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9551 BIND(L_check_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9552 addl(count, 8 << shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9553 jccb(Assembler::zero, L_exit);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9554 jmpb(L_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9555
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9556 //
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9557 // length is too short, just fill qwords
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9558 //
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9559 BIND(L_fill_8_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9560 movq(Address(to, 0), xtmp);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9561 addptr(to, 8);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9562 BIND(L_fill_8_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9563 subl(count, 1 << (shift + 1));
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9564 jcc(Assembler::greaterEqual, L_fill_8_bytes_loop);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9565 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9566 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9567 // fill trailing 4 bytes
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9568 BIND(L_fill_4_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9569 testl(count, 1<<shift);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9570 jccb(Assembler::zero, L_fill_2_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9571 movl(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9572 if (t == T_BYTE || t == T_SHORT) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9573 addptr(to, 4);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9574 BIND(L_fill_2_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9575 // fill trailing 2 bytes
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9576 testl(count, 1<<(shift-1));
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9577 jccb(Assembler::zero, L_fill_byte);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9578 movw(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9579 if (t == T_BYTE) {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9580 addptr(to, 2);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9581 BIND(L_fill_byte);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9582 // fill trailing byte
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9583 testl(count, 1);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9584 jccb(Assembler::zero, L_exit);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9585 movb(Address(to, 0), value);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9586 } else {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9587 BIND(L_fill_byte);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9588 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9589 } else {
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9590 BIND(L_fill_2_bytes);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9591 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9592 BIND(L_exit);
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9593 }
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9594 #undef BIND
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9595 #undef BLOCK_COMMENT
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9596
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1690
diff changeset
9597
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9598 Assembler::Condition MacroAssembler::negate_condition(Assembler::Condition cond) {
a61af66fc99e Initial load
duke
parents:
diff changeset
9599 switch (cond) {
a61af66fc99e Initial load
duke
parents:
diff changeset
9600 // Note some conditions are synonyms for others
a61af66fc99e Initial load
duke
parents:
diff changeset
9601 case Assembler::zero: return Assembler::notZero;
a61af66fc99e Initial load
duke
parents:
diff changeset
9602 case Assembler::notZero: return Assembler::zero;
a61af66fc99e Initial load
duke
parents:
diff changeset
9603 case Assembler::less: return Assembler::greaterEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
9604 case Assembler::lessEqual: return Assembler::greater;
a61af66fc99e Initial load
duke
parents:
diff changeset
9605 case Assembler::greater: return Assembler::lessEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
9606 case Assembler::greaterEqual: return Assembler::less;
a61af66fc99e Initial load
duke
parents:
diff changeset
9607 case Assembler::below: return Assembler::aboveEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
9608 case Assembler::belowEqual: return Assembler::above;
a61af66fc99e Initial load
duke
parents:
diff changeset
9609 case Assembler::above: return Assembler::belowEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
9610 case Assembler::aboveEqual: return Assembler::below;
a61af66fc99e Initial load
duke
parents:
diff changeset
9611 case Assembler::overflow: return Assembler::noOverflow;
a61af66fc99e Initial load
duke
parents:
diff changeset
9612 case Assembler::noOverflow: return Assembler::overflow;
a61af66fc99e Initial load
duke
parents:
diff changeset
9613 case Assembler::negative: return Assembler::positive;
a61af66fc99e Initial load
duke
parents:
diff changeset
9614 case Assembler::positive: return Assembler::negative;
a61af66fc99e Initial load
duke
parents:
diff changeset
9615 case Assembler::parity: return Assembler::noParity;
a61af66fc99e Initial load
duke
parents:
diff changeset
9616 case Assembler::noParity: return Assembler::parity;
a61af66fc99e Initial load
duke
parents:
diff changeset
9617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
9618 ShouldNotReachHere(); return Assembler::overflow;
a61af66fc99e Initial load
duke
parents:
diff changeset
9619 }
a61af66fc99e Initial load
duke
parents:
diff changeset
9620
a61af66fc99e Initial load
duke
parents:
diff changeset
9621 SkipIfEqual::SkipIfEqual(
a61af66fc99e Initial load
duke
parents:
diff changeset
9622 MacroAssembler* masm, const bool* flag_addr, bool value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
9623 _masm = masm;
a61af66fc99e Initial load
duke
parents:
diff changeset
9624 _masm->cmp8(ExternalAddress((address)flag_addr), value);
a61af66fc99e Initial load
duke
parents:
diff changeset
9625 _masm->jcc(Assembler::equal, _label);
a61af66fc99e Initial load
duke
parents:
diff changeset
9626 }
a61af66fc99e Initial load
duke
parents:
diff changeset
9627
a61af66fc99e Initial load
duke
parents:
diff changeset
9628 SkipIfEqual::~SkipIfEqual() {
a61af66fc99e Initial load
duke
parents:
diff changeset
9629 _masm->bind(_label);
a61af66fc99e Initial load
duke
parents:
diff changeset
9630 }