Mercurial > octave-nkf
diff src/pt-jit.cc @ 15067:df4538e3b50b
ND scalar indexing in JIT.
* src/jit-ir.cc (jit_magic_end::jit_magic_end): Use jit_magic_end::context.
* src/jit-ir.h (jit_call::jit_call): New overload.
(jit_magic_end::context): New class.
(jit_magic_end::jit_magic_end): moved to src/jit-ir.cc.
* src/jit-typeinfo.cc (octave_jit_paren_scalar): New function.
(jit_typeinfo::jit_typeinfo): Generate ND scalar indexing.
(jit_typeinfo::gen_subsref): New function.
* src/jit-typeinfo.h (jit_typeinfo::gen_subsref): New declaration.
* src/pt-jit.cc (jit_convert::visit_index_expression, jit_convert::do_assign):
Update resolve call.
(jit_convert::resolve): Resolve ND indices.
* src/pt-jit.h (jit_convert::resolve): Change function signature.
author | Max Brister <max@2bass.com> |
---|---|
date | Tue, 31 Jul 2012 11:51:01 -0500 |
parents | bc32288f4a42 |
children | f57d7578c1a6 |
line wrap: on
line diff
--- a/src/pt-jit.cc Tue Jul 31 14:14:03 2012 -0400 +++ b/src/pt-jit.cc Tue Jul 31 11:51:01 2012 -0500 @@ -518,11 +518,7 @@ void jit_convert::visit_index_expression (tree_index_expression& exp) { - std::pair<jit_value *, jit_value *> res = resolve (exp); - jit_value *object = res.first; - jit_value *index = res.second; - - result = create_checked (jit_typeinfo::paren_subsref, object, index); + result = resolve (jit_typeinfo::paren_subsref (), exp); } void @@ -813,8 +809,8 @@ return ss.str (); } -std::pair<jit_value *, jit_value *> -jit_convert::resolve (tree_index_expression& exp) +jit_instruction * +jit_convert::resolve (const jit_operation& fres, tree_index_expression& exp) { std::string type = exp.type_tags (); if (! (type.size () == 1 && type[0] == '(')) @@ -828,21 +824,27 @@ if (! arg_list) throw jit_fail_exception ("null argument list"); - if (arg_list->size () != 1) - throw jit_fail_exception ("Bad number of arguments in arg_list"); + if (arg_list->size () < 1) + throw jit_fail_exception ("Empty arg_list"); tree_expression *tree_object = exp.expression (); jit_value *object = visit (tree_object); - end_context.push_back (object); - - unwind_protect prot; - prot.add_method (&end_context, &std::vector<jit_value *>::pop_back); + size_t narg = arg_list->size (); + tree_argument_list::iterator iter = arg_list->begin (); + std::vector<jit_value *> call_args (narg + 1); + call_args[0] = object; - tree_expression *arg0 = arg_list->front (); - jit_value *index = visit (arg0); + for (size_t idx = 0; iter != arg_list->end (); ++idx, ++iter) + { + unwind_protect prot; + prot.add_method (&end_context, + &std::vector<jit_magic_end::context>::pop_back); + end_context.push_back (jit_magic_end::context (object, idx, narg)); + call_args[idx + 1] = visit (*iter); + } - return std::make_pair (object, index); + return create_checked (fres, call_args); } jit_value * @@ -856,14 +858,8 @@ else if (tree_index_expression *idx = dynamic_cast<tree_index_expression *> (exp)) { - std::pair<jit_value *, jit_value *> res = resolve (*idx); - jit_value *object = res.first; - jit_value *index = res.second; - jit_call *new_object = create<jit_call> (&jit_typeinfo::paren_subsasgn, - object, index, rhs); - block->append (new_object); + jit_value *new_object = resolve (jit_typeinfo::paren_subsasgn (), *idx); do_assign (idx->expression (), new_object, true); - create_check (new_object); // FIXME: Will not work for values that must be release/grabed return rhs; @@ -1853,4 +1849,17 @@ %! endfor %! assert (result == m(end) * niter); +%!test +%! ndim = 100; +%! result = 0; +%! m = zeros (ndim); +%! m(:) = 1:ndim^2; +%! i = 1; +%! while (i <= ndim) +%! for j = 1:ndim +%! result = result + m(i, j); +%! endfor +%! i = i + 1; +%! endwhile +%! assert (result == sum (sum (m))); */