--- old/src/cpu/x86/vm/assembler_x86.cpp 2015-10-30 19:14:44.176475408 +0100 +++ new/src/cpu/x86/vm/assembler_x86.cpp 2015-10-30 19:14:44.108475406 +0100 @@ -3027,6 +3027,35 @@ emit_int8(imm8); } +void Assembler::pcmpeqw(XMMRegister dst, XMMRegister src) { + NOT_LP64(assert(VM_Version::supports_sse2(), "")); + emit_simd_arith(0x75, dst, src, VEX_SIMD_66, + false, (VM_Version::supports_avx512dq() == false)); +} + +void Assembler::vpcmpeqw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { + assert(UseAVX > 0, "some form of AVX must be enabled"); + emit_vex_arith(0x75, dst, nds, src, VEX_SIMD_66, vector_len, + false, (VM_Version::supports_avx512dq() == false)); +} + +void Assembler::pmovmskb(Register dst, XMMRegister src) { + assert(VM_Version::supports_sse2(), ""); + int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_66, true, VEX_OPCODE_0F, + false, AVX_128bit, (VM_Version::supports_avx512dq() == false)); + emit_int8((unsigned char)0xD7); + emit_int8((unsigned char)(0xC0 | encode)); +} + +void Assembler::vpmovmskb(Register dst, XMMRegister src) { + assert(VM_Version::supports_avx2(), ""); + int vector_len = AVX_256bit; + int encode = vex_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_66, + vector_len, VEX_OPCODE_0F, true, false); + emit_int8((unsigned char)0xD7); + emit_int8((unsigned char)(0xC0 | encode)); +} + void Assembler::pextrd(Register dst, XMMRegister src, int imm8) { assert(VM_Version::supports_sse4_1(), ""); int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_66, /* no_mask_reg */ true, @@ -3099,6 +3128,17 @@ emit_int8((unsigned char)(0xC0 | encode)); } +void Assembler::vpmovzxbw(XMMRegister dst, Address src) { + assert(VM_Version::supports_avx(), ""); + InstructionMark im(this); + bool vector256 = true; + assert(dst != xnoreg, "sanity"); + int dst_enc = dst->encoding(); + vex_prefix(src, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, false, vector256); + emit_int8(0x30); + emit_operand(dst, src); +} + // generic void Assembler::pop(Register dst) { int encode = prefix_and_encode(dst->encoding()); @@ -5347,6 +5387,16 @@ emit_int8((unsigned char)(0xC0 | encode)); } +// duplicate 2-bytes integer data from src into 16 locations in dest +void Assembler::vpbroadcastw(XMMRegister dst, XMMRegister src) { + assert(VM_Version::supports_avx2(), ""); + bool vector_len = AVX_256bit; + int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, + vector_len, VEX_OPCODE_0F_38, false); + emit_int8(0x79); + emit_int8((unsigned char)(0xC0 | encode)); +} + // duplicate 1-byte integer data from src into 16||32|64 locations in dest : requires AVX512BW and AVX512VL void Assembler::evpbroadcastb(XMMRegister dst, XMMRegister src, int vector_len) { _instruction_uses_vl = true;