annotate src/pt-jit.cc @ 14899:f25d2224fa02

Initial JIT support build-aux/common.mk: Add llvm flags. configure.ac: Link with llvm. src/Makefile: Add pt-jit. src/link-deps.mk: Link with llvm. src/oct-conf.in.h: Add llvm flags. src/toplev.cc: Add llvm flags. src/pt-eval.cc: Try to jit statements. src/pt-jit.cc: New file. src/pt-jit.h: New file
author Max Brister <max@2bass.com>
date Sun, 06 May 2012 20:17:30 -0600
parents
children 516b4a15b775
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
1 /*
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
2
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
3 Copyright (C) 2009-2012 John W. Eaton
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
4
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
5 This file is part of Octave.
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
6
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
7 Octave is free software; you can redistribute it and/or modify it
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
9 Free Software Foundation; either version 3 of the License, or (at your
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
10 option) any later version.
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
11
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
12 Octave is distributed in the hope that it will be useful, but WITHOUT
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
15 for more details.
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
16
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
18 along with Octave; see the file COPYING. If not, see
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
19 <http://www.gnu.org/licenses/>.
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
20
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
21 */
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
22
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
23 #define __STDC_LIMIT_MACROS
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
24 #define __STDC_CONSTANT_MACROS
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
25
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
26 #ifdef HAVE_CONFIG_H
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
27 #include <config.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
28 #endif
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
29
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
30 #include "pt-jit.h"
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
31
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
32 #include <typeinfo>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
33
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
34 #include <llvm/LLVMContext.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
35 #include <llvm/Module.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
36 #include <llvm/Function.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
37 #include <llvm/BasicBlock.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
38 #include <llvm/Support/IRBuilder.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
39 #include <llvm/ExecutionEngine/ExecutionEngine.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
40 #include <llvm/ExecutionEngine/JIT.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
41 #include <llvm/PassManager.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
42 #include <llvm/Analysis/Verifier.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
43 #include <llvm/Analysis/Passes.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
44 #include <llvm/Target/TargetData.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
45 #include <llvm/Transforms/Scalar.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
46 #include <llvm/Support/TargetSelect.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
47 #include <llvm/Support/raw_os_ostream.h>
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
48
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
49 #include "ov-fcn-handle.h"
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
50 #include "ov-usr-fcn.h"
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
51 #include "pt-all.h"
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
52
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
53 using namespace llvm;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
54
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
55 //FIXME: Move into tree_jit
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
56 static IRBuilder<> builder (getGlobalContext ());
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
57
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
58 extern "C" void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
59 octave_print_double (const char *name, double value)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
60 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
61 // FIXME: We should avoid allocating a new octave_scalar each time
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
62 octave_value ov (value);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
63 ov.print_with_name (octave_stdout, name);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
64 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
65
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
66 tree_jit::tree_jit (void) : context (getGlobalContext ()), engine (0)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
67 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
68 InitializeNativeTarget ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
69 InitializeNativeTargetAsmPrinter ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
70 module = new Module ("octave", context);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
71 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
72
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
73 tree_jit::~tree_jit (void)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
74 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
75 delete module;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
76 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
77
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
78 bool
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
79 tree_jit::execute (tree& tee)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
80 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
81 if (!engine)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
82 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
83 engine = ExecutionEngine::createJIT (module);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
84
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
85 // initialize pass manager
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
86 pass_manager = new FunctionPassManager (module);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
87 pass_manager->add (new TargetData(*engine->getTargetData ()));
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
88 pass_manager->add (createBasicAliasAnalysisPass ());
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
89 pass_manager->add (createPromoteMemoryToRegisterPass ());
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
90 pass_manager->add (createInstructionCombiningPass ());
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
91 pass_manager->add (createReassociatePass ());
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
92 pass_manager->add (createGVNPass ());
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
93 pass_manager->add (createCFGSimplificationPass ());
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
94 pass_manager->doInitialization ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
95
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
96 // create external functions
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
97 Type *vtype = Type::getVoidTy (context);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
98 std::vector<Type*> pd_args (2);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
99 pd_args[0] = Type::getInt8PtrTy (context);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
100 pd_args[1] = Type::getDoubleTy (context);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
101 FunctionType *print_double_ty = FunctionType::get (vtype, pd_args, false);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
102 print_double = Function::Create (print_double_ty,
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
103 Function::ExternalLinkage,
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
104 "octave_print_double", module);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
105 engine->addGlobalMapping (print_double,
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
106 reinterpret_cast<void*>(&octave_print_double));
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
107 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
108
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
109 if (!engine)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
110 // sometimes this fails during early initialization
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
111 return false;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
112
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
113 // find function
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
114 function_info *finfo;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
115 finfo_map_iterator iter = compiled_functions.find (&tee);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
116
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
117 if (iter == compiled_functions.end ())
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
118 finfo = compile (tee);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
119 else
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
120 finfo = iter->second;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
121
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
122 return finfo->execute ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
123 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
124
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
125 tree_jit::function_info*
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
126 tree_jit::compile (tree& tee)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
127 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
128 value_stack.clear ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
129 variables.clear ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
130
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
131 // setup function
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
132 std::vector<Type*> args (2);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
133 args[0] = Type::getInt1PtrTy (context);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
134 args[1] = Type::getDoublePtrTy (context);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
135 FunctionType *ft = FunctionType::get (Type::getVoidTy (context), args, false);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
136 Function *compiling = Function::Create (ft, Function::ExternalLinkage,
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
137 "test_fn", module);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
138
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
139 entry_block = BasicBlock::Create (context, "entry", compiling);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
140 BasicBlock *body = BasicBlock::Create (context, "body",
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
141 compiling);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
142 builder.SetInsertPoint (body);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
143
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
144 // convert tree to LLVM IR
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
145 try
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
146 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
147 tee.accept (*this);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
148 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
149 catch (const jit_fail_exception&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
150 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
151 //FIXME: cleanup
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
152 return compiled_functions[&tee] = new function_info ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
153 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
154
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
155 // copy input arguments
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
156 builder.SetInsertPoint (entry_block);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
157
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
158 Function::arg_iterator arg_iter = compiling->arg_begin ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
159 Value *arg_defined = arg_iter;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
160 Value *arg_value = ++arg_iter;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
161
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
162 arg_defined->setName ("arg_defined");
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
163 arg_value->setName ("arg_value");
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
164
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
165 size_t idx = 0;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
166 std::vector<std::string> arg_names;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
167 std::vector<bool> arg_used;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
168 for (var_map_iterator iter = variables.begin (); iter != variables.end ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
169 ++iter, ++idx)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
170 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
171 arg_names.push_back (iter->first);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
172 arg_used.push_back (iter->second.use);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
173
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
174 Value *gep_defined = builder.CreateConstInBoundsGEP1_32 (arg_defined, idx);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
175 Value *defined = builder.CreateLoad (gep_defined);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
176 builder.CreateStore (defined, iter->second.defined);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
177
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
178 Value *gep_value = builder.CreateConstInBoundsGEP1_32 (arg_value, idx);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
179 Value *value = builder.CreateLoad (gep_value);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
180 builder.CreateStore (value, iter->second.value);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
181 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
182 builder.CreateBr (body);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
183
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
184 // copy output arguments
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
185 BasicBlock *cleanup = BasicBlock::Create (context, "cleanup", compiling);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
186 builder.SetInsertPoint (body);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
187 builder.CreateBr (cleanup);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
188 builder.SetInsertPoint (cleanup);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
189
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
190 idx = 0;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
191 for (var_map_iterator iter = variables.begin (); iter != variables.end ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
192 ++iter, ++idx)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
193 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
194 Value *gep_defined = builder.CreateConstInBoundsGEP1_32 (arg_defined, idx);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
195 Value *defined = builder.CreateLoad (iter->second.defined);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
196 builder.CreateStore (defined, gep_defined);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
197
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
198 Value *gep_value = builder.CreateConstInBoundsGEP1_32 (arg_value, idx);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
199 Value *value = builder.CreateLoad (iter->second.value, iter->first);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
200 builder.CreateStore (value, gep_value);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
201 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
202
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
203 builder.CreateRetVoid ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
204
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
205 // print what we compiled (for debugging)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
206 // we leave this in for now, as other people might want to view the ir created
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
207 // should be removed eventually though
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
208 const bool debug_print_ir = false;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
209 if (debug_print_ir)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
210 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
211 raw_os_ostream os (std::cout);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
212 std::cout << "Compiling --------------------\n";
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
213 tree_print_code tpc (std::cout);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
214 std::cout << typeid (tee).name () << std::endl;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
215 tee.accept (tpc);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
216 std::cout << "\n--------------------\n";
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
217
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
218 std::cout << "llvm_ir\n";
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
219 compiling->print (os);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
220 std::cout << "--------------------\n";
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
221 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
222
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
223 // compile code
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
224 verifyFunction (*compiling);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
225 pass_manager->run (*compiling);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
226
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
227 if (debug_print_ir)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
228 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
229 raw_os_ostream os (std::cout);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
230 std::cout << "optimized llvm_ir\n";
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
231 compiling->print (os);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
232 std::cout << "--------------------\n";
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
233 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
234
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
235 jit_function fun =
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
236 reinterpret_cast<jit_function> (engine->getPointerToFunction (compiling));
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
237
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
238 return compiled_functions[&tee] = new function_info (fun, arg_names, arg_used);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
239 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
240
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
241 tree_jit::variable_info
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
242 tree_jit::find (const std::string &name, bool use)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
243 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
244 var_map_iterator iter = variables.find (name);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
245 if (iter == variables.end ())
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
246 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
247 // we currently just assume everything is a double
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
248 Type *dbl = Type::getDoubleTy (context);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
249 Type *bol = Type::getInt1Ty (context);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
250 IRBuilder<> tmpB (entry_block, entry_block->begin ());
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
251
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
252 variable_info vinfo;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
253 vinfo.defined = tmpB.CreateAlloca (bol, 0);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
254 vinfo.value = tmpB.CreateAlloca (dbl, 0, name);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
255 vinfo.use = use;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
256 variables[name] = vinfo;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
257 return vinfo;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
258 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
259 else
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
260 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
261 iter->second.use = iter->second.use || use;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
262 return iter->second;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
263 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
264 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
265
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
266 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
267 tree_jit::do_assign (variable_info vinfo, llvm::Value *value)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
268 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
269 // create assign expression
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
270 Value *result = builder.CreateStore (value, vinfo.value);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
271 value_stack.push_back (result);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
272
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
273 // update defined for lhs
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
274 Type *btype = Type::getInt1Ty (context);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
275 Value *btrue = ConstantInt::get (btype, APInt (1, 1));
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
276 builder.CreateStore (btrue, vinfo.defined);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
277 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
278
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
279 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
280 tree_jit::emit_print (const std::string& vname, llvm::Value *value)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
281 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
282 Value *pname = builder.CreateGlobalStringPtr (vname);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
283 builder.CreateCall2 (print_double, pname, value);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
284 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
285
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
286 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
287 tree_jit::visit_anon_fcn_handle (tree_anon_fcn_handle&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
288 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
289 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
290 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
291
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
292 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
293 tree_jit::visit_argument_list (tree_argument_list&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
294 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
295 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
296 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
297
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
298 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
299 tree_jit::visit_binary_expression (tree_binary_expression& be)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
300 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
301 tree_expression *lhs = be.lhs ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
302 tree_expression *rhs = be.rhs ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
303 if (lhs && rhs)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
304 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
305 lhs->accept (*this);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
306 rhs->accept (*this);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
307
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
308 Value *lhsv = value_stack.back ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
309 value_stack.pop_back ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
310
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
311 Value *rhsv = value_stack.back ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
312 value_stack.pop_back ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
313
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
314 Value *result;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
315 switch (be.op_type ())
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
316 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
317 case octave_value::op_add:
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
318 result = builder.CreateFAdd (lhsv, rhsv);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
319 break;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
320 case octave_value::op_sub:
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
321 result = builder.CreateFSub (lhsv, rhsv);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
322 break;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
323 case octave_value::op_mul:
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
324 result = builder.CreateFMul (lhsv, rhsv);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
325 break;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
326 case octave_value::op_div:
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
327 result = builder.CreateFDiv (lhsv, rhsv);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
328 break;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
329 default:
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
330 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
331 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
332
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
333 value_stack.push_back (result);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
334 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
335 else
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
336 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
337 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
338
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
339 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
340 tree_jit::visit_break_command (tree_break_command&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
341 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
342 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
343 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
344
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
345 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
346 tree_jit::visit_colon_expression (tree_colon_expression&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
347 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
348 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
349 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
350
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
351 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
352 tree_jit::visit_continue_command (tree_continue_command&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
353 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
354 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
355 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
356
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
357 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
358 tree_jit::visit_global_command (tree_global_command&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
359 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
360 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
361 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
362
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
363 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
364 tree_jit::visit_persistent_command (tree_persistent_command&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
365 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
366 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
367 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
368
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
369 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
370 tree_jit::visit_decl_elt (tree_decl_elt&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
371 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
372 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
373 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
374
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
375 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
376 tree_jit::visit_decl_init_list (tree_decl_init_list&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
377 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
378 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
379 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
380
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
381 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
382 tree_jit::visit_simple_for_command (tree_simple_for_command&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
383 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
384 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
385 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
386
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
387 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
388 tree_jit::visit_complex_for_command (tree_complex_for_command&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
389 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
390 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
391 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
392
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
393 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
394 tree_jit::visit_octave_user_script (octave_user_script&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
395 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
396 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
397 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
398
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
399 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
400 tree_jit::visit_octave_user_function (octave_user_function&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
401 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
402 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
403 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
404
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
405 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
406 tree_jit::visit_octave_user_function_header (octave_user_function&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
407 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
408 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
409 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
410
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
411 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
412 tree_jit::visit_octave_user_function_trailer (octave_user_function&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
413 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
414 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
415 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
416
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
417 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
418 tree_jit::visit_function_def (tree_function_def&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
419 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
420 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
421 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
422
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
423 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
424 tree_jit::visit_identifier (tree_identifier& ti)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
425 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
426 octave_value ov = ti.do_lookup ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
427 if (ov.is_function ())
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
428 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
429
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
430 std::string name = ti.name ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
431 variable_info vinfo = find (ti.name (), true);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
432
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
433 // TODO check defined
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
434
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
435 Value *load_value = builder.CreateLoad (vinfo.value, name);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
436 value_stack.push_back (load_value);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
437 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
438
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
439 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
440 tree_jit::visit_if_clause (tree_if_clause&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
441 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
442 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
443 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
444
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
445 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
446 tree_jit::visit_if_command (tree_if_command&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
447 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
448 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
449 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
450
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
451 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
452 tree_jit::visit_if_command_list (tree_if_command_list&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
453 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
454 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
455 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
456
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
457 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
458 tree_jit::visit_index_expression (tree_index_expression&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
459 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
460 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
461 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
462
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
463 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
464 tree_jit::visit_matrix (tree_matrix&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
465 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
466 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
467 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
468
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
469 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
470 tree_jit::visit_cell (tree_cell&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
471 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
472 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
473 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
474
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
475 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
476 tree_jit::visit_multi_assignment (tree_multi_assignment&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
477 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
478 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
479 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
480
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
481 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
482 tree_jit::visit_no_op_command (tree_no_op_command&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
483 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
484 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
485 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
486
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
487 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
488 tree_jit::visit_constant (tree_constant& tc)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
489 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
490 octave_value v = tc.rvalue1 ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
491 if (v.is_real_scalar () && v.is_double_type ())
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
492 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
493 double dv = v.double_value ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
494 Value *lv = ConstantFP::get (context, APFloat (dv));
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
495 value_stack.push_back (lv);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
496 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
497 else
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
498 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
499 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
500
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
501 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
502 tree_jit::visit_fcn_handle (tree_fcn_handle&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
503 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
504 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
505 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
506
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
507 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
508 tree_jit::visit_parameter_list (tree_parameter_list&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
509 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
510 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
511 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
512
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
513 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
514 tree_jit::visit_postfix_expression (tree_postfix_expression&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
515 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
516 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
517 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
518
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
519 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
520 tree_jit::visit_prefix_expression (tree_prefix_expression&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
521 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
522 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
523 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
524
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
525 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
526 tree_jit::visit_return_command (tree_return_command&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
527 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
528 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
529 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
530
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
531 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
532 tree_jit::visit_return_list (tree_return_list&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
533 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
534 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
535 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
536
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
537 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
538 tree_jit::visit_simple_assignment (tree_simple_assignment& tsa)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
539 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
540 // only support an identifier as lhs
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
541 tree_identifier *lhs = dynamic_cast<tree_identifier*> (tsa.left_hand_side ());
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
542 if (!lhs)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
543 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
544
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
545 variable_info lhsv = find (lhs->name (), false);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
546
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
547 // resolve rhs as normal
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
548 tree_expression *rhs = tsa.right_hand_side ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
549 rhs->accept (*this);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
550
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
551 Value *rhsv = value_stack.back ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
552 value_stack.pop_back ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
553
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
554 do_assign (lhsv, rhsv);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
555
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
556 if (tsa.print_result ())
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
557 emit_print (lhs->name (), rhsv);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
558 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
559
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
560 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
561 tree_jit::visit_statement (tree_statement& stmt)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
562 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
563 tree_command *cmd = stmt.command ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
564 tree_expression *expr = stmt.expression ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
565
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
566 if (cmd)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
567 cmd->accept (*this);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
568 else
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
569 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
570 // TODO deal with printing
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
571
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
572 // stolen from tree_evaluator::visit_statement
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
573 bool do_bind_ans = false;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
574
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
575 if (expr->is_identifier ())
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
576 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
577 tree_identifier *id = dynamic_cast<tree_identifier *> (expr);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
578
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
579 do_bind_ans = (! id->is_variable ());
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
580 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
581 else
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
582 do_bind_ans = (! expr->is_assignment_expression ());
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
583
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
584 expr->accept (*this);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
585
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
586 if (do_bind_ans)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
587 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
588 Value *rhs = value_stack.back ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
589 value_stack.pop_back ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
590
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
591 variable_info ans = find ("ans", false);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
592 do_assign (ans, rhs);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
593 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
594 else if (expr->is_identifier () && expr->print_result ())
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
595 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
596 // FIXME: ugly hack, we need to come up with a way to pass
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
597 // nargout to visit_identifier
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
598 emit_print (expr->name (), value_stack.back ());
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
599 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
600
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
601
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
602 value_stack.pop_back ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
603 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
604 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
605
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
606 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
607 tree_jit::visit_statement_list (tree_statement_list&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
608 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
609 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
610 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
611
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
612 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
613 tree_jit::visit_switch_case (tree_switch_case&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
614 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
615 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
616 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
617
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
618 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
619 tree_jit::visit_switch_case_list (tree_switch_case_list&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
620 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
621 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
622 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
623
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
624 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
625 tree_jit::visit_switch_command (tree_switch_command&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
626 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
627 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
628 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
629
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
630 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
631 tree_jit::visit_try_catch_command (tree_try_catch_command&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
632 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
633 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
634 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
635
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
636 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
637 tree_jit::visit_unwind_protect_command (tree_unwind_protect_command&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
638 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
639 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
640 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
641
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
642 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
643 tree_jit::visit_while_command (tree_while_command&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
644 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
645 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
646 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
647
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
648 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
649 tree_jit::visit_do_until_command (tree_do_until_command&)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
650 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
651 fail ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
652 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
653
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
654 void
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
655 tree_jit::fail (void)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
656 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
657 throw jit_fail_exception ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
658 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
659
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
660 tree_jit::function_info::function_info (void) : function (0)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
661 {}
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
662
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
663 tree_jit::function_info::function_info (jit_function fun,
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
664 const std::vector<std::string>& args,
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
665 const std::vector<bool>& arg_used) :
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
666 function (fun), arguments (args), argument_used (arg_used)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
667 {}
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
668
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
669 bool tree_jit::function_info::execute ()
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
670 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
671 if (! function)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
672 return false;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
673
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
674 // FIXME: we are doing hash lookups every time, this has got to be slow
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
675 unwind_protect up;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
676 bool *args_defined = new bool[arguments.size ()]; // vector<bool> sucks
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
677 up.add_delete (args_defined);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
678
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
679 std::vector<double> args_values (arguments.size ());
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
680 for (size_t i = 0; i < arguments.size (); ++i)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
681 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
682 octave_value ov = symbol_table::varval (arguments[i]);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
683
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
684 if (argument_used[i])
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
685 {
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
686 if (! (ov.is_double_type () && ov.is_real_scalar ()))
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
687 return false;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
688
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
689 args_defined[i] = ov.is_defined ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
690 args_values[i] = ov.double_value ();
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
691 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
692 else
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
693 args_defined[i] = false;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
694 }
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
695
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
696 function (args_defined, &args_values[0]);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
697
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
698 for (size_t i = 0; i < arguments.size (); ++i)
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
699 if (args_defined[i])
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
700 symbol_table::varref (arguments[i]) = octave_value (args_values[i]);
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
701
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
702 return true;
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
703 }