< prev index next >
src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp
Print this page
*** 1132,1163 ****
}
}
void C2_MacroAssembler::varshiftd(int opcode, XMMRegister dst, XMMRegister src, XMMRegister shift, int vlen_enc) {
switch (opcode) {
! case Op_VRShiftV: vpsravd(dst, src, shift, vlen_enc); break;
! case Op_VLShiftV: vpsllvd(dst, src, shift, vlen_enc); break;
! case Op_VURShiftV: vpsrlvd(dst, src, shift, vlen_enc); break;
default: assert(false, "%s", NodeClassNames[opcode]);
}
}
void C2_MacroAssembler::varshiftw(int opcode, XMMRegister dst, XMMRegister src, XMMRegister shift, int vlen_enc) {
switch (opcode) {
! case Op_VRShiftV: evpsravw(dst, src, shift, vlen_enc); break;
! case Op_VLShiftV: evpsllvw(dst, src, shift, vlen_enc); break;
! case Op_VURShiftV: evpsrlvw(dst, src, shift, vlen_enc); break;
default: assert(false, "%s", NodeClassNames[opcode]);
}
}
void C2_MacroAssembler::varshiftq(int opcode, XMMRegister dst, XMMRegister src, XMMRegister shift, int vlen_enc, XMMRegister tmp) {
assert(UseAVX >= 2, "required");
switch (opcode) {
! case Op_VRShiftV: {
if (UseAVX > 2) {
assert(tmp == xnoreg, "not used");
if (!VM_Version::supports_avx512vl()) {
vlen_enc = Assembler::AVX_512bit;
}
--- 1132,1176 ----
}
}
void C2_MacroAssembler::varshiftd(int opcode, XMMRegister dst, XMMRegister src, XMMRegister shift, int vlen_enc) {
switch (opcode) {
! case Op_RShiftVB: // fall-through
! case Op_RShiftVS: // fall-through
! case Op_RShiftVI: vpsravd(dst, src, shift, vlen_enc); break;
!
! case Op_LShiftVB: // fall-through
! case Op_LShiftVS: // fall-through
! case Op_LShiftVI: vpsllvd(dst, src, shift, vlen_enc); break;
!
! case Op_URShiftVB: // fall-through
! case Op_URShiftVS: // fall-through
! case Op_URShiftVI: vpsrlvd(dst, src, shift, vlen_enc); break;
default: assert(false, "%s", NodeClassNames[opcode]);
}
}
void C2_MacroAssembler::varshiftw(int opcode, XMMRegister dst, XMMRegister src, XMMRegister shift, int vlen_enc) {
switch (opcode) {
! case Op_RShiftVB: // fall-through
! case Op_RShiftVS: evpsravw(dst, src, shift, vlen_enc); break;
!
! case Op_LShiftVB: // fall-through
! case Op_LShiftVS: evpsllvw(dst, src, shift, vlen_enc); break;
!
! case Op_URShiftVB: // fall-through
! case Op_URShiftVS: evpsrlvw(dst, src, shift, vlen_enc); break;
default: assert(false, "%s", NodeClassNames[opcode]);
}
}
void C2_MacroAssembler::varshiftq(int opcode, XMMRegister dst, XMMRegister src, XMMRegister shift, int vlen_enc, XMMRegister tmp) {
assert(UseAVX >= 2, "required");
switch (opcode) {
! case Op_RShiftVL: {
if (UseAVX > 2) {
assert(tmp == xnoreg, "not used");
if (!VM_Version::supports_avx512vl()) {
vlen_enc = Assembler::AVX_512bit;
}
*** 1169,1195 ****
vpxor(dst, dst, tmp, vlen_enc);
vpsubq(dst, dst, tmp, vlen_enc);
}
break;
}
! case Op_VLShiftV: {
assert(tmp == xnoreg, "not used");
vpsllvq(dst, src, shift, vlen_enc);
break;
}
! case Op_VURShiftV: {
assert(tmp == xnoreg, "not used");
vpsrlvq(dst, src, shift, vlen_enc);
break;
}
default: assert(false, "%s", NodeClassNames[opcode]);
}
}
// Variable shift src by shift using vtmp and scratch as TEMPs giving word result in dst
void C2_MacroAssembler::varshiftbw(int opcode, XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len, XMMRegister vtmp, Register scratch) {
! bool sign = (opcode == Op_VURShiftV) ? false : true;
assert(vector_len == 0, "required");
vextendbd(sign, dst, src, 1);
vpmovzxbd(vtmp, shift, 1);
varshiftd(opcode, dst, dst, vtmp, 1);
vpand(dst, dst, ExternalAddress(StubRoutines::x86::vector_int_to_byte_mask()), 1, scratch);
--- 1182,1211 ----
vpxor(dst, dst, tmp, vlen_enc);
vpsubq(dst, dst, tmp, vlen_enc);
}
break;
}
! case Op_LShiftVL: {
assert(tmp == xnoreg, "not used");
vpsllvq(dst, src, shift, vlen_enc);
break;
}
! case Op_URShiftVL: {
assert(tmp == xnoreg, "not used");
vpsrlvq(dst, src, shift, vlen_enc);
break;
}
default: assert(false, "%s", NodeClassNames[opcode]);
}
}
// Variable shift src by shift using vtmp and scratch as TEMPs giving word result in dst
void C2_MacroAssembler::varshiftbw(int opcode, XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len, XMMRegister vtmp, Register scratch) {
! assert(opcode == Op_LShiftVB ||
! opcode == Op_RShiftVB ||
! opcode == Op_URShiftVB, "%s", NodeClassNames[opcode]);
! bool sign = (opcode != Op_URShiftVB);
assert(vector_len == 0, "required");
vextendbd(sign, dst, src, 1);
vpmovzxbd(vtmp, shift, 1);
varshiftd(opcode, dst, dst, vtmp, 1);
vpand(dst, dst, ExternalAddress(StubRoutines::x86::vector_int_to_byte_mask()), 1, scratch);
*** 1197,1207 ****
vpackusdw(dst, dst, vtmp, 0);
}
// Variable shift src by shift using vtmp and scratch as TEMPs giving byte result in dst
void C2_MacroAssembler::evarshiftb(int opcode, XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len, XMMRegister vtmp, Register scratch) {
! bool sign = (opcode == Op_VURShiftV) ? false : true;
int ext_vector_len = vector_len + 1;
vextendbw(sign, dst, src, ext_vector_len);
vpmovzxbw(vtmp, shift, ext_vector_len);
varshiftw(opcode, dst, dst, vtmp, ext_vector_len);
vpand(dst, dst, ExternalAddress(StubRoutines::x86::vector_short_to_byte_mask()), ext_vector_len, scratch);
--- 1213,1226 ----
vpackusdw(dst, dst, vtmp, 0);
}
// Variable shift src by shift using vtmp and scratch as TEMPs giving byte result in dst
void C2_MacroAssembler::evarshiftb(int opcode, XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len, XMMRegister vtmp, Register scratch) {
! assert(opcode == Op_LShiftVB ||
! opcode == Op_RShiftVB ||
! opcode == Op_URShiftVB, "%s", NodeClassNames[opcode]);
! bool sign = (opcode != Op_URShiftVB);
int ext_vector_len = vector_len + 1;
vextendbw(sign, dst, src, ext_vector_len);
vpmovzxbw(vtmp, shift, ext_vector_len);
varshiftw(opcode, dst, dst, vtmp, ext_vector_len);
vpand(dst, dst, ExternalAddress(StubRoutines::x86::vector_short_to_byte_mask()), ext_vector_len, scratch);
< prev index next >