@@ -3555,6 +3555,14 @@ void Assembler::movsd(Address dst, XMMRegister src) {
35553555 emit_operand(src, dst, 0);
35563556}
35573557
3558+ void Assembler::vmovsd(XMMRegister dst, XMMRegister src, XMMRegister src2) {
3559+ assert(UseAVX > 0, "Requires some form of AVX");
3560+ InstructionMark im(this);
3561+ InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
3562+ int encode = vex_prefix_and_encode(src2->encoding(), src->encoding(), dst->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);
3563+ emit_int16(0x11, (0xC0 | encode));
3564+ }
3565+
35583566void Assembler::movss(XMMRegister dst, XMMRegister src) {
35593567 NOT_LP64(assert(VM_Version::supports_sse(), ""));
35603568 InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
@@ -6547,6 +6555,29 @@ void Assembler::vfmadd231sd(XMMRegister dst, XMMRegister src1, XMMRegister src2)
65476555 emit_int16((unsigned char)0xB9, (0xC0 | encode));
65486556}
65496557
6558+ void Assembler::evfnmadd213sd(XMMRegister dst, XMMRegister src1, XMMRegister src2, EvexRoundPrefix rmode) { // Need to add rmode for rounding mode support
6559+ assert(VM_Version::supports_evex(), "");
6560+ InstructionAttr attributes(rmode, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
6561+ attributes.set_extended_context();
6562+ attributes.set_is_evex_instruction();
6563+ int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
6564+ emit_int16((unsigned char)0xAD, (0xC0 | encode));
6565+ }
6566+
6567+ void Assembler::vfnmadd213sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) {
6568+ assert(VM_Version::supports_fma(), "");
6569+ InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
6570+ int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
6571+ emit_int16((unsigned char)0xAD, (0xC0 | encode));
6572+ }
6573+
6574+ void Assembler::vfnmadd231sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) {
6575+ assert(VM_Version::supports_fma(), "");
6576+ InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
6577+ int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
6578+ emit_int16((unsigned char)0xBD, (0xC0 | encode));
6579+ }
6580+
65506581void Assembler::vfmadd231ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) {
65516582 assert(VM_Version::supports_fma(), "");
65526583 InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
@@ -6908,6 +6939,22 @@ void Assembler::vroundpd(XMMRegister dst, Address src, int32_t rmode, int vecto
69086939 emit_int8((rmode));
69096940}
69106941
6942+ void Assembler::vroundsd(XMMRegister dst, XMMRegister src, XMMRegister src2, int32_t rmode) {
6943+ assert(VM_Version::supports_avx(), "");
6944+ assert(rmode <= 0x0f, "rmode 0x%x", rmode);
6945+ InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
6946+ int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
6947+ emit_int24(0x0B, (0xC0 | encode), (rmode));
6948+ }
6949+
6950+ void Assembler::vrndscalesd(XMMRegister dst, XMMRegister src1, XMMRegister src2, int32_t rmode) {
6951+ assert(VM_Version::supports_evex(), "requires EVEX support");
6952+ InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
6953+ attributes.set_is_evex_instruction();
6954+ int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
6955+ emit_int24(0x0B, (0xC0 | encode), (rmode));
6956+ }
6957+
69116958void Assembler::vrndscalepd(XMMRegister dst, XMMRegister src, int32_t rmode, int vector_len) {
69126959 assert(VM_Version::supports_evex(), "requires EVEX support");
69136960 InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
@@ -8873,6 +8920,19 @@ void Assembler::vextractf64x4(Address dst, XMMRegister src, uint8_t imm8) {
88738920 emit_int8(imm8 & 0x01);
88748921}
88758922
8923+ void Assembler::extractps(Register dst, XMMRegister src, uint8_t imm8) {
8924+ assert(VM_Version::supports_sse4_1(), "");
8925+ assert(imm8 <= 0x03, "imm8: %u", imm8);
8926+ InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
8927+ int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
8928+ // imm8:
8929+ // 0x00 - extract from bits 31:0
8930+ // 0x01 - extract from bits 63:32
8931+ // 0x02 - extract from bits 95:64
8932+ // 0x03 - extract from bits 127:96
8933+ emit_int24(0x17, (0xC0 | encode), imm8 & 0x03);
8934+ }
8935+
88768936// duplicate 1-byte integer data from src into programmed locations in dest : requires AVX512BW and AVX512VL
88778937void Assembler::vpbroadcastb(XMMRegister dst, XMMRegister src, int vector_len) {
88788938 assert(VM_Version::supports_avx2(), "");
@@ -9547,6 +9607,15 @@ void Assembler::evdivpd(XMMRegister dst, KRegister mask, XMMRegister nds, Addres
95479607 emit_operand(dst, src, 0);
95489608}
95499609
9610+ void Assembler::evdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src, EvexRoundPrefix rmode) {
9611+ assert(VM_Version::supports_evex(), "");
9612+ InstructionAttr attributes(rmode, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
9613+ attributes.set_extended_context();
9614+ attributes.set_is_evex_instruction();
9615+ int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);
9616+ emit_int16(0x5E, (0xC0 | encode));
9617+ }
9618+
95509619void Assembler::evpabsb(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {
95519620 assert(VM_Version::supports_avx512bw() && (vector_len == AVX_512bit || VM_Version::supports_avx512vl()), "");
95529621 InstructionAttr attributes(vector_len, /* vex_w */ false,/* legacy_mode */ false, /* no_mask_reg */ false,/* uses_vl */ true);
0 commit comments