benode_t.h 16.6 KB
Newer Older
Christian Würdig's avatar
Christian Würdig committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
 * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
 *
 * This file is part of libFirm.
 *
 * This file may be distributed and/or modified under the terms of the
 * GNU General Public License version 2 as published by the Free Software
 * Foundation and appearing in the file LICENSE.GPL included in the
 * packaging of this file.
 *
 * Licensees holding valid libFirm Professional Edition licenses may use
 * this file in accordance with the libFirm Commercial License.
 * Agreement provided with the Software.
 *
 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE.
 */

Sebastian Hack's avatar
Sebastian Hack committed
20
/**
Christian Würdig's avatar
Christian Würdig committed
21
22
23
24
25
 * @file
 * @brief       Backend node support for generic backend nodes.
 * @author      Sebastian Hack
 * @date        17.05.2005
 * @version     $Id$
Sebastian Hack's avatar
Sebastian Hack committed
26
 *
Christian Würdig's avatar
Christian Würdig committed
27
28
 * Backend node support for generic backend nodes.
 * This file provides Perm, Copy, Spill and Reload nodes.
Sebastian Hack's avatar
Sebastian Hack committed
29
 */
Christian Würdig's avatar
Christian Würdig committed
30
31
#ifndef FIRM_BE_BENODE_T_H
#define FIRM_BE_BENODE_T_H
32

33
34
#include <limits.h>

Sebastian Hack's avatar
Sebastian Hack committed
35
36
#include "irmode.h"
#include "irnode.h"
Christian Würdig's avatar
Christian Würdig committed
37
38
#include "irgraph.h"
#include "entity.h"
Sebastian Hack's avatar
Sebastian Hack committed
39

Christian Würdig's avatar
Christian Würdig committed
40
#include "bearch.h"
Sebastian Hack's avatar
Sebastian Hack committed
41

42
43
#define BE_OUT_POS(p) (-((p) + 1))

44
45
46
47
48
49
/**
 * The benode op's.  Must be available to register emitter function.
 */
extern ir_op *op_be_Spill;
extern ir_op *op_be_Reload;
extern ir_op *op_be_Perm;
Matthias Braun's avatar
Matthias Braun committed
50
extern ir_op *op_be_MemPerm;
51
52
extern ir_op *op_be_Copy;
extern ir_op *op_be_Keep;
Michael Beck's avatar
Michael Beck committed
53
extern ir_op *op_be_CopyKeep;
54
55
56
extern ir_op *op_be_Call;
extern ir_op *op_be_Return;
extern ir_op *op_be_IncSP;
Sebastian Hack's avatar
Sebastian Hack committed
57
extern ir_op *op_be_AddSP;
Michael Beck's avatar
Michael Beck committed
58
extern ir_op *op_be_SubSP;
59
60
61
62
63
64
extern ir_op *op_be_SetSP;
extern ir_op *op_be_RegParams;
extern ir_op *op_be_StackParam;
extern ir_op *op_be_FrameAddr;
extern ir_op *op_be_FrameLoad;
extern ir_op *op_be_FrameStore;
65
extern ir_op *op_be_Barrier;
66

Sebastian Hack's avatar
Sebastian Hack committed
67
typedef enum {
68
	beo_NoBeOp = -1,
Sebastian Hack's avatar
Sebastian Hack committed
69
70
71
	beo_Spill,
	beo_Reload,
	beo_Perm,
Matthias Braun's avatar
Matthias Braun committed
72
	beo_MemPerm,
Sebastian Hack's avatar
Sebastian Hack committed
73
74
	beo_Copy,
	beo_Keep,
Sebastian Hack's avatar
Sebastian Hack committed
75
	beo_CopyKeep,
Sebastian Hack's avatar
Sebastian Hack committed
76
	beo_Call,
Sebastian Hack's avatar
Sebastian Hack committed
77
	beo_Return,
Sebastian Hack's avatar
Sebastian Hack committed
78
	beo_AddSP,
Michael Beck's avatar
Michael Beck committed
79
	beo_SubSP,
Sebastian Hack's avatar
Sebastian Hack committed
80
	beo_IncSP,
Sebastian Hack's avatar
Sebastian Hack committed
81
	beo_SetSP,
Sebastian Hack's avatar
Sebastian Hack committed
82
	beo_RegParams,
Sebastian Hack's avatar
Sebastian Hack committed
83
	beo_StackParam,
84
85
86
	beo_FrameLoad,
	beo_FrameStore,
	beo_FrameAddr,
87
	beo_Barrier,
Sebastian Hack's avatar
Sebastian Hack committed
88
89
	beo_Last
} be_opcode_t;
90

