diff --git a/llvm/lib/Target/CBackend/CBackend.cpp b/llvm/lib/Target/CBackend/CBackend.cpp
index 1aa17b4..67f513b 100644
--- a/llvm/lib/Target/CBackend/CBackend.cpp
+++ b/llvm/lib/Target/CBackend/CBackend.cpp
@@ -2886,7 +2886,7 @@
   bool hasByVal = I.hasByValArgument();
   bool isStructRet = I.hasStructRetAttr();
   if (isStructRet) {
-    writeOperandDeref(I.getOperand(0));
+    writeOperandDeref(I.getOperand(1));
     Out << " = ";
   }
   
@@ -2942,7 +2942,7 @@
 
   unsigned NumDeclaredParams = FTy->getNumParams();
 
-  CallInst::op_iterator AI = I.op_begin(), AE = I.op_end() - 1;
+  CallSite::arg_iterator AI = I.op_begin()+1, AE = I.op_end();
   unsigned ArgNo = 0;
   if (isStructRet) {   // Skip struct return argument.
     ++AI;
@@ -2996,7 +2996,7 @@
     Out << "0; ";
       
     Out << "va_start(*(va_list*)";
-    writeOperand(I.getOperand(0));
+    writeOperand(I.getOperand(1));
     Out << ", ";
     // Output the last argument to the enclosing function.
     if (I.getParent()->getParent()->arg_empty())
@@ -3006,9 +3006,9 @@
     Out << ')';
     return true;
   case Intrinsic::vaend:
-    if (!isa<ConstantPointerNull>(I.getOperand(0))) {
+    if (!isa<ConstantPointerNull>(I.getOperand(1))) {
       Out << "0; va_end(*(va_list*)";
-      writeOperand(I.getOperand(0));
+      writeOperand(I.getOperand(1));
       Out << ')';
     } else {
       Out << "va_end(*(va_list*)0)";
@@ -3017,47 +3017,47 @@
   case Intrinsic::vacopy:
     Out << "0; ";
     Out << "va_copy(*(va_list*)";
-    writeOperand(I.getOperand(0));
-    Out << ", *(va_list*)";
     writeOperand(I.getOperand(1));
+    Out << ", *(va_list*)";
+    writeOperand(I.getOperand(2));
     Out << ')';
     return true;
   case Intrinsic::returnaddress:
     Out << "__builtin_return_address(";
-    writeOperand(I.getOperand(0));
+    writeOperand(I.getOperand(1));
     Out << ')';
     return true;
   case Intrinsic::frameaddress:
     Out << "__builtin_frame_address(";
-    writeOperand(I.getOperand(0));
+    writeOperand(I.getOperand(1));
     Out << ')';
     return true;
   case Intrinsic::powi:
     Out << "__builtin_powi(";
-    writeOperand(I.getOperand(0));
-    Out << ", ";
     writeOperand(I.getOperand(1));
+    Out << ", ";
+    writeOperand(I.getOperand(2));
     Out << ')';
     return true;
   case Intrinsic::setjmp:
     Out << "setjmp(*(jmp_buf*)";
-    writeOperand(I.getOperand(0));
+    writeOperand(I.getOperand(1));
     Out << ')';
     return true;
   case Intrinsic::longjmp:
     Out << "longjmp(*(jmp_buf*)";
-    writeOperand(I.getOperand(0));
-    Out << ", ";
     writeOperand(I.getOperand(1));
+    Out << ", ";
+    writeOperand(I.getOperand(2));
     Out << ')';
     return true;
   case Intrinsic::prefetch:
     Out << "LLVM_PREFETCH((const void *)";
-    writeOperand(I.getOperand(0));
-    Out << ", ";
     writeOperand(I.getOperand(1));
     Out << ", ";
     writeOperand(I.getOperand(2));
+    Out << ", ";
+    writeOperand(I.getOperand(3));
     Out << ")";
     return true;
   case Intrinsic::stacksave:
@@ -3074,7 +3074,7 @@
     printType(Out, I.getType());
     Out << ')';  
     // Multiple GCC builtins multiplex onto this intrinsic.
-    switch (cast<ConstantInt>(I.getOperand(2))->getZExtValue()) {
+    switch (cast<ConstantInt>(I.getOperand(3))->getZExtValue()) {
     default: llvm_unreachable("Invalid llvm.x86.sse.cmp!");
     case 0: Out << "__builtin_ia32_cmpeq"; break;
     case 1: Out << "__builtin_ia32_cmplt"; break;
@@ -3095,9 +3095,9 @@
       Out << 'd';
       
     Out << "(";
-    writeOperand(I.getOperand(0));
-    Out << ", ";
     writeOperand(I.getOperand(1));
+    Out << ", ";
+    writeOperand(I.getOperand(2));
     Out << ")";
     return true;
   case Intrinsic::ppc_altivec_lvsl:
@@ -3105,7 +3105,7 @@
     printType(Out, I.getType());
     Out << ')';  
     Out << "__builtin_altivec_lvsl(0, (void*)";
-    writeOperand(I.getOperand(0));
+    writeOperand(I.getOperand(1));
     Out << ")";
     return true;
   }
@@ -3218,7 +3218,7 @@
       DestVal = ResultVals[ValueCount].first;
       DestValNo = ResultVals[ValueCount].second;
     } else
-      DestVal = CI.getOperand(ValueCount-ResultVals.size());
+      DestVal = CI.getOperand(ValueCount-ResultVals.size()+1);
 
     if (I->isEarlyClobber)
       C = "&"+C;
@@ -3252,7 +3252,7 @@
     }
     
     assert(ValueCount >= ResultVals.size() && "Input can't refer to result");
-    Value *SrcVal = CI.getOperand(ValueCount-ResultVals.size());
+    Value *SrcVal = CI.getOperand(ValueCount-ResultVals.size()+1);
     
     Out << "\"" << C << "\"(";
     if (!I->isIndirect)
