Go to the previous, next section.

Registers

The operands of SUIF instructions are contained in registers. These registers are divided into several classes: pseudo registers, temporary registers, and machine registers. The pseudo registers hold scalar variables that are guaranteed not to be aliased, temporary registers hold intermediate results within basic blocks, and machine registers represent the actual hardware registers in the target architecture. Within each class, each register is given a unique number. Each register contains a particular variable. Variables that are in registers can be used directly as instruction operands. Other variables must be accessed with load and store instructions.

The simple_reg structure is used to represent Simple-SUIF registers. This structure records the kind of the register (PSEUDO_REG, TEMP_REG, or MACHINE_REG), the register number, and the variable that is held in the register. The Simple-SUIF library keeps the simple_reg objects in a table, so each register is represented by a unique simple_reg instance and you can just refer to registers by the addresses of their simple_reg structures. The NO_REGISTER constant should be used as the address whenever a register field is empty.

The new_register function may be used to create new registers. You need to specify the register kind and the type of the variable to be stored in the register. The function then creates a new variable of the specified type. A new register is entered in the library's register table using the next available register number. You cannot create new machine registers. Note that the new_register function can also be used to create local variables even if they cannot be stored in registers. In that case, you can ignore the resulting registers and just use the variables that are created along with the registers.

In general, you may not modify any of the fields in a simple_reg structure. However, there is one exception to this rule. The register kind may be changed between PSEUDO_REG and TEMP_REG. The current implementation of the library guarantees that none of the registers in these two classes will ever have the same register number, so a register can be moved back and forth between the two classes without changing its number. Of course, if you change the kind of a register, it is up to you to make sure that it is used according to the conventions described below.

Go to the previous, next section.