SUGGESTED FIX
The AD file was trying to stuff a long value into an 8bit immediate. This was causing bits to be lost.
###@###.### 2004-01-22
*** /home/azeem/public_html/webrev/cmp/src/cpu/ia64/vm/ia64.ad- Tue Jan 27 14:57:20 2004
--- ia64.ad Tue Jan 27 14:57:45 2004
***************
*** 1,6 ****
! // @(#)ia64.ad 1.106 04/01/15 15:45:59
//
// Copyright 2000-2002 Sun Microsystems, Inc. All rights reserved.
// SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
//
--- 1,6 ----
! // @(#)ia64.ad 1.107 04/01/27 14:57:43
//
// Copyright 2000-2002 Sun Microsystems, Inc. All rights reserved.
// SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
//
***************
*** 5074,5084 ****
interface(CONST_INTER);
%}
// Integer Immediate: 8-bit
operand immL8m1() %{
! predicate(Assembler::is_simm8(n->get_long()-1));
match(ConL);
op_cost(5);
format %{ %}
interface(CONST_INTER);
--- 5074,5084 ----
interface(CONST_INTER);
%}
// Integer Immediate: 8-bit
operand immL8m1() %{
! predicate((-127L <= n->get_long()) && (n->get_long() <= 128L));
match(ConL);
op_cost(5);
format %{ %}
interface(CONST_INTER);
***************
*** 11128,11138 ****
%}
instruct if_cmpL_reg_immL8(cmpOp cmp, gRegL src1, immL8 src2, label labl, pr6_pReg pr) %{
match(If cmp (CmpL src1 src2));
effect(USE cmp, USE src1, USE src2, USE labl, KILL pr);
! predicate( _kids[0]->_leaf->is_Bool()->_test._test == BoolTest::eq || _kids[0]->_leaf->is_Bool()->_test._test == BoolTest::ne || _kids[0]->_leaf->is_Bool()->_test._test == BoolTest::gt || _kids[0]->_leaf->is_Bool()->_test._test == BoolTest::le );
ins_cost(BRANCH_COST + DEFAULT_COST);
format %{ "CMP.$cmp PR6,PR0=$src1,$src2\t// long\n\t(PR6) BR $labl" %}
ins_encode( emit_cmp_reg_imm( cmp, PR6, PR0, src1, src2, PR0 ), emit_branch( labl, PR6 ) );
ins_pipe(pr_pr_ICMP_gr_imm__BR_pr);
--- 11128,11141 ----
%}
instruct if_cmpL_reg_immL8(cmpOp cmp, gRegL src1, immL8 src2, label labl, pr6_pReg pr) %{
match(If cmp (CmpL src1 src2));
effect(USE cmp, USE src1, USE src2, USE labl, KILL pr);
! predicate( _kids[0]->_leaf->is_Bool()->_test._test == BoolTest::eq ||
! _kids[0]->_leaf->is_Bool()->_test._test == BoolTest::ne ||
! _kids[0]->_leaf->is_Bool()->_test._test == BoolTest::gt ||
! _kids[0]->_leaf->is_Bool()->_test._test == BoolTest::le );
ins_cost(BRANCH_COST + DEFAULT_COST);
format %{ "CMP.$cmp PR6,PR0=$src1,$src2\t// long\n\t(PR6) BR $labl" %}
ins_encode( emit_cmp_reg_imm( cmp, PR6, PR0, src1, src2, PR0 ), emit_branch( labl, PR6 ) );
ins_pipe(pr_pr_ICMP_gr_imm__BR_pr);
***************
*** 11140,11150 ****
// Long branch on less than
instruct if_cmpL_reg_immL8m1(cmpOp cmp, gRegL src1, immL8m1 src2, label labl, pr6_pReg pr) %{
match(If cmp (CmpL src1 src2));
effect(USE cmp, USE src1, USE src2, USE labl, KILL pr);
! predicate( _kids[0]->_leaf->is_Bool()->_test._test == BoolTest::lt || _kids[0]->_leaf->is_Bool()->_test._test == BoolTest::ge );
ins_cost(BRANCH_COST + DEFAULT_COST);
format %{ "CMP.$cmp PR6,PR0=$src1,$src2\t// long\n\t(PR6) BR $labl" %}
ins_encode( emit_cmp_reg_imm( cmp, PR6, PR0, src1, src2, PR0 ), emit_branch( labl, PR6 ) );
ins_pipe(pr_pr_ICMP_gr_imm__BR_pr);
--- 11143,11154 ----
// Long branch on less than
instruct if_cmpL_reg_immL8m1(cmpOp cmp, gRegL src1, immL8m1 src2, label labl, pr6_pReg pr) %{
match(If cmp (CmpL src1 src2));
effect(USE cmp, USE src1, USE src2, USE labl, KILL pr);
! predicate( _kids[0]->_leaf->is_Bool()->_test._test == BoolTest::lt ||
! _kids[0]->_leaf->is_Bool()->_test._test == BoolTest::ge );
ins_cost(BRANCH_COST + DEFAULT_COST);
format %{ "CMP.$cmp PR6,PR0=$src1,$src2\t// long\n\t(PR6) BR $labl" %}
ins_encode( emit_cmp_reg_imm( cmp, PR6, PR0, src1, src2, PR0 ), emit_branch( labl, PR6 ) );
ins_pipe(pr_pr_ICMP_gr_imm__BR_pr);
###@###.### 2004-01-27
|