--- a/src/hotspot/cpu/aarch64/aarch64.ad Mon Apr 29 10:27:44 2019 +0100
+++ b/src/hotspot/cpu/aarch64/aarch64.ad Fri Apr 26 16:38:39 2019 +0800
@@ -14046,55 +14046,63 @@
// ============================================================================
// Max and Min
-instruct minI_rReg(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
-%{
- match(Set dst (MinI src1 src2));
-
- effect(DEF dst, USE src1, USE src2, KILL cr);
- size(8);
-
- ins_cost(INSN_COST * 3);
- format %{
- "cmpw $src1 $src2\t signed int\n\t"
- "cselw $dst, $src1, $src2 lt\t"
- %}
-
- ins_encode %{
- __ cmpw(as_Register($src1$$reg),
- as_Register($src2$$reg));
+instruct cmovI_reg_reg_lt(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
+%{
+ effect( DEF dst, USE src1, USE src2, USE cr );
+
+ ins_cost(INSN_COST * 2);
+ format %{ "cselw $dst, $src1, $src2 lt\t" %}
+
+ ins_encode %{
__ cselw(as_Register($dst$$reg),
as_Register($src1$$reg),
as_Register($src2$$reg),
Assembler::LT);
%}
- ins_pipe(ialu_reg_reg);
+ ins_pipe(icond_reg_reg);
+%}
+
+instruct minI_rReg(iRegINoSp dst, iRegI src1, iRegI src2)
+%{
+ match(Set dst (MinI src1 src2));
+ ins_cost(INSN_COST * 3);
+
+ expand %{
+ rFlagsReg cr;
+ compI_reg_reg(cr, src1, src2);
+ cmovI_reg_reg_lt(dst, src1, src2, cr);
+ %}
+
%}
// FROM HERE
-instruct maxI_rReg(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
-%{
- match(Set dst (MaxI src1 src2));
-
- effect(DEF dst, USE src1, USE src2, KILL cr);
- size(8);
-
- ins_cost(INSN_COST * 3);
- format %{
- "cmpw $src1 $src2\t signed int\n\t"
- "cselw $dst, $src1, $src2 gt\t"
- %}
-
- ins_encode %{
- __ cmpw(as_Register($src1$$reg),
- as_Register($src2$$reg));
+instruct cmovI_reg_reg_gt(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
+%{
+ effect( DEF dst, USE src1, USE src2, USE cr );
+
+ ins_cost(INSN_COST * 2);
+ format %{ "cselw $dst, $src1, $src2 gt\t" %}
+
+ ins_encode %{
__ cselw(as_Register($dst$$reg),
as_Register($src1$$reg),
as_Register($src2$$reg),
Assembler::GT);
%}
- ins_pipe(ialu_reg_reg);
+ ins_pipe(icond_reg_reg);
+%}
+
+instruct maxI_rReg(iRegINoSp dst, iRegI src1, iRegI src2)
+%{
+ match(Set dst (MaxI src1 src2));
+ ins_cost(INSN_COST * 3);
+ expand %{
+ rFlagsReg cr;
+ compI_reg_reg(cr, src1, src2);
+ cmovI_reg_reg_gt(dst, src1, src2, cr);
+ %}
%}
// ============================================================================