# HG changeset patch # User Max Brister # Date 1344634867 18000 # Node ID 1b2fbc30e4e72c19723534a8281c52c89df6c0fa # Parent 98a65d9e426f322d06fc672c7a243ad328f5695a Postfix increment and decrement operations in JIT * jit-typeinfo.cc (jit_typeinfo::jit_typeinfo): Initialize copy operation. * jit-typeinfo.h (jit_typeinfo::copy): New function. * pt-jit.cc (jit_convert::visit_postfix_expression): Implement for ++ and --. diff -r 98a65d9e426f -r 1b2fbc30e4e7 src/interp-core/jit-typeinfo.cc --- a/src/interp-core/jit-typeinfo.cc Fri Aug 10 16:19:27 2012 -0500 +++ b/src/interp-core/jit-typeinfo.cc Fri Aug 10 16:41:07 2012 -0500 @@ -1159,6 +1159,10 @@ fn.add_mapping (engine, &octave_jit_release_matrix); release_fn.add_overload (fn); + // copy + copy_fn.stash_name ("copy"); + copy_fn.add_overload (create_identity (scalar)); + // 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); diff -r 98a65d9e426f -r 1b2fbc30e4e7 src/interp-core/jit-typeinfo.h --- a/src/interp-core/jit-typeinfo.h Fri Aug 10 16:19:27 2012 -0500 +++ b/src/interp-core/jit-typeinfo.h Fri Aug 10 16:41:07 2012 -0500 @@ -498,6 +498,11 @@ return instance->release_fn.overload (type); } + static const jit_operation& copy (void) + { + return instance->copy_fn; + } + static const jit_operation& print_value (void) { return instance->print_fn; @@ -751,6 +756,7 @@ std::vector unary_ops; jit_operation grab_fn; jit_operation release_fn; + jit_operation copy_fn; jit_operation print_fn; jit_operation for_init_fn; jit_operation for_check_fn; diff -r 98a65d9e426f -r 1b2fbc30e4e7 src/interp-core/pt-jit.cc --- a/src/interp-core/pt-jit.cc Fri Aug 10 16:19:27 2012 -0500 +++ b/src/interp-core/pt-jit.cc Fri Aug 10 16:41:07 2012 -0500 @@ -592,9 +592,9 @@ if (etype == octave_value::op_incr || etype == octave_value::op_decr) { - // FIXME: Somehow copy operandv - // do_assign (operand, operandv); - throw jit_fail_exception ("Postfix ++ and -- not yet supported"); + jit_value *ret = create_checked (&jit_typeinfo::copy, operandv); + do_assign (operand, result); + result = ret; } } @@ -1991,5 +1991,12 @@ %! endwhile %! assert (i == 10); %! assert (a == 10); +%!test +%! i = 0; +%! while i < 10 +%! a = i++; +%! endwhile +%! assert (i == 10); +%! assert (a == 9); */