1 
2 #ifndef _ORC_PROGRAM_H_
3 #define _ORC_PROGRAM_H_
4 
5 #include <orc/orc.h>
6 #include <orc/orclimits.h>
7 #include <orc/orcexecutor.h>
8 #include <orc/orccode.h>
9 #include <orc/orcbytecode.h>
10 #include <orc/orccompiler.h>
11 #include <orc/orctarget.h>
12 #include <orc/orcrule.h>
13 
14 ORC_BEGIN_DECLS
15 
16 
17 #define ORC_PROGRAM_ERROR(program, ...) do { \
18   program->error = TRUE; \
19   orc_debug_print(ORC_DEBUG_WARNING, __FILE__, ORC_FUNCTION, __LINE__, __VA_ARGS__); \
20 } while (0)
21 
22 /**
23  * OrcProgram:
24  *
25  * The OrcProgram structure has no public members
26  */
27 struct _OrcProgram {
28   /*< private >*/
29   struct {
30     OrcStaticOpcode *opcode;
31     int dest_args[ORC_STATIC_OPCODE_N_DEST];
32     int src_args[ORC_STATIC_OPCODE_N_SRC];
33 
34     OrcRule *rule;
35   } _unused[ORC_N_INSNS]; /* needed for ABI compatibility */
36   int n_insns;
37 
38   struct {
39     char *name;
40     char *type_name;
41 
42     int size;
43     OrcVarType vartype;
44 
45     int used;
46     int first_use;
47     int last_use;
48     int replaced;
49     int replacement;
50 
51     int alloc;
52     int is_chained;
53     int is_aligned;
54     int is_uncached;
55 
56     int value;
57 
58     int ptr_register;
59     int ptr_offset;
60     int mask_alloc;
61     int aligned_data;
62     int param_type;
63     int load_dest;
64   } _unused3[ORC_N_VARIABLES]; /* needed for ABI compatibility */
65 
66   int n_src_vars;
67   int n_dest_vars;
68   int n_param_vars;
69   int n_const_vars;
70   int n_temp_vars;
71   int n_accum_vars;
72 
73   char *name;
74   char *asm_code;
75 
76   unsigned char *_unused2;
77   /* The offset of code_exec in this structure is part of the ABI */
78   void *code_exec;
79 
80   OrcInstruction insns[ORC_N_INSNS];
81   OrcVariable vars[ORC_N_VARIABLES];
82 
83   void *backup_func;
84   char *backup_name;
85   int is_2d;
86   int constant_n;
87   int n_multiple;
88   int n_minimum;
89   int n_maximum;
90   int constant_m;
91 
92   OrcCode *orccode;
93 
94   /* Hide this here.  Belongs in a Parser object */
95   char *init_function;
96   char *error_msg;
97   unsigned int current_line;
98 };
99 
100 #define ORC_SRC_ARG(p,i,n) ((p)->vars[(i)->src_args[(n)]].alloc)
101 #define ORC_DEST_ARG(p,i,n) ((p)->vars[(i)->dest_args[(n)]].alloc)
102 #define ORC_SRC_TYPE(p,i,n) ((p)->vars[(i)->src_args[(n)]].vartype)
103 #define ORC_DEST_TYPE(p,i,n) ((p)->vars[(i)->dest_args[(n)]].vartype)
104 #define ORC_SRC_VAL(p,insn,n) ((p)->vars[(insn)->src_args[(n)]].value.i)
105 #define ORC_DEST_VAL(p,insn,n) ((p)->vars[(insn)->dest_args[(n)]].value.i)
106 
107 
108 ORC_API void orc_init (void);
109 
110 ORC_API OrcProgram * orc_program_new (void);
111 ORC_API OrcProgram * orc_program_new_ds (int size1, int size2);
112 ORC_API OrcProgram * orc_program_new_dss (int size1, int size2, int size3);
113 ORC_API OrcProgram * orc_program_new_as (int size1, int size2);
114 ORC_API OrcProgram * orc_program_new_ass (int size1, int size2, int size3);
115 ORC_API OrcProgram * orc_program_new_from_static_bytecode (const orc_uint8 *bytecode);
116 
117 ORC_API const char * orc_program_get_name (OrcProgram *program);
118 ORC_API void orc_program_set_name (OrcProgram *program, const char *name);
119 ORC_API void orc_program_set_line (OrcProgram *program, unsigned int line);
120 ORC_API void orc_program_set_2d (OrcProgram *program);
121 ORC_API void orc_program_set_constant_n (OrcProgram *program, int n);
122 ORC_API void orc_program_set_n_multiple (OrcProgram *ex, int n);
123 ORC_API void orc_program_set_n_minimum (OrcProgram *ex, int n);
124 ORC_API void orc_program_set_n_maximum (OrcProgram *ex, int n);
125 ORC_API void orc_program_set_constant_m (OrcProgram *program, int m);
126 
127 ORC_API void orc_program_append (OrcProgram *p, const char *opcode, int arg0, int arg1, int arg2);
128 ORC_API void orc_program_append_2 (OrcProgram *program, const char *name,
129     unsigned int flags, int arg0, int arg1, int arg2, int arg3);
130 ORC_API void orc_program_append_str (OrcProgram *p, const char *opcode,
131     const char * arg0, const char * arg1, const char * arg2);
132 ORC_API void orc_program_append_str_2 (OrcProgram *program, const char *name,
133     unsigned int flags, const char *arg1, const char *arg2, const char *arg3,
134     const char *arg4);
135 ORC_API void orc_program_append_ds (OrcProgram *program, const char *opcode, int arg0,
136     int arg1);
137 ORC_API void orc_program_append_ds_str (OrcProgram *p, const char *opcode,
138     const char * arg0, const char * arg1);
139 ORC_API void orc_program_append_dds_str (OrcProgram *program, const char *name,
140     const char *arg1, const char *arg2, const char *arg3);
141 
142 ORC_API OrcCompileResult orc_program_compile (OrcProgram *p);
143 ORC_API OrcCompileResult orc_program_compile_for_target (OrcProgram *p, OrcTarget *target);
144 ORC_API OrcCompileResult orc_program_compile_full (OrcProgram *p, OrcTarget *target,
145     unsigned int flags);
146 ORC_API void orc_program_set_backup_function (OrcProgram *p, OrcExecutorFunc func);
147 ORC_API void orc_program_set_backup_name (OrcProgram *p, const char *name);
148 ORC_API void orc_program_free (OrcProgram *program);
149 
150 ORC_API int orc_program_find_var_by_name (OrcProgram *program, const char *name);
151 
152 ORC_API int orc_program_add_temporary (OrcProgram *program, int size, const char *name);
153 ORC_API int orc_program_dup_temporary (OrcProgram *program, int i, int j);
154 ORC_API int orc_program_add_source (OrcProgram *program, int size, const char *name);
155 ORC_API int orc_program_add_source_full (OrcProgram *program, int size, const char *name,
156     const char *type_name, int alignment);
157 ORC_API int orc_program_add_destination (OrcProgram *program, int size, const char *name);
158 ORC_API int orc_program_add_destination_full (OrcProgram *program, int size, const char *name,
159     const char *type_name, int alignment);
160 ORC_API int orc_program_add_constant (OrcProgram *program, int size, int value, const char *name);
161 ORC_API int orc_program_add_constant_int64 (OrcProgram *program, int size, orc_int64 value, const char *name);
162 ORC_API int orc_program_add_constant_float (OrcProgram *program, int size, float value, const char *name);
163 ORC_API int orc_program_add_constant_double (OrcProgram *program, int size, double value, const char *name);
164 ORC_API int orc_program_add_constant_str (OrcProgram *program, int size, const char *value, const char *name);
165 ORC_API int orc_program_add_parameter (OrcProgram *program, int size, const char *name);
166 ORC_API int orc_program_add_parameter_float (OrcProgram *program, int size, const char *name);
167 ORC_API int orc_program_add_parameter_double (OrcProgram *program, int size, const char *name);
168 ORC_API int orc_program_add_parameter_int64 (OrcProgram *program, int size, const char *name);
169 ORC_API int orc_program_add_accumulator (OrcProgram *program, int size, const char *name);
170 ORC_API void orc_program_set_type_name (OrcProgram *program, int var, const char *type_name);
171 ORC_API void orc_program_set_var_alignment (OrcProgram *program, int var, int alignment);
172 ORC_API void orc_program_set_sampling_type (OrcProgram *program, int var, int sampling_type);
173 
174 ORC_API int orc_program_allocate_register (OrcProgram *program, int is_data);
175 
176 ORC_API void orc_program_reset (OrcProgram *program);
177 ORC_API OrcCode *orc_program_take_code (OrcProgram *program);
178 
179 ORC_API const char *orc_program_get_asm_code (OrcProgram *program);
180 ORC_API const char * orc_program_get_error (OrcProgram *program);
181 ORC_API void orc_program_set_error (OrcProgram *program, const char *error);
182 
183 ORC_API int orc_program_get_max_array_size (OrcProgram *program);
184 ORC_API int orc_program_get_max_accumulator_size (OrcProgram *program);
185 
186 
187 ORC_END_DECLS
188 
189 #endif
190 
191