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