mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-24 13:04:33 +02:00
6909839: missing unsigned compare cases for some cmoves in sparc.ad
Reviewed-by: kvn, jrose
This commit is contained in:
parent
84ad3ddc31
commit
96612c6e23
2 changed files with 348 additions and 3 deletions
|
@ -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.
|
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
//
|
//
|
||||||
// This code is free software; you can redistribute it and/or modify it
|
// This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -6668,7 +6668,7 @@ instruct cmovII_imm(cmpOp cmp, flagsReg icc, iRegI dst, immI11 src) %{
|
||||||
ins_pipe(ialu_imm);
|
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)));
|
match(Set dst (CMoveI (Binary cmp icc) (Binary dst src)));
|
||||||
ins_cost(150);
|
ins_cost(150);
|
||||||
size(4);
|
size(4);
|
||||||
|
@ -6677,7 +6677,7 @@ instruct cmovII_U_reg(cmpOpU cmp, flagsRegU icc, iRegI dst, iRegI src) %{
|
||||||
ins_pipe(ialu_reg);
|
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)));
|
match(Set dst (CMoveI (Binary cmp icc) (Binary dst src)));
|
||||||
ins_cost(140);
|
ins_cost(140);
|
||||||
size(4);
|
size(4);
|
||||||
|
@ -6723,6 +6723,16 @@ instruct cmovNI_reg(cmpOp cmp, flagsReg icc, iRegN dst, iRegN src) %{
|
||||||
ins_pipe(ialu_reg);
|
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) %{
|
instruct cmovNF_reg(cmpOpF cmp, flagsRegF fcc, iRegN dst, iRegN src) %{
|
||||||
match(Set dst (CMoveN (Binary cmp fcc) (Binary dst src)));
|
match(Set dst (CMoveN (Binary cmp fcc) (Binary dst src)));
|
||||||
ins_cost(150);
|
ins_cost(150);
|
||||||
|
@ -6760,6 +6770,16 @@ instruct cmovPI_reg(cmpOp cmp, flagsReg icc, iRegP dst, iRegP src) %{
|
||||||
ins_pipe(ialu_reg);
|
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) %{
|
instruct cmovPI_imm(cmpOp cmp, flagsReg icc, iRegP dst, immP0 src) %{
|
||||||
match(Set dst (CMoveP (Binary cmp icc) (Binary dst src)));
|
match(Set dst (CMoveP (Binary cmp icc) (Binary dst src)));
|
||||||
ins_cost(140);
|
ins_cost(140);
|
||||||
|
@ -6770,6 +6790,16 @@ instruct cmovPI_imm(cmpOp cmp, flagsReg icc, iRegP dst, immP0 src) %{
|
||||||
ins_pipe(ialu_imm);
|
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) %{
|
instruct cmovPF_reg(cmpOpF cmp, flagsRegF fcc, iRegP dst, iRegP src) %{
|
||||||
match(Set dst (CMoveP (Binary cmp fcc) (Binary dst src)));
|
match(Set dst (CMoveP (Binary cmp fcc) (Binary dst src)));
|
||||||
ins_cost(150);
|
ins_cost(150);
|
||||||
|
@ -6809,6 +6839,17 @@ instruct cmovFI_reg(cmpOp cmp, flagsReg icc, regF dst, regF src) %{
|
||||||
ins_pipe(int_conditional_float_move);
|
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,
|
// Conditional move,
|
||||||
instruct cmovFF_reg(cmpOpF cmp, flagsRegF fcc, regF dst, regF src) %{
|
instruct cmovFF_reg(cmpOpF cmp, flagsRegF fcc, regF dst, regF src) %{
|
||||||
match(Set dst (CMoveF (Binary cmp fcc) (Binary dst src)));
|
match(Set dst (CMoveF (Binary cmp fcc) (Binary dst src)));
|
||||||
|
@ -6842,6 +6883,17 @@ instruct cmovDI_reg(cmpOp cmp, flagsReg icc, regD dst, regD src) %{
|
||||||
ins_pipe(int_conditional_double_move);
|
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,
|
// Conditional move,
|
||||||
instruct cmovDF_reg(cmpOpF cmp, flagsRegF fcc, regD dst, regD src) %{
|
instruct cmovDF_reg(cmpOpF cmp, flagsRegF fcc, regD dst, regD src) %{
|
||||||
match(Set dst (CMoveD (Binary cmp fcc) (Binary dst src)));
|
match(Set dst (CMoveD (Binary cmp fcc) (Binary dst src)));
|
||||||
|
@ -6881,6 +6933,17 @@ instruct cmovLI_reg(cmpOp cmp, flagsReg icc, iRegL dst, iRegL src) %{
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
|
||||||
|
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) %{
|
instruct cmovLF_reg(cmpOpF cmp, flagsRegF fcc, iRegL dst, iRegL src) %{
|
||||||
match(Set dst (CMoveL (Binary cmp fcc) (Binary dst src)));
|
match(Set dst (CMoveL (Binary cmp fcc) (Binary dst src)));
|
||||||
ins_cost(150);
|
ins_cost(150);
|
||||||
|
|
282
hotspot/test/compiler/6909839/Test6909839.java
Normal file
282
hotspot/test/compiler/6909839/Test6909839.java
Normal file
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue