mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-11 18:33:14 +01:00
Fix x86_fp80 constants.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user