提交 f30a102e 编写于 作者: K kvn

7048332: Cadd_cmpLTMask doesn't handle 64-bit tmp register properly

Summary: Use ins_encode %{ %} form to encode cadd_cmpLTMask() instruction and remove unused code.
Reviewed-by: never
上级 e090d6cb
......@@ -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)
......
/*
* 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);
}
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册