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