Skip to content

Commit 7884eab

Browse files
Sandhya ViswanathanDerek White
Sandhya Viswanathan
authored and
Derek White
committed
8269404: Base64 Encoding optimization enhancements for x86 using AVX-512
Backport-of: 9cac94d581f240c10fe8fff2f803109a1ae30637
1 parent 07050b0 commit 7884eab

File tree

5 files changed

+475
-361
lines changed

5 files changed

+475
-361
lines changed

src/hotspot/cpu/x86/assembler_x86.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3758,6 +3758,15 @@ void Assembler::vpermb(XMMRegister dst, XMMRegister nds, XMMRegister src, int ve
37583758
emit_int16((unsigned char)0x8D, (0xC0 | encode));
37593759
}
37603760

3761+
void Assembler::vpermb(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
3762+
assert(VM_Version::supports_avx512_vbmi(), "");
3763+
InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
3764+
attributes.set_is_evex_instruction();
3765+
vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
3766+
emit_int8((unsigned char)0x8D);
3767+
emit_operand(dst, src);
3768+
}
3769+
37613770
void Assembler::vpermw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
37623771
assert(vector_len == AVX_128bit ? VM_Version::supports_avx512vlbw() :
37633772
vector_len == AVX_256bit ? VM_Version::supports_avx512vlbw() :
@@ -3838,6 +3847,14 @@ void Assembler::evpermt2b(XMMRegister dst, XMMRegister nds, XMMRegister src, int
38383847
emit_int16(0x7D, (0xC0 | encode));
38393848
}
38403849

3850+
void Assembler::evpmultishiftqb(XMMRegister dst, XMMRegister ctl, XMMRegister src, int vector_len) {
3851+
assert(VM_Version::supports_avx512_vbmi(), "");
3852+
InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
3853+
attributes.set_is_evex_instruction();
3854+
int encode = vex_prefix_and_encode(dst->encoding(), ctl->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
3855+
emit_int16((unsigned char)0x83, (unsigned char)(0xC0 | encode));
3856+
}
3857+
38413858
void Assembler::pause() {
38423859
emit_int16((unsigned char)0xF3, (unsigned char)0x90);
38433860
}
@@ -4136,6 +4153,15 @@ void Assembler::vpmovmskb(Register dst, XMMRegister src, int vec_enc) {
41364153
emit_int16((unsigned char)0xD7, (0xC0 | encode));
41374154
}
41384155

4156+
void Assembler::vpmaskmovd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
4157+
assert((VM_Version::supports_avx2() && vector_len == AVX_256bit), "");
4158+
InstructionMark im(this);
4159+
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ true);
4160+
vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
4161+
emit_int8((unsigned char)0x8C);
4162+
emit_operand(dst, src);
4163+
}
4164+
41394165
void Assembler::pextrd(Register dst, XMMRegister src, int imm8) {
41404166
assert(VM_Version::supports_sse4_1(), "");
41414167
InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);
@@ -6565,6 +6591,13 @@ void Assembler::psubq(XMMRegister dst, XMMRegister src) {
65656591
emit_int8((0xC0 | encode));
65666592
}
65676593

6594+
void Assembler::vpsubusb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
6595+
assert(UseAVX > 0, "requires some form of AVX");
6596+
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
6597+
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
6598+
emit_int16((unsigned char)0xD8, (0xC0 | encode));
6599+
}
6600+
65686601
void Assembler::vpsubb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
65696602
assert(UseAVX > 0, "requires some form of AVX");
65706603
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
@@ -6656,6 +6689,15 @@ void Assembler::pmuludq(XMMRegister dst, XMMRegister src) {
66566689
emit_int16((unsigned char)0xF4, (0xC0 | encode));
66576690
}
66586691

6692+
void Assembler::vpmulhuw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
6693+
assert((vector_len == AVX_128bit && VM_Version::supports_avx()) ||
6694+
(vector_len == AVX_256bit && VM_Version::supports_avx2()) ||
6695+
(vector_len == AVX_512bit && VM_Version::supports_avx512bw()), "");
6696+
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
6697+
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
6698+
emit_int16((unsigned char)0xE4, (0xC0 | encode));
6699+
}
6700+
66596701
void Assembler::vpmullw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
66606702
assert(UseAVX > 0, "requires some form of AVX");
66616703
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);

src/hotspot/cpu/x86/assembler_x86.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1690,6 +1690,7 @@ class Assembler : public AbstractAssembler {
16901690
void vpermq(XMMRegister dst, XMMRegister src, int imm8);
16911691
void vpermq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
16921692
void vpermb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1693+
void vpermb(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
16931694
void vpermw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
16941695
void vpermd(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
16951696
void vpermd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
@@ -1700,6 +1701,7 @@ class Assembler : public AbstractAssembler {
17001701
void vpermpd(XMMRegister dst, XMMRegister src, int imm8, int vector_len);
17011702
void evpermi2q(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
17021703
void evpermt2b(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1704+
void evpmultishiftqb(XMMRegister dst, XMMRegister ctl, XMMRegister src, int vector_len);
17031705

17041706
void pause();
17051707

@@ -1748,6 +1750,7 @@ class Assembler : public AbstractAssembler {
17481750

17491751
void pmovmskb(Register dst, XMMRegister src);
17501752
void vpmovmskb(Register dst, XMMRegister src, int vec_enc);
1753+
void vpmaskmovd(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
17511754

17521755
// SSE 4.1 extract
17531756
void pextrd(Register dst, XMMRegister src, int imm8);
@@ -2250,6 +2253,7 @@ class Assembler : public AbstractAssembler {
22502253
void psubw(XMMRegister dst, XMMRegister src);
22512254
void psubd(XMMRegister dst, XMMRegister src);
22522255
void psubq(XMMRegister dst, XMMRegister src);
2256+
void vpsubusb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
22532257
void vpsubb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
22542258
void vpsubw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
22552259
void vpsubd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
@@ -2270,6 +2274,7 @@ class Assembler : public AbstractAssembler {
22702274
void vpmullw(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
22712275
void vpmulld(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
22722276
void vpmullq(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
2277+
void vpmulhuw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
22732278

22742279
// Minimum of packed integers
22752280
void pminsb(XMMRegister dst, XMMRegister src);

0 commit comments

Comments
 (0)