[2] | 1 | #ifndef REGISTERMANAGER_H
|
---|
| 2 | #define REGISTERMANAGER_H
|
---|
| 3 |
|
---|
| 4 | #include "Symbol.h"
|
---|
| 5 | #include "globals.h"
|
---|
| 6 | #include "StackFrameManager.h"
|
---|
| 7 | #include "AssemblerCode.h"
|
---|
| 8 |
|
---|
| 9 | /* Keeps track of what registers are associated with symbols.
|
---|
| 10 | Loads the appropriate registers and generates spill code if needed.
|
---|
| 11 | */
|
---|
| 12 | class RegisterManager {
|
---|
| 13 | public:
|
---|
| 14 | // constructor
|
---|
| 15 | RegisterManager(StackFrameManager& sfm, AssemblerCode& ac);
|
---|
| 16 |
|
---|
| 17 | // Get the register associated with symbol.
|
---|
| 18 | // Register is of same type as the return type of the symbol.
|
---|
| 19 | // Generates loading code if needed.
|
---|
| 20 | MRegisterType GetRegister(Symbol *symbol);
|
---|
| 21 |
|
---|
| 22 | // Gets an integer register associated with symbol.
|
---|
| 23 | // Generates loading code if needed.
|
---|
| 24 | MRegisterType GetIntRegister(Symbol *symbol);
|
---|
| 25 |
|
---|
| 26 | // Gets a float register associated with symbol.
|
---|
| 27 | // Generates loading code if needed.
|
---|
| 28 | MRegisterType GetFloatRegister(Symbol *symbol);
|
---|
| 29 |
|
---|
| 30 | // Get temponary register, which rotates
|
---|
| 31 | MRegisterType GetTempRegister();
|
---|
| 32 |
|
---|
| 33 | // Write back all registers and unassociate all symbols.
|
---|
| 34 | void SpillAll();
|
---|
| 35 | private:
|
---|
| 36 | StackFrameManager& sfm;
|
---|
| 37 | AssemblerCode& ac;
|
---|
| 38 |
|
---|
| 39 | // Find the register associated with symbol and return its index
|
---|
| 40 | // Returns -1 if not found
|
---|
| 41 | int FindSymbol(Symbol *symbols[], int size, Symbol *symbol) const;
|
---|
| 42 |
|
---|
| 43 | // Find an unused register and returns its index
|
---|
| 44 | // Returns -1 if not found
|
---|
| 45 | int FindUnused(Symbol *symbols[], int size) const;
|
---|
| 46 |
|
---|
| 47 | int PickSpillRegister(MRegisterType registers[], int size) const;
|
---|
| 48 |
|
---|
| 49 | // Clears the symbol associated with the register and generates spill code
|
---|
| 50 | void SpillIntRegister(int idx);
|
---|
| 51 | void SpillFloatRegister(int idx);
|
---|
| 52 |
|
---|
| 53 | void GenerateIntSpillCode(MRegisterType reg, Symbol *symbol);
|
---|
| 54 | void GenerateFloatSpillCode(MRegisterType reg, Symbol *symbol);
|
---|
| 55 |
|
---|
| 56 | void GenerateIntLoadCode(MRegisterType reg, Symbol *symbol);
|
---|
| 57 | void GenerateFloatLoadCode(MRegisterType reg, Symbol *symbol);
|
---|
| 58 |
|
---|
| 59 | static const int int_reg_size = 18; // number of integer registers
|
---|
| 60 | static MRegisterType int_registers[int_reg_size]; // the integer registers that can be used
|
---|
| 61 | Symbol *int_symbols[int_reg_size]; // symbols associated with integer registers
|
---|
| 62 |
|
---|
| 63 | static const int float_reg_size = 15; // number of float registers
|
---|
| 64 | static MRegisterType float_registers[float_reg_size]; // the float registers that can be used
|
---|
| 65 | Symbol *float_symbols[float_reg_size]; // symbols associated with integer registers
|
---|
| 66 |
|
---|
| 67 | static const int tmp_reg_size = 4;
|
---|
| 68 | static MRegisterType tmp_registers[tmp_reg_size];
|
---|
| 69 | };
|
---|
| 70 |
|
---|
| 71 | #endif /* REGISTERMANAGER_H */
|
---|