1228 __ jcc(Assembler::negative, L); // NaN -> 0
1229 __ testq(c_rarg0, c_rarg0); // signed ? min_jlong : max_jlong
1230 __ mov64(c_rarg2, 0x8000000000000000);
1231 __ mov64(rax, 0x7fffffffffffffff);
1232 __ cmovq(Assembler::positive, c_rarg2, rax);
1233
1234 __ bind(L);
1235 __ movq(inout, c_rarg2);
1236
1237 __ pop(c_rarg0);
1238 __ pop(c_rarg1);
1239 __ pop(c_rarg2);
1240 __ pop(c_rarg3);
1241 __ pop(rax);
1242
1243 __ ret(0);
1244
1245 return start;
1246 }
1247
1248 address generate_fp_mask(const char *stub_name, int64_t mask) {
1249 __ align(CodeEntryAlignment);
1250 StubCodeMark mark(this, "StubRoutines", stub_name);
1251 address start = __ pc();
1252
1253 __ emit_data64( mask, relocInfo::none );
1254 __ emit_data64( mask, relocInfo::none );
1255
1256 return start;
1257 }
1258
1259 address generate_vector_fp_mask(const char *stub_name, int64_t mask) {
1260 __ align(CodeEntryAlignment);
1261 StubCodeMark mark(this, "StubRoutines", stub_name);
1262 address start = __ pc();
1263
1264 __ emit_data64(mask, relocInfo::none);
1265 __ emit_data64(mask, relocInfo::none);
1266 __ emit_data64(mask, relocInfo::none);
1267 __ emit_data64(mask, relocInfo::none);
6195 throw_AbstractMethodError));
6196
6197 StubRoutines::_throw_IncompatibleClassChangeError_entry =
6198 generate_throw_exception("IncompatibleClassChangeError throw_exception",
6199 CAST_FROM_FN_PTR(address,
6200 SharedRuntime::
6201 throw_IncompatibleClassChangeError));
6202
6203 StubRoutines::_throw_NullPointerException_at_call_entry =
6204 generate_throw_exception("NullPointerException at call throw_exception",
6205 CAST_FROM_FN_PTR(address,
6206 SharedRuntime::
6207 throw_NullPointerException_at_call));
6208
6209 // entry points that are platform specific
6210 StubRoutines::x86::_f2i_fixup = generate_f2i_fixup();
6211 StubRoutines::x86::_f2l_fixup = generate_f2l_fixup();
6212 StubRoutines::x86::_d2i_fixup = generate_d2i_fixup();
6213 StubRoutines::x86::_d2l_fixup = generate_d2l_fixup();
6214
6215 StubRoutines::x86::_float_sign_mask = generate_fp_mask("float_sign_mask", 0x7FFFFFFF7FFFFFFF);
6216 StubRoutines::x86::_float_sign_flip = generate_fp_mask("float_sign_flip", 0x8000000080000000);
6217 StubRoutines::x86::_double_sign_mask = generate_fp_mask("double_sign_mask", 0x7FFFFFFFFFFFFFFF);
6218 StubRoutines::x86::_double_sign_flip = generate_fp_mask("double_sign_flip", 0x8000000000000000);
6219 StubRoutines::x86::_vector_float_sign_mask = generate_vector_fp_mask("vector_float_sign_mask", 0x7FFFFFFF7FFFFFFF);
6220 StubRoutines::x86::_vector_float_sign_flip = generate_vector_fp_mask("vector_float_sign_flip", 0x8000000080000000);
6221 StubRoutines::x86::_vector_double_sign_mask = generate_vector_fp_mask("vector_double_sign_mask", 0x7FFFFFFFFFFFFFFF);
6222 StubRoutines::x86::_vector_double_sign_flip = generate_vector_fp_mask("vector_double_sign_flip", 0x8000000000000000);
6223 StubRoutines::x86::_vector_all_bits_set = generate_vector_fp_mask("vector_all_bits_set", 0xFFFFFFFFFFFFFFFF);
6224 StubRoutines::x86::_vector_byte_bitset = generate_vector_fp_mask("vector_byte_bitset", 0x0101010101010101);
6225 StubRoutines::x86::_vector_long_perm_mask = generate_vector_custom_i32("vector_long_perm_mask", Assembler::AVX_512bit,
6226 0, 2, 4, 6, 8, 10, 12, 14);
6227 StubRoutines::x86::_vector_short_to_byte_mask = generate_vector_fp_mask("vector_short_to_byte_mask", 0x00ff00ff00ff00ff);
6228 StubRoutines::x86::_vector_byte_perm_mask = generate_vector_byte_perm_mask("vector_byte_perm_mask");
6229 StubRoutines::x86::_vector_int_to_byte_mask = generate_vector_fp_mask("vector_int_to_byte_mask", 0x000000ff000000ff);
6230 StubRoutines::x86::_vector_int_to_short_mask = generate_vector_fp_mask("vector_int_to_short_mask", 0x0000ffff0000ffff);
6231 StubRoutines::x86::_vector_32_bit_mask = generate_vector_custom_i32("vector_32_bit_mask", Assembler::AVX_512bit,
6232 0xFFFFFFFF, 0, 0, 0);
6233 StubRoutines::x86::_vector_64_bit_mask = generate_vector_custom_i32("vector_64_bit_mask", Assembler::AVX_512bit,
6234 0xFFFFFFFF, 0xFFFFFFFF, 0, 0);
|
1228 __ jcc(Assembler::negative, L); // NaN -> 0
1229 __ testq(c_rarg0, c_rarg0); // signed ? min_jlong : max_jlong
1230 __ mov64(c_rarg2, 0x8000000000000000);
1231 __ mov64(rax, 0x7fffffffffffffff);
1232 __ cmovq(Assembler::positive, c_rarg2, rax);
1233
1234 __ bind(L);
1235 __ movq(inout, c_rarg2);
1236
1237 __ pop(c_rarg0);
1238 __ pop(c_rarg1);
1239 __ pop(c_rarg2);
1240 __ pop(c_rarg3);
1241 __ pop(rax);
1242
1243 __ ret(0);
1244
1245 return start;
1246 }
1247
1248 address generate_iota_indices(const char *stub_name) {
1249 __ align(CodeEntryAlignment);
1250 StubCodeMark mark(this, "StubRoutines", stub_name);
1251 address start = __ pc();
1252 __ emit_data64(0x0706050403020100, relocInfo::none);
1253 __ emit_data64(0x0F0E0D0C0B0A0908, relocInfo::none);
1254 __ emit_data64(0x1716151413121110, relocInfo::none);
1255 __ emit_data64(0x1F1E1D1C1B1A1918, relocInfo::none);
1256 __ emit_data64(0x2726252423222120, relocInfo::none);
1257 __ emit_data64(0x2F2E2D2C2B2A2928, relocInfo::none);
1258 __ emit_data64(0x3736353433323130, relocInfo::none);
1259 __ emit_data64(0x3F3E3D3C3B3A3938, relocInfo::none);
1260 return start;
1261 }
1262
1263 address generate_fp_mask(const char *stub_name, int64_t mask) {
1264 __ align(CodeEntryAlignment);
1265 StubCodeMark mark(this, "StubRoutines", stub_name);
1266 address start = __ pc();
1267
1268 __ emit_data64( mask, relocInfo::none );
1269 __ emit_data64( mask, relocInfo::none );
1270
1271 return start;
1272 }
1273
1274 address generate_vector_fp_mask(const char *stub_name, int64_t mask) {
1275 __ align(CodeEntryAlignment);
1276 StubCodeMark mark(this, "StubRoutines", stub_name);
1277 address start = __ pc();
1278
1279 __ emit_data64(mask, relocInfo::none);
1280 __ emit_data64(mask, relocInfo::none);
1281 __ emit_data64(mask, relocInfo::none);
1282 __ emit_data64(mask, relocInfo::none);
6210 throw_AbstractMethodError));
6211
6212 StubRoutines::_throw_IncompatibleClassChangeError_entry =
6213 generate_throw_exception("IncompatibleClassChangeError throw_exception",
6214 CAST_FROM_FN_PTR(address,
6215 SharedRuntime::
6216 throw_IncompatibleClassChangeError));
6217
6218 StubRoutines::_throw_NullPointerException_at_call_entry =
6219 generate_throw_exception("NullPointerException at call throw_exception",
6220 CAST_FROM_FN_PTR(address,
6221 SharedRuntime::
6222 throw_NullPointerException_at_call));
6223
6224 // entry points that are platform specific
6225 StubRoutines::x86::_f2i_fixup = generate_f2i_fixup();
6226 StubRoutines::x86::_f2l_fixup = generate_f2l_fixup();
6227 StubRoutines::x86::_d2i_fixup = generate_d2i_fixup();
6228 StubRoutines::x86::_d2l_fixup = generate_d2l_fixup();
6229
6230 StubRoutines::x86::_vector_iota_indices = generate_iota_indices("iota_indices");
6231 StubRoutines::x86::_float_sign_mask = generate_fp_mask("float_sign_mask", 0x7FFFFFFF7FFFFFFF);
6232 StubRoutines::x86::_float_sign_flip = generate_fp_mask("float_sign_flip", 0x8000000080000000);
6233 StubRoutines::x86::_double_sign_mask = generate_fp_mask("double_sign_mask", 0x7FFFFFFFFFFFFFFF);
6234 StubRoutines::x86::_double_sign_flip = generate_fp_mask("double_sign_flip", 0x8000000000000000);
6235 StubRoutines::x86::_vector_float_sign_mask = generate_vector_fp_mask("vector_float_sign_mask", 0x7FFFFFFF7FFFFFFF);
6236 StubRoutines::x86::_vector_float_sign_flip = generate_vector_fp_mask("vector_float_sign_flip", 0x8000000080000000);
6237 StubRoutines::x86::_vector_double_sign_mask = generate_vector_fp_mask("vector_double_sign_mask", 0x7FFFFFFFFFFFFFFF);
6238 StubRoutines::x86::_vector_double_sign_flip = generate_vector_fp_mask("vector_double_sign_flip", 0x8000000000000000);
6239 StubRoutines::x86::_vector_all_bits_set = generate_vector_fp_mask("vector_all_bits_set", 0xFFFFFFFFFFFFFFFF);
6240 StubRoutines::x86::_vector_byte_bitset = generate_vector_fp_mask("vector_byte_bitset", 0x0101010101010101);
6241 StubRoutines::x86::_vector_long_perm_mask = generate_vector_custom_i32("vector_long_perm_mask", Assembler::AVX_512bit,
6242 0, 2, 4, 6, 8, 10, 12, 14);
6243 StubRoutines::x86::_vector_short_to_byte_mask = generate_vector_fp_mask("vector_short_to_byte_mask", 0x00ff00ff00ff00ff);
6244 StubRoutines::x86::_vector_byte_perm_mask = generate_vector_byte_perm_mask("vector_byte_perm_mask");
6245 StubRoutines::x86::_vector_int_to_byte_mask = generate_vector_fp_mask("vector_int_to_byte_mask", 0x000000ff000000ff);
6246 StubRoutines::x86::_vector_int_to_short_mask = generate_vector_fp_mask("vector_int_to_short_mask", 0x0000ffff0000ffff);
6247 StubRoutines::x86::_vector_32_bit_mask = generate_vector_custom_i32("vector_32_bit_mask", Assembler::AVX_512bit,
6248 0xFFFFFFFF, 0, 0, 0);
6249 StubRoutines::x86::_vector_64_bit_mask = generate_vector_custom_i32("vector_64_bit_mask", Assembler::AVX_512bit,
6250 0xFFFFFFFF, 0xFFFFFFFF, 0, 0);
|