[llvm-uc] [PATCH 1/3] Add function arguement passed in registers support

  • From: Chen Wei-Ren <chenwj@xxxxxxxxxxxxxxxxx>
  • To: llvm-uc@xxxxxxxxxxxxx
  • Date: Thu, 20 Dec 2012 15:37:58 +0800

  We add if-else statement here to check if the arguement is passed in register
or memory. According to UniCore32-ABI [1], the first four arguements are passed
in r0 - r3 registers. We only deal with i32 arguement at this moment. i8 and i16
needed to be addressed in the future by using unsigned extension.

[1] http://mprc.pku.edu.cn/~guanxuetao/linux/manual/UniCore32-ABI-1.1.0-UC4.pdf

Signed-off-by: Chen Wei-Ren <chenwj@xxxxxxxxxxxxxxxxx>
---
 lib/Target/UniCore/UniCoreISelLowering.cpp |   41 +++++++++++++++++++++++-----
 1 files changed, 34 insertions(+), 7 deletions(-)

diff --git a/lib/Target/UniCore/UniCoreISelLowering.cpp 
b/lib/Target/UniCore/UniCoreISelLowering.cpp
index 07ec567..7e9daee 100644
--- a/lib/Target/UniCore/UniCoreISelLowering.cpp
+++ b/lib/Target/UniCore/UniCoreISelLowering.cpp
@@ -96,13 +96,40 @@ UniCoreTargetLowering::LowerCCCArguments(SDValue Chain,
   for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
     CCValAssign &VA = ArgLocs[i];
 
-    unsigned ObjSize = VA.getLocVT().getSizeInBits()/8;
-
-    int FI = MFI->CreateFixedObject(ObjSize, VA.getLocMemOffset(), true);
-    SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
-    InVals.push_back(DAG.getLoad(VA.getLocVT(), dl, Chain, FIN,
-                     MachinePointerInfo::getFixedStack(FI),
-                     false, false, false, 0));
+    if (VA.isRegLoc()) {
+      // Arguments passed in registers
+      EVT RegVT = VA.getLocVT();
+      switch (RegVT.getSimpleVT().SimpleTy) {
+      default:
+        {
+#ifndef NDEBUG
+          errs() << "LowerFormalArguments Unhandled argument type: "
+                 << RegVT.getSimpleVT().SimpleTy << "\n";
+#endif
+          llvm_unreachable(0);
+       }
+      case MVT::i32:
+        unsigned VReg = 
RegInfo.createVirtualRegister(&UniCore::GPRRegsRegClass);
+        RegInfo.addLiveIn(VA.getLocReg(), VReg);
+        SDValue ArgValue = DAG.getCopyFromReg(Chain, dl, VReg, RegVT);
+
+        if (VA.getLocInfo() != CCValAssign::Full)
+          ArgValue = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), ArgValue);
+
+        InVals.push_back(ArgValue);
+      }
+    } else {
+      // Sanity check
+      assert(VA.isMemLoc());
+
+      unsigned ObjSize = VA.getLocVT().getSizeInBits()/8;
+
+      int FI = MFI->CreateFixedObject(ObjSize, VA.getLocMemOffset(), true);
+      SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
+      InVals.push_back(DAG.getLoad(VA.getLocVT(), dl, Chain, FIN,
+                       MachinePointerInfo::getFixedStack(FI),
+                       false, false, false, 0));
+    }
   }
 
   return Chain;
-- 
1.7.3.4


Other related posts:

  • » [llvm-uc] [PATCH 1/3] Add function arguement passed in registers support - Chen Wei-Ren