mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-07-19 21:55:21 +02:00
Changed the handling of variadic intrinsics a bit.
Removed the -fp80 option and made real be 80bit floats on X86, this is what the D spec really says it should be and fixes a bunch of issues. Changed the handling of parameter attributes to a bit more generalized approach. Added sext/zext attributes for byte/short/ubyte/ushort parameters, fixes #60 . Parameter attribs now properly set for intrinsic calls if necessary. Made the tango.math.Math patch less intrusive. Fixed/added some mini tests.
This commit is contained in:
@@ -35,6 +35,25 @@ bool DtoIsReturnedInArg(Type* type)
|
||||
return (t == Tstruct || t == Tarray || t == Tdelegate || t == Tsarray || typ->iscomplex());
|
||||
}
|
||||
|
||||
unsigned DtoShouldExtend(Type* type)
|
||||
{
|
||||
type = type->toBasetype();
|
||||
if (type->isintegral())
|
||||
{
|
||||
switch(type->ty)
|
||||
{
|
||||
case Tint8:
|
||||
case Tint16:
|
||||
return llvm::ParamAttr::SExt;
|
||||
|
||||
case Tuns8:
|
||||
case Tuns16:
|
||||
return llvm::ParamAttr::ZExt;
|
||||
}
|
||||
}
|
||||
return llvm::ParamAttr::None;
|
||||
}
|
||||
|
||||
Type* DtoDType(Type* t)
|
||||
{
|
||||
if (t->ty == Ttypedef) {
|
||||
@@ -79,7 +98,10 @@ const LLType* DtoType(Type* t)
|
||||
return LLType::DoubleTy;
|
||||
case Tfloat80:
|
||||
case Timaginary80:
|
||||
return (global.params.useFP80) ? LLType::X86_FP80Ty : LLType::DoubleTy;
|
||||
if (global.params.cpu == ARCHx86)
|
||||
return LLType::X86_FP80Ty;
|
||||
else
|
||||
return LLType::DoubleTy;
|
||||
|
||||
// complex
|
||||
case Tcomplex32:
|
||||
@@ -485,11 +507,9 @@ llvm::ConstantInt* DtoConstUbyte(unsigned char i)
|
||||
|
||||
llvm::ConstantFP* DtoConstFP(Type* t, long double value)
|
||||
{
|
||||
TY ty = DtoDType(t)->ty;
|
||||
if (ty == Tfloat32 || ty == Timaginary32)
|
||||
return llvm::ConstantFP::get(llvm::APFloat(float(value)));
|
||||
else if (ty == Tfloat64 || ty == Timaginary64 || ty == Tfloat80 || ty == Timaginary80)
|
||||
return llvm::ConstantFP::get(llvm::APFloat(double(value)));
|
||||
const LLType* llty = DtoType(t);
|
||||
assert(llty->isFloatingPoint());
|
||||
return LLConstantFP::get(llty, value);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user