RPA Toolkit
added pair type to the RVM and fixed EADD tests
[rpatk.git] / rvm / rvmreg.h
1 #ifndef _RVMREG_H_
2 #define _RVMREG_H_
3
4 //#include "rvmcpu.h"
5 #include "robject.h"
6 #include "rarray.h"
7 #include "rharray.h"
8 #include "rcarray.h"
9 #include "rstring.h"
10
11
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15
16 #define RVM_DTYPE_NONE 0
17 #define RVM_DTYPE_WORD RVM_DTYPE_NONE
18 #define RVM_DTYPE_UNSIGNED RVM_DTYPE_NONE
19 #define RVM_DTYPE_LONG 1
20 #define RVM_DTYPE_POINTER 2                     /* Generic pointer, it can point to any memory object */
21 #define RVM_DTYPE_BOOLEAN 3
22 #define RVM_DTYPE_STRING 4
23 #define RVM_DTYPE_ARRAY 5
24 #define RVM_DTYPE_HARRAY 6
25 #define RVM_DTYPE_DOUBLE 7
26 #define RVM_DTYPE_NAN 8
27 #define RVM_DTYPE_UNDEF 9
28 #define RVM_DTYPE_JSOBJECT 10
29 #define RVM_DTYPE_FUNCTION 11
30 #define RVM_DTYPE_SWIID 13                      /* SWI ID */
31 #define RVM_DTYPE_RELOCPTR 14           /* Relocation, using pointers */
32 #define RVM_DTYPE_RELOCINDEX 15         /* Relocation, using offsets */
33 #define RVM_DTYPE_USER 16
34 #define RVM_DTYPE_SIZE (1 << 5)
35 #define RVM_DTYPE_MASK (RVM_DTYPE_SIZE - 1)
36 #define RVM_DTYPE_MAX (RVM_DTYPE_MASK)
37 #define RVM_DTYPE_USERDEF(__n__) (RVM_DTYPE_USER + (__n__))
38
39 #define RVM_INFOBIT_ROBJECT (1 << 0)
40 #define RVM_INFOBIT_LAST (1 << 15)
41 #define RVM_INFOBIT_ALL (RVM_INFOBIT_ROBJECT | RVM_INFOBIT_LAST)
42
43
44 #define RVM_CPUREG_R_PTR(__cpu__, __r__) (&(__cpu__)->r[(__r__)])
45 #define RVM_CPUREG_PTR(__cpu__, __r__) RVM_CPUREG_R_PTR(__cpu__, __r__)
46 #define RVM_CPUREG_GET(__cpu__, __r__) *(RVM_CPUREG_PTR(__cpu__, __r__))
47 #define RVM_CPUREG_SET(__cpu__, __r__, __val__) do { *(RVM_CPUREG_PTR(__cpu__, __r__)) = (rvmreg_t)(__val__); } while (0)
48
49 #define RVM_REG_GETTYPE(__r__) (__r__)->type
50 #define RVM_REG_SETTYPE(__r__, __val__) do { (__r__)->type = (__val__); } while(0);
51 #define RVM_CPUREG_GETTYPE(__cpu__, __r__) RVM_REG_GETTYPE(RVM_CPUREG_PTR(__cpu__, __r__))
52 #define RVM_CPUREG_SETTYPE(__cpu__, __r__, __val__) RVM_REG_SETTYPE(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
53
54 #define RVM_REG_TSTFLAG(__r__, __flag__) ((__r__)->flags & (__flag__)) ? TRUE : FALSE
55 #define RVM_REG_SETFLAG(__r__, __flag__) do { (__r__)->flags |= (__flag__); } while (0)
56 #define RVM_REG_GETFLAGS(__r__) (__r__)->flags
57 #define RVM_REG_CLRFLAG(__r__, __flag__) do { (__r__)->flags &= ~(__flag__); } while (0)
58 #define RVM_REG_ASSIGNFLAGS(__r__, __flags__) do { (__r__)->flags = (__flags__); } while (0)
59 #define RVM_CPUREG_TSTFLAG(__cpu__, __r__, __flag__) RVM_REG_TSTFLAG(RVM_CPUREG_PTR(__cpu__, __r__), __flag__)
60 #define RVM_CPUREG_SETFLAG(__cpu__, __r__, __flag__) RVM_REG_SETFLAG(RVM_CPUREG_PTR(__cpu__, __r__), __flag__)
61 #define RVM_CPUREG_GETFLAGS(__cpu__, __r__) RVM_REG_GETFLAGS(RVM_CPUREG_PTR(__cpu__, __r__))
62 #define RVM_CPUREG_CLRFLAG(__cpu__, __r__, __flag__) RVM_REG_CLRFLAG(RVM_CPUREG_PTR(__cpu__, __r__), __flag__)
63 #define RVM_CPUREG_ASSIGNFLAGS(__cpu__, __r__, __flags__) RVM_REG_ASSIGNFLAGS(RVM_CPUREG_PTR(__cpu__, __r__), __flags__)
64
65
66 #define RVM_REG_GETU(__r__) (__r__)->v.w
67 #define RVM_REG_SETU(__r__, __val__) do { (__r__)->v.w = (rword)(__val__); } while (0)
68 #define RVM_CPUREG_GETU(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.w
69 #define RVM_CPUREG_SETU(__cpu__, __r__, __val__) RVM_REG_SETU(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
70
71 #define RVM_REG_GETL(__r__) (__r__)->v.l
72 #define RVM_REG_SETL(__r__, __val__) do { (__r__)->v.l = (rlong)(__val__); } while (0)
73 #define RVM_CPUREG_GETL(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.l
74 #define RVM_CPUREG_SETL(__cpu__, __r__, __val__) RVM_REG_SETL(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
75
76 #define RVM_REG_GETP(__r__) (__r__)->v.p
77 #define RVM_REG_SETP(__r__, __val__) do { (__r__)->v.p = (rpointer)(__val__); } while (0)
78 #define RVM_CPUREG_GETP(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.p
79 #define RVM_CPUREG_SETP(__cpu__, __r__, __val__) RVM_REG_SETP(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
80
81 #define RVM_REG_GETD(__r__) (__r__)->v.d
82 #define RVM_REG_SETD(__r__, __val__) do { (__r__)->v.d = (rdouble)(__val__); } while (0)
83 #define RVM_CPUREG_GETD(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.d
84 #define RVM_CPUREG_SETD(__cpu__, __r__, __val__) RVM_REG_SETD(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
85
86 #define RVM_REG_GETU64(__r__) (__r__)->v.u64
87 #define RVM_REG_SETU64(__r__, __val__) do { (__r__)->v.u64 = (ruint64)(__val__); } while (0)
88 #define RVM_CPUREG_GETU64(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.u64
89 #define RVM_CPUREG_SETU64(__cpu__, __r__, __val__) RVM_REG_SETU64(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
90
91 #define RVM_REG_GETPAIR(__r__) (__r__)->v.pair
92 #define RVM_REG_SETPAIR(__r__, __val__) do { (__r__)->v.pair = (ruint64)(__val__); } while (0)
93 #define RVM_CPUREG_GETPAIR(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.pair
94 #define RVM_CPUREG_SETPAIR(__cpu__, __r__, __val__) RVM_REG_SETPAIR(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
95
96
97 #define RVM_REG_GETIP(__r__) (rvm_asmins_t*)((__r__)->v.p)
98 #define RVM_REG_SETIP(__r__, __val__) do { (__r__)->v.p = (rpointer)(__val__); } while (0)
99 #define RVM_REG_INCIP(__r__, __val__) do {rvm_asmins_t *p = RVM_REG_GETIP(__r__); (__r__)->v.p = (rpointer)(p + (__val__)); } while (0)
100 #define RVM_CPUREG_GETIP(__cpu__, __r__) ((rvm_asmins_t*)RVM_CPUREG_PTR(__cpu__, __r__)->v.p)
101 #define RVM_CPUREG_SETIP(__cpu__, __r__, __val__) RVM_REG_SETIP(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
102 #define RVM_CPUREG_INCIP(__cpu__, __r__, __val__) do {rvm_asmins_t *p = RVM_CPUREG_GETIP(__cpu__, __r__); (RVM_CPUREG_PTR(__cpu__, __r__))->v.p = (rpointer)(p + (__val__)); } while (0)
103
104 #define RVM_REG_SIZE(__r__) (__r__)->size
105 #define RVM_REG_CLEAR(__r__) do { (__r__)->v.w = 0UL; (__r__)->type = 0; (__r__)->flags = 0;  } while (0)
106 #define RVM_CPUREG_CLEAR(__cpu__, __r__) RVM_REG_CLEAR(RVM_CPUREG_PTR(__cpu__, __r__))
107
108
109
110 #define RVM_MIN_REGSIZE (sizeof(rword)/8)
111
112 typedef ruint16 rvmreg_type_t;
113 typedef ruint16 rvmreg_flags_t;
114
115 typedef struct rvmreg_s {
116         union {
117                 ruint64 u64;
118                 rpair pair;
119                 rword w;
120                 rlong l;
121                 rpointer p;
122                 rdouble d;
123                 ruint8 c[RVM_MIN_REGSIZE];
124         } v;
125         rvmreg_type_t type;
126         rvmreg_flags_t flags;
127         ruint32 size;
128 } rvmreg_t;
129
130 /* Create array with rvmreg elements */
131 rarray_t *r_array_create_rvmreg();
132 /* Create harray with rvmreg elements */
133 rharray_t *r_harray_create_rvmreg();
134 /* Create carray with rvmreg elements */
135 rcarray_t *r_carray_create_rvmreg();
136
137 rvmreg_t rvm_reg_create_string_ansi(const rchar *s);
138 rvmreg_t rvm_reg_create_string(const rstr_t *s);
139 rvmreg_t rvm_reg_create_array();
140 rvmreg_t rvm_reg_create_harray();
141 rvmreg_t rvm_reg_create_double(rdouble d);
142 rvmreg_t rvm_reg_create_long(rlong l);
143 void rvm_reg_init(rvmreg_t *reg);
144 void rvm_reg_cleanup(rvmreg_t *reg);
145 rvmreg_t *rvm_reg_copy(rvmreg_t *dst, const rvmreg_t *src);
146 void rvm_reg_array_unref_gcdata(robject_t *obj);
147 void rvm_reg_settype(rvmreg_t *r, ruint type);
148 ruint rvm_reg_gettype(const rvmreg_t *r);
149 rboolean rvm_reg_tstflag(const rvmreg_t *r, ruint16 flag);
150 void rvm_reg_setflag(rvmreg_t *r, ruint16 flag);
151 void rvm_reg_clrflag(rvmreg_t *r, ruint16 flag);
152 void rvm_reg_setunsigned(rvmreg_t *r, rword u);
153 void rvm_reg_setlong(rvmreg_t *r, rlong l);
154 void rvm_reg_setdouble(rvmreg_t *r, rdouble d);
155 void rvm_reg_setstring(rvmreg_t *r, rstring_t *ptr);
156 void rvm_reg_setarray(rvmreg_t *r, robject_t *ptr);
157 void rvm_reg_setharray(rvmreg_t *r, robject_t *ptr);
158 void rvm_reg_setjsobject(rvmreg_t *r, robject_t *ptr);
159 int rvm_reg_str2num(rvmreg_t *dst, const rvmreg_t *src);
160 int rvm_reg_str2long(rvmreg_t *dst, const rvmreg_t *ssrc);
161 int rvm_reg_str2double(rvmreg_t *dst, const rvmreg_t *ssrc);
162
163
164 #ifdef __cplusplus
165 }
166 #endif
167
168 #endif