mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-16 00:54:38 +02:00
8284813: x86 Code cleanup related to move instructions.
Reviewed-by: kvn, sviswanathan
This commit is contained in:
parent
d43ae723b8
commit
3092b5615d
8 changed files with 123 additions and 152 deletions
|
@ -3021,53 +3021,27 @@ void Assembler::vmovdqu(Address dst, XMMRegister src) {
|
|||
}
|
||||
|
||||
// Move Unaligned EVEX enabled Vector (programmable : 8,16,32,64)
|
||||
void Assembler::evmovdqub(XMMRegister dst, XMMRegister src, bool merge, int vector_len) {
|
||||
assert(VM_Version::supports_evex(), "");
|
||||
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
|
||||
void Assembler::evmovdqub(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {
|
||||
assert(VM_Version::supports_avx512vlbw(), "");
|
||||
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);
|
||||
attributes.set_embedded_opmask_register_specifier(mask);
|
||||
attributes.set_is_evex_instruction();
|
||||
if (merge) {
|
||||
attributes.reset_is_clear_context();
|
||||
}
|
||||
int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;
|
||||
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);
|
||||
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);
|
||||
emit_int16(0x6F, (0xC0 | encode));
|
||||
}
|
||||
|
||||
void Assembler::evmovdqub(XMMRegister dst, Address src, bool merge, int vector_len) {
|
||||
assert(VM_Version::supports_evex(), "");
|
||||
InstructionMark im(this);
|
||||
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
|
||||
int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;
|
||||
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
|
||||
attributes.set_is_evex_instruction();
|
||||
if (merge) {
|
||||
attributes.reset_is_clear_context();
|
||||
}
|
||||
vex_prefix(src, 0, dst->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);
|
||||
emit_int8(0x6F);
|
||||
emit_operand(dst, src);
|
||||
}
|
||||
|
||||
void Assembler::evmovdqub(Address dst, XMMRegister src, bool merge, int vector_len) {
|
||||
assert(VM_Version::supports_evex(), "");
|
||||
assert(src != xnoreg, "sanity");
|
||||
InstructionMark im(this);
|
||||
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
|
||||
int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;
|
||||
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
|
||||
attributes.set_is_evex_instruction();
|
||||
if (merge) {
|
||||
attributes.reset_is_clear_context();
|
||||
}
|
||||
vex_prefix(dst, 0, src->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);
|
||||
emit_int8(0x7F);
|
||||
emit_operand(src, dst);
|
||||
void Assembler::evmovdqub(XMMRegister dst, XMMRegister src, int vector_len) {
|
||||
// Unmasked instruction
|
||||
evmovdqub(dst, k0, src, /*merge*/ false, vector_len);
|
||||
}
|
||||
|
||||
void Assembler::evmovdqub(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) {
|
||||
assert(VM_Version::supports_avx512vlbw(), "");
|
||||
InstructionMark im(this);
|
||||
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
|
||||
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);
|
||||
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
|
||||
attributes.set_embedded_opmask_register_specifier(mask);
|
||||
attributes.set_is_evex_instruction();
|
||||
|
@ -3079,11 +3053,16 @@ void Assembler::evmovdqub(XMMRegister dst, KRegister mask, Address src, bool mer
|
|||
emit_operand(dst, src);
|
||||
}
|
||||
|
||||
void Assembler::evmovdqub(XMMRegister dst, Address src, int vector_len) {
|
||||
// Unmasked instruction
|
||||
evmovdqub(dst, k0, src, /*merge*/ false, vector_len);
|
||||
}
|
||||
|
||||
void Assembler::evmovdqub(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {
|
||||
assert(VM_Version::supports_avx512vlbw(), "");
|
||||
assert(src != xnoreg, "sanity");
|
||||
InstructionMark im(this);
|
||||
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
|
||||
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);
|
||||
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
|
||||
attributes.set_embedded_opmask_register_specifier(mask);
|
||||
attributes.set_is_evex_instruction();
|
||||
|
@ -3095,25 +3074,15 @@ void Assembler::evmovdqub(Address dst, KRegister mask, XMMRegister src, bool mer
|
|||
emit_operand(src, dst);
|
||||
}
|
||||
|
||||
void Assembler::evmovdquw(XMMRegister dst, Address src, bool merge, int vector_len) {
|
||||
assert(VM_Version::supports_evex(), "");
|
||||
InstructionMark im(this);
|
||||
InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
|
||||
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
|
||||
attributes.set_is_evex_instruction();
|
||||
if (merge) {
|
||||
attributes.reset_is_clear_context();
|
||||
}
|
||||
int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;
|
||||
vex_prefix(src, 0, dst->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);
|
||||
emit_int8(0x6F);
|
||||
emit_operand(dst, src);
|
||||
void Assembler::evmovdquw(XMMRegister dst, Address src, int vector_len) {
|
||||
// Unmasked instruction
|
||||
evmovdquw(dst, k0, src, /*merge*/ false, vector_len);
|
||||
}
|
||||
|
||||
void Assembler::evmovdquw(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) {
|
||||
assert(VM_Version::supports_avx512vlbw(), "");
|
||||
InstructionMark im(this);
|
||||
InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
|
||||
InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);
|
||||
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
|
||||
attributes.set_embedded_opmask_register_specifier(mask);
|
||||
attributes.set_is_evex_instruction();
|
||||
|
@ -3125,27 +3094,16 @@ void Assembler::evmovdquw(XMMRegister dst, KRegister mask, Address src, bool mer
|
|||
emit_operand(dst, src);
|
||||
}
|
||||
|
||||
void Assembler::evmovdquw(Address dst, XMMRegister src, bool merge, int vector_len) {
|
||||
assert(VM_Version::supports_evex(), "");
|
||||
assert(src != xnoreg, "sanity");
|
||||
InstructionMark im(this);
|
||||
InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
|
||||
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
|
||||
attributes.set_is_evex_instruction();
|
||||
if (merge) {
|
||||
attributes.reset_is_clear_context();
|
||||
}
|
||||
int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;
|
||||
vex_prefix(dst, 0, src->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);
|
||||
emit_int8(0x7F);
|
||||
emit_operand(src, dst);
|
||||
void Assembler::evmovdquw(Address dst, XMMRegister src, int vector_len) {
|
||||
// Unmasked instruction
|
||||
evmovdquw(dst, k0, src, /*merge*/ false, vector_len);
|
||||
}
|
||||
|
||||
void Assembler::evmovdquw(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {
|
||||
assert(VM_Version::supports_avx512vlbw(), "");
|
||||
assert(src != xnoreg, "sanity");
|
||||
InstructionMark im(this);
|
||||
InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
|
||||
InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);
|
||||
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
|
||||
attributes.set_embedded_opmask_register_specifier(mask);
|
||||
attributes.set_is_evex_instruction();
|
||||
|
|
|
@ -1552,27 +1552,33 @@ private:
|
|||
void vmovdqu(XMMRegister dst, XMMRegister src);
|
||||
|
||||
// Move Unaligned 512bit Vector
|
||||
void evmovdqub(Address dst, XMMRegister src, bool merge, int vector_len);
|
||||
void evmovdqub(XMMRegister dst, Address src, bool merge, int vector_len);
|
||||
void evmovdqub(XMMRegister dst, XMMRegister src, bool merge, int vector_len);
|
||||
void evmovdqub(XMMRegister dst, XMMRegister src, int vector_len);
|
||||
void evmovdqub(XMMRegister dst, Address src, int vector_len);
|
||||
void evmovdqub(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len);
|
||||
void evmovdqub(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len);
|
||||
void evmovdqub(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len);
|
||||
void evmovdquw(Address dst, XMMRegister src, bool merge, int vector_len);
|
||||
void evmovdquw(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len);
|
||||
void evmovdquw(XMMRegister dst, Address src, bool merge, int vector_len);
|
||||
|
||||
void evmovdquw(XMMRegister dst, Address src, int vector_len);
|
||||
void evmovdquw(Address dst, XMMRegister src, int vector_len);
|
||||
void evmovdquw(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len);
|
||||
void evmovdquw(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len);
|
||||
void evmovdqul(Address dst, XMMRegister src, int vector_len);
|
||||
void evmovdqul(XMMRegister dst, Address src, int vector_len);
|
||||
void evmovdquw(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len);
|
||||
|
||||
void evmovdqul(XMMRegister dst, XMMRegister src, int vector_len);
|
||||
void evmovdqul(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len);
|
||||
void evmovdqul(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len);
|
||||
void evmovdqul(XMMRegister dst, Address src, int vector_len);
|
||||
void evmovdqul(Address dst, XMMRegister src, int vector_len);
|
||||
|
||||
void evmovdqul(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len);
|
||||
void evmovdqul(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len);
|
||||
void evmovdqul(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len);
|
||||
|
||||
void evmovdquq(Address dst, XMMRegister src, int vector_len);
|
||||
void evmovdquq(XMMRegister dst, Address src, int vector_len);
|
||||
void evmovdquq(XMMRegister dst, XMMRegister src, int vector_len);
|
||||
void evmovdquq(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len);
|
||||
void evmovdquq(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len);
|
||||
|
||||
void evmovdquq(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len);
|
||||
void evmovdquq(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len);
|
||||
void evmovdquq(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len);
|
||||
|
||||
// Move lower 64bit to high 64bit in 128bit register
|
||||
void movlhps(XMMRegister dst, XMMRegister src);
|
||||
|
|
|
@ -1983,12 +1983,12 @@ void C2_MacroAssembler::reduce8D(int opcode, XMMRegister dst, XMMRegister src, X
|
|||
reduce4D(opcode, dst, vtmp1, vtmp1, vtmp2);
|
||||
}
|
||||
|
||||
void C2_MacroAssembler::evmovdqu(BasicType type, KRegister kmask, XMMRegister dst, Address src, int vector_len) {
|
||||
MacroAssembler::evmovdqu(type, kmask, dst, src, vector_len);
|
||||
void C2_MacroAssembler::evmovdqu(BasicType type, KRegister kmask, XMMRegister dst, Address src, bool merge, int vector_len) {
|
||||
MacroAssembler::evmovdqu(type, kmask, dst, src, merge, vector_len);
|
||||
}
|
||||
|
||||
void C2_MacroAssembler::evmovdqu(BasicType type, KRegister kmask, Address dst, XMMRegister src, int vector_len) {
|
||||
MacroAssembler::evmovdqu(type, kmask, dst, src, vector_len);
|
||||
void C2_MacroAssembler::evmovdqu(BasicType type, KRegister kmask, Address dst, XMMRegister src, bool merge, int vector_len) {
|
||||
MacroAssembler::evmovdqu(type, kmask, dst, src, merge, vector_len);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -119,8 +119,8 @@ public:
|
|||
void evgather(BasicType typ, XMMRegister dst, KRegister mask, Register base, XMMRegister idx, int vector_len);
|
||||
void evscatter(BasicType typ, Register base, XMMRegister idx, KRegister mask, XMMRegister src, int vector_len);
|
||||
|
||||
void evmovdqu(BasicType type, KRegister kmask, XMMRegister dst, Address src, int vector_len);
|
||||
void evmovdqu(BasicType type, KRegister kmask, Address dst, XMMRegister src, int vector_len);
|
||||
void evmovdqu(BasicType type, KRegister kmask, XMMRegister dst, Address src, bool merge, int vector_len);
|
||||
void evmovdqu(BasicType type, KRegister kmask, Address dst, XMMRegister src, bool merge, int vector_len);
|
||||
|
||||
// extract
|
||||
void extract(BasicType typ, Register dst, XMMRegister src, int idx);
|
||||
|
|
|
@ -2606,18 +2606,10 @@ void MacroAssembler::kmovwl(KRegister dst, AddressLiteral src, Register scratch_
|
|||
void MacroAssembler::evmovdqub(XMMRegister dst, KRegister mask, AddressLiteral src, bool merge,
|
||||
int vector_len, Register scratch_reg) {
|
||||
if (reachable(src)) {
|
||||
if (mask == k0) {
|
||||
Assembler::evmovdqub(dst, as_Address(src), merge, vector_len);
|
||||
} else {
|
||||
Assembler::evmovdqub(dst, mask, as_Address(src), merge, vector_len);
|
||||
}
|
||||
Assembler::evmovdqub(dst, mask, as_Address(src), merge, vector_len);
|
||||
} else {
|
||||
lea(scratch_reg, src);
|
||||
if (mask == k0) {
|
||||
Assembler::evmovdqub(dst, Address(scratch_reg, 0), merge, vector_len);
|
||||
} else {
|
||||
Assembler::evmovdqub(dst, mask, Address(scratch_reg, 0), merge, vector_len);
|
||||
}
|
||||
Assembler::evmovdqub(dst, mask, Address(scratch_reg, 0), merge, vector_len);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5310,23 +5302,23 @@ void MacroAssembler::clear_mem(Register base, int cnt, Register rtmp, XMMRegiste
|
|||
movq(Address(base, disp), xtmp);
|
||||
break;
|
||||
case 2:
|
||||
evmovdqu(T_LONG, k0, Address(base, disp), xtmp, Assembler::AVX_128bit);
|
||||
evmovdqu(T_LONG, k0, Address(base, disp), xtmp, false, Assembler::AVX_128bit);
|
||||
break;
|
||||
case 3:
|
||||
movl(rtmp, 0x7);
|
||||
kmovwl(mask, rtmp);
|
||||
evmovdqu(T_LONG, mask, Address(base, disp), xtmp, Assembler::AVX_256bit);
|
||||
evmovdqu(T_LONG, mask, Address(base, disp), xtmp, true, Assembler::AVX_256bit);
|
||||
break;
|
||||
case 4:
|
||||
evmovdqu(T_LONG, k0, Address(base, disp), xtmp, Assembler::AVX_256bit);
|
||||
evmovdqu(T_LONG, k0, Address(base, disp), xtmp, false, Assembler::AVX_256bit);
|
||||
break;
|
||||
case 5:
|
||||
if (use64byteVector) {
|
||||
movl(rtmp, 0x1F);
|
||||
kmovwl(mask, rtmp);
|
||||
evmovdqu(T_LONG, mask, Address(base, disp), xtmp, Assembler::AVX_512bit);
|
||||
evmovdqu(T_LONG, mask, Address(base, disp), xtmp, true, Assembler::AVX_512bit);
|
||||
} else {
|
||||
evmovdqu(T_LONG, k0, Address(base, disp), xtmp, Assembler::AVX_256bit);
|
||||
evmovdqu(T_LONG, k0, Address(base, disp), xtmp, false, Assembler::AVX_256bit);
|
||||
movq(Address(base, disp + 32), xtmp);
|
||||
}
|
||||
break;
|
||||
|
@ -5334,22 +5326,22 @@ void MacroAssembler::clear_mem(Register base, int cnt, Register rtmp, XMMRegiste
|
|||
if (use64byteVector) {
|
||||
movl(rtmp, 0x3F);
|
||||
kmovwl(mask, rtmp);
|
||||
evmovdqu(T_LONG, mask, Address(base, disp), xtmp, Assembler::AVX_512bit);
|
||||
evmovdqu(T_LONG, mask, Address(base, disp), xtmp, true, Assembler::AVX_512bit);
|
||||
} else {
|
||||
evmovdqu(T_LONG, k0, Address(base, disp), xtmp, Assembler::AVX_256bit);
|
||||
evmovdqu(T_LONG, k0, Address(base, disp + 32), xtmp, Assembler::AVX_128bit);
|
||||
evmovdqu(T_LONG, k0, Address(base, disp), xtmp, false, Assembler::AVX_256bit);
|
||||
evmovdqu(T_LONG, k0, Address(base, disp + 32), xtmp, false, Assembler::AVX_128bit);
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
if (use64byteVector) {
|
||||
movl(rtmp, 0x7F);
|
||||
kmovwl(mask, rtmp);
|
||||
evmovdqu(T_LONG, mask, Address(base, disp), xtmp, Assembler::AVX_512bit);
|
||||
evmovdqu(T_LONG, mask, Address(base, disp), xtmp, true, Assembler::AVX_512bit);
|
||||
} else {
|
||||
evmovdqu(T_LONG, k0, Address(base, disp), xtmp, Assembler::AVX_256bit);
|
||||
evmovdqu(T_LONG, k0, Address(base, disp), xtmp, false, Assembler::AVX_256bit);
|
||||
movl(rtmp, 0x7);
|
||||
kmovwl(mask, rtmp);
|
||||
evmovdqu(T_LONG, mask, Address(base, disp + 32), xtmp, Assembler::AVX_256bit);
|
||||
evmovdqu(T_LONG, mask, Address(base, disp + 32), xtmp, true, Assembler::AVX_256bit);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -6321,7 +6313,7 @@ void MacroAssembler::vectorized_mismatch(Register obja, Register objb, Register
|
|||
|
||||
bind(VECTOR64_LOOP);
|
||||
// AVX512 code to compare 64 byte vectors.
|
||||
evmovdqub(rymm0, Address(obja, result), false, Assembler::AVX_512bit);
|
||||
evmovdqub(rymm0, Address(obja, result), Assembler::AVX_512bit);
|
||||
evpcmpeqb(k7, rymm0, Address(objb, result), Assembler::AVX_512bit);
|
||||
kortestql(k7, k7);
|
||||
jcc(Assembler::aboveEqual, VECTOR64_NOT_EQUAL); // mismatch
|
||||
|
@ -8162,7 +8154,7 @@ void MacroAssembler::char_array_compress(Register src, Register dst, Register le
|
|||
negptr(len);
|
||||
|
||||
bind(copy_32_loop);
|
||||
evmovdquw(tmp1Reg, Address(src, len, Address::times_2), /*merge*/ false, Assembler::AVX_512bit);
|
||||
evmovdquw(tmp1Reg, Address(src, len, Address::times_2), Assembler::AVX_512bit);
|
||||
evpcmpuw(mask1, tmp1Reg, tmp2Reg, Assembler::le, Assembler::AVX_512bit);
|
||||
kortestdl(mask1, mask1);
|
||||
jcc(Assembler::carryClear, return_zero);
|
||||
|
@ -8332,7 +8324,7 @@ void MacroAssembler::byte_array_inflate(Register src, Register dst, Register len
|
|||
// inflate 32 chars per iter
|
||||
bind(copy_32_loop);
|
||||
vpmovzxbw(tmp1, Address(src, len, Address::times_1), Assembler::AVX_512bit);
|
||||
evmovdquw(Address(dst, len, Address::times_2), tmp1, /*merge*/ false, Assembler::AVX_512bit);
|
||||
evmovdquw(Address(dst, len, Address::times_2), tmp1, Assembler::AVX_512bit);
|
||||
addptr(len, 32);
|
||||
jcc(Assembler::notZero, copy_32_loop);
|
||||
|
||||
|
@ -8434,23 +8426,23 @@ void MacroAssembler::byte_array_inflate(Register src, Register dst, Register len
|
|||
}
|
||||
|
||||
|
||||
void MacroAssembler::evmovdqu(BasicType type, KRegister kmask, XMMRegister dst, Address src, int vector_len) {
|
||||
void MacroAssembler::evmovdqu(BasicType type, KRegister kmask, XMMRegister dst, Address src, bool merge, int vector_len) {
|
||||
switch(type) {
|
||||
case T_BYTE:
|
||||
case T_BOOLEAN:
|
||||
evmovdqub(dst, kmask, src, false, vector_len);
|
||||
evmovdqub(dst, kmask, src, merge, vector_len);
|
||||
break;
|
||||
case T_CHAR:
|
||||
case T_SHORT:
|
||||
evmovdquw(dst, kmask, src, false, vector_len);
|
||||
evmovdquw(dst, kmask, src, merge, vector_len);
|
||||
break;
|
||||
case T_INT:
|
||||
case T_FLOAT:
|
||||
evmovdqul(dst, kmask, src, false, vector_len);
|
||||
evmovdqul(dst, kmask, src, merge, vector_len);
|
||||
break;
|
||||
case T_LONG:
|
||||
case T_DOUBLE:
|
||||
evmovdquq(dst, kmask, src, false, vector_len);
|
||||
evmovdquq(dst, kmask, src, merge, vector_len);
|
||||
break;
|
||||
default:
|
||||
fatal("Unexpected type argument %s", type2name(type));
|
||||
|
@ -8458,23 +8450,23 @@ void MacroAssembler::evmovdqu(BasicType type, KRegister kmask, XMMRegister dst,
|
|||
}
|
||||
}
|
||||
|
||||
void MacroAssembler::evmovdqu(BasicType type, KRegister kmask, Address dst, XMMRegister src, int vector_len) {
|
||||
void MacroAssembler::evmovdqu(BasicType type, KRegister kmask, Address dst, XMMRegister src, bool merge, int vector_len) {
|
||||
switch(type) {
|
||||
case T_BYTE:
|
||||
case T_BOOLEAN:
|
||||
evmovdqub(dst, kmask, src, true, vector_len);
|
||||
evmovdqub(dst, kmask, src, merge, vector_len);
|
||||
break;
|
||||
case T_CHAR:
|
||||
case T_SHORT:
|
||||
evmovdquw(dst, kmask, src, true, vector_len);
|
||||
evmovdquw(dst, kmask, src, merge, vector_len);
|
||||
break;
|
||||
case T_INT:
|
||||
case T_FLOAT:
|
||||
evmovdqul(dst, kmask, src, true, vector_len);
|
||||
evmovdqul(dst, kmask, src, merge, vector_len);
|
||||
break;
|
||||
case T_LONG:
|
||||
case T_DOUBLE:
|
||||
evmovdquq(dst, kmask, src, true, vector_len);
|
||||
evmovdquq(dst, kmask, src, merge, vector_len);
|
||||
break;
|
||||
default:
|
||||
fatal("Unexpected type argument %s", type2name(type));
|
||||
|
@ -8863,7 +8855,7 @@ void MacroAssembler::fill_masked(BasicType bt, Address dst, XMMRegister xmm, KRe
|
|||
movptr(temp, -1);
|
||||
bzhiq(temp, temp, length);
|
||||
kmov(mask, temp);
|
||||
evmovdqu(bt, mask, dst, xmm, vec_enc);
|
||||
evmovdqu(bt, mask, dst, xmm, true, vec_enc);
|
||||
}
|
||||
|
||||
// Set memory operation for length "less than" 64 bytes.
|
||||
|
@ -8995,7 +8987,7 @@ void MacroAssembler::generate_fill_avx3(BasicType type, Register to, Register va
|
|||
mov64(r8, -1L);
|
||||
bzhiq(r8, r8, rtmp);
|
||||
kmovql(k2, r8);
|
||||
evmovdqu(T_BYTE, k2, Address(to, 0), xtmp, Assembler::AVX_256bit);
|
||||
evmovdqu(T_BYTE, k2, Address(to, 0), xtmp, true, Assembler::AVX_256bit);
|
||||
addq(to, rtmp);
|
||||
shrq(rtmp, shift);
|
||||
subq(count, rtmp);
|
||||
|
@ -9065,7 +9057,7 @@ void MacroAssembler::generate_fill_avx3(BasicType type, Register to, Register va
|
|||
mov64(r8, -1L);
|
||||
bzhiq(r8, r8, rtmp);
|
||||
kmovql(k2, r8);
|
||||
evmovdqu(T_BYTE, k2, Address(to, 0), xtmp, Assembler::AVX_512bit);
|
||||
evmovdqu(T_BYTE, k2, Address(to, 0), xtmp, true, Assembler::AVX_512bit);
|
||||
addq(to, rtmp);
|
||||
shrq(rtmp, shift);
|
||||
subq(count, rtmp);
|
||||
|
|
|
@ -1147,49 +1147,64 @@ public:
|
|||
|
||||
|
||||
// AVX512 Unaligned
|
||||
void evmovdqu(BasicType type, KRegister kmask, Address dst, XMMRegister src, int vector_len);
|
||||
void evmovdqu(BasicType type, KRegister kmask, XMMRegister dst, Address src, int vector_len);
|
||||
void evmovdqu(BasicType type, KRegister kmask, Address dst, XMMRegister src, bool merge, int vector_len);
|
||||
void evmovdqu(BasicType type, KRegister kmask, XMMRegister dst, Address src, bool merge, int vector_len);
|
||||
|
||||
void evmovdqub(Address dst, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdqub(dst, src, merge, vector_len); }
|
||||
void evmovdqub(XMMRegister dst, Address src, bool merge, int vector_len) { Assembler::evmovdqub(dst, src, merge, vector_len); }
|
||||
void evmovdqub(XMMRegister dst, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdqub(dst, src, merge, vector_len); }
|
||||
void evmovdqub(XMMRegister dst, XMMRegister src, int vector_len) { Assembler::evmovdqub(dst, src, vector_len); }
|
||||
void evmovdqub(XMMRegister dst, Address src, int vector_len) { Assembler::evmovdqub(dst, src, vector_len); }
|
||||
void evmovdqub(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {
|
||||
if (dst->encoding() != src->encoding() || mask != k0) {
|
||||
Assembler::evmovdqub(dst, mask, src, merge, vector_len);
|
||||
}
|
||||
}
|
||||
void evmovdqub(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) { Assembler::evmovdqub(dst, mask, src, merge, vector_len); }
|
||||
void evmovdqub(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdqub(dst, mask, src, merge, vector_len); }
|
||||
void evmovdqub(XMMRegister dst, KRegister mask, AddressLiteral src, bool merge, int vector_len, Register scratch_reg);
|
||||
|
||||
void evmovdquw(Address dst, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdquw(dst, src, merge, vector_len); }
|
||||
void evmovdquw(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdquw(dst, mask, src, merge, vector_len); }
|
||||
void evmovdquw(XMMRegister dst, Address src, bool merge, int vector_len) { Assembler::evmovdquw(dst, src, merge, vector_len); }
|
||||
void evmovdquw(XMMRegister dst, Address src, int vector_len) { Assembler::evmovdquw(dst, src, vector_len); }
|
||||
void evmovdquw(Address dst, XMMRegister src, int vector_len) { Assembler::evmovdquw(dst, src, vector_len); }
|
||||
void evmovdquw(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {
|
||||
if (dst->encoding() != src->encoding() || mask != k0) {
|
||||
Assembler::evmovdquw(dst, mask, src, merge, vector_len);
|
||||
}
|
||||
}
|
||||
void evmovdquw(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) { Assembler::evmovdquw(dst, mask, src, merge, vector_len); }
|
||||
void evmovdquw(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdquw(dst, mask, src, merge, vector_len); }
|
||||
void evmovdquw(XMMRegister dst, KRegister mask, AddressLiteral src, bool merge, int vector_len, Register scratch_reg);
|
||||
|
||||
void evmovdqul(XMMRegister dst, XMMRegister src, int vector_len) {
|
||||
if (dst->encoding() != src->encoding()) {
|
||||
Assembler::evmovdqul(dst, src, vector_len);
|
||||
}
|
||||
}
|
||||
void evmovdqul(Address dst, XMMRegister src, int vector_len) { Assembler::evmovdqul(dst, src, vector_len); }
|
||||
void evmovdqul(XMMRegister dst, Address src, int vector_len) { Assembler::evmovdqul(dst, src, vector_len); }
|
||||
void evmovdqul(XMMRegister dst, XMMRegister src, int vector_len) {
|
||||
if (dst->encoding() == src->encoding()) return;
|
||||
Assembler::evmovdqul(dst, src, vector_len);
|
||||
}
|
||||
void evmovdqul(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdqul(dst, mask, src, merge, vector_len); }
|
||||
void evmovdqul(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) { Assembler::evmovdqul(dst, mask, src, merge, vector_len); }
|
||||
|
||||
void evmovdqul(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {
|
||||
if (dst->encoding() == src->encoding() && mask == k0) return;
|
||||
Assembler::evmovdqul(dst, mask, src, merge, vector_len);
|
||||
}
|
||||
if (dst->encoding() != src->encoding() || mask != k0) {
|
||||
Assembler::evmovdqul(dst, mask, src, merge, vector_len);
|
||||
}
|
||||
}
|
||||
void evmovdqul(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) { Assembler::evmovdqul(dst, mask, src, merge, vector_len); }
|
||||
void evmovdqul(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdqul(dst, mask, src, merge, vector_len); }
|
||||
void evmovdqul(XMMRegister dst, KRegister mask, AddressLiteral src, bool merge, int vector_len, Register scratch_reg);
|
||||
|
||||
void evmovdquq(XMMRegister dst, XMMRegister src, int vector_len) {
|
||||
if (dst->encoding() != src->encoding()) {
|
||||
Assembler::evmovdquq(dst, src, vector_len);
|
||||
}
|
||||
}
|
||||
void evmovdquq(XMMRegister dst, Address src, int vector_len) { Assembler::evmovdquq(dst, src, vector_len); }
|
||||
void evmovdquq(Address dst, XMMRegister src, int vector_len) { Assembler::evmovdquq(dst, src, vector_len); }
|
||||
void evmovdquq(XMMRegister dst, AddressLiteral src, int vector_len, Register rscratch);
|
||||
void evmovdquq(XMMRegister dst, XMMRegister src, int vector_len) {
|
||||
if (dst->encoding() == src->encoding()) return;
|
||||
Assembler::evmovdquq(dst, src, vector_len);
|
||||
}
|
||||
void evmovdquq(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdquq(dst, mask, src, merge, vector_len); }
|
||||
void evmovdquq(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) { Assembler::evmovdquq(dst, mask, src, merge, vector_len); }
|
||||
|
||||
void evmovdquq(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {
|
||||
if (dst->encoding() == src->encoding() && mask == k0) return;
|
||||
Assembler::evmovdquq(dst, mask, src, merge, vector_len);
|
||||
if (dst->encoding() != src->encoding() || mask != k0) {
|
||||
Assembler::evmovdquq(dst, mask, src, merge, vector_len);
|
||||
}
|
||||
}
|
||||
void evmovdquq(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) { Assembler::evmovdquq(dst, mask, src, merge, vector_len); }
|
||||
void evmovdquq(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdquq(dst, mask, src, merge, vector_len); }
|
||||
void evmovdquq(XMMRegister dst, KRegister mask, AddressLiteral src, bool merge, int vector_len, Register scratch_reg);
|
||||
|
||||
// Move Aligned Double Quadword
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2020, 2021, Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2020, 2022, Intel Corporation. All rights reserved.
|
||||
*
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
|
@ -199,8 +199,8 @@ void MacroAssembler::copy64_masked_avx(Register dst, Register src, XMMRegister x
|
|||
mov64(temp, -1L);
|
||||
bzhiq(temp, temp, length);
|
||||
kmovql(mask, temp);
|
||||
evmovdqu(type[shift], mask, xmm, Address(src, index, scale, offset), Assembler::AVX_512bit);
|
||||
evmovdqu(type[shift], mask, Address(dst, index, scale, offset), xmm, Assembler::AVX_512bit);
|
||||
evmovdqu(type[shift], mask, xmm, Address(src, index, scale, offset), false, Assembler::AVX_512bit);
|
||||
evmovdqu(type[shift], mask, Address(dst, index, scale, offset), xmm, true, Assembler::AVX_512bit);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -214,8 +214,8 @@ void MacroAssembler::copy32_masked_avx(Register dst, Register src, XMMRegister x
|
|||
mov64(temp, -1L);
|
||||
bzhiq(temp, temp, length);
|
||||
kmovql(mask, temp);
|
||||
evmovdqu(type[shift], mask, xmm, Address(src, index, scale, offset), Assembler::AVX_256bit);
|
||||
evmovdqu(type[shift], mask, Address(dst, index, scale, offset), xmm, Assembler::AVX_256bit);
|
||||
evmovdqu(type[shift], mask, xmm, Address(src, index, scale, offset), false, Assembler::AVX_256bit);
|
||||
evmovdqu(type[shift], mask, Address(dst, index, scale, offset), xmm, true, Assembler::AVX_256bit);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -8817,7 +8817,7 @@ instruct vmasked_load64(vec dst, memory mem, kReg mask) %{
|
|||
ins_encode %{
|
||||
BasicType elmType = this->bottom_type()->is_vect()->element_basic_type();
|
||||
int vector_len = vector_length_encoding(this);
|
||||
__ evmovdqu(elmType, $mask$$KRegister, $dst$$XMMRegister, $mem$$Address, vector_len);
|
||||
__ evmovdqu(elmType, $mask$$KRegister, $dst$$XMMRegister, $mem$$Address, false, vector_len);
|
||||
%}
|
||||
ins_pipe( pipe_slow );
|
||||
%}
|
||||
|
@ -8850,7 +8850,7 @@ instruct vmasked_store64(memory mem, vec src, kReg mask) %{
|
|||
const MachNode* src_node = static_cast<const MachNode*>(this->in(this->operand_index($src)));
|
||||
BasicType elmType = src_node->bottom_type()->is_vect()->element_basic_type();
|
||||
int vector_len = vector_length_encoding(src_node);
|
||||
__ evmovdqu(elmType, $mask$$KRegister, $mem$$Address, $src$$XMMRegister, vector_len);
|
||||
__ evmovdqu(elmType, $mask$$KRegister, $mem$$Address, $src$$XMMRegister, true, vector_len);
|
||||
%}
|
||||
ins_pipe( pipe_slow );
|
||||
%}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue