|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
#ifndef _ORC_EXECUTOR_H_
|
|
Packit |
a43c12 |
#define _ORC_EXECUTOR_H_
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
#include <orc/orcutils.h>
|
|
Packit |
a43c12 |
#include <orc/orclimits.h>
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
ORC_BEGIN_DECLS
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
typedef struct _OrcOpcodeExecutor OrcOpcodeExecutor;
|
|
Packit |
a43c12 |
typedef struct _OrcExecutor OrcExecutor;
|
|
Packit |
a43c12 |
typedef struct _OrcExecutorAlt OrcExecutorAlt;
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
typedef void (*OrcOpcodeEmulateFunc)(OrcOpcodeExecutor *ex, void *user);
|
|
Packit |
a43c12 |
typedef void (*OrcOpcodeEmulateNFunc)(OrcOpcodeExecutor *ex, int index, int n);
|
|
Packit |
a43c12 |
typedef void (*OrcOpcodeEmulate16Func)(OrcOpcodeExecutor *ex);
|
|
Packit |
a43c12 |
typedef void (*OrcExecutorFunc)(OrcExecutor *ex);
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
/**
|
|
Packit |
a43c12 |
* OrcOpcodeExecutor:
|
|
Packit |
a43c12 |
*
|
|
Packit |
a43c12 |
* The OrcOpcodeExecutor structure has no public members
|
|
Packit |
a43c12 |
*/
|
|
Packit |
a43c12 |
struct _OrcOpcodeExecutor {
|
|
Packit |
a43c12 |
/*< private >*/
|
|
Packit |
a43c12 |
int src_values[ORC_STATIC_OPCODE_N_SRC];
|
|
Packit |
a43c12 |
int dest_values[ORC_STATIC_OPCODE_N_DEST];
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
OrcOpcodeEmulateNFunc emulateN;
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
void *src_ptrs[ORC_STATIC_OPCODE_N_SRC];
|
|
Packit |
a43c12 |
void *dest_ptrs[ORC_STATIC_OPCODE_N_DEST];
|
|
Packit |
a43c12 |
int shift;
|
|
Packit |
a43c12 |
};
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
/**
|
|
Packit |
a43c12 |
* OrcExecutor:
|
|
Packit |
a43c12 |
*
|
|
Packit |
a43c12 |
*/
|
|
Packit |
a43c12 |
struct _OrcExecutor {
|
|
Packit |
a43c12 |
/*< private >*/
|
|
Packit |
a43c12 |
OrcProgram *program;
|
|
Packit |
a43c12 |
int n;
|
|
Packit |
a43c12 |
int counter1;
|
|
Packit |
a43c12 |
int counter2;
|
|
Packit |
a43c12 |
int counter3;
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
void *arrays[ORC_N_VARIABLES];
|
|
Packit |
a43c12 |
int params[ORC_N_VARIABLES];
|
|
Packit |
a43c12 |
int accumulators[4];
|
|
Packit |
a43c12 |
/* exec pointer is stored in arrays[ORC_VAR_A1] */
|
|
Packit |
a43c12 |
/* OrcCode pointer is stored in arrays[ORC_VAR_A2] */
|
|
Packit |
a43c12 |
/* row pointers are stored in arrays[i+ORC_VAR_C1] */
|
|
Packit |
a43c12 |
/* the stride for arrays[x] is stored in params[x] */
|
|
Packit |
a43c12 |
/* m is stored in params[ORC_VAR_A1] */
|
|
Packit |
a43c12 |
/* m_index is stored in params[ORC_VAR_A2] */
|
|
Packit |
a43c12 |
/* elapsed time is stored in params[ORC_VAR_A3] */
|
|
Packit |
a43c12 |
/* high half of params is stored in params[ORC_VAR_T1..] */
|
|
Packit |
a43c12 |
};
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
/* the alternate view of OrcExecutor */
|
|
Packit |
a43c12 |
struct _OrcExecutorAlt {
|
|
Packit |
a43c12 |
/*< private >*/
|
|
Packit |
a43c12 |
OrcProgram *program;
|
|
Packit |
a43c12 |
int n;
|
|
Packit |
a43c12 |
int counter1;
|
|
Packit |
a43c12 |
int counter2;
|
|
Packit |
a43c12 |
int counter3;
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
void *arrays[ORC_N_ARRAYS];
|
|
Packit |
a43c12 |
OrcExecutorFunc exec;
|
|
Packit |
a43c12 |
OrcCode *code;
|
|
Packit |
a43c12 |
void *unused1[ORC_N_VARIABLES - ORC_N_ARRAYS - 2];
|
|
Packit |
a43c12 |
int strides[ORC_N_ARRAYS];
|
|
Packit |
a43c12 |
int m;
|
|
Packit |
a43c12 |
int m_index;
|
|
Packit |
a43c12 |
int time;
|
|
Packit |
a43c12 |
int unused2;
|
|
Packit |
a43c12 |
int unused4[8];
|
|
Packit |
a43c12 |
int params[ORC_VAR_T1-ORC_VAR_P1];
|
|
Packit |
a43c12 |
int params_hi[ORC_VAR_T1-ORC_VAR_P1];
|
|
Packit |
a43c12 |
int unused3[ORC_N_VARIABLES - ORC_VAR_T9];
|
|
Packit |
a43c12 |
int accumulators[4];
|
|
Packit |
a43c12 |
};
|
|
Packit |
a43c12 |
#define ORC_EXECUTOR_EXEC(ex) ((OrcExecutorFunc)((ex)->arrays[ORC_VAR_A1]))
|
|
Packit |
a43c12 |
#define ORC_EXECUTOR_M(ex) ((ex)->params[ORC_VAR_A1])
|
|
Packit |
a43c12 |
#define ORC_EXECUTOR_M_INDEX(ex) ((ex)->params[ORC_VAR_A2])
|
|
Packit |
a43c12 |
#define ORC_EXECUTOR_TIME(ex) ((ex)->params[ORC_VAR_A3])
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
OrcExecutor * orc_executor_new (OrcProgram *program);
|
|
Packit |
a43c12 |
void orc_executor_free (OrcExecutor *ex);
|
|
Packit |
a43c12 |
void orc_executor_set_program (OrcExecutor *ex, OrcProgram *program);
|
|
Packit |
a43c12 |
void orc_executor_set_array (OrcExecutor *ex, int var, void *ptr);
|
|
Packit |
a43c12 |
void orc_executor_set_stride (OrcExecutor *ex, int var, int stride);
|
|
Packit |
a43c12 |
void orc_executor_set_array_str (OrcExecutor *ex, const char *name, void *ptr);
|
|
Packit |
a43c12 |
void orc_executor_set_param (OrcExecutor *ex, int var, int value);
|
|
Packit |
a43c12 |
void orc_executor_set_param_str (OrcExecutor *ex, const char *name, int value);
|
|
Packit |
a43c12 |
void orc_executor_set_param_float (OrcExecutor *ex, int var, float value);
|
|
Packit |
a43c12 |
void orc_executor_set_param_int64 (OrcExecutor *ex, int var, orc_int64 value);
|
|
Packit |
a43c12 |
void orc_executor_set_param_double (OrcExecutor *ex, int var, double value);
|
|
Packit |
a43c12 |
int orc_executor_get_accumulator (OrcExecutor *ex, int var);
|
|
Packit |
a43c12 |
int orc_executor_get_accumulator_str (OrcExecutor *ex, const char *name);
|
|
Packit |
a43c12 |
void orc_executor_set_n (OrcExecutor *ex, int n);
|
|
Packit |
a43c12 |
void orc_executor_set_m (OrcExecutor *ex, int m);
|
|
Packit |
a43c12 |
void orc_executor_emulate (OrcExecutor *ex);
|
|
Packit |
a43c12 |
void orc_executor_run (OrcExecutor *ex);
|
|
Packit |
a43c12 |
void orc_executor_run_backup (OrcExecutor *ex);
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
ORC_END_DECLS
|
|
Packit |
a43c12 |
|
|
Packit |
a43c12 |
#endif
|
|
Packit |
a43c12 |
|