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);
|