Sebastian Hack's avatar
Sebastian Hack committed
91
/** Not used yet. */
92
93
94
95
96
97
typedef enum {
	be_frame_flag_spill = 1,
	be_frame_flag_local = 2,
	be_frame_flag_arg   = 4
} be_frame_flag_t;

Sebastian Hack's avatar
Sebastian Hack committed
98
99
100
101
/**
 * A "symbolic constant" for the size of the stack frame to use with IncSP nodes.
 * It gets back-patched to the real size as soon it is known.
 */
102
103
#define BE_STACK_FRAME_SIZE_EXPAND INT_MAX
#define BE_STACK_FRAME_SIZE_SHRINK INT_MIN
Sebastian Hack's avatar
Sebastian Hack committed
104

105
106
107
108
109
/**
 * Determines if irn is a be_node.
 */
int is_be_node(const ir_node *irn);

110
111
112
/**
 * Create all BE specific opcodes.
 */
Sebastian Hack's avatar
Sebastian Hack committed
113
void be_node_init(void);
114

115
116
117
/**
 * Position numbers for the be_Spill inputs.
 */
118
enum {
119
120
	be_pos_Spill_frame = 0,
	be_pos_Spill_val   = 1
121
};
122
123
124
125

/**
 * Make a new Spill node.
 */
126
127
ir_node *be_new_Spill(const arch_register_class_t *cls, const arch_register_class_t *cls_frame,
	ir_graph *irg, ir_node *bl, ir_node *frame, ir_node *to_spill);
128

129
130
131
/**
 * Position numbers for the be_Reload inputs.
 */
132
enum {
133
134
	be_pos_Reload_frame = 0,
	be_pos_Reload_mem   = 1
135
};
136
137
138
139

/**
 * Make a new Reload node.
 */
140
141
ir_node *be_new_Reload(const arch_register_class_t *cls, const arch_register_class_t *cls_frame,
	ir_graph *irg, ir_node *bl, ir_node *frame, ir_node *mem, ir_mode *mode);
142

143
144
145
/**
 * Position numbers for the be_Copy inputs.
 */
146
enum {
147
	be_pos_Copy_op = 0
148
};
149
150
151
152

/**
 * Make a new Copy node.
 */
Sebastian Hack's avatar
Sebastian Hack committed
153
ir_node *be_new_Copy(const arch_register_class_t *cls, ir_graph *irg, ir_node *block, ir_node *in);
154
/** Returns the Copy Argument. */
155
ir_node *be_get_Copy_op(const ir_node *cpy);
156
157
/** Sets the Copy Argument. */
void be_set_Copy_op(ir_node *cpy, ir_node *op);
158

159
160
161
/**
 * Make a new Perm node.
 */
Sebastian Hack's avatar
Sebastian Hack committed
162
ir_node *be_new_Perm(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, int arity, ir_node *in[]);
163
164
165
/**
 * Create a new MemPerm node.
 */
Matthias Braun's avatar
Matthias Braun committed
166
ir_node *be_new_MemPerm(const arch_env_t *arch_env, ir_graph *irg, ir_node *bl, int n, ir_node *in[]);
Sebastian Hack's avatar
Sebastian Hack committed
167
ir_node *be_new_Keep(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, int arity, ir_node *in[]);
Sebastian Hack's avatar
Sebastian Hack committed
168

169
170
void be_Keep_add_node(ir_node *keep, const arch_register_class_t *cls, ir_node *node);

171
172
173
174
175
176
177
178
/**
 * Position numbers for the be_FrameLoad inputs
 */
enum {
	be_pos_FrameLoad_mem = 0,
	be_pos_FrameLoad_ptr = 1
};

179
ir_node *be_new_FrameLoad(const arch_register_class_t *cls_frame, const arch_register_class_t *cls_data,
180
						  ir_graph *irg, ir_node *bl, ir_node *mem, ir_node *frame, ir_entity *ent);
181
182
183
184
185
186
187
188
189
190

/**
 * Position numbers for the be_FrameStore inputs
 */
