Add LLVM IR dialect hooks for FP128 and X86_FP80 types
authorEric Schweitz <eric.schweitz@pgroup.com>
Sat, 12 Oct 2019 01:35:02 +0000 (18:35 -0700)
committerA. Unique TensorFlower <gardener@tensorflow.org>
Sat, 12 Oct 2019 01:35:33 +0000 (18:35 -0700)
Closes tensorflow/mlir#184

COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/184 from schweitzpgi:more-float-types ca27d00510a86ffc9c79c65fb3a0193b5ea097a0
PiperOrigin-RevId: 274288813

mlir/include/mlir/Dialect/LLVMIR/LLVMDialect.h
mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
mlir/test/Dialect/LLVMIR/roundtrip.mlir

index e8f3025..e681016 100644 (file)
@@ -95,6 +95,8 @@ public:
   static LLVMType getDoubleTy(LLVMDialect *dialect);
   static LLVMType getFloatTy(LLVMDialect *dialect);
   static LLVMType getHalfTy(LLVMDialect *dialect);
+  static LLVMType getFP128Ty(LLVMDialect *dialect);
+  static LLVMType getX86_FP80Ty(LLVMDialect *dialect);
 
   /// Utilities used to generate integer types.
   static LLVMType getIntNTy(LLVMDialect *dialect, unsigned numBits);
index 720e7d3..5862efe 100644 (file)
@@ -1182,7 +1182,7 @@ struct LLVMDialectImpl {
   /// A set of LLVMTypes that are cached on construction to avoid any lookups or
   /// locking.
   LLVMType int1Ty, int8Ty, int16Ty, int32Ty, int64Ty, int128Ty;
-  LLVMType doubleTy, floatTy, halfTy;
+  LLVMType doubleTy, floatTy, halfTy, fp128Ty, x86_fp80Ty;
   LLVMType voidTy;
 
   /// A smart mutex to lock access to the llvm context. Unlike MLIR, LLVM is not
@@ -1218,6 +1218,9 @@ LLVMDialect::LLVMDialect(MLIRContext *context)
   impl->doubleTy = LLVMType::get(context, llvm::Type::getDoubleTy(llvmContext));
   impl->floatTy = LLVMType::get(context, llvm::Type::getFloatTy(llvmContext));
   impl->halfTy = LLVMType::get(context, llvm::Type::getHalfTy(llvmContext));
+  impl->fp128Ty = LLVMType::get(context, llvm::Type::getFP128Ty(llvmContext));
+  impl->x86_fp80Ty =
+      LLVMType::get(context, llvm::Type::getX86_FP80Ty(llvmContext));
   /// Other Types.
   impl->voidTy = LLVMType::get(context, llvm::Type::getVoidTy(llvmContext));
 }
@@ -1367,6 +1370,12 @@ LLVMType LLVMType::getFloatTy(LLVMDialect *dialect) {
 LLVMType LLVMType::getHalfTy(LLVMDialect *dialect) {
   return dialect->impl->halfTy;
 }
+LLVMType LLVMType::getFP128Ty(LLVMDialect *dialect) {
+  return dialect->impl->fp128Ty;
+}
+LLVMType LLVMType::getX86_FP80Ty(LLVMDialect *dialect) {
+  return dialect->impl->x86_fp80Ty;
+}
 
 /// Utilities used to generate integer types.
 LLVMType LLVMType::getIntNTy(LLVMDialect *dialect, unsigned numBits) {
index d37d715..62e2f64 100644 (file)
@@ -87,6 +87,13 @@ func @ops(%arg0 : !llvm.i32, %arg1 : !llvm.float) {
   %25 = llvm.inttoptr %arg0 : !llvm.i32 to !llvm<"i32*">
   %26 = llvm.ptrtoint %25 : !llvm<"i32*"> to !llvm.i32
 
+// Extended and Quad floating point
+//
+// CHECK:       %27 = llvm.fpext %arg1 : !llvm.float to !llvm<"x86_fp80">
+// CHECK-NEXT:  %28 = llvm.fpext %arg1 : !llvm.float to !llvm.fp128
+  %27 = llvm.fpext %arg1 : !llvm.float to !llvm<"x86_fp80">
+  %28 = llvm.fpext %arg1 : !llvm.float to !llvm.fp128
+
 // CHECK:  llvm.return
   llvm.return
 }