]> granicus.if.org Git - clang/commitdiff
Add __builtin_powi[fl] support
authorDaniel Dunbar <daniel@zuster.org>
Mon, 21 Jul 2008 18:44:41 +0000 (18:44 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Mon, 21 Jul 2008 18:44:41 +0000 (18:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53866 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Builtins.def
lib/CodeGen/CGBuiltin.cpp
test/CodeGen/builtins-powi.c [new file with mode: 0644]

index c3113a9148b0802486065454c638684e65b8a19b..7443583c4a5e0cb14546a8bed1c3181b43587a54 100644 (file)
@@ -70,6 +70,9 @@ BUILTIN(__builtin_fabsl, "LdLd", "ncF")
 BUILTIN(__builtin_copysign, "ddd", "ncF")
 BUILTIN(__builtin_copysignf, "fff", "ncF")
 BUILTIN(__builtin_copysignl, "LdLdLd", "ncF")
+BUILTIN(__builtin_powi , "ddi"  , "nc")
+BUILTIN(__builtin_powif, "ffi"  , "nc")
+BUILTIN(__builtin_powil, "LdLdi", "nc")
 
 // FP Comparisons.
 BUILTIN(__builtin_isgreater     , "i.", "nc")
index d186a7161971d6609f2978062f8f685c0045e9a7..a85f139a0d58a6b3081ac59f8d4a7faa3eb416fc 100644 (file)
@@ -192,6 +192,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E) {
   }
 
   case Builtin::BI__builtin_expect:
+    // FIXME: pass expect through to LLVM
     return RValue::get(EmitScalarExpr(E->getArg(0)));
   case Builtin::BI__builtin_bswap32:
   case Builtin::BI__builtin_bswap64: {
@@ -226,6 +227,19 @@ RValue CodeGenFunction::EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E) {
     // Otherwise, call libm 'nan'.
     break;
   }
+  case Builtin::BI__builtin_powi:
+  case Builtin::BI__builtin_powif:
+  case Builtin::BI__builtin_powil: {
+    Value *Base = EmitScalarExpr(E->getArg(0));
+    Value *Exponent = EmitScalarExpr(E->getArg(1));
+    
+    const llvm::Type *ArgType = Base->getType();
+    Value *F = CGM.getIntrinsic(Intrinsic::powi, &ArgType, 1);
+    
+    const llvm::Type *ResultType = ConvertType(E->getType());
+    return RValue::get(Builder.CreateCall2(F, Base, Exponent, "tmp"));
+  }
+
   case Builtin::BI__builtin_isgreater:
   case Builtin::BI__builtin_isgreaterequal:
   case Builtin::BI__builtin_isless:
diff --git a/test/CodeGen/builtins-powi.c b/test/CodeGen/builtins-powi.c
new file mode 100644 (file)
index 0000000..6d82f8a
--- /dev/null
@@ -0,0 +1,29 @@
+// RUN: clang -emit-llvm -o - %s > %t
+// RUN: ! grep "__builtin" %t
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+void test(long double a, int b) {
+  printf("%Lf**%d: %08x %08x %016Lx\n", 
+         a, b,
+         __builtin_powi(a, b),
+         __builtin_powif(a, b),
+         __builtin_powil(a, b)
+         );
+}
+
+int main() {
+  int i;
+
+  test(-1,-1LL);
+  test(0,0);
+  test(1,1);
+
+  for (i=0; i<3; i++) {
+    test(random(), i);
+  }
+
+  return 0;
+}