2 Copyright (C) 1987-2020 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 /* This file is compiled twice: once for the generator programs
21 once for the compiler. */
28 /* Disable rtl checking; it conflicts with the iterator handling. */
29 #undef ENABLE_RTL_CHECKING
32 #include "coretypes.h"
37 #include "gensupport.h"
39 #ifndef GENERATOR_FILE
45 /* One element in a singly-linked list of (integer, string) pairs. */
47 struct map_value
*next
;
52 /* Maps an iterator or attribute name to a list of (integer, string) pairs.
53 The integers are iterator values; the strings are either C conditions
54 or attribute values. */
56 /* The name of the iterator or attribute. */
59 /* The group (modes or codes) to which the iterator or attribute belongs. */
60 struct iterator_group
*group
;
62 /* The list of (integer, string) pairs. */
63 struct map_value
*values
;
65 /* For iterators, records the current value of the iterator. */
66 struct map_value
*current_value
;
69 /* A structure for abstracting the common parts of iterators. */
70 struct iterator_group
{
71 /* Tables of "mapping" structures, one for attributes and one for
73 htab_t attrs
, iterators
;
75 /* The C++ type of the iterator, such as "machine_mode" for modes. */
78 /* Treat the given string as the name of a standard mode, etc., and
79 return its integer value. */
80 int (*find_builtin
) (const char *);
82 /* Make the given rtx use the iterator value given by the third argument.
83 If the iterator applies to operands, the second argument gives the
84 operand index, otherwise it is ignored. */
85 void (*apply_iterator
) (rtx
, unsigned int, int);
87 /* Return the C token for the given standard mode, code, etc. */
88 const char *(*get_c_token
) (int);
91 /* Records one use of an iterator. */
93 /* The iterator itself. */
94 struct mapping
*iterator
;
96 /* The location of the use, as passed to the apply_iterator callback.
97 The index is the number of the operand that used the iterator
98 if applicable, otherwise it is ignored. */
103 /* Records one use of an attribute (the "<[iterator:]attribute>" syntax)
104 in a non-string rtx field. */
105 struct attribute_use
{
106 /* The group that describes the use site. */
107 struct iterator_group
*group
;
109 /* The location at which the use occurs. */
112 /* The name of the attribute, possibly with an "iterator:" prefix. */
115 /* The location of the use, as passed to GROUP's apply_iterator callback.
116 The index is the number of the operand that used the iterator
117 if applicable, otherwise it is ignored. */
122 /* This struct is used to link subst_attr named ATTR_NAME with
123 corresponding define_subst named ITER_NAME. */
124 struct subst_attr_to_iter_mapping
130 /* Hash-table to store links between subst-attributes and
132 htab_t subst_attr_to_iter_map
= NULL
;
133 /* This global stores name of subst-iterator which is currently being
135 const char *current_iterator_name
;
137 static void validate_const_int (const char *);
138 static void one_time_initialization (void);
140 /* Global singleton. */
141 rtx_reader
*rtx_reader_ptr
= NULL
;
143 /* The mode and code iterator structures. */
144 static struct iterator_group modes
, codes
, ints
, substs
;
146 /* All iterators used in the current rtx. */
147 static vec
<mapping
*> current_iterators
;
149 /* The list of all iterator uses in the current rtx. */
150 static vec
<iterator_use
> iterator_uses
;
152 /* The list of all attribute uses in the current rtx. */
153 static vec
<attribute_use
> attribute_uses
;
155 /* Implementations of the iterator_group callbacks for modes. */
158 find_mode (const char *name
)
162 for (i
= 0; i
< NUM_MACHINE_MODES
; i
++)
163 if (strcmp (GET_MODE_NAME (i
), name
) == 0)
166 fatal_with_file_and_line ("unknown mode `%s'", name
);
170 apply_mode_iterator (rtx x
, unsigned int, int mode
)
172 PUT_MODE (x
, (machine_mode
) mode
);
176 get_mode_token (int mode
)
178 return concat ("E_", GET_MODE_NAME (mode
), "mode", NULL
);
181 /* In compact dumps, the code of insns is prefixed with "c", giving "cinsn",
182 "cnote" etc, and CODE_LABEL is special-cased as "clabel". */
184 struct compact_insn_name
{
189 static const compact_insn_name compact_insn_names
[] = {
190 { DEBUG_INSN
, "cdebug_insn" },
192 { JUMP_INSN
, "cjump_insn" },
193 { CALL_INSN
, "ccall_insn" },
194 { JUMP_TABLE_DATA
, "cjump_table_data" },
195 { BARRIER
, "cbarrier" },
196 { CODE_LABEL
, "clabel" },
200 /* Return the rtx code for NAME, or UNKNOWN if NAME isn't a valid rtx code. */
203 maybe_find_code (const char *name
)
205 for (int i
= 0; i
< NUM_RTX_CODE
; i
++)
206 if (strcmp (GET_RTX_NAME (i
), name
) == 0)
209 for (int i
= 0; i
< (signed)ARRAY_SIZE (compact_insn_names
); i
++)
210 if (strcmp (compact_insn_names
[i
].name
, name
) == 0)
211 return compact_insn_names
[i
].code
;
216 /* Implementations of the iterator_group callbacks for codes. */
219 find_code (const char *name
)
221 rtx_code code
= maybe_find_code (name
);
223 fatal_with_file_and_line ("unknown rtx code `%s'", name
);
228 apply_code_iterator (rtx x
, unsigned int, int code
)
230 PUT_CODE (x
, (enum rtx_code
) code
);
234 get_code_token (int code
)
236 char *name
= xstrdup (GET_RTX_NAME (code
));
237 for (int i
= 0; name
[i
]; ++i
)
238 name
[i
] = TOUPPER (name
[i
]);
242 /* Implementations of the iterator_group callbacks for ints. */
244 /* Since GCC does not construct a table of valid constants,
245 we have to accept any int as valid. No cross-checking can
249 find_int (const char *name
)
251 validate_const_int (name
);
256 apply_int_iterator (rtx x
, unsigned int index
, int value
)
258 if (GET_CODE (x
) == SUBREG
)
259 SUBREG_BYTE (x
) = value
;
261 XINT (x
, index
) = value
;
265 get_int_token (int value
)
267 char buffer
[HOST_BITS_PER_INT
+ 1];
268 sprintf (buffer
, "%d", value
);
269 return xstrdup (buffer
);
272 #ifdef GENERATOR_FILE
274 /* This routine adds attribute or does nothing depending on VALUE. When
275 VALUE is 1, it does nothing - the first duplicate of original
276 template is kept untouched when it's subjected to a define_subst.
277 When VALUE isn't 1, the routine modifies RTL-template RT, adding
278 attribute, named exactly as define_subst, which later will be
279 applied. If such attribute has already been added, then no the
280 routine has no effect. */
282 apply_subst_iterator (rtx rt
, unsigned int, int value
)
285 rtvec attrs_vec
, new_attrs_vec
;
287 /* define_split has no attributes. */
288 if (value
== 1 || GET_CODE (rt
) == DEFINE_SPLIT
)
290 gcc_assert (GET_CODE (rt
) == DEFINE_INSN
291 || GET_CODE (rt
) == DEFINE_INSN_AND_SPLIT
292 || GET_CODE (rt
) == DEFINE_INSN_AND_REWRITE
293 || GET_CODE (rt
) == DEFINE_EXPAND
);
295 int attrs
= (GET_CODE (rt
) == DEFINE_INSN_AND_SPLIT
? 7
296 : GET_CODE (rt
) == DEFINE_INSN_AND_REWRITE
? 6 : 4);
297 attrs_vec
= XVEC (rt
, attrs
);
299 /* If we've already added attribute 'current_iterator_name', then we
300 have nothing to do now. */
303 for (i
= 0; i
< GET_NUM_ELEM (attrs_vec
); i
++)
305 if (strcmp (XSTR (attrs_vec
->elem
[i
], 0), current_iterator_name
) == 0)
310 /* Add attribute with subst name - it serves as a mark for
311 define_subst which later would be applied to this pattern. */
312 new_attr
= rtx_alloc (SET_ATTR
);
313 PUT_CODE (new_attr
, SET_ATTR
);
314 XSTR (new_attr
, 0) = xstrdup (current_iterator_name
);
315 XSTR (new_attr
, 1) = xstrdup ("yes");
319 new_attrs_vec
= rtvec_alloc (1);
320 new_attrs_vec
->elem
[0] = new_attr
;
324 new_attrs_vec
= rtvec_alloc (GET_NUM_ELEM (attrs_vec
) + 1);
325 memcpy (&new_attrs_vec
->elem
[0], &attrs_vec
->elem
[0],
326 GET_NUM_ELEM (attrs_vec
) * sizeof (rtx
));
327 new_attrs_vec
->elem
[GET_NUM_ELEM (attrs_vec
)] = new_attr
;
329 XVEC (rt
, attrs
) = new_attrs_vec
;
332 /* Map subst-attribute ATTR to subst iterator ITER. */
335 bind_subst_iter_and_attr (const char *iter
, const char *attr
)
337 struct subst_attr_to_iter_mapping
*value
;
339 if (!subst_attr_to_iter_map
)
340 subst_attr_to_iter_map
=
341 htab_create (1, leading_string_hash
, leading_string_eq_p
, 0);
342 value
= XNEW (struct subst_attr_to_iter_mapping
);
343 value
->attr_name
= xstrdup (attr
);
344 value
->iter_name
= xstrdup (iter
);
345 slot
= htab_find_slot (subst_attr_to_iter_map
, value
, INSERT
);
349 #endif /* #ifdef GENERATOR_FILE */
351 /* Return name of a subst-iterator, corresponding to subst-attribute ATTR. */
354 find_subst_iter_by_attr (const char *attr
)
356 char *iter_name
= NULL
;
357 struct subst_attr_to_iter_mapping
*value
;
358 value
= (struct subst_attr_to_iter_mapping
*)
359 htab_find (subst_attr_to_iter_map
, &attr
);
361 iter_name
= value
->iter_name
;
365 /* Map attribute string P to its current value. Return null if the attribute
366 isn't known. If ITERATOR_OUT is nonnull, store the associated iterator
367 there. Report any errors against location LOC. */
369 static struct map_value
*
370 map_attr_string (file_location loc
, const char *p
, mapping
**iterator_out
= 0)
373 struct mapping
*iterator
;
377 int iterator_name_len
;
378 struct map_value
*res
= NULL
;
379 struct mapping
*prev
= NULL
;
381 /* Peel off any "iterator:" prefix. Set ATTR to the start of the
383 attr
= strchr (p
, ':');
386 iterator_name_len
= -1;
391 iterator_name_len
= attr
- p
;
395 FOR_EACH_VEC_ELT (current_iterators
, i
, iterator
)
397 /* If an iterator name was specified, check that it matches. */
398 if (iterator_name_len
>= 0
399 && (strncmp (p
, iterator
->name
, iterator_name_len
) != 0
400 || iterator
->name
[iterator_name_len
] != 0))
403 /* Find the attribute specification. */
404 m
= (struct mapping
*) htab_find (iterator
->group
->attrs
, &attr
);
407 /* In contrast to code/mode/int iterators, attributes of subst
408 iterators are linked to one specific subst-iterator. So, if
409 we are dealing with subst-iterator, we should check if it's
410 the one which linked with the given attribute. */
411 if (iterator
->group
== &substs
)
413 char *iter_name
= find_subst_iter_by_attr (attr
);
414 if (strcmp (iter_name
, iterator
->name
) != 0)
417 /* Find the attribute value associated with the current
419 for (v
= m
->values
; v
; v
= v
->next
)
420 if (v
->number
== iterator
->current_value
->number
)
422 if (res
&& strcmp (v
->string
, res
->string
) != 0)
424 error_at (loc
, "ambiguous attribute '%s'; could be"
425 " '%s' (via '%s:%s') or '%s' (via '%s:%s')",
426 attr
, res
->string
, prev
->name
, attr
,
427 v
->string
, iterator
->name
, attr
);
431 *iterator_out
= iterator
;
440 /* Apply the current iterator values to STRING. Return the new string
441 if any changes were needed, otherwise return STRING itself. */
444 md_reader::apply_iterator_to_string (const char *string
)
446 char *base
, *copy
, *p
, *start
, *end
;
449 if (string
== 0 || string
[0] == 0)
452 file_location loc
= get_md_ptr_loc (string
)->loc
;
453 base
= p
= copy
= ASTRDUP (string
);
454 while ((start
= strchr (p
, '<')) && (end
= strchr (start
, '>')))
459 v
= map_attr_string (loc
, p
);
464 /* Add everything between the last copied byte and the '<',
465 then add in the attribute value. */
466 obstack_grow (&m_string_obstack
, base
, start
- base
);
467 obstack_grow (&m_string_obstack
, v
->string
, strlen (v
->string
));
472 obstack_grow (&m_string_obstack
, base
, strlen (base
) + 1);
473 copy
= XOBFINISH (&m_string_obstack
, char *);
474 copy_md_ptr_loc (copy
, string
);
480 /* Return a deep copy of X, substituting the current iterator
481 values into any strings. */
484 md_reader::copy_rtx_for_iterators (rtx original
)
486 const char *format_ptr
, *p
;
493 /* Create a shallow copy of ORIGINAL. */
494 x
= rtx_alloc (GET_CODE (original
));
495 memcpy (x
, original
, RTX_CODE_SIZE (GET_CODE (original
)));
497 /* Change each string and recursively change each rtx. */
498 format_ptr
= GET_RTX_FORMAT (GET_CODE (original
));
499 for (i
= 0; format_ptr
[i
] != 0; i
++)
500 switch (format_ptr
[i
])
503 while (XTMPL (x
, i
) != (p
= apply_iterator_to_string (XTMPL (x
, i
))))
509 while (XSTR (x
, i
) != (p
= apply_iterator_to_string (XSTR (x
, i
))))
514 XEXP (x
, i
) = copy_rtx_for_iterators (XEXP (x
, i
));
519 if (XVEC (original
, i
))
521 XVEC (x
, i
) = rtvec_alloc (XVECLEN (original
, i
));
522 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
524 = copy_rtx_for_iterators (XVECEXP (original
, i
, j
));
534 #ifdef GENERATOR_FILE
536 /* Return a condition that must satisfy both ORIGINAL and EXTRA. If ORIGINAL
537 has the form "&& ..." (as used in define_insn_and_splits), assume that
538 EXTRA is already satisfied. Empty strings are treated like "true". */
541 add_condition_to_string (const char *original
, const char *extra
)
543 if (original
!= 0 && original
[0] == '&' && original
[1] == '&')
545 return rtx_reader_ptr
->join_c_conditions (original
, extra
);
548 /* Like add_condition, but applied to all conditions in rtx X. */
551 add_condition_to_rtx (rtx x
, const char *extra
)
553 switch (GET_CODE (x
))
558 XSTR (x
, 2) = add_condition_to_string (XSTR (x
, 2), extra
);
562 case DEFINE_PEEPHOLE
:
563 case DEFINE_PEEPHOLE2
:
564 case DEFINE_COND_EXEC
:
565 XSTR (x
, 1) = add_condition_to_string (XSTR (x
, 1), extra
);
568 case DEFINE_INSN_AND_SPLIT
:
569 case DEFINE_INSN_AND_REWRITE
:
570 XSTR (x
, 2) = add_condition_to_string (XSTR (x
, 2), extra
);
571 XSTR (x
, 4) = add_condition_to_string (XSTR (x
, 4), extra
);
579 /* Apply the current iterator values to all attribute_uses. */
582 apply_attribute_uses (void)
588 FOR_EACH_VEC_ELT (attribute_uses
, i
, ause
)
590 v
= map_attr_string (ause
->loc
, ause
->value
);
592 fatal_with_file_and_line ("unknown iterator value `%s'", ause
->value
);
593 ause
->group
->apply_iterator (ause
->x
, ause
->index
,
594 ause
->group
->find_builtin (v
->string
));
598 /* A htab_traverse callback for iterators. Add all used iterators
599 to current_iterators. */
602 add_current_iterators (void **slot
, void *data ATTRIBUTE_UNUSED
)
604 struct mapping
*iterator
;
606 iterator
= (struct mapping
*) *slot
;
607 if (iterator
->current_value
)
608 current_iterators
.safe_push (iterator
);
612 /* Return a hash value for overloaded_name UNCAST_ONAME. There shouldn't
613 be many instances of two overloaded_names having the same name but
614 different arguments, so hashing on the name should be good enough in
618 overloaded_name_hash (const void *uncast_oname
)
620 const overloaded_name
*oname
= (const overloaded_name
*) uncast_oname
;
621 return htab_hash_string (oname
->name
);
624 /* Return true if two overloaded_names are similar enough to share
625 the same generated functions. */
628 overloaded_name_eq_p (const void *uncast_oname1
, const void *uncast_oname2
)
630 const overloaded_name
*oname1
= (const overloaded_name
*) uncast_oname1
;
631 const overloaded_name
*oname2
= (const overloaded_name
*) uncast_oname2
;
632 if (strcmp (oname1
->name
, oname2
->name
) != 0
633 || oname1
->arg_types
.length () != oname2
->arg_types
.length ())
636 for (unsigned int i
= 0; i
< oname1
->arg_types
.length (); ++i
)
637 if (strcmp (oname1
->arg_types
[i
], oname2
->arg_types
[i
]) != 0)
643 /* Return true if X has an instruction name in XSTR (X, 0). */
648 switch (GET_CODE (x
))
652 case DEFINE_INSN_AND_SPLIT
:
653 case DEFINE_INSN_AND_REWRITE
:
661 /* Check whether ORIGINAL is a named pattern whose name starts with '@'.
662 If so, return the associated overloaded_name and add the iterator for
663 each argument to ITERATORS. Return null otherwise. */
666 md_reader::handle_overloaded_name (rtx original
, vec
<mapping
*> *iterators
)
668 /* Check for the leading '@'. */
669 if (!named_rtx_p (original
) || XSTR (original
, 0)[0] != '@')
672 /* Remove the '@', so that no other code needs to worry about it. */
673 const char *name
= XSTR (original
, 0);
674 file_location loc
= get_md_ptr_loc (name
)->loc
;
675 copy_md_ptr_loc (name
+ 1, name
);
677 XSTR (original
, 0) = name
;
679 /* Build a copy of the name without the '<...>' attribute strings.
680 Add the iterator associated with each such attribute string to ITERATORS
681 and add an associated argument to TMP_ONAME. */
682 char *copy
= ASTRDUP (name
);
683 char *base
= copy
, *start
, *end
;
684 overloaded_name tmp_oname
;
685 tmp_oname
.arg_types
.create (current_iterators
.length ());
686 bool pending_underscore_p
= false;
687 while ((start
= strchr (base
, '<')) && (end
= strchr (start
, '>')))
691 if (!map_attr_string (loc
, start
+ 1, &iterator
))
692 fatal_with_file_and_line ("unknown iterator `%s'", start
+ 1);
695 /* Remove a trailing underscore, so that we don't end a name
696 with "_" or turn "_<...>_" into "__". */
697 if (start
!= base
&& start
[-1] == '_')
700 pending_underscore_p
= true;
703 /* Add the text between either the last '>' or the start of
704 the string and this '<'. */
705 obstack_grow (&m_string_obstack
, base
, start
- base
);
708 /* If there's a character we need to keep after the '>', check
709 whether we should prefix it with a previously-dropped '_'. */
710 if (base
[0] != 0 && base
[0] != '<')
712 if (pending_underscore_p
&& base
[0] != '_')
713 obstack_1grow (&m_string_obstack
, '_');
714 pending_underscore_p
= false;
717 /* Record an argument for ITERATOR. */
718 iterators
->safe_push (iterator
);
719 tmp_oname
.arg_types
.safe_push (iterator
->group
->type
);
722 fatal_with_file_and_line ("no iterator attributes in name `%s'", name
);
724 size_t length
= obstack_object_size (&m_string_obstack
);
726 fatal_with_file_and_line ("`%s' only contains iterator attributes", name
);
728 /* Get the completed name. */
729 obstack_grow (&m_string_obstack
, base
, strlen (base
) + 1);
730 char *new_name
= XOBFINISH (&m_string_obstack
, char *);
731 tmp_oname
.name
= new_name
;
733 if (!m_overloads_htab
)
734 m_overloads_htab
= htab_create (31, overloaded_name_hash
,
735 overloaded_name_eq_p
, NULL
);
737 /* See whether another pattern had the same overload name and list
738 of argument types. Create a new permanent one if not. */
739 void **slot
= htab_find_slot (m_overloads_htab
, &tmp_oname
, INSERT
);
740 overloaded_name
*oname
= (overloaded_name
*) *slot
;
743 *slot
= oname
= new overloaded_name
;
744 oname
->name
= tmp_oname
.name
;
745 oname
->arg_types
= tmp_oname
.arg_types
;
747 oname
->first_instance
= NULL
;
748 oname
->next_instance_ptr
= &oname
->first_instance
;
750 *m_next_overload_ptr
= oname
;
751 m_next_overload_ptr
= &oname
->next
;
755 obstack_free (&m_string_obstack
, new_name
);
756 tmp_oname
.arg_types
.release ();
762 /* Add an instance of ONAME for instruction pattern X. ITERATORS[I]
763 gives the iterator associated with argument I of ONAME. */
766 add_overload_instance (overloaded_name
*oname
, vec
<mapping
*> iterators
, rtx x
)
768 /* Create the instance. */
769 overloaded_instance
*instance
= new overloaded_instance
;
770 instance
->next
= NULL
;
771 instance
->arg_values
.create (oname
->arg_types
.length ());
772 for (unsigned int i
= 0; i
< iterators
.length (); ++i
)
774 int value
= iterators
[i
]->current_value
->number
;
775 const char *name
= iterators
[i
]->group
->get_c_token (value
);
776 instance
->arg_values
.quick_push (name
);
778 instance
->name
= XSTR (x
, 0);
781 /* Chain it onto the end of ONAME's list. */
782 *oname
->next_instance_ptr
= instance
;
783 oname
->next_instance_ptr
= &instance
->next
;
786 /* Expand all iterators in the current rtx, which is given as ORIGINAL.
787 Build a list of expanded rtxes in the EXPR_LIST pointed to by QUEUE. */
790 apply_iterators (rtx original
, vec
<rtx
> *queue
)
793 const char *condition
;
795 struct mapping
*iterator
;
799 if (iterator_uses
.is_empty ())
801 /* Raise an error if any attributes were used. */
802 apply_attribute_uses ();
804 if (named_rtx_p (original
) && XSTR (original
, 0)[0] == '@')
805 fatal_with_file_and_line ("'@' used without iterators");
807 queue
->safe_push (original
);
811 /* Clear out the iterators from the previous run. */
812 FOR_EACH_VEC_ELT (current_iterators
, i
, iterator
)
813 iterator
->current_value
= NULL
;
814 current_iterators
.truncate (0);
816 /* Mark the iterators that we need this time. */
817 FOR_EACH_VEC_ELT (iterator_uses
, i
, iuse
)
818 iuse
->iterator
->current_value
= iuse
->iterator
->values
;
820 /* Get the list of iterators that are in use, preserving the
821 definition order within each group. */
822 htab_traverse (modes
.iterators
, add_current_iterators
, NULL
);
823 htab_traverse (codes
.iterators
, add_current_iterators
, NULL
);
824 htab_traverse (ints
.iterators
, add_current_iterators
, NULL
);
825 htab_traverse (substs
.iterators
, add_current_iterators
, NULL
);
826 gcc_assert (!current_iterators
.is_empty ());
828 /* Check whether this is a '@' overloaded pattern. */
829 auto_vec
<mapping
*, 16> iterators
;
830 overloaded_name
*oname
831 = rtx_reader_ptr
->handle_overloaded_name (original
, &iterators
);
835 /* Apply the current iterator values. Accumulate a condition to
836 say when the resulting rtx can be used. */
838 FOR_EACH_VEC_ELT (iterator_uses
, i
, iuse
)
840 if (iuse
->iterator
->group
== &substs
)
842 v
= iuse
->iterator
->current_value
;
843 iuse
->iterator
->group
->apply_iterator (iuse
->x
, iuse
->index
,
845 condition
= rtx_reader_ptr
->join_c_conditions (condition
, v
->string
);
847 apply_attribute_uses ();
848 x
= rtx_reader_ptr
->copy_rtx_for_iterators (original
);
849 add_condition_to_rtx (x
, condition
);
851 /* We apply subst iterator after RTL-template is copied, as during
852 subst-iterator processing, we could add an attribute to the
853 RTL-template, and we don't want to do it in the original one. */
854 FOR_EACH_VEC_ELT (iterator_uses
, i
, iuse
)
856 v
= iuse
->iterator
->current_value
;
857 if (iuse
->iterator
->group
== &substs
)
861 current_iterator_name
= iuse
->iterator
->name
;
862 iuse
->iterator
->group
->apply_iterator (iuse
->x
, iuse
->index
,
868 add_overload_instance (oname
, iterators
, x
);
870 /* Add the new rtx to the end of the queue. */
871 queue
->safe_push (x
);
873 /* Lexicographically increment the iterator value sequence.
874 That is, cycle through iterator values, starting from the right,
875 and stopping when one of them doesn't wrap around. */
876 i
= current_iterators
.length ();
882 iterator
= current_iterators
[i
];
883 iterator
->current_value
= iterator
->current_value
->next
;
884 if (iterator
->current_value
)
886 iterator
->current_value
= iterator
->values
;
890 #endif /* #ifdef GENERATOR_FILE */
892 /* Add a new "mapping" structure to hashtable TABLE. NAME is the name
893 of the mapping and GROUP is the group to which it belongs. */
895 static struct mapping
*
896 add_mapping (struct iterator_group
*group
, htab_t table
, const char *name
)
901 m
= XNEW (struct mapping
);
902 m
->name
= xstrdup (name
);
905 m
->current_value
= NULL
;
907 slot
= htab_find_slot (table
, m
, INSERT
);
909 fatal_with_file_and_line ("`%s' already defined", name
);
915 /* Add the pair (NUMBER, STRING) to a list of map_value structures.
916 END_PTR points to the current null terminator for the list; return
917 a pointer the new null terminator. */
919 static struct map_value
**
920 add_map_value (struct map_value
**end_ptr
, int number
, const char *string
)
922 struct map_value
*value
;
924 value
= XNEW (struct map_value
);
926 value
->number
= number
;
927 value
->string
= string
;
933 /* Do one-time initialization of the mode and code attributes. */
936 initialize_iterators (void)
938 struct mapping
*lower
, *upper
;
939 struct map_value
**lower_ptr
, **upper_ptr
;
943 modes
.attrs
= htab_create (13, leading_string_hash
, leading_string_eq_p
, 0);
944 modes
.iterators
= htab_create (13, leading_string_hash
,
945 leading_string_eq_p
, 0);
946 modes
.type
= "machine_mode";
947 modes
.find_builtin
= find_mode
;
948 modes
.apply_iterator
= apply_mode_iterator
;
949 modes
.get_c_token
= get_mode_token
;
951 codes
.attrs
= htab_create (13, leading_string_hash
, leading_string_eq_p
, 0);
952 codes
.iterators
= htab_create (13, leading_string_hash
,
953 leading_string_eq_p
, 0);
954 codes
.type
= "rtx_code";
955 codes
.find_builtin
= find_code
;
956 codes
.apply_iterator
= apply_code_iterator
;
957 codes
.get_c_token
= get_code_token
;
959 ints
.attrs
= htab_create (13, leading_string_hash
, leading_string_eq_p
, 0);
960 ints
.iterators
= htab_create (13, leading_string_hash
,
961 leading_string_eq_p
, 0);
963 ints
.find_builtin
= find_int
;
964 ints
.apply_iterator
= apply_int_iterator
;
965 ints
.get_c_token
= get_int_token
;
967 substs
.attrs
= htab_create (13, leading_string_hash
, leading_string_eq_p
, 0);
968 substs
.iterators
= htab_create (13, leading_string_hash
,
969 leading_string_eq_p
, 0);
971 substs
.find_builtin
= find_int
; /* We don't use it, anyway. */
972 #ifdef GENERATOR_FILE
973 substs
.apply_iterator
= apply_subst_iterator
;
975 substs
.get_c_token
= get_int_token
;
977 lower
= add_mapping (&modes
, modes
.attrs
, "mode");
978 upper
= add_mapping (&modes
, modes
.attrs
, "MODE");
979 lower_ptr
= &lower
->values
;
980 upper_ptr
= &upper
->values
;
981 for (i
= 0; i
< MAX_MACHINE_MODE
; i
++)
983 copy
= xstrdup (GET_MODE_NAME (i
));
984 for (p
= copy
; *p
!= 0; p
++)
987 upper_ptr
= add_map_value (upper_ptr
, i
, GET_MODE_NAME (i
));
988 lower_ptr
= add_map_value (lower_ptr
, i
, copy
);
991 lower
= add_mapping (&codes
, codes
.attrs
, "code");
992 upper
= add_mapping (&codes
, codes
.attrs
, "CODE");
993 lower_ptr
= &lower
->values
;
994 upper_ptr
= &upper
->values
;
995 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
997 copy
= xstrdup (GET_RTX_NAME (i
));
998 for (p
= copy
; *p
!= 0; p
++)
1001 lower_ptr
= add_map_value (lower_ptr
, i
, GET_RTX_NAME (i
));
1002 upper_ptr
= add_map_value (upper_ptr
, i
, copy
);
1006 /* Provide a version of a function to read a long long if the system does
1008 #if HOST_BITS_PER_WIDE_INT > HOST_BITS_PER_LONG && !HAVE_DECL_ATOLL && !defined(HAVE_ATOQ)
1009 HOST_WIDE_INT
atoll (const char *);
1012 atoll (const char *p
)
1015 HOST_WIDE_INT tmp_wide
;
1017 while (ISSPACE (*p
))
1025 while (ISDIGIT (*p
))
1027 HOST_WIDE_INT new_wide
= tmp_wide
*10 + (*p
- '0');
1028 if (new_wide
< tmp_wide
)
1030 /* Return INT_MAX equiv on overflow. */
1031 tmp_wide
= HOST_WIDE_INT_M1U
>> 1;
1034 tmp_wide
= new_wide
;
1039 tmp_wide
= -tmp_wide
;
1045 #ifdef GENERATOR_FILE
1046 /* Process a define_conditions directive, starting with the optional
1047 space after the "define_conditions". The directive looks like this:
1049 (define_conditions [
1055 It's not intended to appear in machine descriptions. It is
1056 generated by (the program generated by) genconditions.c, and
1057 slipped in at the beginning of the sequence of MD files read by
1058 most of the other generators. */
1060 md_reader::read_conditions ()
1064 require_char_ws ('[');
1066 while ( (c
= read_skip_spaces ()) != ']')
1068 struct md_name name
;
1073 fatal_expected_char ('(', c
);
1076 validate_const_int (name
.string
);
1077 value
= atoi (name
.string
);
1079 require_char_ws ('"');
1080 expr
= read_quoted_string ();
1082 require_char_ws (')');
1084 add_c_test (expr
, value
);
1087 #endif /* #ifdef GENERATOR_FILE */
1090 validate_const_int (const char *string
)
1096 while (*cp
&& ISSPACE (*cp
))
1098 if (*cp
== '-' || *cp
== '+')
1103 if (! ISDIGIT (*cp
))
1109 fatal_with_file_and_line ("invalid decimal constant \"%s\"\n", string
);
1113 validate_const_wide_int (const char *string
)
1119 while (*cp
&& ISSPACE (*cp
))
1121 /* Skip the leading 0x. */
1122 if (cp
[0] == '0' || cp
[1] == 'x')
1129 if (! ISXDIGIT (*cp
))
1132 fatal_with_file_and_line ("invalid hex constant \"%s\"\n", string
);
1135 /* Record that X uses iterator ITERATOR. If the use is in an operand
1136 of X, INDEX is the index of that operand, otherwise it is ignored. */
1139 record_iterator_use (struct mapping
*iterator
, rtx x
, unsigned int index
)
1141 struct iterator_use iuse
= {iterator
, x
, index
};
1142 iterator_uses
.safe_push (iuse
);
1145 /* Record that X uses attribute VALUE at location LOC, where VALUE must
1146 match a built-in value from group GROUP. If the use is in an operand
1147 of X, INDEX is the index of that operand, otherwise it is ignored. */
1150 record_attribute_use (struct iterator_group
*group
, file_location loc
, rtx x
,
1151 unsigned int index
, const char *value
)
1153 struct attribute_use ause
= {group
, loc
, value
, x
, index
};
1154 attribute_uses
.safe_push (ause
);
1157 /* Interpret NAME as either a built-in value, iterator or attribute
1158 for group GROUP. X and INDEX are the values to pass to GROUP's
1159 apply_iterator callback. LOC is the location of the use. */
1162 md_reader::record_potential_iterator_use (struct iterator_group
*group
,
1164 rtx x
, unsigned int index
,
1170 len
= strlen (name
);
1171 if (name
[0] == '<' && name
[len
- 1] == '>')
1173 /* Copy the attribute string into permanent storage, without the
1174 angle brackets around it. */
1175 obstack_grow0 (&m_string_obstack
, name
+ 1, len
- 2);
1176 record_attribute_use (group
, loc
, x
, index
,
1177 XOBFINISH (&m_string_obstack
, char *));
1181 m
= (struct mapping
*) htab_find (group
->iterators
, &name
);
1183 record_iterator_use (m
, x
, index
);
1185 group
->apply_iterator (x
, index
, group
->find_builtin (name
));
1189 #ifdef GENERATOR_FILE
1191 /* Finish reading a declaration of the form:
1193 (define... <name> [<value1> ... <valuen>])
1195 from the MD file, where each <valuei> is either a bare symbol name or a
1196 "(<name> <string>)" pair. The "(define..." part has already been read.
1198 Represent the declaration as a "mapping" structure; add it to TABLE
1199 (which belongs to GROUP) and return it. */
1202 md_reader::read_mapping (struct iterator_group
*group
, htab_t table
)
1204 struct md_name name
;
1206 struct map_value
**end_ptr
;
1210 /* Read the mapping name and create a structure for it. */
1212 m
= add_mapping (group
, table
, name
.string
);
1214 require_char_ws ('[');
1216 /* Read each value. */
1217 end_ptr
= &m
->values
;
1218 c
= read_skip_spaces ();
1223 /* A bare symbol name that is implicitly paired to an
1231 /* A "(name string)" pair. */
1233 string
= read_string (false);
1234 require_char_ws (')');
1236 number
= group
->find_builtin (name
.string
);
1237 end_ptr
= add_map_value (end_ptr
, number
, string
);
1238 c
= read_skip_spaces ();
1245 /* For iterator with name ATTR_NAME generate define_attr with values
1246 'yes' and 'no'. This attribute is used to mark templates to which
1247 define_subst ATTR_NAME should be applied. This attribute is set and
1248 defined implicitly and automatically. */
1250 add_define_attr_for_define_subst (const char *attr_name
, vec
<rtx
> *queue
)
1252 rtx const_str
, return_rtx
;
1254 return_rtx
= rtx_alloc (DEFINE_ATTR
);
1255 PUT_CODE (return_rtx
, DEFINE_ATTR
);
1257 const_str
= rtx_alloc (CONST_STRING
);
1258 PUT_CODE (const_str
, CONST_STRING
);
1259 XSTR (const_str
, 0) = xstrdup ("no");
1261 XSTR (return_rtx
, 0) = xstrdup (attr_name
);
1262 XSTR (return_rtx
, 1) = xstrdup ("no,yes");
1263 XEXP (return_rtx
, 2) = const_str
;
1265 queue
->safe_push (return_rtx
);
1268 /* This routine generates DEFINE_SUBST_ATTR expression with operands
1269 ATTR_OPERANDS and places it to QUEUE. */
1271 add_define_subst_attr (const char **attr_operands
, vec
<rtx
> *queue
)
1276 return_rtx
= rtx_alloc (DEFINE_SUBST_ATTR
);
1277 PUT_CODE (return_rtx
, DEFINE_SUBST_ATTR
);
1279 for (i
= 0; i
< 4; i
++)
1280 XSTR (return_rtx
, i
) = xstrdup (attr_operands
[i
]);
1282 queue
->safe_push (return_rtx
);
1285 /* Read define_subst_attribute construction. It has next form:
1286 (define_subst_attribute <attribute_name> <iterator_name> <value1> <value2>)
1287 Attribute is substituted with value1 when no subst is applied and with
1288 value2 in the opposite case.
1289 Attributes are added to SUBST_ATTRS_TABLE.
1290 In case the iterator is encountered for the first time, it's added to
1291 SUBST_ITERS_TABLE. Also, implicit define_attr is generated. */
1294 read_subst_mapping (htab_t subst_iters_table
, htab_t subst_attrs_table
,
1298 struct map_value
**end_ptr
;
1299 const char *attr_operands
[4];
1302 for (i
= 0; i
< 4; i
++)
1303 attr_operands
[i
] = rtx_reader_ptr
->read_string (false);
1305 add_define_subst_attr (attr_operands
, queue
);
1307 bind_subst_iter_and_attr (attr_operands
[1], attr_operands
[0]);
1309 m
= (struct mapping
*) htab_find (substs
.iterators
, &attr_operands
[1]);
1312 m
= add_mapping (&substs
, subst_iters_table
, attr_operands
[1]);
1313 end_ptr
= &m
->values
;
1314 end_ptr
= add_map_value (end_ptr
, 1, "");
1315 add_map_value (end_ptr
, 2, "");
1317 add_define_attr_for_define_subst (attr_operands
[1], queue
);
1320 m
= add_mapping (&substs
, subst_attrs_table
, attr_operands
[0]);
1321 end_ptr
= &m
->values
;
1322 end_ptr
= add_map_value (end_ptr
, 1, attr_operands
[2]);
1323 add_map_value (end_ptr
, 2, attr_operands
[3]);
1326 /* Check newly-created code iterator ITERATOR to see whether every code has the
1330 check_code_iterator (struct mapping
*iterator
)
1332 struct map_value
*v
;
1333 enum rtx_code bellwether
;
1335 bellwether
= (enum rtx_code
) iterator
->values
->number
;
1336 for (v
= iterator
->values
->next
; v
!= 0; v
= v
->next
)
1337 if (strcmp (GET_RTX_FORMAT (bellwether
), GET_RTX_FORMAT (v
->number
)) != 0)
1338 fatal_with_file_and_line ("code iterator `%s' combines "
1339 "`%s' and `%s', which have different "
1340 "rtx formats", iterator
->name
,
1341 GET_RTX_NAME (bellwether
),
1342 GET_RTX_NAME (v
->number
));
1345 /* Check that all values of attribute ATTR are rtx codes that have a
1346 consistent format. Return a representative code. */
1349 check_code_attribute (mapping
*attr
)
1351 rtx_code bellwether
= UNKNOWN
;
1352 for (map_value
*v
= attr
->values
; v
!= 0; v
= v
->next
)
1354 rtx_code code
= maybe_find_code (v
->string
);
1355 if (code
== UNKNOWN
)
1356 fatal_with_file_and_line ("code attribute `%s' contains "
1357 "unrecognized rtx code `%s'",
1358 attr
->name
, v
->string
);
1359 if (bellwether
== UNKNOWN
)
1361 else if (strcmp (GET_RTX_FORMAT (bellwether
),
1362 GET_RTX_FORMAT (code
)) != 0)
1363 fatal_with_file_and_line ("code attribute `%s' combines "
1364 "`%s' and `%s', which have different "
1365 "rtx formats", attr
->name
,
1366 GET_RTX_NAME (bellwether
),
1367 GET_RTX_NAME (code
));
1372 /* Read an rtx-related declaration from the MD file, given that it
1373 starts with directive name RTX_NAME. Return true if it expands to
1374 one or more rtxes (as defined by rtx.def). When returning true,
1375 store the list of rtxes as an EXPR_LIST in *X. */
1378 rtx_reader::read_rtx (const char *rtx_name
, vec
<rtx
> *rtxen
)
1380 /* Handle various rtx-related declarations that aren't themselves
1381 encoded as rtxes. */
1382 if (strcmp (rtx_name
, "define_conditions") == 0)
1387 if (strcmp (rtx_name
, "define_mode_attr") == 0)
1389 read_mapping (&modes
, modes
.attrs
);
1392 if (strcmp (rtx_name
, "define_mode_iterator") == 0)
1394 read_mapping (&modes
, modes
.iterators
);
1397 if (strcmp (rtx_name
, "define_code_attr") == 0)
1399 read_mapping (&codes
, codes
.attrs
);
1402 if (strcmp (rtx_name
, "define_code_iterator") == 0)
1404 check_code_iterator (read_mapping (&codes
, codes
.iterators
));
1407 if (strcmp (rtx_name
, "define_int_attr") == 0)
1409 read_mapping (&ints
, ints
.attrs
);
1412 if (strcmp (rtx_name
, "define_int_iterator") == 0)
1414 read_mapping (&ints
, ints
.iterators
);
1417 if (strcmp (rtx_name
, "define_subst_attr") == 0)
1419 read_subst_mapping (substs
.iterators
, substs
.attrs
, rtxen
);
1421 /* READ_SUBST_MAPPING could generate a new DEFINE_ATTR. Return
1422 TRUE to process it. */
1426 apply_iterators (rtx_reader_ptr
->read_rtx_code (rtx_name
), rtxen
);
1427 iterator_uses
.truncate (0);
1428 attribute_uses
.truncate (0);
1433 #endif /* #ifdef GENERATOR_FILE */
1435 /* Do one-time initialization. */
1438 one_time_initialization (void)
1440 static bool initialized
= false;
1444 initialize_iterators ();
1449 /* Consume characters until encountering a character in TERMINATOR_CHARS,
1450 consuming the terminator character if CONSUME_TERMINATOR is true.
1451 Return all characters before the terminator as an allocated buffer. */
1454 rtx_reader::read_until (const char *terminator_chars
, bool consume_terminator
)
1456 int ch
= read_skip_spaces ();
1462 if (strchr (terminator_chars
, ch
))
1464 if (!consume_terminator
)
1470 buf
.safe_push ('\0');
1471 return xstrdup (buf
.address ());
1474 /* Subroutine of read_rtx_code, for parsing zero or more flags. */
1477 read_flags (rtx return_rtx
)
1481 int ch
= read_char ();
1488 int flag_char
= read_char ();
1492 RTX_FLAG (return_rtx
, in_struct
) = 1;
1495 RTX_FLAG (return_rtx
, volatil
) = 1;
1498 RTX_FLAG (return_rtx
, unchanging
) = 1;
1501 RTX_FLAG (return_rtx
, frame_related
) = 1;
1504 RTX_FLAG (return_rtx
, jump
) = 1;
1507 RTX_FLAG (return_rtx
, call
) = 1;
1510 RTX_FLAG (return_rtx
, return_val
) = 1;
1513 fatal_with_file_and_line ("unrecognized flag: `%c'", flag_char
);
1518 /* Return the numeric value n for GET_REG_NOTE_NAME (n) for STRING,
1519 or fail if STRING isn't recognized. */
1522 parse_reg_note_name (const char *string
)
1524 for (int i
= 0; i
< REG_NOTE_MAX
; i
++)
1525 if (strcmp (string
, GET_REG_NOTE_NAME (i
)) == 0)
1527 fatal_with_file_and_line ("unrecognized REG_NOTE name: `%s'", string
);
1530 /* Allocate an rtx for code NAME. If NAME is a code iterator or code
1531 attribute, record its use for later and use one of its possible
1532 values as an interim rtx code. */
1535 rtx_reader::rtx_alloc_for_name (const char *name
)
1537 #ifdef GENERATOR_FILE
1538 size_t len
= strlen (name
);
1539 if (name
[0] == '<' && name
[len
- 1] == '>')
1541 /* Copy the attribute string into permanent storage, without the
1542 angle brackets around it. */
1543 obstack
*strings
= get_string_obstack ();
1544 obstack_grow0 (strings
, name
+ 1, len
- 2);
1545 char *deferred_name
= XOBFINISH (strings
, char *);
1547 /* Find the name of the attribute. */
1548 const char *attr
= strchr (deferred_name
, ':');
1550 attr
= deferred_name
;
1552 /* Find the attribute itself. */
1553 mapping
*m
= (mapping
*) htab_find (codes
.attrs
, &attr
);
1555 fatal_with_file_and_line ("unknown code attribute `%s'", attr
);
1557 /* Pick the first possible code for now, and record the attribute
1559 rtx x
= rtx_alloc (check_code_attribute (m
));
1560 record_attribute_use (&codes
, get_current_location (),
1561 x
, 0, deferred_name
);
1565 mapping
*iterator
= (mapping
*) htab_find (codes
.iterators
, &name
);
1568 /* Pick the first possible code for now, and record the iterator
1570 rtx x
= rtx_alloc (rtx_code (iterator
->values
->number
));
1571 record_iterator_use (iterator
, x
, 0);
1576 return rtx_alloc (rtx_code (codes
.find_builtin (name
)));
1579 /* Subroutine of read_rtx and read_nested_rtx. CODE_NAME is the name of
1580 either an rtx code or a code iterator. Parse the rest of the rtx and
1584 rtx_reader::read_rtx_code (const char *code_name
)
1587 const char *format_ptr
;
1588 struct md_name name
;
1593 /* Linked list structure for making RTXs: */
1596 struct rtx_list
*next
;
1597 rtx value
; /* Value of this node. */
1600 /* Handle reuse_rtx ids e.g. "(0|scratch:DI)". */
1601 if (ISDIGIT (code_name
[0]))
1603 reuse_id
= atoi (code_name
);
1604 while (char ch
= *code_name
++)
1609 /* Handle "reuse_rtx". */
1610 if (strcmp (code_name
, "reuse_rtx") == 0)
1613 unsigned idx
= atoi (name
.string
);
1614 /* Look it up by ID. */
1615 gcc_assert (idx
< m_reuse_rtx_by_id
.length ());
1616 return_rtx
= m_reuse_rtx_by_id
[idx
];
1620 /* If we end up with an insn expression then we free this space below. */
1621 return_rtx
= rtx_alloc_for_name (code_name
);
1622 code
= GET_CODE (return_rtx
);
1623 format_ptr
= GET_RTX_FORMAT (code
);
1624 memset (return_rtx
, 0, RTX_CODE_SIZE (code
));
1625 PUT_CODE (return_rtx
, code
);
1629 /* Store away for later reuse. */
1630 m_reuse_rtx_by_id
.safe_grow_cleared (reuse_id
+ 1, true);
1631 m_reuse_rtx_by_id
[reuse_id
] = return_rtx
;
1634 /* Check for flags. */
1635 read_flags (return_rtx
);
1637 /* Read REG_NOTE names for EXPR_LIST and INSN_LIST. */
1638 if ((GET_CODE (return_rtx
) == EXPR_LIST
1639 || GET_CODE (return_rtx
) == INSN_LIST
1640 || GET_CODE (return_rtx
) == INT_LIST
)
1641 && !m_in_call_function_usage
)
1643 char ch
= read_char ();
1647 PUT_MODE_RAW (return_rtx
,
1648 (machine_mode
)parse_reg_note_name (name
.string
));
1654 /* If what follows is `: mode ', read it and
1655 store the mode in the rtx. */
1657 c
= read_skip_spaces ();
1660 file_location loc
= read_name (&name
);
1661 record_potential_iterator_use (&modes
, loc
, return_rtx
, 0, name
.string
);
1666 if (INSN_CHAIN_CODE_P (code
))
1669 INSN_UID (return_rtx
) = atoi (name
.string
);
1672 /* Use the format_ptr to parse the various operands of this rtx. */
1673 for (int idx
= 0; format_ptr
[idx
] != 0; idx
++)
1674 return_rtx
= read_rtx_operand (return_rtx
, idx
);
1676 /* Handle any additional information that after the regular fields
1677 (e.g. when parsing function dumps). */
1678 handle_any_trailing_information (return_rtx
);
1680 if (CONST_WIDE_INT_P (return_rtx
))
1683 validate_const_wide_int (name
.string
);
1685 const char *s
= name
.string
;
1688 int gs
= HOST_BITS_PER_WIDE_INT
/4;
1690 char * buf
= XALLOCAVEC (char, gs
+ 1);
1691 unsigned HOST_WIDE_INT wi
;
1694 /* Skip the leading spaces. */
1695 while (*s
&& ISSPACE (*s
))
1698 /* Skip the leading 0x. */
1699 gcc_assert (s
[0] == '0');
1700 gcc_assert (s
[1] == 'x');
1705 wlen
= (len
+ gs
- 1) / gs
; /* Number of words needed */
1707 return_rtx
= const_wide_int_alloc (wlen
);
1711 #if HOST_BITS_PER_WIDE_INT == 64
1712 sscanf (s
+ pos
, "%16" HOST_WIDE_INT_PRINT
"x", &wi
);
1714 sscanf (s
+ pos
, "%8" HOST_WIDE_INT_PRINT
"x", &wi
);
1716 CWI_ELT (return_rtx
, index
++) = wi
;
1719 strncpy (buf
, s
, gs
- pos
);
1721 sscanf (buf
, "%" HOST_WIDE_INT_PRINT
"x", &wi
);
1722 CWI_ELT (return_rtx
, index
++) = wi
;
1723 /* TODO: After reading, do we want to canonicalize with:
1724 value = lookup_const_wide_int (value); ? */
1728 c
= read_skip_spaces ();
1729 /* Syntactic sugar for AND and IOR, allowing Lisp-like
1730 arbitrary number of arguments for them. */
1732 && (GET_CODE (return_rtx
) == AND
1733 || GET_CODE (return_rtx
) == IOR
))
1734 return read_rtx_variadic (return_rtx
);
1740 /* Subroutine of read_rtx_code. Parse operand IDX within RETURN_RTX,
1741 based on the corresponding format character within GET_RTX_FORMAT
1742 for the GET_CODE (RETURN_RTX), and return RETURN_RTX.
1743 This is a virtual function, so that function_reader can override
1744 some parsing, and potentially return a different rtx. */
1747 rtx_reader::read_rtx_operand (rtx return_rtx
, int idx
)
1749 RTX_CODE code
= GET_CODE (return_rtx
);
1750 const char *format_ptr
= GET_RTX_FORMAT (code
);
1752 struct md_name name
;
1754 switch (format_ptr
[idx
])
1756 /* 0 means a field for internal use only.
1757 Don't expect it to be present in the input. */
1760 ORIGINAL_REGNO (return_rtx
) = REGNO (return_rtx
);
1764 XEXP (return_rtx
, idx
) = read_nested_rtx ();
1768 XEXP (return_rtx
, idx
) = read_nested_rtx ();
1772 /* 'V' is an optional vector: if a closeparen follows,
1773 just store NULL for this element. */
1774 c
= read_skip_spaces ();
1778 XVEC (return_rtx
, idx
) = 0;
1781 /* Now process the vector. */
1786 /* Obstack to store scratch vector in. */
1787 struct obstack vector_stack
;
1788 int list_counter
= 0;
1789 rtvec return_vec
= NULL_RTVEC
;
1790 rtx saved_rtx
= NULL_RTX
;
1792 require_char_ws ('[');
1794 /* Add expressions to a list, while keeping a count. */
1795 obstack_init (&vector_stack
);
1796 while ((c
= read_skip_spaces ()) && c
!= ']')
1799 fatal_expected_char (']', c
);
1803 int repeat_count
= 1;
1806 /* Process "repeated xN" directive. */
1808 if (strcmp (name
.string
, "repeated"))
1809 fatal_with_file_and_line ("invalid directive \"%s\"\n",
1812 if (!sscanf (name
.string
, "x%d", &repeat_count
))
1813 fatal_with_file_and_line ("invalid repeat count \"%s\"\n",
1816 /* We already saw one of the instances. */
1821 value
= read_nested_rtx ();
1823 for (; repeat_count
> 0; repeat_count
--)
1826 obstack_ptr_grow (&vector_stack
, value
);
1830 if (list_counter
> 0)
1832 return_vec
= rtvec_alloc (list_counter
);
1833 memcpy (&return_vec
->elem
[0], obstack_finish (&vector_stack
),
1834 list_counter
* sizeof (rtx
));
1836 else if (format_ptr
[idx
] == 'E')
1837 fatal_with_file_and_line ("vector must have at least one element");
1838 XVEC (return_rtx
, idx
) = return_vec
;
1839 obstack_free (&vector_stack
, NULL
);
1840 /* close bracket gotten */
1851 c
= read_skip_spaces ();
1855 /* 'S' fields are optional and should be NULL if no string
1856 was given. Also allow normal 's' and 'T' strings to be
1857 omitted, treating them in the same way as empty strings. */
1858 XSTR (return_rtx
, idx
) = (format_ptr
[idx
] == 'S' ? NULL
: "");
1862 /* The output template slot of a DEFINE_INSN, DEFINE_INSN_AND_SPLIT,
1863 DEFINE_INSN_AND_REWRITE or DEFINE_PEEPHOLE automatically
1864 gets a star inserted as its first character, if it is
1865 written with a brace block instead of a string constant. */
1866 star_if_braced
= (format_ptr
[idx
] == 'T');
1868 stringbuf
= read_string (star_if_braced
);
1872 #ifdef GENERATOR_FILE
1873 /* For insn patterns, we want to provide a default name
1874 based on the file and line, like "*foo.md:12", if the
1875 given name is blank. These are only for define_insn and
1876 define_insn_and_split, to aid debugging. */
1877 if (*stringbuf
== '\0'
1879 && (GET_CODE (return_rtx
) == DEFINE_INSN
1880 || GET_CODE (return_rtx
) == DEFINE_INSN_AND_SPLIT
1881 || GET_CODE (return_rtx
) == DEFINE_INSN_AND_REWRITE
))
1883 const char *old_stringbuf
= stringbuf
;
1884 struct obstack
*string_obstack
= get_string_obstack ();
1886 const char *read_md_filename
= get_filename ();
1887 const char *fn
= (read_md_filename
? read_md_filename
: "rtx");
1889 for (slash
= fn
; *slash
; slash
++)
1890 if (*slash
== '/' || *slash
== '\\' || *slash
== ':')
1892 obstack_1grow (string_obstack
, '*');
1893 obstack_grow (string_obstack
, fn
, strlen (fn
));
1894 sprintf (line_name
, ":%d", get_lineno ());
1895 obstack_grow (string_obstack
, line_name
, strlen (line_name
)+1);
1896 stringbuf
= XOBFINISH (string_obstack
, char *);
1897 copy_md_ptr_loc (stringbuf
, old_stringbuf
);
1900 /* Find attr-names in the string. */
1902 char *start
, *end
, *ptr
;
1906 while ((start
= strchr (end
, '<')) && (end
= strchr (start
, '>')))
1908 if ((end
- start
- 1 > 0)
1909 && (end
- start
- 1 < (int)sizeof (tmpstr
)))
1911 strncpy (tmpstr
, start
+1, end
-start
-1);
1912 tmpstr
[end
-start
-1] = 0;
1918 = (struct mapping
*) htab_find (substs
.attrs
, &ptr
);
1921 /* Here we should find linked subst-iter. */
1922 str
= find_subst_iter_by_attr (ptr
);
1924 m
= (struct mapping
*) htab_find (substs
.iterators
, &str
);
1929 record_iterator_use (m
, return_rtx
, 0);
1931 #endif /* #ifdef GENERATOR_FILE */
1933 const char *string_ptr
= finalize_string (stringbuf
);
1936 XTMPL (return_rtx
, idx
) = string_ptr
;
1938 XSTR (return_rtx
, idx
) = string_ptr
;
1944 HOST_WIDE_INT tmp_wide
;
1946 validate_const_int (name
.string
);
1947 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
1948 tmp_wide
= atoi (name
.string
);
1950 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
1951 tmp_wide
= atol (name
.string
);
1953 /* Prefer atoll over atoq, since the former is in the ISO C99 standard.
1954 But prefer not to use our hand-rolled function above either. */
1955 #if HAVE_DECL_ATOLL || !defined(HAVE_ATOQ)
1956 tmp_wide
= atoll (name
.string
);
1958 tmp_wide
= atoq (name
.string
);
1962 XWINT (return_rtx
, idx
) = tmp_wide
;
1970 /* Can be an iterator or an integer constant. */
1971 file_location loc
= read_name (&name
);
1972 record_potential_iterator_use (&ints
, loc
, return_rtx
, idx
,
1979 validate_const_int (name
.string
);
1980 set_regno_raw (return_rtx
, atoi (name
.string
), 1);
1981 REG_ATTRS (return_rtx
) = NULL
;
1991 /* Read a nested rtx construct from the MD file and return it. */
1994 rtx_reader::read_nested_rtx ()
1996 struct md_name name
;
1999 /* In compact dumps, trailing "(nil)" values can be omitted.
2000 Handle such dumps. */
2001 if (peek_char () == ')')
2004 require_char_ws ('(');
2007 if (strcmp (name
.string
, "nil") == 0)
2010 return_rtx
= read_rtx_code (name
.string
);
2012 require_char_ws (')');
2014 return_rtx
= postprocess (return_rtx
);
2019 /* Mutually recursive subroutine of read_rtx which reads
2020 (thing x1 x2 x3 ...) and produces RTL as if
2021 (thing x1 (thing x2 (thing x3 ...))) had been written.
2022 When called, FORM is (thing x1 x2), and the file position
2023 is just past the leading parenthesis of x3. Only works
2024 for THINGs which are dyadic expressions, e.g. AND, IOR. */
2026 rtx_reader::read_rtx_variadic (rtx form
)
2035 q
= rtx_alloc (GET_CODE (p
));
2036 PUT_MODE (q
, GET_MODE (p
));
2038 XEXP (q
, 0) = XEXP (p
, 1);
2039 XEXP (q
, 1) = read_nested_rtx ();
2043 c
= read_skip_spaces ();
2050 /* Constructor for class rtx_reader. */
2052 rtx_reader::rtx_reader (bool compact
)
2053 : md_reader (compact
),
2054 m_in_call_function_usage (false)
2056 /* Set the global singleton pointer. */
2057 rtx_reader_ptr
= this;
2059 one_time_initialization ();
2062 /* Destructor for class rtx_reader. */
2064 rtx_reader::~rtx_reader ()
2066 /* Clear the global singleton pointer. */
2067 rtx_reader_ptr
= NULL
;