Mercurial > octave-nkf
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 */ |