Add notes on instruction selection pass


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/docs/HistoricalNotes/2001-07-08-InstructionSelection.txt b/docs/HistoricalNotes/2001-07-08-InstructionSelection.txt
new file mode 100644
index 0000000..8cc75b8
--- /dev/null
+++ b/docs/HistoricalNotes/2001-07-08-InstructionSelection.txt
@@ -0,0 +1,51 @@
+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
+