RPA Toolkit
merge the work on extended ops
[rpatk.git] / rvm / rvmoperator.h
1 #ifndef _RVMOPERATOR_H_
2 #define _RVMOPERATOR_H_
3
4 #include "rtypes.h"
5 #include "rarray.h"
6 #include "rvmcpu.h"
7
8 #define RVM_UNARY_HANDLER(__t__) (__t__)
9 #define RVM_OP_HANDLER(__ft__, __st__) ((__ft__) * RVM_DTYPE_MAX + (__st__))
10
11
12 #define RVM_OPID_NONE 0
13 #define RVM_OPID_ADD 1
14 #define RVM_OPID_SUB 2
15 #define RVM_OPID_MUL 3
16 #define RVM_OPID_DIV 4
17 #define RVM_OPID_CAT 5
18 #define RVM_OPID_CAST 6
19
20 /*
21  * Important: the res pointer might be the same as one of the arguments, the operator must
22  * be implemented to take care of such cases.
23  */
24 typedef void (*rvm_unaryop_handler)(rvmcpu_t *cpu, rvmreg_t *res, const rvmreg_t *arg);
25 typedef void (*rvm_binaryop_handler)(rvmcpu_t *cpu, rvmreg_t *res, const rvmreg_t *arg1, const rvmreg_t *arg2);
26
27 typedef union rvm_ophandler_s {
28         rvm_unaryop_handler unary;
29         rvm_binaryop_handler op;
30 } rvm_ophandler_t;
31
32 typedef struct rvm_opinfo_s {
33         rushort opid;
34         rboolean unary;
35         rvm_ophandler_t *handlers;
36 } rvm_opinfo_t;
37
38 typedef struct rvm_opmap_s {
39         rarray_t *operators;
40 } rvm_opmap_t;
41
42
43 rvm_opmap_t *rvm_opmap_create();
44 void rvm_opmap_destroy(rvm_opmap_t *opmap);
45 void rvm_opmap_add_binary_operator(rvm_opmap_t *opmap, rushort opid);
46 void rvm_opmap_add_unary_operator(rvm_opmap_t *opmap, rushort opid);
47 rint rvm_opmap_set_binary_handler(rvm_opmap_t *opmap, rushort opid, rvm_binaryop_handler func, ruchar firstType, ruchar secondType);
48 rint rvm_opmap_set_unary_handler(rvm_opmap_t *opmap, rushort opid, rvm_unaryop_handler func, ruchar type);
49 void rvm_opmap_invoke_binary_handler(rvm_opmap_t *opmap, rushort opid, rvmcpu_t *cpu, rvmreg_t *res, const rvmreg_t *arg1, const rvmreg_t *arg2);
50 void rvm_opmap_invoke_unary_handler(rvm_opmap_t *opmap, rushort opid, rvmcpu_t *cpu, rvmreg_t *res, const rvmreg_t *arg);
51
52 #endif