7048332: Cadd_cmpLTMask doesn't handle 64-bit tmp register properly
Use ins_encode %{ %} form to encode cadd_cmpLTMask() instruction and remove unused code. Reviewed-by: never
This commit is contained in:
parent
f6d95d906a
commit
a1e18b9ed3
hotspot
@ -3179,50 +3179,6 @@ encode %{
|
||||
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 cmpLTMask0(rRegI dst, immI0 zero, rFlagsReg cr)
|
||||
%}
|
||||
|
||||
|
||||
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 @@ instruct cadd_cmpLTMask(rRegI p, rRegI q, rRegI y,
|
||||
"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)
|
||||
|
60
hotspot/test/compiler/7048332/Test7048332.java
Normal file
60
hotspot/test/compiler/7048332/Test7048332.java
Normal file
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user