Support most cases of vaarg (except double).
authorBrian Gaeke <gaeke@uiuc.edu>
Sat, 20 Nov 2004 22:50:42 +0000 (22:50 +0000)
committerBrian Gaeke <gaeke@uiuc.edu>
Sat, 20 Nov 2004 22:50:42 +0000 (22:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18055 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Sparc/SparcV8ISelSimple.cpp
lib/Target/SparcV8/SparcV8ISelSimple.cpp

index 3d29ba5fd76d20af348aa6d54799b1f0256aba61..771657a34b775d55e6f838993bbf31aa202061cd 100644 (file)
@@ -1401,5 +1401,32 @@ void V8ISel::visitVANextInst (VANextInst &I) {
 }
 
 void V8ISel::visitVAArgInst (VAArgInst &I) {
-  std::cerr << "Sorry, vaarg instruction still unsupported:\n" << I; abort ();
+  unsigned VAList = getReg (I.getOperand (0));
+  unsigned DestReg = getReg (I);
+
+  switch (I.getType ()->getTypeID ()) {
+  case Type::PointerTyID:
+  case Type::UIntTyID:
+  case Type::IntTyID:
+       BuildMI (BB, V8::LD, 2, DestReg).addReg (VAList).addSImm (0);
+    return;
+
+  case Type::ULongTyID:
+  case Type::LongTyID:
+       BuildMI (BB, V8::LD, 2, DestReg).addReg (VAList).addSImm (0);
+       BuildMI (BB, V8::LD, 2, DestReg+1).addReg (VAList).addSImm (4);
+    return;
+
+  case Type::FloatTyID:
+    BuildMI (BB, V8::LDFri, 2, DestReg).addReg (VAList).addSImm (0);
+    return;
+
+  case Type::DoubleTyID:
+
+  default:
+    std::cerr << "Sorry, vaarg instruction of this type still unsupported:\n"
+              << I;
+    abort ();
+    return;
+  }
 }
index 3d29ba5fd76d20af348aa6d54799b1f0256aba61..771657a34b775d55e6f838993bbf31aa202061cd 100644 (file)
@@ -1401,5 +1401,32 @@ void V8ISel::visitVANextInst (VANextInst &I) {
 }
 
 void V8ISel::visitVAArgInst (VAArgInst &I) {
-  std::cerr << "Sorry, vaarg instruction still unsupported:\n" << I; abort ();
+  unsigned VAList = getReg (I.getOperand (0));
+  unsigned DestReg = getReg (I);
+
+  switch (I.getType ()->getTypeID ()) {
+  case Type::PointerTyID:
+  case Type::UIntTyID:
+  case Type::IntTyID:
+       BuildMI (BB, V8::LD, 2, DestReg).addReg (VAList).addSImm (0);
+    return;
+
+  case Type::ULongTyID:
+  case Type::LongTyID:
+       BuildMI (BB, V8::LD, 2, DestReg).addReg (VAList).addSImm (0);
+       BuildMI (BB, V8::LD, 2, DestReg+1).addReg (VAList).addSImm (4);
+    return;
+
+  case Type::FloatTyID:
+    BuildMI (BB, V8::LDFri, 2, DestReg).addReg (VAList).addSImm (0);
+    return;
+
+  case Type::DoubleTyID:
+
+  default:
+    std::cerr << "Sorry, vaarg instruction of this type still unsupported:\n"
+              << I;
+    abort ();
+    return;
+  }
 }