mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-16 21:03:14 +01:00
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:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user