2 Copyright (C) 1987-2019 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 name of the attribute, possibly with an "iterator:" prefix. */
112 /* The location of the use, as passed to GROUP's apply_iterator callback.
113 The index is the number of the operand that used the iterator
114 if applicable, otherwise it is ignored. */
119 /* This struct is used to link subst_attr named ATTR_NAME with
120 corresponding define_subst named ITER_NAME. */
121 struct subst_attr_to_iter_mapping
127 /* Hash-table to store links between subst-attributes and
129 htab_t subst_attr_to_iter_map
= NULL
;
130 /* This global stores name of subst-iterator which is currently being
132 const char *current_iterator_name
;
134 static void validate_const_int (const char *);
135 static void one_time_initialization (void);
137 /* Global singleton. */
138 rtx_reader
*rtx_reader_ptr
= NULL
;
140 /* The mode and code iterator structures. */
141 static struct iterator_group modes
, codes
, ints
, substs
;
143 /* All iterators used in the current rtx. */
144 static vec
<mapping
*> current_iterators
;
146 /* The list of all iterator uses in the current rtx. */
147 static vec
<iterator_use
> iterator_uses
;
149 /* The list of all attribute uses in the current rtx. */
150 static vec
<attribute_use
> attribute_uses
;
152 /* Implementations of the iterator_group callbacks for modes. */
155 find_mode (const char *name
)
159 for (i
= 0; i
< NUM_MACHINE_MODES
; i
++)
160 if (strcmp (GET_MODE_NAME (i
), name
) == 0)
163 fatal_with_file_and_line ("unknown mode `%s'", name
);
167 apply_mode_iterator (rtx x
, unsigned int, int mode
)
169 PUT_MODE (x
, (machine_mode
) mode
);
173 get_mode_token (int mode
)
175 return concat ("E_", GET_MODE_NAME (mode
), "mode", NULL
);
178 /* In compact dumps, the code of insns is prefixed with "c", giving "cinsn",
179 "cnote" etc, and CODE_LABEL is special-cased as "clabel". */
181 struct compact_insn_name
{
186 static const compact_insn_name compact_insn_names
[] = {
187 { DEBUG_INSN
, "cdebug_insn" },
189 { JUMP_INSN
, "cjump_insn" },
190 { CALL_INSN
, "ccall_insn" },
191 { JUMP_TABLE_DATA
, "cjump_table_data" },
192 { BARRIER
, "cbarrier" },
193 { CODE_LABEL
, "clabel" },
197 /* Return the rtx code for NAME, or UNKNOWN if NAME isn't a valid rtx code. */
200 maybe_find_code (const char *name
)
202 for (int i
= 0; i
< NUM_RTX_CODE
; i
++)
203 if (strcmp (GET_RTX_NAME (i
), name
) == 0)
206 for (int i
= 0; i
< (signed)ARRAY_SIZE (compact_insn_names
); i
++)
207 if (strcmp (compact_insn_names
[i
].name
, name
) == 0)
208 return compact_insn_names
[i
].code
;
213 /* Implementations of the iterator_group callbacks for codes. */
216 find_code (const char *name
)
218 rtx_code code
= maybe_find_code (name
);
220 fatal_with_file_and_line ("unknown rtx code `%s'", name
);
225 apply_code_iterator (rtx x
, unsigned int, int code
)
227 PUT_CODE (x
, (enum rtx_code
) code
);
231 get_code_token (int code
)
233 char *name
= xstrdup (GET_RTX_NAME (code
));
234 for (int i
= 0; name
[i
]; ++i
)
235 name
[i
] = TOUPPER (name
[i
]);
239 /* Implementations of the iterator_group callbacks for ints. */
241 /* Since GCC does not construct a table of valid constants,
242 we have to accept any int as valid. No cross-checking can
246 find_int (const char *name
)
248 validate_const_int (name
);
253 apply_int_iterator (rtx x
, unsigned int index
, int value
)
255 if (GET_CODE (x
) == SUBREG
)
256 SUBREG_BYTE (x
) = value
;
258 XINT (x
, index
) = value
;
262 get_int_token (int value
)
264 char buffer
[HOST_BITS_PER_INT
+ 1];
265 sprintf (buffer
, "%d", value
);
266 return xstrdup (buffer
);
269 #ifdef GENERATOR_FILE
271 /* This routine adds attribute or does nothing depending on VALUE. When
272 VALUE is 1, it does nothing - the first duplicate of original
273 template is kept untouched when it's subjected to a define_subst.
274 When VALUE isn't 1, the routine modifies RTL-template RT, adding
275 attribute, named exactly as define_subst, which later will be
276 applied. If such attribute has already been added, then no the
277 routine has no effect. */
279 apply_subst_iterator (rtx rt
, unsigned int, int value
)
282 rtvec attrs_vec
, new_attrs_vec
;
284 /* define_split has no attributes. */
285 if (value
== 1 || GET_CODE (rt
) == DEFINE_SPLIT
)
287 gcc_assert (GET_CODE (rt
) == DEFINE_INSN
288 || GET_CODE (rt
) == DEFINE_INSN_AND_SPLIT
289 || GET_CODE (rt
) == DEFINE_INSN_AND_REWRITE
290 || GET_CODE (rt
) == DEFINE_EXPAND
);
292 int attrs
= (GET_CODE (rt
) == DEFINE_INSN_AND_SPLIT
? 7
293 : GET_CODE (rt
) == DEFINE_INSN_AND_REWRITE
? 6 : 4);
294 attrs_vec
= XVEC (rt
, attrs
);
296 /* If we've already added attribute 'current_iterator_name', then we
297 have nothing to do now. */
300 for (i
= 0; i
< GET_NUM_ELEM (attrs_vec
); i
++)
302 if (strcmp (XSTR (attrs_vec
->elem
[i
], 0), current_iterator_name
) == 0)
307 /* Add attribute with subst name - it serves as a mark for
308 define_subst which later would be applied to this pattern. */
309 new_attr
= rtx_alloc (SET_ATTR
);
310 PUT_CODE (new_attr
, SET_ATTR
);
311 XSTR (new_attr
, 0) = xstrdup (current_iterator_name
);
312 XSTR (new_attr
, 1) = xstrdup ("yes");
316 new_attrs_vec
= rtvec_alloc (1);
317 new_attrs_vec
->elem
[0] = new_attr
;
321 new_attrs_vec
= rtvec_alloc (GET_NUM_ELEM (attrs_vec
) + 1);
322 memcpy (&new_attrs_vec
->elem
[0], &attrs_vec
->elem
[0],
323 GET_NUM_ELEM (attrs_vec
) * sizeof (rtx
));
324 new_attrs_vec
->elem
[GET_NUM_ELEM (attrs_vec
)] = new_attr
;
326 XVEC (rt
, attrs
) = new_attrs_vec
;
329 /* Map subst-attribute ATTR to subst iterator ITER. */
332 bind_subst_iter_and_attr (const char *iter
, const char *attr
)
334 struct subst_attr_to_iter_mapping
*value
;
336 if (!subst_attr_to_iter_map
)
337 subst_attr_to_iter_map
=
338 htab_create (1, leading_string_hash
, leading_string_eq_p
, 0);
339 value
= XNEW (struct subst_attr_to_iter_mapping
);
340 value
->attr_name
= xstrdup (attr
);
341 value
->iter_name
= xstrdup (iter
);
342 slot
= htab_find_slot (subst_attr_to_iter_map
, value
, INSERT
);
346 #endif /* #ifdef GENERATOR_FILE */
348 /* Return name of a subst-iterator, corresponding to subst-attribute ATTR. */
351 find_subst_iter_by_attr (const char *attr
)
353 char *iter_name
= NULL
;
354 struct subst_attr_to_iter_mapping
*value
;
355 value
= (struct subst_attr_to_iter_mapping
*)
356 htab_find (subst_attr_to_iter_map
, &attr
);
358 iter_name
= value
->iter_name
;
362 /* Map attribute string P to its current value. Return null if the attribute
363 isn't known. If ITERATOR_OUT is nonnull, store the associated iterator
366 static struct map_value
*
367 map_attr_string (const char *p
, mapping
**iterator_out
= 0)
370 struct mapping
*iterator
;
374 int iterator_name_len
;
376 /* Peel off any "iterator:" prefix. Set ATTR to the start of the
378 attr
= strchr (p
, ':');
381 iterator_name_len
= -1;
386 iterator_name_len
= attr
- p
;
390 FOR_EACH_VEC_ELT (current_iterators
, i
, iterator
)
392 /* If an iterator name was specified, check that it matches. */
393 if (iterator_name_len
>= 0
394 && (strncmp (p
, iterator
->name
, iterator_name_len
) != 0
395 || iterator
->name
[iterator_name_len
] != 0))
398 /* Find the attribute specification. */
399 m
= (struct mapping
*) htab_find (iterator
->group
->attrs
, &attr
);
402 /* In contrast to code/mode/int iterators, attributes of subst
403 iterators are linked to one specific subst-iterator. So, if
404 we are dealing with subst-iterator, we should check if it's
405 the one which linked with the given attribute. */
406 if (iterator
->group
== &substs
)
408 char *iter_name
= find_subst_iter_by_attr (attr
);
409 if (strcmp (iter_name
, iterator
->name
) != 0)
412 /* Find the attribute value associated with the current
414 for (v
= m
->values
; v
; v
= v
->next
)
415 if (v
->number
== iterator
->current_value
->number
)
418 *iterator_out
= iterator
;
426 /* Apply the current iterator values to STRING. Return the new string
427 if any changes were needed, otherwise return STRING itself. */
430 md_reader::apply_iterator_to_string (const char *string
)
432 char *base
, *copy
, *p
, *start
, *end
;
438 base
= p
= copy
= ASTRDUP (string
);
439 while ((start
= strchr (p
, '<')) && (end
= strchr (start
, '>')))
444 v
= map_attr_string (p
);
449 /* Add everything between the last copied byte and the '<',
450 then add in the attribute value. */
451 obstack_grow (&m_string_obstack
, base
, start
- base
);
452 obstack_grow (&m_string_obstack
, v
->string
, strlen (v
->string
));
457 obstack_grow (&m_string_obstack
, base
, strlen (base
) + 1);
458 copy
= XOBFINISH (&m_string_obstack
, char *);
459 copy_md_ptr_loc (copy
, string
);
465 /* Return a deep copy of X, substituting the current iterator
466 values into any strings. */
469 md_reader::copy_rtx_for_iterators (rtx original
)
471 const char *format_ptr
, *p
;
478 /* Create a shallow copy of ORIGINAL. */
479 x
= rtx_alloc (GET_CODE (original
));
480 memcpy (x
, original
, RTX_CODE_SIZE (GET_CODE (original
)));
482 /* Change each string and recursively change each rtx. */
483 format_ptr
= GET_RTX_FORMAT (GET_CODE (original
));
484 for (i
= 0; format_ptr
[i
] != 0; i
++)
485 switch (format_ptr
[i
])
488 while (XTMPL (x
, i
) != (p
= apply_iterator_to_string (XTMPL (x
, i
))))
494 while (XSTR (x
, i
) != (p
= apply_iterator_to_string (XSTR (x
, i
))))
499 XEXP (x
, i
) = copy_rtx_for_iterators (XEXP (x
, i
));
504 if (XVEC (original
, i
))
506 XVEC (x
, i
) = rtvec_alloc (XVECLEN (original
, i
));
507 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
509 = copy_rtx_for_iterators (XVECEXP (original
, i
, j
));
519 #ifdef GENERATOR_FILE
521 /* Return a condition that must satisfy both ORIGINAL and EXTRA. If ORIGINAL
522 has the form "&& ..." (as used in define_insn_and_splits), assume that
523 EXTRA is already satisfied. Empty strings are treated like "true". */
526 add_condition_to_string (const char *original
, const char *extra
)
528 if (original
!= 0 && original
[0] == '&' && original
[1] == '&')
530 return rtx_reader_ptr
->join_c_conditions (original
, extra
);
533 /* Like add_condition, but applied to all conditions in rtx X. */
536 add_condition_to_rtx (rtx x
, const char *extra
)
538 switch (GET_CODE (x
))
543 XSTR (x
, 2) = add_condition_to_string (XSTR (x
, 2), extra
);
547 case DEFINE_PEEPHOLE
:
548 case DEFINE_PEEPHOLE2
:
549 case DEFINE_COND_EXEC
:
550 XSTR (x
, 1) = add_condition_to_string (XSTR (x
, 1), extra
);
553 case DEFINE_INSN_AND_SPLIT
:
554 case DEFINE_INSN_AND_REWRITE
:
555 XSTR (x
, 2) = add_condition_to_string (XSTR (x
, 2), extra
);
556 XSTR (x
, 4) = add_condition_to_string (XSTR (x
, 4), extra
);
564 /* Apply the current iterator values to all attribute_uses. */
567 apply_attribute_uses (void)
573 FOR_EACH_VEC_ELT (attribute_uses
, i
, ause
)
575 v
= map_attr_string (ause
->value
);
577 fatal_with_file_and_line ("unknown iterator value `%s'", ause
->value
);
578 ause
->group
->apply_iterator (ause
->x
, ause
->index
,
579 ause
->group
->find_builtin (v
->string
));
583 /* A htab_traverse callback for iterators. Add all used iterators
584 to current_iterators. */
587 add_current_iterators (void **slot
, void *data ATTRIBUTE_UNUSED
)
589 struct mapping
*iterator
;
591 iterator
= (struct mapping
*) *slot
;
592 if (iterator
->current_value
)
593 current_iterators
.safe_push (iterator
);
597 /* Return a hash value for overloaded_name UNCAST_ONAME. There shouldn't
598 be many instances of two overloaded_names having the same name but
599 different arguments, so hashing on the name should be good enough in
603 overloaded_name_hash (const void *uncast_oname
)
605 const overloaded_name
*oname
= (const overloaded_name
*) uncast_oname
;
606 return htab_hash_string (oname
->name
);
609 /* Return true if two overloaded_names are similar enough to share
610 the same generated functions. */
613 overloaded_name_eq_p (const void *uncast_oname1
, const void *uncast_oname2
)
615 const overloaded_name
*oname1
= (const overloaded_name
*) uncast_oname1
;
616 const overloaded_name
*oname2
= (const overloaded_name
*) uncast_oname2
;
617 if (strcmp (oname1
->name
, oname2
->name
) != 0
618 || oname1
->arg_types
.length () != oname2
->arg_types
.length ())
621 for (unsigned int i
= 0; i
< oname1
->arg_types
.length (); ++i
)
622 if (strcmp (oname1
->arg_types
[i
], oname2
->arg_types
[i
]) != 0)
628 /* Return true if X has an instruction name in XSTR (X, 0). */
633 switch (GET_CODE (x
))
637 case DEFINE_INSN_AND_SPLIT
:
638 case DEFINE_INSN_AND_REWRITE
:
646 /* Check whether ORIGINAL is a named pattern whose name starts with '@'.
647 If so, return the associated overloaded_name and add the iterator for
648 each argument to ITERATORS. Return null otherwise. */
651 md_reader::handle_overloaded_name (rtx original
, vec
<mapping
*> *iterators
)
653 /* Check for the leading '@'. */
654 if (!named_rtx_p (original
) || XSTR (original
, 0)[0] != '@')
657 /* Remove the '@', so that no other code needs to worry about it. */
658 const char *name
= XSTR (original
, 0);
659 copy_md_ptr_loc (name
+ 1, name
);
661 XSTR (original
, 0) = name
;
663 /* Build a copy of the name without the '<...>' attribute strings.
664 Add the iterator associated with each such attribute string to ITERATORS
665 and add an associated argument to TMP_ONAME. */
666 char *copy
= ASTRDUP (name
);
667 char *base
= copy
, *start
, *end
;
668 overloaded_name tmp_oname
;
669 tmp_oname
.arg_types
.create (current_iterators
.length ());
670 bool pending_underscore_p
= false;
671 while ((start
= strchr (base
, '<')) && (end
= strchr (start
, '>')))
675 if (!map_attr_string (start
+ 1, &iterator
))
676 fatal_with_file_and_line ("unknown iterator `%s'", start
+ 1);
679 /* Remove a trailing underscore, so that we don't end a name
680 with "_" or turn "_<...>_" into "__". */
681 if (start
!= base
&& start
[-1] == '_')
684 pending_underscore_p
= true;
687 /* Add the text between either the last '>' or the start of
688 the string and this '<'. */
689 obstack_grow (&m_string_obstack
, base
, start
- base
);
692 /* If there's a character we need to keep after the '>', check
693 whether we should prefix it with a previously-dropped '_'. */
694 if (base
[0] != 0 && base
[0] != '<')
696 if (pending_underscore_p
&& base
[0] != '_')
697 obstack_1grow (&m_string_obstack
, '_');
698 pending_underscore_p
= false;
701 /* Record an argument for ITERATOR. */
702 iterators
->safe_push (iterator
);
703 tmp_oname
.arg_types
.safe_push (iterator
->group
->type
);
706 fatal_with_file_and_line ("no iterator attributes in name `%s'", name
);
708 size_t length
= obstack_object_size (&m_string_obstack
);
710 fatal_with_file_and_line ("`%s' only contains iterator attributes", name
);
712 /* Get the completed name. */
713 obstack_grow (&m_string_obstack
, base
, strlen (base
) + 1);
714 char *new_name
= XOBFINISH (&m_string_obstack
, char *);
715 tmp_oname
.name
= new_name
;
717 if (!m_overloads_htab
)
718 m_overloads_htab
= htab_create (31, overloaded_name_hash
,
719 overloaded_name_eq_p
, NULL
);
721 /* See whether another pattern had the same overload name and list
722 of argument types. Create a new permanent one if not. */
723 void **slot
= htab_find_slot (m_overloads_htab
, &tmp_oname
, INSERT
);
724 overloaded_name
*oname
= (overloaded_name
*) *slot
;
727 *slot
= oname
= new overloaded_name
;
728 oname
->name
= tmp_oname
.name
;
729 oname
->arg_types
= tmp_oname
.arg_types
;
731 oname
->first_instance
= NULL
;
732 oname
->next_instance_ptr
= &oname
->first_instance
;
734 *m_next_overload_ptr
= oname
;
735 m_next_overload_ptr
= &oname
->next
;
739 obstack_free (&m_string_obstack
, new_name
);
740 tmp_oname
.arg_types
.release ();
746 /* Add an instance of ONAME for instruction pattern X. ITERATORS[I]
747 gives the iterator associated with argument I of ONAME. */
750 add_overload_instance (overloaded_name
*oname
, vec
<mapping
*> iterators
, rtx x
)
752 /* Create the instance. */
753 overloaded_instance
*instance
= new overloaded_instance
;
754 instance
->next
= NULL
;
755 instance
->arg_values
.create (oname
->arg_types
.length ());
756 for (unsigned int i
= 0; i
< iterators
.length (); ++i
)
758 int value
= iterators
[i
]->current_value
->number
;
759 const char *name
= iterators
[i
]->group
->get_c_token (value
);
760 instance
->arg_values
.quick_push (name
);
762 instance
->name
= XSTR (x
, 0);
765 /* Chain it onto the end of ONAME's list. */
766 *oname
->next_instance_ptr
= instance
;
767 oname
->next_instance_ptr
= &instance
->next
;
770 /* Expand all iterators in the current rtx, which is given as ORIGINAL.
771 Build a list of expanded rtxes in the EXPR_LIST pointed to by QUEUE. */
774 apply_iterators (rtx original
, vec
<rtx
> *queue
)
777 const char *condition
;
779 struct mapping
*iterator
;
783 if (iterator_uses
.is_empty ())
785 /* Raise an error if any attributes were used. */
786 apply_attribute_uses ();
788 if (named_rtx_p (original
) && XSTR (original
, 0)[0] == '@')
789 fatal_with_file_and_line ("'@' used without iterators");
791 queue
->safe_push (original
);
795 /* Clear out the iterators from the previous run. */
796 FOR_EACH_VEC_ELT (current_iterators
, i
, iterator
)
797 iterator
->current_value
= NULL
;
798 current_iterators
.truncate (0);
800 /* Mark the iterators that we need this time. */
801 FOR_EACH_VEC_ELT (iterator_uses
, i
, iuse
)
802 iuse
->iterator
->current_value
= iuse
->iterator
->values
;
804 /* Get the list of iterators that are in use, preserving the
805 definition order within each group. */
806 htab_traverse (modes
.iterators
, add_current_iterators
, NULL
);
807 htab_traverse (codes
.iterators
, add_current_iterators
, NULL
);
808 htab_traverse (ints
.iterators
, add_current_iterators
, NULL
);
809 htab_traverse (substs
.iterators
, add_current_iterators
, NULL
);
810 gcc_assert (!current_iterators
.is_empty ());
812 /* Check whether this is a '@' overloaded pattern. */
813 auto_vec
<mapping
*, 16> iterators
;
814 overloaded_name
*oname
815 = rtx_reader_ptr
->handle_overloaded_name (original
, &iterators
);
819 /* Apply the current iterator values. Accumulate a condition to
820 say when the resulting rtx can be used. */
822 FOR_EACH_VEC_ELT (iterator_uses
, i
, iuse
)
824 if (iuse
->iterator
->group
== &substs
)
826 v
= iuse
->iterator
->current_value
;
827 iuse
->iterator
->group
->apply_iterator (iuse
->x
, iuse
->index
,
829 condition
= rtx_reader_ptr
->join_c_conditions (condition
, v
->string
);
831 apply_attribute_uses ();
832 x
= rtx_reader_ptr
->copy_rtx_for_iterators (original
);
833 add_condition_to_rtx (x
, condition
);
835 /* We apply subst iterator after RTL-template is copied, as during
836 subst-iterator processing, we could add an attribute to the
837 RTL-template, and we don't want to do it in the original one. */
838 FOR_EACH_VEC_ELT (iterator_uses
, i
, iuse
)
840 v
= iuse
->iterator
->current_value
;
841 if (iuse
->iterator
->group
== &substs
)
845 current_iterator_name
= iuse
->iterator
->name
;
846 iuse
->iterator
->group
->apply_iterator (iuse
->x
, iuse
->index
,
852 add_overload_instance (oname
, iterators
, x
);
854 /* Add the new rtx to the end of the queue. */
855 queue
->safe_push (x
);
857 /* Lexicographically increment the iterator value sequence.
858 That is, cycle through iterator values, starting from the right,
859 and stopping when one of them doesn't wrap around. */
860 i
= current_iterators
.length ();
866 iterator
= current_iterators
[i
];
867 iterator
->current_value
= iterator
->current_value
->next
;
868 if (iterator
->current_value
)
870 iterator
->current_value
= iterator
->values
;
874 #endif /* #ifdef GENERATOR_FILE */
876 /* Add a new "mapping" structure to hashtable TABLE. NAME is the name
877 of the mapping and GROUP is the group to which it belongs. */
879 static struct mapping
*
880 add_mapping (struct iterator_group
*group
, htab_t table
, const char *name
)
885 m
= XNEW (struct mapping
);
886 m
->name
= xstrdup (name
);
889 m
->current_value
= NULL
;
891 slot
= htab_find_slot (table
, m
, INSERT
);
893 fatal_with_file_and_line ("`%s' already defined", name
);
899 /* Add the pair (NUMBER, STRING) to a list of map_value structures.
900 END_PTR points to the current null terminator for the list; return
901 a pointer the new null terminator. */
903 static struct map_value
**
904 add_map_value (struct map_value
**end_ptr
, int number
, const char *string
)
906 struct map_value
*value
;
908 value
= XNEW (struct map_value
);
910 value
->number
= number
;
911 value
->string
= string
;
917 /* Do one-time initialization of the mode and code attributes. */
920 initialize_iterators (void)
922 struct mapping
*lower
, *upper
;
923 struct map_value
**lower_ptr
, **upper_ptr
;
927 modes
.attrs
= htab_create (13, leading_string_hash
, leading_string_eq_p
, 0);
928 modes
.iterators
= htab_create (13, leading_string_hash
,
929 leading_string_eq_p
, 0);
930 modes
.type
= "machine_mode";
931 modes
.find_builtin
= find_mode
;
932 modes
.apply_iterator
= apply_mode_iterator
;
933 modes
.get_c_token
= get_mode_token
;
935 codes
.attrs
= htab_create (13, leading_string_hash
, leading_string_eq_p
, 0);
936 codes
.iterators
= htab_create (13, leading_string_hash
,
937 leading_string_eq_p
, 0);
938 codes
.type
= "rtx_code";
939 codes
.find_builtin
= find_code
;
940 codes
.apply_iterator
= apply_code_iterator
;
941 codes
.get_c_token
= get_code_token
;
943 ints
.attrs
= htab_create (13, leading_string_hash
, leading_string_eq_p
, 0);
944 ints
.iterators
= htab_create (13, leading_string_hash
,
945 leading_string_eq_p
, 0);
947 ints
.find_builtin
= find_int
;
948 ints
.apply_iterator
= apply_int_iterator
;
949 ints
.get_c_token
= get_int_token
;
951 substs
.attrs
= htab_create (13, leading_string_hash
, leading_string_eq_p
, 0);
952 substs
.iterators
= htab_create (13, leading_string_hash
,
953 leading_string_eq_p
, 0);
955 substs
.find_builtin
= find_int
; /* We don't use it, anyway. */
956 #ifdef GENERATOR_FILE
957 substs
.apply_iterator
= apply_subst_iterator
;
959 substs
.get_c_token
= get_int_token
;
961 lower
= add_mapping (&modes
, modes
.attrs
, "mode");
962 upper
= add_mapping (&modes
, modes
.attrs
, "MODE");
963 lower_ptr
= &lower
->values
;
964 upper_ptr
= &upper
->values
;
965 for (i
= 0; i
< MAX_MACHINE_MODE
; i
++)
967 copy
= xstrdup (GET_MODE_NAME (i
));
968 for (p
= copy
; *p
!= 0; p
++)
971 upper_ptr
= add_map_value (upper_ptr
, i
, GET_MODE_NAME (i
));
972 lower_ptr
= add_map_value (lower_ptr
, i
, copy
);
975 lower
= add_mapping (&codes
, codes
.attrs
, "code");
976 upper
= add_mapping (&codes
, codes
.attrs
, "CODE");
977 lower_ptr
= &lower
->values
;
978 upper_ptr
= &upper
->values
;
979 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
981 copy
= xstrdup (GET_RTX_NAME (i
));
982 for (p
= copy
; *p
!= 0; p
++)
985 lower_ptr
= add_map_value (lower_ptr
, i
, GET_RTX_NAME (i
));
986 upper_ptr
= add_map_value (upper_ptr
, i
, copy
);
990 /* Provide a version of a function to read a long long if the system does
992 #if HOST_BITS_PER_WIDE_INT > HOST_BITS_PER_LONG && !HAVE_DECL_ATOLL && !defined(HAVE_ATOQ)
993 HOST_WIDE_INT
atoll (const char *);
996 atoll (const char *p
)
999 HOST_WIDE_INT tmp_wide
;
1001 while (ISSPACE (*p
))
1009 while (ISDIGIT (*p
))
1011 HOST_WIDE_INT new_wide
= tmp_wide
*10 + (*p
- '0');
1012 if (new_wide
< tmp_wide
)
1014 /* Return INT_MAX equiv on overflow. */
1015 tmp_wide
= HOST_WIDE_INT_M1U
>> 1;
1018 tmp_wide
= new_wide
;
1023 tmp_wide
= -tmp_wide
;
1029 #ifdef GENERATOR_FILE
1030 /* Process a define_conditions directive, starting with the optional
1031 space after the "define_conditions". The directive looks like this:
1033 (define_conditions [
1039 It's not intended to appear in machine descriptions. It is
1040 generated by (the program generated by) genconditions.c, and
1041 slipped in at the beginning of the sequence of MD files read by
1042 most of the other generators. */
1044 md_reader::read_conditions ()
1048 require_char_ws ('[');
1050 while ( (c
= read_skip_spaces ()) != ']')
1052 struct md_name name
;
1057 fatal_expected_char ('(', c
);
1060 validate_const_int (name
.string
);
1061 value
= atoi (name
.string
);
1063 require_char_ws ('"');
1064 expr
= read_quoted_string ();
1066 require_char_ws (')');
1068 add_c_test (expr
, value
);
1071 #endif /* #ifdef GENERATOR_FILE */
1074 validate_const_int (const char *string
)
1080 while (*cp
&& ISSPACE (*cp
))
1082 if (*cp
== '-' || *cp
== '+')
1087 if (! ISDIGIT (*cp
))
1093 fatal_with_file_and_line ("invalid decimal constant \"%s\"\n", string
);
1097 validate_const_wide_int (const char *string
)
1103 while (*cp
&& ISSPACE (*cp
))
1105 /* Skip the leading 0x. */
1106 if (cp
[0] == '0' || cp
[1] == 'x')
1113 if (! ISXDIGIT (*cp
))
1116 fatal_with_file_and_line ("invalid hex constant \"%s\"\n", string
);
1119 /* Record that X uses iterator ITERATOR. If the use is in an operand
1120 of X, INDEX is the index of that operand, otherwise it is ignored. */
1123 record_iterator_use (struct mapping
*iterator
, rtx x
, unsigned int index
)
1125 struct iterator_use iuse
= {iterator
, x
, index
};
1126 iterator_uses
.safe_push (iuse
);
1129 /* Record that X uses attribute VALUE, which must match a built-in
1130 value from group GROUP. If the use is in an operand of X, INDEX
1131 is the index of that operand, otherwise it is ignored. */
1134 record_attribute_use (struct iterator_group
*group
, rtx x
,
1135 unsigned int index
, const char *value
)
1137 struct attribute_use ause
= {group
, value
, x
, index
};
1138 attribute_uses
.safe_push (ause
);
1141 /* Interpret NAME as either a built-in value, iterator or attribute
1142 for group GROUP. X and INDEX are the values to pass to GROUP's
1143 apply_iterator callback. */
1146 md_reader::record_potential_iterator_use (struct iterator_group
*group
,
1147 rtx x
, unsigned int index
,
1153 len
= strlen (name
);
1154 if (name
[0] == '<' && name
[len
- 1] == '>')
1156 /* Copy the attribute string into permanent storage, without the
1157 angle brackets around it. */
1158 obstack_grow0 (&m_string_obstack
, name
+ 1, len
- 2);
1159 record_attribute_use (group
, x
, index
,
1160 XOBFINISH (&m_string_obstack
, char *));
1164 m
= (struct mapping
*) htab_find (group
->iterators
, &name
);
1166 record_iterator_use (m
, x
, index
);
1168 group
->apply_iterator (x
, index
, group
->find_builtin (name
));
1172 #ifdef GENERATOR_FILE
1174 /* Finish reading a declaration of the form:
1176 (define... <name> [<value1> ... <valuen>])
1178 from the MD file, where each <valuei> is either a bare symbol name or a
1179 "(<name> <string>)" pair. The "(define..." part has already been read.
1181 Represent the declaration as a "mapping" structure; add it to TABLE
1182 (which belongs to GROUP) and return it. */
1185 md_reader::read_mapping (struct iterator_group
*group
, htab_t table
)
1187 struct md_name name
;
1189 struct map_value
**end_ptr
;
1193 /* Read the mapping name and create a structure for it. */
1195 m
= add_mapping (group
, table
, name
.string
);
1197 require_char_ws ('[');
1199 /* Read each value. */
1200 end_ptr
= &m
->values
;
1201 c
= read_skip_spaces ();
1206 /* A bare symbol name that is implicitly paired to an
1214 /* A "(name string)" pair. */
1216 string
= read_string (false);
1217 require_char_ws (')');
1219 number
= group
->find_builtin (name
.string
);
1220 end_ptr
= add_map_value (end_ptr
, number
, string
);
1221 c
= read_skip_spaces ();
1228 /* For iterator with name ATTR_NAME generate define_attr with values
1229 'yes' and 'no'. This attribute is used to mark templates to which
1230 define_subst ATTR_NAME should be applied. This attribute is set and
1231 defined implicitly and automatically. */
1233 add_define_attr_for_define_subst (const char *attr_name
, vec
<rtx
> *queue
)
1235 rtx const_str
, return_rtx
;
1237 return_rtx
= rtx_alloc (DEFINE_ATTR
);
1238 PUT_CODE (return_rtx
, DEFINE_ATTR
);
1240 const_str
= rtx_alloc (CONST_STRING
);
1241 PUT_CODE (const_str
, CONST_STRING
);
1242 XSTR (const_str
, 0) = xstrdup ("no");
1244 XSTR (return_rtx
, 0) = xstrdup (attr_name
);
1245 XSTR (return_rtx
, 1) = xstrdup ("no,yes");
1246 XEXP (return_rtx
, 2) = const_str
;
1248 queue
->safe_push (return_rtx
);
1251 /* This routine generates DEFINE_SUBST_ATTR expression with operands
1252 ATTR_OPERANDS and places it to QUEUE. */
1254 add_define_subst_attr (const char **attr_operands
, vec
<rtx
> *queue
)
1259 return_rtx
= rtx_alloc (DEFINE_SUBST_ATTR
);
1260 PUT_CODE (return_rtx
, DEFINE_SUBST_ATTR
);
1262 for (i
= 0; i
< 4; i
++)
1263 XSTR (return_rtx
, i
) = xstrdup (attr_operands
[i
]);
1265 queue
->safe_push (return_rtx
);
1268 /* Read define_subst_attribute construction. It has next form:
1269 (define_subst_attribute <attribute_name> <iterator_name> <value1> <value2>)
1270 Attribute is substituted with value1 when no subst is applied and with
1271 value2 in the opposite case.
1272 Attributes are added to SUBST_ATTRS_TABLE.
1273 In case the iterator is encountered for the first time, it's added to
1274 SUBST_ITERS_TABLE. Also, implicit define_attr is generated. */
1277 read_subst_mapping (htab_t subst_iters_table
, htab_t subst_attrs_table
,
1281 struct map_value
**end_ptr
;
1282 const char *attr_operands
[4];
1285 for (i
= 0; i
< 4; i
++)
1286 attr_operands
[i
] = rtx_reader_ptr
->read_string (false);
1288 add_define_subst_attr (attr_operands
, queue
);
1290 bind_subst_iter_and_attr (attr_operands
[1], attr_operands
[0]);
1292 m
= (struct mapping
*) htab_find (substs
.iterators
, &attr_operands
[1]);
1295 m
= add_mapping (&substs
, subst_iters_table
, attr_operands
[1]);
1296 end_ptr
= &m
->values
;
1297 end_ptr
= add_map_value (end_ptr
, 1, "");
1298 add_map_value (end_ptr
, 2, "");
1300 add_define_attr_for_define_subst (attr_operands
[1], queue
);
1303 m
= add_mapping (&substs
, subst_attrs_table
, attr_operands
[0]);
1304 end_ptr
= &m
->values
;
1305 end_ptr
= add_map_value (end_ptr
, 1, attr_operands
[2]);
1306 add_map_value (end_ptr
, 2, attr_operands
[3]);
1309 /* Check newly-created code iterator ITERATOR to see whether every code has the
1313 check_code_iterator (struct mapping
*iterator
)
1315 struct map_value
*v
;
1316 enum rtx_code bellwether
;
1318 bellwether
= (enum rtx_code
) iterator
->values
->number
;
1319 for (v
= iterator
->values
->next
; v
!= 0; v
= v
->next
)
1320 if (strcmp (GET_RTX_FORMAT (bellwether
), GET_RTX_FORMAT (v
->number
)) != 0)
1321 fatal_with_file_and_line ("code iterator `%s' combines "
1322 "`%s' and `%s', which have different "
1323 "rtx formats", iterator
->name
,
1324 GET_RTX_NAME (bellwether
),
1325 GET_RTX_NAME (v
->number
));
1328 /* Check that all values of attribute ATTR are rtx codes that have a
1329 consistent format. Return a representative code. */
1332 check_code_attribute (mapping
*attr
)
1334 rtx_code bellwether
= UNKNOWN
;
1335 for (map_value
*v
= attr
->values
; v
!= 0; v
= v
->next
)
1337 rtx_code code
= maybe_find_code (v
->string
);
1338 if (code
== UNKNOWN
)
1339 fatal_with_file_and_line ("code attribute `%s' contains "
1340 "unrecognized rtx code `%s'",
1341 attr
->name
, v
->string
);
1342 if (bellwether
== UNKNOWN
)
1344 else if (strcmp (GET_RTX_FORMAT (bellwether
),
1345 GET_RTX_FORMAT (code
)) != 0)
1346 fatal_with_file_and_line ("code attribute `%s' combines "
1347 "`%s' and `%s', which have different "
1348 "rtx formats", attr
->name
,
1349 GET_RTX_NAME (bellwether
),
1350 GET_RTX_NAME (code
));
1355 /* Read an rtx-related declaration from the MD file, given that it
1356 starts with directive name RTX_NAME. Return true if it expands to
1357 one or more rtxes (as defined by rtx.def). When returning true,
1358 store the list of rtxes as an EXPR_LIST in *X. */
1361 rtx_reader::read_rtx (const char *rtx_name
, vec
<rtx
> *rtxen
)
1363 /* Handle various rtx-related declarations that aren't themselves
1364 encoded as rtxes. */
1365 if (strcmp (rtx_name
, "define_conditions") == 0)
1370 if (strcmp (rtx_name
, "define_mode_attr") == 0)
1372 read_mapping (&modes
, modes
.attrs
);
1375 if (strcmp (rtx_name
, "define_mode_iterator") == 0)
1377 read_mapping (&modes
, modes
.iterators
);
1380 if (strcmp (rtx_name
, "define_code_attr") == 0)
1382 read_mapping (&codes
, codes
.attrs
);
1385 if (strcmp (rtx_name
, "define_code_iterator") == 0)
1387 check_code_iterator (read_mapping (&codes
, codes
.iterators
));
1390 if (strcmp (rtx_name
, "define_int_attr") == 0)
1392 read_mapping (&ints
, ints
.attrs
);
1395 if (strcmp (rtx_name
, "define_int_iterator") == 0)
1397 read_mapping (&ints
, ints
.iterators
);
1400 if (strcmp (rtx_name
, "define_subst_attr") == 0)
1402 read_subst_mapping (substs
.iterators
, substs
.attrs
, rtxen
);
1404 /* READ_SUBST_MAPPING could generate a new DEFINE_ATTR. Return
1405 TRUE to process it. */
1409 apply_iterators (rtx_reader_ptr
->read_rtx_code (rtx_name
), rtxen
);
1410 iterator_uses
.truncate (0);
1411 attribute_uses
.truncate (0);
1416 #endif /* #ifdef GENERATOR_FILE */
1418 /* Do one-time initialization. */
1421 one_time_initialization (void)
1423 static bool initialized
= false;
1427 initialize_iterators ();
1432 /* Consume characters until encountering a character in TERMINATOR_CHARS,
1433 consuming the terminator character if CONSUME_TERMINATOR is true.
1434 Return all characters before the terminator as an allocated buffer. */
1437 rtx_reader::read_until (const char *terminator_chars
, bool consume_terminator
)
1439 int ch
= read_skip_spaces ();
1445 if (strchr (terminator_chars
, ch
))
1447 if (!consume_terminator
)
1453 buf
.safe_push ('\0');
1454 return xstrdup (buf
.address ());
1457 /* Subroutine of read_rtx_code, for parsing zero or more flags. */
1460 read_flags (rtx return_rtx
)
1464 int ch
= read_char ();
1471 int flag_char
= read_char ();
1475 RTX_FLAG (return_rtx
, in_struct
) = 1;
1478 RTX_FLAG (return_rtx
, volatil
) = 1;
1481 RTX_FLAG (return_rtx
, unchanging
) = 1;
1484 RTX_FLAG (return_rtx
, frame_related
) = 1;
1487 RTX_FLAG (return_rtx
, jump
) = 1;
1490 RTX_FLAG (return_rtx
, call
) = 1;
1493 RTX_FLAG (return_rtx
, return_val
) = 1;
1496 fatal_with_file_and_line ("unrecognized flag: `%c'", flag_char
);
1501 /* Return the numeric value n for GET_REG_NOTE_NAME (n) for STRING,
1502 or fail if STRING isn't recognized. */
1505 parse_reg_note_name (const char *string
)
1507 for (int i
= 0; i
< REG_NOTE_MAX
; i
++)
1508 if (strcmp (string
, GET_REG_NOTE_NAME (i
)) == 0)
1510 fatal_with_file_and_line ("unrecognized REG_NOTE name: `%s'", string
);
1513 /* Allocate an rtx for code NAME. If NAME is a code iterator or code
1514 attribute, record its use for later and use one of its possible
1515 values as an interim rtx code. */
1518 rtx_reader::rtx_alloc_for_name (const char *name
)
1520 #ifdef GENERATOR_FILE
1521 size_t len
= strlen (name
);
1522 if (name
[0] == '<' && name
[len
- 1] == '>')
1524 /* Copy the attribute string into permanent storage, without the
1525 angle brackets around it. */
1526 obstack
*strings
= get_string_obstack ();
1527 obstack_grow0 (strings
, name
+ 1, len
- 2);
1528 char *deferred_name
= XOBFINISH (strings
, char *);
1530 /* Find the name of the attribute. */
1531 const char *attr
= strchr (deferred_name
, ':');
1533 attr
= deferred_name
;
1535 /* Find the attribute itself. */
1536 mapping
*m
= (mapping
*) htab_find (codes
.attrs
, &attr
);
1538 fatal_with_file_and_line ("unknown code attribute `%s'", attr
);
1540 /* Pick the first possible code for now, and record the attribute
1542 rtx x
= rtx_alloc (check_code_attribute (m
));
1543 record_attribute_use (&codes
, x
, 0, deferred_name
);
1547 mapping
*iterator
= (mapping
*) htab_find (codes
.iterators
, &name
);
1550 /* Pick the first possible code for now, and record the iterator
1552 rtx x
= rtx_alloc (rtx_code (iterator
->values
->number
));
1553 record_iterator_use (iterator
, x
, 0);
1558 return rtx_alloc (rtx_code (codes
.find_builtin (name
)));
1561 /* Subroutine of read_rtx and read_nested_rtx. CODE_NAME is the name of
1562 either an rtx code or a code iterator. Parse the rest of the rtx and
1566 rtx_reader::read_rtx_code (const char *code_name
)
1569 const char *format_ptr
;
1570 struct md_name name
;
1575 /* Linked list structure for making RTXs: */
1578 struct rtx_list
*next
;
1579 rtx value
; /* Value of this node. */
1582 /* Handle reuse_rtx ids e.g. "(0|scratch:DI)". */
1583 if (ISDIGIT (code_name
[0]))
1585 reuse_id
= atoi (code_name
);
1586 while (char ch
= *code_name
++)
1591 /* Handle "reuse_rtx". */
1592 if (strcmp (code_name
, "reuse_rtx") == 0)
1595 unsigned idx
= atoi (name
.string
);
1596 /* Look it up by ID. */
1597 gcc_assert (idx
< m_reuse_rtx_by_id
.length ());
1598 return_rtx
= m_reuse_rtx_by_id
[idx
];
1602 /* If we end up with an insn expression then we free this space below. */
1603 return_rtx
= rtx_alloc_for_name (code_name
);
1604 code
= GET_CODE (return_rtx
);
1605 format_ptr
= GET_RTX_FORMAT (code
);
1606 memset (return_rtx
, 0, RTX_CODE_SIZE (code
));
1607 PUT_CODE (return_rtx
, code
);
1611 /* Store away for later reuse. */
1612 m_reuse_rtx_by_id
.safe_grow_cleared (reuse_id
+ 1);
1613 m_reuse_rtx_by_id
[reuse_id
] = return_rtx
;
1616 /* Check for flags. */
1617 read_flags (return_rtx
);
1619 /* Read REG_NOTE names for EXPR_LIST and INSN_LIST. */
1620 if ((GET_CODE (return_rtx
) == EXPR_LIST
1621 || GET_CODE (return_rtx
) == INSN_LIST
1622 || GET_CODE (return_rtx
) == INT_LIST
)
1623 && !m_in_call_function_usage
)
1625 char ch
= read_char ();
1629 PUT_MODE_RAW (return_rtx
,
1630 (machine_mode
)parse_reg_note_name (name
.string
));
1636 /* If what follows is `: mode ', read it and
1637 store the mode in the rtx. */
1639 c
= read_skip_spaces ();
1643 record_potential_iterator_use (&modes
, return_rtx
, 0, name
.string
);
1648 if (INSN_CHAIN_CODE_P (code
))
1651 INSN_UID (return_rtx
) = atoi (name
.string
);
1654 /* Use the format_ptr to parse the various operands of this rtx. */
1655 for (int idx
= 0; format_ptr
[idx
] != 0; idx
++)
1656 return_rtx
= read_rtx_operand (return_rtx
, idx
);
1658 /* Handle any additional information that after the regular fields
1659 (e.g. when parsing function dumps). */
1660 handle_any_trailing_information (return_rtx
);
1662 if (CONST_WIDE_INT_P (return_rtx
))
1665 validate_const_wide_int (name
.string
);
1667 const char *s
= name
.string
;
1670 int gs
= HOST_BITS_PER_WIDE_INT
/4;
1672 char * buf
= XALLOCAVEC (char, gs
+ 1);
1673 unsigned HOST_WIDE_INT wi
;
1676 /* Skip the leading spaces. */
1677 while (*s
&& ISSPACE (*s
))
1680 /* Skip the leading 0x. */
1681 gcc_assert (s
[0] == '0');
1682 gcc_assert (s
[1] == 'x');
1687 wlen
= (len
+ gs
- 1) / gs
; /* Number of words needed */
1689 return_rtx
= const_wide_int_alloc (wlen
);
1693 #if HOST_BITS_PER_WIDE_INT == 64
1694 sscanf (s
+ pos
, "%16" HOST_WIDE_INT_PRINT
"x", &wi
);
1696 sscanf (s
+ pos
, "%8" HOST_WIDE_INT_PRINT
"x", &wi
);
1698 CWI_ELT (return_rtx
, index
++) = wi
;
1701 strncpy (buf
, s
, gs
- pos
);
1703 sscanf (buf
, "%" HOST_WIDE_INT_PRINT
"x", &wi
);
1704 CWI_ELT (return_rtx
, index
++) = wi
;
1705 /* TODO: After reading, do we want to canonicalize with:
1706 value = lookup_const_wide_int (value); ? */
1710 c
= read_skip_spaces ();
1711 /* Syntactic sugar for AND and IOR, allowing Lisp-like
1712 arbitrary number of arguments for them. */
1714 && (GET_CODE (return_rtx
) == AND
1715 || GET_CODE (return_rtx
) == IOR
))
1716 return read_rtx_variadic (return_rtx
);
1722 /* Subroutine of read_rtx_code. Parse operand IDX within RETURN_RTX,
1723 based on the corresponding format character within GET_RTX_FORMAT
1724 for the GET_CODE (RETURN_RTX), and return RETURN_RTX.
1725 This is a virtual function, so that function_reader can override
1726 some parsing, and potentially return a different rtx. */
1729 rtx_reader::read_rtx_operand (rtx return_rtx
, int idx
)
1731 RTX_CODE code
= GET_CODE (return_rtx
);
1732 const char *format_ptr
= GET_RTX_FORMAT (code
);
1734 struct md_name name
;
1736 switch (format_ptr
[idx
])
1738 /* 0 means a field for internal use only.
1739 Don't expect it to be present in the input. */
1742 ORIGINAL_REGNO (return_rtx
) = REGNO (return_rtx
);
1746 XEXP (return_rtx
, idx
) = read_nested_rtx ();
1750 XEXP (return_rtx
, idx
) = read_nested_rtx ();
1754 /* 'V' is an optional vector: if a closeparen follows,
1755 just store NULL for this element. */
1756 c
= read_skip_spaces ();
1760 XVEC (return_rtx
, idx
) = 0;
1763 /* Now process the vector. */
1768 /* Obstack to store scratch vector in. */
1769 struct obstack vector_stack
;
1770 int list_counter
= 0;
1771 rtvec return_vec
= NULL_RTVEC
;
1772 rtx saved_rtx
= NULL_RTX
;
1774 require_char_ws ('[');
1776 /* Add expressions to a list, while keeping a count. */
1777 obstack_init (&vector_stack
);
1778 while ((c
= read_skip_spaces ()) && c
!= ']')
1781 fatal_expected_char (']', c
);
1785 int repeat_count
= 1;
1788 /* Process "repeated xN" directive. */
1790 if (strcmp (name
.string
, "repeated"))
1791 fatal_with_file_and_line ("invalid directive \"%s\"\n",
1794 if (!sscanf (name
.string
, "x%d", &repeat_count
))
1795 fatal_with_file_and_line ("invalid repeat count \"%s\"\n",
1798 /* We already saw one of the instances. */
1803 value
= read_nested_rtx ();
1805 for (; repeat_count
> 0; repeat_count
--)
1808 obstack_ptr_grow (&vector_stack
, value
);
1812 if (list_counter
> 0)
1814 return_vec
= rtvec_alloc (list_counter
);
1815 memcpy (&return_vec
->elem
[0], obstack_finish (&vector_stack
),
1816 list_counter
* sizeof (rtx
));
1818 else if (format_ptr
[idx
] == 'E')
1819 fatal_with_file_and_line ("vector must have at least one element");
1820 XVEC (return_rtx
, idx
) = return_vec
;
1821 obstack_free (&vector_stack
, NULL
);
1822 /* close bracket gotten */
1833 c
= read_skip_spaces ();
1837 /* 'S' fields are optional and should be NULL if no string
1838 was given. Also allow normal 's' and 'T' strings to be
1839 omitted, treating them in the same way as empty strings. */
1840 XSTR (return_rtx
, idx
) = (format_ptr
[idx
] == 'S' ? NULL
: "");
1844 /* The output template slot of a DEFINE_INSN, DEFINE_INSN_AND_SPLIT,
1845 DEFINE_INSN_AND_REWRITE or DEFINE_PEEPHOLE automatically
1846 gets a star inserted as its first character, if it is
1847 written with a brace block instead of a string constant. */
1848 star_if_braced
= (format_ptr
[idx
] == 'T');
1850 stringbuf
= read_string (star_if_braced
);
1854 #ifdef GENERATOR_FILE
1855 /* For insn patterns, we want to provide a default name
1856 based on the file and line, like "*foo.md:12", if the
1857 given name is blank. These are only for define_insn and
1858 define_insn_and_split, to aid debugging. */
1859 if (*stringbuf
== '\0'
1861 && (GET_CODE (return_rtx
) == DEFINE_INSN
1862 || GET_CODE (return_rtx
) == DEFINE_INSN_AND_SPLIT
1863 || GET_CODE (return_rtx
) == DEFINE_INSN_AND_REWRITE
))
1865 struct obstack
*string_obstack
= get_string_obstack ();
1867 const char *read_md_filename
= get_filename ();
1868 const char *fn
= (read_md_filename
? read_md_filename
: "rtx");
1870 for (slash
= fn
; *slash
; slash
++)
1871 if (*slash
== '/' || *slash
== '\\' || *slash
== ':')
1873 obstack_1grow (string_obstack
, '*');
1874 obstack_grow (string_obstack
, fn
, strlen (fn
));
1875 sprintf (line_name
, ":%d", get_lineno ());
1876 obstack_grow (string_obstack
, line_name
, strlen (line_name
)+1);
1877 stringbuf
= XOBFINISH (string_obstack
, char *);
1880 /* Find attr-names in the string. */
1882 char *start
, *end
, *ptr
;
1886 while ((start
= strchr (end
, '<')) && (end
= strchr (start
, '>')))
1888 if ((end
- start
- 1 > 0)
1889 && (end
- start
- 1 < (int)sizeof (tmpstr
)))
1891 strncpy (tmpstr
, start
+1, end
-start
-1);
1892 tmpstr
[end
-start
-1] = 0;
1898 = (struct mapping
*) htab_find (substs
.attrs
, &ptr
);
1901 /* Here we should find linked subst-iter. */
1902 str
= find_subst_iter_by_attr (ptr
);
1904 m
= (struct mapping
*) htab_find (substs
.iterators
, &str
);
1909 record_iterator_use (m
, return_rtx
, 0);
1911 #endif /* #ifdef GENERATOR_FILE */
1913 const char *string_ptr
= finalize_string (stringbuf
);
1916 XTMPL (return_rtx
, idx
) = string_ptr
;
1918 XSTR (return_rtx
, idx
) = string_ptr
;
1924 HOST_WIDE_INT tmp_wide
;
1926 validate_const_int (name
.string
);
1927 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
1928 tmp_wide
= atoi (name
.string
);
1930 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
1931 tmp_wide
= atol (name
.string
);
1933 /* Prefer atoll over atoq, since the former is in the ISO C99 standard.
1934 But prefer not to use our hand-rolled function above either. */
1935 #if HAVE_DECL_ATOLL || !defined(HAVE_ATOQ)
1936 tmp_wide
= atoll (name
.string
);
1938 tmp_wide
= atoq (name
.string
);
1942 XWINT (return_rtx
, idx
) = tmp_wide
;
1949 /* Can be an iterator or an integer constant. */
1951 record_potential_iterator_use (&ints
, return_rtx
, idx
, name
.string
);
1956 validate_const_int (name
.string
);
1957 set_regno_raw (return_rtx
, atoi (name
.string
), 1);
1958 REG_ATTRS (return_rtx
) = NULL
;
1968 /* Read a nested rtx construct from the MD file and return it. */
1971 rtx_reader::read_nested_rtx ()
1973 struct md_name name
;
1976 /* In compact dumps, trailing "(nil)" values can be omitted.
1977 Handle such dumps. */
1978 if (peek_char () == ')')
1981 require_char_ws ('(');
1984 if (strcmp (name
.string
, "nil") == 0)
1987 return_rtx
= read_rtx_code (name
.string
);
1989 require_char_ws (')');
1991 return_rtx
= postprocess (return_rtx
);
1996 /* Mutually recursive subroutine of read_rtx which reads
1997 (thing x1 x2 x3 ...) and produces RTL as if
1998 (thing x1 (thing x2 (thing x3 ...))) had been written.
1999 When called, FORM is (thing x1 x2), and the file position
2000 is just past the leading parenthesis of x3. Only works
2001 for THINGs which are dyadic expressions, e.g. AND, IOR. */
2003 rtx_reader::read_rtx_variadic (rtx form
)
2012 q
= rtx_alloc (GET_CODE (p
));
2013 PUT_MODE (q
, GET_MODE (p
));
2015 XEXP (q
, 0) = XEXP (p
, 1);
2016 XEXP (q
, 1) = read_nested_rtx ();
2020 c
= read_skip_spaces ();
2027 /* Constructor for class rtx_reader. */
2029 rtx_reader::rtx_reader (bool compact
)
2030 : md_reader (compact
),
2031 m_in_call_function_usage (false)
2033 /* Set the global singleton pointer. */
2034 rtx_reader_ptr
= this;
2036 one_time_initialization ();
2039 /* Destructor for class rtx_reader. */
2041 rtx_reader::~rtx_reader ()
2043 /* Clear the global singleton pointer. */
2044 rtx_reader_ptr
= NULL
;