[llvm-commits] [llvm-gcc-4.2] r99069 - in /llvm-gcc-4.2/trunk/gcc: llvm-convert.cpp llvm-types.cpp real.h
Anton Korobeynikov
asl at math.spbu.ru
Sat Mar 20 12:21:06 PDT 2010
Author: asl
Date: Sat Mar 20 14:21:05 2010
New Revision: 99069
URL: http://llvm.org/viewvc/llvm-project?rev=99069&view=rev
Log:
Add gimple tree => LLVM IR lowering for HF type.
Modified:
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
llvm-gcc-4.2/trunk/gcc/llvm-types.cpp
llvm-gcc-4.2/trunk/gcc/real.h
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=99069&r1=99068&r2=99069&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Sat Mar 20 14:21:05 2010
@@ -7417,7 +7417,8 @@
Constant *TreeConstantToLLVM::ConvertREAL_CST(tree exp) {
const Type *Ty = ConvertType(TREE_TYPE(exp));
- assert(Ty->isFloatingPointTy() && "Integer REAL_CST?");
+ assert((Ty->isFloatingPointTy() ||
+ Ty->isIntegerTy(16)) && "Integer REAL_CST?");
long RealArr[2];
union {
int UArr[2];
@@ -7459,8 +7460,7 @@
((uint64_t)((uint32_t)RealArr[1]) << 32);
UArr[1] = (uint16_t)RealArr[2];
return ConstantFP::get(Context, APFloat(APInt(80, 2, UArr)));
- } else if (Ty->isPPC_FP128Ty() ||
- Ty->isFP128Ty()) {
+ } else if (Ty->isPPC_FP128Ty() || Ty->isFP128Ty()) {
long RealArr[4];
uint64_t UArr[2];
REAL_VALUE_TO_TARGET_LONG_DOUBLE(TREE_REAL_CST(exp), RealArr);
@@ -7472,6 +7472,10 @@
return ConstantFP::get(Context,
APFloat(APInt(128, 2, UArr),
/*isIEEE*/ Ty->isFP128Ty()));
+ } else if (Ty->isIntegerTy(16)) {
+ long RealVal;
+ REAL_VALUE_TO_TARGET_HALF(TREE_REAL_CST(exp), RealVal);
+ return ConstantInt::get(Context, APInt(16, RealVal));
}
assert(0 && "Floating point type not handled yet");
return 0; // outwit compiler warning
Modified: llvm-gcc-4.2/trunk/gcc/llvm-types.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-types.cpp?rev=99069&r1=99068&r2=99069&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-types.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Sat Mar 20 14:21:05 2010
@@ -754,7 +754,9 @@
default:
fprintf(stderr, "Unknown FP type!\n");
debug_tree(type);
- abort();
+ abort();
+ // Half precision FP is a storage only format, use i16 for it.
+ case 16: return SET_TYPE_LLVM(type, Type::getInt16Ty(Context));
case 32: return SET_TYPE_LLVM(type, Type::getFloatTy(Context));
case 64: return SET_TYPE_LLVM(type, Type::getDoubleTy(Context));
case 80: return SET_TYPE_LLVM(type, Type::getX86_FP80Ty(Context));
Modified: llvm-gcc-4.2/trunk/gcc/real.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/real.h?rev=99069&r1=99068&r2=99069&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/real.h (original)
+++ llvm-gcc-4.2/trunk/gcc/real.h Sat Mar 20 14:21:05 2010
@@ -313,6 +313,12 @@
#define REAL_VALUE_TO_TARGET_SINGLE(IN, OUT) \
((OUT) = real_to_target (NULL, &(IN), mode_for_size (32, MODE_FLOAT, 0)))
+/* LLVM LOCAL begin */
+/* IN is a REAL_VALUE_TYPE. OUT is a long. */
+#define REAL_VALUE_TO_TARGET_HALF(IN, OUT) \
+ ((OUT) = real_to_target (NULL, &(IN), mode_for_size (16, MODE_FLOAT, 0)))
+/* LLVM LOCAL end */
+
#define REAL_VALUE_FROM_INT(r, lo, hi, mode) \
real_from_integer (&(r), mode, lo, hi, 0)
More information about the llvm-commits
mailing list