Mercurial > octave-nkf
diff src/interp-core/jit-typeinfo.cc @ 15146:709e8928e68c
Scalar unary operation support in JIT
* jit-typeinfo.cc (jit_typeinfo::jit_typeinfo): Add scalar unary operations.
* jit-typeinfo.h (jit_typeinfo::unary_op, jit_typeinfo::do_unary_op): New
function.
* pt-jit.cc (jit_convert::visit_postfix_expression,
jit_convert::visit_prefix_expression): Impelment.
(jit_convert::visit): Protect result.
author | Max Brister <max@2bass.com> |
---|---|
date | Fri, 10 Aug 2012 15:05:29 -0500 |
parents | eeaaac7c86b6 |
children | 98a65d9e426f |
line wrap: on
line diff
--- a/src/interp-core/jit-typeinfo.cc Fri Aug 10 13:09:11 2012 -0700 +++ b/src/interp-core/jit-typeinfo.cc Fri Aug 10 15:05:29 2012 -0500 @@ -1106,6 +1106,14 @@ binary_ops[i].stash_name ("binary" + op_name); } + unary_ops.resize (octave_value::num_unary_ops); + for (size_t i = 0; i < octave_value::num_unary_ops; ++i) + { + octave_value::unary_op op = static_cast<octave_value::unary_op> (i); + std::string op_name = octave_value::unary_op_as_string (op); + unary_ops[i].stash_name ("unary" + op_name); + } + for (int op = 0; op < octave_value::num_binary_ops; ++op) { llvm::Twine fn_name ("octave_jit_binary_any_any_"); @@ -1164,7 +1172,6 @@ release_fn.add_overload (fn); // now for binary scalar operations - // FIXME: Finish all operations add_binary_op (scalar, octave_value::op_add, llvm::Instruction::FAdd); add_binary_op (scalar, octave_value::op_sub, llvm::Instruction::FSub); add_binary_op (scalar, octave_value::op_mul, llvm::Instruction::FMul); @@ -1224,6 +1231,48 @@ binary_ops[octave_value::op_pow].add_overload (fn); binary_ops[octave_value::op_el_pow].add_overload (fn); + // now for unary scalar operations + // FIXME: Impelment not + fn = create_function (jit_convention::internal, "octave_jit_++", scalar, + scalar); + body = fn.new_block (); + builder.SetInsertPoint (body); + { + llvm::Value *one = llvm::ConstantFP::get (scalar_t, 1); + llvm::Value *val = fn.argument (builder, 0); + val = builder.CreateFAdd (val, one); + fn.do_return (builder, val); + } + unary_ops[octave_value::op_incr].add_overload (fn); + + fn = create_function (jit_convention::internal, "octave_jit_--", scalar, + scalar); + body = fn.new_block (); + builder.SetInsertPoint (body); + { + llvm::Value *one = llvm::ConstantFP::get (scalar_t, 1); + llvm::Value *val = fn.argument (builder, 0); + val = builder.CreateFSub (val, one); + fn.do_return (builder, val); + } + unary_ops[octave_value::op_decr].add_overload (fn); + + fn = create_function (jit_convention::internal, "octave_jit_uminus", scalar, + scalar); + body = fn.new_block (); + builder.SetInsertPoint (body); + { + llvm::Value *mone = llvm::ConstantFP::get (scalar_t, -1); + llvm::Value *val = fn.argument (builder, 0); + val = builder.CreateFMul (val, mone); + fn.do_return (builder, val); + } + + fn = create_identity (scalar); + unary_ops[octave_value::op_uplus].add_overload (fn); + unary_ops[octave_value::op_transpose].add_overload (fn); + unary_ops[octave_value::op_hermitian].add_overload (fn); + // now for binary complex operations add_binary_op (complex, octave_value::op_add, llvm::Instruction::FAdd); add_binary_op (complex, octave_value::op_sub, llvm::Instruction::FSub);