Skip to content

Commit 10436c1

Browse files
Srinivas Vamsi ParasaSandhya Viswanathan
authored andcommitted
8356281: Fix for TestFPComparison failure due to incorrect result
Reviewed-by: sviswanathan, thartmann, jbhateja
1 parent 1afd887 commit 10436c1

File tree

1 file changed

+24
-15
lines changed

1 file changed

+24
-15
lines changed

src/hotspot/cpu/x86/x86_64.ad

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6267,13 +6267,14 @@ instruct cmovI_regUCF2_ne(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegI dst, rRegI src)
62676267
instruct cmovI_regUCF2_ne_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegI dst, rRegI src1, rRegI src2) %{
62686268
predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne);
62696269
match(Set dst (CMoveI (Binary cop cr) (Binary src1 src2)));
6270+
effect(TEMP dst);
62706271

62716272
ins_cost(200);
62726273
format %{ "ecmovpl $dst, $src1, $src2\n\t"
6273-
"ecmovnel $dst, $src1, $src2" %}
6274+
"cmovnel $dst, $src2" %}
62746275
ins_encode %{
62756276
__ ecmovl(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register);
6276-
__ ecmovl(Assembler::notEqual, $dst$$Register, $src1$$Register, $src2$$Register);
6277+
__ cmovl(Assembler::notEqual, $dst$$Register, $src2$$Register);
62776278
%}
62786279
ins_pipe(pipe_cmov_reg);
62796280
%}
@@ -6283,6 +6284,7 @@ instruct cmovI_regUCF2_ne_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegI dst, rRegI s
62836284
instruct cmovI_regUCF2_eq(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegI dst, rRegI src) %{
62846285
predicate(!UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq);
62856286
match(Set dst (CMoveI (Binary cop cr) (Binary src dst)));
6287+
effect(TEMP dst);
62866288

62876289
ins_cost(200); // XXX
62886290
format %{ "cmovpl $dst, $src\n\t"
@@ -6298,14 +6300,15 @@ instruct cmovI_regUCF2_eq(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegI dst, rRegI src)
62986300
// and parity flag bit is set if any of the operand is a NaN.
62996301
instruct cmovI_regUCF2_eq_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegI dst, rRegI src1, rRegI src2) %{
63006302
predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq);
6301-
match(Set dst (CMoveI (Binary cop cr) (Binary src1 src2)));
6303+
match(Set dst (CMoveI (Binary cop cr) (Binary src2 src1)));
6304+
effect(TEMP dst);
63026305

63036306
ins_cost(200);
63046307
format %{ "ecmovpl $dst, $src1, $src2\n\t"
6305-
"ecmovnel $dst, $src1, $src2" %}
6308+
"cmovnel $dst, $src2" %}
63066309
ins_encode %{
63076310
__ ecmovl(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register);
6308-
__ ecmovl(Assembler::notEqual, $dst$$Register, $src1$$Register, $src2$$Register);
6311+
__ cmovl(Assembler::notEqual, $dst$$Register, $src2$$Register);
63096312
%}
63106313
ins_pipe(pipe_cmov_reg);
63116314
%}
@@ -6548,6 +6551,7 @@ instruct cmovP_regU_ndd(rRegP dst, cmpOpU cop, rFlagsRegU cr, rRegP src1, rRegP
65486551
%}
65496552

