From 15e5f0e9029462fd2b8bef6d5afeaabe070afbfc Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 6 Oct 2008 09:07:35 +0200 Subject: [PATCH] Fix x86_fp80 constants. --- gen/llvm.h | 3 ++- gen/tollvm.cpp | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/gen/llvm.h b/gen/llvm.h index fd879076..09cfdd86 100644 --- a/gen/llvm.h +++ b/gen/llvm.h @@ -47,6 +47,7 @@ using llvm::IRBuilder; #define LLSmallVector llvm::SmallVector -#define APFloat llvm::APFloat +using llvm::APFloat; +using llvm::APInt; #endif // GEN_LLVM_H diff --git a/gen/tollvm.cpp b/gen/tollvm.cpp index 5f4df1ca..6378f5bd 100644 --- a/gen/tollvm.cpp +++ b/gen/tollvm.cpp @@ -529,7 +529,23 @@ llvm::ConstantFP* DtoConstFP(Type* t, long double value) { 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"); + } } //////////////////////////////////////////////////////////////////////////////////////////