i386.md (ashrsi3_cmpno, [...]): Remove redundant '@' from the template.
* i386.md (ashrsi3_cmpno, ashrhi3_cmpno, ashrqi3_cmpno, lshrsi3_cmpno, lshrhi3_cmpno): Remove redundant '@' from the template. * i386.md (cmpstrsi_1): Fix type of the compare. * genattrtab.c (attr_rtx_cost): New function. (simplify_test_exp): Avoid overactive inlining; use temporary obstacks for tests. From-SVN: r38310
This commit is contained in:
parent
43db5b3c2c
commit
2bed339138
@ -1,3 +1,14 @@
|
||||
Sat Dec 16 19:56:24 MET 2000 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* i386.md (ashrsi3_cmpno, ashrhi3_cmpno, ashrqi3_cmpno, lshrsi3_cmpno,
|
||||
lshrhi3_cmpno): Remove redundant '@' from the template.
|
||||
|
||||
* i386.md (cmpstrsi_1): Fix type of the compare.
|
||||
|
||||
* genattrtab.c (attr_rtx_cost): New function.
|
||||
(simplify_test_exp): Avoid overactive inlining; use temporary
|
||||
obstacks for tests.
|
||||
|
||||
Sat Dec 16 10:41:11 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
|
||||
|
||||
* stor-layout.c (place_field): Treat overflowing DECL_SIZE_UNIT
|
||||
|
@ -7517,8 +7517,7 @@
|
||||
(ashiftrt:SI (match_dup 1) (match_dup 2)))]
|
||||
"ix86_match_ccmode (insn, CCNOmode)
|
||||
&& ix86_binary_operator_ok (ASHIFTRT, SImode, operands)"
|
||||
"@
|
||||
sar{l}\\t{%2, %0|%0, %2}"
|
||||
"sar{l}\\t{%2, %0|%0, %2}"
|
||||
[(set_attr "type" "ishift")
|
||||
(set_attr "mode" "SI")])
|
||||
|
||||
@ -7590,8 +7589,7 @@
|
||||
(ashiftrt:HI (match_dup 1) (match_dup 2)))]
|
||||
"ix86_match_ccmode (insn, CCNOmode)
|
||||
&& ix86_binary_operator_ok (ASHIFTRT, HImode, operands)"
|
||||
"@
|
||||
sar{w}\\t{%2, %0|%0, %2}"
|
||||
"sar{w}\\t{%2, %0|%0, %2}"
|
||||
[(set_attr "type" "ishift")
|
||||
(set_attr "mode" "HI")])
|
||||
|
||||
@ -7663,8 +7661,7 @@
|
||||
(ashiftrt:QI (match_dup 1) (match_dup 2)))]
|
||||
"ix86_match_ccmode (insn, CCNOmode)
|
||||
&& ix86_binary_operator_ok (ASHIFTRT, QImode, operands)"
|
||||
"@
|
||||
sar{b}\\t{%2, %0|%0, %2}"
|
||||
"sar{b}\\t{%2, %0|%0, %2}"
|
||||
[(set_attr "type" "ishift")
|
||||
(set_attr "mode" "QI")])
|
||||
|
||||
@ -7793,8 +7790,7 @@
|
||||
(lshiftrt:SI (match_dup 1) (match_dup 2)))]
|
||||
"ix86_match_ccmode (insn, CCGOCmode)
|
||||
&& ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
|
||||
"@
|
||||
shr{l}\\t{%2, %0|%0, %2}"
|
||||
"shr{l}\\t{%2, %0|%0, %2}"
|
||||
[(set_attr "type" "ishift")
|
||||
(set_attr "mode" "SI")])
|
||||
|
||||
@ -7866,8 +7862,7 @@
|
||||
(lshiftrt:HI (match_dup 1) (match_dup 2)))]
|
||||
"ix86_match_ccmode (insn, CCGOCmode)
|
||||
&& ix86_binary_operator_ok (LSHIFTRT, HImode, operands)"
|
||||
"@
|
||||
shr{w}\\t{%2, %0|%0, %2}"
|
||||
"shr{w}\\t{%2, %0|%0, %2}"
|
||||
[(set_attr "type" "ishift")
|
||||
(set_attr "mode" "HI")])
|
||||
|
||||
@ -10507,7 +10502,7 @@
|
||||
[(set (reg:CC 17)
|
||||
(if_then_else:CC (ne (match_operand:SI 6 "register_operand" "2")
|
||||
(const_int 0))
|
||||
(compare:SI (mem:BLK (match_operand:SI 4 "register_operand" "0"))
|
||||
(compare:CC (mem:BLK (match_operand:SI 4 "register_operand" "0"))
|
||||
(mem:BLK (match_operand:SI 5 "register_operand" "1")))
|
||||
(const_int 0)))
|
||||
(use (match_operand:SI 3 "immediate_operand" "i"))
|
||||
|
@ -460,6 +460,7 @@ static rtx attr_eq PARAMS ((const char *, const char *));
|
||||
static const char *attr_numeral PARAMS ((int));
|
||||
static int attr_equal_p PARAMS ((rtx, rtx));
|
||||
static rtx attr_copy_rtx PARAMS ((rtx));
|
||||
static int attr_rtx_cost PARAMS ((rtx));
|
||||
|
||||
#define oballoc(size) obstack_alloc (hash_obstack, size)
|
||||
|
||||
@ -3151,6 +3152,53 @@ simplify_or_tree (exp, pterm, insn_code, insn_index)
|
||||
|
||||
return exp;
|
||||
}
|
||||
/* Compute approximate cost of the expression. Used to decide whether
|
||||
expression is cheap enought for inline. */
|
||||
static int
|
||||
attr_rtx_cost (x)
|
||||
rtx x;
|
||||
{
|
||||
int cost = 0;
|
||||
enum rtx_code code;
|
||||
if (!x)
|
||||
return 0;
|
||||
code = GET_CODE (x);
|
||||
switch (code)
|
||||
{
|
||||
case MATCH_OPERAND:
|
||||
if (XSTR (x, 1)[0])
|
||||
return 10;
|
||||
else
|
||||
return 0;
|
||||
case EQ_ATTR:
|
||||
/* Alternatives don't result into function call. */
|
||||
if (!strcmp (XSTR (x, 0), "alternative"))
|
||||
return 0;
|
||||
else
|
||||
return 5;
|
||||
default:
|
||||
{
|
||||
int i, j;
|
||||
const char *fmt = GET_RTX_FORMAT (code);
|
||||
for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
|
||||
{
|
||||
switch (fmt[i])
|
||||
{
|
||||
case 'V':
|
||||
case 'E':
|
||||
for (j = 0; j < XVECLEN (x, i); j++)
|
||||
cost += attr_rtx_cost (XVECEXP (x, i, j));
|
||||
break;
|
||||
case 'e':
|
||||
cost += attr_rtx_cost (XEXP (x, i));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return cost;
|
||||
}
|
||||
|
||||
/* Given an expression, see if it can be simplified for a particular insn
|
||||
code based on the values of other attributes being tested. This can
|
||||
@ -3407,7 +3455,16 @@ simplify_test_exp (exp, insn_code, insn_index)
|
||||
for (av = attr->first_value; av; av = av->next)
|
||||
for (ie = av->first_insn; ie; ie = ie->next)
|
||||
if (ie->insn_code == insn_code)
|
||||
return evaluate_eq_attr (exp, av->value, insn_code, insn_index);
|
||||
{
|
||||
rtx x;
|
||||
struct obstack *old = rtl_obstack;
|
||||
rtl_obstack = temp_obstack;
|
||||
x = evaluate_eq_attr (exp, av->value, insn_code, insn_index);
|
||||
x = SIMPLIFY_TEST_EXP (x, insn_code, insn_index);
|
||||
rtl_obstack = old;
|
||||
if (attr_rtx_cost(x) < 20)
|
||||
return attr_copy_rtx (x);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user