Mercurial > octave-nkf
diff libinterp/interp-core/jit-typeinfo.cc @ 15337:3f43e9d6d86e
JIT compile anonymous functions
* jit-ir.h (jit_block::front, jit_block::back): New function.
(jit_call::jit_call): New overloads.
(jit_return): New class.
* jit-typeinfo.cc (octave_jit_create_undef): New function.
(jit_operation::to_idx): Correctly handle empty type vector.
(jit_typeinfo::jit_typeinfo): Add destroy_fn and initialize create_undef.
* jit-typeinfo.h (jit_typeinfo::get_any_ptr, jit_typeinfo::destroy,
jit_typeinfo::create_undef): New function.
* pt-jit.cc (jit_convert::jit_convert): Add overload and refactor.
(jit_convert::initialize, jit_convert_llvm::convert_loop,
jit_convert_llvm::convert_function, tree_jit::do_execute,
jit_function_info::jit_function_info, jit_function_info::execute,
jit_function_info::match): New function.
(jit_convert::get_variable): Support function variable lookup.
(jit_convert_llvm::convert): Handle loop/function agnostic stuff.
(jit_convert_llvm::visit): Handle function creation as well.
(tree_jit::execute): Move implementation to tree_jit::do_execute.
(jit_info::compile): Call convert_loop instead of convert.
* pt-jit.h (jit_convert::jit_convert): New overload.
(jit_convert::initialize, jit_convert_llvm::convert_loop,
jit_convert_llvm::convert_function, tree_jit::do_execute): New function.
(jit_convert::create_variable, jit_convert_llvm::initialize): Update signature.
(tree_jit::execute): Made static.
(tree_jit::tree_jit): Made private.
(jit_function_info): New class.
* ov-usr-fcn.cc (octave_user_function::~octave_user_function): Delete jit_info.
(octave_user_function::octave_user_function): Maybe JIT and use is_special_expr
and special_expr.
(octave_user_function::special_expr): New function.
* ov-usr-fcn.h (octave_user_function::is_special_expr,
octave_user_function::special_expr, octave_user_function::get_info,
octave_user_function::stash_info): New function.
* pt-decl.h (tree_decl_elt::name): New function.
* pt-eval.cc (tree_evaluator::visit_simple_for_command,
tree_evaluator::visit_while_command): Use static tree_jit methods.
author | Max Brister <max@2bass.com> |
---|---|
date | Sun, 09 Sep 2012 00:29:00 -0600 |
parents | 8125773322d4 |
children | 8355fddce815 |
line wrap: on
line diff
--- a/libinterp/interp-core/jit-typeinfo.cc Sat Sep 08 18:47:29 2012 -0700 +++ b/libinterp/interp-core/jit-typeinfo.cc Sun Sep 09 00:29:00 2012 -0600 @@ -366,6 +366,16 @@ return idx < ndim ? mat->dimensions[idx] : 1; } +extern "C" octave_base_value * +octave_jit_create_undef (void) +{ + octave_value undef; + octave_base_value *ret = undef.internal_rep (); + ret->grab (); + + return ret; +} + extern "C" Complex octave_jit_complex_div (Complex lhs, Complex rhs) { @@ -791,14 +801,15 @@ jit_operation::to_idx (const std::vector<jit_type*>& types) const { octave_idx_type numel = types.size (); - if (numel == 1) - numel = 2; + numel = std::max (2, numel); Array<octave_idx_type> idx (dim_vector (1, numel)); for (octave_idx_type i = 0; i < static_cast<octave_idx_type> (types.size ()); ++i) idx(i) = types[i]->type_id (); + if (types.size () == 0) + idx(0) = idx(1) = 0; if (types.size () == 1) { idx(1) = idx(0); @@ -1149,6 +1160,14 @@ fn.add_mapping (engine, &octave_jit_release_matrix); release_fn.add_overload (fn); + // destroy + destroy_fn = release_fn; + destroy_fn.stash_name ("destroy"); + destroy_fn.add_overload (create_identity(scalar)); + destroy_fn.add_overload (create_identity(boolean)); + destroy_fn.add_overload (create_identity(index)); + destroy_fn.add_overload (create_identity(complex)); + // now for binary scalar operations add_binary_op (scalar, octave_value::op_add, llvm::Instruction::FAdd); add_binary_op (scalar, octave_value::op_sub, llvm::Instruction::FSub); @@ -1702,6 +1721,12 @@ scalar, matrix, index, index); end_fn.add_overload (fn); + // -------------------- create_undef -------------------- + create_undef_fn.stash_name ("create_undef"); + fn = create_function (jit_convention::external, "octave_jit_create_undef", + any); + create_undef_fn.add_overload (fn); + casts[any->type_id ()].stash_name ("(any)"); casts[scalar->type_id ()].stash_name ("(scalar)"); casts[complex->type_id ()].stash_name ("(complex)");