965828ac4cfd10c7c257f36b8b8f0afc4dcc53b2
[libfirm] / ir / ir / irop.h
1 /*
2 **  Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
3 **  All rights reserved.
4 **
5 **  Authors: Christian Schaefer
6 **
7 **  irop.h  operators of firm nodes
8 **
9 **  This module specifies the opcodes possible for ir nodes.  Their
10 **  definition is close to the operations specified in UKA Tech-Report
11 **  1999-14
12 **
13 */
14
15 /* $Id$ */
16
17 # ifndef _IROP_H_
18 # define _IROP_H_
19
20 # include <stddef.h>
21 # include "ident.h"
22
23 typedef enum {
24   iro_Block,
25   iro_Start, iro_End, iro_Jmp, iro_Cond, iro_Return, iro_Raise,
26   iro_Const, iro_SymConst,
27   iro_Sel,  iro_InstOf,
28   iro_Call, iro_Add, iro_Sub, iro_Minus, iro_Mul, iro_Quot, iro_DivMod,
29   iro_Div,  iro_Mod, iro_Abs, iro_And, iro_Or, iro_Eor, iro_Not,
30   iro_Cmp,  iro_Shl, iro_Shr, iro_Shrs, iro_Rot, iro_Conv,
31   iro_Phi,
32   iro_Load, iro_Store, iro_Alloc, iro_Free, iro_Sync,
33   iro_Proj, iro_Tuple, iro_Id, iro_Bad,
34   iro_Unknown, iro_Filter, iro_Break, iro_CallBegin, iro_EndReg, iro_EndExcept
35 } opcode;
36
37 typedef struct ir_op ir_op;
38
39 extern ir_op *op_Block;
40
41 extern ir_op *op_Start;
42 extern ir_op *op_End;
43 extern ir_op *op_Jmp;
44 extern ir_op *op_Cond;
45 extern ir_op *op_Return;
46 extern ir_op *op_Raise;
47 extern ir_op *op_Sel;
48 extern ir_op *op_InstOf;
49
50 extern ir_op *op_Const;
51 extern ir_op *op_SymConst;
52
53 extern ir_op *op_Call;
54 extern ir_op *op_Add;
55 extern ir_op *op_Sub;
56 extern ir_op *op_Minus;
57 extern ir_op *op_Mul;
58 extern ir_op *op_Quot;
59 extern ir_op *op_DivMod;
60 extern ir_op *op_Div;
61 extern ir_op *op_Mod;
62 extern ir_op *op_Abs;
63 extern ir_op *op_And;
64 extern ir_op *op_Or;
65 extern ir_op *op_Eor;
66 extern ir_op *op_Not;
67 extern ir_op *op_Cmp;
68 extern ir_op *op_Shl;
69 extern ir_op *op_Shr;
70 extern ir_op *op_Shrs;
71 extern ir_op *op_Rot;
72 extern ir_op *op_Conv;
73
74 extern ir_op *op_Phi;
75
76 extern ir_op *op_Load;
77 extern ir_op *op_Store;
78 extern ir_op *op_Alloc;
79 extern ir_op *op_Free;
80
81 extern ir_op *op_Sync;
82
83 extern ir_op *op_Tuple;
84 extern ir_op *op_Proj;
85 extern ir_op *op_Id;
86 extern ir_op *op_Bad;
87
88 extern ir_op *op_Unknown;
89 extern ir_op *op_Filter;
90 extern ir_op *op_Break;
91 extern ir_op *op_CallBegin;
92 extern ir_op *op_EndReg;
93 extern ir_op *op_EndExcept;
94
95
96 /* Returns the ident for the opcode name */
97 ident *get_op_ident     (ir_op *op);
98 /* Returns the string for the opcode. */
99 const char *get_op_name (ir_op *op);
100
101 /* Returns the enum for the opcode */
102 opcode get_op_code      (ir_op *op);
103
104 typedef enum {
105   floats = 0,    /* Nodes of this opcode can be placed in any basic block. */
106   pinned           /* Nodes must remain in this basic block. */
107 } op_pinned;
108
109 op_pinned get_op_pinned (ir_op *op);
110 /* Sets pinned in the opcode.  Setting it to floating has no effect
111    for Block, Phi and control flow nodes. */
112 void      set_op_pinned(ir_op *op, op_pinned pinned);
113
114 /* Returns true if op is one of Start, End, Jmp, Cond, Return, Raise or Bad. */
115 int is_cfopcode(ir_op *op);
116
117 /* Returns the attribute size of nodes of this opcode.
118    @@@ Use not encouraged, internal feature. */
119 int    get_op_attr_size (ir_op *op);
120
121 # endif /* _IROP_H_ */