diff gen/tollvm.cpp @ 653:5812d6fac0f0

Fix x86_fp80 constants.
author Christian Kamm <kamm incasoftware de>
date Mon, 06 Oct 2008 09:07:35 +0200
parents aa6a0b7968f7
children 99f32e967746
line wrap: on
line diff
--- 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");
+    }
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////