Statistics
| Branch: | Revision:

root / tcg / README @ 79d342dc

History | View | Annotate | Download (12.4 kB)

1 c896fe29 bellard
Tiny Code Generator - Fabrice Bellard.
2 c896fe29 bellard
3 c896fe29 bellard
1) Introduction
4 c896fe29 bellard
5 c896fe29 bellard
TCG (Tiny Code Generator) began as a generic backend for a C
6 c896fe29 bellard
compiler. It was simplified to be used in QEMU. It also has its roots
7 c896fe29 bellard
in the QOP code generator written by Paul Brook. 
8 c896fe29 bellard
9 c896fe29 bellard
2) Definitions
10 c896fe29 bellard
11 c896fe29 bellard
The TCG "target" is the architecture for which we generate the
12 c896fe29 bellard
code. It is of course not the same as the "target" of QEMU which is
13 c896fe29 bellard
the emulated architecture. As TCG started as a generic C backend used
14 c896fe29 bellard
for cross compiling, it is assumed that the TCG target is different
15 c896fe29 bellard
from the host, although it is never the case for QEMU.
16 c896fe29 bellard
17 c896fe29 bellard
A TCG "function" corresponds to a QEMU Translated Block (TB).
18 c896fe29 bellard
19 0a6b7b78 bellard
A TCG "temporary" is a variable only live in a basic
20 0a6b7b78 bellard
block. Temporaries are allocated explicitly in each function.
21 c896fe29 bellard
22 0a6b7b78 bellard
A TCG "local temporary" is a variable only live in a function. Local
23 0a6b7b78 bellard
temporaries are allocated explicitly in each function.
24 0a6b7b78 bellard
25 0a6b7b78 bellard
A TCG "global" is a variable which is live in all the functions
26 0a6b7b78 bellard
(equivalent of a C global variable). They are defined before the
27 0a6b7b78 bellard
functions defined. A TCG global can be a memory location (e.g. a QEMU
28 0a6b7b78 bellard
CPU register), a fixed host register (e.g. the QEMU CPU state pointer)
29 0a6b7b78 bellard
or a memory location which is stored in a register outside QEMU TBs
30 0a6b7b78 bellard
(not implemented yet).
31 c896fe29 bellard
32 c896fe29 bellard
A TCG "basic block" corresponds to a list of instructions terminated
33 c896fe29 bellard
by a branch instruction. 
34 c896fe29 bellard
35 c896fe29 bellard
3) Intermediate representation
36 c896fe29 bellard
37 c896fe29 bellard
3.1) Introduction
38 c896fe29 bellard
39 0a6b7b78 bellard
TCG instructions operate on variables which are temporaries, local
40 0a6b7b78 bellard
temporaries or globals. TCG instructions and variables are strongly
41 0a6b7b78 bellard
typed. Two types are supported: 32 bit integers and 64 bit
42 0a6b7b78 bellard
integers. Pointers are defined as an alias to 32 bit or 64 bit
43 0a6b7b78 bellard
integers depending on the TCG target word size.
44 c896fe29 bellard
45 c896fe29 bellard
Each instruction has a fixed number of output variable operands, input
46 c896fe29 bellard
variable operands and always constant operands.
47 c896fe29 bellard
48 c896fe29 bellard
The notable exception is the call instruction which has a variable
49 c896fe29 bellard
number of outputs and inputs.
50 c896fe29 bellard
51 0a6b7b78 bellard
In the textual form, output operands usually come first, followed by
52 0a6b7b78 bellard
input operands, followed by constant operands. The output type is
53 0a6b7b78 bellard
included in the instruction name. Constants are prefixed with a '$'.
54 c896fe29 bellard
55 c896fe29 bellard
add_i32 t0, t1, t2  (t0 <- t1 + t2)
56 c896fe29 bellard
57 c896fe29 bellard
3.2) Assumptions
58 c896fe29 bellard
59 c896fe29 bellard
* Basic blocks
60 c896fe29 bellard
61 c896fe29 bellard
- Basic blocks end after branches (e.g. brcond_i32 instruction),
62 c896fe29 bellard
  goto_tb and exit_tb instructions.
