# HG changeset patch # User Max Brister # Date 1340839181 18000 # Node ID 2d7c0c86e71290167c912a03bb2961fa4a6b5bf0 # Parent 95bfd032f4c7af0ff7c55a9e2d26b8e7a29c360d In jit support A(idx) = v; where A is matrix, idx is a range, and v is a scalar * src/pt-jit.cc (octave_jit_paren_subsasgn_impl): Use jit_range::update. (octave_jit_paren_subsasgn_matrix_range, jit_range::all_elements_are_ints): New function. (jit_typeinfo::jit_typeinfo): Add support for matrix range paren subsasgn. * src/pt-jit.h (jit_range::all_elements_are_ints): New Declaration. (jit_range::jit_range): Use jit_range::update. (jit_range::update): New function. diff -r 95bfd032f4c7 -r 2d7c0c86e712 src/pt-jit.cc --- a/src/pt-jit.cc Wed Jun 27 15:49:28 2012 -0500 +++ b/src/pt-jit.cc Wed Jun 27 18:19:41 2012 -0500 @@ -249,10 +249,39 @@ double *data = array->fortran_vec (); data[index - 1] = value; - mat->ref_count = array->jit_ref_count (); - mat->slice_data = array->jit_slice_data () - 1; - mat->dimensions = array->jit_dimensions (); - mat->slice_len = array->nelem (); + mat->update (); +} + +extern "C" void +octave_jit_paren_subsasgn_matrix_range (jit_matrix *result, jit_matrix *mat, + jit_range *index, double value) +{ + NDArray *array = mat->array; + bool done = false; + + // optimize for the simple case (no resizing and no errors) + if (*array->jit_ref_count () == 1 + && index->all_elements_are_ints ()) + { + octave_idx_type base = static_cast (index->base); + octave_idx_type nelem = index->nelem; + if (base > 0 && base + nelem <= array->nelem ()) + { + done = true; + double *data = array->jit_slice_data (); + std::fill (data + base - 1, data + base + nelem - 1, value); + } + } + + if (! done) + { + idx_vector idx (*index); + NDArray avalue (dim_vector (1, 1)); + avalue.xelem (0) = value; + array->assign (idx, avalue); + } + + result->update (array); } extern "C" void @@ -311,6 +340,13 @@ } // -------------------- jit_range -------------------- +bool +jit_range::all_elements_are_ints () const +{ + Range r (*this); + return r.all_elements_are_ints (); +} + std::ostream& operator<< (std::ostream& os, const jit_range& rng) { @@ -912,7 +948,12 @@ llvm::verifyFunction (*fn); paren_subsasgn_fn.add_overload (fn, true, matrix, matrix, scalar, scalar); - // paren_subsasgn + fn = create_function ("octave_jit_paren_subsasgn_matrix_range", void_t, + matrix_t->getPointerTo (), matrix_t->getPointerTo (), + range_t->getPointerTo (), scalar_t); + engine->addGlobalMapping (fn, + reinterpret_cast (&octave_jit_paren_subsasgn_matrix_range)); + paren_subsasgn_fn.add_overload (fn, true, matrix, matrix, range, scalar); casts[any->type_id ()].stash_name ("(any)"); casts[scalar->type_id ()].stash_name ("(scalar)"); diff -r 95bfd032f4c7 -r 2d7c0c86e712 src/pt-jit.h --- a/src/pt-jit.h Wed Jun 27 15:49:28 2012 -0500 +++ b/src/pt-jit.h Wed Jun 27 18:19:41 2012 -0500 @@ -208,6 +208,8 @@ return Range (base, limit, inc); } + bool all_elements_are_ints () const; + double base; double limit; double inc; @@ -221,13 +223,24 @@ struct jit_array { - jit_array (T& from) : ref_count (from.jit_ref_count ()), - slice_data (from.jit_slice_data () - 1), - slice_len (from.capacity ()), - dimensions (from.jit_dimensions ()), - array (new T (from)) + jit_array (T& from) : array (new T (from)) { grab_dimensions (); + update (); + } + + void update (void) + { + ref_count = array->jit_ref_count (); + slice_data = array->jit_slice_data () - 1; + slice_len = array->capacity (); + dimensions = array->jit_dimensions (); + } + + void update (T *aarray) + { + array = aarray; + update (); } void grab_dimensions (void)