00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 #include "xsb_config.h"
00062 #include "basictypes.h"
00063 #include "box_defines.h"
00064
00065
00066 #define PRE_IMAGE_TRAIL
00067
00068 #define PRE_IMAGE_MARK 1
00069
00070 #define TRAIL_FRAME_SIZE 4
00071
00072 #define pushtrail0(addr,val) \
00073 if (trfreg > trreg) {\
00074 if ((char *)trfreg > \
00075 ((char *)(top_of_cpstack) - (TRAIL_FRAME_SIZE*sizeof(CPtr)))) {\
00076 handle_tcpstack_overflow(CTXT);\
00077 }\
00078 *(trfreg+3) = (CPtr) trreg;\
00079 trreg = trfreg + 3;\
00080 *(trreg-1) = (CPtr) val;\
00081 *(trreg-2) = addr;\
00082 }\
00083 else {\
00084 if ((char *)trreg > \
00085 ((char *)(top_of_cpstack) - (TRAIL_FRAME_SIZE*sizeof(CPtr)))) {\
00086 handle_tcpstack_overflow(CTXT);\
00087 }\
00088 trreg = trreg+3;\
00089 *trreg = (CPtr) trreg-3;\
00090 *(trreg-1) = (CPtr) val;\
00091 *(trreg-2) = addr;\
00092 }
00093
00094 #ifdef PRE_IMAGE_TRAIL
00095 #define push_pre_image_trail0(addr, new_value) \
00096 if (trfreg > trreg) { \
00097 if ((char *)trfreg > ((char *)(top_of_cpstack) - \
00098 TRAIL_FRAME_SIZE*sizeof(CPtr))) { \
00099 handle_tcpstack_overflow(CTXT); \
00100 } \
00101 *(trfreg + 4) = (CPtr) trreg; \
00102 trreg = trfreg + 4; \
00103 *(trreg - 1) = (CPtr) (new_value); \
00104 *(trreg - 2) = (CPtr) ((Cell) (addr) | PRE_IMAGE_MARK); \
00105 *(trreg - 3) = (CPtr) (cell(addr)); \
00106 } \
00107 else { \
00108 if ((char *)trreg > ((char *)(top_of_cpstack) - \
00109 TRAIL_FRAME_SIZE*sizeof(CPtr))) { \
00110 handle_tcpstack_overflow(CTXT); \
00111 } \
00112 trreg = trreg + 4; \
00113 *trreg = (CPtr) trreg - 4; \
00114 *(trreg - 1) = (CPtr) (new_value); \
00115 *(trreg - 2) = (CPtr) ((Cell) (addr) | PRE_IMAGE_MARK); \
00116 *(trreg - 3) = (CPtr) (cell(addr)); \
00117 }
00118 #endif
00119
00120 #define conditional(a) ( ((a) >= ebreg || (a) >= efreg) || \
00121 ((a) < hbreg || (a) < hfreg) )
00122
00123 #define pushtrail(a,v) if (conditional(a)) { pushtrail0(a,v); }
00124 #define dpushtrail(a,v) pushtrail0(a,v)
00125
00126 #ifdef PRE_IMAGE_TRAIL
00127 #define push_pre_image_trail(a, new_v) \
00128 if (conditional(a)) {push_pre_image_trail0(a, new_v)}
00129 #endif
00130
00131
00132
00133 #define bind_int_tagged(addr, val) pushtrail(addr, (Cell) val); \
00134 bld_int_tagged(addr, val)
00135
00136 #define bind_float_tagged(addr, val) pushtrail(addr, (Cell) val);\
00137 bld_float_tagged(addr, val)
00138
00139 #define bind_int(addr, val) pushtrail(addr, makeint(val));\
00140 bld_int(addr, val)
00141
00142 #define bind_float(addr, val) pushtrail(addr, makefloat(val)); bld_float(addr, val)
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 #define bind_boxedint(addr, value) \
00154 {Cell binttemp = makecs(hreg); \
00155 new_heap_functor(hreg,box_psc); \
00156 bld_int(hreg,((ID_BOXED_INT << BOX_ID_OFFSET ) )); hreg++; \
00157 bld_int(hreg,INT_LOW_24_BITS(value)); hreg++; \
00158 bld_int(hreg,((value) & LOW_24_BITS_MASK)); hreg++; \
00159 pushtrail(addr, binttemp); \
00160 cell(addr) = binttemp;}
00161
00162
00163 #ifndef FAST_FLOATS
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180 #define bind_boxedfloat(addr, value) \
00181 { pushtrail(addr, (Cell)makecs(hreg)); \
00182 bld_boxedfloat(CTXTc addr, value); }
00183 #else
00184 #define bind_boxedfloat(addr, value) bind_float(addr, value)
00185 #endif
00186
00187
00188 #define bind_oint(addr, val) \
00189 if (int_overflow(val)) { \
00190 bind_boxedint(addr, val); \
00191 } else {bind_int(addr, val);}
00192
00193
00194 #define bind_ref(addr, val) pushtrail(addr, val);\
00195 bld_ref(addr, val)
00196
00197 #define dbind_ref(addr, val) dpushtrail(addr, val);\
00198 bld_ref(addr, val)
00199
00200 #define bind_cs(addr, str) pushtrail(addr, makecs(str));\
00201 bld_cs(addr, str)
00202
00203 #define bind_string(addr, str) pushtrail(addr, makestring(str));\
00204 bld_string(addr,str)
00205
00206 #define bind_nil(addr) pushtrail(addr, makenil);\
00207 bld_nil(addr)
00208
00209 #define bind_list(addr, list) pushtrail(addr, makelist(list));\
00210 bld_list(addr, list)
00211
00212 #define bind_attv(addr, attv) pushtrail(addr, makeattv(attv));\
00213 bld_attv(addr, attv)
00214
00215 #define bind_copy(addr, val) pushtrail(addr, val); *(addr) = val
00216
00217
00218
00219 #define untrail(addr) bld_free(addr)
00220
00221 #ifdef PRE_IMAGE_TRAIL
00222
00223 #define untrail2(trail_ptr, addr) \
00224 if ((addr) & PRE_IMAGE_MARK) { \
00225 bld_copy0((CPtr)((addr) - PRE_IMAGE_MARK), \
00226 cell((CPtr)trail_ptr - 3)); \
00227 } \
00228 else \
00229 bld_free((CPtr)(addr))
00230
00231 #endif
00232
00233
00234
00235
00236 #define ereg_on_top(t_ereg) t_ereg < ebreg
00237
00238 #define efreg_on_top(t_ereg) efreg < ebreg && efreg < t_ereg
00239
00240
00241
00242 #define nbldval(OP1) { \
00243 XSB_Deref(OP1); \
00244 if ( isnonvar(OP1) || \
00245 ( \
00246 (CPtr)(OP1) <= top_of_heap ) ) { \
00247 new_heap_node(hreg, OP1); \
00248 } \
00249 else { \
00250 bind_ref((CPtr)(OP1), hreg); \
00251 new_heap_free(hreg); \
00252 } \
00253 }