From: Jan Hubicka Date: Sat, 16 Dec 2000 19:00:57 +0000 (+0100) Subject: i386.md (ashrsi3_cmpno, [...]): Remove redundant '@' from the template. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2bed3391384aef335885b8271a085e1c18f3d0f1;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4c8093f5252..91a8e0887d2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +Sat Dec 16 19:56:24 MET 2000 Jan Hubicka + + * 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 * stor-layout.c (place_field): Treat overflowing DECL_SIZE_UNIT diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index f3d05bba350..72954bf9e2e 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -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")) diff --git a/gcc/genattrtab.c b/gcc/genattrtab.c index 98b11256610..c69ad537696 100644 --- a/gcc/genattrtab.c +++ b/gcc/genattrtab.c @@ -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: