mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-17 21:29:20 +00:00
Add the isunordered intrinsic.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14159 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
06a3db0b0f
commit
9685372062
@ -125,6 +125,7 @@
|
|||||||
<li><a href="#i_memmove">'<tt>llvm.memmove</tt>' Intrinsic</a></li>
|
<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_memset">'<tt>llvm.memset</tt>' Intrinsic</a></li>
|
||||||
<li><a href="#i_isnan">'<tt>llvm.isnan</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>
|
</ol>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#int_debugger">Debugger intrinsics</a></li>
|
<li><a href="#int_debugger">Debugger intrinsics</a></li>
|
||||||
|
@ -61,6 +61,7 @@ namespace Intrinsic {
|
|||||||
|
|
||||||
// libm related functions.
|
// libm related functions.
|
||||||
isnan, // Return true if fp argument is a NAN.
|
isnan, // Return true if fp argument is a NAN.
|
||||||
|
isunordered, // Return true if fp arguments are unordered
|
||||||
|
|
||||||
// Input/Output intrinsics.
|
// Input/Output intrinsics.
|
||||||
readport,
|
readport,
|
||||||
|
@ -208,6 +208,12 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
|
|||||||
Type::BoolTy, isnanFCache);
|
Type::BoolTy, isnanFCache);
|
||||||
break;
|
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() &&
|
assert(CI->use_empty() &&
|
||||||
|
@ -224,6 +224,7 @@ unsigned Function::getIntrinsicID() const {
|
|||||||
break;
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
if (getName() == "llvm.isnan") return Intrinsic::isnan;
|
if (getName() == "llvm.isnan") return Intrinsic::isnan;
|
||||||
|
if (getName() == "llvm.isunordered") return Intrinsic::isunordered;
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
if (getName() == "llvm.longjmp") return Intrinsic::longjmp;
|
if (getName() == "llvm.longjmp") return Intrinsic::longjmp;
|
||||||
|
@ -208,6 +208,12 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
|
|||||||
Type::BoolTy, isnanFCache);
|
Type::BoolTy, isnanFCache);
|
||||||
break;
|
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() &&
|
assert(CI->use_empty() &&
|
||||||
|
@ -688,7 +688,7 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case Intrinsic::isnan:
|
case Intrinsic::isnan:
|
||||||
Assert1(FT->getNumParams() == 1 && FT->getParamType(0)->isFloatingPoint(),
|
Assert1(FT->getNumParams() == 1 && FT->getParamType(0)->isFloatingPoint(),
|
||||||
"Illegal prototype for llvm.isnan", IF);
|
"Illegal prototype for llvm.isnan", IF);
|
||||||
Assert1(FT->getReturnType() == Type::BoolTy,
|
Assert1(FT->getReturnType() == Type::BoolTy,
|
||||||
@ -696,6 +696,16 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
|
|||||||
NumArgs = 1;
|
NumArgs = 1;
|
||||||
break;
|
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::setjmp: NumArgs = 1; break;
|
||||||
case Intrinsic::longjmp: NumArgs = 2; break;
|
case Intrinsic::longjmp: NumArgs = 2; break;
|
||||||
case Intrinsic::sigsetjmp: NumArgs = 2; break;
|
case Intrinsic::sigsetjmp: NumArgs = 2; break;
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
declare bool %llvm.isnan(float)
|
declare bool %llvm.isnan(float)
|
||||||
declare bool %llvm.isnan(double)
|
declare bool %llvm.isnan(double)
|
||||||
|
|
||||||
|
declare bool %llvm.isunordered(float, float)
|
||||||
|
declare bool %llvm.isunordered(double, double)
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
; Test llvm intrinsics
|
; Test llvm intrinsics
|
||||||
@ -9,5 +12,7 @@ implementation
|
|||||||
void %libm() {
|
void %libm() {
|
||||||
call bool %llvm.isnan(float 0.0)
|
call bool %llvm.isnan(float 0.0)
|
||||||
call bool %llvm.isnan(double 10.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
|
ret void
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user