enum {
	be_pos_FrameStore_mem = 0,
	be_pos_FrameStore_ptr = 1,
	be_pos_FrameStore_val = 2
};

191
ir_node *be_new_FrameStore(const arch_register_class_t *cls_frame, const arch_register_class_t *cls_data,
192
						   ir_graph *irg, ir_node *bl, ir_node *mem, ir_node *frame, ir_node *data, ir_entity *ent);
193
194
195
196
197
198
199
200

/**
 * Position numbers for the be_FrameAddr inputs
 */
enum {
	be_pos_FrameAddr_ptr = 0
};

201
ir_node *be_new_FrameAddr(const arch_register_class_t *cls_frame, ir_graph *irg, ir_node *bl, ir_node *frame, ir_entity *ent);
202

203
204
205
/**
 * Position numbers for the be_AddSP inputs
 */
Sebastian Hack's avatar
Sebastian Hack committed
206
207
208
209
210
211
enum {
	be_pos_AddSP_old_sp = 0,
	be_pos_AddSP_size   = 1,
	be_pos_AddSP_last   = 2
};

Sebastian Hack's avatar
Sebastian Hack committed
212
213
214
215
216
217
enum {
	pn_be_AddSP_res  = 0,
	pn_be_AddSP_M    = 1,
	pn_be_AddSP_last = 2
};

Sebastian Hack's avatar
Sebastian Hack committed
218
219
220
221
222
223
224
225
226
227
228
229
230
/**
 * Make a new AddSP node.
 * An AddSP node expresses an increase of the stack pointer in the direction the stack
 * grows. In contrast to IncSP, the amount of bytes the stack pointer is grown, is not
 * given by a constant but an ordinary Firm node.
 * @param sp     The stack pointer register.
 * @param irg    The graph.
 * @param bl     The block.
 * @param old_sp The node representing the old stack pointer value.
 * @param sz     The node expressing the size by which the stack pointer shall be grown.
 * @return       A new AddSP node.
 */
ir_node *be_new_AddSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, ir_node *sz);
Sebastian Hack's avatar
Sebastian Hack committed
231

Michael Beck's avatar
Michael Beck committed
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
/**
 * Position numbers for the be_SubSP inputs
 */
enum {
	be_pos_SubSP_old_sp = 0,
	be_pos_SubSP_size   = 1,
	be_pos_SubSP_last   = 2
};

enum {
	pn_be_SubSP_res  = 0,
	pn_be_SubSP_M    = 1,
	pn_be_SubSP_last = 2
};

/**
 * Make a new SubSP node.
 * A SubSP node expresses a decrease of the stack pointer in the direction the stack
 * grows. In contrast to IncSP, the amount of bytes the stack pointer is grown, is not
 * given by a constant but an ordinary Firm node.
 * @param sp     The stack pointer register.
 * @param irg    The graph.
 * @param bl     The block.
 * @param old_sp The node representing the old stack pointer value.
 * @param sz     The node expressing the size by which the stack pointer shall be grown.
 * @return       A new DecSP node.
 */
ir_node *be_new_SubSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, ir_node *sz);

Sebastian Hack's avatar
Sebastian Hack committed
261
262
ir_node *be_new_SetSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, ir_node *operand, ir_node *mem);

Sebastian Hack's avatar
Sebastian Hack committed
263
264
/**
 * Make a stack pointer increase/decrease node.
Sebastian Hack's avatar
Sebastian Hack committed
265
 * @param sp     The stack pointer register.
Sebastian Hack's avatar
Sebastian Hack committed
266
267
268
 * @param irg    The graph to insert the node to.
 * @param bl     The block to insert the node into.
 * @param old_sp The node defining the former stack pointer.
269
 * @param amount The mount of bytes the stack shall be expanded/shrinked (see set_IncSP_offset)
Sebastian Hack's avatar
Sebastian Hack committed
270
271
272
273
274
 * @param dir    The direction in which the stack pointer shall be modified:
 *               Along the stack's growing direction or against.
 * @return       A new stack pointer increment/decrement node.
 * @note         This node sets a register constraint to the @p sp register on its output.
 */
Sebastian Hack's avatar
Sebastian Hack committed
275
ir_node *be_new_IncSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, int offset);
Sebastian Hack's avatar
Sebastian Hack committed
276