63 86e840ee aurel32
- Basic blocks start after the end of a previous basic block, or at a
64 86e840ee aurel32
  set_label instruction.
65 c896fe29 bellard
66 0a6b7b78 bellard
After the end of a basic block, the content of temporaries is
67 0a6b7b78 bellard
destroyed, but local temporaries and globals are preserved.
68 c896fe29 bellard
69 c896fe29 bellard
* Floating point types are not supported yet
70 c896fe29 bellard
71 c896fe29 bellard
* Pointers: depending on the TCG target, pointer size is 32 bit or 64
72 c896fe29 bellard
  bit. The type TCG_TYPE_PTR is an alias to TCG_TYPE_I32 or
73 c896fe29 bellard
  TCG_TYPE_I64.
74 c896fe29 bellard
75 c896fe29 bellard
* Helpers:
76 c896fe29 bellard
77 c896fe29 bellard
Using the tcg_gen_helper_x_y it is possible to call any function
78 811d4cf4 balrog
taking i32, i64 or pointer types. Before calling an helper, all
79 c896fe29 bellard
globals are stored at their canonical location and it is assumed that
80 c896fe29 bellard
the function can modify them. In the future, function modifiers will
81 c896fe29 bellard
be allowed to tell that the helper does not read or write some globals.
82 c896fe29 bellard
83 c896fe29 bellard
On some TCG targets (e.g. x86), several calling conventions are
84 c896fe29 bellard
supported.
85 c896fe29 bellard
86 c896fe29 bellard
* Branches:
87 c896fe29 bellard
88 c896fe29 bellard
Use the instruction 'br' to jump to a label. Use 'jmp' to jump to an
89 c896fe29 bellard
explicit address. Conditional branches can only jump to labels.
90 c896fe29 bellard
91 c896fe29 bellard
3.3) Code Optimizations
92 c896fe29 bellard
93 c896fe29 bellard
When generating instructions, you can count on at least the following
94 c896fe29 bellard
optimizations:
95 c896fe29 bellard
96 c896fe29 bellard
- Single instructions are simplified, e.g.
97 c896fe29 bellard
98 c896fe29 bellard
   and_i32 t0, t0, $0xffffffff
99 c896fe29 bellard
    
100 c896fe29 bellard
  is suppressed.
101 c896fe29 bellard
102 c896fe29 bellard
- A liveness analysis is done at the basic block level. The
103 0a6b7b78 bellard
  information is used to suppress moves from a dead variable to
104 c896fe29 bellard
  another one. It is also used to remove instructions which compute
105 c896fe29 bellard
  dead results. The later is especially useful for condition code
106 9804c8e2 bellard
  optimization in QEMU.
107 c896fe29 bellard
108 c896fe29 bellard
  In the following example:
109 c896fe29 bellard
110 c896fe29 bellard
  add_i32 t0, t1, t2
111 c896fe29 bellard
  add_i32 t0, t0, $1
112 c896fe29 bellard
  mov_i32 t0, $1
113 c896fe29 bellard
114 c896fe29 bellard
  only the last instruction is kept.
115 c896fe29 bellard
116 c896fe29 bellard
3.4) Instruction Reference
117 c896fe29 bellard
118 c896fe29 bellard
********* Function call
119 c896fe29 bellard
120 c896fe29 bellard
* call <ret> <params> ptr
121 c896fe29 bellard
122 c896fe29 bellard
call function 'ptr' (pointer type)
123 c896fe29 bellard
124 c896fe29 bellard
<ret> optional 32 bit or 64 bit return value
125 c896fe29 bellard
<params> optional 32 bit or 64 bit parameters
126 c896fe29 bellard
127 c896fe29 bellard
********* Jumps/Labels
128 c896fe29 bellard
129 c896fe29 bellard
* jmp t0
130 c896fe29 bellard
131 c896fe29 bellard
Absolute jump to address t0 (pointer type).
132 c896fe29 bellard
133 c896fe29 bellard
* set_label $label
134 c896fe29 bellard
135 c896fe29 bellard
Define label 'label' at the current program point.
136 c896fe29 bellard
137 c896fe29 bellard
* br $label
138 c896fe29 bellard
139 c896fe29 bellard
Jump to label.
140 c896fe29 bellard
141 c896fe29 bellard
* brcond_i32/i64 cond, t0, t1, label
142 c896fe29 bellard
143 c896fe29 bellard
Conditional jump if t0 cond t1 is true. cond can be:
144 c896fe29 bellard
    TCG_COND_EQ
