annotate src/cpu/x86/vm/assembler_x86.hpp @ 20304:a22acf6d7598

8048112: G1 Full GC needs to support the case when the very first region is not available Summary: Refactor preparation for compaction during Full GC so that it lazily initializes the first compaction point. This also avoids problems later when the first region may not be committed. Also reviewed by K. Barrett. Reviewed-by: brutisso
author tschatzl
date Mon, 21 Jul 2014 10:00:31 +0200
parents 606acabe7b5c
children 52b4284cb496 b1bc1af04c6e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
7951
8b46b0196eb0 8000692: Remove old KERNEL code
zgu
parents: 7477
diff changeset
2 * Copyright (c) 1997, 2013, 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: 1503
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1503
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: 1503
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 #ifndef CPU_X86_VM_ASSEMBLER_X86_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
26 #define CPU_X86_VM_ASSEMBLER_X86_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
27
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
28 #include "asm/register.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
29
0
a61af66fc99e Initial load
duke
parents:
diff changeset
30 class BiasedLockingCounters;
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // Contains all the definitions needed for x86 assembly code generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
33
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // Calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
35 class Argument VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
36 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
37 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
38 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
39 #ifdef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
40 n_int_register_parameters_c = 4, // rcx, rdx, r8, r9 (c_rarg0, c_rarg1, ...)
a61af66fc99e Initial load
duke
parents:
diff changeset
41 n_float_register_parameters_c = 4, // xmm0 - xmm3 (c_farg0, c_farg1, ... )
a61af66fc99e Initial load
duke
parents:
diff changeset
42 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
43 n_int_register_parameters_c = 6, // rdi, rsi, rdx, rcx, r8, r9 (c_rarg0, c_rarg1, ...)
a61af66fc99e Initial load
duke
parents:
diff changeset
44 n_float_register_parameters_c = 8, // xmm0 - xmm7 (c_farg0, c_farg1, ... )
a61af66fc99e Initial load
duke
parents:
diff changeset
45 #endif // _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
46 n_int_register_parameters_j = 6, // j_rarg0, j_rarg1, ...
a61af66fc99e Initial load
duke
parents:
diff changeset
47 n_float_register_parameters_j = 8 // j_farg0, j_farg1, ...
a61af66fc99e Initial load
duke
parents:
diff changeset
48 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
49 n_register_parameters = 0 // 0 registers used to pass arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
50 #endif // _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
51 };
a61af66fc99e Initial load
duke
parents:
diff changeset
52 };
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // Symbolically name the register arguments used by the c calling convention.
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // Windows is different from linux/solaris. So much for standards...
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 #ifdef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 REGISTER_DECLARATION(Register, c_rarg0, rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
62 REGISTER_DECLARATION(Register, c_rarg1, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
63 REGISTER_DECLARATION(Register, c_rarg2, r8);
a61af66fc99e Initial load
duke
parents:
diff changeset
64 REGISTER_DECLARATION(Register, c_rarg3, r9);
a61af66fc99e Initial load
duke
parents:
diff changeset
65
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
66 REGISTER_DECLARATION(XMMRegister, c_farg0, xmm0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
67 REGISTER_DECLARATION(XMMRegister, c_farg1, xmm1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
68 REGISTER_DECLARATION(XMMRegister, c_farg2, xmm2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
69 REGISTER_DECLARATION(XMMRegister, c_farg3, xmm3);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 REGISTER_DECLARATION(Register, c_rarg0, rdi);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 REGISTER_DECLARATION(Register, c_rarg1, rsi);
a61af66fc99e Initial load
duke
parents:
diff changeset
75 REGISTER_DECLARATION(Register, c_rarg2, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 REGISTER_DECLARATION(Register, c_rarg3, rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
77 REGISTER_DECLARATION(Register, c_rarg4, r8);
a61af66fc99e Initial load
duke
parents:
diff changeset
78 REGISTER_DECLARATION(Register, c_rarg5, r9);
a61af66fc99e Initial load
duke
parents:
diff changeset
79
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
80 REGISTER_DECLARATION(XMMRegister, c_farg0, xmm0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
81 REGISTER_DECLARATION(XMMRegister, c_farg1, xmm1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
82 REGISTER_DECLARATION(XMMRegister, c_farg2, xmm2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
83 REGISTER_DECLARATION(XMMRegister, c_farg3, xmm3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
84 REGISTER_DECLARATION(XMMRegister, c_farg4, xmm4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
85 REGISTER_DECLARATION(XMMRegister, c_farg5, xmm5);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
86 REGISTER_DECLARATION(XMMRegister, c_farg6, xmm6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
87 REGISTER_DECLARATION(XMMRegister, c_farg7, xmm7);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 #endif // _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // Symbolically name the register arguments used by the Java calling convention.
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // We have control over the convention for java so we can do what we please.
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // What pleases us is to offset the java calling convention so that when
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // we call a suitable jni method the arguments are lined up and we don't
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // have to do little shuffling. A suitable jni method is non-static and a
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // small number of arguments (two fewer args on windows)
a61af66fc99e Initial load
duke
parents:
diff changeset
97 //
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // |-------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // | c_rarg0 c_rarg1 c_rarg2 c_rarg3 c_rarg4 c_rarg5 |
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // |-------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // | rcx rdx r8 r9 rdi* rsi* | windows (* not a c_rarg)
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // | rdi rsi rdx rcx r8 r9 | solaris/linux
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // |-------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // | j_rarg5 j_rarg0 j_rarg1 j_rarg2 j_rarg3 j_rarg4 |
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // |-------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 REGISTER_DECLARATION(Register, j_rarg0, c_rarg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 REGISTER_DECLARATION(Register, j_rarg1, c_rarg2);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 REGISTER_DECLARATION(Register, j_rarg2, c_rarg3);
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Windows runs out of register args here
a61af66fc99e Initial load
duke
parents:
diff changeset
111 #ifdef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
112 REGISTER_DECLARATION(Register, j_rarg3, rdi);
a61af66fc99e Initial load
duke
parents:
diff changeset
113 REGISTER_DECLARATION(Register, j_rarg4, rsi);
a61af66fc99e Initial load
duke
parents:
diff changeset
114 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
115 REGISTER_DECLARATION(Register, j_rarg3, c_rarg4);
a61af66fc99e Initial load
duke
parents:
diff changeset
116 REGISTER_DECLARATION(Register, j_rarg4, c_rarg5);
a61af66fc99e Initial load
duke
parents:
diff changeset
117 #endif /* _WIN64 */
a61af66fc99e Initial load
duke
parents:
diff changeset
118 REGISTER_DECLARATION(Register, j_rarg5, c_rarg0);
a61af66fc99e Initial load
duke
parents:
diff changeset
119
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
120 REGISTER_DECLARATION(XMMRegister, j_farg0, xmm0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
121 REGISTER_DECLARATION(XMMRegister, j_farg1, xmm1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
122 REGISTER_DECLARATION(XMMRegister, j_farg2, xmm2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
123 REGISTER_DECLARATION(XMMRegister, j_farg3, xmm3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
124 REGISTER_DECLARATION(XMMRegister, j_farg4, xmm4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
125 REGISTER_DECLARATION(XMMRegister, j_farg5, xmm5);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
126 REGISTER_DECLARATION(XMMRegister, j_farg6, xmm6);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
127 REGISTER_DECLARATION(XMMRegister, j_farg7, xmm7);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 REGISTER_DECLARATION(Register, rscratch1, r10); // volatile
a61af66fc99e Initial load
duke
parents:
diff changeset
130 REGISTER_DECLARATION(Register, rscratch2, r11); // volatile
a61af66fc99e Initial load
duke
parents:
diff changeset
131
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
132 REGISTER_DECLARATION(Register, r12_heapbase, r12); // callee-saved
0
a61af66fc99e Initial load
duke
parents:
diff changeset
133 REGISTER_DECLARATION(Register, r15_thread, r15); // callee-saved
a61af66fc99e Initial load
duke
parents:
diff changeset
134
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
135 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
136 // rscratch1 will apear in 32bit code that is dead but of course must compile
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
137 // Using noreg ensures if the dead code is incorrectly live and executed it
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
138 // will cause an assertion failure
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
139 #define rscratch1 noreg
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
140 #define rscratch2 noreg
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
141
0
a61af66fc99e Initial load
duke
parents:
diff changeset
142 #endif // _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
143
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1503
diff changeset
144 // JSR 292 fixed register usages:
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1503
diff changeset
145 REGISTER_DECLARATION(Register, rbp_mh_SP_save, rbp);
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1503
diff changeset
146
0
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // Address is an abstraction used to represent a memory location
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // using any of the amd64 addressing modes with one object.
a61af66fc99e Initial load
duke
parents:
diff changeset
149 //
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // Note: A register location is represented via a Register, not
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // via an address for efficiency & simplicity reasons.
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 class ArrayAddress;
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 class Address VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
156 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
157 enum ScaleFactor {
a61af66fc99e Initial load
duke
parents:
diff changeset
158 no_scale = -1,
a61af66fc99e Initial load
duke
parents:
diff changeset
159 times_1 = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
160 times_2 = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
161 times_4 = 2,
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
162 times_8 = 3,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
163 times_ptr = LP64_ONLY(times_8) NOT_LP64(times_4)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
164 };
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
165 static ScaleFactor times(int size) {
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
166 assert(size >= 1 && size <= 8 && is_power_of_2(size), "bad scale size");
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
167 if (size == 8) return times_8;
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
168 if (size == 4) return times_4;
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
169 if (size == 2) return times_2;
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
170 return times_1;
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
171 }
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
172 static int scale_size(ScaleFactor scale) {
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
173 assert(scale != no_scale, "");
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
174 assert(((1 << (int)times_1) == 1 &&
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
175 (1 << (int)times_2) == 2 &&
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
176 (1 << (int)times_4) == 4 &&
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
177 (1 << (int)times_8) == 8), "");
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
178 return (1 << (int)scale);
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
179 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
182 Register _base;
a61af66fc99e Initial load
duke
parents:
diff changeset
183 Register _index;
a61af66fc99e Initial load
duke
parents:
diff changeset
184 ScaleFactor _scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
185 int _disp;
a61af66fc99e Initial load
duke
parents:
diff changeset
186 RelocationHolder _rspec;
a61af66fc99e Initial load
duke
parents:
diff changeset
187
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
188 // Easily misused constructors make them private
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
189 // %%% can we make these go away?
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
190 NOT_LP64(Address(address loc, RelocationHolder spec);)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
191 Address(int disp, address loc, relocInfo::relocType rtype);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
192 Address(int disp, address loc, RelocationHolder spec);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 public:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
195
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
196 int disp() { return _disp; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // creation
a61af66fc99e Initial load
duke
parents:
diff changeset
198 Address()
a61af66fc99e Initial load
duke
parents:
diff changeset
199 : _base(noreg),
a61af66fc99e Initial load
duke
parents:
diff changeset
200 _index(noreg),
a61af66fc99e Initial load
duke
parents:
diff changeset
201 _scale(no_scale),
a61af66fc99e Initial load
duke
parents:
diff changeset
202 _disp(0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // No default displacement otherwise Register can be implicitly
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // converted to 0(Register) which is quite a different animal.
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 Address(Register base, int disp)
a61af66fc99e Initial load
duke
parents:
diff changeset
209 : _base(base),
a61af66fc99e Initial load
duke
parents:
diff changeset
210 _index(noreg),
a61af66fc99e Initial load
duke
parents:
diff changeset
211 _scale(no_scale),
a61af66fc99e Initial load
duke
parents:
diff changeset
212 _disp(disp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 Address(Register base, Register index, ScaleFactor scale, int disp = 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
216 : _base (base),
a61af66fc99e Initial load
duke
parents:
diff changeset
217 _index(index),
a61af66fc99e Initial load
duke
parents:
diff changeset
218 _scale(scale),
a61af66fc99e Initial load
duke
parents:
diff changeset
219 _disp (disp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
220 assert(!index->is_valid() == (scale == Address::no_scale),
a61af66fc99e Initial load
duke
parents:
diff changeset
221 "inconsistent address");
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
224 Address(Register base, RegisterOrConstant index, ScaleFactor scale = times_1, int disp = 0)
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
225 : _base (base),
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
226 _index(index.register_or_noreg()),
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
227 _scale(scale),
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
228 _disp (disp + (index.constant_or_zero() * scale_size(scale))) {
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
229 if (!index.is_register()) scale = Address::no_scale;
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
230 assert(!_index->is_valid() == (scale == Address::no_scale),
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
231 "inconsistent address");
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
232 }
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
233
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
234 Address plus_disp(int disp) const {
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
235 Address a = (*this);
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
236 a._disp += disp;
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
237 return a;
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
238 }
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
239 Address plus_disp(RegisterOrConstant disp, ScaleFactor scale = times_1) const {
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
240 Address a = (*this);
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
241 a._disp += disp.constant_or_zero() * scale_size(scale);
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
242 if (disp.is_register()) {
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
243 assert(!a.index()->is_valid(), "competing indexes");
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
244 a._index = disp.as_register();
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
245 a._scale = scale;
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
246 }
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
247 return a;
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
248 }
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
249 bool is_same_address(Address a) const {
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
250 // disregard _rspec
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
251 return _base == a._base && _disp == a._disp && _index == a._index && _scale == a._scale;
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3336
diff changeset
252 }
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
253
0
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // The following two overloads are used in connection with the
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // ByteSize type (see sizes.hpp). They simplify the use of
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // ByteSize'd arguments in assembly code. Note that their equivalent
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // for the optimized build are the member functions with int disp
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // argument since ByteSize is mapped to an int type in that case.
a61af66fc99e Initial load
duke
parents:
diff changeset
259 //
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // Note: DO NOT introduce similar overloaded functions for WordSize
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // arguments as in the optimized mode, both ByteSize and WordSize
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // are mapped to the same type and thus the compiler cannot make a
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // distinction anymore (=> compiler errors).
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
266 Address(Register base, ByteSize disp)
a61af66fc99e Initial load
duke
parents:
diff changeset
267 : _base(base),
a61af66fc99e Initial load
duke
parents:
diff changeset
268 _index(noreg),
a61af66fc99e Initial load
duke
parents:
diff changeset
269 _scale(no_scale),
a61af66fc99e Initial load
duke
parents:
diff changeset
270 _disp(in_bytes(disp)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 Address(Register base, Register index, ScaleFactor scale, ByteSize disp)
a61af66fc99e Initial load
duke
parents:
diff changeset
274 : _base(base),
a61af66fc99e Initial load
duke
parents:
diff changeset
275 _index(index),
a61af66fc99e Initial load
duke
parents:
diff changeset
276 _scale(scale),
a61af66fc99e Initial load
duke
parents:
diff changeset
277 _disp(in_bytes(disp)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 assert(!index->is_valid() == (scale == Address::no_scale),
a61af66fc99e Initial load
duke
parents:
diff changeset
279 "inconsistent address");
a61af66fc99e Initial load
duke
parents:
diff changeset
280 }
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
281
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
282 Address(Register base, RegisterOrConstant index, ScaleFactor scale, ByteSize disp)
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
283 : _base (base),
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
284 _index(index.register_or_noreg()),
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
285 _scale(scale),
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
286 _disp (in_bytes(disp) + (index.constant_or_zero() * scale_size(scale))) {
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
287 if (!index.is_register()) scale = Address::no_scale;
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
288 assert(!_index->is_valid() == (scale == Address::no_scale),
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
289 "inconsistent address");
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
290 }
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
291
0
a61af66fc99e Initial load
duke
parents:
diff changeset
292 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // accessors
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 71
diff changeset
295 bool uses(Register reg) const { return _base == reg || _index == reg; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 71
diff changeset
296 Register base() const { return _base; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 71
diff changeset
297 Register index() const { return _index; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 71
diff changeset
298 ScaleFactor scale() const { return _scale; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 71
diff changeset
299 int disp() const { return _disp; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // Convert the raw encoding form into the form expected by the constructor for
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // Address. An index of 4 (rsp) corresponds to having no index, so convert
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // that to noreg for the Address constructor.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
304 static Address make_raw(int base, int index, int scale, int disp, relocInfo::relocType disp_reloc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 static Address make_array(ArrayAddress);
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
309 bool base_needs_rex() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 return _base != noreg && _base->encoding() >= 8;
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 bool index_needs_rex() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
314 return _index != noreg &&_index->encoding() >= 8;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317 relocInfo::relocType reloc() const { return _rspec.type(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 friend class Assembler;
a61af66fc99e Initial load
duke
parents:
diff changeset
320 friend class MacroAssembler;
a61af66fc99e Initial load
duke
parents:
diff changeset
321 friend class LIR_Assembler; // base/index/scale/disp
a61af66fc99e Initial load
duke
parents:
diff changeset
322 };
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 //
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // AddressLiteral has been split out from Address because operands of this type
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // need to be treated specially on 32bit vs. 64bit platforms. By splitting it out
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // the few instructions that need to deal with address literals are unique and the
a61af66fc99e Initial load
duke
parents:
diff changeset
328 // MacroAssembler does not have to implement every instruction in the Assembler
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // in order to search for address literals that may need special handling depending
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // on the instruction and the platform. As small step on the way to merging i486/amd64
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // directories.
a61af66fc99e Initial load
duke
parents:
diff changeset
332 //
a61af66fc99e Initial load
duke
parents:
diff changeset
333 class AddressLiteral VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 friend class ArrayAddress;
a61af66fc99e Initial load
duke
parents:
diff changeset
335 RelocationHolder _rspec;
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // Typically we use AddressLiterals we want to use their rval
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // However in some situations we want the lval (effect address) of the item.
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // We provide a special factory for making those lvals.
a61af66fc99e Initial load
duke
parents:
diff changeset
339 bool _is_lval;
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // If the target is far we'll need to load the ea of this to
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // a register to reach it. Otherwise if near we can do rip
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // relative addressing.
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 address _target;
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // creation
a61af66fc99e Initial load
duke
parents:
diff changeset
349 AddressLiteral()
a61af66fc99e Initial load
duke
parents:
diff changeset
350 : _is_lval(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
351 _target(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
352 {}
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 AddressLiteral(address target, relocInfo::relocType rtype);
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 AddressLiteral(address target, RelocationHolder const& rspec)
a61af66fc99e Initial load
duke
parents:
diff changeset
360 : _rspec(rspec),
a61af66fc99e Initial load
duke
parents:
diff changeset
361 _is_lval(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
362 _target(target)
a61af66fc99e Initial load
duke
parents:
diff changeset
363 {}
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365 AddressLiteral addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
366 AddressLiteral ret = *this;
a61af66fc99e Initial load
duke
parents:
diff changeset
367 ret._is_lval = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 address target() { return _target; }
a61af66fc99e Initial load
duke
parents:
diff changeset
375 bool is_lval() { return _is_lval; }
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 relocInfo::relocType reloc() const { return _rspec.type(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
378 const RelocationHolder& rspec() const { return _rspec; }
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 friend class Assembler;
a61af66fc99e Initial load
duke
parents:
diff changeset
381 friend class MacroAssembler;
a61af66fc99e Initial load
duke
parents:
diff changeset
382 friend class Address;
a61af66fc99e Initial load
duke
parents:
diff changeset
383 friend class LIR_Assembler;
a61af66fc99e Initial load
duke
parents:
diff changeset
384 };
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // Convience classes
a61af66fc99e Initial load
duke
parents:
diff changeset
387 class RuntimeAddress: public AddressLiteral {
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
390
a61af66fc99e Initial load
duke
parents:
diff changeset
391 RuntimeAddress(address target) : AddressLiteral(target, relocInfo::runtime_call_type) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 };
a61af66fc99e Initial load
duke
parents:
diff changeset
394
a61af66fc99e Initial load
duke
parents:
diff changeset
395 class ExternalAddress: public AddressLiteral {
2455
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2415
diff changeset
396 private:
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2415
diff changeset
397 static relocInfo::relocType reloc_for_target(address target) {
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2415
diff changeset
398 // Sometimes ExternalAddress is used for values which aren't
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2415
diff changeset
399 // exactly addresses, like the card table base.
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2415
diff changeset
400 // external_word_type can't be used for values in the first page
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2415
diff changeset
401 // so just skip the reloc in that case.
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2415
diff changeset
402 return external_word_Relocation::can_be_relocated(target) ? relocInfo::external_word_type : relocInfo::none;
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2415
diff changeset
403 }
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2415
diff changeset
404
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2415
diff changeset
405 public:
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2415
diff changeset
406
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2415
diff changeset
407 ExternalAddress(address target) : AddressLiteral(target, reloc_for_target(target)) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
408
a61af66fc99e Initial load
duke
parents:
diff changeset
409 };
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 class InternalAddress: public AddressLiteral {
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 InternalAddress(address target) : AddressLiteral(target, relocInfo::internal_word_type) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 };
a61af66fc99e Initial load
duke
parents:
diff changeset
418
a61af66fc99e Initial load
duke
parents:
diff changeset
419 // x86 can do array addressing as a single operation since disp can be an absolute
a61af66fc99e Initial load
duke
parents:
diff changeset
420 // address amd64 can't. We create a class that expresses the concept but does extra
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // magic on amd64 to get the final result
a61af66fc99e Initial load
duke
parents:
diff changeset
422
a61af66fc99e Initial load
duke
parents:
diff changeset
423 class ArrayAddress VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
424 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
425
a61af66fc99e Initial load
duke
parents:
diff changeset
426 AddressLiteral _base;
a61af66fc99e Initial load
duke
parents:
diff changeset
427 Address _index;
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 ArrayAddress() {};
a61af66fc99e Initial load
duke
parents:
diff changeset
432 ArrayAddress(AddressLiteral base, Address index): _base(base), _index(index) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
433 AddressLiteral base() { return _base; }
a61af66fc99e Initial load
duke
parents:
diff changeset
434 Address index() { return _index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436 };
a61af66fc99e Initial load
duke
parents:
diff changeset
437
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
438 const int FPUStateSizeInWords = NOT_LP64(27) LP64_ONLY( 512 / wordSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // The Intel x86/Amd64 Assembler: Pure assembler doing NO optimizations on the instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // level (e.g. mov rax, 0 is not translated into xor rax, rax!); i.e., what you write
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // is what you get. The Assembler is generating code into a CodeBuffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
443
a61af66fc99e Initial load
duke
parents:
diff changeset
444 class Assembler : public AbstractAssembler {
a61af66fc99e Initial load
duke
parents:
diff changeset
445 friend class AbstractAssembler; // for the non-virtual hack
a61af66fc99e Initial load
duke
parents:
diff changeset
446 friend class LIR_Assembler; // as_Address()
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
447 friend class StubGenerator;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
448
a61af66fc99e Initial load
duke
parents:
diff changeset
449 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
450 enum Condition { // The x86 condition codes used for conditional jumps/moves.
a61af66fc99e Initial load
duke
parents:
diff changeset
451 zero = 0x4,
a61af66fc99e Initial load
duke
parents:
diff changeset
452 notZero = 0x5,
a61af66fc99e Initial load
duke
parents:
diff changeset
453 equal = 0x4,
a61af66fc99e Initial load
duke
parents:
diff changeset
454 notEqual = 0x5,
a61af66fc99e Initial load
duke
parents:
diff changeset
455 less = 0xc,
a61af66fc99e Initial load
duke
parents:
diff changeset
456 lessEqual = 0xe,
a61af66fc99e Initial load
duke
parents:
diff changeset
457 greater = 0xf,
a61af66fc99e Initial load
duke
parents:
diff changeset
458 greaterEqual = 0xd,
a61af66fc99e Initial load
duke
parents:
diff changeset
459 below = 0x2,
a61af66fc99e Initial load
duke
parents:
diff changeset
460 belowEqual = 0x6,
a61af66fc99e Initial load
duke
parents:
diff changeset
461 above = 0x7,
a61af66fc99e Initial load
duke
parents:
diff changeset
462 aboveEqual = 0x3,
a61af66fc99e Initial load
duke
parents:
diff changeset
463 overflow = 0x0,
a61af66fc99e Initial load
duke
parents:
diff changeset
464 noOverflow = 0x1,
a61af66fc99e Initial load
duke
parents:
diff changeset
465 carrySet = 0x2,
a61af66fc99e Initial load
duke
parents:
diff changeset
466 carryClear = 0x3,
a61af66fc99e Initial load
duke
parents:
diff changeset
467 negative = 0x8,
a61af66fc99e Initial load
duke
parents:
diff changeset
468 positive = 0x9,
a61af66fc99e Initial load
duke
parents:
diff changeset
469 parity = 0xa,
a61af66fc99e Initial load
duke
parents:
diff changeset
470 noParity = 0xb
a61af66fc99e Initial load
duke
parents:
diff changeset
471 };
a61af66fc99e Initial load
duke
parents:
diff changeset
472
a61af66fc99e Initial load
duke
parents:
diff changeset
473 enum Prefix {
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // segment overrides
a61af66fc99e Initial load
duke
parents:
diff changeset
475 CS_segment = 0x2e,
a61af66fc99e Initial load
duke
parents:
diff changeset
476 SS_segment = 0x36,
a61af66fc99e Initial load
duke
parents:
diff changeset
477 DS_segment = 0x3e,
a61af66fc99e Initial load
duke
parents:
diff changeset
478 ES_segment = 0x26,
a61af66fc99e Initial load
duke
parents:
diff changeset
479 FS_segment = 0x64,
a61af66fc99e Initial load
duke
parents:
diff changeset
480 GS_segment = 0x65,
a61af66fc99e Initial load
duke
parents:
diff changeset
481
a61af66fc99e Initial load
duke
parents:
diff changeset
482 REX = 0x40,
a61af66fc99e Initial load
duke
parents:
diff changeset
483
a61af66fc99e Initial load
duke
parents:
diff changeset
484 REX_B = 0x41,
a61af66fc99e Initial load
duke
parents:
diff changeset
485 REX_X = 0x42,
a61af66fc99e Initial load
duke
parents:
diff changeset
486 REX_XB = 0x43,
a61af66fc99e Initial load
duke
parents:
diff changeset
487 REX_R = 0x44,
a61af66fc99e Initial load
duke
parents:
diff changeset
488 REX_RB = 0x45,
a61af66fc99e Initial load
duke
parents:
diff changeset
489 REX_RX = 0x46,
a61af66fc99e Initial load
duke
parents:
diff changeset
490 REX_RXB = 0x47,
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492 REX_W = 0x48,
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 REX_WB = 0x49,
a61af66fc99e Initial load
duke
parents:
diff changeset
495 REX_WX = 0x4A,
a61af66fc99e Initial load
duke
parents:
diff changeset
496 REX_WXB = 0x4B,
a61af66fc99e Initial load
duke
parents:
diff changeset
497 REX_WR = 0x4C,
a61af66fc99e Initial load
duke
parents:
diff changeset
498 REX_WRB = 0x4D,
a61af66fc99e Initial load
duke
parents:
diff changeset
499 REX_WRX = 0x4E,
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
500 REX_WRXB = 0x4F,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
501
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
502 VEX_3bytes = 0xC4,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
503 VEX_2bytes = 0xC5
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
504 };
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
505
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
506 enum VexPrefix {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
507 VEX_B = 0x20,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
508 VEX_X = 0x40,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
509 VEX_R = 0x80,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
510 VEX_W = 0x80
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
511 };
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
512
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
513 enum VexSimdPrefix {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
514 VEX_SIMD_NONE = 0x0,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
515 VEX_SIMD_66 = 0x1,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
516 VEX_SIMD_F3 = 0x2,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
517 VEX_SIMD_F2 = 0x3
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
518 };
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
519
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
520 enum VexOpcode {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
521 VEX_OPCODE_NONE = 0x0,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
522 VEX_OPCODE_0F = 0x1,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
523 VEX_OPCODE_0F_38 = 0x2,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
524 VEX_OPCODE_0F_3A = 0x3
0
a61af66fc99e Initial load
duke
parents:
diff changeset
525 };
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 enum WhichOperand {
a61af66fc99e Initial load
duke
parents:
diff changeset
528 // input to locate_operand, and format code for relocations
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
529 imm_operand = 0, // embedded 32-bit|64-bit immediate operand
0
a61af66fc99e Initial load
duke
parents:
diff changeset
530 disp32_operand = 1, // embedded 32-bit displacement or address
a61af66fc99e Initial load
duke
parents:
diff changeset
531 call32_operand = 2, // embedded 32-bit self-relative displacement
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
532 #ifndef _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
533 _WhichOperand_limit = 3
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
534 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
535 narrow_oop_operand = 3, // embedded 32-bit immediate narrow oop
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
536 _WhichOperand_limit = 4
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
537 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
538 };
a61af66fc99e Initial load
duke
parents:
diff changeset
539
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
540
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
541
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
542 // NOTE: The general philopsophy of the declarations here is that 64bit versions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
543 // of instructions are freely declared without the need for wrapping them an ifdef.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
544 // (Some dangerous instructions are ifdef's out of inappropriate jvm's.)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
545 // In the .cpp file the implementations are wrapped so that they are dropped out
7951
8b46b0196eb0 8000692: Remove old KERNEL code
zgu
parents: 7477
diff changeset
546 // of the resulting jvm. This is done mostly to keep the footprint of MINIMAL
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
547 // to the size it was prior to merging up the 32bit and 64bit assemblers.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
548 //
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
549 // This does mean you'll get a linker/runtime error if you use a 64bit only instruction
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
550 // in a 32bit vm. This is somewhat unfortunate but keeps the ifdef noise down.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
551
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
552 private:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
553
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
554
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
555 // 64bit prefixes
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
556 int prefix_and_encode(int reg_enc, bool byteinst = false);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
557 int prefixq_and_encode(int reg_enc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
558
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
559 int prefix_and_encode(int dst_enc, int src_enc, bool byteinst = false);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
560 int prefixq_and_encode(int dst_enc, int src_enc);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
561
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
562 void prefix(Register reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
563 void prefix(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
564 void prefixq(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
565
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
566 void prefix(Address adr, Register reg, bool byteinst = false);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
567 void prefix(Address adr, XMMRegister reg);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
568 void prefixq(Address adr, Register reg);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
569 void prefixq(Address adr, XMMRegister reg);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
570
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
571 void prefetch_prefix(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
572
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
573 void rex_prefix(Address adr, XMMRegister xreg,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
574 VexSimdPrefix pre, VexOpcode opc, bool rex_w);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
575 int rex_prefix_and_encode(int dst_enc, int src_enc,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
576 VexSimdPrefix pre, VexOpcode opc, bool rex_w);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
577
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
578 void vex_prefix(bool vex_r, bool vex_b, bool vex_x, bool vex_w,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
579 int nds_enc, VexSimdPrefix pre, VexOpcode opc,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
580 bool vector256);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
581
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
582 void vex_prefix(Address adr, int nds_enc, int xreg_enc,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
583 VexSimdPrefix pre, VexOpcode opc,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
584 bool vex_w, bool vector256);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
585
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
586 void vex_prefix(XMMRegister dst, XMMRegister nds, Address src,
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
587 VexSimdPrefix pre, bool vector256 = false) {
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
588 int dst_enc = dst->encoding();
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
589 int nds_enc = nds->is_valid() ? nds->encoding() : 0;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
590 vex_prefix(src, nds_enc, dst_enc, pre, VEX_OPCODE_0F, false, vector256);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
591 }
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
592
17729
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
593 void vex_prefix_0F38(Register dst, Register nds, Address src) {
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
594 bool vex_w = false;
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
595 bool vector256 = false;
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
596 vex_prefix(src, nds->encoding(), dst->encoding(),
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
597 VEX_SIMD_NONE, VEX_OPCODE_0F_38, vex_w, vector256);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
598 }
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
599
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
600 void vex_prefix_0F38_q(Register dst, Register nds, Address src) {
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
601 bool vex_w = true;
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
602 bool vector256 = false;
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
603 vex_prefix(src, nds->encoding(), dst->encoding(),
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
604 VEX_SIMD_NONE, VEX_OPCODE_0F_38, vex_w, vector256);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
605 }
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
606 int vex_prefix_and_encode(int dst_enc, int nds_enc, int src_enc,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
607 VexSimdPrefix pre, VexOpcode opc,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
608 bool vex_w, bool vector256);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
609
17729
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
610 int vex_prefix_0F38_and_encode(Register dst, Register nds, Register src) {
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
611 bool vex_w = false;
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
612 bool vector256 = false;
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
613 return vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(),
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
614 VEX_SIMD_NONE, VEX_OPCODE_0F_38, vex_w, vector256);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
615 }
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
616 int vex_prefix_0F38_and_encode_q(Register dst, Register nds, Register src) {
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
617 bool vex_w = true;
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
618 bool vector256 = false;
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
619 return vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(),
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
620 VEX_SIMD_NONE, VEX_OPCODE_0F_38, vex_w, vector256);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
621 }
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
622 int vex_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src,
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
623 VexSimdPrefix pre, bool vector256 = false,
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
624 VexOpcode opc = VEX_OPCODE_0F) {
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
625 int src_enc = src->encoding();
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
626 int dst_enc = dst->encoding();
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
627 int nds_enc = nds->is_valid() ? nds->encoding() : 0;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
628 return vex_prefix_and_encode(dst_enc, nds_enc, src_enc, pre, opc, false, vector256);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
629 }
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
630
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
631 void simd_prefix(XMMRegister xreg, XMMRegister nds, Address adr,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
632 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
633 bool rex_w = false, bool vector256 = false);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
634
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
635 void simd_prefix(XMMRegister dst, Address src,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
636 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
637 simd_prefix(dst, xnoreg, src, pre, opc);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
638 }
6614
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
639
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
640 void simd_prefix(Address dst, XMMRegister src, VexSimdPrefix pre) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
641 simd_prefix(src, dst, pre);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
642 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
643 void simd_prefix_q(XMMRegister dst, XMMRegister nds, Address src,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
644 VexSimdPrefix pre) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
645 bool rex_w = true;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
646 simd_prefix(dst, nds, src, pre, VEX_OPCODE_0F, rex_w);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
647 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
648
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
649 int simd_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
650 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
651 bool rex_w = false, bool vector256 = false);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
652
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
653 // Move/convert 32-bit integer value.
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
654 int simd_prefix_and_encode(XMMRegister dst, XMMRegister nds, Register src,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
655 VexSimdPrefix pre) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
656 // It is OK to cast from Register to XMMRegister to pass argument here
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
657 // since only encoding is used in simd_prefix_and_encode() and number of
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
658 // Gen and Xmm registers are the same.
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
659 return simd_prefix_and_encode(dst, nds, as_XMMRegister(src->encoding()), pre);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
660 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
661 int simd_prefix_and_encode(XMMRegister dst, Register src, VexSimdPrefix pre) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
662 return simd_prefix_and_encode(dst, xnoreg, src, pre);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
663 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
664 int simd_prefix_and_encode(Register dst, XMMRegister src,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
665 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
666 return simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, pre, opc);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
667 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
668
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
669 // Move/convert 64-bit integer value.
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
670 int simd_prefix_and_encode_q(XMMRegister dst, XMMRegister nds, Register src,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
671 VexSimdPrefix pre) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
672 bool rex_w = true;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
673 return simd_prefix_and_encode(dst, nds, as_XMMRegister(src->encoding()), pre, VEX_OPCODE_0F, rex_w);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
674 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
675 int simd_prefix_and_encode_q(XMMRegister dst, Register src, VexSimdPrefix pre) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
676 return simd_prefix_and_encode_q(dst, xnoreg, src, pre);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
677 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
678 int simd_prefix_and_encode_q(Register dst, XMMRegister src,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
679 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
680 bool rex_w = true;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
681 return simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, pre, opc, rex_w);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
682 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
683
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
684 // Helper functions for groups of instructions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
685 void emit_arith_b(int op1, int op2, Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
686
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
687 void emit_arith(int op1, int op2, Register dst, int32_t imm32);
4947
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4761
diff changeset
688 // Force generation of a 4 byte immediate value even if it fits into 8bit
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4761
diff changeset
689 void emit_arith_imm32(int op1, int op2, Register dst, int32_t imm32);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
690 void emit_arith(int op1, int op2, Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
691
6614
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
692 void emit_simd_arith(int opcode, XMMRegister dst, Address src, VexSimdPrefix pre);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
693 void emit_simd_arith(int opcode, XMMRegister dst, XMMRegister src, VexSimdPrefix pre);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
694 void emit_simd_arith_nonds(int opcode, XMMRegister dst, Address src, VexSimdPrefix pre);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
695 void emit_simd_arith_nonds(int opcode, XMMRegister dst, XMMRegister src, VexSimdPrefix pre);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
696 void emit_vex_arith(int opcode, XMMRegister dst, XMMRegister nds,
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
697 Address src, VexSimdPrefix pre, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
698 void emit_vex_arith(int opcode, XMMRegister dst, XMMRegister nds,
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
699 XMMRegister src, VexSimdPrefix pre, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
700
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
701 void emit_operand(Register reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
702 Register base, Register index, Address::ScaleFactor scale,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
703 int disp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
704 RelocationHolder const& rspec,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
705 int rip_relative_correction = 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
706
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
707 void emit_operand(Register reg, Address adr, int rip_relative_correction = 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
708
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
709 // operands that only take the original 32bit registers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
710 void emit_operand32(Register reg, Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
711
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
712 void emit_operand(XMMRegister reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
713 Register base, Register index, Address::ScaleFactor scale,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
714 int disp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
715 RelocationHolder const& rspec);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
716
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
717 void emit_operand(XMMRegister reg, Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
718
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
719 void emit_operand(MMXRegister reg, Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
720
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
721 // workaround gcc (3.2.1-7) bug
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
722 void emit_operand(Address adr, MMXRegister reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
723
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
724
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
725 // Immediate-to-memory forms
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
726 void emit_arith_operand(int op1, Register rm, Address adr, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
727
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
728 void emit_farith(int b1, int b2, int i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
729
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
730
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
731 protected:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
732 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
733 void check_relocation(RelocationHolder const& rspec, int format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
734 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
735
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
736 void emit_data(jint data, relocInfo::relocType rtype, int format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
737 void emit_data(jint data, RelocationHolder const& rspec, int format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
738 void emit_data64(jlong data, relocInfo::relocType rtype, int format = 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
739 void emit_data64(jlong data, RelocationHolder const& rspec, int format = 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
740
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
741 bool reachable(AddressLiteral adr) NOT_LP64({ return true;});
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
742
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
743 // These are all easily abused and hence protected
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
744
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
745 // 32BIT ONLY SECTION
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
746 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
747 // Make these disappear in 64bit mode since they would never be correct
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
748 void cmp_literal32(Register src1, int32_t imm32, RelocationHolder const& rspec); // 32BIT ONLY
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
749 void cmp_literal32(Address src1, int32_t imm32, RelocationHolder const& rspec); // 32BIT ONLY
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
750
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
751 void mov_literal32(Register dst, int32_t imm32, RelocationHolder const& rspec); // 32BIT ONLY
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
752 void mov_literal32(Address dst, int32_t imm32, RelocationHolder const& rspec); // 32BIT ONLY
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
753
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
754 void push_literal32(int32_t imm32, RelocationHolder const& rspec); // 32BIT ONLY
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
755 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
756 // 64BIT ONLY SECTION
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
757 void mov_literal64(Register dst, intptr_t imm64, RelocationHolder const& rspec); // 64BIT ONLY
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
758
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
759 void 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
760 void 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
761
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
762 void 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
763 void mov_narrow_oop(Address dst, int32_t imm32, RelocationHolder const& rspec);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
764 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
765
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
766 // These are unique in that we are ensured by the caller that the 32bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
767 // relative in these instructions will always be able to reach the potentially
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
768 // 64bit address described by entry. Since they can take a 64bit address they
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
769 // don't have the 32 suffix like the other instructions in this class.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
770
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
771 void call_literal(address entry, RelocationHolder const& rspec);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
772 void jmp_literal(address entry, RelocationHolder const& rspec);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
773
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
774 // Avoid using directly section
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
775 // Instructions in this section are actually usable by anyone without danger
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
776 // of failure but have performance issues that are addressed my enhanced
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
777 // instructions which will do the proper thing base on the particular cpu.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
778 // We protect them because we don't trust you...
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
779
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
780 // Don't use next inc() and dec() methods directly. INC & DEC instructions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
781 // could cause a partial flag stall since they don't set CF flag.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
782 // Use MacroAssembler::decrement() & MacroAssembler::increment() methods
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
783 // which call inc() & dec() or add() & sub() in accordance with
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
784 // the product flag UseIncDec value.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
785
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
786 void decl(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
787 void decl(Address dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
788 void decq(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
789 void decq(Address dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
790
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
791 void incl(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
792 void incl(Address dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
793 void incq(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
794 void incq(Address dst);
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 // New cpus require use of movsd and movss to avoid partial register stall
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
797 // 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
798 // The selection is done in MacroAssembler::movdbl() and movflt().
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
799
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
800 // Move Scalar Single-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
801 void movss(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
802 void movss(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
803 void movss(Address dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
804
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
805 // Move Scalar Double-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
806 void movsd(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
807 void movsd(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
808 void movsd(Address dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
809 void movlpd(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
810
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
811 // New cpus require use of movaps and movapd to avoid partial register stall
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
812 // when moving between registers.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
813 void movaps(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
814 void movapd(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
815
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
816 // End avoid using directly
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
817
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
818
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
819 // Instruction prefixes
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
820 void prefix(Prefix p);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
821
0
a61af66fc99e Initial load
duke
parents:
diff changeset
822 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
823
a61af66fc99e Initial load
duke
parents:
diff changeset
824 // Creation
a61af66fc99e Initial load
duke
parents:
diff changeset
825 Assembler(CodeBuffer* code) : AbstractAssembler(code) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
826
a61af66fc99e Initial load
duke
parents:
diff changeset
827 // Decoding
a61af66fc99e Initial load
duke
parents:
diff changeset
828 static address locate_operand(address inst, WhichOperand which);
a61af66fc99e Initial load
duke
parents:
diff changeset
829 static address locate_next_instruction(address inst);
a61af66fc99e Initial load
duke
parents:
diff changeset
830
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
831 // Utilities
2404
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2320
diff changeset
832 static bool is_polling_page_far() NOT_LP64({ return false;});
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2320
diff changeset
833
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
834 // Generic instructions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
835 // Does 32bit or 64bit as needed for the platform. In some sense these
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
836 // belong in macro assembler but there is no need for both varieties to exist
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 lea(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
839
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
840 void mov(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
841
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
842 void pusha();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
843 void popa();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
844
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
845 void pushf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
846 void popf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
847
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
848 void push(int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
849
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
850 void push(Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
851
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
852 void pop(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
853
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
854 // These are dummies to prevent surprise implicit conversions to Register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
855 void push(void* v);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
856 void pop(void* v);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
857
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
858 // These do register sized moves/scans
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
859 void rep_mov();
7474
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7204
diff changeset
860 void rep_stos();
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7204
diff changeset
861 void rep_stosb();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
862 void repne_scan();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
863 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
864 void repne_scanl();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
865 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
866
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
867 // Vanilla instructions in lexical order
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
868
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2008
diff changeset
869 void adcl(Address dst, int32_t imm32);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2008
diff changeset
870 void adcl(Address dst, Register src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
871 void adcl(Register dst, int32_t imm32);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
872 void adcl(Register dst, Address src);
a61af66fc99e Initial load
duke
parents:
diff changeset
873 void adcl(Register dst, Register src);
a61af66fc99e Initial load
duke
parents:
diff changeset
874
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
875 void adcq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
876 void adcq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
877 void adcq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
878
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
879 void addl(Address dst, int32_t imm32);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
880 void addl(Address dst, Register src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
881 void addl(Register dst, int32_t imm32);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
882 void addl(Register dst, Address src);
a61af66fc99e Initial load
duke
parents:
diff changeset
883 void addl(Register dst, Register src);
a61af66fc99e Initial load
duke
parents:
diff changeset
884
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
885 void addq(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
886 void addq(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
887 void addq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
888 void addq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
889 void addq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
890
0
a61af66fc99e Initial load
duke
parents:
diff changeset
891 void addr_nop_4();
a61af66fc99e Initial load
duke
parents:
diff changeset
892 void addr_nop_5();
a61af66fc99e Initial load
duke
parents:
diff changeset
893 void addr_nop_7();
a61af66fc99e Initial load
duke
parents:
diff changeset
894 void addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
895
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
896 // Add Scalar Double-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
897 void addsd(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
898 void addsd(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
899
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
900 // Add Scalar Single-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
901 void addss(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
902 void addss(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
903
6894
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
904 // AES instructions
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
905 void aesdec(XMMRegister dst, Address src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
906 void aesdec(XMMRegister dst, XMMRegister src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
907 void aesdeclast(XMMRegister dst, Address src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
908 void aesdeclast(XMMRegister dst, XMMRegister src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
909 void aesenc(XMMRegister dst, Address src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
910 void aesenc(XMMRegister dst, XMMRegister src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
911 void aesenclast(XMMRegister dst, Address src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
912 void aesenclast(XMMRegister dst, XMMRegister src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
913
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
914
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
915 void andl(Address dst, int32_t imm32);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
916 void andl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
917 void andl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
918 void andl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
919
3783
de6a837d75cf 7056380: VM crashes with SIGSEGV in compiled code
never
parents: 3755
diff changeset
920 void andq(Address dst, int32_t imm32);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
921 void andq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
922 void andq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
923 void andq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
924
17729
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
925 // BMI instructions
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
926 void andnl(Register dst, Register src1, Register src2);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
927 void andnl(Register dst, Register src1, Address src2);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
928 void andnq(Register dst, Register src1, Register src2);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
929 void andnq(Register dst, Register src1, Address src2);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
930
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
931 void blsil(Register dst, Register src);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
932 void blsil(Register dst, Address src);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
933 void blsiq(Register dst, Register src);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
934 void blsiq(Register dst, Address src);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
935
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
936 void blsmskl(Register dst, Register src);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
937 void blsmskl(Register dst, Address src);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
938 void blsmskq(Register dst, Register src);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
939 void blsmskq(Register dst, Address src);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
940
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
941 void blsrl(Register dst, Register src);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
942 void blsrl(Register dst, Address src);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
943 void blsrq(Register dst, Register src);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
944 void blsrq(Register dst, Address src);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
945
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
946 void bsfl(Register dst, Register src);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
947 void bsrl(Register dst, Register src);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
948
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
949 #ifdef _LP64
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
950 void bsfq(Register dst, Register src);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
951 void bsrq(Register dst, Register src);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
952 #endif
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
953
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
954 void bswapl(Register reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
955
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
956 void bswapq(Register reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
957
0
a61af66fc99e Initial load
duke
parents:
diff changeset
958 void call(Label& L, relocInfo::relocType rtype);
a61af66fc99e Initial load
duke
parents:
diff changeset
959 void call(Register reg); // push pc; pc <- reg
a61af66fc99e Initial load
duke
parents:
diff changeset
960 void call(Address adr); // push pc; pc <- adr
a61af66fc99e Initial load
duke
parents:
diff changeset
961
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
962 void cdql();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
963
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
964 void cdqq();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
965
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
966 void cld();
304
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 void clflush(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
969
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
970 void cmovl(Condition cc, Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
971 void cmovl(Condition cc, Register dst, Address 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 void cmovq(Condition cc, Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
974 void cmovq(Condition cc, Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
975
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
976
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
977 void cmpb(Address dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
978
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
979 void cmpl(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
980
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
981 void cmpl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
982 void cmpl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
983 void cmpl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
984
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
985 void cmpq(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
986 void cmpq(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
987
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
988 void cmpq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
989 void cmpq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
990 void cmpq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
991
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
992 // these are dummies used to catch attempting to convert NULL to Register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
993 void cmpl(Register dst, void* junk); // dummy
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
994 void cmpq(Register dst, void* junk); // dummy
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
995
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
996 void cmpw(Address dst, int imm16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
997
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
998 void cmpxchg8 (Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
999
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1000 void cmpxchgl(Register reg, Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1001
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1002 void cmpxchgq(Register reg, Address adr);
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 // Ordered Compare Scalar Double-Precision Floating-Point Values and set EFLAGS
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1005 void comisd(XMMRegister dst, Address src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1006 void comisd(XMMRegister dst, XMMRegister src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1007
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1008 // Ordered Compare Scalar Single-Precision Floating-Point Values and set EFLAGS
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1009 void comiss(XMMRegister dst, Address src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1010 void comiss(XMMRegister dst, XMMRegister src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1011
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1012 // Identify processor type and features
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
1013 void cpuid();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1014
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1015 // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1016 void cvtsd2ss(XMMRegister dst, XMMRegister src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1017 void cvtsd2ss(XMMRegister dst, Address src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1018
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1019 // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1020 void cvtsi2sdl(XMMRegister dst, Register src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1021 void cvtsi2sdl(XMMRegister dst, Address src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1022 void cvtsi2sdq(XMMRegister dst, Register src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1023 void cvtsi2sdq(XMMRegister dst, Address src);
304
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 // Convert Doubleword Integer to Scalar Single-Precision Floating-Point Value
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1026 void cvtsi2ssl(XMMRegister dst, Register src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1027 void cvtsi2ssl(XMMRegister dst, Address src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1028 void cvtsi2ssq(XMMRegister dst, Register src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1029 void cvtsi2ssq(XMMRegister dst, Address src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1030
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1031 // Convert Packed Signed Doubleword Integers to Packed Double-Precision Floating-Point Value
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1032 void cvtdq2pd(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1033
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1034 // Convert Packed Signed Doubleword Integers to Packed Single-Precision Floating-Point Value
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1035 void cvtdq2ps(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1036
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1037 // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1038 void cvtss2sd(XMMRegister dst, XMMRegister src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1039 void cvtss2sd(XMMRegister dst, Address src);
304
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 // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1042 void cvttsd2sil(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1043 void cvttsd2sil(Register dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1044 void cvttsd2siq(Register dst, XMMRegister src);
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 // Convert with Truncation Scalar Single-Precision Floating-Point Value to Doubleword Integer
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1047 void cvttss2sil(Register dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1048 void cvttss2siq(Register dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1049
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1050 // Divide Scalar Double-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1051 void divsd(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1052 void divsd(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1053
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1054 // Divide Scalar Single-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1055 void divss(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1056 void divss(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1057
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1058 void emms();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1059
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1060 void fabs();
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 void fadd(int i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1063
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1064 void fadd_d(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1065 void fadd_s(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1066
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1067 // "Alternate" versions of x87 instructions place result down in FPU
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1068 // stack instead of on TOS
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 fadda(int i); // "alternate" fadd
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1071 void faddp(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1072
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1073 void fchs();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1074
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1075 void fcom(int i);
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 void fcomp(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1078 void fcomp_d(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1079 void fcomp_s(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1080
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1081 void fcompp();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1082
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1083 void fcos();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1084
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1085 void fdecstp();
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 fdiv(int i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1088 void fdiv_d(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1089 void fdivr_s(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1090 void fdiva(int i); // "alternate" fdiv
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1091 void fdivp(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1092
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1093 void fdivr(int i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1094 void fdivr_d(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1095 void fdiv_s(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1096
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1097 void fdivra(int i); // "alternate" reversed fdiv
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1098
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1099 void fdivrp(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1100
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1101 void ffree(int i = 0);
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 fild_d(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1104 void fild_s(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1105
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1106 void fincstp();
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 finit();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1109
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1110 void fist_s (Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1111 void fistp_d(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1112 void fistp_s(Address adr);
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 fld1();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1115
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1116 void fld_d(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1117 void fld_s(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1118 void fld_s(int index);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1119 void fld_x(Address adr); // extended-precision (80-bit) format
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 fldcw(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1122
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1123 void fldenv(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1124
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1125 void fldlg2();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1126
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1127 void fldln2();
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 void fldz();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1130
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1131 void flog();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1132 void flog10();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1133
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1134 void fmul(int i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1135
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1136 void fmul_d(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1137 void fmul_s(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1138
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1139 void fmula(int i); // "alternate" fmul
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1140
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1141 void fmulp(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1142
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1143 void fnsave(Address dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1144
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1145 void fnstcw(Address src);
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 void fnstsw_ax();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1148
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1149 void fprem();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1150 void fprem1();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1151
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1152 void frstor(Address src);
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 void fsin();
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 fsqrt();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1157
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1158 void fst_d(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1159 void fst_s(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1160
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1161 void fstp_d(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1162 void fstp_d(int index);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1163 void fstp_s(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1164 void fstp_x(Address adr); // extended-precision (80-bit) format
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1165
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1166 void fsub(int i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1167 void fsub_d(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1168 void fsub_s(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1169
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1170 void fsuba(int i); // "alternate" fsub
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1171
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1172 void fsubp(int i = 1);
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 fsubr(int i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1175 void fsubr_d(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1176 void fsubr_s(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1177
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1178 void fsubra(int i); // "alternate" reversed fsub
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1179
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1180 void fsubrp(int i = 1);
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 void ftan();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1183
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1184 void ftst();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1185
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1186 void fucomi(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1187 void fucomip(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1188
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1189 void fwait();
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 fxch(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1192
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1193 void fxrstor(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1194
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1195 void fxsave(Address dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1196
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1197 void fyl2x();
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4947
diff changeset
1198 void frndint();
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4947
diff changeset
1199 void f2xm1();
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4947
diff changeset
1200 void fldl2e();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1201
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1202 void hlt();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1203
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1204 void idivl(Register src);
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1846
diff changeset
1205 void divl(Register src); // Unsigned division
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1206
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1207 void idivq(Register src);
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 imull(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1210 void imull(Register dst, Register src, int value);
12972
59e8ad757e19 8026844: Various Math functions needs intrinsification
rbackman
parents: 11080
diff changeset
1211 void imull(Register dst, Address src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1212
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1213 void imulq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1214 void imulq(Register dst, Register src, int value);
12972
59e8ad757e19 8026844: Various Math functions needs intrinsification
rbackman
parents: 11080
diff changeset
1215 #ifdef _LP64
59e8ad757e19 8026844: Various Math functions needs intrinsification
rbackman
parents: 11080
diff changeset
1216 void imulq(Register dst, Address src);
59e8ad757e19 8026844: Various Math functions needs intrinsification
rbackman
parents: 11080
diff changeset
1217 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1218
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1219
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 // jcc is the generic conditional branch generator to run-
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 // time routines, jcc is used for branches to labels. jcc
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 // takes a branch opcode (cc) and a label (L) and generates
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 // either a backward branch or a forward branch and links it
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 // to the label fixup chain. Usage:
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 // Label L; // unbound label
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 // jcc(cc, L); // forward branch to unbound label
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 // bind(L); // bind label to the current pc
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 // jcc(cc, L); // backward branch to bound label
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 // bind(L); // illegal: a label may be bound only once
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 // Note: The same Label can be used for forward and backward branches
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 // but it may be bound only once.
a61af66fc99e Initial load
duke
parents:
diff changeset
1234
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3783
diff changeset
1235 void jcc(Condition cc, Label& L, bool maybe_short = true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1236
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 // Conditional jump to a 8-bit offset to L.
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 // WARNING: be very careful using this for forward jumps. If the label is
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 // not bound within an 8-bit offset of this instruction, a run-time error
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 // will occur.
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 void jccb(Condition cc, Label& L);
a61af66fc99e Initial load
duke
parents:
diff changeset
1242
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1243 void jmp(Address entry); // pc <- entry
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 // Label operations & relative jumps (PPUM Appendix D)
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3783
diff changeset
1246 void jmp(Label& L, bool maybe_short = true); // unconditional jump to L
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1247
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1248 void jmp(Register entry); // pc <- entry
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1249
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1250 // Unconditional 8-bit offset jump to L.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1251 // WARNING: be very careful using this for forward jumps. If the label is
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1252 // not bound within an 8-bit offset of this instruction, a run-time error
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1253 // will occur.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1254 void jmpb(Label& L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1255
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1256 void ldmxcsr( Address src );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1257
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1258 void leal(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1259
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1260 void leaq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1261
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
1262 void lfence();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1263
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1264 void lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1265
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1266 void lzcntl(Register dst, Register src);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1267
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1268 #ifdef _LP64
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1269 void lzcntq(Register dst, Register src);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1270 #endif
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1271
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1272 enum Membar_mask_bits {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1273 StoreStore = 1 << 3,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1274 LoadStore = 1 << 2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1275 StoreLoad = 1 << 1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1276 LoadLoad = 1 << 0
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1277 };
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1278
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1279 // Serializes memory and blows flags
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1280 void membar(Membar_mask_bits order_constraint) {
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1281 if (os::is_MP()) {
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1282 // We only have to handle StoreLoad
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1283 if (order_constraint & StoreLoad) {
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1284 // All usable chips support "locked" instructions which suffice
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1285 // as barriers, and are much faster than the alternative of
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1286 // using cpuid instruction. We use here a locked add [esp],0.
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1287 // This is conveniently otherwise a no-op except for blowing
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1288 // flags.
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1289 // Any change to this code may need to revisit other places in
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1290 // the code where this idiom is used, in particular the
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1291 // orderAccess code.
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1292 lock();
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1293 addl(Address(rsp, 0), 0);// Assert the lock# signal here
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1294 }
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1295 }
304
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1298 void mfence();
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 // Moves
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1301
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1302 void mov64(Register dst, int64_t imm64);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1303
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1304 void movb(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1305 void movb(Address dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1306 void movb(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1307
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1308 void movdl(XMMRegister dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1309 void movdl(Register dst, XMMRegister src);
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1310 void movdl(XMMRegister dst, Address src);
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1311 void movdl(Address dst, XMMRegister src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1312
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1313 // Move Double Quadword
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1314 void movdq(XMMRegister dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1315 void movdq(Register dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1316
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1317 // Move Aligned Double Quadword
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1318 void movdqa(XMMRegister dst, XMMRegister src);
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1319 void movdqa(XMMRegister dst, Address src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1320
405
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1321 // Move Unaligned Double Quadword
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1322 void movdqu(Address dst, XMMRegister src);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1323 void movdqu(XMMRegister dst, Address src);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1324 void movdqu(XMMRegister dst, XMMRegister src);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1325
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1326 // Move Unaligned 256bit Vector
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1327 void vmovdqu(Address dst, XMMRegister src);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1328 void vmovdqu(XMMRegister dst, Address src);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1329 void vmovdqu(XMMRegister dst, XMMRegister src);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1330
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1331 // Move lower 64bit to high 64bit in 128bit register
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1332 void movlhps(XMMRegister dst, XMMRegister src);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1333
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1334 void movl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1335 void movl(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1336 void movl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1337 void movl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1338 void movl(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1339
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1340 // These dummies prevent using movl from converting a zero (like NULL) into Register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1341 // by giving the compiler two choices it can't resolve
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1342
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1343 void movl(Address dst, void* junk);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1344 void movl(Register dst, void* junk);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1345
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1346 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1347 void movq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1348 void movq(Register dst, Address src);
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2008
diff changeset
1349 void movq(Address dst, Register src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1350 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1351
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1352 void movq(Address dst, MMXRegister src );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1353 void movq(MMXRegister dst, Address src );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1354
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1355 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1356 // These dummies prevent using movq from converting a zero (like NULL) into Register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1357 // by giving the compiler two choices it can't resolve
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1358
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1359 void movq(Address dst, void* dummy);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1360 void movq(Register dst, void* dummy);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1361 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1362
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1363 // Move Quadword
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1364 void movq(Address dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1365 void movq(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1366
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1367 void movsbl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1368 void movsbl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1369
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1370 #ifdef _LP64
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1371 void movsbq(Register dst, Address src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1372 void movsbq(Register dst, Register src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1373
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1374 // Move signed 32bit immediate to 64bit extending sign
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2008
diff changeset
1375 void movslq(Address dst, int32_t imm64);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1376 void movslq(Register dst, int32_t imm64);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1377
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1378 void movslq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1379 void movslq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1380 void movslq(Register dst, void* src); // Dummy declaration to cause NULL to be ambiguous
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1381 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1382
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1383 void movswl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1384 void movswl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1385
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1386 #ifdef _LP64
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1387 void movswq(Register dst, Address src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1388 void movswq(Register dst, Register src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1389 #endif
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1390
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1391 void movw(Address dst, int imm16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1392 void movw(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1393 void movw(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1394
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1395 void movzbl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1396 void movzbl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1397
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1398 #ifdef _LP64
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1399 void movzbq(Register dst, Address src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1400 void movzbq(Register dst, Register src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1401 #endif
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1402
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1403 void movzwl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1404 void movzwl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1405
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1406 #ifdef _LP64
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1407 void movzwq(Register dst, Address src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1408 void movzwq(Register dst, Register src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1409 #endif
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1410
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1411 void mull(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1412 void mull(Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1413
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1414 // Multiply Scalar Double-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1415 void mulsd(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1416 void mulsd(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1417
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1418 // Multiply Scalar Single-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1419 void mulss(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1420 void mulss(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1421
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1422 void negl(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1423
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1424 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1425 void negq(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1426 #endif
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 nop(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1429
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1430 void notl(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1431
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1432 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1433 void notq(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1434 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1435
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1436 void orl(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1437 void orl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1438 void orl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1439 void orl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1440
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1441 void orq(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1442 void orq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1443 void orq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1444 void orq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1445
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1446 // Pack with unsigned saturation
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1447 void packuswb(XMMRegister dst, XMMRegister src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1448 void packuswb(XMMRegister dst, Address src);
7637
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
1449 void vpackuswb(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
1450
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
1451 // Pemutation of 64bit words
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
1452 void vpermq(XMMRegister dst, XMMRegister src, int imm8, bool vector256);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1453
17780
606acabe7b5c 8031320: Use Intel RTM instructions for locks
kvn
parents: 17729
diff changeset
1454 void pause();
606acabe7b5c 8031320: Use Intel RTM instructions for locks
kvn
parents: 17729
diff changeset
1455
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
1456 // SSE4.2 string instructions
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
1457 void pcmpestri(XMMRegister xmm1, XMMRegister xmm2, int imm8);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
1458 void pcmpestri(XMMRegister xmm1, Address src, int imm8);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
1459
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1460 // SSE 4.1 extract
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1461 void pextrd(Register dst, XMMRegister src, int imm8);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1462 void pextrq(Register dst, XMMRegister src, int imm8);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1463
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1464 // SSE 4.1 insert
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1465 void pinsrd(XMMRegister dst, Register src, int imm8);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1466 void pinsrq(XMMRegister dst, Register src, int imm8);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1467
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1468 // SSE4.1 packed move
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1469 void pmovzxbw(XMMRegister dst, XMMRegister src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1470 void pmovzxbw(XMMRegister dst, Address src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1471
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 986
diff changeset
1472 #ifndef _LP64 // no 32bit push/pop on amd64
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1473 void popl(Address dst);
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 986
diff changeset
1474 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1475
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1476 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1477 void popq(Address dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1478 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1479
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1480 void popcntl(Register dst, Address src);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1481 void popcntl(Register dst, Register src);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1482
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1483 #ifdef _LP64
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1484 void popcntq(Register dst, Address src);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1485 void popcntq(Register dst, Register src);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1486 #endif
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1487
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1488 // Prefetches (SSE, SSE2, 3DNOW only)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1489
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1490 void prefetchnta(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1491 void prefetchr(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1492 void prefetcht0(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1493 void prefetcht1(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1494 void prefetcht2(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1495 void prefetchw(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1496
6894
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
1497 // Shuffle Bytes
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
1498 void pshufb(XMMRegister dst, XMMRegister src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
1499 void pshufb(XMMRegister dst, Address src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
1500
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1501 // Shuffle Packed Doublewords
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1502 void pshufd(XMMRegister dst, XMMRegister src, int mode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1503 void pshufd(XMMRegister dst, Address src, int mode);
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 // Shuffle Packed Low Words
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1506 void pshuflw(XMMRegister dst, XMMRegister src, int mode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1507 void pshuflw(XMMRegister dst, Address src, int mode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1508
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1509 // Shift Right by bytes Logical DoubleQuadword Immediate
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1510 void psrldq(XMMRegister dst, int shift);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1511
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7475
diff changeset
1512 // Logical Compare 128bit
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
1513 void ptest(XMMRegister dst, XMMRegister src);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
1514 void ptest(XMMRegister dst, Address src);
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7475
diff changeset
1515 // Logical Compare 256bit
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7475
diff changeset
1516 void vptest(XMMRegister dst, XMMRegister src);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7475
diff changeset
1517 void vptest(XMMRegister dst, Address src);
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
1518
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1519 // Interleave Low Bytes
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1520 void punpcklbw(XMMRegister dst, XMMRegister src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1521 void punpcklbw(XMMRegister dst, Address src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1522
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1523 // Interleave Low Doublewords
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1524 void punpckldq(XMMRegister dst, XMMRegister src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1525 void punpckldq(XMMRegister dst, Address src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1526
6225
2c368ea3e844 7181494: cleanup avx and vectors code
kvn
parents: 6179
diff changeset
1527 // Interleave Low Quadwords
2c368ea3e844 7181494: cleanup avx and vectors code
kvn
parents: 6179
diff changeset
1528 void punpcklqdq(XMMRegister dst, XMMRegister src);
2c368ea3e844 7181494: cleanup avx and vectors code
kvn
parents: 6179
diff changeset
1529
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 986
diff changeset
1530 #ifndef _LP64 // no 32bit push/pop on amd64
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1531 void pushl(Address src);
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 986
diff changeset
1532 #endif
304
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 pushq(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1535
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1536 void rcll(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1537
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1538 void rclq(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1539
17780
606acabe7b5c 8031320: Use Intel RTM instructions for locks
kvn
parents: 17729
diff changeset
1540 void rdtsc();
606acabe7b5c 8031320: Use Intel RTM instructions for locks
kvn
parents: 17729
diff changeset
1541
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1542 void ret(int imm16);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1543
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 void sahf();
a61af66fc99e Initial load
duke
parents:
diff changeset
1545
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1546 void sarl(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1547 void sarl(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1548
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1549 void sarq(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1550 void sarq(Register dst);
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 void sbbl(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1553 void sbbl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1554 void sbbl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1555 void sbbl(Register dst, Register src);
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 sbbq(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1558 void sbbq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1559 void sbbq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1560 void sbbq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1561
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1562 void setb(Condition cc, Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1563
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1564 void shldl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1565
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1566 void shll(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1567 void shll(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1568
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1569 void shlq(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1570 void shlq(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1571
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1572 void shrdl(Register dst, Register src);
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 void shrl(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1575 void shrl(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1576
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1577 void shrq(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1578 void shrq(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1579
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1580 void smovl(); // QQQ generic?
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 // Compute Square Root of Scalar Double-Precision Floating-Point Value
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1583 void sqrtsd(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1584 void sqrtsd(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1585
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 2002
diff changeset
1586 // Compute Square Root of Scalar Single-Precision Floating-Point Value
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 2002
diff changeset
1587 void sqrtss(XMMRegister dst, Address src);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 2002
diff changeset
1588 void sqrtss(XMMRegister dst, XMMRegister src);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 2002
diff changeset
1589
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
1590 void std();
304
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 stmxcsr( Address dst );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1593
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1594 void subl(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1595 void subl(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1596 void subl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1597 void subl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1598 void subl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1599
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1600 void subq(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1601 void subq(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1602 void subq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1603 void subq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1604 void subq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1605
4947
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4761
diff changeset
1606 // Force generation of a 4 byte immediate value even if it fits into 8bit
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4761
diff changeset
1607 void subl_imm32(Register dst, int32_t imm32);
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4761
diff changeset
1608 void subq_imm32(Register dst, int32_t imm32);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1609
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1610 // Subtract Scalar Double-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1611 void subsd(XMMRegister dst, Address src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 void subsd(XMMRegister dst, XMMRegister src);
a61af66fc99e Initial load
duke
parents:
diff changeset
1613
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1614 // Subtract Scalar Single-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1615 void subss(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1616 void subss(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1617
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1618 void testb(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1619
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1620 void testl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1621 void testl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1622 void testl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1623
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1624 void testq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1625 void testq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1626
17729
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
1627 // BMI - count trailing zeros
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
1628 void tzcntl(Register dst, Register src);
8a8ff6b577ed 8031321: Support Intel bit manipulation instructions
iveresov
parents: 12972
diff changeset
1629 void tzcntq(Register dst, Register src);
304
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 // Unordered Compare Scalar Double-Precision Floating-Point Values and set EFLAGS
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1632 void ucomisd(XMMRegister dst, Address src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 void ucomisd(XMMRegister dst, XMMRegister src);
a61af66fc99e Initial load
duke
parents:
diff changeset
1634
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1635 // Unordered Compare Scalar Single-Precision Floating-Point Values and set EFLAGS
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1636 void ucomiss(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1637 void ucomiss(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1638
17780
606acabe7b5c 8031320: Use Intel RTM instructions for locks
kvn
parents: 17729
diff changeset
1639 void xabort(int8_t imm8);
606acabe7b5c 8031320: Use Intel RTM instructions for locks
kvn
parents: 17729
diff changeset
1640
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1641 void xaddl(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1642
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1643 void xaddq(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1644
17780
606acabe7b5c 8031320: Use Intel RTM instructions for locks
kvn
parents: 17729
diff changeset
1645 void xbegin(Label& abort, relocInfo::relocType rtype = relocInfo::none);
606acabe7b5c 8031320: Use Intel RTM instructions for locks
kvn
parents: 17729
diff changeset
1646
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1647 void xchgl(Register reg, Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1648 void xchgl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1649
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1650 void xchgq(Register reg, Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1651 void xchgq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1652
17780
606acabe7b5c 8031320: Use Intel RTM instructions for locks
kvn
parents: 17729
diff changeset
1653 void xend();
606acabe7b5c 8031320: Use Intel RTM instructions for locks
kvn
parents: 17729
diff changeset
1654
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1655 // Get Value of Extended Control Register
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
1656 void xgetbv();
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1657
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1658 void xorl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1659 void xorl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1660 void xorl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1661
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1662 void xorq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1663 void xorq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1664
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1665 void set_byte_if_not_zero(Register dst); // sets reg to 1 if not zero, otherwise 0
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1666
6225
2c368ea3e844 7181494: cleanup avx and vectors code
kvn
parents: 6179
diff changeset
1667 // AVX 3-operands scalar instructions (encoded with VEX prefix)
6614
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1668
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1669 void vaddsd(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1670 void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1671 void vaddss(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1672 void vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1673 void vdivsd(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1674 void vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1675 void vdivss(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1676 void vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1677 void vmulsd(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1678 void vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1679 void vmulss(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1680 void vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1681 void vsubsd(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1682 void vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1683 void vsubss(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1684 void vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1685
6614
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1686
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1687 //====================VECTOR ARITHMETIC=====================================
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1688
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1689 // Add Packed Floating-Point Values
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1690 void addpd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1691 void addps(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1692 void vaddpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1693 void vaddps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1694 void vaddpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1695 void vaddps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1696
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1697 // Subtract Packed Floating-Point Values
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1698 void subpd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1699 void subps(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1700 void vsubpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1701 void vsubps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1702 void vsubpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1703 void vsubps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1704
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1705 // Multiply Packed Floating-Point Values
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1706 void mulpd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1707 void mulps(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1708 void vmulpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1709 void vmulps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1710 void vmulpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1711 void vmulps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1712
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1713 // Divide Packed Floating-Point Values
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1714 void divpd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1715 void divps(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1716 void vdivpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1717 void vdivps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1718 void vdivpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1719 void vdivps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1720
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1721 // Bitwise Logical AND of Packed Floating-Point Values
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1722 void andpd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1723 void andps(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1724 void vandpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1725 void vandps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1726 void vandpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1727 void vandps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1728
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1729 // Bitwise Logical XOR of Packed Floating-Point Values
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1730 void xorpd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1731 void xorps(XMMRegister dst, XMMRegister src);
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1732 void vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1733 void vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
6614
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1734 void vxorpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1735 void vxorps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1736
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1737 // Add packed integers
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1738 void paddb(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1739 void paddw(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1740 void paddd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1741 void paddq(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1742 void vpaddb(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1743 void vpaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1744 void vpaddd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1745 void vpaddq(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1746 void vpaddb(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1747 void vpaddw(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1748 void vpaddd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1749 void vpaddq(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1750
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1751 // Sub packed integers
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1752 void psubb(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1753 void psubw(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1754 void psubd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1755 void psubq(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1756 void vpsubb(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1757 void vpsubw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1758 void vpsubd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1759 void vpsubq(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1760 void vpsubb(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1761 void vpsubw(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1762 void vpsubd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1763 void vpsubq(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1764
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1765 // Multiply packed integers (only shorts and ints)
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1766 void pmullw(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1767 void pmulld(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1768 void vpmullw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1769 void vpmulld(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1770 void vpmullw(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1771 void vpmulld(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1772
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1773 // Shift left packed integers
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1774 void psllw(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1775 void pslld(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1776 void psllq(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1777 void psllw(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1778 void pslld(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1779 void psllq(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1780 void vpsllw(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1781 void vpslld(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1782 void vpsllq(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1783 void vpsllw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1784 void vpslld(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1785 void vpsllq(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1786
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1787 // Logical shift right packed integers
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1788 void psrlw(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1789 void psrld(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1790 void psrlq(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1791 void psrlw(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1792 void psrld(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1793 void psrlq(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1794 void vpsrlw(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1795 void vpsrld(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1796 void vpsrlq(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1797 void vpsrlw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1798 void vpsrld(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1799 void vpsrlq(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1800
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1801 // Arithmetic shift right packed integers (only shorts and ints, no instructions for longs)
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1802 void psraw(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1803 void psrad(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1804 void psraw(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1805 void psrad(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1806 void vpsraw(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1807 void vpsrad(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1808 void vpsraw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1809 void vpsrad(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1810
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1811 // And packed integers
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1812 void pand(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1813 void vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1814 void vpand(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1815
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1816 // Or packed integers
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1817 void por(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1818 void vpor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1819 void vpor(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1820
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1821 // Xor packed integers
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1822 void pxor(XMMRegister dst, XMMRegister src);
6225
2c368ea3e844 7181494: cleanup avx and vectors code
kvn
parents: 6179
diff changeset
1823 void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
6614
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1824 void vpxor(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1825
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1826 // Copy low 128bit into high 128bit of YMM registers.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1827 void vinsertf128h(XMMRegister dst, XMMRegister nds, XMMRegister src);
6225
2c368ea3e844 7181494: cleanup avx and vectors code
kvn
parents: 6179
diff changeset
1828 void vinserti128h(XMMRegister dst, XMMRegister nds, XMMRegister src);
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1829
6792
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 6740
diff changeset
1830 // Load/store high 128bit of YMM registers which does not destroy other half.
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 6740
diff changeset
1831 void vinsertf128h(XMMRegister dst, Address src);
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 6740
diff changeset
1832 void vinserti128h(XMMRegister dst, Address src);
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 6740
diff changeset
1833 void vextractf128h(Address dst, XMMRegister src);
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 6740
diff changeset
1834 void vextracti128h(Address dst, XMMRegister src);
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 6740
diff changeset
1835
7475
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
1836 // duplicate 4-bytes integer data from src into 8 locations in dest
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
1837 void vpbroadcastd(XMMRegister dst, XMMRegister src);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
1838
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1839 // Carry-Less Multiplication Quadword
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1840 void vpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1841
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1842 // AVX instruction which is used to clear upper 128 bits of YMM registers and
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1843 // to avoid transaction penalty between AVX and SSE states. There is no
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1844 // penalty if legacy SSE instructions are encoded using VEX prefix because
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1845 // they always clear upper 128 bits. It should be used before calling
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1846 // runtime code and native libraries.
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1847 void vzeroupper();
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1848
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1849 protected:
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1850 // Next instructions require address alignment 16 bytes SSE mode.
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1851 // They should be called only from corresponding MacroAssembler instructions.
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1852 void andpd(XMMRegister dst, Address src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1853 void andps(XMMRegister dst, Address src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1854 void xorpd(XMMRegister dst, Address src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1855 void xorps(XMMRegister dst, Address src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1856
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1858
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
1859 #endif // CPU_X86_VM_ASSEMBLER_X86_HPP