Michael Beck's avatar
BugFix:    
Michael Beck committed
277
278
/** Returns the previous node that computes the stack pointer. */
ir_node *be_get_IncSP_pred(ir_node *incsp);
Sebastian Hack's avatar
Sebastian Hack committed
279

280
/** Sets the previous node that computes the stack pointer. */
281
void     be_set_IncSP_pred(ir_node *incsp, ir_node *pred);
282

283
284
285
286
287
288
289
/**
 * Sets a new offset to a IncSP node.
 * A positive offset means expanding the stack, a negative offset shrinking
 * an offset is == BE_STACK_FRAME_SIZE will be replaced by the real size of the
 * stackframe in the fix_stack_offsets phase.
 */
void     be_set_IncSP_offset(ir_node *irn, int offset);
Michael Beck's avatar
BugFix:    
Michael Beck committed
290
291

/** Gets the offset from a IncSP node. */
292
int be_get_IncSP_offset(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
293

294
/** Gets the call entity or NULL if this is no static call. */
295
ir_entity  *be_Call_get_entity(const ir_node *call);
296
/** Sets the call entity. */
297
void     be_Call_set_entity(ir_node *call, ir_entity *ent);
298
299
300
301
/** Gets the call type. */
ir_type *be_Call_get_type(ir_node *call);
/** Sets the call type. */
void     be_Call_set_type(ir_node *call, ir_type *call_tp);
302

303
304
305
/**
 * Position numbers for the be_Call inputs.
 */
306
enum {
307
308
309
310
	be_pos_Call_mem       = 0,  /**< memory input of a be_Call node */
	be_pos_Call_sp        = 1,  /**< stack pointer input of a be_Call node */
	be_pos_Call_ptr       = 2,  /**< call pointer input of a be_Call node */
	be_pos_Call_first_arg = 3   /**< first argument input of a be_Call node */
311
312
};

313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
/**
 * Projection numbers for result of be_Call node: use for Proj nodes!
 */
typedef enum {
	pn_be_Call_M_regular = pn_Call_M_regular,  /**< The memory result of a be_Call. */
	pn_be_Call_first_res = pn_Call_max         /**< The first result proj number of a be_Call. */
} pn_be_Call;

/**
 * Construct a new be_Call
 */
ir_node *be_new_Call(dbg_info *dbg, ir_graph *irg, ir_node *bl, ir_node *mem, ir_node *sp, ir_node *ptr,
                     int n_outs, int n, ir_node *in[], ir_type *call_tp);

/**
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
 * Position numbers for the be_Return inputs.
 */
enum {
	be_pos_Return_mem  = 0,     /**< memory input of a be_Return node */
	be_pos_Return_sp   = 1,     /**< stack pointer input of a be_Return node */
	be_pos_Return_val  = 2,     /**< first "real" return value if any */
};

/**
 * Construct a new be_Return.
 * @param irg    the graph where the new node will be placed
 * @param bl     the block where the new node will be placed
 * @param n_res  number of "real" results
 * @param n      number of inputs
 * @param in     input array
 */
ir_node *be_new_Return(dbg_info *dbg, ir_graph *irg, ir_node *bl, int n_res, int n, ir_node *in[]);

/** Returns the number of real returns values */
int be_Return_get_n_rets(ir_node *ret);

349
350
351
/** appends a node to the return node, returns the position of the node */
int be_Return_append_node(ir_node *ret, ir_node *node);

352
353
354
355
356
357
358
/**
 * StackParam input positions
 */
enum {
	be_pos_StackParam_ptr = 0
};

359
360
/**
 * Construct a new Stack Parameter node.
361
 */
362
ir_node *be_new_StackParam(const arch_register_class_t *cls, const arch_register_class_t *cls_frame, ir_graph *irg, ir_node *bl, ir_mode *mode, ir_node *frame_pointer, ir_entity *ent);
Sebastian Hack's avatar
Sebastian Hack committed
363
ir_node *be_new_RegParams(ir_graph *irg, ir_node *bl, int n_out);
Sebastian Hack's avatar
Sebastian Hack committed
364

365
ir_node *be_new_Barrier(ir_graph *irg, ir_node *bl, int n, ir_node *in[]);
Sebastian Hack's avatar
Sebastian Hack committed
366

367
368
369
370
371
372
373
374
375
376
/**
 * Appends a node to a barrier, returns the result proj of the node
 */
ir_node *be_Barrier_append_node(ir_node *barrier, ir_node *node);

/**
 * Appends a register out requirement to a RegParams node
 *
 * @returns the proj node for the new register
 */
377
378
ir_node *be_RegParams_append_out_reg(ir_node *regparams,
                                     const arch_env_t *arch_env,
379
380
                                     const arch_register_t *reg);

Sebastian Hack's avatar
Sebastian Hack committed
381
/**
382
 * Make a spill node.
Sebastian Hack's avatar
Sebastian Hack committed
383
384
385
386
387
388
 *
 * @param arch_env  The architecture environment.
 * @param irn       The node to be spilled.
 * @param spill_ctx The context in which the spill is introduced (This is mostly == irn up to the case of Phis).
 * @return          The new spill node.
 */
Matthias Braun's avatar
Matthias Braun committed
389
ir_node *be_spill(const arch_env_t *arch_env, ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
390
391
392
393
394
395
396
397
398
399
400
401

/**
 * Make a reload and insert it into the schedule.
 *
 * @param arch_env The architecture environment.
 * @param cls      The register class of the reloaded value.
 * @param insert   The node in the schedule in front of which the reload is inserted.
 * @param mode     The mode of the original (spilled) value.
 * @param spill    The spill node corresponding to this reload.
 * @return         A freshly made reload.
 */
ir_node *be_reload(const arch_env_t *arch_env, const arch_register_class_t *cls, ir_node *insert, ir_mode *mode, ir_node *spill);
Sebastian Hack's avatar
Sebastian Hack committed
402

Sebastian Hack's avatar
Sebastian Hack committed
403
404
405
enum {
	be_pos_CopyKeep_op = 0
};
Sebastian Hack's avatar
Sebastian Hack committed
406
407
ir_node *be_new_CopyKeep(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, ir_node *src, int n, ir_node *in_keep[], ir_mode *mode);
ir_node *be_new_CopyKeep_single(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, ir_node *src, ir_node *keep, ir_mode *mode);
408
409
ir_node *be_get_CopyKeep_op(const ir_node *cpy);
void be_set_CopyKeep_op(ir_node *cpy, ir_node *op);
Sebastian Hack's avatar
Sebastian Hack committed
410

Sebastian Hack's avatar
Sebastian Hack committed
411
412
413
414
415
/**
 * Get the backend opcode of a backend node.
 * @param irn The node.
 * @return The backend opcode.
 */
Sebastian Hack's avatar
Sebastian Hack committed
416
417
be_opcode_t be_get_irn_opcode(const ir_node *irn);

418
419
420
421
int be_is_Spill(const ir_node *irn);
int be_is_Reload(const ir_node *irn);
int be_is_Copy(const ir_node *irn);
int be_is_Perm(const ir_node *irn);
Matthias Braun's avatar
Matthias Braun committed
422
int be_is_MemPerm(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
423
int be_is_Keep(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
424
int be_is_CopyKeep(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
425
int be_is_Call(const ir_node *irn);
426
int be_is_Return(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
427
int be_is_IncSP(const ir_node *irn);
428
int be_is_SetSP(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
429
int be_is_AddSP(const ir_node *irn);
430
int be_is_SubSP(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
431
432
int be_is_RegParams(const ir_node *irn);
int be_is_StackParam(const ir_node *irn);
Christian Würdig's avatar
Christian Würdig committed
433
434
435
int be_is_FrameAddr(const ir_node *irn);
int be_is_FrameLoad(const ir_node *irn);
int be_is_FrameStore(const ir_node *irn);
436
int be_is_Barrier(const ir_node *irn);
Sebastian Hack's avatar
Sebastian Hack committed
437

438
/**
439
 * Try to avoid this function and better call arch_get_frame_entity!
440
 *
441
 * Returns the frame entity used by the be node
442
 */
443
444
445
446
447
448
ir_entity *be_get_frame_entity(const ir_node *irn);

/**
 * Returns the frame offset of this node.
 */
int be_get_frame_offset(const ir_node *irn);
449
450

ir_node* be_get_Reload_mem(const ir_node *irn);
451
ir_node *be_get_Reload_frame(const ir_node *irn);
452
ir_node* be_get_Spill_val(const ir_node *irn);
453
ir_node *be_get_Spill_frame(const ir_node *irn);
454

455
456
void be_set_MemPerm_in_entity(const ir_node *irn, int n, ir_entity* ent);
ir_entity *be_get_MemPerm_in_entity(const ir_node *irn, int n);
Matthias Braun's avatar
Matthias Braun committed
457

458
459
void be_set_MemPerm_out_entity(const ir_node *irn, int n, ir_entity* ent);
ir_entity *be_get_MemPerm_out_entity(const ir_node *irn, int n);
460

461
462
int be_get_MemPerm_entity_arity(const ir_node *irn);

Sebastian Hack's avatar
Sebastian Hack committed
463
464
465
466
467
468
469
/**
 * Impose a register constraint on a backend node.
 * @param irn The node.
 * @param pos The position of the argument/result. Results range from -1..-m and arguments form 0..n
 * @param reg The register which is admissible for that node, argument/result and position.
 */
void be_set_constr_single_reg(ir_node *irn, int pos, const arch_register_t *reg);
470

471
/**
472
473
474
475
476
477
 * Impose register constraints on a backend node.
 * The register subsets given by the limited function in @p req are copied to the backend node.
 * This requires that the constraint type of the @p req is arch_register_req_type_limited.
 * @param irn The backend node.
 * @param pos The position (@see be_set_constr_single_reg()).
 * @param req The register requirements which shall be transferred.
478
 */
479
void be_set_constr_limited(ir_node *irn, int pos, const arch_register_req_t *req);
480

Sebastian Hack's avatar
Sebastian Hack committed
481
482
483
484
485
486
/**
 * Set the flags of a node.
 * @param irn The node itself.
 * @param pos The position (0..n) for arguments, (-1..-m) for results.
 * @param flags The flags to set for that node and position.
 */
Sebastian Hack's avatar
Sebastian Hack committed
487
488
void be_node_set_flags(ir_node *irn, int pos, arch_irn_flags_t flags);

Sebastian Hack's avatar
Sebastian Hack committed
489
490
491
492
493
494
/**
 * Set the register class of a node.
 * @param irn The node itself.
 * @param pos The position (0..n) for arguments, (-1..-m) for results.
 * @param flags The register class to set for that node and position.
 */
Sebastian Hack's avatar
Sebastian Hack committed
495
496
void be_node_set_reg_class(ir_node *irn, int pos, const arch_register_class_t *cls);

Christian Würdig's avatar
Christian Würdig committed
497
498
499
500
501
502
503
504
/**
 * Set the register requirement type of a node.
 * @param irn The node itself.
 * @param pos The position (0..n) for arguments, (-1..-m) for results.
 * @param flags The register requirement type to set for that node and position.
 */
void be_node_set_req_type(ir_node *irn, int pos, arch_register_req_type_t type);

505
/**
Sebastian Hack's avatar
Sebastian Hack committed
506
507
508
 * Make a new phi handler.
 * @param env The architecture environment.
 * @return A new phi handler.
509
 */
Sebastian Hack's avatar
Sebastian Hack committed
510
arch_irn_handler_t *be_phi_handler_new(const arch_env_t *arch_env);
Sebastian Hack's avatar
Sebastian Hack committed
511

Sebastian Hack's avatar
Sebastian Hack committed
512
513
514
515
516
517
518
519
520
521
522
523
/**
 * Free a phi handler.
 * @param handler The handler to free.
 */
void be_phi_handler_free(arch_irn_handler_t *handler);

/**
 * Reset the register data in the phi handler.
 * This should be called on each new graph and deletes the register information of the current graph.
 */
void be_phi_handler_reset(arch_irn_handler_t *handler);

524
525
526
527
528
529
/**
 * Set the register requirements for a phi node.
 */
void be_set_phi_reg_req(const arch_env_t *arch_env, ir_node *phi,
                        const arch_register_req_t *req);

530
531
532
533
534
535
/*
 * Set flags for a phi node
 */
void be_set_phi_flags(const arch_env_t *arch_env, ir_node *phi,
                      arch_irn_flags_t flags);

Sebastian Hack's avatar
Sebastian Hack committed
536
537
538
539
/**
 * irn handler for common be nodes.
 */
extern const arch_irn_handler_t be_node_irn_handler;
Sebastian Hack's avatar
Sebastian Hack committed
540

Christian Würdig's avatar
Christian Würdig committed
541
#endif /* FIRM_BE_BENODE_T_H */