|  | Date: Sun, 8 Jul 2001 09:37:22 -0500 | 
|  | From: Vikram S. Adve <vadve@cs.uiuc.edu> | 
|  | To: Ruchira Sasanka <sasanka@students.uiuc.edu> | 
|  | Cc: Chris Lattner <lattner@cs.uiuc.edu> | 
|  | Subject: machine instruction operands | 
|  |  | 
|  | Ruchira, | 
|  |  | 
|  | When generating machine instructions, I have to make several choices about | 
|  | operands.  For cases were a register is required, there are 3 cases: | 
|  |  | 
|  | 1. The register is for a Value* that is already in the VM code. | 
|  |  | 
|  | 2. The register is for a value that is not in the VM code, usually because 2 | 
|  | machine instructions get generated for a single VM instruction (and the | 
|  | register holds the result of the first m/c instruction and is used by the | 
|  | second m/c instruction). | 
|  |  | 
|  | 3. The register is a pre-determined machine register. | 
|  |  | 
|  | E.g, for this VM instruction: | 
|  | ptr = alloca type, numElements | 
|  | I have to generate 2 machine instructions: | 
|  | reg = mul constant, numElements | 
|  | ptr = add %sp, reg | 
|  |  | 
|  | Each machine instruction is of class MachineInstr. | 
|  | It has a vector of operands.  All register operands have type MO_REGISTER. | 
|  | The 3 types of register operands are marked using this enum: | 
|  |  | 
|  | enum VirtualRegisterType { | 
|  | MO_VMVirtualReg,            // virtual register for *value | 
|  | MO_MInstrVirtualReg,        // virtual register for result of *minstr | 
|  | MO_MachineReg               // pre-assigned machine register `regNum' | 
|  | } vregType; | 
|  |  | 
|  | Here's how this affects register allocation: | 
|  |  | 
|  | 1. MO_VMVirtualReg is the standard case: you just do the register | 
|  | allocation. | 
|  |  | 
|  | 2. MO_MInstrVirtualReg is the case where there is a hidden register being | 
|  | used.  You should decide how you want to handle it, e.g., do you want do | 
|  | create a Value object during the preprocessing phase to make the value | 
|  | explicit (like for address register for the RETURN instruction). | 
|  |  | 
|  | 3. For case MO_MachineReg, you don't need to do anything, at least for | 
|  | SPARC. The only machine regs I am using so far are %g0 and %sp. | 
|  |  | 
|  | --Vikram | 
|  |  |