summaryrefslogtreecommitdiff
path: root/gcc/genattrtab.c
diff options
context:
space:
mode:
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>2005-09-20 21:48:36 +0000
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>2005-09-20 21:48:36 +0000
commit16afa8ae1933c570085475a7ea0fbdf9b8880b47 (patch)
treeb5aed08c2aba5538d50f0915cdd9050b95ec600d /gcc/genattrtab.c
parentd65b8df84253ce7cbef6fea4afb9af5b870e1751 (diff)
downloadgcc-16afa8ae1933c570085475a7ea0fbdf9b8880b47.tar.gz
PR rtl-optimization/23898
* output.h (get_attr_min_length): Declare. * final.c (get_attr_length_1): New function, broken out of: (get_attr_length). (get_attr_min_length): New function. * bb-reorder.c (copy_bb_p, get_uncond_jump_length): Use it. (duplicate_computed_gotos): Likewise. * genattr.c (insn_min_length): Generate declaration. * genattrtab.c (min_fn, min_attr_value): New functions. (make_length_attrs): Generate insn_min_length. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@104468 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/genattrtab.c')
-rw-r--r--gcc/genattrtab.c57
1 files changed, 55 insertions, 2 deletions
diff --git a/gcc/genattrtab.c b/gcc/genattrtab.c
index 78a61e86981..359ddddae10 100644
--- a/gcc/genattrtab.c
+++ b/gcc/genattrtab.c
@@ -285,6 +285,7 @@ static rtx identity_fn (rtx);
static rtx zero_fn (rtx);
static rtx one_fn (rtx);
static rtx max_fn (rtx);
+static rtx min_fn (rtx);
static void write_length_unit_log (void);
static rtx simplify_cond (rtx, int, int);
static void clear_struct_flag (rtx);
@@ -307,6 +308,7 @@ static void gen_insn (rtx, int);
static void gen_delay (rtx, int);
static void write_test_expr (rtx, int);
static int max_attr_value (rtx, int*);
+static int min_attr_value (rtx, int*);
static int or_attr_value (rtx, int*);
static void walk_attr_value (rtx);
static void write_attr_get (struct attr_desc *);
@@ -1583,11 +1585,14 @@ make_length_attrs (void)
static const char *new_names[] =
{
"*insn_default_length",
+ "*insn_min_length",
"*insn_variable_length_p",
"*insn_current_length"
};
- static rtx (*const no_address_fn[]) (rtx) = {identity_fn, zero_fn, zero_fn};
- static rtx (*const address_fn[]) (rtx) = {max_fn, one_fn, identity_fn};
+ static rtx (*const no_address_fn[]) (rtx)
+ = {identity_fn,identity_fn, zero_fn, zero_fn};
+ static rtx (*const address_fn[]) (rtx)
+ = {max_fn, min_fn, one_fn, identity_fn};
size_t i;
struct attr_desc *length_attr, *new_attr;
struct attr_value *av, *new_av;
@@ -1654,6 +1659,13 @@ max_fn (rtx exp)
return make_numeric_value (max_attr_value (exp, &unknown));
}
+static rtx
+min_fn (rtx exp)
+{
+ int unknown;
+ return make_numeric_value (min_attr_value (exp, &unknown));
+}
+
static void
write_length_unit_log (void)
{
@@ -3531,6 +3543,47 @@ max_attr_value (rtx exp, int *unknownp)
return current_max;
}
+/* Given an attribute value, return the minimum CONST_STRING argument
+ encountered. Set *UNKNOWNP and return 0 if the value is unknown. */
+
+static int
+min_attr_value (rtx exp, int *unknownp)
+{
+ int current_min;
+ int i, n;
+
+ switch (GET_CODE (exp))
+ {
+ case CONST_STRING:
+ current_min = atoi (XSTR (exp, 0));
+ break;
+
+ case COND:
+ current_min = min_attr_value (XEXP (exp, 1), unknownp);
+ for (i = 0; i < XVECLEN (exp, 0); i += 2)
+ {
+ n = min_attr_value (XVECEXP (exp, 0, i + 1), unknownp);
+ if (n < current_min)
+ current_min = n;
+ }
+ break;
+
+ case IF_THEN_ELSE:
+ current_min = min_attr_value (XEXP (exp, 1), unknownp);
+ n = min_attr_value (XEXP (exp, 2), unknownp);
+ if (n < current_min)
+ current_min = n;
+ break;
+
+ default:
+ *unknownp = 1;
+ current_min = INT_MAX;
+ break;
+ }
+
+ return current_min;
+}
+
/* Given an attribute value, return the result of ORing together all
CONST_STRING arguments encountered. Set *UNKNOWNP and return -1
if the numeric value is not known. */