annotate src/cpu/x86/vm/assembler_x86.hpp @ 17716:cdb71841f4bc

6498581: ThreadInterruptTest3 produces wrong output on Windows Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set. Reviewed-by: acorn, kvn Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author minqi
date Wed, 26 Feb 2014 15:20:41 -0800
parents 59e8ad757e19
children d49f00604347 9e9af3aa4278
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
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
593 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
594 VexSimdPrefix pre, VexOpcode opc,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
595 bool vex_w, bool vector256);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
596
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
597 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
598 VexSimdPrefix pre, bool vector256 = false,
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
599 VexOpcode opc = VEX_OPCODE_0F) {
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
600 int src_enc = src->encoding();
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
601 int dst_enc = dst->encoding();
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
602 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
603 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
604 }
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
605
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
606 void simd_prefix(XMMRegister xreg, XMMRegister nds, Address adr,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
607 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
608 bool rex_w = false, bool vector256 = false);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
609
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
610 void simd_prefix(XMMRegister dst, Address src,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
611 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
612 simd_prefix(dst, xnoreg, src, pre, opc);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
613 }
6614
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
614
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
615 void simd_prefix(Address dst, XMMRegister src, VexSimdPrefix pre) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
616 simd_prefix(src, dst, pre);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
617 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
618 void simd_prefix_q(XMMRegister dst, XMMRegister nds, Address src,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
619 VexSimdPrefix pre) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
620 bool rex_w = true;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
621 simd_prefix(dst, nds, src, pre, VEX_OPCODE_0F, rex_w);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
622 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
623
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
624 int simd_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
625 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
626 bool rex_w = false, bool vector256 = false);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
627
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
628 // Move/convert 32-bit integer value.
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
629 int simd_prefix_and_encode(XMMRegister dst, XMMRegister nds, Register src,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
630 VexSimdPrefix pre) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
631 // 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
632 // 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
633 // Gen and Xmm registers are the same.
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
634 return simd_prefix_and_encode(dst, nds, as_XMMRegister(src->encoding()), pre);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
635 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
636 int simd_prefix_and_encode(XMMRegister dst, Register src, VexSimdPrefix pre) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
637 return simd_prefix_and_encode(dst, xnoreg, src, pre);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
638 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
639 int simd_prefix_and_encode(Register dst, XMMRegister src,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
640 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
641 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
642 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
643
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
644 // Move/convert 64-bit integer value.
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
645 int simd_prefix_and_encode_q(XMMRegister dst, XMMRegister nds, Register src,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
646 VexSimdPrefix pre) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
647 bool rex_w = true;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
648 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
649 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
650 int simd_prefix_and_encode_q(XMMRegister dst, Register src, VexSimdPrefix pre) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
651 return simd_prefix_and_encode_q(dst, xnoreg, src, pre);
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 int simd_prefix_and_encode_q(Register dst, XMMRegister src,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
654 VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
655 bool rex_w = true;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
656 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
657 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
658
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
659 // Helper functions for groups of instructions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
660 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
661
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
662 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
663 // 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
664 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
665 void emit_arith(int op1, int op2, Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
666
6614
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
667 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
668 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
669 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
670 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
671 void emit_vex_arith(int opcode, XMMRegister dst, XMMRegister nds,
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
672 Address src, VexSimdPrefix pre, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
673 void emit_vex_arith(int opcode, XMMRegister dst, XMMRegister nds,
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
674 XMMRegister src, VexSimdPrefix pre, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
675
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
676 void emit_operand(Register reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
677 Register base, Register index, Address::ScaleFactor scale,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
678 int disp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
679 RelocationHolder const& rspec,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
680 int rip_relative_correction = 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
681
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
682 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
683
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
684 // operands that only take the original 32bit registers
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
685 void emit_operand32(Register reg, Address adr);
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_operand(XMMRegister reg,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
688 Register base, Register index, Address::ScaleFactor scale,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
689 int disp,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
690 RelocationHolder const& rspec);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
691
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
692 void emit_operand(XMMRegister reg, Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
693
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
694 void emit_operand(MMXRegister reg, Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
695
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
696 // workaround gcc (3.2.1-7) bug
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
697 void emit_operand(Address adr, MMXRegister reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
698
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
699
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
700 // Immediate-to-memory forms
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
701 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
702
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
703 void emit_farith(int b1, int b2, int i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
704
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
705
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
706 protected:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
707 #ifdef ASSERT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
708 void check_relocation(RelocationHolder const& rspec, int format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
709 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
710
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
711 void emit_data(jint data, relocInfo::relocType rtype, int format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
712 void emit_data(jint data, RelocationHolder const& rspec, int format);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
713 void emit_data64(jlong data, relocInfo::relocType rtype, int format = 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
714 void emit_data64(jlong data, RelocationHolder const& rspec, int format = 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
715
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
716 bool reachable(AddressLiteral adr) NOT_LP64({ return true;});
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
717
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
718 // These are all easily abused and hence protected
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
719
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
720 // 32BIT ONLY SECTION
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
721 #ifndef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
722 // 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
723 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
724 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
725
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
726 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
727 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
728
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
729 void push_literal32(int32_t imm32, RelocationHolder const& rspec); // 32BIT ONLY
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
730 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
731 // 64BIT ONLY SECTION
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
732 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
733
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
734 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
735 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
736
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 624
diff changeset
737 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
738 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
739 #endif // _LP64
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 // 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
742 // 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
743 // 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
744 // 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
745
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
746 void call_literal(address entry, RelocationHolder const& rspec);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
747 void jmp_literal(address entry, RelocationHolder const& rspec);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
748
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
749 // Avoid using directly section
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
750 // Instructions in this section are actually usable by anyone without danger
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
751 // of failure but have performance issues that are addressed my enhanced
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
752 // 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
753 // We protect them because we don't trust you...
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
754
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
755 // 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
756 // 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
757 // Use MacroAssembler::decrement() & MacroAssembler::increment() methods
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
758 // which call inc() & dec() or add() & sub() in accordance with
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
759 // the product flag UseIncDec value.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
760
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
761 void decl(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
762 void decl(Address dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
763 void decq(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
764 void decq(Address dst);
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 void incl(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
767 void incl(Address dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
768 void incq(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
769 void incq(Address dst);
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 // 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
772 // 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
773 // The selection is done in MacroAssembler::movdbl() and movflt().
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
774
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
775 // Move Scalar Single-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
776 void movss(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
777 void movss(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
778 void movss(Address dst, XMMRegister src);
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 // Move Scalar Double-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
781 void movsd(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
782 void movsd(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
783 void movsd(Address dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
784 void movlpd(XMMRegister dst, Address src);
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 // 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
787 // when moving between registers.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
788 void movaps(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
789 void movapd(XMMRegister dst, XMMRegister src);
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 // End avoid using directly
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
792
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
793
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
794 // Instruction prefixes
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
795 void prefix(Prefix p);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
796
0
a61af66fc99e Initial load
duke
parents:
diff changeset
797 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
798
a61af66fc99e Initial load
duke
parents:
diff changeset
799 // Creation
a61af66fc99e Initial load
duke
parents:
diff changeset
800 Assembler(CodeBuffer* code) : AbstractAssembler(code) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
801
a61af66fc99e Initial load
duke
parents:
diff changeset
802 // Decoding
a61af66fc99e Initial load
duke
parents:
diff changeset
803 static address locate_operand(address inst, WhichOperand which);
a61af66fc99e Initial load
duke
parents:
diff changeset
804 static address locate_next_instruction(address inst);
a61af66fc99e Initial load
duke
parents:
diff changeset
805
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
806 // Utilities
2404
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2320
diff changeset
807 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
808
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
809 // Generic instructions
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
810 // 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
811 // 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
812
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
813 void lea(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
814
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
815 void mov(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
816
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
817 void pusha();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
818 void popa();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
819
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
820 void pushf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
821 void popf();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
822
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
823 void push(int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
824
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
825 void push(Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
826
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
827 void pop(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
828
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
829 // These are dummies to prevent surprise implicit conversions to Register
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
830 void push(void* v);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
831 void pop(void* v);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
832
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
833 // These do register sized moves/scans
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
834 void rep_mov();
7474
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7204
diff changeset
835 void rep_stos();
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7204
diff changeset
836 void rep_stosb();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
837 void repne_scan();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
838 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
839 void repne_scanl();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
840 #endif
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 // Vanilla instructions in lexical order
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
843
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2008
diff changeset
844 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
845 void adcl(Address dst, Register src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
846 void adcl(Register dst, int32_t imm32);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
847 void adcl(Register dst, Address src);
a61af66fc99e Initial load
duke
parents:
diff changeset
848 void adcl(Register dst, Register src);
a61af66fc99e Initial load
duke
parents:
diff changeset
849
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
850 void adcq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
851 void adcq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
852 void adcq(Register dst, Register src);
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 void addl(Address dst, int32_t imm32);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
855 void addl(Address dst, Register src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
856 void addl(Register dst, int32_t imm32);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
857 void addl(Register dst, Address src);
a61af66fc99e Initial load
duke
parents:
diff changeset
858 void addl(Register dst, Register src);
a61af66fc99e Initial load
duke
parents:
diff changeset
859
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
860 void addq(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
861 void addq(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
862 void addq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
863 void addq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
864 void addq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
865
0
a61af66fc99e Initial load
duke
parents:
diff changeset
866 void addr_nop_4();
a61af66fc99e Initial load
duke
parents:
diff changeset
867 void addr_nop_5();
a61af66fc99e Initial load
duke
parents:
diff changeset
868 void addr_nop_7();
a61af66fc99e Initial load
duke
parents:
diff changeset
869 void addr_nop_8();
a61af66fc99e Initial load
duke
parents:
diff changeset
870
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
871 // Add Scalar Double-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
872 void addsd(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
873 void addsd(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
874
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
875 // Add Scalar Single-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
876 void addss(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
877 void addss(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
878
6894
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
879 // AES instructions
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
880 void aesdec(XMMRegister dst, Address src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
881 void aesdec(XMMRegister dst, XMMRegister src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
882 void aesdeclast(XMMRegister dst, Address src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
883 void aesdeclast(XMMRegister dst, XMMRegister src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
884 void aesenc(XMMRegister dst, Address src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
885 void aesenc(XMMRegister dst, XMMRegister src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
886 void aesenclast(XMMRegister dst, Address src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
887 void aesenclast(XMMRegister dst, XMMRegister src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
888
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
889
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
890 void andl(Address dst, int32_t imm32);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
891 void andl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
892 void andl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
893 void andl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
894
3783
de6a837d75cf 7056380: VM crashes with SIGSEGV in compiled code
never
parents: 3755
diff changeset
895 void andq(Address dst, int32_t imm32);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
896 void andq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
897 void andq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
898 void andq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
899
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
900 void bsfl(Register dst, Register src);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
901 void bsrl(Register dst, Register src);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
902
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
903 #ifdef _LP64
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
904 void bsfq(Register dst, Register src);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
905 void bsrq(Register dst, Register src);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
906 #endif
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
907
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
908 void bswapl(Register reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
909
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
910 void bswapq(Register reg);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
911
0
a61af66fc99e Initial load
duke
parents:
diff changeset
912 void call(Label& L, relocInfo::relocType rtype);
a61af66fc99e Initial load
duke
parents:
diff changeset
913 void call(Register reg); // push pc; pc <- reg
a61af66fc99e Initial load
duke
parents:
diff changeset
914 void call(Address adr); // push pc; pc <- adr
a61af66fc99e Initial load
duke
parents:
diff changeset
915
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
916 void cdql();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
917
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
918 void cdqq();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
919
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
920 void cld();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
921
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
922 void clflush(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
923
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
924 void cmovl(Condition cc, Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
925 void cmovl(Condition cc, Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
926
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
927 void cmovq(Condition cc, Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
928 void cmovq(Condition cc, Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
929
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
930
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
931 void cmpb(Address dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
932
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
933 void cmpl(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
934
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
935 void cmpl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
936 void cmpl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
937 void cmpl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
938
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
939 void cmpq(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
940 void cmpq(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
941
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
942 void cmpq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
943 void cmpq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
944 void cmpq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
945
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
946 // 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
947 void cmpl(Register dst, void* junk); // dummy
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
948 void cmpq(Register dst, void* junk); // dummy
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
949
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
950 void cmpw(Address dst, int imm16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
951
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
952 void cmpxchg8 (Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
953
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
954 void cmpxchgl(Register reg, Address adr);
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 cmpxchgq(Register reg, Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
957
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
958 // Ordered Compare Scalar Double-Precision Floating-Point Values and set EFLAGS
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
959 void comisd(XMMRegister dst, Address src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
960 void comisd(XMMRegister dst, XMMRegister src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
961
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
962 // Ordered Compare Scalar Single-Precision Floating-Point Values and set EFLAGS
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
963 void comiss(XMMRegister dst, Address src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
964 void comiss(XMMRegister dst, XMMRegister src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
965
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
966 // Identify processor type and features
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
967 void cpuid();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
968
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
969 // 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
970 void cvtsd2ss(XMMRegister dst, XMMRegister src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
971 void cvtsd2ss(XMMRegister dst, Address src);
304
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 // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
974 void cvtsi2sdl(XMMRegister dst, Register src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
975 void cvtsi2sdl(XMMRegister dst, Address src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
976 void cvtsi2sdq(XMMRegister dst, Register src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
977 void cvtsi2sdq(XMMRegister dst, Address src);
304
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 // Convert Doubleword Integer to Scalar Single-Precision Floating-Point Value
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
980 void cvtsi2ssl(XMMRegister dst, Register src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
981 void cvtsi2ssl(XMMRegister dst, Address src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
982 void cvtsi2ssq(XMMRegister dst, Register src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
983 void cvtsi2ssq(XMMRegister dst, Address src);
304
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 // 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
986 void cvtdq2pd(XMMRegister dst, XMMRegister 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 // 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
989 void cvtdq2ps(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
990
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
991 // 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
992 void cvtss2sd(XMMRegister dst, XMMRegister src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
993 void cvtss2sd(XMMRegister dst, Address src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
994
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
995 // 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
996 void cvttsd2sil(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
997 void cvttsd2sil(Register dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
998 void cvttsd2siq(Register dst, XMMRegister src);
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 // 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
1001 void cvttss2sil(Register dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1002 void cvttss2siq(Register dst, XMMRegister src);
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 // Divide Scalar Double-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1005 void divsd(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1006 void divsd(XMMRegister dst, XMMRegister src);
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 // Divide Scalar Single-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1009 void divss(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1010 void divss(XMMRegister dst, XMMRegister src);
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 void emms();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1013
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1014 void fabs();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1015
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1016 void fadd(int i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1017
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1018 void fadd_d(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1019 void fadd_s(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1020
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1021 // "Alternate" versions of x87 instructions place result down in FPU
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1022 // stack instead of on TOS
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1023
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1024 void fadda(int i); // "alternate" fadd
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1025 void faddp(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1026
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1027 void fchs();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1028
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1029 void fcom(int i);
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 void fcomp(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1032 void fcomp_d(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1033 void fcomp_s(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1034
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1035 void fcompp();
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 void fcos();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1038
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1039 void fdecstp();
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 void fdiv(int i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1042 void fdiv_d(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1043 void fdivr_s(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1044 void fdiva(int i); // "alternate" fdiv
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1045 void fdivp(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1046
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1047 void fdivr(int i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1048 void fdivr_d(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1049 void fdiv_s(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1050
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1051 void fdivra(int i); // "alternate" reversed fdiv
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1052
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1053 void fdivrp(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1054
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1055 void ffree(int i = 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1056
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1057 void fild_d(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1058 void fild_s(Address adr);
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 fincstp();
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 finit();
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 fist_s (Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1065 void fistp_d(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1066 void fistp_s(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1067
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1068 void fld1();
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 fld_d(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1071 void fld_s(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1072 void fld_s(int index);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1073 void fld_x(Address adr); // extended-precision (80-bit) format
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 fldcw(Address src);
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 fldenv(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1078
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1079 void fldlg2();
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 fldln2();
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 fldz();
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 flog();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1086 void flog10();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1087
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1088 void fmul(int i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1089
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1090 void fmul_d(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1091 void fmul_s(Address src);
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 fmula(int i); // "alternate" fmul
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1094
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1095 void fmulp(int i = 1);
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 fnsave(Address dst);
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 fnstcw(Address src);
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 fnstsw_ax();
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 fprem();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1104 void fprem1();
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 frstor(Address src);
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 fsin();
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 fsqrt();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1111
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1112 void fst_d(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1113 void fst_s(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1114
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1115 void fstp_d(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1116 void fstp_d(int index);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1117 void fstp_s(Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1118 void fstp_x(Address adr); // extended-precision (80-bit) format
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1119
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1120 void fsub(int i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1121 void fsub_d(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1122 void fsub_s(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1123
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1124 void fsuba(int i); // "alternate" fsub
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1125
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1126 void fsubp(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1127
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1128 void fsubr(int i);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1129 void fsubr_d(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1130 void fsubr_s(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1131
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1132 void fsubra(int i); // "alternate" reversed fsub
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 fsubrp(int i = 1);
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 ftan();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1137
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1138 void ftst();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1139
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1140 void fucomi(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1141 void fucomip(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 fwait();
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 fxch(int i = 1);
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 fxrstor(Address src);
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 fxsave(Address dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1150
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1151 void fyl2x();
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4947
diff changeset
1152 void frndint();
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4947
diff changeset
1153 void f2xm1();
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4947
diff changeset
1154 void fldl2e();
304
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 hlt();
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 idivl(Register src);
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1846
diff changeset
1159 void divl(Register src); // Unsigned division
304
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 idivq(Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1162
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1163 void imull(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1164 void imull(Register dst, Register src, int value);
12972
59e8ad757e19 8026844: Various Math functions needs intrinsification
rbackman
parents: 11080
diff changeset
1165 void imull(Register dst, Address src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1166
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1167 void imulq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1168 void imulq(Register dst, Register src, int value);
12972
59e8ad757e19 8026844: Various Math functions needs intrinsification
rbackman
parents: 11080
diff changeset
1169 #ifdef _LP64
59e8ad757e19 8026844: Various Math functions needs intrinsification
rbackman
parents: 11080
diff changeset
1170 void imulq(Register dst, Address src);
59e8ad757e19 8026844: Various Math functions needs intrinsification
rbackman
parents: 11080
diff changeset
1171 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1172
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1173
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 // jcc is the generic conditional branch generator to run-
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 // time routines, jcc is used for branches to labels. jcc
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 // takes a branch opcode (cc) and a label (L) and generates
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 // either a backward branch or a forward branch and links it
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 // to the label fixup chain. Usage:
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 // Label L; // unbound label
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 // jcc(cc, L); // forward branch to unbound label
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 // bind(L); // bind label to the current pc
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 // jcc(cc, L); // backward branch to bound label
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 // bind(L); // illegal: a label may be bound only once
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 // Note: The same Label can be used for forward and backward branches
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 // but it may be bound only once.
a61af66fc99e Initial load
duke
parents:
diff changeset
1188
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3783
diff changeset
1189 void jcc(Condition cc, Label& L, bool maybe_short = true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1190
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 // Conditional jump to a 8-bit offset to L.
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 // WARNING: be very careful using this for forward jumps. If the label is
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 // not bound within an 8-bit offset of this instruction, a run-time error
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 // will occur.
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 void jccb(Condition cc, Label& L);
a61af66fc99e Initial load
duke
parents:
diff changeset
1196
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1197 void jmp(Address entry); // pc <- entry
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1198
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1199 // Label operations & relative jumps (PPUM Appendix D)
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3783
diff changeset
1200 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
1201
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1202 void jmp(Register entry); // pc <- entry
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 // Unconditional 8-bit offset jump to L.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1205 // 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
1206 // 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
1207 // will occur.
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1208 void jmpb(Label& L);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1209
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1210 void ldmxcsr( Address src );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1211
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1212 void leal(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1213
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1214 void leaq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1215
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
1216 void lfence();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1217
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1218 void lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1219
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1220 void lzcntl(Register dst, Register src);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1221
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1222 #ifdef _LP64
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1223 void lzcntq(Register dst, Register src);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1224 #endif
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 710
diff changeset
1225
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1226 enum Membar_mask_bits {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1227 StoreStore = 1 << 3,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1228 LoadStore = 1 << 2,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1229 StoreLoad = 1 << 1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1230 LoadLoad = 1 << 0
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1231 };
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1232
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1233 // Serializes memory and blows flags
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1234 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
1235 if (os::is_MP()) {
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1236 // We only have to handle StoreLoad
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1237 if (order_constraint & StoreLoad) {
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1238 // 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
1239 // 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
1240 // 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
1241 // 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
1242 // flags.
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1243 // 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
1244 // 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
1245 // orderAccess code.
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1246 lock();
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1247 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
1248 }
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 665
diff changeset
1249 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1250 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1251
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1252 void mfence();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1253
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1254 // Moves
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 mov64(Register dst, int64_t imm64);
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 movb(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1259 void movb(Address dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1260 void movb(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1261
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1262 void movdl(XMMRegister dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1263 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
1264 void movdl(XMMRegister dst, Address src);
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1265 void movdl(Address dst, XMMRegister src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1266
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1267 // Move Double Quadword
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1268 void movdq(XMMRegister dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1269 void movdq(Register dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1270
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1271 // Move Aligned Double Quadword
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1272 void movdqa(XMMRegister dst, XMMRegister src);
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1273 void movdqa(XMMRegister dst, Address src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1274
405
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1275 // Move Unaligned Double Quadword
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1276 void movdqu(Address dst, XMMRegister src);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1277 void movdqu(XMMRegister dst, Address src);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1278 void movdqu(XMMRegister dst, XMMRegister src);
2649e5276dd7 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 362
diff changeset
1279
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1280 // Move Unaligned 256bit Vector
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1281 void vmovdqu(Address dst, XMMRegister src);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1282 void vmovdqu(XMMRegister dst, Address src);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1283 void vmovdqu(XMMRegister dst, XMMRegister src);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1284
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1285 // 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
1286 void movlhps(XMMRegister dst, XMMRegister src);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1287
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1288 void movl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1289 void movl(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1290 void movl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1291 void movl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1292 void movl(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1293
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1294 // 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
1295 // by giving the compiler two choices it can't resolve
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1296
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1297 void movl(Address dst, void* junk);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1298 void movl(Register dst, void* junk);
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 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1301 void movq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1302 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
1303 void movq(Address dst, Register src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1304 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1305
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1306 void movq(Address dst, MMXRegister src );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1307 void movq(MMXRegister dst, Address src );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1308
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1309 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1310 // 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
1311 // by giving the compiler two choices it can't resolve
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 void movq(Address dst, void* dummy);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1314 void movq(Register dst, void* dummy);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1315 #endif
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 Quadword
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1318 void movq(Address dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1319 void movq(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1320
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1321 void movsbl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1322 void movsbl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1323
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1324 #ifdef _LP64
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1325 void movsbq(Register dst, Address src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1326 void movsbq(Register dst, Register src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1327
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1328 // 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
1329 void movslq(Address dst, int32_t imm64);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1330 void movslq(Register dst, int32_t imm64);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1331
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1332 void movslq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1333 void movslq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1334 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
1335 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1336
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1337 void movswl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1338 void movswl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1339
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1340 #ifdef _LP64
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1341 void movswq(Register dst, Address src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1342 void movswq(Register dst, Register src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1343 #endif
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1344
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1345 void movw(Address dst, int imm16);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1346 void movw(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1347 void movw(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1348
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1349 void movzbl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1350 void movzbl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1351
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1352 #ifdef _LP64
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1353 void movzbq(Register dst, Address src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1354 void movzbq(Register dst, Register src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1355 #endif
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1356
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1357 void movzwl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1358 void movzwl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1359
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1360 #ifdef _LP64
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1361 void movzwq(Register dst, Address src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1362 void movzwq(Register dst, Register src);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1363 #endif
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 623
diff changeset
1364
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1365 void mull(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1366 void mull(Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1367
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1368 // Multiply Scalar Double-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1369 void mulsd(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1370 void mulsd(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1371
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1372 // Multiply Scalar Single-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1373 void mulss(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1374 void mulss(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1375
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1376 void negl(Register dst);
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 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1379 void negq(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1380 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1381
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1382 void nop(int i = 1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1383
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1384 void notl(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1385
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1386 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1387 void notq(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1388 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1389
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1390 void orl(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1391 void orl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1392 void orl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1393 void orl(Register 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 orq(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1396 void orq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1397 void orq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1398 void orq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1399
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1400 // Pack with unsigned saturation
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1401 void packuswb(XMMRegister dst, XMMRegister src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1402 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
1403 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
1404
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
1405 // Pemutation of 64bit words
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
1406 void vpermq(XMMRegister dst, XMMRegister src, int imm8, bool vector256);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1407
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
1408 // SSE4.2 string instructions
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
1409 void pcmpestri(XMMRegister xmm1, XMMRegister xmm2, int imm8);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
1410 void pcmpestri(XMMRegister xmm1, Address src, int imm8);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
1411
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1412 // SSE 4.1 extract
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1413 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
1414 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
1415
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1416 // SSE 4.1 insert
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1417 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
1418 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
1419
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1420 // SSE4.1 packed move
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1421 void pmovzxbw(XMMRegister dst, XMMRegister src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1422 void pmovzxbw(XMMRegister dst, Address src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1423
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 986
diff changeset
1424 #ifndef _LP64 // no 32bit push/pop on amd64
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1425 void popl(Address dst);
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 986
diff changeset
1426 #endif
304
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 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1429 void popq(Address dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1430 #endif
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1431
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1432 void popcntl(Register dst, Address src);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1433 void popcntl(Register dst, Register src);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1434
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1435 #ifdef _LP64
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1436 void popcntq(Register dst, Address src);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1437 void popcntq(Register dst, Register src);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1438 #endif
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 642
diff changeset
1439
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1440 // Prefetches (SSE, SSE2, 3DNOW only)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1441
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1442 void prefetchnta(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1443 void prefetchr(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1444 void prefetcht0(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1445 void prefetcht1(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1446 void prefetcht2(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1447 void prefetchw(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1448
6894
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
1449 // Shuffle Bytes
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
1450 void pshufb(XMMRegister dst, XMMRegister src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
1451 void pshufb(XMMRegister dst, Address src);
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6848
diff changeset
1452
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1453 // Shuffle Packed Doublewords
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1454 void pshufd(XMMRegister dst, XMMRegister src, int mode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1455 void pshufd(XMMRegister dst, Address src, int mode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1456
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1457 // Shuffle Packed Low Words
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1458 void pshuflw(XMMRegister dst, XMMRegister src, int mode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1459 void pshuflw(XMMRegister dst, Address src, int mode);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1460
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1461 // 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
1462 void psrldq(XMMRegister dst, int shift);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
1463
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7475
diff changeset
1464 // Logical Compare 128bit
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
1465 void ptest(XMMRegister dst, XMMRegister src);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
1466 void ptest(XMMRegister dst, Address src);
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7475
diff changeset
1467 // Logical Compare 256bit
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7475
diff changeset
1468 void vptest(XMMRegister dst, XMMRegister src);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7475
diff changeset
1469 void vptest(XMMRegister dst, Address src);
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
1470
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1471 // Interleave Low Bytes
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1472 void punpcklbw(XMMRegister dst, XMMRegister src);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1473 void punpcklbw(XMMRegister dst, Address src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1474
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1475 // Interleave Low Doublewords
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1476 void punpckldq(XMMRegister dst, XMMRegister src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1477 void punpckldq(XMMRegister dst, Address src);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1478
6225
2c368ea3e844 7181494: cleanup avx and vectors code
kvn
parents: 6179
diff changeset
1479 // Interleave Low Quadwords
2c368ea3e844 7181494: cleanup avx and vectors code
kvn
parents: 6179
diff changeset
1480 void punpcklqdq(XMMRegister dst, XMMRegister src);
2c368ea3e844 7181494: cleanup avx and vectors code
kvn
parents: 6179
diff changeset
1481
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 986
diff changeset
1482 #ifndef _LP64 // no 32bit push/pop on amd64
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1483 void pushl(Address src);
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 986
diff changeset
1484 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1485
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1486 void pushq(Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1487
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1488 void rcll(Register dst, int imm8);
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 rclq(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1491
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1492 void ret(int imm16);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1493
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 void sahf();
a61af66fc99e Initial load
duke
parents:
diff changeset
1495
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1496 void sarl(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1497 void sarl(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1498
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1499 void sarq(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1500 void sarq(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1501
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1502 void sbbl(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1503 void sbbl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1504 void sbbl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1505 void sbbl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1506
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1507 void sbbq(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1508 void sbbq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1509 void sbbq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1510 void sbbq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1511
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1512 void setb(Condition cc, Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1513
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1514 void shldl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1515
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1516 void shll(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1517 void shll(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1518
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1519 void shlq(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1520 void shlq(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1521
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1522 void shrdl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1523
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1524 void shrl(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1525 void shrl(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1526
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1527 void shrq(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1528 void shrq(Register dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1529
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1530 void smovl(); // QQQ generic?
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1531
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1532 // Compute Square Root of Scalar Double-Precision Floating-Point Value
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1533 void sqrtsd(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1534 void sqrtsd(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1535
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 2002
diff changeset
1536 // Compute Square Root of Scalar Single-Precision Floating-Point Value
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 2002
diff changeset
1537 void sqrtss(XMMRegister dst, Address src);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 2002
diff changeset
1538 void sqrtss(XMMRegister dst, XMMRegister src);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 2002
diff changeset
1539
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
1540 void std();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1541
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1542 void stmxcsr( Address dst );
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1543
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1544 void subl(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1545 void subl(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1546 void subl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1547 void subl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1548 void subl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1549
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1550 void subq(Address dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1551 void subq(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1552 void subq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1553 void subq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1554 void subq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1555
4947
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4761
diff changeset
1556 // 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
1557 void subl_imm32(Register dst, int32_t imm32);
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4761
diff changeset
1558 void subq_imm32(Register dst, int32_t imm32);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1559
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1560 // Subtract Scalar Double-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1561 void subsd(XMMRegister dst, Address src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 void subsd(XMMRegister dst, XMMRegister src);
a61af66fc99e Initial load
duke
parents:
diff changeset
1563
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1564 // Subtract Scalar Single-Precision Floating-Point Values
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1565 void subss(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1566 void subss(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1567
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1568 void testb(Register dst, int imm8);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1569
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1570 void testl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1571 void testl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1572 void testl(Register dst, Address 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 testq(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1575 void testq(Register dst, Register src);
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
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1578 // Unordered Compare Scalar Double-Precision Floating-Point Values and set EFLAGS
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1579 void ucomisd(XMMRegister dst, Address src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 void ucomisd(XMMRegister dst, XMMRegister src);
a61af66fc99e Initial load
duke
parents:
diff changeset
1581
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1582 // Unordered Compare Scalar Single-Precision Floating-Point Values and set EFLAGS
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1583 void ucomiss(XMMRegister dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1584 void ucomiss(XMMRegister dst, XMMRegister src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1585
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1586 void xaddl(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1587
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1588 void xaddq(Address dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1589
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1590 void xchgl(Register reg, Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1591 void xchgl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1592
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1593 void xchgq(Register reg, Address adr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1594 void xchgq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1595
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1596 // Get Value of Extended Control Register
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
1597 void xgetbv();
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1598
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1599 void xorl(Register dst, int32_t imm32);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1600 void xorl(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1601 void xorl(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1602
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1603 void xorq(Register dst, Address src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1604 void xorq(Register dst, Register src);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1605
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1606 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
1607
6225
2c368ea3e844 7181494: cleanup avx and vectors code
kvn
parents: 6179
diff changeset
1608 // AVX 3-operands scalar instructions (encoded with VEX prefix)
6614
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1609
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1610 void vaddsd(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1611 void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1612 void vaddss(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1613 void vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1614 void vdivsd(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1615 void vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1616 void vdivss(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1617 void vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1618 void vmulsd(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1619 void vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1620 void vmulss(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1621 void vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1622 void vsubsd(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1623 void vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1624 void vsubss(XMMRegister dst, XMMRegister nds, Address src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1625 void vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1626
6614
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1627
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1628 //====================VECTOR ARITHMETIC=====================================
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1629
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1630 // Add Packed Floating-Point Values
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1631 void addpd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1632 void addps(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1633 void vaddpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1634 void vaddps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1635 void vaddpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1636 void vaddps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1637
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1638 // Subtract Packed Floating-Point Values
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1639 void subpd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1640 void subps(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1641 void vsubpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1642 void vsubps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1643 void vsubpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1644 void vsubps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1645
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1646 // Multiply Packed Floating-Point Values
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1647 void mulpd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1648 void mulps(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1649 void vmulpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1650 void vmulps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1651 void vmulpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1652 void vmulps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1653
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1654 // Divide Packed Floating-Point Values
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1655 void divpd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1656 void divps(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1657 void vdivpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1658 void vdivps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1659 void vdivpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1660 void vdivps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1661
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1662 // Bitwise Logical AND of Packed Floating-Point Values
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1663 void andpd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1664 void andps(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1665 void vandpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1666 void vandps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1667 void vandpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1668 void vandps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1669
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1670 // Bitwise Logical XOR of Packed Floating-Point Values
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1671 void xorpd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1672 void xorps(XMMRegister dst, XMMRegister src);
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1673 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
1674 void vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
6614
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1675 void vxorpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1676 void vxorps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1677
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1678 // Add packed integers
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1679 void paddb(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1680 void paddw(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1681 void paddd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1682 void paddq(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1683 void vpaddb(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1684 void vpaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1685 void vpaddd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1686 void vpaddq(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1687 void vpaddb(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1688 void vpaddw(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1689 void vpaddd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1690 void vpaddq(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1691
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1692 // Sub packed integers
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1693 void psubb(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1694 void psubw(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1695 void psubd(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1696 void psubq(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1697 void vpsubb(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1698 void vpsubw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1699 void vpsubd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1700 void vpsubq(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1701 void vpsubb(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1702 void vpsubw(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1703 void vpsubd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1704 void vpsubq(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1705
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1706 // Multiply packed integers (only shorts and ints)
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1707 void pmullw(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1708 void pmulld(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1709 void vpmullw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1710 void vpmulld(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1711 void vpmullw(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1712 void vpmulld(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1713
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1714 // Shift left packed integers
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1715 void psllw(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1716 void pslld(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1717 void psllq(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1718 void psllw(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1719 void pslld(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1720 void psllq(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1721 void vpsllw(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1722 void vpslld(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1723 void vpsllq(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1724 void vpsllw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1725 void vpslld(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1726 void vpsllq(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1727
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1728 // Logical shift right packed integers
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1729 void psrlw(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1730 void psrld(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1731 void psrlq(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1732 void psrlw(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1733 void psrld(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1734 void psrlq(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1735 void vpsrlw(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1736 void vpsrld(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1737 void vpsrlq(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1738 void vpsrlw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1739 void vpsrld(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1740 void vpsrlq(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1741
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1742 // 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
1743 void psraw(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1744 void psrad(XMMRegister dst, int shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1745 void psraw(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1746 void psrad(XMMRegister dst, XMMRegister shift);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1747 void vpsraw(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1748 void vpsrad(XMMRegister dst, XMMRegister src, int shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1749 void vpsraw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1750 void vpsrad(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1751
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1752 // And packed integers
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1753 void pand(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1754 void vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1755 void vpand(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1756
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1757 // Or packed integers
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1758 void por(XMMRegister dst, XMMRegister src);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1759 void vpor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1760 void vpor(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1761
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1762 // Xor packed integers
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1763 void pxor(XMMRegister dst, XMMRegister src);
6225
2c368ea3e844 7181494: cleanup avx and vectors code
kvn
parents: 6179
diff changeset
1764 void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
6614
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1765 void vpxor(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1766
006050192a5a 6340864: Implement vectorization optimizations in hotspot-server
kvn
parents: 6266
diff changeset
1767 // 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
1768 void vinsertf128h(XMMRegister dst, XMMRegister nds, XMMRegister src);
6225
2c368ea3e844 7181494: cleanup avx and vectors code
kvn
parents: 6179
diff changeset
1769 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
1770
6792
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 6740
diff changeset
1771 // 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
1772 void vinsertf128h(XMMRegister dst, Address src);
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 6740
diff changeset
1773 void vinserti128h(XMMRegister dst, Address src);
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 6740
diff changeset
1774 void vextractf128h(Address dst, XMMRegister src);
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 6740
diff changeset
1775 void vextracti128h(Address dst, XMMRegister src);
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 6740
diff changeset
1776
7475
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
1777 // 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
1778 void vpbroadcastd(XMMRegister dst, XMMRegister src);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
1779
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1780 // Carry-Less Multiplication Quadword
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7955
diff changeset
1781 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
1782
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1783 // 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
1784 // 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
1785 // 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
1786 // 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
1787 // runtime code and native libraries.
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6141
diff changeset
1788 void vzeroupper();
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1789
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1790 protected:
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1791 // Next instructions require address alignment 16 bytes SSE mode.
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1792 // They should be called only from corresponding MacroAssembler instructions.
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1793 void andpd(XMMRegister dst, Address src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1794 void andps(XMMRegister dst, Address src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1795 void xorpd(XMMRegister dst, Address src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1796 void xorps(XMMRegister dst, Address src);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4114
diff changeset
1797
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1799
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1920
diff changeset
1800 #endif // CPU_X86_VM_ASSEMBLER_X86_HPP