Update DtoConstFP() to be correct after LLVM r67562, which changed the way the

APFloat constructor expects its i80 APInts to be formatted. (They're now
actually consistent with the x87 format)
This commit is contained in:
Frits van Bommel
2009-03-24 15:24:59 +01:00
parent a0d93e699a
commit 479b97ca87

View File

@@ -20,6 +20,7 @@
#include "gen/complex.h"
#include "gen/llvmhelpers.h"
#include "gen/linkage.h"
#include "gen/llvm-version.h"
bool DtoIsPassedByRef(Type* type)
{
@@ -521,8 +522,16 @@ llvm::ConstantFP* DtoConstFP(Type* t, long double value)
return LLConstantFP::get(llty, value);
else if(llty == LLType::X86_FP80Ty) {
uint64_t bits[] = {0, 0};
#if LLVM_REV < 67562
// Prior to r67562, the i80 APInt format expected by the APFloat
// constructor was different than the memory layout on the actual
// processor.
bits[1] = *(uint16_t*)&value;
bits[0] = *(uint64_t*)((uint16_t*)&value + 1);
#else
bits[0] = *(uint64_t*)&value;
bits[1] = *(uint16_t*)((uint64_t*)&value + 1);
#endif
return LLConstantFP::get(APFloat(APInt(80, 2, bits)));
} else {
assert(0 && "Unknown floating point type encountered");