[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