diff src/pt-jit.h @ 14974:e3cd4c9d7ccc

Generalize builtin specification in JIT and add support for cos and exp * src/ov-builtin.cc (octave_builtin::function): New function. * src/ov-builtin.h (octave_builtin::function): New declaration. * src/pt-jit.cc (gripe_bad_result, octave_jit_call, jit_typeinfo::add_builtin, jit_typeinfo::register_intrinsic, jit_typeinfo::find_builtin, jit_typeinfo::register_generic): New function. (jit_typeinfo::jit_typeinfo): Generalize builtin specification and add support for cos and exp. (jit_typeinfo::create_function): New overload. * src/pt-jit.h (overload::overload, jit_function::add_overload, jit_typeinfo::create_function): New overload. (jit_typeinfo::add_builtin, jit_typeinfo::register_intrinsic, jit_typeinfo::register_generic, jit_typeinfo::find_builtin): New declaration.
author Max Brister <max@2bass.com>
date Wed, 27 Jun 2012 14:14:20 -0500
parents 2960f1b2d6ea
children 2d7c0c86e712
line wrap: on
line diff
--- a/src/pt-jit.h	Tue Jun 26 16:15:30 2012 -0500
+++ b/src/pt-jit.h	Wed Jun 27 14:14:20 2012 -0500
@@ -84,6 +84,7 @@
 }
 
 class octave_base_value;
+class octave_builtin;
 class octave_value;
 class tree;
 class tree_expression;
@@ -329,6 +330,11 @@
       arguments[2] = arg2;
     }
 
+    overload (llvm::Function *f, bool e, jit_type *r,
+              const std::vector<jit_type *>& aarguments)
+      : function (f), can_error (e), result (r), arguments (aarguments)
+    {}
+
     llvm::Function *function;
     bool can_error;
     jit_type *result;
@@ -360,6 +366,13 @@
     add_overload (ol);
   }
 
+  void add_overload (llvm::Function *f, bool e, jit_type *r,
+                     const std::vector<jit_type *>& args)
+  {
+    overload ol (f, e, r, args);
+    add_overload (ol);
+  }
+
   void add_overload (const overload& func,
                      const std::vector<jit_type*>& args);
 
@@ -660,6 +673,9 @@
     return create_function (name, ret, args);
   }
 
+  llvm::Function *create_function (const llvm::Twine& name, jit_type *ret,
+                                   const std::vector<jit_type *>& args);
+
   llvm::Function *create_function (const llvm::Twine& name, llvm::Type *ret,
                                    const std::vector<llvm::Type *>& args);
 
@@ -667,6 +683,30 @@
 
   llvm::Value *do_insert_error_check (void);
 
+  void add_builtin (const std::string& name);
+
+  void register_intrinsic (const std::string& name, size_t id,
+                           jit_type *result, jit_type *arg0)
+  {
+    std::vector<jit_type *> args (1, arg0);
+    register_intrinsic (name, id, result, args);
+  }
+
+  void register_intrinsic (const std::string& name, size_t id, jit_type *result,
+                           const std::vector<jit_type *>& args);
+
+  void register_generic (const std::string& name, jit_type *result,
+                         jit_type *arg0)
+  {
+    std::vector<jit_type *> args (1, arg0);
+    register_generic (name, result, args);
+  }
+
+  void register_generic (const std::string& name, jit_type *result,
+                         const std::vector<jit_type *>& args);
+
+  octave_builtin *find_builtin (const std::string& name);
+
   static jit_typeinfo *instance;
 
   llvm::Module *module;
@@ -683,7 +723,7 @@
   jit_type *string;
   jit_type *boolean;
   jit_type *index;
-  jit_type *sin_type;
+  std::map<std::string, jit_type *> builtins;
 
   std::vector<jit_function> binary_ops;
   jit_function grab_fn;