comparison src/interp-core/pt-jit.cc @ 15140:6ea86e1d0f5f

Support +=, -=, *=, ect. in JIT * pt-jit.cc (jit-convert::visit_simple_assignment): Support more assignment operators. * ov.cc (octave_value::assign_op_to_binary_op): New function. * ov.h (octave_value::assign_op_to_binary_op): New declaration.
author Max Brister <max@2bass.com>
date Fri, 10 Aug 2012 12:23:32 -0500
parents bd6bb87e2bea
children 709e8928e68c
comparison
equal deleted inserted replaced
15136:eeaaac7c86b6 15140:6ea86e1d0f5f
605 } 605 }
606 606
607 void 607 void
608 jit_convert::visit_simple_assignment (tree_simple_assignment& tsa) 608 jit_convert::visit_simple_assignment (tree_simple_assignment& tsa)
609 { 609 {
610 if (tsa.op_type () != octave_value::op_asn_eq)
611 throw jit_fail_exception ("Unsupported assign");
612
613 // resolve rhs
614 tree_expression *rhs = tsa.right_hand_side (); 610 tree_expression *rhs = tsa.right_hand_side ();
615 jit_value *rhsv = visit (rhs); 611 jit_value *rhsv = visit (rhs);
612 octave_value::assign_op op = tsa.op_type ();
613
614 if (op != octave_value::op_asn_eq)
615 {
616 // do the equivlent binary operation, then assign. This is always correct,
617 // but isn't always optimal.
618 tree_expression *lhs = tsa.left_hand_side ();
619 jit_value *lhsv = visit (lhs);
620 octave_value::binary_op bop = octave_value::assign_op_to_binary_op (op);
621 const jit_operation& fn = jit_typeinfo::binary_op (bop);
622 rhsv = create_checked (fn, lhsv, rhsv);
623 }
616 624
617 result = do_assign (tsa.left_hand_side (), rhsv); 625 result = do_assign (tsa.left_hand_side (), rhsv);
618 } 626 }
619 627
620 void 628 void
1946 %! m = sin (m); 1954 %! m = sin (m);
1947 %! break; 1955 %! break;
1948 %! endfor 1956 %! endfor
1949 %! assert (m == sin ([1 2 3])); 1957 %! assert (m == sin ([1 2 3]));
1950 1958
1959 %!test
1960 %! i = 0;
1961 %! while i < 10
1962 %! i += 1;
1963 %! endwhile
1964 %! assert (i == 10);
1965
1951 */ 1966 */