@@ -13097,6 +13097,28 @@ instruct cmovLL_mem_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, eRegL dst,
13097
13097
ins_pipe( pipe_cmov_reg_long );
13098
13098
%}
13099
13099
13100
+ instruct cmovLL_reg_LEGT_U(cmpOpU_commute cmp, flagsReg_ulong_LEGT flags, eRegL dst, eRegL src) %{
13101
+ match(Set dst (CMoveL (Binary cmp flags) (Binary dst src)));
13102
+ predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ));
13103
+ ins_cost(400);
13104
+ format %{ "CMOV$cmp $dst.lo,$src.lo\n\t"
13105
+ "CMOV$cmp $dst.hi,$src.hi" %}
13106
+ opcode(0x0F,0x40);
13107
+ ins_encode( enc_cmov(cmp), RegReg_Lo2( dst, src ), enc_cmov(cmp), RegReg_Hi2( dst, src ) );
13108
+ ins_pipe( pipe_cmov_reg_long );
13109
+ %}
13110
+
13111
+ instruct cmovLL_mem_LEGT_U(cmpOpU_commute cmp, flagsReg_ulong_LEGT flags, eRegL dst, load_long_memory src) %{
13112
+ match(Set dst (CMoveL (Binary cmp flags) (Binary dst (LoadL src))));
13113
+ predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ));
13114
+ ins_cost(500);
13115
+ format %{ "CMOV$cmp $dst.lo,$src.lo\n\t"
13116
+ "CMOV$cmp $dst.hi,$src.hi+4" %}
13117
+ opcode(0x0F,0x40);
13118
+ ins_encode( enc_cmov(cmp), RegMem(dst, src), enc_cmov(cmp), RegMem_Hi(dst, src) );
13119
+ ins_pipe( pipe_cmov_reg_long );
13120
+ %}
13121
+
13100
13122
// Compare 2 longs and CMOVE ints.
13101
13123
instruct cmovII_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, rRegI dst, rRegI src) %{
13102
13124
predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ));
0 commit comments