[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