[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