annotate libinterp/parse-tree/jit-typeinfo.cc @ 24242:545657c20e60

jit: jit-typeinfo.cc: Do not use assignment with llvm::Twine objects * libinterp/corefcn/jit-typeinfo.cc: Do not use assignment with llvm::Twine objects. Such assignments were allowed in LLVM 3.4 but have been disallowed since LLVM 3.5.
author Julien Bect <jbect@users.sourceforge.net>
date Sat, 22 Jul 2017 13:43:43 +0200
parents ca25f6e48ca5
children d74d01e39f91
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1 /*
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2
23219
3ac9f9ecfae5 maint: Update copyright dates.
John W. Eaton <jwe@octave.org>
parents: 23083
diff changeset
3 Copyright (C) 2012-2017 Max Brister
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
4
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
5 This file is part of Octave.
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
6
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
7 Octave is free software; you can redistribute it and/or modify it
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22600
diff changeset
8 under the terms of the GNU General Public License as published by
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22600
diff changeset
9 the Free Software Foundation; either version 3 of the License, or
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22600
diff changeset
10 (at your option) any later version.
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
11
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22600
diff changeset
12 Octave is distributed in the hope that it will be useful, but
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22600
diff changeset
13 WITHOUT ANY WARRANTY; without even the implied warranty of
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22600
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22600
diff changeset
15 GNU General Public License for more details.
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
16
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
18 along with Octave; see the file COPYING. If not, see
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
19 <http://www.gnu.org/licenses/>.
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
20
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
21 */
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
22
16768
e2de3c8882be copyright notice fixes
John W. Eaton <jwe@octave.org>
parents: 15893
diff changeset
23 // Author: Max Brister <max@2bass.com>
e2de3c8882be copyright notice fixes
John W. Eaton <jwe@octave.org>
parents: 15893
diff changeset
24
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
25 // defines required by llvm
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
26 #define __STDC_LIMIT_MACROS
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
27 #define __STDC_CONSTANT_MACROS
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
28
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21568
diff changeset
29 #if defined (HAVE_CONFIG_H)
21301
40de9f8f23a6 Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents: 21200
diff changeset
30 # include "config.h"
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
31 #endif
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
32
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21568
diff changeset
33 #if defined (HAVE_LLVM)
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
34
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
35 #include "jit-typeinfo.h"
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
36
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21568
diff changeset
37 #if defined (HAVE_LLVM_IR_VERIFIER_H)
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
38 # include <llvm/IR/Verifier.h>
18831
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 18446
diff changeset
39 #else
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
40 # include <llvm/Analysis/Verifier.h>
18831
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 18446
diff changeset
41 #endif
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 18446
diff changeset
42
17164
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
43 #include <llvm/ExecutionEngine/ExecutionEngine.h>
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
44
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21568
diff changeset
45 #if defined (HAVE_LLVM_IR_FUNCTION_H)
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
46 # include <llvm/IR/GlobalVariable.h>
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
47 # include <llvm/IR/LLVMContext.h>
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
48 # include <llvm/IR/Function.h>
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
49 # include <llvm/IR/Instructions.h>
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
50 # include <llvm/IR/Intrinsics.h>
17164
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
51 #else
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
52 # include <llvm/GlobalVariable.h>
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
53 # include <llvm/LLVMContext.h>
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
54 # include <llvm/Function.h>
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
55 # include <llvm/Instructions.h>
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
56 # include <llvm/Intrinsics.h>
17164
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
57 #endif
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
58
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21568
diff changeset
59 #if defined (HAVE_LLVM_SUPPORT_IRBUILDER_H)
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
60 # include <llvm/Support/IRBuilder.h>
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
61 # elif defined(HAVE_LLVM_IR_IRBUILDER_H)
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
62 # include <llvm/IR/IRBuilder.h>
17031
38bcfd413db0 Handle LLVM API incoherence. Octave now works with LLVM 3.0, 3.1, and 3.2
LYH <lyh.kernel@gmail.com>
parents: 16892
diff changeset
63 #else
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21102
diff changeset
64 # include <llvm/IRBuilder.h>
17031
38bcfd413db0 Handle LLVM API incoherence. Octave now works with LLVM 3.0, 3.1, and 3.2
LYH <lyh.kernel@gmail.com>
parents: 16892
diff changeset
65 #endif
17164
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
66
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
67 #include <llvm/Support/raw_os_ostream.h>
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
68
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
69 #include "jit-ir.h"
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
70 #include "ov.h"
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
71 #include "ov-builtin.h"
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
72 #include "ov-complex.h"
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
73 #include "ov-scalar.h"
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
74 #include "pager.h"
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
75 #include "interpreter-private.h"
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
76
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
77 namespace octave
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15019
diff changeset
78 {
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15019
diff changeset
79
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
80 static llvm::LLVMContext& context = llvm::getGlobalContext ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
81
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
82 jit_typeinfo *jit_typeinfo::instance = nullptr;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
83
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
84 std::ostream& jit_print (std::ostream& os, jit_type *atype)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
85 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
86 if (! atype)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
87 return os << "null";
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
88 return os << atype->name ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
89 }
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15019
diff changeset
90
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
91 // function that jit code calls
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
92 extern "C" void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
93 octave_jit_print_any (const char *name, octave_base_value *obv)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
94 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
95 obv->print_with_name (octave_stdout, name, true);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
96 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
97
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
98 extern "C" void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
99 octave_jit_print_scalar (const char *name, double value)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
100 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
101 // FIXME: We should avoid allocating a new octave_scalar each time
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
102 octave_value ov (value);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
103 ov.print_with_name (octave_stdout, name);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
104 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
105
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
106 extern "C" octave_base_value*
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
107 octave_jit_binary_any_any (octave_value::binary_op op, octave_base_value *lhs,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
108 octave_base_value *rhs)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
109 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
110 octave_value olhs (lhs, true);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
111 octave_value orhs (rhs, true);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
112 octave_value result = do_binary_op (op, olhs, orhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
113 octave_base_value *rep = result.internal_rep ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
114 rep->grab ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
115 return rep;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
116 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
117
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
118 extern "C" octave_idx_type
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
119 octave_jit_compute_nelem (double base, double limit, double inc)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
120 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
121 Range rng = Range (base, limit, inc);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
122 return rng.numel ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
123 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
124
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
125 extern "C" void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
126 octave_jit_release_any (octave_base_value *obv)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
127 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
128 obv->release ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
129 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
130
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
131 extern "C" void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
132 octave_jit_release_matrix (jit_matrix *m)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
133 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
134 delete m->array;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
135 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
136
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
137 extern "C" octave_base_value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
138 octave_jit_grab_any (octave_base_value *obv)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
139 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
140 obv->grab ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
141 return obv;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
142 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
143
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
144 extern "C" jit_matrix
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
145 octave_jit_grab_matrix (jit_matrix *m)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
146 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
147 return *m->array;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
148 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
149
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
150 extern "C" octave_base_value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
151 octave_jit_cast_any_matrix (jit_matrix *m)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
152 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
153 octave_value ret (*m->array);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
154 octave_base_value *rep = ret.internal_rep ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
155 rep->grab ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
156 delete m->array;
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
157
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
158 return rep;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
159 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
160
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
161 extern "C" jit_matrix
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
162 octave_jit_cast_matrix_any (octave_base_value *obv)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
163 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
164 NDArray m = obv->array_value ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
165 obv->release ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
166 return m;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
167 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
168
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
169 extern "C" octave_base_value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
170 octave_jit_cast_any_range (jit_range *rng)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
171 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
172 Range temp (*rng);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
173 octave_value ret (temp);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
174 octave_base_value *rep = ret.internal_rep ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
175 rep->grab ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
176
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
177 return rep;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
178 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
179 extern "C" jit_range
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
180 octave_jit_cast_range_any (octave_base_value *obv)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
181 {
15068
f57d7578c1a6 Support ND matrix indexing with scalar assignment in JIT.
Max Brister <max@2bass.com>
parents: 15067
diff changeset
182
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
183 jit_range r (obv->range_value ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
184 obv->release ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
185 return r;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
186 }
20535
b70cc4bd8109 begin removal of global error_state variable
John W. Eaton <jwe@octave.org>
parents: 20228
diff changeset
187
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
188 extern "C" double
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
189 octave_jit_cast_scalar_any (octave_base_value *obv)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
190 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
191 double ret = obv->double_value ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
192 obv->release ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
193 return ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
194 }
15067
df4538e3b50b ND scalar indexing in JIT.
Max Brister <max@2bass.com>
parents: 15056
diff changeset
195
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
196 extern "C" octave_base_value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
197 octave_jit_cast_any_scalar (double value)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
198 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
199 return new octave_scalar (value);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
200 }
20535
b70cc4bd8109 begin removal of global error_state variable
John W. Eaton <jwe@octave.org>
parents: 20228
diff changeset
201
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
202 extern "C" Complex
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
203 octave_jit_cast_complex_any (octave_base_value *obv)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
204 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
205 Complex ret = obv->complex_value ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
206 obv->release ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
207 return ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
208 }
15370
8355fddce815 Use sret and do not use save/restore stack (bug #37308)
Max Brister <max@2bass.com>
parents: 15337
diff changeset
209
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
210 extern "C" octave_base_value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
211 octave_jit_cast_any_complex (Complex c)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
212 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
213 if (c.imag () == 0)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
214 return new octave_scalar (c.real ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
215 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
216 return new octave_complex (c);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
217 }
15068
f57d7578c1a6 Support ND matrix indexing with scalar assignment in JIT.
Max Brister <max@2bass.com>
parents: 15067
diff changeset
218
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
219 extern "C" void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
220 octave_jit_err_nan_to_logical_conversion (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
221 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
222 octave::err_nan_to_logical_conversion ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
223 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
224
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
225 extern "C" void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
226 octave_jit_ginvalid_index (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
227 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
228 // FIXME: 0-argument form of octave::err_invalid_index removed in cset dd6345fd8a97
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
229 // Report -1 as the bad index for all occurrences.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
230 octave::err_invalid_index (static_cast<octave_idx_type> (-1));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
231 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
232
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
233 extern "C" void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
234 octave_jit_gindex_range (int nd, int dim, octave_idx_type iext,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
235 octave_idx_type ext)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
236 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
237 octave::err_index_out_of_range (nd, dim, iext, ext);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
238 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
240 extern "C" jit_matrix
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
241 octave_jit_paren_subsasgn_impl (jit_matrix *mat, octave_idx_type index,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
242 double value)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
243 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
244 NDArray *array = mat->array;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
245 if (array->numel () < index)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
246 array->resize1 (index);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
247
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
248 double *data = array->fortran_vec ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
249 data[index - 1] = value;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
250
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
251 mat->update ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
252 return *mat;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
253 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
254
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
255 static void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
256 make_indices (double *indices, octave_idx_type idx_count,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
257 Array<idx_vector>& result)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
258 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
259 result.resize (dim_vector (1, idx_count));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
260 for (octave_idx_type i = 0; i < idx_count; ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
261 result(i) = idx_vector (indices[i]);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
262 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
263
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
264 extern "C" double
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
265 octave_jit_paren_scalar (jit_matrix *mat, double *indicies,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
266 octave_idx_type idx_count)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
267 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
268 // FIXME: Replace this with a more optimal version
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
269 Array<idx_vector> idx;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
270 make_indices (indicies, idx_count, idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
271
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
272 Array<double> ret = mat->array->index (idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
273
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
274 return ret.xelem (0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
275 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
276
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
277 extern "C" jit_matrix
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
278 octave_jit_paren_scalar_subsasgn (jit_matrix *mat, double *indices,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
279 octave_idx_type idx_count, double value)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
280 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
281 // FIXME: Replace this with a more optimal version
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
282 jit_matrix ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
283
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
284 Array<idx_vector> idx;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
285 make_indices (indices, idx_count, idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
286
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
287 Matrix temp (1, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
288 temp.xelem(0) = value;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
289 mat->array->assign (idx, temp);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
290 ret.update (mat->array);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
291
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
292 return ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
293 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
294
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
295 extern "C" jit_matrix
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
296 octave_jit_paren_subsasgn_matrix_range (jit_matrix *mat, jit_range *index,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
297 double value)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
298 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
299 NDArray *array = mat->array;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
300 bool done = false;
15102
d29f2583cf7b Support end in multi indexing in JIT
Max Brister <max@2bass.com>
parents: 15096
diff changeset
301
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
302 // optimize for the simple case (no resizing and no errors)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
303 if (*array->jit_ref_count () == 1
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
304 && index->all_elements_are_ints ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
305 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
306 // this code is similar to idx_vector::fill, but we avoid allocating an
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
307 // idx_vector and its associated rep
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
308 octave_idx_type start = static_cast<octave_idx_type> (index->base) - 1;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
309 octave_idx_type step = static_cast<octave_idx_type> (index->inc);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
310 octave_idx_type nelem = index->nelem;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
311 octave_idx_type final = start + nelem * step;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
312 if (step < 0)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
313 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
314 step = -step;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
315 std::swap (final, start);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
316 }
15102
d29f2583cf7b Support end in multi indexing in JIT
Max Brister <max@2bass.com>
parents: 15096
diff changeset
317
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
318 if (start >= 0 && final < mat->slice_len)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
319 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
320 done = true;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
321
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
322 double *data = array->jit_slice_data ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
323 if (step == 1)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
324 std::fill (data + start, data + start + nelem, value);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
325 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
326 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
327 for (octave_idx_type i = start; i < final; i += step)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
328 data[i] = value;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
329 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
330 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
331 }
15893
1f076c40c133 Do not use vectorized llvm commands for complex numbers
Max Brister <max@2bass.com>
parents: 15603
diff changeset
332
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
333 if (! done)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
334 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
335 idx_vector idx (*index);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
336 NDArray avalue (dim_vector (1, 1));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
337 avalue.xelem (0) = value;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
338 array->assign (idx, avalue);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
339 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
340
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
341 jit_matrix ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
342 ret.update (array);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
343 return ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
344 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
345
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
346 extern "C" double
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
347 octave_jit_end_matrix (jit_matrix *mat, octave_idx_type idx,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
348 octave_idx_type count)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
349 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
350 octave_idx_type ndim = mat->dimensions[-1];
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
351 if (ndim == count)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
352 return mat->dimensions[idx];
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
353 else if (ndim > count)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
354 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
355 if (idx == count - 1)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
356 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
357 double ret = mat->dimensions[idx];
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
358 for (octave_idx_type i = idx + 1; i < ndim; ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
359 ret *= mat->dimensions[idx];
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
360 return ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
361 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
362
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
363 return mat->dimensions[idx];
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
364 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
365 else // ndim < count
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
366 return idx < ndim ? mat->dimensions[idx] : 1;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
367 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
368
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
369 extern "C" octave_base_value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
370 octave_jit_create_undef (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
371 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
372 octave_value undef;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
373 octave_base_value *ret = undef.internal_rep ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
374 ret->grab ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
375
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
376 return ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
377 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
378
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
379 extern "C" Complex
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
380 octave_jit_complex_mul (Complex lhs, Complex rhs)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
381 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
382 if (lhs.imag () == 0 && rhs.imag() == 0)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
383 return Complex (lhs.real () * rhs.real (), 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
384
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
385 return lhs * rhs;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
386 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
387
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
388 extern "C" Complex
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
389 octave_jit_complex_div (Complex lhs, Complex rhs)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
390 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
391 // see src/OPERATORS/op-cs-cs.cc
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
392 if (rhs == 0.0)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
393 warn_divide_by_zero ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
394
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
395 return lhs / rhs;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
396 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
397
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
398 // FIXME: CP form src/xpow.cc
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
399 static inline int
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
400 xisint (double x)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
401 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
402 return (octave::math::x_nint (x) == x
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
403 && ((x >= 0 && x < std::numeric_limits<int>::max ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
404 || (x <= 0 && x > std::numeric_limits<int>::min ())));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
405 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
406
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
407 extern "C" Complex
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
408 octave_jit_pow_scalar_scalar (double lhs, double rhs)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
409 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
410 // FIXME: almost CP from src/xpow.cc
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
411 if (lhs < 0.0 && ! xisint (rhs))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
412 return std::pow (Complex (lhs), rhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
413 return std::pow (lhs, rhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
414 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
415
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
416 extern "C" Complex
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
417 octave_jit_pow_complex_complex (Complex lhs, Complex rhs)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
418 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
419 if (lhs.imag () == 0 && rhs.imag () == 0)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
420 return octave_jit_pow_scalar_scalar (lhs.real (), rhs.real ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
421 return std::pow (lhs, rhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
422 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
423
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
424 extern "C" Complex
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
425 octave_jit_pow_complex_scalar (Complex lhs, double rhs)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
426 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
427 if (lhs.imag () == 0)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
428 return octave_jit_pow_scalar_scalar (lhs.real (), rhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
429 return std::pow (lhs, rhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
430 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
431
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
432 extern "C" Complex
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
433 octave_jit_pow_scalar_complex (double lhs, Complex rhs)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
434 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
435 if (rhs.imag () == 0)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
436 return octave_jit_pow_scalar_scalar (lhs, rhs.real ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
437 return std::pow (lhs, rhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
438 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
439
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
440 extern "C" void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
441 octave_jit_print_matrix (jit_matrix *m)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
442 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
443 std::cout << *m << std::endl;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
444 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
445
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
446 OCTAVE_NORETURN static
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
447 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
448 err_bad_result (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
449 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
450 error ("incorrect type information given to the JIT compiler");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
451 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
452
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
453 // FIXME: Add support for multiple outputs
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
454 extern "C" octave_base_value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
455 octave_jit_call (octave_builtin::fcn fn, size_t nargin,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
456 octave_base_value **argin, jit_type *result_type)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
457 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
458 octave_value_list ovl (nargin);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
459 for (size_t i = 0; i < nargin; ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
460 ovl.xelem (i) = octave_value (argin[i]);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
461
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
462 ovl = fn (ovl, 1);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
463
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
464 // FIXME: Check result_type somehow
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
465 if (result_type)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
466 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
467 if (ovl.length () < 1)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
468 err_bad_result ();
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
469
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
470 octave_value result = ovl.xelem(0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
471 octave_base_value *ret = result.internal_rep ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
472 ret->grab ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
473 return ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
474 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
475
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
476 if (! (ovl.empty ()
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
477 || (ovl.length () == 1 && ovl.xelem (0).is_undefined ())))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
478 err_bad_result ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
479
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
480 return 0;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
481 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
482
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
483 // -------------------- jit_range --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
484 bool
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
485 jit_range::all_elements_are_ints () const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
486 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
487 Range r (*this);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
488 return r.all_elements_are_ints ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
489 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
490
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
491 std::ostream&
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
492 operator<< (std::ostream& os, const jit_range& rng)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
493 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
494 return os << "Range[" << rng.base << ", " << rng.limit << ", " << rng.inc
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
495 << ", " << rng.nelem << ']';
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
496 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
497
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
498 // -------------------- jit_matrix --------------------
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
499
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
500 std::ostream&
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
501 operator<< (std::ostream& os, const jit_matrix& mat)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
502 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
503 return os << "Matrix[" << mat.ref_count << ", " << mat.slice_data << ", "
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
504 << mat.slice_len << ", " << mat.dimensions << ", "
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
505 << mat.array << ']';
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
506 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
507
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
508 // -------------------- jit_type --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
509 jit_type::jit_type (const std::string& aname, jit_type *aparent,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
510 llvm::Type *allvm_type, bool askip_paren, int aid) :
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
511 mname (aname), mparent (aparent), llvm_type (allvm_type), mid (aid),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
512 mdepth (aparent ? aparent->mdepth + 1 : 0), mskip_paren (askip_paren)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
513 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
514 std::memset (msret, 0, sizeof (msret));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
515 std::memset (mpointer_arg, 0, sizeof (mpointer_arg));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
516 std::memset (mpack, 0, sizeof (mpack));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
517 std::memset (munpack, 0, sizeof (munpack));
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
518
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
519 for (size_t i = 0; i < jit_convention::length; ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
520 mpacked_type[i] = llvm_type;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
521 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
522
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
523 llvm::Type *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
524 jit_type::to_llvm_arg (void) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
525 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
526 return llvm_type ? llvm_type->getPointerTo () : nullptr;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
527 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
528
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
529 // -------------------- jit_function --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
530 jit_function::jit_function () : module (0), llvm_function (0), mresult (0),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
531 call_conv (jit_convention::length),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
532 mcan_error (false)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
533 { }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
534
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
535 jit_function::jit_function (llvm::Module *amodule,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
536 jit_convention::type acall_conv,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
537 const llvm::Twine& aname, jit_type *aresult,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
538 const std::vector<jit_type *>& aargs)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
539 : module (amodule), mresult (aresult), args (aargs), call_conv (acall_conv),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
540 mcan_error (false)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
541 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
542 llvm::SmallVector<llvm::Type *, 15> llvm_args;
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
543
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
544 llvm::Type *rtype = llvm::Type::getVoidTy (context);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
545 if (mresult)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
546 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
547 rtype = mresult->packed_type (call_conv);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
548 if (sret ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
549 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
550 llvm_args.push_back (rtype->getPointerTo ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
551 rtype = llvm::Type::getVoidTy (context);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
552 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
553 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
554
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
555 for (std::vector<jit_type *>::const_iterator iter = args.begin ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
556 iter != args.end (); ++iter)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
557 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
558 jit_type *ty = *iter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
559 assert (ty);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
560 llvm::Type *argty = ty->packed_type (call_conv);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
561 if (ty->pointer_arg (call_conv))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
562 argty = argty->getPointerTo ();
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
563
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
564 llvm_args.push_back (argty);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
565 }
15370
8355fddce815 Use sret and do not use save/restore stack (bug #37308)
Max Brister <max@2bass.com>
parents: 15337
diff changeset
566
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
567 // we mark all functinos as external linkage because this prevents llvm
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
568 // from getting rid of always inline functions
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
569 llvm::FunctionType *ft = llvm::FunctionType::get (rtype, llvm_args, false);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
570 llvm_function = llvm::Function::Create (ft, llvm::Function::ExternalLinkage,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
571 aname, module);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
572
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
573 if (sret ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
574 {
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21568
diff changeset
575 #if defined (FUNCTION_ADDATTRIBUTE_ARG_IS_ATTRIBUTES)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
576 llvm::AttrBuilder attr_builder;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
577 attr_builder.addAttribute (llvm::Attributes::StructRet);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
578 llvm::Attributes attrs = llvm::Attributes::get(context, attr_builder);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
579 llvm_function->addAttribute (1, attrs);
17031
38bcfd413db0 Handle LLVM API incoherence. Octave now works with LLVM 3.0, 3.1, and 3.2
LYH <lyh.kernel@gmail.com>
parents: 16892
diff changeset
580 #else
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
581 llvm_function->addAttribute (1, llvm::Attribute::StructRet);
17031
38bcfd413db0 Handle LLVM API incoherence. Octave now works with LLVM 3.0, 3.1, and 3.2
LYH <lyh.kernel@gmail.com>
parents: 16892
diff changeset
582 #endif
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
583 }
15370
8355fddce815 Use sret and do not use save/restore stack (bug #37308)
Max Brister <max@2bass.com>
parents: 15337
diff changeset
584
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
585 if (call_conv == jit_convention::internal)
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21568
diff changeset
586 #if defined (FUNCTION_ADDFNATTR_ARG_IS_ATTRIBUTES)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
587 llvm_function->addFnAttr (llvm::Attributes::AlwaysInline);
17031
38bcfd413db0 Handle LLVM API incoherence. Octave now works with LLVM 3.0, 3.1, and 3.2
LYH <lyh.kernel@gmail.com>
parents: 16892
diff changeset
588 #else
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
589 llvm_function->addFnAttr (llvm::Attribute::AlwaysInline);
17031
38bcfd413db0 Handle LLVM API incoherence. Octave now works with LLVM 3.0, 3.1, and 3.2
LYH <lyh.kernel@gmail.com>
parents: 16892
diff changeset
590 #endif
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
591 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
592
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
593 jit_function::jit_function (const jit_function& fn, jit_type *aresult,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
594 const std::vector<jit_type *>& aargs)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
595 : module (fn.module), llvm_function (fn.llvm_function), mresult (aresult),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
596 args (aargs), call_conv (fn.call_conv), mcan_error (fn.mcan_error)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
597 { }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
598
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
599 jit_function::jit_function (const jit_function& fn)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
600 : module (fn.module), llvm_function (fn.llvm_function), mresult (fn.mresult),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
601 args (fn.args), call_conv (fn.call_conv), mcan_error (fn.mcan_error)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
602 { }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
603
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
604 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
605 jit_function::erase (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
606 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
607 if (! llvm_function)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
608 return;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
609
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
610 llvm_function->eraseFromParent ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
611 llvm_function = 0;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
612 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
613
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
614 std::string
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
615 jit_function::name (void) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
616 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
617 return llvm_function->getName ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
618 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
619
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
620 llvm::BasicBlock *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
621 jit_function::new_block (const std::string& aname,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
622 llvm::BasicBlock *insert_before)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
623 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
624 return llvm::BasicBlock::Create (context, aname, llvm_function,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
625 insert_before);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
626 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
627
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
628 llvm::Value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
629 jit_function::call (llvm::IRBuilderD& builder,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
630 const std::vector<jit_value *>& in_args) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
631 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
632 if (! valid ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
633 throw jit_fail_exception ("Call not implemented");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
634
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
635 assert (in_args.size () == args.size ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
636 std::vector<llvm::Value *> llvm_args (args.size ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
637 for (size_t i = 0; i < in_args.size (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
638 llvm_args[i] = in_args[i]->to_llvm ();
15385
8ccb187b24e9 Erase partially created functions on JIT compilation failure (bug #37308)
Max Brister <max@2bass.com>
parents: 15370
diff changeset
639
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
640 return call (builder, llvm_args);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
641 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
642
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
643 llvm::Value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
644 jit_function::call (llvm::IRBuilderD& builder,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
645 const std::vector<llvm::Value *>& in_args) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
646 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
647 if (! valid ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
648 throw jit_fail_exception ("Call not implemented");
15385
8ccb187b24e9 Erase partially created functions on JIT compilation failure (bug #37308)
Max Brister <max@2bass.com>
parents: 15370
diff changeset
649
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
650 assert (in_args.size () == args.size ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
651 llvm::SmallVector<llvm::Value *, 10> llvm_args;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
652 llvm_args.reserve (in_args.size () + sret ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
653
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
654 llvm::BasicBlock *insert_block = builder.GetInsertBlock ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
655 llvm::Function *parent = insert_block->getParent ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
656 assert (parent);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
657
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
658 // we insert allocas inside the prelude block to prevent stack overflows
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
659 llvm::BasicBlock& prelude = parent->getEntryBlock ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
660 llvm::IRBuilder<> pre_builder (&prelude, prelude.begin ());
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
661
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
662 llvm::AllocaInst *sret_mem = nullptr;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
663 if (sret ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
664 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
665 sret_mem = pre_builder.CreateAlloca (mresult->packed_type (call_conv));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
666 llvm_args.push_back (sret_mem);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
667 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
668
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
669 for (size_t i = 0; i < in_args.size (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
670 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
671 llvm::Value *arg = in_args[i];
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
672 jit_type::convert_fn convert = args[i]->pack (call_conv);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
673 if (convert)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
674 arg = convert (builder, arg);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
675
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
676 if (args[i]->pointer_arg (call_conv))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
677 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
678 llvm::Type *ty = args[i]->packed_type (call_conv);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
679 llvm::Value *alloca = pre_builder.CreateAlloca (ty);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
680 builder.CreateStore (arg, alloca);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
681 arg = alloca;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
682 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
683
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
684 llvm_args.push_back (arg);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
685 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
686
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
687 llvm::CallInst *callinst = builder.CreateCall (llvm_function, llvm_args);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
688 llvm::Value *ret = callinst;
15056
bc32288f4a42 Support the end keyword for one dimentional indexing in JIT.
Max Brister <max@2bass.com>
parents: 15027
diff changeset
689
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
690 if (sret ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
691 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
692 #if defined (CALLINST_ADDATTRIBUTE_ARG_IS_ATTRIBUTES)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
693 llvm::AttrBuilder attr_builder;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
694 attr_builder.addAttribute(llvm::Attributes::StructRet);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
695 llvm::Attributes attrs = llvm::Attributes::get(context, attr_builder);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
696 callinst->addAttribute (1, attrs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
697 #else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
698 callinst->addAttribute (1, llvm::Attribute::StructRet);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
699 #endif
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
700 ret = builder.CreateLoad (sret_mem);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
701 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
702
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
703 if (mresult)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
704 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
705 jit_type::convert_fn unpack = mresult->unpack (call_conv);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
706 if (unpack)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
707 ret = unpack (builder, ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
708 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
709
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
710 return ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
711 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
712
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
713 llvm::Value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
714 jit_function::argument (llvm::IRBuilderD& builder, size_t idx) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
715 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
716 assert (idx < args.size ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
717
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
718 // FIXME: We should be treating arguments like a list, not a vector.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
719 // Shouldn't matter much for now, as the number of arguments shouldn't
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
720 // be much bigger than 4
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
721 llvm::Function::arg_iterator iter = llvm_function->arg_begin ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
722 if (sret ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
723 ++iter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
724
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
725 for (size_t i = 0; i < idx; ++i, ++iter);
15056
bc32288f4a42 Support the end keyword for one dimentional indexing in JIT.
Max Brister <max@2bass.com>
parents: 15027
diff changeset
726
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
727 if (args[idx]->pointer_arg (call_conv))
24241
ca25f6e48ca5 jit: Convert llvm::Function::arg_iterator to pointer explicitely
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
728 return builder.CreateLoad (&*iter);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
729
24241
ca25f6e48ca5 jit: Convert llvm::Function::arg_iterator to pointer explicitely
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
730 return &*iter;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
731 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
732
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
733 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
734 jit_function::do_return (llvm::IRBuilderD& builder, llvm::Value *rval,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
735 bool verify)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
736 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
737 assert (! rval == ! mresult);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
738
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
739 if (rval)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
740 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
741 jit_type::convert_fn convert = mresult->pack (call_conv);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
742 if (convert)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
743 rval = convert (builder, rval);
15370
8355fddce815 Use sret and do not use save/restore stack (bug #37308)
Max Brister <max@2bass.com>
parents: 15337
diff changeset
744
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
745 if (sret ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
746 {
24241
ca25f6e48ca5 jit: Convert llvm::Function::arg_iterator to pointer explicitely
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
747 builder.CreateStore (rval, &*(llvm_function->arg_begin ()));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
748 builder.CreateRetVoid ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
749 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
750 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
751 builder.CreateRet (rval);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
752 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
753 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
754 builder.CreateRetVoid ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
755
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
756 if (verify)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
757 llvm::verifyFunction (*llvm_function);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
758 }
15370
8355fddce815 Use sret and do not use save/restore stack (bug #37308)
Max Brister <max@2bass.com>
parents: 15337
diff changeset
759
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
760 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
761 jit_function::do_add_mapping (llvm::ExecutionEngine *engine, void *fn)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
762 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
763 assert (valid ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
764 engine->addGlobalMapping (llvm_function, fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
765 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
766
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
767 std::ostream&
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
768 operator<< (std::ostream& os, const jit_function& fn)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
769 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
770 llvm::Function *lfn = fn.to_llvm ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
771 os << "jit_function: cc=" << fn.call_conv;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
772 llvm::raw_os_ostream llvm_out (os);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
773 lfn->print (llvm_out);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
774 llvm_out.flush ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
775 return os;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
776 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
777
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
778 // -------------------- jit_operation --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
779 jit_operation::~jit_operation (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
780 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
781 for (generated_map::iterator iter = generated.begin ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
782 iter != generated.end (); ++iter)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
783 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
784 delete iter->first;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
785 delete iter->second;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
786 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
787 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
788
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
789 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
790 jit_operation::add_overload (const jit_function& func,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
791 const std::vector<jit_type*>& args)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
792 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
793 if (args.size () >= overloads.size ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
794 overloads.resize (args.size () + 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
795
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
796 Array<jit_function>& over = overloads[args.size ()];
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
797 dim_vector dv (over.dims ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
798 Array<octave_idx_type> idx = to_idx (args);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
799 bool must_resize = false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
800
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
801 if (dv.length () != idx.numel ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
802 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
803 dv.resize (idx.numel ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
804 must_resize = true;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
805 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
806
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
807 for (octave_idx_type i = 0; i < dv.length (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
808 if (dv(i) <= idx(i))
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
809 {
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
810 must_resize = true;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
811 dv(i) = idx(i) + 1;
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
812 }
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
813
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
814 if (must_resize)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
815 over.resize (dv);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
816
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
817 over(idx) = func;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
818 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
819
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
820 const jit_function&
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
821 jit_operation::overload (const std::vector<jit_type*>& types) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
822 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
823 static jit_function null_overload;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
824 for (size_t i = 0; i < types.size (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
825 if (! types[i])
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
826 return null_overload;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
827
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
828 if (types.size () >= overloads.size ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
829 return do_generate (types);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
830
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
831 const Array<jit_function>& over = overloads[types.size ()];
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
832 dim_vector dv (over.dims ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
833 Array<octave_idx_type> idx = to_idx (types);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
834 for (octave_idx_type i = 0; i < dv.length (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
835 if (idx(i) >= dv(i))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
836 return do_generate (types);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
837
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
838 const jit_function& ret = over(idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
839 if (! ret.valid ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
840 return do_generate (types);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
841
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
842 return ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
843 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
844
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
845 Array<octave_idx_type>
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
846 jit_operation::to_idx (const std::vector<jit_type*>& types) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
847 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
848 octave_idx_type numel = types.size ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
849 numel = std::max (numel, static_cast<octave_idx_type>(2));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
850
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
851 Array<octave_idx_type> idx (dim_vector (1, numel));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
852 for (octave_idx_type i = 0; i < static_cast<octave_idx_type> (types.size ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
853 ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
854 idx(i) = types[i]->type_id ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
855
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
856 if (types.size () == 0)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
857 idx(0) = idx(1) = 0;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
858 if (types.size () == 1)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
859 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
860 idx(1) = idx(0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
861 idx(0) = 0;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
862 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
863
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
864 return idx;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
865 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
866
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
867 const jit_function&
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
868 jit_operation::do_generate (const signature_vec& types) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
869 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
870 static jit_function null_overload;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
871 generated_map::const_iterator find = generated.find (&types);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
872 if (find != generated.end ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
873 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
874 if (find->second)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
875 return *find->second;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
876 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
877 return null_overload;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
878 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
879
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
880 jit_function *ret = generate (types);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
881 generated[new signature_vec (types)] = ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
882 return ret ? *ret : null_overload;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
883 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
884
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
885 jit_function *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
886 jit_operation::generate (const signature_vec&) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
887 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
888 return 0;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
889 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
890
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
891 bool
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
892 jit_operation::signature_cmp::operator () (const signature_vec *lhs,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
893 const signature_vec *rhs) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
894 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
895 const signature_vec& l = *lhs;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
896 const signature_vec& r = *rhs;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
897
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
898 if (l.size () < r.size ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
899 return true;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
900 else if (l.size () > r.size ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
901 return false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
902
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
903 for (size_t i = 0; i < l.size (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
904 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
905 if (l[i]->type_id () < r[i]->type_id ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
906 return true;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
907 else if (l[i]->type_id () > r[i]->type_id ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
908 return false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
909 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
910
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
911 return false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
912 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
913
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
914 // -------------------- jit_index_operation --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
915 jit_function *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
916 jit_index_operation::generate (const signature_vec& types) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
917 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
918 if (types.size () > 2 && types[0] == jit_typeinfo::get_matrix ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
919 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
920 // indexing a matrix with scalars
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
921 jit_type *scalar = jit_typeinfo::get_scalar ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
922 for (size_t i = 1; i < types.size (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
923 if (types[i] != scalar)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
924 return 0;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
925
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
926 return generate_matrix (types);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
927 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
928
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
929 return 0;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
930 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
931
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
932 llvm::Value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
933 jit_index_operation::create_arg_array (llvm::IRBuilderD& builder,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
934 const jit_function& fn, size_t start_idx,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
935 size_t end_idx) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
936 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
937 size_t n = end_idx - start_idx;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
938 llvm::Type *scalar_t = jit_typeinfo::get_scalar_llvm ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
939 llvm::ArrayType *array_t = llvm::ArrayType::get (scalar_t, n);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
940 llvm::Value *array = llvm::UndefValue::get (array_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
941 for (size_t i = start_idx; i < end_idx; ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
942 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
943 llvm::Value *idx = fn.argument (builder, i);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
944 array = builder.CreateInsertValue (array, idx, i - start_idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
945 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
946
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
947 llvm::Value *array_mem = builder.CreateAlloca (array_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
948 builder.CreateStore (array, array_mem);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
949 return builder.CreateBitCast (array_mem, scalar_t->getPointerTo ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
950 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
951
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
952 // -------------------- jit_paren_subsref --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
953 jit_function *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
954 jit_paren_subsref::generate_matrix (const signature_vec& types) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
955 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
956 std::stringstream ss;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
957 ss << "jit_paren_subsref_matrix_scalar" << (types.size () - 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
958
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
959 jit_type *scalar = jit_typeinfo::get_scalar ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
960 jit_function *fn = new jit_function (module, jit_convention::internal,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
961 ss.str (), scalar, types);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
962 fn->mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
963 llvm::BasicBlock *body = fn->new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
964 llvm::IRBuilder<> builder (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
965
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
966 llvm::Value *array = create_arg_array (builder, *fn, 1, types.size ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
967 jit_type *index = jit_typeinfo::get_index ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
968 llvm::Value *nelem = llvm::ConstantInt::get (index->to_llvm (),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
969 types.size () - 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
970 llvm::Value *mat = fn->argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
971 llvm::Value *ret = paren_scalar.call (builder, mat, array, nelem);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
972 fn->do_return (builder, ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
973 return fn;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
974 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
975
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
976 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
977 jit_paren_subsref::do_initialize (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
978 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
979 std::vector<jit_type *> types (3);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
980 types[0] = jit_typeinfo::get_matrix ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
981 types[1] = jit_typeinfo::get_scalar_ptr ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
982 types[2] = jit_typeinfo::get_index ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
983
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
984 jit_type *scalar = jit_typeinfo::get_scalar ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
985 paren_scalar = jit_function (module, jit_convention::external,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
986 "octave_jit_paren_scalar", scalar, types);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
987 paren_scalar.add_mapping (engine, &octave_jit_paren_scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
988 paren_scalar.mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
989 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
990
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
991 // -------------------- jit_paren_subsasgn --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
992 jit_function *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
993 jit_paren_subsasgn::generate_matrix (const signature_vec& types) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
994 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
995 std::stringstream ss;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
996 ss << "jit_paren_subsasgn_matrix_scalar" << (types.size () - 2);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
997
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
998 jit_type *matrix = jit_typeinfo::get_matrix ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
999 jit_function *fn = new jit_function (module, jit_convention::internal,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1000 ss.str (), matrix, types);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1001 fn->mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1002 llvm::BasicBlock *body = fn->new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1003 llvm::IRBuilder<> builder (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1004
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1005 llvm::Value *array = create_arg_array (builder, *fn, 1, types.size () - 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1006 jit_type *index = jit_typeinfo::get_index ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1007 llvm::Value *nelem = llvm::ConstantInt::get (index->to_llvm (),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1008 types.size () - 2);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1009
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1010 llvm::Value *mat = fn->argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1011 llvm::Value *value = fn->argument (builder, types.size () - 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1012 llvm::Value *ret = paren_scalar.call (builder, mat, array, nelem, value);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1013 fn->do_return (builder, ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1014 return fn;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1015 }
15370
8355fddce815 Use sret and do not use save/restore stack (bug #37308)
Max Brister <max@2bass.com>
parents: 15337
diff changeset
1016
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1017 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1018 jit_paren_subsasgn::do_initialize (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1019 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1020 if (paren_scalar.valid ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1021 return;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1022
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1023 jit_type *matrix = jit_typeinfo::get_matrix ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1024 std::vector<jit_type *> types (4);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1025 types[0] = matrix;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1026 types[1] = jit_typeinfo::get_scalar_ptr ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1027 types[2] = jit_typeinfo::get_index ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1028 types[3] = jit_typeinfo::get_scalar ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1029
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1030 paren_scalar = jit_function (module, jit_convention::external,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1031 "octave_jit_paren_scalar", matrix, types);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1032 paren_scalar.add_mapping (engine, &octave_jit_paren_scalar_subsasgn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1033 paren_scalar.mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1034 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1035
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1036 // -------------------- jit_typeinfo --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1037 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1038 jit_typeinfo::initialize (llvm::Module *m, llvm::ExecutionEngine *e)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1039 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1040 new jit_typeinfo (m, e);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1041 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1042
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1043 // wrap function names to simplify jit_typeinfo::create_external
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1044 #define JIT_FN(fn) engine, &fn, #fn
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1045
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1046 jit_typeinfo::jit_typeinfo (llvm::Module *m, llvm::ExecutionEngine *e)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1047 : module (m), engine (e), next_id (0),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1048 builder (*new llvm::IRBuilderD (context))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1049 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1050 instance = this;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1051
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1052 // FIXME: We should be registering types like in octave_value_typeinfo
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1053 llvm::Type *any_t = llvm::StructType::create (context, "octave_base_value");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1054 any_t = any_t->getPointerTo ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1055
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1056 llvm::Type *scalar_t = llvm::Type::getDoubleTy (context);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1057 llvm::Type *bool_t = llvm::Type::getInt1Ty (context);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1058 llvm::Type *string_t = llvm::Type::getInt8Ty (context);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1059 string_t = string_t->getPointerTo ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1060 llvm::Type *index_t = llvm::Type::getIntNTy (context,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1061 sizeof(octave_idx_type) * 8);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1062
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1063 llvm::StructType *range_t = llvm::StructType::create (context, "range");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1064 std::vector<llvm::Type *> range_contents (4, scalar_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1065 range_contents[3] = index_t;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1066 range_t->setBody (range_contents);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1067
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1068 llvm::Type *refcount_t = llvm::Type::getIntNTy (context, sizeof(int) * 8);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1069
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1070 llvm::StructType *matrix_t = llvm::StructType::create (context, "matrix");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1071 llvm::Type *matrix_contents[5];
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1072 matrix_contents[0] = refcount_t->getPointerTo ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1073 matrix_contents[1] = scalar_t->getPointerTo ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1074 matrix_contents[2] = index_t;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1075 matrix_contents[3] = index_t->getPointerTo ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1076 matrix_contents[4] = string_t;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1077 matrix_t->setBody (llvm::makeArrayRef (matrix_contents, 5));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1078
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1079 llvm::Type *complex_t = llvm::ArrayType::get (scalar_t, 2);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1080
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1081 // complex_ret is what is passed to C functions in order to get calling
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1082 // convention right
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1083 llvm::Type *cmplx_inner_cont[] = {scalar_t, scalar_t};
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1084 llvm::StructType *cmplx_inner = llvm::StructType::create (cmplx_inner_cont);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1085
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1086 complex_ret = llvm::StructType::create (context, "complex_ret");
15370
8355fddce815 Use sret and do not use save/restore stack (bug #37308)
Max Brister <max@2bass.com>
parents: 15337
diff changeset
1087 {
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1088 llvm::Type *contents[] = {cmplx_inner};
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1089 complex_ret->setBody (contents);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1090 }
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1091
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1092 // create types
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1093 any = new_type ("any", 0, any_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1094 matrix = new_type ("matrix", any, matrix_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1095 complex = new_type ("complex", any, complex_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1096 scalar = new_type ("scalar", complex, scalar_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1097 scalar_ptr = new_type ("scalar_ptr", 0, scalar_t->getPointerTo ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1098 any_ptr = new_type ("any_ptr", 0, any_t->getPointerTo ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1099 range = new_type ("range", any, range_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1100 string = new_type ("string", any, string_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1101 boolean = new_type ("bool", any, bool_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1102 index = new_type ("index", any, index_t);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1103
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1104 create_int (8);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1105 create_int (16);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1106 create_int (32);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1107 create_int (64);
15019
ae3670d4df29 Update the execution engine's global mapping for external functions
Max Brister <max@2bass.com>
parents: 15016
diff changeset
1108
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1109 casts.resize (next_id + 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1110 identities.resize (next_id + 1);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1111
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1112 // specify calling conventions
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1113 // FIXME: We should detect architecture and do something sane based on that
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1114 // here we assume x86 or x86_64
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1115 matrix->mark_sret (jit_convention::external);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1116 matrix->mark_pointer_arg (jit_convention::external);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1117
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1118 range->mark_sret (jit_convention::external);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1119 range->mark_pointer_arg (jit_convention::external);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1120
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1121 complex->set_pack (jit_convention::external, &jit_typeinfo::pack_complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1122 complex->set_unpack (jit_convention::external, &jit_typeinfo::unpack_complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1123 complex->set_packed_type (jit_convention::external, complex_ret);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1124
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1125 if (sizeof (void *) == 4)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1126 complex->mark_sret (jit_convention::external);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1127
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1128 paren_subsref_fn.initialize (module, engine);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1129 paren_subsasgn_fn.initialize (module, engine);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1130
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1131 // bind global variables
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1132 lerror_state = new llvm::GlobalVariable (*module, bool_t, false,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1133 llvm::GlobalValue::ExternalLinkage,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1134 0, "error_state");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1135 engine->addGlobalMapping (lerror_state,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1136 reinterpret_cast<void *> (&error_state));
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1137
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1138 // sig_atomic_type is going to be some sort of integer
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1139 sig_atomic_type = llvm::Type::getIntNTy (context, sizeof(sig_atomic_t) * 8);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1140 loctave_interrupt_state
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1141 = new llvm::GlobalVariable (*module, sig_atomic_type, false,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1142 llvm::GlobalValue::ExternalLinkage, 0,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1143 "octave_interrupt_state");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1144 engine->addGlobalMapping (loctave_interrupt_state,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1145 reinterpret_cast<void *> (&octave_interrupt_state));
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1146
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1147 // generic call function
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1148 {
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1149 jit_type *int_t = intN (sizeof (octave_builtin::fcn) * 8);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1150 any_call = create_external (JIT_FN (octave_jit_call), any, int_t, int_t,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1151 any_ptr, int_t);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1152 }
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1153
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1154 // any with anything is an any op
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1155 jit_function fn;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1156 jit_type *binary_op_type = intN (sizeof (octave_value::binary_op) * 8);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1157 llvm::Type *llvm_bo_type = binary_op_type->to_llvm ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1158 jit_function any_binary = create_external (JIT_FN (octave_jit_binary_any_any),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1159 any, binary_op_type, any, any);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1160 any_binary.mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1161 binary_ops.resize (octave_value::num_binary_ops);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1162 for (size_t i = 0; i < octave_value::num_binary_ops; ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1163 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1164 octave_value::binary_op op = static_cast<octave_value::binary_op> (i);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1165 std::string op_name = octave_value::binary_op_as_string (op);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1166 binary_ops[i].stash_name ("binary" + op_name);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1167 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1168
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1169 unary_ops.resize (octave_value::num_unary_ops);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1170 for (size_t i = 0; i < octave_value::num_unary_ops; ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1171 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1172 octave_value::unary_op op = static_cast<octave_value::unary_op> (i);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1173 std::string op_name = octave_value::unary_op_as_string (op);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1174 unary_ops[i].stash_name ("unary" + op_name);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1175 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1176
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1177 for (int op = 0; op < octave_value::num_binary_ops; ++op)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1178 {
24242
545657c20e60 jit: jit-typeinfo.cc: Do not use assignment with llvm::Twine objects
Julien Bect <jbect@users.sourceforge.net>
parents: 24241
diff changeset
1179 const llvm::Twine &fn_name =
545657c20e60 jit: jit-typeinfo.cc: Do not use assignment with llvm::Twine objects
Julien Bect <jbect@users.sourceforge.net>
parents: 24241
diff changeset
1180 "octave_jit_binary_any_any_" + llvm::Twine (op);
545657c20e60 jit: jit-typeinfo.cc: Do not use assignment with llvm::Twine objects
Julien Bect <jbect@users.sourceforge.net>
parents: 24241
diff changeset
1181
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1182 fn = create_internal (fn_name, any, any, any);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1183 fn.mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1184 llvm::BasicBlock *block = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1185 builder.SetInsertPoint (block);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1186 llvm::APInt op_int(sizeof (octave_value::binary_op) * 8, op,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1187 std::numeric_limits<octave_value::binary_op>::is_signed);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1188 llvm::Value *op_as_llvm = llvm::ConstantInt::get (llvm_bo_type, op_int);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1189 llvm::Value *ret = any_binary.call (builder, op_as_llvm,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1190 fn.argument (builder, 0),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1191 fn.argument (builder, 1));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1192 fn.do_return (builder, ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1193 binary_ops[op].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1194 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1195
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1196 // grab matrix
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1197 fn = create_external (JIT_FN (octave_jit_grab_matrix), matrix, matrix);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1198 grab_fn.add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1199
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1200 grab_fn.add_overload (create_identity (scalar));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1201 grab_fn.add_overload (create_identity (scalar_ptr));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1202 grab_fn.add_overload (create_identity (any_ptr));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1203 grab_fn.add_overload (create_identity (boolean));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1204 grab_fn.add_overload (create_identity (complex));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1205 grab_fn.add_overload (create_identity (index));
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1206
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1207 // release any
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1208 fn = create_external (JIT_FN (octave_jit_release_any), 0, any);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1209 release_fn.add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1210 release_fn.stash_name ("release");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1211
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1212 // release matrix
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1213 fn = create_external (JIT_FN (octave_jit_release_matrix), 0, matrix);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1214 release_fn.add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1215
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1216 // destroy
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1217 destroy_fn = release_fn;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1218 destroy_fn.stash_name ("destroy");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1219 destroy_fn.add_overload (create_identity(scalar));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1220 destroy_fn.add_overload (create_identity(boolean));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1221 destroy_fn.add_overload (create_identity(index));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1222 destroy_fn.add_overload (create_identity(complex));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1223
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1224 // -------------------- scalar related operations --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1225
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1226 // now for binary scalar operations
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1227 add_binary_op (scalar, octave_value::op_add, llvm::Instruction::FAdd);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1228 add_binary_op (scalar, octave_value::op_sub, llvm::Instruction::FSub);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1229 add_binary_op (scalar, octave_value::op_mul, llvm::Instruction::FMul);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1230 add_binary_op (scalar, octave_value::op_el_mul, llvm::Instruction::FMul);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1231
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1232 add_binary_fcmp (scalar, octave_value::op_lt, llvm::CmpInst::FCMP_ULT);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1233 add_binary_fcmp (scalar, octave_value::op_le, llvm::CmpInst::FCMP_ULE);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1234 add_binary_fcmp (scalar, octave_value::op_eq, llvm::CmpInst::FCMP_UEQ);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1235 add_binary_fcmp (scalar, octave_value::op_ge, llvm::CmpInst::FCMP_UGE);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1236 add_binary_fcmp (scalar, octave_value::op_gt, llvm::CmpInst::FCMP_UGT);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1237 add_binary_fcmp (scalar, octave_value::op_ne, llvm::CmpInst::FCMP_UNE);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1238
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1239 jit_function gripe_div0 = create_external (JIT_FN (warn_divide_by_zero), 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1240 gripe_div0.mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1241
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1242 // divide is annoying because it might error
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1243 fn = create_internal ("octave_jit_div_scalar_scalar", scalar, scalar, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1244 fn.mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1245
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1246 llvm::BasicBlock *body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1247 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1248 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1249 llvm::BasicBlock *warn_block = fn.new_block ("warn");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1250 llvm::BasicBlock *normal_block = fn.new_block ("normal");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1251
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1252 llvm::Value *zero = llvm::ConstantFP::get (scalar_t, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1253 llvm::Value *check = builder.CreateFCmpUEQ (zero, fn.argument (builder, 1));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1254 builder.CreateCondBr (check, warn_block, normal_block);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1255
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1256 builder.SetInsertPoint (warn_block);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1257 gripe_div0.call (builder);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1258 builder.CreateBr (normal_block);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1259
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1260 builder.SetInsertPoint (normal_block);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1261 llvm::Value *ret = builder.CreateFDiv (fn.argument (builder, 0),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1262 fn.argument (builder, 1));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1263 fn.do_return (builder, ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1264 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1265 binary_ops[octave_value::op_div].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1266 binary_ops[octave_value::op_el_div].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1267
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1268 // ldiv is the same as div with the operators reversed
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1269 fn = mirror_binary (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1270 binary_ops[octave_value::op_ldiv].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1271 binary_ops[octave_value::op_el_ldiv].add_overload (fn);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1272
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1273 // In general, the result of scalar ^ scalar is a complex number. We might
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1274 // be able to improve on this if we keep track of the range of values
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1275 // variables can take on.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1276 fn = create_external (JIT_FN (octave_jit_pow_scalar_scalar), complex, scalar,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1277 scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1278 binary_ops[octave_value::op_pow].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1279 binary_ops[octave_value::op_el_pow].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1280
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1281 // now for unary scalar operations
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1282 // FIXME: Impelment not
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1283 fn = create_internal ("octave_jit_++", scalar, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1284 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1285 builder.SetInsertPoint (body);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1286 {
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1287 llvm::Value *one = llvm::ConstantFP::get (scalar_t, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1288 llvm::Value *val = fn.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1289 val = builder.CreateFAdd (val, one);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1290 fn.do_return (builder, val);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1291 }
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1292 unary_ops[octave_value::op_incr].add_overload (fn);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1293
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1294 fn = create_internal ("octave_jit_--", scalar, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1295 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1296 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1297 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1298 llvm::Value *one = llvm::ConstantFP::get (scalar_t, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1299 llvm::Value *val = fn.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1300 val = builder.CreateFSub (val, one);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1301 fn.do_return (builder, val);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1302 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1303 unary_ops[octave_value::op_decr].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1304
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1305 fn = create_internal ("octave_jit_uminus", scalar, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1306 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1307 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1308 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1309 llvm::Value *mone = llvm::ConstantFP::get (scalar_t, -1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1310 llvm::Value *val = fn.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1311 val = builder.CreateFMul (val, mone);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1312 fn.do_return (builder, val);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1313 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1314 unary_ops[octave_value::op_uminus].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1315
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1316 fn = create_identity (scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1317 unary_ops[octave_value::op_uplus].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1318 unary_ops[octave_value::op_transpose].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1319 unary_ops[octave_value::op_hermitian].add_overload (fn);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1320
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1321 // now for binary complex operations
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1322 fn = create_internal ("octave_jit_+_complex_complex", complex, complex,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1323 complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1324 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1325 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1326 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1327 llvm::Value *lhs = fn.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1328 llvm::Value *rhs = fn.argument (builder, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1329 llvm::Value *real = builder.CreateFAdd (complex_real (lhs),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1330 complex_real (rhs));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1331 llvm::Value *imag = builder.CreateFAdd (complex_imag (lhs),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1332 complex_imag (rhs));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1333 fn.do_return (builder, complex_new (real, imag));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1334 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1335 binary_ops[octave_value::op_add].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1336
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1337 fn = create_internal ("octave_jit_-_complex_complex", complex, complex,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1338 complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1339 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1340 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1341 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1342 llvm::Value *lhs = fn.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1343 llvm::Value *rhs = fn.argument (builder, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1344 llvm::Value *real = builder.CreateFSub (complex_real (lhs),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1345 complex_real (rhs));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1346 llvm::Value *imag = builder.CreateFSub (complex_imag (lhs),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1347 complex_imag (rhs));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1348 fn.do_return (builder, complex_new (real, imag));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1349 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1350 binary_ops[octave_value::op_sub].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1351
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1352 fn = create_external (JIT_FN (octave_jit_complex_mul),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1353 complex, complex, complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1354 binary_ops[octave_value::op_mul].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1355 binary_ops[octave_value::op_el_mul].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1356
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1357 jit_function complex_div = create_external (JIT_FN (octave_jit_complex_div),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1358 complex, complex, complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1359 complex_div.mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1360 binary_ops[octave_value::op_div].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1361 binary_ops[octave_value::op_ldiv].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1362
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1363 fn = create_external (JIT_FN (octave_jit_pow_complex_complex), complex,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1364 complex, complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1365 binary_ops[octave_value::op_pow].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1366 binary_ops[octave_value::op_el_pow].add_overload (fn);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1367
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1368 fn = create_internal ("octave_jit_*_scalar_complex", complex, scalar,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1369 complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1370 jit_function mul_scalar_complex = fn;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1371 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1372 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1373 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1374 llvm::BasicBlock *complex_mul = fn.new_block ("complex_mul");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1375 llvm::BasicBlock *scalar_mul = fn.new_block ("scalar_mul");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1376
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1377 llvm::Value *fzero = llvm::ConstantFP::get (scalar_t, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1378 llvm::Value *lhs = fn.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1379 llvm::Value *rhs = fn.argument (builder, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1380
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1381 llvm::Value *cmp = builder.CreateFCmpUEQ (complex_imag (rhs), fzero);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1382 builder.CreateCondBr (cmp, scalar_mul, complex_mul);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1383
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1384 builder.SetInsertPoint (scalar_mul);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1385 llvm::Value *temp = complex_real (rhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1386 temp = builder.CreateFMul (lhs, temp);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1387 fn.do_return (builder, complex_new (temp, fzero), false);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1388
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1389 builder.SetInsertPoint (complex_mul);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1390 temp = complex_new (builder.CreateFMul (lhs, complex_real (rhs)),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1391 builder.CreateFMul (lhs, complex_imag (rhs)));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1392 fn.do_return (builder, temp);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1393 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1394 binary_ops[octave_value::op_mul].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1395 binary_ops[octave_value::op_el_mul].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1396
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1397 fn = mirror_binary (mul_scalar_complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1398 binary_ops[octave_value::op_mul].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1399 binary_ops[octave_value::op_el_mul].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1400
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1401 fn = create_internal ("octave_jit_+_scalar_complex", complex, scalar,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1402 complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1403 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1404 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1405 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1406 llvm::Value *lhs = fn.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1407 llvm::Value *rhs = fn.argument (builder, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1408 llvm::Value *real = builder.CreateFAdd (lhs, complex_real (rhs));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1409 fn.do_return (builder, complex_real (rhs, real));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1410 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1411 binary_ops[octave_value::op_add].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1412
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1413 fn = mirror_binary (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1414 binary_ops[octave_value::op_add].add_overload (fn);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1415
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1416 fn = create_internal ("octave_jit_-_complex_scalar", complex, complex,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1417 scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1418 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1419 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1420 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1421 llvm::Value *lhs = fn.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1422 llvm::Value *rhs = fn.argument (builder, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1423 llvm::Value *real = builder.CreateFSub (complex_real (lhs), rhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1424 fn.do_return (builder, complex_real (lhs, real));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1425 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1426 binary_ops[octave_value::op_sub].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1427
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1428 fn = create_internal ("octave_jit_-_scalar_complex", complex, scalar,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1429 complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1430 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1431 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1432 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1433 llvm::Value *lhs = fn.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1434 llvm::Value *rhs = fn.argument (builder, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1435 llvm::Value *real = builder.CreateFSub (lhs, complex_real (rhs));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1436 fn.do_return (builder, complex_real (rhs, real));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1437 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1438 binary_ops[octave_value::op_sub].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1439
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1440 fn = create_external (JIT_FN (octave_jit_pow_scalar_complex), complex, scalar,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1441 complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1442 binary_ops[octave_value::op_pow].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1443 binary_ops[octave_value::op_el_pow].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1444
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1445 fn = create_external (JIT_FN (octave_jit_pow_complex_scalar), complex,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1446 complex, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1447 binary_ops[octave_value::op_pow].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1448 binary_ops[octave_value::op_el_pow].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1449
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1450 // now for binary index operators
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1451 add_binary_op (index, octave_value::op_add, llvm::Instruction::Add);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1452
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1453 // and binary bool operators
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1454 add_binary_op (boolean, octave_value::op_el_or, llvm::Instruction::Or);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1455 add_binary_op (boolean, octave_value::op_el_and, llvm::Instruction::And);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1456
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1457 // now for printing functions
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1458 print_fn.stash_name ("print");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1459 add_print (any, reinterpret_cast<void *> (&octave_jit_print_any));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1460 add_print (scalar, reinterpret_cast<void *> (&octave_jit_print_scalar));
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1461
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1462 // initialize for loop
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1463 for_init_fn.stash_name ("for_init");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1464
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1465 fn = create_internal ("octave_jit_for_range_init", index, range);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1466 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1467 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1468 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1469 llvm::Value *zero = llvm::ConstantInt::get (index_t, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1470 fn.do_return (builder, zero);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1471 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1472 for_init_fn.add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1473
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1474 // bounds check for for loop
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1475 for_check_fn.stash_name ("for_check");
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1476
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1477 fn = create_internal ("octave_jit_for_range_check", boolean, range, index);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1478 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1479 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1480 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1481 llvm::Value *nelem
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1482 = builder.CreateExtractValue (fn.argument (builder, 0), 3);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1483 llvm::Value *idx = fn.argument (builder, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1484 llvm::Value *ret = builder.CreateICmpULT (idx, nelem);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1485 fn.do_return (builder, ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1486 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1487 for_check_fn.add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1488
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1489 // index variabe for for loop
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1490 for_index_fn.stash_name ("for_index");
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1491
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1492 fn = create_internal ("octave_jit_for_range_idx", scalar, range, index);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1493 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1494 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1495 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1496 llvm::Value *idx = fn.argument (builder, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1497 llvm::Value *didx = builder.CreateSIToFP (idx, scalar_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1498 llvm::Value *rng = fn.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1499 llvm::Value *base = builder.CreateExtractValue (rng, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1500 llvm::Value *inc = builder.CreateExtractValue (rng, 2);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1501
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1502 llvm::Value *ret = builder.CreateFMul (didx, inc);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1503 ret = builder.CreateFAdd (base, ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1504 fn.do_return (builder, ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1505 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1506 for_index_fn.add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1507
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1508 // logically true
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1509 logically_true_fn.stash_name ("logically_true");
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1510
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1511 jit_function gripe_nantl
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1512 = create_external (JIT_FN (octave_jit_err_nan_to_logical_conversion), 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1513 gripe_nantl.mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1514
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1515 fn = create_internal ("octave_jit_logically_true_scalar", boolean, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1516 fn.mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1517
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1518 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1519 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1520 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1521 llvm::BasicBlock *error_block = fn.new_block ("error");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1522 llvm::BasicBlock *normal_block = fn.new_block ("normal");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1523
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1524 llvm::Value *check = builder.CreateFCmpUNE (fn.argument (builder, 0),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1525 fn.argument (builder, 0));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1526 builder.CreateCondBr (check, error_block, normal_block);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1527
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1528 builder.SetInsertPoint (error_block);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1529 gripe_nantl.call (builder);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1530 builder.CreateBr (normal_block);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1531 builder.SetInsertPoint (normal_block);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1532
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1533 llvm::Value *zero = llvm::ConstantFP::get (scalar_t, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1534 llvm::Value *ret = builder.CreateFCmpONE (fn.argument (builder, 0), zero);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1535 fn.do_return (builder, ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1536 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1537 logically_true_fn.add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1538
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1539 // logically_true boolean
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1540 fn = create_identity (boolean);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1541 logically_true_fn.add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1542
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1543 // make_range
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1544 // FIXME: May be benificial to implement all in LLVM
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1545 make_range_fn.stash_name ("make_range");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1546 jit_function compute_nelem
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1547 = create_external (JIT_FN (octave_jit_compute_nelem),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1548 index, scalar, scalar, scalar);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1549
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1550 fn = create_internal ("octave_jit_make_range", range, scalar, scalar, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1551 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1552 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1553 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1554 llvm::Value *base = fn.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1555 llvm::Value *limit = fn.argument (builder, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1556 llvm::Value *inc = fn.argument (builder, 2);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1557 llvm::Value *nelem = compute_nelem.call (builder, base, limit, inc);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1558
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1559 llvm::Value *dzero = llvm::ConstantFP::get (scalar_t, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1560 llvm::Value *izero = llvm::ConstantInt::get (index_t, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1561 llvm::Value *rng = llvm::ConstantStruct::get (range_t, dzero, dzero, dzero,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1562 izero, NULL);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1563 rng = builder.CreateInsertValue (rng, base, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1564 rng = builder.CreateInsertValue (rng, limit, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1565 rng = builder.CreateInsertValue (rng, inc, 2);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1566 rng = builder.CreateInsertValue (rng, nelem, 3);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1567 fn.do_return (builder, rng);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1568 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1569 make_range_fn.add_overload (fn);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1570
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1571 // paren_subsref
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1572 jit_type *jit_int = intN (sizeof (int) * 8);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1573 llvm::Type *int_t = jit_int->to_llvm ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1574 jit_function ginvalid_index
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1575 = create_external (JIT_FN (octave_jit_ginvalid_index), 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1576 jit_function gindex_range = create_external (JIT_FN (octave_jit_gindex_range),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1577 0, jit_int, jit_int, index,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1578 index);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1579
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1580 fn = create_internal ("()subsref", scalar, matrix, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1581 fn.mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1582
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1583 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1584 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1585 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1586 llvm::Value *one_idx = llvm::ConstantInt::get (index_t, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1587 llvm::Value *one_int = llvm::ConstantInt::get (int_t, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1588
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1589 llvm::Value *undef = llvm::UndefValue::get (scalar_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1590 llvm::Value *mat = fn.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1591 llvm::Value *idx = fn.argument (builder, 1);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1592
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1593 // convert index to scalar to integer, and check index >= 1
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1594 llvm::Value *int_idx = builder.CreateFPToSI (idx, index_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1595 llvm::Value *check_idx = builder.CreateSIToFP (int_idx, scalar_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1596 llvm::Value *cond0 = builder.CreateFCmpUNE (idx, check_idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1597 llvm::Value *cond1 = builder.CreateICmpSLT (int_idx, one_idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1598 llvm::Value *cond = builder.CreateOr (cond0, cond1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1599
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1600 llvm::BasicBlock *done = fn.new_block ("done");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1601 llvm::BasicBlock *conv_error = fn.new_block ("conv_error", done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1602 llvm::BasicBlock *normal = fn.new_block ("normal", done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1603 builder.CreateCondBr (cond, conv_error, normal);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1604
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1605 builder.SetInsertPoint (conv_error);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1606 ginvalid_index.call (builder);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1607 builder.CreateBr (done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1608
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1609 builder.SetInsertPoint (normal);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1610 llvm::Value *len
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1611 = builder.CreateExtractValue (mat, llvm::ArrayRef<unsigned> (2));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1612 cond = builder.CreateICmpSGT (int_idx, len);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1613
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1614 llvm::BasicBlock *bounds_error = fn.new_block ("bounds_error", done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1615 llvm::BasicBlock *success = fn.new_block ("success", done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1616 builder.CreateCondBr (cond, bounds_error, success);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1617
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1618 builder.SetInsertPoint (bounds_error);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1619 gindex_range.call (builder, one_int, one_int, int_idx, len);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1620 builder.CreateBr (done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1621
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1622 builder.SetInsertPoint (success);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1623 llvm::Value *data = builder.CreateExtractValue (mat,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1624 llvm::ArrayRef<unsigned> (1));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1625 llvm::Value *gep = builder.CreateInBoundsGEP (data, int_idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1626 llvm::Value *ret = builder.CreateLoad (gep);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1627 builder.CreateBr (done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1628
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1629 builder.SetInsertPoint (done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1630
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1631 llvm::PHINode *merge = llvm::PHINode::Create (scalar_t, 3);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1632 builder.Insert (merge);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1633 merge->addIncoming (undef, conv_error);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1634 merge->addIncoming (undef, bounds_error);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1635 merge->addIncoming (ret, success);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1636 fn.do_return (builder, merge);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1637 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1638 paren_subsref_fn.add_overload (fn);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1639
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1640 // paren subsasgn
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1641 paren_subsasgn_fn.stash_name ("()subsasgn");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1642
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1643 jit_function resize_paren_subsasgn
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1644 = create_external (JIT_FN (octave_jit_paren_subsasgn_impl), matrix, matrix,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1645 index, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1646
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1647 fn = create_internal ("octave_jit_paren_subsasgn", matrix, matrix, scalar,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1648 scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1649 fn.mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1650 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1651 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1652 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1653 llvm::Value *one_idx = llvm::ConstantInt::get (index_t, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1654 llvm::Value *one_int = llvm::ConstantInt::get (int_t, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1655
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1656 llvm::Value *mat = fn.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1657 llvm::Value *idx = fn.argument (builder, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1658 llvm::Value *value = fn.argument (builder, 2);
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1659
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1660 llvm::Value *int_idx = builder.CreateFPToSI (idx, index_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1661 llvm::Value *check_idx = builder.CreateSIToFP (int_idx, scalar_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1662 llvm::Value *cond0 = builder.CreateFCmpUNE (idx, check_idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1663 llvm::Value *cond1 = builder.CreateICmpSLT (int_idx, one_idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1664 llvm::Value *cond = builder.CreateOr (cond0, cond1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1665
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1666 llvm::BasicBlock *done = fn.new_block ("done");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1667
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1668 llvm::BasicBlock *conv_error = fn.new_block ("conv_error", done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1669 llvm::BasicBlock *normal = fn.new_block ("normal", done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1670 builder.CreateCondBr (cond, conv_error, normal);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1671 builder.SetInsertPoint (conv_error);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1672 ginvalid_index.call (builder);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1673 builder.CreateBr (done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1674
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1675 builder.SetInsertPoint (normal);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1676 llvm::Value *len = builder.CreateExtractValue (mat, 2);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1677 cond0 = builder.CreateICmpSGT (int_idx, len);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1678
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1679 llvm::Value *rcount = builder.CreateExtractValue (mat, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1680 rcount = builder.CreateLoad (rcount);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1681 cond1 = builder.CreateICmpSGT (rcount, one_int);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1682 cond = builder.CreateOr (cond0, cond1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1683
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1684 llvm::BasicBlock *bounds_error = fn.new_block ("bounds_error", done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1685 llvm::BasicBlock *success = fn.new_block ("success", done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1686 builder.CreateCondBr (cond, bounds_error, success);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1687
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1688 // resize on out of bounds access
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1689 builder.SetInsertPoint (bounds_error);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1690 llvm::Value *resize_result = resize_paren_subsasgn.call (builder, mat,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1691 int_idx, value);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1692 builder.CreateBr (done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1693
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1694 builder.SetInsertPoint (success);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1695 llvm::Value *data
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1696 = builder.CreateExtractValue (mat, llvm::ArrayRef<unsigned> (1));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1697 llvm::Value *gep = builder.CreateInBoundsGEP (data, int_idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1698 builder.CreateStore (value, gep);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1699 builder.CreateBr (done);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1700
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1701 builder.SetInsertPoint (done);
15893
1f076c40c133 Do not use vectorized llvm commands for complex numbers
Max Brister <max@2bass.com>
parents: 15603
diff changeset
1702
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1703 llvm::PHINode *merge = llvm::PHINode::Create (matrix_t, 3);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1704 builder.Insert (merge);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1705 merge->addIncoming (mat, conv_error);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1706 merge->addIncoming (resize_result, bounds_error);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1707 merge->addIncoming (mat, success);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1708 fn.do_return (builder, merge);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1709 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1710 paren_subsasgn_fn.add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1711
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1712 fn = create_external (JIT_FN (octave_jit_paren_subsasgn_matrix_range), matrix,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1713 matrix, range, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1714 fn.mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1715 paren_subsasgn_fn.add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1716
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1717 end1_fn.stash_name ("end1");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1718 fn = create_internal ("octave_jit_end1_matrix", scalar, matrix, index, index);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1719 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1720 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1721 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1722 llvm::Value *mat = fn.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1723 llvm::Value *ret = builder.CreateExtractValue (mat, 2);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1724 fn.do_return (builder, builder.CreateSIToFP (ret, scalar_t));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1725 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1726 end1_fn.add_overload (fn);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1727
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1728 end_fn.stash_name ("end");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1729 fn = create_external (JIT_FN (octave_jit_end_matrix),scalar, matrix, index,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1730 index);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1731 end_fn.add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1732
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1733 // -------------------- create_undef --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1734 create_undef_fn.stash_name ("create_undef");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1735 fn = create_external (JIT_FN (octave_jit_create_undef), any);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1736 create_undef_fn.add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1737
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1738 casts[any->type_id ()].stash_name ("(any)");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1739 casts[scalar->type_id ()].stash_name ("(scalar)");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1740 casts[complex->type_id ()].stash_name ("(complex)");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1741 casts[matrix->type_id ()].stash_name ("(matrix)");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1742 casts[range->type_id ()].stash_name ("(range)");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1743
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1744 // cast any <- matrix
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1745 fn = create_external (JIT_FN (octave_jit_cast_any_matrix), any, matrix);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1746 casts[any->type_id ()].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1747
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1748 // cast matrix <- any
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1749 fn = create_external (JIT_FN (octave_jit_cast_matrix_any), matrix, any);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1750 casts[matrix->type_id ()].add_overload (fn);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1751
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1752 // cast any <- range
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1753 fn = create_external (JIT_FN (octave_jit_cast_any_range), any, range);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1754 casts[any->type_id ()].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1755
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1756 // cast range <- any
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1757 fn = create_external (JIT_FN (octave_jit_cast_range_any), range, any);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1758 casts[range->type_id ()].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1759
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1760 // cast any <- scalar
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1761 fn = create_external (JIT_FN (octave_jit_cast_any_scalar), any, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1762 casts[any->type_id ()].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1763
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1764 // cast scalar <- any
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1765 fn = create_external (JIT_FN (octave_jit_cast_scalar_any), scalar, any);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1766 casts[scalar->type_id ()].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1767
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1768 // cast any <- complex
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1769 fn = create_external (JIT_FN (octave_jit_cast_any_complex), any, complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1770 casts[any->type_id ()].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1771
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1772 // cast complex <- any
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1773 fn = create_external (JIT_FN (octave_jit_cast_complex_any), complex, any);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1774 casts[complex->type_id ()].add_overload (fn);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1775
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1776 // cast complex <- scalar
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1777 fn = create_internal ("octave_jit_cast_complex_scalar", complex, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1778 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1779 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1780 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1781 llvm::Value *zero = llvm::ConstantFP::get (scalar_t, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1782 fn.do_return (builder, complex_new (fn.argument (builder, 0), zero));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1783 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1784 casts[complex->type_id ()].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1785
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1786 // cast scalar <- complex
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1787 fn = create_internal ("octave_jit_cast_scalar_complex", scalar, complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1788 body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1789 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1790 fn.do_return (builder, complex_real (fn.argument (builder, 0)));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1791 casts[scalar->type_id ()].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1792
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1793 // cast any <- any
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1794 fn = create_identity (any);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1795 casts[any->type_id ()].add_overload (fn);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1796
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1797 // cast scalar <- scalar
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1798 fn = create_identity (scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1799 casts[scalar->type_id ()].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1800
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1801 // cast complex <- complex
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1802 fn = create_identity (complex);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1803 casts[complex->type_id ()].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1804
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1805 // -------------------- builtin functions --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1806 add_builtin ("#unknown_function");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1807 unknown_function = builtins["#unknown_function"];
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1808
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1809 add_builtin ("sin");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1810 register_intrinsic ("sin", llvm::Intrinsic::sin, scalar, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1811 register_generic ("sin", matrix, matrix);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1812
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1813 add_builtin ("cos");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1814 register_intrinsic ("cos", llvm::Intrinsic::cos, scalar, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1815 register_generic ("cos", matrix, matrix);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1816
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1817 add_builtin ("exp");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1818 register_intrinsic ("exp", llvm::Intrinsic::exp, scalar, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1819 register_generic ("exp", matrix, matrix);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1820
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1821 add_builtin ("balance");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1822 register_generic ("balance", matrix, matrix);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1823
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1824 add_builtin ("cond");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1825 register_generic ("cond", scalar, matrix);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1826
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1827 add_builtin ("det");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1828 register_generic ("det", scalar, matrix);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1829
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1830 add_builtin ("norm");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1831 register_generic ("norm", scalar, matrix);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1832
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1833 add_builtin ("rand");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1834 register_generic ("rand", matrix, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1835 register_generic ("rand", matrix, std::vector<jit_type *> (2, scalar));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1836
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1837 add_builtin ("magic");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1838 register_generic ("magic", matrix, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1839 register_generic ("magic", matrix, std::vector<jit_type *> (2, scalar));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1840
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1841 add_builtin ("eye");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1842 register_generic ("eye", matrix, scalar);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1843 register_generic ("eye", matrix, std::vector<jit_type *> (2, scalar));
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1844
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1845 add_builtin ("mod");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1846 register_generic ("mod", scalar, std::vector<jit_type *> (2, scalar));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1847
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1848 casts.resize (next_id + 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1849 jit_function any_id = create_identity (any);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1850 jit_function grab_any = create_external (JIT_FN (octave_jit_grab_any),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1851 any, any);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1852 jit_function release_any = get_release (any);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1853 std::vector<jit_type *> args;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1854 args.resize (1);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1855
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1856 for (std::map<std::string, jit_type *>::iterator iter = builtins.begin ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1857 iter != builtins.end (); ++iter)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1858 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1859 jit_type *btype = iter->second;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1860 args[0] = btype;
15370
8355fddce815 Use sret and do not use save/restore stack (bug #37308)
Max Brister <max@2bass.com>
parents: 15337
diff changeset
1861
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1862 grab_fn.add_overload (jit_function (grab_any, btype, args));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1863 release_fn.add_overload (jit_function (release_any, 0, args));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1864 casts[any->type_id ()].add_overload (jit_function (any_id, any, args));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1865
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1866 args[0] = any;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1867 casts[btype->type_id ()].add_overload (jit_function (any_id, btype,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1868 args));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1869 }
15370
8355fddce815 Use sret and do not use save/restore stack (bug #37308)
Max Brister <max@2bass.com>
parents: 15337
diff changeset
1870 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1871
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1872 const jit_function&
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1873 jit_typeinfo::do_end (jit_value *value, jit_value *idx, jit_value *count)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1874 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1875 jit_const_index *ccount = dynamic_cast<jit_const_index *> (count);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1876 if (ccount && ccount->value () == 1)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1877 return end1_fn.overload (value->type (), idx->type (), count->type ());
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1878
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1879 return end_fn.overload (value->type (), idx->type (), count->type ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1880 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1881
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1882 jit_type*
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1883 jit_typeinfo::new_type (const std::string& name, jit_type *parent,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1884 llvm::Type *llvm_type, bool skip_paren)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1885 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1886 jit_type *ret = new jit_type (name, parent, llvm_type, skip_paren, next_id++);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1887 id_to_type.push_back (ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1888 return ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1889 }
15078
fe4752f772e2 Generate ND indexing functions on demand in JIT.
Max Brister <max@2bass.com>
parents: 15068
diff changeset
1890
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1891 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1892 jit_typeinfo::add_print (jit_type *ty, void *fptr)
15135
bd6bb87e2bea Support sin, cos, and exp with matrix arguments in JIT
Max Brister <max@2bass.com>
parents: 15124
diff changeset
1893 {
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1894 std::stringstream name;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1895 name << "octave_jit_print_" << ty->name ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1896 jit_function fn = create_external (engine, fptr, name.str (),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1897 0, intN (8), ty);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1898 print_fn.add_overload (fn);
15135
bd6bb87e2bea Support sin, cos, and exp with matrix arguments in JIT
Max Brister <max@2bass.com>
parents: 15124
diff changeset
1899 }
bd6bb87e2bea Support sin, cos, and exp with matrix arguments in JIT
Max Brister <max@2bass.com>
parents: 15124
diff changeset
1900
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1901 // FIXME: cp between add_binary_op, add_binary_icmp, and add_binary_fcmp
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1902 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1903 jit_typeinfo::add_binary_op (jit_type *ty, int op, int llvm_op)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1904 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1905 std::stringstream fname;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1906 octave_value::binary_op ov_op = static_cast<octave_value::binary_op>(op);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1907 fname << "octave_jit_" << octave_value::binary_op_as_string (ov_op)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1908 << '_' << ty->name ();
15146
709e8928e68c Scalar unary operation support in JIT
Max Brister <max@2bass.com>
parents: 15136
diff changeset
1909
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1910 jit_function fn = create_internal (fname.str (), ty, ty, ty);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1911 llvm::BasicBlock *block = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1912 builder.SetInsertPoint (block);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1913 llvm::Instruction::BinaryOps temp
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1914 = static_cast<llvm::Instruction::BinaryOps>(llvm_op);
15334
8125773322d4 Error on undefined an unused variables in JIT
Max Brister <max@2bass.com>
parents: 15311
diff changeset
1915
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1916 llvm::Value *ret = builder.CreateBinOp (temp, fn.argument (builder, 0),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1917 fn.argument (builder, 1));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1918 fn.do_return (builder, ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1919 binary_ops[op].add_overload (fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1920 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1921
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1922 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1923 jit_typeinfo::add_binary_icmp (jit_type *ty, int op, int llvm_op)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1924 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1925 std::stringstream fname;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1926 octave_value::binary_op ov_op = static_cast<octave_value::binary_op>(op);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1927 fname << "octave_jit" << octave_value::binary_op_as_string (ov_op)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1928 << '_' << ty->name ();
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1929
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1930 jit_function fn = create_internal (fname.str (), boolean, ty, ty);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1931 llvm::BasicBlock *block = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1932 builder.SetInsertPoint (block);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1933 llvm::CmpInst::Predicate temp
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1934 = static_cast<llvm::CmpInst::Predicate>(llvm_op);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1935 llvm::Value *ret = builder.CreateICmp (temp, fn.argument (builder, 0),
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1936 fn.argument (builder, 1));
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1937 fn.do_return (builder, ret);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1938 binary_ops[op].add_overload (fn);
15146
709e8928e68c Scalar unary operation support in JIT
Max Brister <max@2bass.com>
parents: 15136
diff changeset
1939 }
709e8928e68c Scalar unary operation support in JIT
Max Brister <max@2bass.com>
parents: 15136
diff changeset
1940
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1941 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1942 jit_typeinfo::add_binary_fcmp (jit_type *ty, int op, int llvm_op)
15146
709e8928e68c Scalar unary operation support in JIT
Max Brister <max@2bass.com>
parents: 15136
diff changeset
1943 {
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1944 std::stringstream fname;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1945 octave_value::binary_op ov_op = static_cast<octave_value::binary_op>(op);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1946 fname << "octave_jit" << octave_value::binary_op_as_string (ov_op)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1947 << '_' << ty->name ();
15146
709e8928e68c Scalar unary operation support in JIT
Max Brister <max@2bass.com>
parents: 15136
diff changeset
1948
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1949 jit_function fn = create_internal (fname.str (), boolean, ty, ty);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1950 llvm::BasicBlock *block = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1951 builder.SetInsertPoint (block);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1952 llvm::CmpInst::Predicate temp
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1953 = static_cast<llvm::CmpInst::Predicate>(llvm_op);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1954 llvm::Value *ret = builder.CreateFCmp (temp, fn.argument (builder, 0),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1955 fn.argument (builder, 1));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1956 fn.do_return (builder, ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1957 binary_ops[op].add_overload (fn);
15893
1f076c40c133 Do not use vectorized llvm commands for complex numbers
Max Brister <max@2bass.com>
parents: 15603
diff changeset
1958 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1959
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1960 jit_function
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1961 jit_typeinfo::create_function (jit_convention::type cc, const llvm::Twine& name,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1962 jit_type *ret,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1963 const std::vector<jit_type *>& args)
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1964 {
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1965 jit_function result (module, cc, name, ret, args);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1966 return result;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1967 }
15583
0754bdfbc8fe Correct multiplication complex multiplication with NaN in JIT
Max Brister <max@2bass.com>
parents: 15385
diff changeset
1968
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1969 jit_function
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1970 jit_typeinfo::create_identity (jit_type *type)
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1971 {
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1972 size_t id = type->type_id ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1973 if (id >= identities.size ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1974 identities.resize (id + 1);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1975
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1976 if (! identities[id].valid ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1977 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1978 std::stringstream name;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1979 name << "id_" << type->name ();
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1980
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1981 jit_function fn = create_internal (name.str (), type, type);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1982 llvm::BasicBlock *body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1983 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1984 fn.do_return (builder, fn.argument (builder, 0));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1985 return identities[id] = fn;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1986 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1987
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1988 return identities[id];
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1989 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1990
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1991 llvm::Value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1992 jit_typeinfo::do_insert_error_check (llvm::IRBuilderD& abuilder)
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1993 {
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1994 return abuilder.CreateLoad (lerror_state);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1995 }
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1996
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1997 llvm::Value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
1998 jit_typeinfo::do_insert_interrupt_check (llvm::IRBuilderD& abuilder)
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
1999 {
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2000 llvm::LoadInst *val = abuilder.CreateLoad (loctave_interrupt_state);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2001 val->setVolatile (true);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2002 return abuilder.CreateICmpSGT (val, abuilder.getInt32 (0));
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2003 }
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2004
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2005 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2006 jit_typeinfo::add_builtin (const std::string& name)
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2007 {
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2008 jit_type *btype = new_type (name, any, any->to_llvm (), true);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2009 builtins[name] = btype;
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2010
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2011 octave_builtin *ov_builtin = find_builtin (name);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2012 if (ov_builtin)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2013 ov_builtin->stash_jit (*btype);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2014 }
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2015
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2016 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2017 jit_typeinfo::register_intrinsic (const std::string& name, size_t iid,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2018 jit_type *result,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2019 const std::vector<jit_type *>& args)
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2020 {
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2021 jit_type *builtin_type = builtins[name];
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2022 size_t nargs = args.size ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2023 llvm::SmallVector<llvm::Type *, 5> llvm_args (nargs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2024 for (size_t i = 0; i < nargs; ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2025 llvm_args[i] = args[i]->to_llvm ();
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2026
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2027 llvm::Intrinsic::ID id = static_cast<llvm::Intrinsic::ID> (iid);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2028 llvm::Function *ifun = llvm::Intrinsic::getDeclaration (module, id,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2029 llvm_args);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2030 std::stringstream fn_name;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2031 fn_name << "octave_jit_" << name;
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2032
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2033 std::vector<jit_type *> args1 (nargs + 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2034 args1[0] = builtin_type;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2035 std::copy (args.begin (), args.end (), args1.begin () + 1);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2036
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2037 // The first argument will be the Octave function, but we already know that
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2038 // the function call is the equivalent of the intrinsic, so we ignore it and
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2039 // call the intrinsic with the remaining arguments.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2040 jit_function fn = create_internal (fn_name.str (), result, args1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2041 llvm::BasicBlock *body = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2042 builder.SetInsertPoint (body);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2043
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2044 llvm::SmallVector<llvm::Value *, 5> fargs (nargs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2045 for (size_t i = 0; i < nargs; ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2046 fargs[i] = fn.argument (builder, i + 1);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2047
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2048 llvm::Value *ret = builder.CreateCall (ifun, fargs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2049 fn.do_return (builder, ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2050 paren_subsref_fn.add_overload (fn);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2051 }
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2052
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2053 octave_builtin *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2054 jit_typeinfo::find_builtin (const std::string& name)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2055 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2056 symbol_table& symtab = __get_symbol_table__ ("jit_typeinfo::find_builtin");
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2057
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2058 // FIXME: Finalize what we want to store in octave_builtin, then add functions
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2059 // to access these values in octave_value
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2060 octave_value ov_builtin = symtab.find (name);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2061 return dynamic_cast<octave_builtin *> (ov_builtin.internal_rep ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2062 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2063
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2064 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2065 jit_typeinfo::register_generic (const std::string& name, jit_type *result,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2066 const std::vector<jit_type *>& args)
15056
bc32288f4a42 Support the end keyword for one dimentional indexing in JIT.
Max Brister <max@2bass.com>
parents: 15027
diff changeset
2067 {
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2068 octave_builtin *builtin = find_builtin (name);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2069 if (! builtin)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2070 return;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
2071
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2072 std::vector<jit_type *> fn_args (args.size () + 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2073 fn_args[0] = builtins[name];
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2074 std::copy (args.begin (), args.end (), fn_args.begin () + 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2075 jit_function fn = create_internal (name, result, fn_args);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2076 fn.mark_can_error ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2077 llvm::BasicBlock *block = fn.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2078 builder.SetInsertPoint (block);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2079 llvm::Type *any_t = any->to_llvm ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2080 llvm::ArrayType *array_t = llvm::ArrayType::get (any_t, args.size ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2081 llvm::Value *array = llvm::UndefValue::get (array_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2082 for (size_t i = 0; i < args.size (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2083 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2084 llvm::Value *arg = fn.argument (builder, i + 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2085 jit_function agrab = get_grab (args[i]);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2086 if (agrab.valid ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2087 arg = agrab.call (builder, arg);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2088 jit_function acast = cast (any, args[i]);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2089 array = builder.CreateInsertValue (array, acast.call (builder, arg), i);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2090 }
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15019
diff changeset
2091
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2092 llvm::Value *array_mem = builder.CreateAlloca (array_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2093 builder.CreateStore (array, array_mem);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2094 array = builder.CreateBitCast (array_mem, any_t->getPointerTo ());
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2095
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2096 jit_type *jintTy = intN (sizeof (octave_builtin::fcn) * 8);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2097 llvm::Type *intTy = jintTy->to_llvm ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2098 size_t fcn_int = reinterpret_cast<size_t> (builtin->function ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2099 llvm::Value *fcn = llvm::ConstantInt::get (intTy, fcn_int);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2100 llvm::Value *nargin = llvm::ConstantInt::get (intTy, args.size ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2101 size_t result_int = reinterpret_cast<size_t> (result);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2102 llvm::Value *res_llvm = llvm::ConstantInt::get (intTy, result_int);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2103 llvm::Value *ret = any_call.call (builder, fcn, nargin, array, res_llvm);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2104
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2105 jit_function cast_result = cast (result, any);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2106 fn.do_return (builder, cast_result.call (builder, ret));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2107 paren_subsref_fn.add_overload (fn);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2108 }
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2109
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2110 jit_function
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2111 jit_typeinfo::mirror_binary (const jit_function& fn)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2112 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2113 jit_function ret = create_internal (fn.name () + "_reverse",
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2114 fn.result (), fn.argument_type (1),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2115 fn.argument_type (0));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2116 if (fn.can_error ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2117 ret.mark_can_error ();
15169
6242904370bd Support balance, cond, det, norm, rand, magic, eye, and mod in JIT
Max Brister <max@2bass.com>
parents: 15148
diff changeset
2118
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2119 llvm::BasicBlock *body = ret.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2120 builder.SetInsertPoint (body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2121 llvm::Value *result = fn.call (builder, ret.argument (builder, 1),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2122 ret.argument (builder, 0));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2123 if (ret.result ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2124 ret.do_return (builder, result);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2125 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2126 ret.do_return (builder);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2127
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2128 return ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2129 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2130
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2131 llvm::Value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2132 jit_typeinfo::pack_complex (llvm::IRBuilderD& bld, llvm::Value *cplx)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2133 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2134 llvm::Type *complex_ret = instance->complex_ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2135 llvm::Value *real = bld.CreateExtractValue (cplx, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2136 llvm::Value *imag = bld.CreateExtractValue (cplx, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2137 llvm::Value *ret = llvm::UndefValue::get (complex_ret);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2138
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2139 unsigned int re_idx[] = {0, 0};
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2140 unsigned int im_idx[] = {0, 1};
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2141 ret = bld.CreateInsertValue (ret, real, re_idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2142 return bld.CreateInsertValue (ret, imag, im_idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2143 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2144
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2145 llvm::Value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2146 jit_typeinfo::unpack_complex (llvm::IRBuilderD& bld, llvm::Value *result)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2147 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2148 unsigned int re_idx[] = {0, 0};
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2149 unsigned int im_idx[] = {0, 1};
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2150
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2151 llvm::Type *complex_t = get_complex ()->to_llvm ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2152 llvm::Value *real = bld.CreateExtractValue (result, re_idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2153 llvm::Value *imag = bld.CreateExtractValue (result, im_idx);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2154 llvm::Value *ret = llvm::UndefValue::get (complex_t);
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2155
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2156 ret = bld.CreateInsertValue (ret, real, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2157 return bld.CreateInsertValue (ret, imag, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2158 }
15370
8355fddce815 Use sret and do not use save/restore stack (bug #37308)
Max Brister <max@2bass.com>
parents: 15337
diff changeset
2159
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2160 llvm::Value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2161 jit_typeinfo::complex_real (llvm::Value *cx)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2162 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2163 return builder.CreateExtractValue (cx, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2164 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2165
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2166 llvm::Value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2167 jit_typeinfo::complex_real (llvm::Value *cx, llvm::Value *real)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2168 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2169 return builder.CreateInsertValue (cx, real, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2170 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2171
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2172 llvm::Value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2173 jit_typeinfo::complex_imag (llvm::Value *cx)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2174 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2175 return builder.CreateExtractValue (cx, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2176 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2177
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2178 llvm::Value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2179 jit_typeinfo::complex_imag (llvm::Value *cx, llvm::Value *imag)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2180 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2181 return builder.CreateInsertValue (cx, imag, 1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2182 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2183
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2184 llvm::Value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2185 jit_typeinfo::complex_new (llvm::Value *real, llvm::Value *imag)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2186 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2187 llvm::Value *ret = llvm::UndefValue::get (complex->to_llvm ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2188 ret = complex_real (ret, real);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2189 return complex_imag (ret, imag);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2190 }
15135
bd6bb87e2bea Support sin, cos, and exp with matrix arguments in JIT
Max Brister <max@2bass.com>
parents: 15124
diff changeset
2191
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2192 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2193 jit_typeinfo::create_int (size_t nbits)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2194 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2195 std::stringstream tname;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2196 tname << "int" << nbits;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2197 ints[nbits] = new_type (tname.str (), any, llvm::Type::getIntNTy (context,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2198 nbits));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2199 }
15135
bd6bb87e2bea Support sin, cos, and exp with matrix arguments in JIT
Max Brister <max@2bass.com>
parents: 15124
diff changeset
2200
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2201 jit_type *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2202 jit_typeinfo::intN (size_t nbits) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2203 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2204 std::map<size_t, jit_type *>::const_iterator iter = ints.find (nbits);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2205 if (iter != ints.end ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2206 return iter->second;
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2207
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2208 throw jit_fail_exception ("No such integer type");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2209 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2210
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2211 jit_type *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2212 jit_typeinfo::do_type_of (const octave_value& ov) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2213 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2214 if (ov.is_function ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2215 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2216 // FIXME: This is ugly, we need to finalize how we want to do this, then
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2217 // have octave_value fully support the needed functionality
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2218 octave_builtin *builtin
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2219 = dynamic_cast<octave_builtin *> (ov.internal_rep ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2220 return builtin && builtin->to_jit () ? builtin->to_jit ()
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2221 : unknown_function;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2222 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2223
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2224 if (ov.is_range ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2225 return get_range ();
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2226
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2227 if (ov.is_double_type () && ! ov.iscomplex ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2228 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2229 if (ov.is_real_scalar ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2230 return get_scalar ();
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2231
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2232 if (ov.is_matrix_type ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2233 return get_matrix ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2234 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2235
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2236 if (ov.is_complex_scalar ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2237 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2238 Complex cv = ov.complex_value ();
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2239
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2240 // We don't really represent complex values, instead we represent
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2241 // complex_or_scalar. If the imag value is zero, we assume a scalar.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2242 if (cv.imag () != 0)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2243 return get_complex ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2244 }
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2245
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2246 return get_any ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 23807
diff changeset
2247 }
15583
0754bdfbc8fe Correct multiplication complex multiplication with NaN in JIT
Max Brister <max@2bass.com>
parents: 15385
diff changeset
2248
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2249 }
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2250
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents:
diff changeset
2251 #endif