changeset 653:5812d6fac0f0

Fix x86_fp80 constants.
author Christian Kamm <kamm incasoftware de>
date Mon, 06 Oct 2008 09:07:35 +0200
parents c8fcde3337b0
children 961221d5a49c
files gen/llvm.h gen/tollvm.cpp
diffstat 2 files changed, 19 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/gen/llvm.h	Sun Oct 05 22:26:25 2008 +0200
+++ b/gen/llvm.h	Mon Oct 06 09:07:35 2008 +0200
@@ -47,6 +47,7 @@
 
 #define LLSmallVector llvm::SmallVector
 
-#define APFloat llvm::APFloat
+using llvm::APFloat;
+using llvm::APInt;
 
 #endif // GEN_LLVM_H
--- a/gen/tollvm.cpp	Sun Oct 05 22:26:25 2008 +0200
+++ b/gen/tollvm.cpp	Mon Oct 06 09:07:35 2008 +0200
@@ -529,7 +529,23 @@
 {
     const LLType* llty = DtoType(t);
     assert(llty->isFloatingPoint());
-    return LLConstantFP::get(llty, value);
+
+    if(llty == LLType::FloatTy || llty == LLType::DoubleTy)
+        return LLConstantFP::get(llty, value);
+    else if(llty == LLType::X86_FP80Ty) {
+        uint64_t bits[] = {0, 0};
+        bits[1] = *(uint16_t*)&value;
+        bits[0] = *((uint16_t*)&value + 4);
+        bits[0] <<= 16;
+        bits[0] += *((uint16_t*)&value + 3);
+        bits[0] <<= 16;
+        bits[0] += *((uint16_t*)&value + 2);
+        bits[0] <<= 16;
+        bits[0] += *((uint16_t*)&value + 1);
+        return LLConstantFP::get(APFloat(APInt(80, 2, bits)));
+    } else {
+        assert(0 && "Unknown floating point type encountered");
+    }
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////