1 #ifndef OPCODE_H
2 #define OPCODE_H
3
4 #include "symbol.h"
5
6 enum opcode {
7 #define OPCODE(OP,NG,SW,SG,TF,N,FL) OP_##OP,
8 #define OPCODE_RANGE(OP,S,E) OP_##OP = OP_##S, OP_##OP##_END = OP_##E,
9 #include "opcode.def"
10 #undef OPCODE
11 #undef OPCODE_RANGE
12 OP_LAST, /* keep this one last! */
13 };
14
15 extern const struct opcode_table {
16 int negate:8;
17 int swap:8;
18 int sign:8;
19 int to_float:8;
20 unsigned int arity:2;
21 unsigned int :6;
22 unsigned int flags:8;
23 #define OPF_NONE 0
24 #define OPF_TARGET (1 << 0)
25 #define OPF_COMMU (1 << 1)
26 #define OPF_ASSOC (1 << 2)
27 #define OPF_UNOP (1 << 3)
28 #define OPF_BINOP (1 << 4)
29 #define OPF_COMPARE (1 << 5)
30 #define OPF_SIGNED (1 << 6)
31 #define OPF_UNSIGNED (1 << 7)
32 } opcode_table[];
33
34
opcode_negate(int opcode)35 static inline int opcode_negate(int opcode)
36 {
37 return opcode_table[opcode].negate;
38 }
39
opcode_swap(int opcode)40 static inline int opcode_swap(int opcode)
41 {
42 return opcode_table[opcode].swap;
43 }
44
opcode_float(int opcode,struct symbol * type)45 static inline int opcode_float(int opcode, struct symbol *type)
46 {
47 if (!type || !is_float_type(type))
48 return opcode;
49 return opcode_table[opcode].to_float;
50 }
51
52 #endif
53