[dragonegg] r185223 - Implement __builtin_signbit.
Peter Collingbourne
peter at pcc.me.uk
Fri Jun 28 14:40:51 PDT 2013
Author: pcc
Date: Fri Jun 28 16:40:51 2013
New Revision: 185223
URL: http://llvm.org/viewvc/llvm-project?rev=185223&view=rev
Log:
Implement __builtin_signbit.
Added:
dragonegg/trunk/test/validator/c/signbit.c
Modified:
dragonegg/trunk/include/dragonegg/Internals.h
dragonegg/trunk/src/Convert.cpp
Modified: dragonegg/trunk/include/dragonegg/Internals.h
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/include/dragonegg/Internals.h?rev=185223&r1=185222&r2=185223&view=diff
==============================================================================
--- dragonegg/trunk/include/dragonegg/Internals.h (original)
+++ dragonegg/trunk/include/dragonegg/Internals.h Fri Jun 28 16:40:51 2013
@@ -637,6 +637,7 @@ private:
llvm::Value *EmitBuiltinLFLOOR(gimple_statement_d *stmt);
llvm::Value *EmitBuiltinLROUND(gimple_statement_d *stmt);
llvm::Value *EmitBuiltinCEXPI(gimple_statement_d *stmt);
+ llvm::Value *EmitBuiltinSIGNBIT(gimple_statement_d *stmt);
bool EmitBuiltinAdjustTrampoline(gimple_statement_d *stmt,
llvm::Value *&Result);
Modified: dragonegg/trunk/src/Convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/Convert.cpp?rev=185223&r1=185222&r2=185223&view=diff
==============================================================================
--- dragonegg/trunk/src/Convert.cpp (original)
+++ dragonegg/trunk/src/Convert.cpp Fri Jun 28 16:40:51 2013
@@ -4607,6 +4607,11 @@ bool TreeToLLVM::EmitBuiltinCall(gimple
//TODO Result = Builder.CreateBitCast(Result, ConvertType(gimple_call_return_type(stmt)));
//TODO return true;
//TODO }
+ case BUILT_IN_SIGNBIT:
+ case BUILT_IN_SIGNBITF:
+ case BUILT_IN_SIGNBITL:
+ Result = EmitBuiltinSIGNBIT(stmt);
+ return true;
case BUILT_IN_TRAP:
Builder.CreateCall(Intrinsic::getDeclaration(TheModule, Intrinsic::trap));
// Emit an explicit unreachable instruction.
@@ -5405,6 +5410,18 @@ bool TreeToLLVM::EmitBuiltinCall(gimple
}
}
+ Value *TreeToLLVM::EmitBuiltinSIGNBIT(gimple stmt) {
+ Value *Arg = EmitRegister(gimple_call_arg(stmt, 0));
+ Type *ArgTy = Arg->getType();
+ unsigned ArgWidth = ArgTy->getPrimitiveSizeInBits();
+ Type *ArgIntTy = IntegerType::get(Context, ArgWidth);
+ Value *BCArg = Builder.CreateBitCast(Arg, ArgIntTy);
+ Value *ZeroCmp = Constant::getNullValue(ArgIntTy);
+ Value *Result = Builder.CreateICmpSLT(BCArg, ZeroCmp);
+ return Builder.CreateZExt(Result,
+ ConvertType(gimple_call_return_type(stmt)));
+ }
+
bool TreeToLLVM::EmitBuiltinConstantP(gimple stmt, Value * &Result) {
Result =
Constant::getNullValue(ConvertType(gimple_call_return_type(stmt)));
Added: dragonegg/trunk/test/validator/c/signbit.c
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/test/validator/c/signbit.c?rev=185223&view=auto
==============================================================================
--- dragonegg/trunk/test/validator/c/signbit.c (added)
+++ dragonegg/trunk/test/validator/c/signbit.c Fri Jun 28 16:40:51 2013
@@ -0,0 +1,17 @@
+// RUN: %dragonegg -S -o - %s | FileCheck %s
+
+int sbf(float x) {
+ // CHECK: @sbf
+ // CHECK: bitcast float {{.*}} to i32
+ // CHECK: icmp slt i32 {{.*}}, 0
+ // CHECK: zext i1 {{.*}} to i32
+ return __builtin_signbitf(x);
+}
+
+int sbd(double x) {
+ // CHECK: @sbd
+ // CHECK: bitcast double {{.*}} to i64
+ // CHECK: icmp slt i64 {{.*}}, 0
+ // CHECK: zext i1 {{.*}} to i32
+ return __builtin_signbit(x);
+}
More information about the llvm-commits
mailing list