annotate gcc/jit/docs/cp/topics/expressions.rst @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1 .. Copyright (C) 2014-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
2 Originally contributed by David Malcolm <dmalcolm@redhat.com>
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 This is free software: you can redistribute it and/or modify it
kono
parents:
diff changeset
5 under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
6 the Free Software Foundation, either version 3 of the License, or
kono
parents:
diff changeset
7 (at your option) any later version.
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 This program is distributed in the hope that it will be useful, but
kono
parents:
diff changeset
10 WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
kono
parents:
diff changeset
12 General Public License for more details.
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
15 along with this program. If not, see
kono
parents:
diff changeset
16 <http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 .. default-domain:: cpp
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 Expressions
kono
parents:
diff changeset
21 ===========
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 Rvalues
kono
parents:
diff changeset
24 -------
kono
parents:
diff changeset
25 .. class:: gccjit::rvalue
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 A :class:`gccjit::rvalue` is an expression that can be computed. It is a
kono
parents:
diff changeset
28 subclass of :class:`gccjit::object`, and is a thin wrapper around
kono
parents:
diff changeset
29 :c:type:`gcc_jit_rvalue *` from the C API.
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 It can be simple, e.g.:
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 * an integer value e.g. `0` or `42`
kono
parents:
diff changeset
34 * a string literal e.g. `"Hello world"`
kono
parents:
diff changeset
35 * a variable e.g. `i`. These are also lvalues (see below).
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 or compound e.g.:
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 * a unary expression e.g. `!cond`
kono
parents:
diff changeset
40 * a binary expression e.g. `(a + b)`
kono
parents:
diff changeset
41 * a function call e.g. `get_distance (&player_ship, &target)`
kono
parents:
diff changeset
42 * etc.
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 Every rvalue has an associated type, and the API will check to ensure
kono
parents:
diff changeset
45 that types match up correctly (otherwise the context will emit an error).
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 .. function:: gccjit::type gccjit::rvalue::get_type ()
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 Get the type of this rvalue.
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 Simple expressions
kono
parents:
diff changeset
53 ******************
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
56 gccjit::context::new_rvalue (gccjit::type numeric_type, \
kono
parents:
diff changeset
57 int value) const
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 Given a numeric type (integer or floating point), build an rvalue for
kono
parents:
diff changeset
60 the given constant :c:type:`int` value.
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
63 gccjit::context::new_rvalue (gccjit::type numeric_type, \
kono
parents:
diff changeset
64 long value) const
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 Given a numeric type (integer or floating point), build an rvalue for
kono
parents:
diff changeset
67 the given constant :c:type:`long` value.
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
70 gccjit::context::zero (gccjit::type numeric_type) const
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 Given a numeric type (integer or floating point), get the rvalue for
kono
parents:
diff changeset
73 zero. Essentially this is just a shortcut for:
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 .. code-block:: c++
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 ctxt.new_rvalue (numeric_type, 0)
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
80 gccjit::context::one (gccjit::type numeric_type) const
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 Given a numeric type (integer or floating point), get the rvalue for
kono
parents:
diff changeset
83 one. Essentially this is just a shortcut for:
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 .. code-block:: c++
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 ctxt.new_rvalue (numeric_type, 1)
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
90 gccjit::context::new_rvalue (gccjit::type numeric_type, \
kono
parents:
diff changeset
91 double value) const
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 Given a numeric type (integer or floating point), build an rvalue for
kono
parents:
diff changeset
94 the given constant :c:type:`double` value.
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
97 gccjit::context::new_rvalue (gccjit::type pointer_type, \
kono
parents:
diff changeset
98 void *value) const
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 Given a pointer type, build an rvalue for the given address.
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
103 gccjit::context::new_rvalue (const std::string &value) const
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 Generate an rvalue of type :c:data:`GCC_JIT_TYPE_CONST_CHAR_PTR` for
kono
parents:
diff changeset
106 the given string. This is akin to a string literal.
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 Vector expressions
kono
parents:
diff changeset
109 ******************
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
112 gccjit::context::new_rvalue (gccjit::type vector_type, \
kono
parents:
diff changeset
113 std::vector<gccjit::rvalue> elements) const
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 Given a vector type, and a vector of scalar rvalue elements, generate a
kono
parents:
diff changeset
116 vector rvalue.
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 The number of elements needs to match that of the vector type.
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 Unary Operations
kono
parents:
diff changeset
121 ****************
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
124 gccjit::context::new_unary_op (enum gcc_jit_unary_op, \
kono
parents:
diff changeset
125 gccjit::type result_type, \
kono
parents:
diff changeset
126 gccjit::rvalue rvalue, \
kono
parents:
diff changeset
127 gccjit::location loc)
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 Build a unary operation out of an input rvalue.
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 Parameter ``loc`` is optional.
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 This is a thin wrapper around the C API's
kono
parents:
diff changeset
134 :c:func:`gcc_jit_context_new_unary_op` and the available unary
kono
parents:
diff changeset
135 operations are documented there.
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 There are shorter ways to spell the various specific kinds of unary
kono
parents:
diff changeset
138 operation:
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
141 gccjit::context::new_minus (gccjit::type result_type, \
kono
parents:
diff changeset
142 gccjit::rvalue a, \
kono
parents:
diff changeset
143 gccjit::location loc)
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 Negate an arithmetic value; for example:
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 .. code-block:: c++
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 gccjit::rvalue negpi = ctxt.new_minus (t_double, pi);
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 builds the equivalent of this C expression:
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 .. code-block:: c
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 -pi
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
158 new_bitwise_negate (gccjit::type result_type, \
kono
parents:
diff changeset
159 gccjit::rvalue a, \
kono
parents:
diff changeset
160 gccjit::location loc)
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 Bitwise negation of an integer value (one's complement); for example:
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 .. code-block:: c++
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 gccjit::rvalue mask = ctxt.new_bitwise_negate (t_int, a);
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 builds the equivalent of this C expression:
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 .. code-block:: c
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 ~a
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
175 new_logical_negate (gccjit::type result_type, \
kono
parents:
diff changeset
176 gccjit::rvalue a, \
kono
parents:
diff changeset
177 gccjit::location loc)
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 Logical negation of an arithmetic or pointer value; for example:
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 .. code-block:: c++
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 gccjit::rvalue guard = ctxt.new_logical_negate (t_bool, cond);
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 builds the equivalent of this C expression:
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 .. code-block:: c
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 !cond
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 The most concise way to spell them is with overloaded operators:
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 .. function:: gccjit::rvalue operator- (gccjit::rvalue a)
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 .. code-block:: c++
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 gccjit::rvalue negpi = -pi;
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 .. function:: gccjit::rvalue operator~ (gccjit::rvalue a)
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 .. code-block:: c++
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 gccjit::rvalue mask = ~a;
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 .. function:: gccjit::rvalue operator! (gccjit::rvalue a)
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 .. code-block:: c++
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 gccjit::rvalue guard = !cond;
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 Binary Operations
kono
parents:
diff changeset
215 *****************
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 .. function:: gccjit::rvalue\
kono
parents:
diff changeset
218 gccjit::context::new_binary_op (enum gcc_jit_binary_op, \
kono
parents:
diff changeset
219 gccjit::type result_type, \
kono
parents:
diff changeset
220 gccjit::rvalue a, \
kono
parents:
diff changeset
221 gccjit::rvalue b, \
kono
parents:
diff changeset
222 gccjit::location loc)
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 Build a binary operation out of two constituent rvalues.
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 Parameter ``loc`` is optional.
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 This is a thin wrapper around the C API's
kono
parents:
diff changeset
229 :c:func:`gcc_jit_context_new_binary_op` and the available binary
kono
parents:
diff changeset
230 operations are documented there.
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 There are shorter ways to spell the various specific kinds of binary
kono
parents:
diff changeset
233 operation:
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
236 gccjit::context::new_plus (gccjit::type result_type, \
kono
parents:
diff changeset
237 gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
238 gccjit::location loc)
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
241 gccjit::context::new_minus (gccjit::type result_type, \
kono
parents:
diff changeset
242 gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
243 gccjit::location loc)
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
246 gccjit::context::new_mult (gccjit::type result_type, \
kono
parents:
diff changeset
247 gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
248 gccjit::location loc)
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
251 gccjit::context::new_divide (gccjit::type result_type, \
kono
parents:
diff changeset
252 gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
253 gccjit::location loc)
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
256 gccjit::context::new_modulo (gccjit::type result_type, \
kono
parents:
diff changeset
257 gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
258 gccjit::location loc)
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
261 gccjit::context::new_bitwise_and (gccjit::type result_type, \
kono
parents:
diff changeset
262 gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
263 gccjit::location loc)
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
266 gccjit::context::new_bitwise_xor (gccjit::type result_type, \
kono
parents:
diff changeset
267 gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
268 gccjit::location loc)
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
271 gccjit::context::new_bitwise_or (gccjit::type result_type, \
kono
parents:
diff changeset
272 gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
273 gccjit::location loc)
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
276 gccjit::context::new_logical_and (gccjit::type result_type, \
kono
parents:
diff changeset
277 gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
278 gccjit::location loc)
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
281 gccjit::context::new_logical_or (gccjit::type result_type, \
kono
parents:
diff changeset
282 gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
283 gccjit::location loc)
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 The most concise way to spell them is with overloaded operators:
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 .. function:: gccjit::rvalue operator+ (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 .. code-block:: c++
kono
parents:
diff changeset
290
kono
parents:
diff changeset
291 gccjit::rvalue sum = a + b;
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 .. function:: gccjit::rvalue operator- (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 .. code-block:: c++
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 gccjit::rvalue diff = a - b;
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 .. function:: gccjit::rvalue operator* (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 .. code-block:: c++
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 gccjit::rvalue prod = a * b;
kono
parents:
diff changeset
304
kono
parents:
diff changeset
305 .. function:: gccjit::rvalue operator/ (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 .. code-block:: c++
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 gccjit::rvalue result = a / b;
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 .. function:: gccjit::rvalue operator% (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 .. code-block:: c++
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 gccjit::rvalue mod = a % b;
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 .. function:: gccjit::rvalue operator& (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 .. code-block:: c++
kono
parents:
diff changeset
320
kono
parents:
diff changeset
321 gccjit::rvalue x = a & b;
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 .. function:: gccjit::rvalue operator^ (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 .. code-block:: c++
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327 gccjit::rvalue x = a ^ b;
kono
parents:
diff changeset
328
kono
parents:
diff changeset
329 .. function:: gccjit::rvalue operator| (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 .. code-block:: c++
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 gccjit::rvalue x = a | b;
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 .. function:: gccjit::rvalue operator&& (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337 .. code-block:: c++
kono
parents:
diff changeset
338
kono
parents:
diff changeset
339 gccjit::rvalue cond = a && b;
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 .. function:: gccjit::rvalue operator|| (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
342
kono
parents:
diff changeset
343 .. code-block:: c++
kono
parents:
diff changeset
344
kono
parents:
diff changeset
345 gccjit::rvalue cond = a || b;
kono
parents:
diff changeset
346
kono
parents:
diff changeset
347 These can of course be combined, giving a terse way to build compound
kono
parents:
diff changeset
348 expressions:
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 .. code-block:: c++
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 gccjit::rvalue discriminant = (b * b) - (four * a * c);
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 Comparisons
kono
parents:
diff changeset
356 ***********
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
359 gccjit::context::new_comparison (enum gcc_jit_comparison,\
kono
parents:
diff changeset
360 gccjit::rvalue a, \
kono
parents:
diff changeset
361 gccjit::rvalue b, \
kono
parents:
diff changeset
362 gccjit::location loc)
kono
parents:
diff changeset
363
kono
parents:
diff changeset
364 Build a boolean rvalue out of the comparison of two other rvalues.
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 Parameter ``loc`` is optional.
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 This is a thin wrapper around the C API's
kono
parents:
diff changeset
369 :c:func:`gcc_jit_context_new_comparison` and the available kinds
kono
parents:
diff changeset
370 of comparison are documented there.
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 There are shorter ways to spell the various specific kinds of binary
kono
parents:
diff changeset
373 operation:
kono
parents:
diff changeset
374
kono
parents:
diff changeset
375 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
376 gccjit::context::new_eq (gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
377 gccjit::location loc)
kono
parents:
diff changeset
378
kono
parents:
diff changeset
379 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
380 gccjit::context::new_ne (gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
381 gccjit::location loc)
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
384 gccjit::context::new_lt (gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
385 gccjit::location loc)
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
388 gccjit::context::new_le (gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
389 gccjit::location loc)
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
392 gccjit::context::new_gt (gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
393 gccjit::location loc)
kono
parents:
diff changeset
394
kono
parents:
diff changeset
395 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
396 gccjit::context::new_ge (gccjit::rvalue a, gccjit::rvalue b, \
kono
parents:
diff changeset
397 gccjit::location loc)
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 The most concise way to spell them is with overloaded operators:
kono
parents:
diff changeset
400
kono
parents:
diff changeset
401 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
402 operator== (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 .. code-block:: c++
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 gccjit::rvalue cond = (a == ctxt.zero (t_int));
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
409 operator!= (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
410
kono
parents:
diff changeset
411 .. code-block:: c++
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 gccjit::rvalue cond = (i != j);
kono
parents:
diff changeset
414
kono
parents:
diff changeset
415 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
416 operator< (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 .. code-block:: c++
kono
parents:
diff changeset
419
kono
parents:
diff changeset
420 gccjit::rvalue cond = i < n;
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
423 operator<= (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 .. code-block:: c++
kono
parents:
diff changeset
426
kono
parents:
diff changeset
427 gccjit::rvalue cond = i <= n;
kono
parents:
diff changeset
428
kono
parents:
diff changeset
429 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
430 operator> (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
431
kono
parents:
diff changeset
432 .. code-block:: c++
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 gccjit::rvalue cond = (ch > limit);
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
437 operator>= (gccjit::rvalue a, gccjit::rvalue b)
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 .. code-block:: c++
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 gccjit::rvalue cond = (score >= ctxt.new_rvalue (t_int, 100));
kono
parents:
diff changeset
442
kono
parents:
diff changeset
443 .. TODO: beyond this point
kono
parents:
diff changeset
444
kono
parents:
diff changeset
445 Function calls
kono
parents:
diff changeset
446 **************
kono
parents:
diff changeset
447 .. function:: gcc_jit_rvalue *\
kono
parents:
diff changeset
448 gcc_jit_context_new_call (gcc_jit_context *ctxt,\
kono
parents:
diff changeset
449 gcc_jit_location *loc,\
kono
parents:
diff changeset
450 gcc_jit_function *func,\
kono
parents:
diff changeset
451 int numargs , gcc_jit_rvalue **args)
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 Given a function and the given table of argument rvalues, construct a
kono
parents:
diff changeset
454 call to the function, with the result as an rvalue.
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 .. note::
kono
parents:
diff changeset
457
kono
parents:
diff changeset
458 :func:`gccjit::context::new_call` merely builds a
kono
parents:
diff changeset
459 :class:`gccjit::rvalue` i.e. an expression that can be evaluated,
kono
parents:
diff changeset
460 perhaps as part of a more complicated expression.
kono
parents:
diff changeset
461 The call *won't* happen unless you add a statement to a function
kono
parents:
diff changeset
462 that evaluates the expression.
kono
parents:
diff changeset
463
kono
parents:
diff changeset
464 For example, if you want to call a function and discard the result
kono
parents:
diff changeset
465 (or to call a function with ``void`` return type), use
kono
parents:
diff changeset
466 :func:`gccjit::block::add_eval`:
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 .. code-block:: c++
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 /* Add "(void)printf (arg0, arg1);". */
kono
parents:
diff changeset
471 block.add_eval (ctxt.new_call (printf_func, arg0, arg1));
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 Function pointers
kono
parents:
diff changeset
474 *****************
kono
parents:
diff changeset
475
kono
parents:
diff changeset
476 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
477 gccjit::function::get_address (gccjit::location loc)
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 Get the address of a function as an rvalue, of function pointer
kono
parents:
diff changeset
480 type.
kono
parents:
diff changeset
481
kono
parents:
diff changeset
482 Type-coercion
kono
parents:
diff changeset
483 *************
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
486 gccjit::context::new_cast (gccjit::rvalue rvalue,\
kono
parents:
diff changeset
487 gccjit::type type, \
kono
parents:
diff changeset
488 gccjit::location loc)
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 Given an rvalue of T, construct another rvalue of another type.
kono
parents:
diff changeset
491
kono
parents:
diff changeset
492 Currently only a limited set of conversions are possible:
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 * int <-> float
kono
parents:
diff changeset
495 * int <-> bool
kono
parents:
diff changeset
496 * P* <-> Q*, for pointer types P and Q
kono
parents:
diff changeset
497
kono
parents:
diff changeset
498 Lvalues
kono
parents:
diff changeset
499 -------
kono
parents:
diff changeset
500
kono
parents:
diff changeset
501 .. class:: gccjit::lvalue
kono
parents:
diff changeset
502
kono
parents:
diff changeset
503 An lvalue is something that can of the *left*-hand side of an assignment:
kono
parents:
diff changeset
504 a storage area (such as a variable). It is a subclass of
kono
parents:
diff changeset
505 :class:`gccjit::rvalue`, where the rvalue is computed by reading from the
kono
parents:
diff changeset
506 storage area.
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 It iss a thin wrapper around :c:type:`gcc_jit_lvalue *` from the C API.
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
511 gccjit::lvalue::get_address (gccjit::location loc)
kono
parents:
diff changeset
512
kono
parents:
diff changeset
513 Take the address of an lvalue; analogous to:
kono
parents:
diff changeset
514
kono
parents:
diff changeset
515 .. code-block:: c
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 &(EXPR)
kono
parents:
diff changeset
518
kono
parents:
diff changeset
519 in C.
kono
parents:
diff changeset
520
kono
parents:
diff changeset
521 Parameter "loc" is optional.
kono
parents:
diff changeset
522
kono
parents:
diff changeset
523 Global variables
kono
parents:
diff changeset
524 ****************
kono
parents:
diff changeset
525
kono
parents:
diff changeset
526 .. function:: gccjit::lvalue \
kono
parents:
diff changeset
527 gccjit::context::new_global (enum gcc_jit_global_kind,\
kono
parents:
diff changeset
528 gccjit::type type, \
kono
parents:
diff changeset
529 const char *name, \
kono
parents:
diff changeset
530 gccjit::location loc)
kono
parents:
diff changeset
531
kono
parents:
diff changeset
532 Add a new global variable of the given type and name to the context.
kono
parents:
diff changeset
533
kono
parents:
diff changeset
534 This is a thin wrapper around :c:func:`gcc_jit_context_new_global` from
kono
parents:
diff changeset
535 the C API; the "kind" parameter has the same meaning as there.
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 Working with pointers, structs and unions
kono
parents:
diff changeset
538 -----------------------------------------
kono
parents:
diff changeset
539
kono
parents:
diff changeset
540 .. function:: gccjit::lvalue \
kono
parents:
diff changeset
541 gccjit::rvalue::dereference (gccjit::location loc)
kono
parents:
diff changeset
542
kono
parents:
diff changeset
543 Given an rvalue of pointer type ``T *``, dereferencing the pointer,
kono
parents:
diff changeset
544 getting an lvalue of type ``T``. Analogous to:
kono
parents:
diff changeset
545
kono
parents:
diff changeset
546 .. code-block:: c++
kono
parents:
diff changeset
547
kono
parents:
diff changeset
548 *(EXPR)
kono
parents:
diff changeset
549
kono
parents:
diff changeset
550 in C.
kono
parents:
diff changeset
551
kono
parents:
diff changeset
552 Parameter "loc" is optional.
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554 If you don't need to specify the location, this can also be expressed using
kono
parents:
diff changeset
555 an overloaded operator:
kono
parents:
diff changeset
556
kono
parents:
diff changeset
557 .. function:: gccjit::lvalue \
kono
parents:
diff changeset
558 gccjit::rvalue::operator* ()
kono
parents:
diff changeset
559
kono
parents:
diff changeset
560 .. code-block:: c++
kono
parents:
diff changeset
561
kono
parents:
diff changeset
562 gccjit::lvalue content = *ptr;
kono
parents:
diff changeset
563
kono
parents:
diff changeset
564 Field access is provided separately for both lvalues and rvalues:
kono
parents:
diff changeset
565
kono
parents:
diff changeset
566 .. function:: gccjit::lvalue \
kono
parents:
diff changeset
567 gccjit::lvalue::access_field (gccjit::field field, \
kono
parents:
diff changeset
568 gccjit::location loc)
kono
parents:
diff changeset
569
kono
parents:
diff changeset
570 Given an lvalue of struct or union type, access the given field,
kono
parents:
diff changeset
571 getting an lvalue of the field's type. Analogous to:
kono
parents:
diff changeset
572
kono
parents:
diff changeset
573 .. code-block:: c++
kono
parents:
diff changeset
574
kono
parents:
diff changeset
575 (EXPR).field = ...;
kono
parents:
diff changeset
576
kono
parents:
diff changeset
577 in C.
kono
parents:
diff changeset
578
kono
parents:
diff changeset
579 .. function:: gccjit::rvalue \
kono
parents:
diff changeset
580 gccjit::rvalue::access_field (gccjit::field field, \
kono
parents:
diff changeset
581 gccjit::location loc)
kono
parents:
diff changeset
582
kono
parents:
diff changeset
583 Given an rvalue of struct or union type, access the given field
kono
parents:
diff changeset
584 as an rvalue. Analogous to:
kono
parents:
diff changeset
585
kono
parents:
diff changeset
586 .. code-block:: c++
kono
parents:
diff changeset
587
kono
parents:
diff changeset
588 (EXPR).field
kono
parents:
diff changeset
589
kono
parents:
diff changeset
590 in C.
kono
parents:
diff changeset
591
kono
parents:
diff changeset
592 .. function:: gccjit::lvalue \
kono
parents:
diff changeset
593 gccjit::rvalue::dereference_field (gccjit::field field, \
kono
parents:
diff changeset
594 gccjit::location loc)
kono
parents:
diff changeset
595
kono
parents:
diff changeset
596 Given an rvalue of pointer type ``T *`` where T is of struct or union
kono
parents:
diff changeset
597 type, access the given field as an lvalue. Analogous to:
kono
parents:
diff changeset
598
kono
parents:
diff changeset
599 .. code-block:: c++
kono
parents:
diff changeset
600
kono
parents:
diff changeset
601 (EXPR)->field
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 in C, itself equivalent to ``(*EXPR).FIELD``.
kono
parents:
diff changeset
604
kono
parents:
diff changeset
605 .. function:: gccjit::lvalue \
kono
parents:
diff changeset
606 gccjit::context::new_array_access (gccjit::rvalue ptr, \
kono
parents:
diff changeset
607 gccjit::rvalue index, \
kono
parents:
diff changeset
608 gccjit::location loc)
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 Given an rvalue of pointer type ``T *``, get at the element `T` at
kono
parents:
diff changeset
611 the given index, using standard C array indexing rules i.e. each
kono
parents:
diff changeset
612 increment of ``index`` corresponds to ``sizeof(T)`` bytes.
kono
parents:
diff changeset
613 Analogous to:
kono
parents:
diff changeset
614
kono
parents:
diff changeset
615 .. code-block:: c++
kono
parents:
diff changeset
616
kono
parents:
diff changeset
617 PTR[INDEX]
kono
parents:
diff changeset
618
kono
parents:
diff changeset
619 in C (or, indeed, to ``PTR + INDEX``).
kono
parents:
diff changeset
620
kono
parents:
diff changeset
621 Parameter "loc" is optional.
kono
parents:
diff changeset
622
kono
parents:
diff changeset
623 For array accesses where you don't need to specify a :class:`gccjit::location`,
kono
parents:
diff changeset
624 two overloaded operators are available:
kono
parents:
diff changeset
625
kono
parents:
diff changeset
626 gccjit::lvalue gccjit::rvalue::operator[] (gccjit::rvalue index)
kono
parents:
diff changeset
627
kono
parents:
diff changeset
628 .. code-block:: c++
kono
parents:
diff changeset
629
kono
parents:
diff changeset
630 gccjit::lvalue element = array[idx];
kono
parents:
diff changeset
631
kono
parents:
diff changeset
632 gccjit::lvalue gccjit::rvalue::operator[] (int index)
kono
parents:
diff changeset
633
kono
parents:
diff changeset
634 .. code-block:: c++
kono
parents:
diff changeset
635
kono
parents:
diff changeset
636 gccjit::lvalue element = array[0];