Mercurial > projects > ldc
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"); + } } //////////////////////////////////////////////////////////////////////////////////////////