Allow saving and restoring of double and float registers.
authorBrian Gaeke <gaeke@uiuc.edu>
Sun, 27 Jun 2004 22:59:56 +0000 (22:59 +0000)
committerBrian Gaeke <gaeke@uiuc.edu>
Sun, 27 Jun 2004 22:59:56 +0000 (22:59 +0000)
Allow copying of float registers.

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

lib/Target/Sparc/SparcRegisterInfo.cpp
lib/Target/SparcV8/SparcV8RegisterInfo.cpp

index 93b23162cb939d352597fa4894ab6903e9b602e3..d033b537ffe6823413120f5b5a7bb003950a2875 100644 (file)
@@ -30,10 +30,18 @@ int SparcV8RegisterInfo::storeRegToStackSlot(
   unsigned SrcReg, int FrameIdx,
   const TargetRegisterClass *RC) const
 {
-  assert (RC == SparcV8::IntRegsRegisterClass
-          && "Can only store 32-bit values to stack slots");
   // On the order of operands here: think "[FrameIdx + 0] = SrcReg".
-  BuildMI (MBB, I, V8::ST, 3).addFrameIndex (FrameIdx).addSImm (0).addReg (SrcReg);
+  if (RC == SparcV8::IntRegsRegisterClass) 
+    BuildMI (MBB, I, V8::ST, 3).addFrameIndex (FrameIdx).addSImm (0)
+      .addReg (SrcReg);
+  else if (RC == SparcV8::FPRegsRegisterClass)
+    BuildMI (MBB, I, V8::STFri, 3).addFrameIndex (FrameIdx).addSImm (0)
+      .addReg (SrcReg);
+  else if (RC == SparcV8::DFPRegsRegisterClass)
+    BuildMI (MBB, I, V8::STDFri, 3).addFrameIndex (FrameIdx).addSImm (0)
+      .addReg (SrcReg);
+  else
+    assert (0 && "Can't store this register to stack slot");
   return 1;
 }
 
@@ -43,9 +51,16 @@ int SparcV8RegisterInfo::loadRegFromStackSlot(
   unsigned DestReg, int FrameIdx,
   const TargetRegisterClass *RC) const
 {
-  assert (RC == SparcV8::IntRegsRegisterClass
-          && "Can only load 32-bit registers from stack slots");
-  BuildMI (MBB, I, V8::LD, 2, DestReg).addFrameIndex (FrameIdx).addSImm (0);
+  if (RC == SparcV8::IntRegsRegisterClass) 
+    BuildMI (MBB, I, V8::LD, 2, DestReg).addFrameIndex (FrameIdx).addSImm (0);
+  else if (RC == SparcV8::FPRegsRegisterClass)
+    BuildMI (MBB, I, V8::LDFri, 2, DestReg).addFrameIndex (FrameIdx)
+      .addSImm (0);
+  else if (RC == SparcV8::DFPRegsRegisterClass)
+    BuildMI (MBB, I, V8::LDDFri, 2, DestReg).addFrameIndex (FrameIdx)
+      .addSImm (0);
+  else
+    assert (0 && "Can't load this register from stack slot");
   return 1;
 }
 
@@ -53,9 +68,12 @@ int SparcV8RegisterInfo::copyRegToReg(MachineBasicBlock &MBB,
                                       MachineBasicBlock::iterator I,
                                       unsigned DestReg, unsigned SrcReg,
                                       const TargetRegisterClass *RC) const {
-  assert (RC == SparcV8::IntRegsRegisterClass
-          && "Can only copy 32-bit registers");
-  BuildMI (MBB, I, V8::ORrr, 2, DestReg).addReg (V8::G0).addReg (SrcReg);
+  if (RC == SparcV8::IntRegsRegisterClass) 
+    BuildMI (MBB, I, V8::ORrr, 2, DestReg).addReg (V8::G0).addReg (SrcReg);
+  else if (RC == SparcV8::FPRegsRegisterClass)
+    BuildMI (MBB, I, V8::FMOVS, 1, DestReg).addReg (SrcReg);
+  else
+    assert (0 && "Can't copy this register");
   return 1;
 }
 
index 93b23162cb939d352597fa4894ab6903e9b602e3..d033b537ffe6823413120f5b5a7bb003950a2875 100644 (file)
@@ -30,10 +30,18 @@ int SparcV8RegisterInfo::storeRegToStackSlot(
   unsigned SrcReg, int FrameIdx,
   const TargetRegisterClass *RC) const
 {
-  assert (RC == SparcV8::IntRegsRegisterClass
-          && "Can only store 32-bit values to stack slots");
   // On the order of operands here: think "[FrameIdx + 0] = SrcReg".
-  BuildMI (MBB, I, V8::ST, 3).addFrameIndex (FrameIdx).addSImm (0).addReg (SrcReg);
+  if (RC == SparcV8::IntRegsRegisterClass) 
+    BuildMI (MBB, I, V8::ST, 3).addFrameIndex (FrameIdx).addSImm (0)
+      .addReg (SrcReg);
+  else if (RC == SparcV8::FPRegsRegisterClass)
+    BuildMI (MBB, I, V8::STFri, 3).addFrameIndex (FrameIdx).addSImm (0)
+      .addReg (SrcReg);
+  else if (RC == SparcV8::DFPRegsRegisterClass)
+    BuildMI (MBB, I, V8::STDFri, 3).addFrameIndex (FrameIdx).addSImm (0)
+      .addReg (SrcReg);
+  else
+    assert (0 && "Can't store this register to stack slot");
   return 1;
 }
 
@@ -43,9 +51,16 @@ int SparcV8RegisterInfo::loadRegFromStackSlot(
   unsigned DestReg, int FrameIdx,
   const TargetRegisterClass *RC) const
 {
-  assert (RC == SparcV8::IntRegsRegisterClass
-          && "Can only load 32-bit registers from stack slots");
-  BuildMI (MBB, I, V8::LD, 2, DestReg).addFrameIndex (FrameIdx).addSImm (0);
+  if (RC == SparcV8::IntRegsRegisterClass) 
+    BuildMI (MBB, I, V8::LD, 2, DestReg).addFrameIndex (FrameIdx).addSImm (0);
+  else if (RC == SparcV8::FPRegsRegisterClass)
+    BuildMI (MBB, I, V8::LDFri, 2, DestReg).addFrameIndex (FrameIdx)
+      .addSImm (0);
+  else if (RC == SparcV8::DFPRegsRegisterClass)
+    BuildMI (MBB, I, V8::LDDFri, 2, DestReg).addFrameIndex (FrameIdx)
+      .addSImm (0);
+  else
+    assert (0 && "Can't load this register from stack slot");
   return 1;
 }
 
@@ -53,9 +68,12 @@ int SparcV8RegisterInfo::copyRegToReg(MachineBasicBlock &MBB,
                                       MachineBasicBlock::iterator I,
                                       unsigned DestReg, unsigned SrcReg,
                                       const TargetRegisterClass *RC) const {
-  assert (RC == SparcV8::IntRegsRegisterClass
-          && "Can only copy 32-bit registers");
-  BuildMI (MBB, I, V8::ORrr, 2, DestReg).addReg (V8::G0).addReg (SrcReg);
+  if (RC == SparcV8::IntRegsRegisterClass) 
+    BuildMI (MBB, I, V8::ORrr, 2, DestReg).addReg (V8::G0).addReg (SrcReg);
+  else if (RC == SparcV8::FPRegsRegisterClass)
+    BuildMI (MBB, I, V8::FMOVS, 1, DestReg).addReg (SrcReg);
+  else
+    assert (0 && "Can't copy this register");
   return 1;
 }