@@ -878,6 +878,7 @@ void C2_MacroAssembler::vabsnegf(int opcode, XMMRegister dst, XMMRegister src, i
878
878
879
879
void C2_MacroAssembler::pminmax (int opcode, BasicType elem_bt, XMMRegister dst, XMMRegister src, XMMRegister tmp) {
880
880
assert (opcode == Op_MinV || opcode == Op_MaxV, " sanity" );
881
+ assert (tmp == xnoreg || elem_bt == T_LONG, " unused" );
881
882
882
883
if (opcode == Op_MinV) {
883
884
if (elem_bt == T_BYTE) {
@@ -889,6 +890,7 @@ void C2_MacroAssembler::pminmax(int opcode, BasicType elem_bt, XMMRegister dst,
889
890
} else {
890
891
assert (elem_bt == T_LONG, " required" );
891
892
assert (tmp == xmm0, " required" );
893
+ assert_different_registers (dst, src, tmp);
892
894
movdqu (xmm0, dst);
893
895
pcmpgtq (xmm0, src);
894
896
blendvpd (dst, src); // xmm0 as mask
@@ -903,6 +905,7 @@ void C2_MacroAssembler::pminmax(int opcode, BasicType elem_bt, XMMRegister dst,
903
905
} else {
904
906
assert (elem_bt == T_LONG, " required" );
905
907
assert (tmp == xmm0, " required" );
908
+ assert_different_registers (dst, src, tmp);
906
909
movdqu (xmm0, src);
907
910
pcmpgtq (xmm0, dst);
908
911
blendvpd (dst, src); // xmm0 as mask
@@ -927,6 +930,7 @@ void C2_MacroAssembler::vpminmax(int opcode, BasicType elem_bt,
927
930
if (UseAVX > 2 && (vlen_enc == Assembler::AVX_512bit || VM_Version::supports_avx512vl ())) {
928
931
vpminsq (dst, src1, src2, vlen_enc);
929
932
} else {
933
+ assert_different_registers (dst, src1, src2);
930
934
vpcmpgtq (dst, src1, src2, vlen_enc);
931
935
vblendvpd (dst, src1, src2, dst, vlen_enc);
932
936
}
@@ -943,6 +947,7 @@ void C2_MacroAssembler::vpminmax(int opcode, BasicType elem_bt,
943
947
if (UseAVX > 2 && (vlen_enc == Assembler::AVX_512bit || VM_Version::supports_avx512vl ())) {
944
948
vpmaxsq (dst, src1, src2, vlen_enc);
945
949
} else {
950
+ assert_different_registers (dst, src1, src2);
946
951
vpcmpgtq (dst, src1, src2, vlen_enc);
947
952
vblendvpd (dst, src2, src1, dst, vlen_enc);
948
953
}
@@ -960,6 +965,7 @@ void C2_MacroAssembler::vminmax_fp(int opcode, BasicType elem_bt,
960
965
assert (opcode == Op_MinV || opcode == Op_MinReductionV ||
961
966
opcode == Op_MaxV || opcode == Op_MaxReductionV, " sanity" );
962
967
assert (elem_bt == T_FLOAT || elem_bt == T_DOUBLE, " sanity" );
968
+ assert_different_registers (a, b, tmp, atmp, btmp);
963
969
964
970
bool is_min = (opcode == Op_MinV || opcode == Op_MinReductionV);
965
971
bool is_double_word = is_double_word_type (elem_bt);
@@ -1000,6 +1006,7 @@ void C2_MacroAssembler::evminmax_fp(int opcode, BasicType elem_bt,
1000
1006
assert (opcode == Op_MinV || opcode == Op_MinReductionV ||
1001
1007
opcode == Op_MaxV || opcode == Op_MaxReductionV, " sanity" );
1002
1008
assert (elem_bt == T_FLOAT || elem_bt == T_DOUBLE, " sanity" );
1009
+ assert_different_registers (dst, a, b, atmp, btmp);
1003
1010
1004
1011
bool is_min = (opcode == Op_MinV || opcode == Op_MinReductionV);
1005
1012
bool is_double_word = is_double_word_type (elem_bt);
0 commit comments