Avoid emitting XMM save code in soft-float or no-implicit-float mode
authorDan Gohman <gohman@apple.com>
Sun, 16 Aug 2009 21:24:25 +0000 (21:24 +0000)
committerDan Gohman <gohman@apple.com>
Sun, 16 Aug 2009 21:24:25 +0000 (21:24 +0000)
or some other situation where no xmm registers need to be saved.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79207 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp

index ff9f2bf4430120e626b7063f2800e32db00f6cbc..e3fce7961c11a765a43afda43303d66f136ba01a 100644 (file)
@@ -1541,29 +1541,32 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
         Offset += 8;
       }
 
-      if (!MemOps.empty())
-          Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
-                             &MemOps[0], MemOps.size());
-
-      // Now store the XMM (fp + vector) parameter registers.
-      SmallVector<SDValue, 11> SaveXMMOps;
-      SaveXMMOps.push_back(Chain);
-
-      unsigned AL = MF.addLiveIn(X86::AL, X86::GR8RegisterClass);
-      SDValue ALVal = DAG.getCopyFromReg(DAG.getEntryNode(), dl, AL, MVT::i8);
-      SaveXMMOps.push_back(ALVal);
-
-      SaveXMMOps.push_back(DAG.getIntPtrConstant(RegSaveFrameIndex));
-      SaveXMMOps.push_back(DAG.getIntPtrConstant(VarArgsFPOffset));
-
-      for (; NumXMMRegs != TotalNumXMMRegs; ++NumXMMRegs) {
-        unsigned VReg = MF.addLiveIn(XMMArgRegs[NumXMMRegs],
-                                     X86::VR128RegisterClass);
-        SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, MVT::v4f32);
-        SaveXMMOps.push_back(Val);
+      if (TotalNumXMMRegs != 0 && NumXMMRegs != TotalNumXMMRegs) {
+        // Now store the XMM (fp + vector) parameter registers.
+        SmallVector<SDValue, 11> SaveXMMOps;
+        SaveXMMOps.push_back(Chain);
+
+        unsigned AL = MF.addLiveIn(X86::AL, X86::GR8RegisterClass);
+        SDValue ALVal = DAG.getCopyFromReg(DAG.getEntryNode(), dl, AL, MVT::i8);
+        SaveXMMOps.push_back(ALVal);
+
+        SaveXMMOps.push_back(DAG.getIntPtrConstant(RegSaveFrameIndex));
+        SaveXMMOps.push_back(DAG.getIntPtrConstant(VarArgsFPOffset));
+
+        for (; NumXMMRegs != TotalNumXMMRegs; ++NumXMMRegs) {
+          unsigned VReg = MF.addLiveIn(XMMArgRegs[NumXMMRegs],
+                                       X86::VR128RegisterClass);
+          SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, MVT::v4f32);
+          SaveXMMOps.push_back(Val);
+        }
+        MemOps.push_back(DAG.getNode(X86ISD::VASTART_SAVE_XMM_REGS, dl,
+                                     MVT::Other,
+                                     &SaveXMMOps[0], SaveXMMOps.size()));
       }
-      Chain = DAG.getNode(X86ISD::VASTART_SAVE_XMM_REGS, dl, MVT::Other,
-                          &SaveXMMOps[0], SaveXMMOps.size());
+
+      if (!MemOps.empty())
+        Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
+                            &MemOps[0], MemOps.size());
     }
   }