--- old/src/hotspot/cpu/x86/assembler_x86.cpp 2019-12-20 11:51:13.593792544 -0800 +++ new/src/hotspot/cpu/x86/assembler_x86.cpp 2019-12-20 11:51:13.453792545 -0800 @@ -4257,8 +4257,8 @@ void Assembler::vpshufd(XMMRegister dst, XMMRegister src, int mode, int vector_len) { assert(vector_len == AVX_128bit? VM_Version::supports_avx() : - vector_len == AVX_256bit? VM_Version::supports_avx2() : - 0, ""); + (vector_len == AVX_256bit? VM_Version::supports_avx2() : + (vector_len == AVX_512bit? VM_Version::supports_evex() : 0)), ""); NOT_LP64(assert(VM_Version::supports_sse2(), "")); InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true); int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes); @@ -4737,6 +4737,36 @@ emit_int8((unsigned char)(0xE8 | encode)); } +void Assembler::shldl(Register dst, Register src) { + int encode = prefix_and_encode(src->encoding(), dst->encoding()); + emit_int8(0x0F); + emit_int8((unsigned char)0xA5); + emit_int8((unsigned char)(0xC0 | encode)); +} + +void Assembler::shldl(Register dst, Register src, int8_t imm8) { + int encode = prefix_and_encode(src->encoding(), dst->encoding()); + emit_int8(0x0F); + emit_int8((unsigned char)0xA4); + emit_int8((unsigned char)(0xC0 | encode)); + emit_int8(imm8); +} + +void Assembler::shrdl(Register dst, Register src) { + int encode = prefix_and_encode(src->encoding(), dst->encoding()); + emit_int8(0x0F); + emit_int8((unsigned char)0xAD); + emit_int8((unsigned char)(0xC0 | encode)); +} + +void Assembler::shrdl(Register dst, Register src, int8_t imm8) { + int encode = prefix_and_encode(src->encoding(), dst->encoding()); + emit_int8(0x0F); + emit_int8((unsigned char)0xAC); + emit_int8((unsigned char)(0xC0 | encode)); + emit_int8(imm8); +} + // copies a single word from [esi] to [edi] void Assembler::smovl() { emit_int8((unsigned char)0xA5); @@ -6513,6 +6543,23 @@ emit_int8((unsigned char)(0xC0 | encode)); } +void Assembler::vpshldvd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) { + assert(VM_Version::support_vbmi2(), "requires vbmi2"); + InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true); + attributes.set_is_evex_instruction(); + int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes); + emit_int8(0x71); + emit_int8((unsigned char)(0xC0 | encode)); +} + +void Assembler::vpshrdvd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) { + assert(VM_Version::supports_vbmi2(), "requires vbmi2"); + InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true); + attributes.set_is_evex_instruction(); + int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes); + emit_int8(0x73); + emit_int8((unsigned char)(0xC0 | encode)); +} void Assembler::pandn(XMMRegister dst, XMMRegister src) { NOT_LP64(assert(VM_Version::supports_sse2(), "")); @@ -8109,26 +8156,6 @@ emit_int8((unsigned char)(0xE0 | dst->encoding())); } -void Assembler::shldl(Register dst, Register src) { - emit_int8(0x0F); - emit_int8((unsigned char)0xA5); - emit_int8((unsigned char)(0xC0 | src->encoding() << 3 | dst->encoding())); -} - -// 0F A4 / r ib -void Assembler::shldl(Register dst, Register src, int8_t imm8) { - emit_int8(0x0F); - emit_int8((unsigned char)0xA4); - emit_int8((unsigned char)(0xC0 | src->encoding() << 3 | dst->encoding())); - emit_int8(imm8); -} - -void Assembler::shrdl(Register dst, Register src) { - emit_int8(0x0F); - emit_int8((unsigned char)0xAD); - emit_int8((unsigned char)(0xC0 | src->encoding() << 3 | dst->encoding())); -} - #else // LP64 void Assembler::set_byte_if_not_zero(Register dst) {