Skip to content

Commit 2ceb80c

Browse files
author
Jatin Bhateja
committed
8288043: Optimize FP to word/sub-word integral type conversion on X86 AVX2 platforms
Reviewed-by: kvn, sviswanathan
1 parent 703a6ef commit 2ceb80c

File tree

10 files changed

+940
-199
lines changed

10 files changed

+940
-199
lines changed

src/hotspot/cpu/x86/assembler_x86.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2157,6 +2157,13 @@ void Assembler::vcvttps2dq(XMMRegister dst, XMMRegister src, int vector_len) {
21572157
emit_int16(0x5B, (0xC0 | encode));
21582158
}
21592159

2160+
void Assembler::vcvttpd2dq(XMMRegister dst, XMMRegister src, int vector_len) {
2161+
assert(vector_len <= AVX_256bit ? VM_Version::supports_avx() : VM_Version::supports_evex(), "");
2162+
InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
2163+
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
2164+
emit_int16((unsigned char)0xE6, (0xC0 | encode));
2165+
}
2166+
21602167
void Assembler::vcvtps2dq(XMMRegister dst, XMMRegister src, int vector_len) {
21612168
assert(vector_len <= AVX_256bit ? VM_Version::supports_avx() : VM_Version::supports_evex(), "");
21622169
InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
@@ -2165,47 +2172,47 @@ void Assembler::vcvtps2dq(XMMRegister dst, XMMRegister src, int vector_len) {
21652172
}
21662173

21672174
void Assembler::evcvttps2qq(XMMRegister dst, XMMRegister src, int vector_len) {
2168-
assert(UseAVX > 2 && VM_Version::supports_avx512dq(), "");
2175+
assert(VM_Version::supports_avx512dq(), "");
21692176
InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
21702177
attributes.set_is_evex_instruction();
21712178
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
21722179
emit_int16(0x7A, (0xC0 | encode));
21732180
}
21742181

21752182
void Assembler::evcvtpd2qq(XMMRegister dst, XMMRegister src, int vector_len) {
2176-
assert(UseAVX > 2 && VM_Version::supports_avx512dq(), "");
2183+
assert(VM_Version::supports_avx512dq(), "");
21772184
InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
21782185
attributes.set_is_evex_instruction();
21792186
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
21802187
emit_int16(0x7B, (0xC0 | encode));
21812188
}
21822189

21832190
void Assembler::evcvtqq2ps(XMMRegister dst, XMMRegister src, int vector_len) {
2184-
assert(UseAVX > 2 && VM_Version::supports_avx512dq(), "");
2191+
assert(VM_Version::supports_avx512dq(), "");
21852192
InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
21862193
attributes.set_is_evex_instruction();
21872194
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);
21882195
emit_int16(0x5B, (0xC0 | encode));
21892196
}
21902197

21912198
void Assembler::evcvttpd2qq(XMMRegister dst, XMMRegister src, int vector_len) {
2192-
assert(UseAVX > 2 && VM_Version::supports_avx512dq(), "");
2199+
assert(VM_Version::supports_avx512dq(), "");
21932200
InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
21942201
attributes.set_is_evex_instruction();
21952202
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
21962203
emit_int16(0x7A, (0xC0 | encode));
21972204
}
21982205

21992206
void Assembler::evcvtqq2pd(XMMRegister dst, XMMRegister src, int vector_len) {
2200-
assert(UseAVX > 2 && VM_Version::supports_avx512dq(), "");
2207+
assert(VM_Version::supports_avx512dq(), "");
22012208
InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
22022209
attributes.set_is_evex_instruction();
22032210
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);
22042211
emit_int16((unsigned char)0xE6, (0xC0 | encode));
22052212
}
22062213

22072214
void Assembler::evpmovwb(XMMRegister dst, XMMRegister src, int vector_len) {
2208-
assert(UseAVX > 2 && VM_Version::supports_avx512bw(), "");
2215+
assert(VM_Version::supports_avx512bw(), "");
22092216
InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
22102217
attributes.set_is_evex_instruction();
22112218
int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);

src/hotspot/cpu/x86/assembler_x86.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,6 +1201,9 @@ class Assembler : public AbstractAssembler {
12011201
void evcvtpd2qq(XMMRegister dst, XMMRegister src, int vector_len);
12021202
void evcvttpd2qq(XMMRegister dst, XMMRegister src, int vector_len);
12031203

1204+
// Convert vector double to int
1205+
void vcvttpd2dq(XMMRegister dst, XMMRegister src, int vector_len);
1206+
12041207
// Evex casts with truncation
12051208
void evpmovwb(XMMRegister dst, XMMRegister src, int vector_len);
12061209
void evpmovdw(XMMRegister dst, XMMRegister src, int vector_len);

0 commit comments

Comments
 (0)