From 495a0974f4943019da8fdc1df48ca3f0272646c8 Mon Sep 17 00:00:00 2001 From: Brian Gaeke Date: Thu, 24 Jun 2004 21:22:08 +0000 Subject: [PATCH] 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 --- lib/Target/Sparc/InstSelectSimple.cpp | 37 +++++++++++++++++------- lib/Target/Sparc/SparcV8ISelSimple.cpp | 37 +++++++++++++++++------- lib/Target/SparcV8/InstSelectSimple.cpp | 37 +++++++++++++++++------- lib/Target/SparcV8/SparcV8ISelSimple.cpp | 37 +++++++++++++++++------- 4 files changed, 108 insertions(+), 40 deletions(-) diff --git a/lib/Target/Sparc/InstSelectSimple.cpp b/lib/Target/Sparc/InstSelectSimple.cpp index bbfe3cb65f5..12045197b7c 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"; diff --git a/lib/Target/Sparc/SparcV8ISelSimple.cpp b/lib/Target/Sparc/SparcV8ISelSimple.cpp index bbfe3cb65f5..12045197b7c 100644 --- a/lib/Target/Sparc/SparcV8ISelSimple.cpp +++ b/lib/Target/Sparc/SparcV8ISelSimple.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"; diff --git a/lib/Target/SparcV8/InstSelectSimple.cpp b/lib/Target/SparcV8/InstSelectSimple.cpp index bbfe3cb65f5..12045197b7c 100644 --- a/lib/Target/SparcV8/InstSelectSimple.cpp +++ b/lib/Target/SparcV8/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"; diff --git a/lib/Target/SparcV8/SparcV8ISelSimple.cpp b/lib/Target/SparcV8/SparcV8ISelSimple.cpp index bbfe3cb65f5..12045197b7c 100644 --- a/lib/Target/SparcV8/SparcV8ISelSimple.cpp +++ b/lib/Target/SparcV8/SparcV8ISelSimple.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";