[llvm-commits] CVS: llvm/lib/Target/X86/InstSelectSimple.cpp X86InstrInfo.def

Chris Lattner lattner at cs.uiuc.edu
Mon Nov 11 13:38:01 PST 2002


Changes in directory llvm/lib/Target/X86:

InstSelectSimple.cpp updated: 1.22 -> 1.23
X86InstrInfo.def updated: 1.13 -> 1.14

---
Log message:

InstSelectSimple.cpp: (visitReturnInst) Add return instructions with return
 values.
X86InstrInfo.def: add LEAVE instruction.


---
Diffs of the changes:

Index: llvm/lib/Target/X86/InstSelectSimple.cpp
diff -u llvm/lib/Target/X86/InstSelectSimple.cpp:1.22 llvm/lib/Target/X86/InstSelectSimple.cpp:1.23
--- llvm/lib/Target/X86/InstSelectSimple.cpp:1.22	Thu Nov  7 11:59:21 2002
+++ llvm/lib/Target/X86/InstSelectSimple.cpp	Mon Nov 11 13:37:09 2002
@@ -326,15 +326,70 @@
 ///   ret long, ulong  : Move value into EAX/EDX (?) and return
 ///   ret float/double : ?  Top of FP stack?  XMM0?
 ///
-void ISel::visitReturnInst(ReturnInst &I) {
-  if (I.getNumOperands() != 0) {  // Not 'ret void'?
-    // Move result into a hard register... then emit a ret
-    visitInstruction(I);  // abort
-  }
-
-  // Emit a simple 'ret' instruction... appending it to the end of the basic
-  // block
-  BuildMI(BB, X86::RET, 0);
+void
+ISel::visitReturnInst (ReturnInst & I)
+{
+  if (I.getNumOperands () == 1)
+    {
+      unsigned val = getReg (I.getOperand (0));
+      unsigned operandSize =
+	I.getOperand (0)->getType ()->getPrimitiveSize ();
+      bool isFP = I.getOperand (0)->getType ()->isFloatingPoint ();
+      if (isFP)
+	{
+	  // ret float/double: top of FP stack
+	  // FLD <val>
+	  switch (operandSize)
+	    {
+	    case 4:
+	      BuildMI (BB, X86::FLDr4, 1, X86::NoReg).addReg (val);
+	      break;
+	    case 8:
+	      BuildMI (BB, X86::FLDr8, 1, X86::NoReg).addReg (val);
+	      break;
+	    default:
+	      visitInstruction (I);
+	      break;
+	    }
+	}
+      else
+	{
+	  switch (operandSize)
+	    {
+	    case 1:
+	      // ret sbyte, ubyte: Extend value into EAX and return
+	      // MOV AL, <val>
+	      // CBW
+	      BuildMI (BB, X86::MOVrr8, 1, X86::AL).addReg (val);
+	      BuildMI (BB, X86::CBW, 0);
+	      break;
+	    case 2:
+	      // ret short, ushort: Extend value into EAX and return
+	      // MOV AX, <val>
+	      // CWDE
+	      BuildMI (BB, X86::MOVrr16, 1, X86::AX).addReg (val);
+	      BuildMI (BB, X86::CWDE, 0);
+	      break;
+	    case 4:
+	      // ret int, uint, ptr: Move value into EAX and return
+	      // MOV EAX, <val>
+	      BuildMI (BB, X86::MOVrr32, 1, X86::EAX).addReg (val);
+	      break;
+	    case 8:
+	      // ret long: use EAX(least significant 32 bits)/EDX (most
+	      // significant 32)...uh, I think so Brain, but how do i call
+	      // up the two parts of the value from inside this mouse
+	      // cage? *zort*
+	    default:
+	      // abort
+	      visitInstruction (I);
+	      break;
+	    }
+	}
+    }
+  // Emit a 'leave' and a 'ret'
+  BuildMI (BB, X86::LEAVE, 0);
+  BuildMI (BB, X86::RET, 0);
 }
 
 /// visitBranchInst - Handle conditional and unconditional branches here.  Note


Index: llvm/lib/Target/X86/X86InstrInfo.def
diff -u llvm/lib/Target/X86/X86InstrInfo.def:1.13 llvm/lib/Target/X86/X86InstrInfo.def:1.14
--- llvm/lib/Target/X86/X86InstrInfo.def:1.13	Thu Nov  7 11:59:21 2002
+++ llvm/lib/Target/X86/X86InstrInfo.def	Mon Nov 11 13:37:09 2002
@@ -44,6 +44,7 @@
 I(MOVir8      , "movb",               0, 0)           // R8  = imm8   B0+ rb
 I(MOVir16     , "movw",               0, 0)           // R16 = imm16  B8+ rw
 I(MOVir32     , "movl",               0, 0)           // R32 = imm32  B8+ rd
+I(LEAVE       , "leave",              0, 0)           // leave        C9
 
 // Arithmetic instructions
 I(ADDrr8      , "addb",               0, 0)           // R8  += R8    00/r





More information about the llvm-commits mailing list