# HG changeset patch # User Christian Kamm # Date 1223276855 -7200 # Node ID 5812d6fac0f0f5c9ae337a56dc40fb2fea5cce87 # Parent c8fcde3337b0778f4d2be2547340aa15e17154c1 Fix x86_fp80 constants. diff -r c8fcde3337b0 -r 5812d6fac0f0 gen/llvm.h --- 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 diff -r c8fcde3337b0 -r 5812d6fac0f0 gen/tollvm.cpp --- 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"); + } } //////////////////////////////////////////////////////////////////////////////////////////