< prev index next >

src/cpu/x86/vm/assembler_x86.cpp

Print this page




3078 }
3079 
3080 void Assembler::pshuflw(XMMRegister dst, Address src, int mode) {
3081   assert(isByte(mode), "invalid value");
3082   NOT_LP64(assert(VM_Version::supports_sse2(), ""));
3083   assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");
3084   if (VM_Version::supports_evex()) {
3085     tuple_type = EVEX_FVM;
3086   }
3087   InstructionMark im(this);
3088   simd_prefix(dst, xnoreg, src, VEX_SIMD_F2, false, VEX_OPCODE_0F,
3089               false, AVX_128bit, (VM_Version::supports_avx512bw() == false));
3090   emit_int8(0x70);
3091   emit_operand(dst, src);
3092   emit_int8(mode & 0xFF);
3093 }
3094 
3095 void Assembler::psrldq(XMMRegister dst, int shift) {
3096   // Shift 128 bit value in xmm register by number of bytes.
3097   NOT_LP64(assert(VM_Version::supports_sse2(), ""));
3098   int encode = simd_prefix_and_encode(xmm3, dst, dst, VEX_SIMD_66, true, VEX_OPCODE_0F,
3099                                       false, AVX_128bit, (VM_Version::supports_avx512bw() == false));








3100   emit_int8(0x73);
3101   emit_int8((unsigned char)(0xC0 | encode));
3102   emit_int8(shift);
3103 }
3104 
3105 void Assembler::ptest(XMMRegister dst, Address src) {
3106   assert(VM_Version::supports_sse4_1(), "");
3107   assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");
3108   InstructionMark im(this);
3109   simd_prefix(dst, src, VEX_SIMD_66, false, VEX_OPCODE_0F_38);
3110   emit_int8(0x17);
3111   emit_operand(dst, src);
3112 }
3113 
3114 void Assembler::ptest(XMMRegister dst, XMMRegister src) {
3115   assert(VM_Version::supports_sse4_1(), "");
3116   int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66,
3117                                       false, VEX_OPCODE_0F_38);
3118   emit_int8(0x17);
3119   emit_int8((unsigned char)(0xC0 | encode));




3078 }
3079 
3080 void Assembler::pshuflw(XMMRegister dst, Address src, int mode) {
3081   assert(isByte(mode), "invalid value");
3082   NOT_LP64(assert(VM_Version::supports_sse2(), ""));
3083   assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");
3084   if (VM_Version::supports_evex()) {
3085     tuple_type = EVEX_FVM;
3086   }
3087   InstructionMark im(this);
3088   simd_prefix(dst, xnoreg, src, VEX_SIMD_F2, false, VEX_OPCODE_0F,
3089               false, AVX_128bit, (VM_Version::supports_avx512bw() == false));
3090   emit_int8(0x70);
3091   emit_operand(dst, src);
3092   emit_int8(mode & 0xFF);
3093 }
3094 
3095 void Assembler::psrldq(XMMRegister dst, int shift) {
3096   // Shift 128 bit value in xmm register by number of bytes.
3097   NOT_LP64(assert(VM_Version::supports_sse2(), ""));
3098   int encode = simd_prefix_and_encode(xmm3, dst, dst, VEX_SIMD_66, true, VEX_OPCODE_0F, false, AVX_128bit, (VM_Version::supports_avx512bw() == false));
3099   emit_int8(0x73);
3100   emit_int8((unsigned char)(0xC0 | encode));
3101   emit_int8(shift);
3102 }
3103 
3104 void Assembler::pslldq(XMMRegister dst, int shift) {
3105   // Shift left 128 bit value in xmm register by number of bytes.
3106   NOT_LP64(assert(VM_Version::supports_sse2(), ""));
3107   int encode = simd_prefix_and_encode(xmm7, dst, dst, VEX_SIMD_66, true, VEX_OPCODE_0F, false, AVX_128bit, (VM_Version::supports_avx512bw() == false));
3108   emit_int8(0x73);
3109   emit_int8((unsigned char)(0xC0 | encode));
3110   emit_int8(shift);
3111 }
3112 
3113 void Assembler::ptest(XMMRegister dst, Address src) {
3114   assert(VM_Version::supports_sse4_1(), "");
3115   assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");
3116   InstructionMark im(this);
3117   simd_prefix(dst, src, VEX_SIMD_66, false, VEX_OPCODE_0F_38);
3118   emit_int8(0x17);
3119   emit_operand(dst, src);
3120 }
3121 
3122 void Assembler::ptest(XMMRegister dst, XMMRegister src) {
3123   assert(VM_Version::supports_sse4_1(), "");
3124   int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66,
3125                                       false, VEX_OPCODE_0F_38);
3126   emit_int8(0x17);
3127   emit_int8((unsigned char)(0xC0 | encode));


< prev index next >