[aarch64-port-dev ] JDK9: Fix CmpL3

Andrew Haley aph at redhat.com
Wed Aug 20 14:54:17 UTC 2014


This is a new pattern in JDK9, and I messed up when I did the merge.

Fixed thusly, and I also added a compare with constant (because that
seems to happen a lot) pattern.

Andrew.


diff -r 12c8017e2544 src/cpu/aarch64/vm/aarch64.ad
--- a/src/cpu/aarch64/vm/aarch64.ad     Mon Aug 11 11:58:51 2014 -0400
+++ b/src/cpu/aarch64/vm/aarch64.ad     Wed Aug 20 10:51:55 2014 -0400
@@ -6549,8 +6549,7 @@
   ins_pipe(pipe_class_memory);
 %}

-// Manifest a CmpL result in an integer register.  Very painful.
-// This is the test to avoid.
+// Manifest a CmpL result in an integer register.
 // (src1 < src2) ? -1 : ((src1 > src2) ? 1 : 0)
 instruct cmpL3_reg_reg(iRegINoSp dst, iRegL src1, iRegL src2, rFlagsReg flags)
 %{
@@ -6561,9 +6560,29 @@
   format %{ "CmpL3 $dst, $src1, $src2" %}
   ins_encode %{
     __ cmp($src1$$Register, $src2$$Register);
-    __ movw($dst$$Register, -1);
-    __ cselw($dst$$Register, zr, $dst$$Register, Assembler::EQ);
-    __ csincw($dst$$Register, $dst$$Register, zr, Assembler::GT);
+    __ csetw($dst$$Register, Assembler::NE);
+    __ cnegw($dst$$Register, $dst$$Register, Assembler::LT);
+  %}
+
+  ins_pipe(pipe_class_default);
+%}
+
+instruct cmpL3_reg_imm(iRegINoSp dst, iRegL src1, immLAddSub src2, rFlagsReg flags)
+%{
+  match(Set dst (CmpL3 src1 src2));
+  effect(KILL flags);
+
+  ins_cost(INSN_COST * 6);
+  format %{ "CmpL3 $dst, $src1, $src2" %}
+  ins_encode %{
+    int32_t con = (int32_t)$src2$$constant;
+     if (con < 0) {
+      __ adds(zr, $src1$$Register, -con);
+    } else {
+      __ subs(zr, $src1$$Register, con);
+    }
+    __ csetw($dst$$Register, Assembler::NE);
+    __ cnegw($dst$$Register, $dst$$Register, Assembler::LT);
   %}

   ins_pipe(pipe_class_default);
@@ -7348,8 +7367,8 @@
   format %{ "negw $dst, $src\t# int" %}

   ins_encode %{
-    __ negsw(as_Register($dst$$reg),
-             as_Register($src$$reg));
+    __ negw(as_Register($dst$$reg),
+           as_Register($src$$reg));
   %}



More information about the aarch64-port-dev mailing list