--- a/hotspot/src/cpu/sparc/vm/sparc.ad Fri Jan 08 22:02:42 2010 -0800
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad Sat Jan 09 00:59:35 2010 -0800
@@ -1,5 +1,5 @@
//
-// Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
+// Copyright 1998-2010 Sun Microsystems, Inc. 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
@@ -6668,7 +6668,7 @@
ins_pipe(ialu_imm);
%}
-instruct cmovII_U_reg(cmpOpU cmp, flagsRegU icc, iRegI dst, iRegI src) %{
+instruct cmovIIu_reg(cmpOpU cmp, flagsRegU icc, iRegI dst, iRegI src) %{
match(Set dst (CMoveI (Binary cmp icc) (Binary dst src)));
ins_cost(150);
size(4);
@@ -6677,7 +6677,7 @@
ins_pipe(ialu_reg);
%}
-instruct cmovII_U_imm(cmpOpU cmp, flagsRegU icc, iRegI dst, immI11 src) %{
+instruct cmovIIu_imm(cmpOpU cmp, flagsRegU icc, iRegI dst, immI11 src) %{
match(Set dst (CMoveI (Binary cmp icc) (Binary dst src)));
ins_cost(140);
size(4);
@@ -6723,6 +6723,16 @@
ins_pipe(ialu_reg);
%}
+// This instruction also works with CmpN so we don't need cmovNN_reg.
+instruct cmovNIu_reg(cmpOpU cmp, flagsRegU icc, iRegN dst, iRegN src) %{
+ match(Set dst (CMoveN (Binary cmp icc) (Binary dst src)));
+ ins_cost(150);
+ size(4);
+ format %{ "MOV$cmp $icc,$src,$dst" %}
+ ins_encode( enc_cmov_reg(cmp,dst,src, (Assembler::icc)) );
+ ins_pipe(ialu_reg);
+%}
+
instruct cmovNF_reg(cmpOpF cmp, flagsRegF fcc, iRegN dst, iRegN src) %{
match(Set dst (CMoveN (Binary cmp fcc) (Binary dst src)));
ins_cost(150);
@@ -6760,6 +6770,16 @@
ins_pipe(ialu_reg);
%}
+instruct cmovPIu_reg(cmpOpU cmp, flagsRegU icc, iRegP dst, iRegP src) %{
+ match(Set dst (CMoveP (Binary cmp icc) (Binary dst src)));
+ ins_cost(150);
+
+ size(4);
+ format %{ "MOV$cmp $icc,$src,$dst\t! ptr" %}
+ ins_encode( enc_cmov_reg(cmp,dst,src, (Assembler::icc)) );
+ ins_pipe(ialu_reg);
+%}
+
instruct cmovPI_imm(cmpOp cmp, flagsReg icc, iRegP dst, immP0 src) %{
match(Set dst (CMoveP (Binary cmp icc) (Binary dst src)));
ins_cost(140);
@@ -6770,6 +6790,16 @@
ins_pipe(ialu_imm);
%}
+instruct cmovPIu_imm(cmpOpU cmp, flagsRegU icc, iRegP dst, immP0 src) %{
+ match(Set dst (CMoveP (Binary cmp icc) (Binary dst src)));
+ ins_cost(140);
+
+ size(4);
+ format %{ "MOV$cmp $icc,$src,$dst\t! ptr" %}
+ ins_encode( enc_cmov_imm(cmp,dst,src, (Assembler::icc)) );
+ ins_pipe(ialu_imm);
+%}
+
instruct cmovPF_reg(cmpOpF cmp, flagsRegF fcc, iRegP dst, iRegP src) %{
match(Set dst (CMoveP (Binary cmp fcc) (Binary dst src)));
ins_cost(150);
@@ -6809,6 +6839,17 @@
ins_pipe(int_conditional_float_move);
%}
+instruct cmovFIu_reg(cmpOpU cmp, flagsRegU icc, regF dst, regF src) %{
+ match(Set dst (CMoveF (Binary cmp icc) (Binary dst src)));
+ ins_cost(150);
+
+ size(4);
+ format %{ "FMOVS$cmp $icc,$src,$dst" %}
+ opcode(0x101);
+ ins_encode( enc_cmovf_reg(cmp,dst,src, (Assembler::icc)) );
+ ins_pipe(int_conditional_float_move);
+%}
+
// Conditional move,
instruct cmovFF_reg(cmpOpF cmp, flagsRegF fcc, regF dst, regF src) %{
match(Set dst (CMoveF (Binary cmp fcc) (Binary dst src)));
@@ -6842,6 +6883,17 @@
ins_pipe(int_conditional_double_move);
%}
+instruct cmovDIu_reg(cmpOpU cmp, flagsRegU icc, regD dst, regD src) %{
+ match(Set dst (CMoveD (Binary cmp icc) (Binary dst src)));
+ ins_cost(150);
+
+ size(4);
+ format %{ "FMOVD$cmp $icc,$src,$dst" %}
+ opcode(0x102);
+ ins_encode( enc_cmovf_reg(cmp,dst,src, (Assembler::icc)) );
+ ins_pipe(int_conditional_double_move);
+%}
+
// Conditional move,
instruct cmovDF_reg(cmpOpF cmp, flagsRegF fcc, regD dst, regD src) %{
match(Set dst (CMoveD (Binary cmp fcc) (Binary dst src)));
@@ -6881,6 +6933,17 @@
%}
+instruct cmovLIu_reg(cmpOpU cmp, flagsRegU icc, iRegL dst, iRegL src) %{
+ match(Set dst (CMoveL (Binary cmp icc) (Binary dst src)));
+ ins_cost(150);
+
+ size(4);
+ format %{ "MOV$cmp $icc,$src,$dst\t! long" %}
+ ins_encode( enc_cmov_reg(cmp,dst,src, (Assembler::icc)) );
+ ins_pipe(ialu_reg);
+%}
+
+
instruct cmovLF_reg(cmpOpF cmp, flagsRegF fcc, iRegL dst, iRegL src) %{
match(Set dst (CMoveL (Binary cmp fcc) (Binary dst src)));
ins_cost(150);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/6909839/Test6909839.java Sat Jan 09 00:59:35 2010 -0800
@@ -0,0 +1,282 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+/**
+ * @test
+ * @bug 6909839
+ * @summary missing unsigned compare cases for some cmoves in sparc.ad
+ *
+ * @run main/othervm -XX:+AggressiveOpts -Xbatch Test6909839
+ */
+
+public class Test6909839 {
+ public static void main(String[] args) {
+ testi();
+ testi();
+ testi();
+ testui();
+ testui();
+ testui();
+ testdi();
+ testdi();
+ testdi();
+ testfi();
+ testfi();
+ testfi();
+
+ testl();
+ testl();
+ testl();
+ testul();
+ testul();
+ testul();
+ testdl();
+ testdl();
+ testdl();
+ testfl();
+ testfl();
+ testfl();
+
+ testf();
+ testf();
+ testf();
+ testuf();
+ testuf();
+ testuf();
+ testdf();
+ testdf();
+ testdf();
+ testff();
+ testff();
+ testff();
+
+ testd();
+ testd();
+ testd();
+ testud();
+ testud();
+ testud();
+ testdd();
+ testdd();
+ testdd();
+ testfd();
+ testfd();
+ testfd();
+
+ testp();
+ testp();
+ testp();
+ testup();
+ testup();
+ testup();
+ testdp();
+ testdp();
+ testdp();
+ testfp();
+ testfp();
+ testfp();
+ }
+
+ static void testui() {
+ int total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += ((v >= 1 && v < 3) ? 1 : 2);
+ }
+ System.out.println(total);
+ }
+
+ static void testdi() {
+ int total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += (v > 1.0) ? 1 : 2;
+ }
+ System.out.println(total);
+ }
+
+ static void testfi() {
+ int total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += (v > 1.0f) ? 1 : 2;
+ }
+ System.out.println(total);
+ }
+
+ static void testi() {
+ int total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ total += (i % 4 != 0) ? 1 : 2;
+ }
+ System.out.println(total);
+ }
+
+ static void testul() {
+ long total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += ((v >= 1 && v < 3) ? 1L : 2L);
+ }
+ System.out.println(total);
+ }
+
+ static void testdl() {
+ long total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += (v > 1.0) ? 1L : 2L;
+ }
+ System.out.println(total);
+ }
+
+ static void testfl() {
+ long total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += (v > 1.0f) ? 1L : 2L;
+ }
+ System.out.println(total);
+ }
+
+ static void testl() {
+ long total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ total += (i % 4 != 0) ? 1L : 2L;
+ }
+ System.out.println(total);
+ }
+
+ static void testuf() {
+ float total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += ((v >= 1 && v < 3) ? 1.0f : 2.0f);
+ }
+ System.out.println(total);
+ }
+
+ static void testdf() {
+ float total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += (v > 0.0) ? 1.0f : 2.0f;
+ }
+ System.out.println(total);
+ }
+
+ static void testff() {
+ float total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += (v > 0.0f) ? 1.0f : 2.0f;
+ }
+ System.out.println(total);
+ }
+
+ static void testf() {
+ float total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ total += (i % 4 != 0) ? 1.0f : 2.0f;
+ }
+ System.out.println(total);
+ }
+
+ static void testud() {
+ double total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += ((v >= 1 && v < 3) ? 1.0d : 2.0d);
+ }
+ System.out.println(total);
+ }
+
+ static void testdd() {
+ double total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += (v > 1.0) ? 1.0d : 2.0d;
+ }
+ System.out.println(total);
+ }
+
+ static void testfd() {
+ double total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += (v > 1.0f) ? 1.0d : 2.0d;
+ }
+ System.out.println(total);
+ }
+
+ static void testd() {
+ double total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ total += (i % 4 != 0) ? 1.0d : 2.0d;
+ }
+ System.out.println(total);
+ }
+
+ static void testp() {
+ Object a = new Object();
+ Object b = new Object();;
+ int total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ total += ((i % 4 != 0) ? a : b).hashCode();
+ }
+ System.out.println(total);
+ }
+
+ static void testup() {
+ Object a = new Object();
+ Object b = new Object();;
+ int total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += ((v >= 1 && v < 3) ? a : b).hashCode();
+ }
+ System.out.println(total);
+ }
+
+ static void testdp() {
+ Object a = new Object();
+ Object b = new Object();;
+ int total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += ((v > 1.0) ? a : b).hashCode();
+ }
+ System.out.println(total);
+ }
+ static void testfp() {
+ Object a = new Object();
+ Object b = new Object();;
+ int total = 0;
+ for (int i = 0 ; i < 10000; i++) {
+ int v = i % 4;
+ total += ((v > 1.0f) ? a : b).hashCode();
+ }
+ System.out.println(total);
+ }
+}