<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>
// libm related functions.
isnan, // Return true if fp argument is a NAN.
+ isunordered, // Return true if fp arguments are unordered
// Input/Output intrinsics.
readport,
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() &&
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;
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() &&
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,
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;
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
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
}