Fortran computed goto
statements and C switch
statements
are represented in SUIF by multi-way branch (mbr
) instructions.
These are easier to analyze than the equivalent series of conditional
branches, and they can easily be used to generate efficient jump table
code. The in_mbr
class holds these multi-way branch
instructions.
The in_mbr
class contains a field with a pointer to an array of
label symbols. The num_labs
method returns the number of labels
in the array. The size of the array can be changed at any time using
the set_num_labs
method; if necessary the array will be
reallocated. A particular element within the array can be accessed
using the label
and set_label
methods. You must specify
the array index, and, as usual, the elements are numbered beginning with
zero.
A multi-way branch instruction transfers control to one of the target
labels depending on the value in the source operand. This operand must
have an integer type. It can be accessed using the src_op
and
set_src
methods. The value of the source operand is combined
with an integer offset to determine the target label. The offset can be
accessed with the lower
and set_lower
methods. The offset
is subtracted from the value in the source operand and the result is
used to index into the array of target labels. If the index is within
the range of the array, the instruction branches to the label at that
position in the array; otherwise, it branches to the default target
label. The default_lab
and set_default_lab
methods access
this default label field. The destination operand of a multi-way branch
is unused and trying to set it will cause an error. The result type
should always be the SUIF void
type.