< prev index next >

src/hotspot/cpu/x86/macroAssembler_x86.cpp

Print this page
rev 50140 : Vector cast support


4425   int dst_enc = dst->encoding();
4426   int nds_enc = nds->encoding();
4427   if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
4428     Assembler::vpaddw(dst, nds, src, vector_len);
4429   } else if (dst_enc < 16) {
4430     Assembler::vpaddw(dst, dst, src, vector_len);
4431   } else if (nds_enc < 16) {
4432     // implies dst_enc in upper bank with src as scratch
4433     evmovdqul(nds, dst, Assembler::AVX_512bit);
4434     Assembler::vpaddw(nds, nds, src, vector_len);
4435     evmovdqul(dst, nds, Assembler::AVX_512bit);
4436   } else {
4437     // worse case scenario, all regs in upper bank
4438     evmovdqul(nds, xmm0, Assembler::AVX_512bit);
4439     evmovdqul(xmm0, dst, Assembler::AVX_512bit);
4440     Assembler::vpaddw(xmm0, xmm0, src, vector_len);
4441     evmovdqul(xmm0, nds, Assembler::AVX_512bit);
4442   }
4443 }
4444 
4445 void MacroAssembler::vpand(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len) {
4446   if (reachable(src)) {
4447     Assembler::vpand(dst, nds, as_Address(src), vector_len);
4448   } else {
4449     lea(rscratch1, src);
4450     Assembler::vpand(dst, nds, Address(rscratch1, 0), vector_len);
4451   }
4452 }
4453 
4454 void MacroAssembler::vpbroadcastw(XMMRegister dst, XMMRegister src) {
4455   int dst_enc = dst->encoding();
4456   int src_enc = src->encoding();
4457   if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
4458     Assembler::vpbroadcastw(dst, src);
4459   } else if ((dst_enc < 16) && (src_enc < 16)) {
4460     Assembler::vpbroadcastw(dst, src);
4461   } else if (src_enc < 16) {
4462     subptr(rsp, 64);
4463     evmovdqul(Address(rsp, 0), xmm0, Assembler::AVX_512bit);
4464     evmovdqul(xmm0, dst, Assembler::AVX_512bit);
4465     Assembler::vpbroadcastw(xmm0, src);
4466     movdqu(dst, xmm0);
4467     evmovdqul(xmm0, Address(rsp, 0), Assembler::AVX_512bit);
4468     addptr(rsp, 64);
4469   } else if (dst_enc < 16) {
4470     subptr(rsp, 64);




4425   int dst_enc = dst->encoding();
4426   int nds_enc = nds->encoding();
4427   if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
4428     Assembler::vpaddw(dst, nds, src, vector_len);
4429   } else if (dst_enc < 16) {
4430     Assembler::vpaddw(dst, dst, src, vector_len);
4431   } else if (nds_enc < 16) {
4432     // implies dst_enc in upper bank with src as scratch
4433     evmovdqul(nds, dst, Assembler::AVX_512bit);
4434     Assembler::vpaddw(nds, nds, src, vector_len);
4435     evmovdqul(dst, nds, Assembler::AVX_512bit);
4436   } else {
4437     // worse case scenario, all regs in upper bank
4438     evmovdqul(nds, xmm0, Assembler::AVX_512bit);
4439     evmovdqul(xmm0, dst, Assembler::AVX_512bit);
4440     Assembler::vpaddw(xmm0, xmm0, src, vector_len);
4441     evmovdqul(xmm0, nds, Assembler::AVX_512bit);
4442   }
4443 }
4444 
4445 void MacroAssembler::vpand(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg) {
4446   if (reachable(src)) {
4447     Assembler::vpand(dst, nds, as_Address(src), vector_len);
4448   } else {
4449     lea(scratch_reg, src);
4450     Assembler::vpand(dst, nds, Address(scratch_reg, 0), vector_len);
4451   }
4452 }
4453 
4454 void MacroAssembler::vpbroadcastw(XMMRegister dst, XMMRegister src) {
4455   int dst_enc = dst->encoding();
4456   int src_enc = src->encoding();
4457   if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
4458     Assembler::vpbroadcastw(dst, src);
4459   } else if ((dst_enc < 16) && (src_enc < 16)) {
4460     Assembler::vpbroadcastw(dst, src);
4461   } else if (src_enc < 16) {
4462     subptr(rsp, 64);
4463     evmovdqul(Address(rsp, 0), xmm0, Assembler::AVX_512bit);
4464     evmovdqul(xmm0, dst, Assembler::AVX_512bit);
4465     Assembler::vpbroadcastw(xmm0, src);
4466     movdqu(dst, xmm0);
4467     evmovdqul(xmm0, Address(rsp, 0), Assembler::AVX_512bit);
4468     addptr(rsp, 64);
4469   } else if (dst_enc < 16) {
4470     subptr(rsp, 64);


< prev index next >