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);