145 c896fe29 bellard
    TCG_COND_NE
146 c896fe29 bellard
    TCG_COND_LT /* signed */
147 c896fe29 bellard
    TCG_COND_GE /* signed */
148 c896fe29 bellard
    TCG_COND_LE /* signed */
149 c896fe29 bellard
    TCG_COND_GT /* signed */
150 c896fe29 bellard
    TCG_COND_LTU /* unsigned */
151 c896fe29 bellard
    TCG_COND_GEU /* unsigned */
152 c896fe29 bellard
    TCG_COND_LEU /* unsigned */
153 c896fe29 bellard
    TCG_COND_GTU /* unsigned */
154 c896fe29 bellard
155 c896fe29 bellard
********* Arithmetic
156 c896fe29 bellard
157 c896fe29 bellard
* add_i32/i64 t0, t1, t2
158 c896fe29 bellard
159 c896fe29 bellard
t0=t1+t2
160 c896fe29 bellard
161 c896fe29 bellard
* sub_i32/i64 t0, t1, t2
162 c896fe29 bellard
163 c896fe29 bellard
t0=t1-t2
164 c896fe29 bellard
165 390efc54 pbrook
* neg_i32/i64 t0, t1
166 390efc54 pbrook
167 390efc54 pbrook
t0=-t1 (two's complement)
168 390efc54 pbrook
169 c896fe29 bellard
* mul_i32/i64 t0, t1, t2
170 c896fe29 bellard
171 c896fe29 bellard
t0=t1*t2
172 c896fe29 bellard
173 c896fe29 bellard
* div_i32/i64 t0, t1, t2
174 c896fe29 bellard
175 c896fe29 bellard
t0=t1/t2 (signed). Undefined behavior if division by zero or overflow.
176 c896fe29 bellard
177 c896fe29 bellard
* divu_i32/i64 t0, t1, t2
178 c896fe29 bellard
179 c896fe29 bellard
t0=t1/t2 (unsigned). Undefined behavior if division by zero.
180 c896fe29 bellard
181 c896fe29 bellard
* rem_i32/i64 t0, t1, t2
182 c896fe29 bellard
183 c896fe29 bellard
t0=t1%t2 (signed). Undefined behavior if division by zero or overflow.
184 c896fe29 bellard
185 c896fe29 bellard
* remu_i32/i64 t0, t1, t2
186 c896fe29 bellard
187 c896fe29 bellard
t0=t1%t2 (unsigned). Undefined behavior if division by zero.
188 c896fe29 bellard
189 c896fe29 bellard
********* Logical
190 c896fe29 bellard
191 5e85404a aurel32
* and_i32/i64 t0, t1, t2
192 5e85404a aurel32
193 c896fe29 bellard
t0=t1&t2
194 c896fe29 bellard
195 c896fe29 bellard
* or_i32/i64 t0, t1, t2
196 c896fe29 bellard
197 c896fe29 bellard
t0=t1|t2
198 c896fe29 bellard
199 c896fe29 bellard
* xor_i32/i64 t0, t1, t2
200 c896fe29 bellard
201 c896fe29 bellard
t0=t1^t2
202 c896fe29 bellard
203 0a6b7b78 bellard
* not_i32/i64 t0, t1
204 0a6b7b78 bellard
205 0a6b7b78 bellard
t0=~t1
206 0a6b7b78 bellard
207 f24cb33e aurel32
* andc_i32/i64 t0, t1, t2
208 f24cb33e aurel32
209 f24cb33e aurel32
t0=t1&~t2
210 f24cb33e aurel32
211 f24cb33e aurel32
* eqv_i32/i64 t0, t1, t2
212 f24cb33e aurel32
213 f24cb33e aurel32
t0=~(t1^t2)
214 f24cb33e aurel32
215 f24cb33e aurel32
* nand_i32/i64 t0, t1, t2
216 f24cb33e aurel32
217 f24cb33e aurel32
t0=~(t1&t2)
218 f24cb33e aurel32
219 f24cb33e aurel32
* nor_i32/i64 t0, t1, t2
220 f24cb33e aurel32
221 f24cb33e aurel32
t0=~(t1|t2)
222 f24cb33e aurel32
223 f24cb33e aurel32
* orc_i32/i64 t0, t1, t2
224 f24cb33e aurel32
225 f24cb33e aurel32
t0=t1|~t2
226 f24cb33e aurel32
227 15824571 aurel32
********* Shifts/Rotates
228 c896fe29 bellard
229 c896fe29 bellard
* shl_i32/i64 t0, t1, t2
230 c896fe29 bellard
231 c896fe29 bellard
t0=t1 << t2. Undefined behavior if t2 < 0 or t2 >= 32 (resp 64)
232 c896fe29 bellard
233 c896fe29 bellard
* shr_i32/i64 t0, t1, t2
234 c896fe29 bellard
235 c896fe29 bellard
t0=t1 >> t2 (unsigned). Undefined behavior if t2 < 0 or t2 >= 32 (resp 64)
236 c896fe29 bellard
237 c896fe29 bellard
* sar_i32/i64 t0, t1, t2
238 c896fe29 bellard
239 c896fe29 bellard
t0=t1 >> t2 (signed). Undefined behavior if t2 < 0 or t2 >= 32 (resp 64)
240 c896fe29 bellard
241 15824571 aurel32
* rotl_i32/i64 t0, t1, t2
242 15824571 aurel32
243 15824571 aurel32
Rotation of t2 bits to the left. Undefined behavior if t2 < 0 or t2 >= 32 (resp 64)
244 15824571 aurel32
245 15824571 aurel32
* rotr_i32/i64 t0, t1, t2
246 15824571 aurel32
247 15824571 aurel32
Rotation of t2 bits to the right. Undefined behavior if t2 < 0 or t2 >= 32 (resp 64)
248 15824571 aurel32
249 c896fe29 bellard
********* Misc
250 c896fe29 bellard
251 c896fe29 bellard
* mov_i32/i64 t0, t1
252 c896fe29 bellard
253 c896fe29 bellard
t0 = t1
254 c896fe29 bellard
255 c896fe29 bellard
Move t1 to t0 (both operands must have the same type).
256 c896fe29 bellard
257 c896fe29 bellard
* ext8s_i32/i64 t0, t1
258 86831435 pbrook
ext8u_i32/i64 t0, t1
259 c896fe29 bellard
ext16s_i32/i64 t0, t1
260 86831435 pbrook
ext16u_i32/i64 t0, t1
261 c896fe29 bellard
ext32s_i64 t0, t1
262 86831435 pbrook
ext32u_i64 t0, t1
263 c896fe29 bellard
264 86831435 pbrook
8, 16 or 32 bit sign/zero extension (both operands must have the same type)
265 c896fe29 bellard
266 4ad4ce16 aurel32
* bswap16_i32/i64 t0, t1
267 c896fe29 bellard
268 4ad4ce16 aurel32
16 bit byte swap on a 32/64 bit value. The two/six high order bytes must be
269 4ad4ce16 aurel32
set to zero.
270 c896fe29 bellard
271 4ad4ce16 aurel32
* bswap32_i32/i64 t0, t1
272 c896fe29 bellard
273 604457d7 aurel32
32 bit byte swap on a 32/64 bit value. With a 64 bit value, the four high
274 4ad4ce16 aurel32
order bytes must be set to zero.
275 c896fe29 bellard
276 4ad4ce16 aurel32
* bswap64_i64 t0, t1
277 c896fe29 bellard
278 c896fe29 bellard
64 bit byte swap
279 c896fe29 bellard
280 5ff9d6a4 bellard
* discard_i32/i64 t0
281 5ff9d6a4 bellard
282 5ff9d6a4 bellard
Indicate that the value of t0 won't be used later. It is useful to
283 5ff9d6a4 bellard
force dead code elimination.
284 5ff9d6a4 bellard
285 c896fe29 bellard
********* Type conversions
286 c896fe29 bellard
287 c896fe29 bellard
* ext_i32_i64 t0, t1
288 c896fe29 bellard
Convert t1 (32 bit) to t0 (64 bit) and does sign extension
289 c896fe29 bellard
290 c896fe29 bellard
* extu_i32_i64 t0, t1
291 c896fe29 bellard
Convert t1 (32 bit) to t0 (64 bit) and does zero extension
292 c896fe29 bellard
293 c896fe29 bellard
* trunc_i64_i32 t0, t1
294 c896fe29 bellard
Truncate t1 (64 bit) to t0 (32 bit)
295 c896fe29 bellard
296 36aa55dc pbrook
* concat_i32_i64 t0, t1, t2
297 36aa55dc pbrook
Construct t0 (64-bit) taking the low half from t1 (32 bit) and the high half
298 36aa55dc pbrook
from t2 (32 bit).
299 36aa55dc pbrook
300 945ca823 blueswir1
* concat32_i64 t0, t1, t2
301 945ca823 blueswir1
Construct t0 (64-bit) taking the low half from t1 (64 bit) and the high half
302 945ca823 blueswir1
from t2 (64 bit).
303 945ca823 blueswir1
304 c896fe29 bellard
********* Load/Store
305 c896fe29 bellard
306 c896fe29 bellard
* ld_i32/i64 t0, t1, offset
307 c896fe29 bellard
ld8s_i32/i64 t0, t1, offset
308 c896fe29 bellard
ld8u_i32/i64 t0, t1, offset
309 c896fe29 bellard
ld16s_i32/i64 t0, t1, offset
310 c896fe29 bellard
ld16u_i32/i64 t0, t1, offset
311 c896fe29 bellard
ld32s_i64 t0, t1, offset
312 c896fe29 bellard
ld32u_i64 t0, t1, offset
313 c896fe29 bellard
314 c896fe29 bellard
t0 = read(t1 + offset)
315 c896fe29 bellard
Load 8, 16, 32 or 64 bits with or without sign extension from host memory. 
316 c896fe29 bellard
offset must be a constant.
317 c896fe29 bellard
318 c896fe29 bellard
* st_i32/i64 t0, t1, offset
319 c896fe29 bellard
st8_i32/i64 t0, t1, offset
320 c896fe29 bellard
st16_i32/i64 t0, t1, offset
321 c896fe29 bellard
st32_i64 t0, t1, offset
322 c896fe29 bellard
323 c896fe29 bellard
write(t0, t1 + offset)
324 c896fe29 bellard
Write 8, 16, 32 or 64 bits to host memory.
325 c896fe29 bellard
326 c896fe29 bellard
********* QEMU specific operations
327 c896fe29 bellard
328 c896fe29 bellard
* tb_exit t0
329 c896fe29 bellard
330 c896fe29 bellard
Exit the current TB and return the value t0 (word type).
331 c896fe29 bellard
332 c896fe29 bellard
* goto_tb index
333 c896fe29 bellard
334 c896fe29 bellard
Exit the current TB and jump to the TB index 'index' (constant) if the
335 c896fe29 bellard
current TB was linked to this TB. Otherwise execute the next
336 c896fe29 bellard
instructions.
337 c896fe29 bellard
338 f53bca18 aurel32
* qemu_ld8u t0, t1, flags
339 f53bca18 aurel32
qemu_ld8s t0, t1, flags
340 f53bca18 aurel32
qemu_ld16u t0, t1, flags
341 f53bca18 aurel32
qemu_ld16s t0, t1, flags
342 f53bca18 aurel32
qemu_ld32u t0, t1, flags
343 f53bca18 aurel32
qemu_ld32s t0, t1, flags
344 f53bca18 aurel32
qemu_ld64 t0, t1, flags
345 c896fe29 bellard
346 c896fe29 bellard
Load data at the QEMU CPU address t1 into t0. t1 has the QEMU CPU
347 c896fe29 bellard
address type. 'flags' contains the QEMU memory index (selects user or
348 c896fe29 bellard
kernel access) for example.
349 c896fe29 bellard
350 f53bca18 aurel32
* qemu_st8 t0, t1, flags
351 f53bca18 aurel32
qemu_st16 t0, t1, flags
352 f53bca18 aurel32
qemu_st32 t0, t1, flags
353 f53bca18 aurel32
qemu_st64 t0, t1, flags
354 c896fe29 bellard
355 c896fe29 bellard
Store the data t0 at the QEMU CPU Address t1. t1 has the QEMU CPU
356 c896fe29 bellard
address type. 'flags' contains the QEMU memory index (selects user or
357 c896fe29 bellard
kernel access) for example.
358 c896fe29 bellard
359 c896fe29 bellard
Note 1: Some shortcuts are defined when the last operand is known to be
360 c896fe29 bellard
a constant (e.g. addi for add, movi for mov).
361 c896fe29 bellard
362 c896fe29 bellard
Note 2: When using TCG, the opcodes must never be generated directly
363 c896fe29 bellard
as some of them may not be available as "real" opcodes. Always use the
364 c896fe29 bellard
function tcg_gen_xxx(args).
365 c896fe29 bellard
366 c896fe29 bellard
4) Backend
367 c896fe29 bellard
368 c896fe29 bellard
tcg-target.h contains the target specific definitions. tcg-target.c
369 c896fe29 bellard
contains the target specific code.
370 c896fe29 bellard
371 c896fe29 bellard
4.1) Assumptions
372 c896fe29 bellard
373 c896fe29 bellard
The target word size (TCG_TARGET_REG_BITS) is expected to be 32 bit or
374 c896fe29 bellard
64 bit. It is expected that the pointer has the same size as the word.
375 c896fe29 bellard
376 c896fe29 bellard
On a 32 bit target, all 64 bit operations are converted to 32 bits. A
377 c896fe29 bellard
few specific operations must be implemented to allow it (see add2_i32,
378 c896fe29 bellard
sub2_i32, brcond2_i32).
379 c896fe29 bellard
380 c896fe29 bellard
Floating point operations are not supported in this version. A
381 c896fe29 bellard
previous incarnation of the code generator had full support of them,
382 c896fe29 bellard
but it is better to concentrate on integer operations first.
383 c896fe29 bellard
384 c896fe29 bellard
On a 64 bit target, no assumption is made in TCG about the storage of
385 c896fe29 bellard
the 32 bit values in 64 bit registers.
386 c896fe29 bellard
387 c896fe29 bellard
4.2) Constraints
388 c896fe29 bellard
389 c896fe29 bellard
GCC like constraints are used to define the constraints of every
390 c896fe29 bellard
instruction. Memory constraints are not supported in this
391 c896fe29 bellard
version. Aliases are specified in the input operands as for GCC.
392 c896fe29 bellard
393 0c5f3c8d pbrook
The same register may be used for both an input and an output, even when
394 0c5f3c8d pbrook
they are not explicitly aliased.  If an op expands to multiple target
395 0c5f3c8d pbrook
instructions then care must be taken to avoid clobbering input values.
396 0c5f3c8d pbrook
GCC style "early clobber" outputs are not currently supported.
397 0c5f3c8d pbrook
398 c896fe29 bellard
A target can define specific register or constant constraints. If an
399 c896fe29 bellard
operation uses a constant input constraint which does not allow all
400 c896fe29 bellard
constants, it must also accept registers in order to have a fallback.
401 c896fe29 bellard
402 c896fe29 bellard
The movi_i32 and movi_i64 operations must accept any constants.
403 c896fe29 bellard
404 c896fe29 bellard
The mov_i32 and mov_i64 operations must accept any registers of the
405 c896fe29 bellard
same type.
406 c896fe29 bellard
407 c896fe29 bellard
The ld/st instructions must accept signed 32 bit constant offsets. It
408 c896fe29 bellard
can be implemented by reserving a specific register to compute the
409 c896fe29 bellard
address if the offset is too big.
410 c896fe29 bellard
411 c896fe29 bellard
The ld/st instructions must accept any destination (ld) or source (st)
412 c896fe29 bellard
register.
413 c896fe29 bellard
414 c896fe29 bellard
4.3) Function call assumptions
415 c896fe29 bellard
416 c896fe29 bellard
- The only supported types for parameters and return value are: 32 and
417 c896fe29 bellard
  64 bit integers and pointer.
