Skip to content

Commit 76637c5

Browse files
author
Jatin Bhateja
committed
8321648: Integral gather optimized mask computation.
Reviewed-by: thartmann, sviswanathan
1 parent 59073fa commit 76637c5

File tree

3 files changed

+17
-20
lines changed

3 files changed

+17
-20
lines changed

src/hotspot/cpu/x86/assembler_x86.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2846,6 +2846,13 @@ void Assembler::kxorbl(KRegister dst, KRegister src1, KRegister src2) {
28462846
emit_int16(0x47, (0xC0 | encode));
28472847
}
28482848

2849+
void Assembler::kxnorwl(KRegister dst, KRegister src1, KRegister src2) {
2850+
assert(VM_Version::supports_evex(), "");
2851+
InstructionAttr attributes(AVX_256bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);
2852+
int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);
2853+
emit_int16(0x46, (0xC0 | encode));
2854+
}
2855+
28492856
void Assembler::kxorwl(KRegister dst, KRegister src1, KRegister src2) {
28502857
assert(VM_Version::supports_evex(), "");
28512858
InstructionAttr attributes(AVX_256bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);
@@ -10771,7 +10778,7 @@ void Assembler::vpgatherdd(XMMRegister dst, Address src, XMMRegister mask, int v
1077110778
assert(src.isxmmindex(),"expected to be xmm index");
1077210779
assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");
1077310780
InstructionMark im(this);
10774-
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);
10781+
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);
1077510782
vex_prefix(src, mask->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
1077610783
emit_int8((unsigned char)0x90);
1077710784
emit_operand(dst, src, 0);
@@ -10784,7 +10791,7 @@ void Assembler::vpgatherdq(XMMRegister dst, Address src, XMMRegister mask, int v
1078410791
assert(src.isxmmindex(),"expected to be xmm index");
1078510792
assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");
1078610793
InstructionMark im(this);
10787-
InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);
10794+
InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);
1078810795
vex_prefix(src, mask->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
1078910796
emit_int8((unsigned char)0x90);
1079010797
emit_operand(dst, src, 0);
@@ -10797,7 +10804,7 @@ void Assembler::vgatherdpd(XMMRegister dst, Address src, XMMRegister mask, int v
1079710804
assert(src.isxmmindex(),"expected to be xmm index");
1079810805
assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");
1079910806
InstructionMark im(this);
10800-
InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);
10807+
InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);
1080110808
vex_prefix(src, mask->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
1080210809
emit_int8((unsigned char)0x92);
1080310810
emit_operand(dst, src, 0);
@@ -10810,7 +10817,7 @@ void Assembler::vgatherdps(XMMRegister dst, Address src, XMMRegister mask, int v
1081010817
assert(src.isxmmindex(),"expected to be xmm index");
1081110818
assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");
1081210819
InstructionMark im(this);
10813-
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ true);
10820+
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ false);
1081410821
vex_prefix(src, mask->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
1081510822
emit_int8((unsigned char)0x92);
1081610823
emit_operand(dst, src, 0);

src/hotspot/cpu/x86/assembler_x86.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1524,6 +1524,8 @@ class Assembler : public AbstractAssembler {
15241524
void kordl(KRegister dst, KRegister src1, KRegister src2);
15251525
void korql(KRegister dst, KRegister src1, KRegister src2);
15261526

1527+
void kxnorwl(KRegister dst, KRegister src1, KRegister src2);
1528+
15271529
void kxorbl(KRegister dst, KRegister src1, KRegister src2);
15281530
void kxorwl(KRegister dst, KRegister src1, KRegister src2);
15291531
void kxordl(KRegister dst, KRegister src1, KRegister src2);

src/hotspot/cpu/x86/x86.ad

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4053,46 +4053,34 @@ instruct gather(legVec dst, memory mem, legVec idx, rRegP tmp, legVec mask) %{
40534053
effect(TEMP dst, TEMP tmp, TEMP mask);
40544054
format %{ "load_vector_gather $dst, $mem, $idx\t! using $tmp and $mask as TEMP" %}
40554055
ins_encode %{
4056-
assert(UseAVX >= 2, "sanity");
4057-
40584056
int vlen_enc = vector_length_encoding(this);
40594057
BasicType elem_bt = Matcher::vector_element_basic_type(this);
4060-
4061-
assert(Matcher::vector_length_in_bytes(this) >= 16, "sanity");
40624058
assert(!is_subword_type(elem_bt), "sanity"); // T_INT, T_LONG, T_FLOAT, T_DOUBLE
4063-
4064-
if (vlen_enc == Assembler::AVX_128bit) {
4065-
__ movdqu($mask$$XMMRegister, ExternalAddress(vector_all_bits_set()), noreg);
4066-
} else {
4067-
__ vmovdqu($mask$$XMMRegister, ExternalAddress(vector_all_bits_set()), noreg);
4068-
}
4059+
__ vpcmpeqd($mask$$XMMRegister, $mask$$XMMRegister, $mask$$XMMRegister, vlen_enc);
40694060
__ lea($tmp$$Register, $mem$$Address);
40704061
__ vgather(elem_bt, $dst$$XMMRegister, $tmp$$Register, $idx$$XMMRegister, $mask$$XMMRegister, vlen_enc);
40714062
%}
40724063
ins_pipe( pipe_slow );
40734064
%}
40744065

4066+
40754067
instruct evgather(vec dst, memory mem, vec idx, rRegP tmp, kReg ktmp) %{
40764068
predicate(VM_Version::supports_avx512vl() || Matcher::vector_length_in_bytes(n) == 64);
40774069
match(Set dst (LoadVectorGather mem idx));
40784070
effect(TEMP dst, TEMP tmp, TEMP ktmp);
40794071
format %{ "load_vector_gather $dst, $mem, $idx\t! using $tmp and ktmp as TEMP" %}
40804072
ins_encode %{
4081-
assert(UseAVX > 2, "sanity");
4082-
40834073
int vlen_enc = vector_length_encoding(this);
40844074
BasicType elem_bt = Matcher::vector_element_basic_type(this);
4085-
4086-
assert(!is_subword_type(elem_bt), "sanity"); // T_INT, T_LONG, T_FLOAT, T_DOUBLE
4087-
4088-
__ kmovwl($ktmp$$KRegister, ExternalAddress(vector_all_bits_set()), noreg);
4075+
__ kxnorwl($ktmp$$KRegister, $ktmp$$KRegister, $ktmp$$KRegister);
40894076
__ lea($tmp$$Register, $mem$$Address);
40904077
__ evgather(elem_bt, $dst$$XMMRegister, $ktmp$$KRegister, $tmp$$Register, $idx$$XMMRegister, vlen_enc);
40914078
%}
40924079
ins_pipe( pipe_slow );
40934080
%}
40944081

40954082
instruct evgather_masked(vec dst, memory mem, vec idx, kReg mask, kReg ktmp, rRegP tmp) %{
4083+
predicate(VM_Version::supports_avx512vl() || Matcher::vector_length_in_bytes(n) == 64);
40964084
match(Set dst (LoadVectorGatherMasked mem (Binary idx mask)));
40974085
effect(TEMP_DEF dst, TEMP tmp, TEMP ktmp);
40984086
format %{ "load_vector_gather_masked $dst, $mem, $idx, $mask\t! using $tmp and ktmp as TEMP" %}

0 commit comments

Comments
 (0)