--- a/hotspot/src/cpu/x86/vm/x86_64.ad Wed May 25 16:04:09 2011 -0700
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Wed May 25 21:17:07 2011 -0700
@@ -3179,50 +3179,6 @@
emit_rm(cbuf, 0x3, 0x0, dstenc);
%}
- enc_class enc_cmpLTP(no_rcx_RegI p, no_rcx_RegI q, no_rcx_RegI y,
- rcx_RegI tmp)
- %{
- // cadd_cmpLT
-
- int tmpReg = $tmp$$reg;
-
- int penc = $p$$reg;
- int qenc = $q$$reg;
- int yenc = $y$$reg;
-
- // subl $p,$q
- if (penc < 8) {
- if (qenc >= 8) {
- emit_opcode(cbuf, Assembler::REX_B);
- }
- } else {
- if (qenc < 8) {
- emit_opcode(cbuf, Assembler::REX_R);
- } else {
- emit_opcode(cbuf, Assembler::REX_RB);
- }
- }
- emit_opcode(cbuf, 0x2B);
- emit_rm(cbuf, 0x3, penc & 7, qenc & 7);
-
- // sbbl $tmp, $tmp
- emit_opcode(cbuf, 0x1B);
- emit_rm(cbuf, 0x3, tmpReg, tmpReg);
-
- // andl $tmp, $y
- if (yenc >= 8) {
- emit_opcode(cbuf, Assembler::REX_B);
- }
- emit_opcode(cbuf, 0x23);
- emit_rm(cbuf, 0x3, tmpReg, yenc & 7);
-
- // addl $p,$tmp
- if (penc >= 8) {
- emit_opcode(cbuf, Assembler::REX_R);
- }
- emit_opcode(cbuf, 0x03);
- emit_rm(cbuf, 0x3, penc & 7, tmpReg);
- %}
// Compare the lonogs and set -1, 0, or 1 into dst
enc_class cmpl3_flag(rRegL src1, rRegL src2, rRegI dst)
@@ -10206,9 +10162,7 @@
%}
-instruct cadd_cmpLTMask(rRegI p, rRegI q, rRegI y,
- rRegI tmp,
- rFlagsReg cr)
+instruct cadd_cmpLTMask(rRegI p, rRegI q, rRegI y, rRegI tmp, rFlagsReg cr)
%{
match(Set p (AddI (AndI (CmpLTMask p q) y) (SubI p q)));
effect(TEMP tmp, KILL cr);
@@ -10218,25 +10172,19 @@
"sbbl $tmp, $tmp\n\t"
"andl $tmp, $y\n\t"
"addl $p, $tmp" %}
- ins_encode(enc_cmpLTP(p, q, y, tmp));
+ ins_encode %{
+ Register Rp = $p$$Register;
+ Register Rq = $q$$Register;
+ Register Ry = $y$$Register;
+ Register Rt = $tmp$$Register;
+ __ subl(Rp, Rq);
+ __ sbbl(Rt, Rt);
+ __ andl(Rt, Ry);
+ __ addl(Rp, Rt);
+ %}
ins_pipe(pipe_cmplt);
%}
-/* If I enable this, I encourage spilling in the inner loop of compress.
-instruct cadd_cmpLTMask_mem( rRegI p, rRegI q, memory y, rRegI tmp, rFlagsReg cr )
-%{
- match(Set p (AddI (AndI (CmpLTMask p q) (LoadI y)) (SubI p q)));
- effect( TEMP tmp, KILL cr );
- ins_cost(400);
-
- format %{ "SUB $p,$q\n\t"
- "SBB RCX,RCX\n\t"
- "AND RCX,$y\n\t"
- "ADD $p,RCX" %}
- ins_encode( enc_cmpLTP_mem(p,q,y,tmp) );
-%}
-*/
-
//---------- FP Instructions------------------------------------------------
instruct cmpF_cc_reg(rFlagsRegU cr, regF src1, regF src2)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/7048332/Test7048332.java Wed May 25 21:17:07 2011 -0700
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+/**
+ * @test
+ * @bug 7048332
+ * @summary Cadd_cmpLTMask doesn't handle 64-bit tmp register properly
+ *
+ * @run main/othervm -Xbatch Test7048332
+ */
+
+
+public class Test7048332 {
+
+ static int capacity = 2;
+ static int first = 1;
+ static int last = 2;
+
+ static int test(int i1, int i2, int i3, int i4, int i5, int i6) {
+ final int result;
+ if (last >= first) {
+ result = last - first;
+ } else {
+ result = last - first + capacity;
+ }
+ return result;
+ }
+
+ public static void main(String [] args) {
+ for (int i = 0; i < 11000; i++) {
+ last = (i & 1) << 1; // 0 or 2
+ int k = test(1, 2, 3, 4, 5, 6);
+ if (k != 1) {
+ System.out.println("FAILED: " + k + " != 1");
+ System.exit(97);
+ }
+ }
+ }
+}