65506553
instruct cmovP_regUCF(cmpOpUCF cop, rFlagsRegUCF cr, rRegP dst, rRegP src) %{
6554+
predicate(!UseAPX);
65516555
match(Set dst (CMoveP (Binary cop cr) (Binary dst src)));
65526556
ins_cost(200);
65536557
expand %{
@@ -6556,6 +6560,7 @@ instruct cmovP_regUCF(cmpOpUCF cop, rFlagsRegUCF cr, rRegP dst, rRegP src) %{
65566560
%}
65576561

65586562
instruct cmovP_regUCF_ndd(rRegP dst, cmpOpUCF cop, rFlagsRegUCF cr, rRegP src1, rRegP src2) %{
6563+
predicate(UseAPX);
65596564
match(Set dst (CMoveP (Binary cop cr) (Binary src1 src2)));
65606565
ins_cost(200);
65616566
format %{ "ecmovq$cop $dst, $src1, $src2\t# unsigned, ptr ndd" %}
@@ -6582,13 +6587,14 @@ instruct cmovP_regUCF2_ne(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegP dst, rRegP src)
65826587
instruct cmovP_regUCF2_ne_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegP dst, rRegP src1, rRegP src2) %{
65836588
predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne);
65846589
match(Set dst (CMoveP (Binary cop cr) (Binary src1 src2)));
6590+
effect(TEMP dst);
65856591

65866592
ins_cost(200);
65876593
format %{ "ecmovpq $dst, $src1, $src2\n\t"
6588-
"ecmovneq $dst, $src1, $src2" %}
6594+
"cmovneq $dst, $src2" %}
65896595
ins_encode %{
65906596
__ ecmovq(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register);
6591-
__ ecmovq(Assembler::notEqual, $dst$$Register, $src1$$Register, $src2$$Register);
6597+
__ cmovq(Assembler::notEqual, $dst$$Register, $src2$$Register);
65926598
%}
65936599
ins_pipe(pipe_cmov_reg);
65946600
%}
@@ -6611,14 +6617,15 @@ instruct cmovP_regUCF2_eq(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegP dst, rRegP src)
66116617

66126618
instruct cmovP_regUCF2_eq_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegP dst, rRegP src1, rRegP src2) %{
66136619
predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq);
6614-
match(Set dst (CMoveP (Binary cop cr) (Binary src1 src2)));
6620+
match(Set dst (CMoveP (Binary cop cr) (Binary src2 src1)));
6621+
effect(TEMP dst);
66156622

66166623
ins_cost(200);
66176624
format %{ "ecmovpq $dst, $src1, $src2\n\t"
6618-
"ecmovneq $dst, $src1, $src2" %}
6625+
"cmovneq $dst, $src2" %}
66196626
ins_encode %{
66206627
__ ecmovq(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register);
6621-
__ ecmovq(Assembler::notEqual, $dst$$Register, $src1$$Register, $src2$$Register);
6628+
__ cmovq(Assembler::notEqual, $dst$$Register, $src2$$Register);
66226629
%}
66236630
ins_pipe(pipe_cmov_reg);
66246631
%}
@@ -6781,13 +6788,14 @@ instruct cmovL_regUCF2_ne(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegL dst, rRegL src)
67816788
instruct cmovL_regUCF2_ne_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegL dst, rRegL src1, rRegL src2) %{
67826789
predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne);
67836790
match(Set dst (CMoveL (Binary cop cr) (Binary src1 src2)));
6791+
effect(TEMP dst);
67846792

67856793
ins_cost(200);
67866794
format %{ "ecmovpq $dst, $src1, $src2\n\t"
6787-
"ecmovneq $dst, $src1, $src2" %}
6795+
"cmovneq $dst, $src2" %}
67886796
ins_encode %{
67896797
__ ecmovq(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register);
6790-
__ ecmovq(Assembler::notEqual, $dst$$Register, $src1$$Register, $src2$$Register);
6798+
__ cmovq(Assembler::notEqual, $dst$$Register, $src2$$Register);
67916799
%}
67926800
ins_pipe(pipe_cmov_reg);
67936801
%}
@@ -6810,14 +6818,15 @@ instruct cmovL_regUCF2_eq(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegL dst, rRegL src)
68106818

68116819
instruct cmovL_regUCF2_eq_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegL dst, rRegL src1, rRegL src2) %{
68126820
predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq);
6813-
match(Set dst (CMoveL (Binary cop cr) (Binary src1 src2)));
6821+
match(Set dst (CMoveL (Binary cop cr) (Binary src2 src1)));
6822+
effect(TEMP dst);
68146823

68156824
ins_cost(200);
68166825
format %{ "ecmovpq $dst, $src1, $src2\n\t"
6817-
"ecmovneq $dst, $src1, $src2" %}
6826+
"cmovneq $dst, $src2" %}
68186827
ins_encode %{
68196828
__ ecmovq(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register);
6820-
__ ecmovq(Assembler::notEqual, $dst$$Register, $src1$$Register, $src2$$Register);
6829+
__ cmovq(Assembler::notEqual, $dst$$Register, $src2$$Register);
68216830
%}
68226831
ins_pipe(pipe_cmov_reg);
68236832
%}

0 commit comments

Comments
 (0)