418 c896fe29 bellard
- The stack grows downwards.
419 c896fe29 bellard
- The first N parameters are passed in registers.
420 c896fe29 bellard
- The next parameters are passed on the stack by storing them as words.
421 c896fe29 bellard
- Some registers are clobbered during the call. 
422 c896fe29 bellard
- The function can return 0 or 1 value in registers. On a 32 bit
423 c896fe29 bellard
  target, functions must be able to return 2 values in registers for
424 c896fe29 bellard
  64 bit return type.
425 c896fe29 bellard
426 86e840ee aurel32
5) Recommended coding rules for best performance
427 0a6b7b78 bellard
428 0a6b7b78 bellard
- Use globals to represent the parts of the QEMU CPU state which are
429 0a6b7b78 bellard
  often modified, e.g. the integer registers and the condition
430 0a6b7b78 bellard
  codes. TCG will be able to use host registers to store them.
431 0a6b7b78 bellard
432 0a6b7b78 bellard
- Avoid globals stored in fixed registers. They must be used only to
433 0a6b7b78 bellard
  store the pointer to the CPU state and possibly to store a pointer
434 86e840ee aurel32
  to a register window.
435 0a6b7b78 bellard
436 0a6b7b78 bellard
- Use temporaries. Use local temporaries only when really needed,
437 0a6b7b78 bellard
  e.g. when you need to use a value after a jump. Local temporaries
