--- old/src/cpu/sparc/vm/sparc.ad Wed Jan 6 20:53:28 2010 +++ new/src/cpu/sparc/vm/sparc.ad Wed Jan 6 20:53:28 2010 @@ -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))); @@ -6873,6 +6925,17 @@ instruct cmovLI_reg(cmpOp cmp, flagsReg 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 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" %} --- /dev/null Wed Jan 6 20:53:29 2010 +++ new/test/compiler/6909839/Test6909839.java Wed Jan 6 20:53:29 2010 @@ -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); + } +}