aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/Sparc/InstSelectSimple.cpp
diff options
context:
space:
mode:
authorBrian Gaeke <gaeke@uiuc.edu>2004-06-24 21:22:08 +0000
committerBrian Gaeke <gaeke@uiuc.edu>2004-06-24 21:22:08 +0000
commit495a0974f4943019da8fdc1df48ca3f0272646c8 (patch)
tree53d2ad184cf3e2fe8ff75b79990049eb3f8603b0 /lib/Target/Sparc/InstSelectSimple.cpp
parentfd9d1b37148b558f185902f11e2ac600d9a47a12 (diff)
Support cast float to float, cast double to float, and cast float to double.
(It's not yet clear how to copy doubles from register to register.) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14371 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/Sparc/InstSelectSimple.cpp')
-rw-r--r--lib/Target/Sparc/InstSelectSimple.cpp37
1 files changed, 27 insertions, 10 deletions
diff --git a/lib/Target/Sparc/InstSelectSimple.cpp b/lib/Target/Sparc/InstSelectSimple.cpp
index bbfe3cb65f..12045197b7 100644
--- a/lib/Target/Sparc/InstSelectSimple.cpp
+++ b/lib/Target/Sparc/InstSelectSimple.cpp
@@ -517,16 +517,33 @@ void V8ISel::emitCastOperation(MachineBasicBlock *BB,
}
}
} else {
- if (oldTyClass < cLong && newTyClass == cFloat) {
- // cast int to float. Store it to a stack slot and then load
- // it using ldf into a floating point register. then do fitos.
- std::cerr << "Casts to float still unsupported: SrcTy = "
- << *SrcTy << ", DestTy = " << *DestTy << "\n";
- abort ();
- } else if (oldTyClass < cLong && newTyClass == cDouble) {
- std::cerr << "Casts to double still unsupported: SrcTy = "
- << *SrcTy << ", DestTy = " << *DestTy << "\n";
- abort ();
+ if (newTyClass == cFloat) {
+ switch (oldTyClass) {
+ case cFloat:
+ BuildMI (*BB, IP, V8::FMOVS, 1, DestReg).addReg (SrcReg);
+ break;
+ case cDouble:
+ BuildMI (*BB, IP, V8::FDTOS, 1, DestReg).addReg (SrcReg);
+ break;
+ default:
+ // cast int to float. Store it to a stack slot and then load
+ // it using ldf into a floating point register. then do fitos.
+ std::cerr << "Casts to float still unsupported: SrcTy = "
+ << *SrcTy << ", DestTy = " << *DestTy << "\n";
+ abort ();
+ break;
+ }
+ } else if (newTyClass == cDouble) {
+ switch (oldTyClass) {
+ case cFloat:
+ BuildMI (*BB, IP, V8::FSTOD, 1, DestReg).addReg (SrcReg);
+ break;
+ default:
+ std::cerr << "Casts to double still unsupported: SrcTy = "
+ << *SrcTy << ", DestTy = " << *DestTy << "\n";
+ abort ();
+ break;
+ }
} else {
std::cerr << "Cast still unsupported: SrcTy = "
<< *SrcTy << ", DestTy = " << *DestTy << "\n";