438 0a6b7b78 bellard
  introduce a performance hit in the current TCG implementation: their
439 0a6b7b78 bellard
  content is saved to memory at end of each basic block.
440 0a6b7b78 bellard
441 0a6b7b78 bellard
- Free temporaries and local temporaries when they are no longer used
442 0a6b7b78 bellard
  (tcg_temp_free). Since tcg_const_x() also creates a temporary, you
443 0a6b7b78 bellard
  should free it after it is used. Freeing temporaries does not yield
444 0a6b7b78 bellard
  a better generated code, but it reduces the memory usage of TCG and
445 0a6b7b78 bellard
  the speed of the translation.
446 0a6b7b78 bellard
447 0a6b7b78 bellard
- Don't hesitate to use helpers for complicated or seldom used target
448 0a6b7b78 bellard
  intructions. There is little performance advantage in using TCG to
449 0a6b7b78 bellard
  implement target instructions taking more than about twenty TCG
450 0a6b7b78 bellard
  instructions.
451 0a6b7b78 bellard
452 0a6b7b78 bellard
- Use the 'discard' instruction if you know that TCG won't be able to
453 0a6b7b78 bellard
  prove that a given global is "dead" at a given program point. The
454 0a6b7b78 bellard
  x86 target uses it to improve the condition codes optimisation.