1 /*
2 * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef CPU_X86_STUBROUTINES_X86_HPP
26 #define CPU_X86_STUBROUTINES_X86_HPP
27
28 // This file holds the platform specific parts of the StubRoutines
29 // definition. See stubRoutines.hpp for a description on how to
30 // extend it.
31
32 static bool returns_to_call_stub(address return_pc) { return return_pc == _call_stub_return_address; }
33
34 enum platform_dependent_constants {
35 // simply increase sizes if too small (assembler will crash if too small)
36 _initial_stubs_code_size = 20000 WINDOWS_ONLY(+1000),
37 _continuation_stubs_code_size = 1000 LP64_ONLY(+1000),
38 // AVX512 intrinsics add more code in 64-bit VM,
39 // Windows have more code to save/restore registers
40 _compiler_stubs_code_size = 20000 LP64_ONLY(+46000) WINDOWS_ONLY(+2000),
41 _final_stubs_code_size = 10000 LP64_ONLY(+20000) WINDOWS_ONLY(+2000) ZGC_ONLY(+20000)
42 };
43
44 class x86 {
45 friend class StubGenerator;
46 friend class VMStructs;
47
48 #ifdef _LP64
49 private:
50 static address _get_previous_sp_entry;
51
52 static address _f2i_fixup;
53 static address _f2l_fixup;
54 static address _d2i_fixup;
55 static address _d2l_fixup;
56
57 static address _float_sign_mask;
58 static address _float_sign_flip;
59 static address _double_sign_mask;
60 static address _double_sign_flip;
61 static address _compress_perm_table32;
62 static address _compress_perm_table64;
63 static address _expand_perm_table32;
64 static address _expand_perm_table64;
65
66 public:
67
68 static address get_previous_sp_entry() {
69 return _get_previous_sp_entry;
70 }
71
72 static address f2i_fixup() {
73 return _f2i_fixup;
74 }
75
76 static address f2l_fixup() {
77 return _f2l_fixup;
78 }
79
80 static address d2i_fixup() {
81 return _d2i_fixup;
82 }
83
84 static address d2l_fixup() {
85 return _d2l_fixup;
86 }
87
88 static address float_sign_mask() {
89 return _float_sign_mask;
90 }
91
92 static address float_sign_flip() {
93 return _float_sign_flip;
94 }
95
96 static address double_sign_mask() {
97 return _double_sign_mask;
98 }
99
100 static address double_sign_flip() {
101 return _double_sign_flip;
102 }
103
104 #else // !LP64
105
106 private:
107 static address _verify_fpu_cntrl_wrd_entry;
108 static address _d2i_wrapper;
109 static address _d2l_wrapper;
110
111 static jint _fpu_cntrl_wrd_std;
112 static jint _fpu_cntrl_wrd_24;
113 static jint _fpu_cntrl_wrd_trunc;
114
115 static jint _fpu_subnormal_bias1[3];
116 static jint _fpu_subnormal_bias2[3];
117
118 public:
119 static address verify_fpu_cntrl_wrd_entry() { return _verify_fpu_cntrl_wrd_entry; }
120 static address d2i_wrapper() { return _d2i_wrapper; }
121 static address d2l_wrapper() { return _d2l_wrapper; }
122 static address addr_fpu_cntrl_wrd_std() { return (address)&_fpu_cntrl_wrd_std; }
123 static address addr_fpu_cntrl_wrd_24() { return (address)&_fpu_cntrl_wrd_24; }
124 static address addr_fpu_cntrl_wrd_trunc() { return (address)&_fpu_cntrl_wrd_trunc; }
125 static address addr_fpu_subnormal_bias1() { return (address)&_fpu_subnormal_bias1; }
126 static address addr_fpu_subnormal_bias2() { return (address)&_fpu_subnormal_bias2; }
127
128 static jint fpu_cntrl_wrd_std() { return _fpu_cntrl_wrd_std; }
129 #endif // !LP64
130
131 private:
132 static jint _mxcsr_std;
133 #ifdef _LP64
134 static jint _mxcsr_rz;
135 #endif // _LP64
136
137 static address _verify_mxcsr_entry;
138
139 // masks and table for CRC32
140 static const uint64_t _crc_by128_masks[];
141 static const juint _crc_table[];
142 #ifdef _LP64
143 static const juint _crc_by128_masks_avx512[];
144 static const juint _crc_table_avx512[];
145 static const juint _crc32c_table_avx512[];
146 static const juint _shuf_table_crc32_avx512[];
147 #endif // _LP64
148 // table for CRC32C
149 static juint* _crc32c_table;
150 // table for arrays_hashcode
151 static const jint _arrays_hashcode_powers_of_31[];
152
153 // upper word mask for sha1
154 static address _upper_word_mask_addr;
155 // byte flip mask for sha1
156 static address _shuffle_byte_flip_mask_addr;
157
158 //k256 table for sha256
159 static const juint _k256[];
160 static address _k256_adr;
161 static address _vector_short_to_byte_mask;
162 static address _vector_float_sign_mask;
163 static address _vector_float_sign_flip;
164 static address _vector_double_sign_mask;
165 static address _vector_double_sign_flip;
166 static address _vector_long_sign_mask;
167 static address _vector_all_bits_set;
168 static address _vector_int_mask_cmp_bits;
169 static address _vector_byte_perm_mask;
170 static address _vector_int_to_byte_mask;
171 static address _vector_int_to_short_mask;
172 static address _vector_32_bit_mask;
173 static address _vector_64_bit_mask;
174 static address _vector_int_shuffle_mask;
175 static address _vector_byte_shuffle_mask;
176 static address _vector_short_shuffle_mask;
177 static address _vector_long_shuffle_mask;
178 static address _vector_iota_indices;
179 static address _vector_popcount_lut;
180 static address _vector_count_leading_zeros_lut;
181 static address _vector_reverse_bit_lut;
182 static address _vector_reverse_byte_perm_mask_long;
183 static address _vector_reverse_byte_perm_mask_int;
184 static address _vector_reverse_byte_perm_mask_short;
185 #ifdef _LP64
186 static juint _k256_W[];
187 static address _k256_W_adr;
188 static const julong _k512_W[];
189 static address _k512_W_addr;
190 // byte flip mask for sha512
191 static address _pshuffle_byte_flip_mask_addr_sha512;
192 // Masks for base64
193 static address _encoding_table_base64;
194 static address _shuffle_base64;
195 static address _avx2_shuffle_base64;
196 static address _avx2_input_mask_base64;
197 static address _avx2_lut_base64;
198 static address _avx2_decode_tables_base64;
199 static address _avx2_decode_lut_tables_base64;
200 static address _lookup_lo_base64;
201 static address _lookup_hi_base64;
202 static address _lookup_lo_base64url;
203 static address _lookup_hi_base64url;
204 static address _pack_vec_base64;
205 static address _join_0_1_base64;
206 static address _join_1_2_base64;
207 static address _join_2_3_base64;
208 static address _decoding_table_base64;
209 #endif
210 // byte flip mask for sha256
211 static address _pshuffle_byte_flip_mask_addr;
212
213 public:
214 static address addr_mxcsr_std() { return (address)&_mxcsr_std; }
215 #ifdef _LP64
216 static address addr_mxcsr_rz() { return (address)&_mxcsr_rz; }
217 #endif // _LP64
218 static address verify_mxcsr_entry() { return _verify_mxcsr_entry; }
219 static address crc_by128_masks_addr() { return (address)_crc_by128_masks; }
220 #ifdef _LP64
221 static address crc_by128_masks_avx512_addr() { return (address)_crc_by128_masks_avx512; }
222 static address shuf_table_crc32_avx512_addr() { return (address)_shuf_table_crc32_avx512; }
223 static address crc_table_avx512_addr() { return (address)_crc_table_avx512; }
224 static address crc32c_table_avx512_addr() { return (address)_crc32c_table_avx512; }
225 #endif // _LP64
226 static address upper_word_mask_addr() { return _upper_word_mask_addr; }
227 static address shuffle_byte_flip_mask_addr() { return _shuffle_byte_flip_mask_addr; }
228 static address k256_addr() { return _k256_adr; }
229 static address method_entry_barrier() { return _method_entry_barrier; }
230
231 static address vector_short_to_byte_mask() {
232 return _vector_short_to_byte_mask;
233 }
234 static address vector_float_sign_mask() {
235 return _vector_float_sign_mask;
236 }
237
238 static address vector_float_sign_flip() {
239 return _vector_float_sign_flip;
240 }
241
242 static address vector_double_sign_mask() {
243 return _vector_double_sign_mask;
244 }
245
246 static address vector_double_sign_flip() {
247 return _vector_double_sign_flip;
248 }
249
250 static address vector_all_bits_set() {
251 return _vector_all_bits_set;
252 }
253
254 static address vector_int_mask_cmp_bits() {
255 return _vector_int_mask_cmp_bits;
256 }
257
258 static address vector_byte_perm_mask() {
259 return _vector_byte_perm_mask;
260 }
261
262 static address vector_int_to_byte_mask() {
263 return _vector_int_to_byte_mask;
264 }
265
266 static address vector_int_to_short_mask() {
267 return _vector_int_to_short_mask;
268 }
269
270 static address vector_32_bit_mask() {
271 return _vector_32_bit_mask;
272 }
273
274 static address vector_64_bit_mask() {
275 return _vector_64_bit_mask;
276 }
277
278 static address vector_int_shuffle_mask() {
279 return _vector_int_shuffle_mask;
280 }
281
282 static address vector_byte_shuffle_mask() {
283 return _vector_byte_shuffle_mask;
284 }
285
286 static address vector_short_shuffle_mask() {
287 return _vector_short_shuffle_mask;
288 }
289
290 static address vector_long_shuffle_mask() {
291 return _vector_long_shuffle_mask;
292 }
293
294 static address vector_long_sign_mask() {
295 return _vector_long_sign_mask;
296 }
297
298 static address vector_iota_indices() {
299 return _vector_iota_indices;
300 }
301
302 static address vector_count_leading_zeros_lut() {
303 return _vector_count_leading_zeros_lut;
304 }
305
306 static address vector_reverse_bit_lut() {
307 return _vector_reverse_bit_lut;
308 }
309
310 static address vector_reverse_byte_perm_mask_long() {
311 return _vector_reverse_byte_perm_mask_long;
312 }
313
314 static address vector_reverse_byte_perm_mask_int() {
315 return _vector_reverse_byte_perm_mask_int;
316 }
317
318 static address vector_reverse_byte_perm_mask_short() {
319 return _vector_reverse_byte_perm_mask_short;
320 }
321
322 static address vector_popcount_lut() {
323 return _vector_popcount_lut;
324 }
325 #ifdef _LP64
326 static address k256_W_addr() { return _k256_W_adr; }
327 static address k512_W_addr() { return _k512_W_addr; }
328 static address pshuffle_byte_flip_mask_addr_sha512() { return _pshuffle_byte_flip_mask_addr_sha512; }
329 static address base64_encoding_table_addr() { return _encoding_table_base64; }
330 static address base64_shuffle_addr() { return _shuffle_base64; }
331 static address base64_avx2_shuffle_addr() { return _avx2_shuffle_base64; }
332 static address base64_avx2_input_mask_addr() { return _avx2_input_mask_base64; }
333 static address base64_avx2_lut_addr() { return _avx2_lut_base64; }
334 static address base64_vbmi_lookup_lo_addr() { return _lookup_lo_base64; }
335 static address base64_vbmi_lookup_hi_addr() { return _lookup_hi_base64; }
336 static address base64_vbmi_lookup_lo_url_addr() { return _lookup_lo_base64url; }
337 static address base64_vbmi_lookup_hi_url_addr() { return _lookup_hi_base64url; }
338 static address base64_vbmi_pack_vec_addr() { return _pack_vec_base64; }
339 static address base64_vbmi_join_0_1_addr() { return _join_0_1_base64; }
340 static address base64_vbmi_join_1_2_addr() { return _join_1_2_base64; }
341 static address base64_vbmi_join_2_3_addr() { return _join_2_3_base64; }
342 static address base64_decoding_table_addr() { return _decoding_table_base64; }
343 static address base64_AVX2_decode_tables_addr() { return _avx2_decode_tables_base64; }
344 static address base64_AVX2_decode_LUT_tables_addr() { return _avx2_decode_lut_tables_base64; }
345 static address compress_perm_table32() { return _compress_perm_table32; }
346 static address compress_perm_table64() { return _compress_perm_table64; }
347 static address expand_perm_table32() { return _expand_perm_table32; }
348 static address expand_perm_table64() { return _expand_perm_table64; }
349 #endif
350 static address pshuffle_byte_flip_mask_addr() { return _pshuffle_byte_flip_mask_addr; }
351 static address arrays_hashcode_powers_of_31() { return (address)_arrays_hashcode_powers_of_31; }
352 static void generate_CRC32C_table(bool is_pclmulqdq_supported);
353 };
354
355 #endif // CPU_X86_STUBROUTINES_X86_HPP
--- EOF ---