Add the isunordered intrinsic.
authorAlkis Evlogimenos <alkis@evlogimenos.com>
Sat, 12 Jun 2004 19:19:14 +0000 (19:19 +0000)
committerAlkis Evlogimenos <alkis@evlogimenos.com>
Sat, 12 Jun 2004 19:19:14 +0000 (19:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14159 91177308-0d34-0410-b5e6-96231b3b80d8

docs/LangRef.html
include/llvm/Intrinsics.h
lib/CodeGen/IntrinsicLowering.cpp
lib/VMCore/Function.cpp
lib/VMCore/IntrinsicLowering.cpp
lib/VMCore/Verifier.cpp
test/Feature/intrinsics.ll

index 14c0eb520ee7c649f5fdf99c5422e5441df23698..a6a5fab506ce247e61e5d75fd5874b1cbde81839 100644 (file)
           <li><a href="#i_memmove">'<tt>llvm.memmove</tt>' Intrinsic</a></li>
           <li><a href="#i_memset">'<tt>llvm.memset</tt>' Intrinsic</a></li>
           <li><a href="#i_isnan">'<tt>llvm.isnan</tt>' Intrinsic</a></li>
+          <li><a href="#i_isunordered">'<tt>llvm.isunordered</tt>' Intrinsic</a></li>
         </ol>
       </li>
       <li><a href="#int_debugger">Debugger intrinsics</a></li>
index 8cca2cd32669e13e2f67e2c48e92dce6d7eb59b7..85e7802c77caf96ded45be4b959ba7e8b4e5390c 100644 (file)
@@ -61,6 +61,7 @@ namespace Intrinsic {
 
     // libm related functions.
     isnan,          // Return true if fp argument is a NAN.
+    isunordered,    // Return true if fp arguments are unordered
 
     // Input/Output intrinsics.
     readport,
index b6ebe0991b3fcc8b2552cb3f8584aeb322706aa5..a4ec31d4196dccce493cc2d995434b9a642dc611 100644 (file)
@@ -208,6 +208,12 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
                     Type::BoolTy, isnanFCache);
     break;
   }
+  case Intrinsic::isunordered: {
+    static Function *isunorderedFCache = 0;
+    ReplaceCallWith("isunordered", CI, CI->op_begin()+1, CI->op_end(),
+                    Type::BoolTy, isunorderedFCache);
+    break;
+  }
   }
   
   assert(CI->use_empty() &&
index a0f86d55e54d72e88b860f8c0c3932911e94ba7c..4f6c997255dd62fbff360d38fc149cb88fc2bf20 100644 (file)
@@ -224,6 +224,7 @@ unsigned Function::getIntrinsicID() const {
     break;
   case 'i':
     if (getName() == "llvm.isnan") return Intrinsic::isnan;
+    if (getName() == "llvm.isunordered") return Intrinsic::isunordered;
     break;
   case 'l':
     if (getName() == "llvm.longjmp")  return Intrinsic::longjmp;
index b6ebe0991b3fcc8b2552cb3f8584aeb322706aa5..a4ec31d4196dccce493cc2d995434b9a642dc611 100644 (file)
@@ -208,6 +208,12 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
                     Type::BoolTy, isnanFCache);
     break;
   }
+  case Intrinsic::isunordered: {
+    static Function *isunorderedFCache = 0;
+    ReplaceCallWith("isunordered", CI, CI->op_begin()+1, CI->op_end(),
+                    Type::BoolTy, isunorderedFCache);
+    break;
+  }
   }
   
   assert(CI->use_empty() &&
index 244d3464903c5a8748fc4f43b169531effd81bab..d221de9e65a94c1facce659ab5ebbbbec48d6b40 100644 (file)
@@ -688,7 +688,7 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
     break;
   }
 
-  case Intrinsic::isnan: 
+  case Intrinsic::isnan:
     Assert1(FT->getNumParams() == 1 && FT->getParamType(0)->isFloatingPoint(),
             "Illegal prototype for llvm.isnan", IF);
     Assert1(FT->getReturnType() == Type::BoolTy,
@@ -696,6 +696,16 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
     NumArgs = 1;
     break;
 
+  case Intrinsic::isunordered:
+    Assert1(FT->getNumParams() == 2 &&
+            FT->getParamType(0)->isFloatingPoint() &&
+            FT->getParamType(1)->isFloatingPoint(),
+            "Illegal prototype for llvm.isunordered", IF);
+    Assert1(FT->getReturnType() == Type::BoolTy,
+            "Illegal prototype for llvm.isunordered", IF);
+    NumArgs = 2;
+    break;
+
   case Intrinsic::setjmp:          NumArgs = 1; break;
   case Intrinsic::longjmp:         NumArgs = 2; break;
   case Intrinsic::sigsetjmp:       NumArgs = 2; break;
index 53a78b5417c4c495ec5927f3e3c00c6444d88579..51f738c9efd58e94e291df77d2ef61677f8a5c54 100644 (file)
@@ -2,6 +2,9 @@
 declare bool %llvm.isnan(float)
 declare bool %llvm.isnan(double)
 
+declare bool %llvm.isunordered(float, float)
+declare bool %llvm.isunordered(double, double)
+
 implementation
 
 ; Test llvm intrinsics
@@ -9,5 +12,7 @@ implementation
 void %libm() {
        call bool %llvm.isnan(float 0.0)
        call bool %llvm.isnan(double 10.0)
+        call bool %llvm.isunordered(float 0.0, float 1.0)
+        call bool %llvm.isunordered(double 0.0, double 1.0)
        ret void
 }