1 
2 
3 
4 
5 
6 
7 
8 /*************************************************************************
9 *									 *
10 *	 YAP Prolog   %W% %G%
11 *									 *
12 *	Yap Prolog was developed at NCCUP - Universidade do Porto	 *
13 *									 *
14 * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 *
15 *									 *
16 **************************************************************************
17 *									 *
18 * File:		sshift.h						 *
19 * Last rev:	19/2/88							 *
20 * mods:									 *
21 * comments:	stack shifter functionality for YAP			 *
22 *									 *
23 *************************************************************************/
24 
25 
26 /* The difference between the old stack pointers and the new ones */
27 extern Int HDiff,
28   GDiff,
29   LDiff,
30   TrDiff,
31   XDiff,
32   DelayDiff;
33 
34 /* The old stack pointers */
35 extern CELL    *OldASP, *OldLCL0;
36 extern tr_fr_ptr OldTR;
37 extern CELL    *OldGlobalBase, *OldH, *OldH0;
38 extern ADDR     OldTrailBase, OldTrailTop;
39 extern ADDR     OldHeapBase, OldHeapTop;
40 
41 #define CharP(ptr)	((char *) (ptr))
42 
43 
44 inline EXTERN int IsHeapP(CELL *);
45 
IsHeapP(CELL * ptr)46 inline EXTERN int IsHeapP(CELL * ptr)
47 {
48 	return (int) ((ptr >= (CELL *)HeapBase && ptr <= (CELL *)HeapTop) );
49 }
50 
51 
52 
53 /* Adjusting cells and pointers to cells */
54 
55 inline EXTERN CELL * PtoGloAdjust(CELL *);
56 
PtoGloAdjust(CELL * ptr)57 inline EXTERN CELL * PtoGloAdjust(CELL * ptr)
58 {
59 	return (CELL *) (((CELL *)(CharP(ptr) + GDiff)) );
60 }
61 
62 
63 
64 inline EXTERN CELL * PtoDelayAdjust(CELL *);
65 
PtoDelayAdjust(CELL * ptr)66 inline EXTERN CELL * PtoDelayAdjust(CELL * ptr)
67 {
68 	return (CELL *) (((CELL *)(CharP(ptr) + DelayDiff)) );
69 }
70 
71 
72 
73 inline EXTERN tr_fr_ptr PtoTRAdjust(tr_fr_ptr);
74 
PtoTRAdjust(tr_fr_ptr ptr)75 inline EXTERN tr_fr_ptr PtoTRAdjust(tr_fr_ptr ptr)
76 {
77 	return (tr_fr_ptr) (((tr_fr_ptr)(CharP(ptr) + TrDiff)) );
78 }
79 
80 
81 
82 inline EXTERN CELL * CellPtoTRAdjust(CELL *);
83 
CellPtoTRAdjust(CELL * ptr)84 inline EXTERN CELL * CellPtoTRAdjust(CELL * ptr)
85 {
86 	return (CELL *) (((CELL *)(CharP(ptr) + TrDiff)) );
87 }
88 
89 
90 
91 inline EXTERN CELL * PtoLocAdjust(CELL *);
92 
PtoLocAdjust(CELL * ptr)93 inline EXTERN CELL * PtoLocAdjust(CELL * ptr)
94 {
95 	return (CELL *) (((CELL *)(CharP(ptr) + LDiff)) );
96 }
97 
98 
99 
100 inline EXTERN choiceptr ChoicePtrAdjust(choiceptr);
101 
ChoicePtrAdjust(choiceptr ptr)102 inline EXTERN choiceptr ChoicePtrAdjust(choiceptr ptr)
103 {
104 	return (choiceptr) (((choiceptr)(CharP(ptr) + LDiff)) );
105 }
106 
107 
108 #ifdef TABLING
109 
110 inline EXTERN choiceptr ConsumerChoicePtrAdjust(choiceptr);
111 
ConsumerChoicePtrAdjust(choiceptr ptr)112 inline EXTERN choiceptr ConsumerChoicePtrAdjust(choiceptr ptr)
113 {
114 	return (choiceptr) (((choiceptr)(CharP(ptr) + LDiff)) );
115 }
116 
117 
118 
119 inline EXTERN choiceptr GeneratorChoicePtrAdjust(choiceptr);
120 
GeneratorChoicePtrAdjust(choiceptr ptr)121 inline EXTERN choiceptr GeneratorChoicePtrAdjust(choiceptr ptr)
122 {
123 	return (choiceptr) (((choiceptr)(CharP(ptr) + LDiff)) );
124 }
125 
126 
127 #endif /* TABLING */
128 
129 
130 inline EXTERN CELL GlobalAdjust(CELL);
131 
GlobalAdjust(CELL val)132 inline EXTERN CELL GlobalAdjust(CELL val)
133 {
134 	return (CELL) ((val+GDiff) );
135 }
136 
137 
138 
139 inline EXTERN CELL DelayAdjust(CELL);
140 
DelayAdjust(CELL val)141 inline EXTERN CELL DelayAdjust(CELL val)
142 {
143 	return (CELL) ((val+DelayDiff) );
144 }
145 
146 
147 
148 inline EXTERN ADDR GlobalAddrAdjust(ADDR);
149 
GlobalAddrAdjust(ADDR ptr)150 inline EXTERN ADDR GlobalAddrAdjust(ADDR ptr)
151 {
152 	return (ADDR) ((ptr+GDiff) );
153 }
154 
155 
156 
157 inline EXTERN ADDR DelayAddrAdjust(ADDR);
158 
DelayAddrAdjust(ADDR ptr)159 inline EXTERN ADDR DelayAddrAdjust(ADDR ptr)
160 {
161 	return (ADDR) ((ptr+DelayDiff) );
162 }
163 
164 
165 
166 inline EXTERN CELL LocalAdjust(CELL);
167 
LocalAdjust(CELL val)168 inline EXTERN CELL LocalAdjust(CELL val)
169 {
170 	return (CELL) ((val+LDiff) );
171 }
172 
173 
174 
175 inline EXTERN ADDR LocalAddrAdjust(ADDR);
176 
LocalAddrAdjust(ADDR ptr)177 inline EXTERN ADDR LocalAddrAdjust(ADDR ptr)
178 {
179 	return (ADDR) ((ptr+LDiff) );
180 }
181 
182 
183 
184 inline EXTERN CELL TrailAdjust(CELL);
185 
TrailAdjust(CELL val)186 inline EXTERN CELL TrailAdjust(CELL val)
187 {
188 	return (CELL) ((val+TrDiff) );
189 }
190 
191 
192 
193 inline EXTERN ADDR TrailAddrAdjust(ADDR);
194 
TrailAddrAdjust(ADDR ptr)195 inline EXTERN ADDR TrailAddrAdjust(ADDR ptr)
196 {
197 	return (ADDR) ((ptr+TrDiff) );
198 }
199 
200 
201 /* heap data structures */
202 
203 inline EXTERN Functor FuncAdjust(Functor);
204 
FuncAdjust(Functor f)205 inline EXTERN Functor FuncAdjust(Functor f)
206 {
207 	return (Functor) ((Functor)(CharP(f)+HDiff) );
208 }
209 
210 
211 
212 inline EXTERN CELL * CellPtoHeapAdjust(CELL *);
213 
CellPtoHeapAdjust(CELL * ptr)214 inline EXTERN CELL * CellPtoHeapAdjust(CELL * ptr)
215 {
216 	return (CELL *) (((CELL *)(CharP(ptr) + HDiff)) );
217 }
218 
219 
220 #if	USE_OFFSETS
221 
222 inline EXTERN Atom AtomAdjust(Atom);
223 
AtomAdjust(Atom at)224 inline EXTERN Atom AtomAdjust(Atom at)
225 {
226 	return (Atom) ((at) );
227 }
228 
229 
230 
231 inline EXTERN Prop PropAdjust(Prop);
232 
PropAdjust(Prop p)233 inline EXTERN Prop PropAdjust(Prop p)
234 {
235 	return (Prop) ((p) );
236 }
237 
238 
239 #else
240 
241 inline EXTERN Atom AtomAdjust(Atom);
242 
AtomAdjust(Atom at)243 inline EXTERN Atom AtomAdjust(Atom at)
244 {
245 	return (Atom) ((at == NULL ? (at) : (Atom)(CharP(at)+HDiff) ));
246 }
247 
248 
249 
250 inline EXTERN Prop PropAdjust(Prop);
251 
PropAdjust(Prop p)252 inline EXTERN Prop PropAdjust(Prop p)
253 {
254 	return (Prop) ((p == NULL ? (p) : (Prop)(CharP(p)+HDiff)) );
255 }
256 
257 
258 #endif
259 
260 inline EXTERN Term AtomTermAdjust(Term);
261 
AtomTermAdjust(Term at)262 inline EXTERN Term AtomTermAdjust(Term at)
263 {
264 	return (Term) ((at) );
265 }
266 
267 
268 #if TAGS_FAST_OPS
269 
270 inline EXTERN Term BlobTermAdjust(Term);
271 
BlobTermAdjust(Term t)272 inline EXTERN Term BlobTermAdjust(Term t)
273 {
274 	return (Term) ((t-HDiff) );
275 }
276 
277 
278 #else
279 
280 inline EXTERN Term BlobTermAdjust(Term);
281 
BlobTermAdjust(Term t)282 inline EXTERN Term BlobTermAdjust(Term t)
283 {
284 	return (Term) ((t+HDiff) );
285 }
286 
287 
288 #endif
289 
290 inline EXTERN AtomEntry * AtomEntryAdjust(AtomEntry *);
291 
AtomEntryAdjust(AtomEntry * at)292 inline EXTERN AtomEntry * AtomEntryAdjust(AtomEntry * at)
293 {
294 	return (AtomEntry *) ((AtomEntry *)(CharP(at)+HDiff) );
295 }
296 
297 
298 
299 inline EXTERN union CONSULT_OBJ * ConsultObjAdjust(union CONSULT_OBJ *);
300 
ConsultObjAdjust(union CONSULT_OBJ * co)301 inline EXTERN union CONSULT_OBJ * ConsultObjAdjust(union CONSULT_OBJ * co)
302 {
303 	return (union CONSULT_OBJ *) ((union CONSULT_OBJ *)(CharP(co)+HDiff) );
304 }
305 
306 
307 
308 inline EXTERN DBRef DBRefAdjust(DBRef);
309 
DBRefAdjust(DBRef dbr)310 inline EXTERN DBRef DBRefAdjust(DBRef dbr)
311 {
312 	return (DBRef) ((DBRef)(CharP(dbr)+HDiff) );
313 }
314 
315 
316 
317 inline EXTERN Term CodeAdjust(Term);
318 
CodeAdjust(Term dbr)319 inline EXTERN Term CodeAdjust(Term dbr)
320 {
321 	return (Term) (((Term)(dbr)+HDiff) );
322 }
323 
324 
325 
326 inline EXTERN ADDR AddrAdjust(ADDR);
327 
AddrAdjust(ADDR addr)328 inline EXTERN ADDR AddrAdjust(ADDR addr)
329 {
330 	return (ADDR) ((ADDR)(CharP(addr)+HDiff) );
331 }
332 
333 
334 
335 inline EXTERN CODEADDR CodeAddrAdjust(CODEADDR);
336 
CodeAddrAdjust(CODEADDR addr)337 inline EXTERN CODEADDR CodeAddrAdjust(CODEADDR addr)
338 {
339 	return (CODEADDR) ((CODEADDR)(CharP(addr)+HDiff) );
340 }
341 
342 
343 
344 inline EXTERN BlockHeader * BlockAdjust(BlockHeader *);
345 
BlockAdjust(BlockHeader * addr)346 inline EXTERN BlockHeader * BlockAdjust(BlockHeader * addr)
347 {
348 	return (BlockHeader *) ((BlockHeader *)(CharP(addr)+HDiff) );
349 }
350 
351 
352 
353 inline EXTERN yamop * PtoOpAdjust(yamop *);
354 
PtoOpAdjust(yamop * ptr)355 inline EXTERN yamop * PtoOpAdjust(yamop * ptr)
356 {
357 	return (yamop *) (((yamop *)(CharP(ptr) + HDiff)) );
358 }
359 
360 
361 
362 inline EXTERN CELL * PtoHeapCellAdjust(CELL *);
363 
PtoHeapCellAdjust(CELL * ptr)364 inline EXTERN CELL * PtoHeapCellAdjust(CELL * ptr)
365 {
366 	return (CELL *) (((CELL *)(CharP(ptr) + HDiff)) );
367 }
368 
369 
370 
371 inline EXTERN PredEntry * PtoPredAdjust(PredEntry *);
372 
PtoPredAdjust(PredEntry * ptr)373 inline EXTERN PredEntry * PtoPredAdjust(PredEntry * ptr)
374 {
375 	return (PredEntry *) (((PredEntry *)(CharP(ptr) + HDiff)) );
376 }
377 
378 
379 
380 inline EXTERN ArrayEntry * PtoArrayEAdjust(ArrayEntry *);
381 
PtoArrayEAdjust(ArrayEntry * ptr)382 inline EXTERN ArrayEntry * PtoArrayEAdjust(ArrayEntry * ptr)
383 {
384 	return (ArrayEntry *) (((ArrayEntry *)(CharP(ptr) + HDiff)) );
385 }
386 
387 
388 #if PRECOMPUTE_REGADDRESS
389 
390 inline EXTERN AREG XAdjust(AREG);
391 
XAdjust(AREG reg)392 inline EXTERN AREG XAdjust(AREG reg)
393 {
394 	return (AREG) ((AREG)((reg)+XDiff) );
395 }
396 
397 
398 #else
399 
400 inline EXTERN AREG XAdjust(AREG);
401 
XAdjust(AREG reg)402 inline EXTERN AREG XAdjust(AREG reg)
403 {
404 	return (AREG) ((reg) );
405 }
406 
407 
408 #endif
409 
410 inline EXTERN YREG YAdjust(YREG);
411 
YAdjust(YREG reg)412 inline EXTERN YREG YAdjust(YREG reg)
413 {
414 	return (YREG) ((reg) );
415 }
416 
417 
418 
419 
420 inline EXTERN int IsOldLocal(CELL);
421 
IsOldLocal(CELL reg)422 inline EXTERN int IsOldLocal(CELL reg)
423 {
424 	return (int) (IN_BETWEEN(OldASP, reg, OldLCL0));
425 }
426 
427 
428 
429 /* require because the trail might contain dangling pointers */
430 
431 inline EXTERN int IsOldLocalInTR(CELL);
432 
IsOldLocalInTR(CELL reg)433 inline EXTERN int IsOldLocalInTR(CELL reg)
434 {
435 	return (int) (IN_BETWEEN(OldH, reg, OldLCL0) );
436 }
437 
438 
439 
440 inline EXTERN int IsOldLocalInTRPtr(CELL *);
441 
IsOldLocalInTRPtr(CELL * ptr)442 inline EXTERN int IsOldLocalInTRPtr(CELL * ptr)
443 {
444 	return (int) (IN_BETWEEN(OldH, ptr, OldLCL0) );
445 }
446 
447 
448 
449 
450 inline EXTERN int IsOldH(CELL);
451 
IsOldH(CELL reg)452 inline EXTERN int IsOldH(CELL reg)
453 {
454 	return (int) (( CharP(reg) == CharP(OldH) ) );
455 }
456 
457 
458 
459 
460 
461 inline EXTERN int IsOldGlobal(CELL);
462 
IsOldGlobal(CELL reg)463 inline EXTERN int IsOldGlobal(CELL reg)
464 {
465 	return (int) (IN_BETWEEN(OldH0, reg, OldH) );
466 }
467 
468 
469 
470 inline EXTERN int IsOldGlobalPtr(CELL *);
471 
IsOldGlobalPtr(CELL * ptr)472 inline EXTERN int IsOldGlobalPtr(CELL * ptr)
473 {
474 	return (int) (IN_BETWEEN( OldH0, ptr, OldH) );
475 }
476 
477 
478 
479 inline EXTERN int IsOldDelay(CELL);
480 
IsOldDelay(CELL reg)481 inline EXTERN int IsOldDelay(CELL reg)
482 {
483 	return (int) (IN_BETWEEN(OldGlobalBase, reg, OldH0) );
484 }
485 
486 
487 
488 inline EXTERN int IsOldDelayPtr(CELL *);
489 
IsOldDelayPtr(CELL * ptr)490 inline EXTERN int IsOldDelayPtr(CELL * ptr)
491 {
492 	return (int) (IN_BETWEEN( OldGlobalBase, ptr, OldH0) );
493 }
494 
495 
496 
497 inline EXTERN int IsOldTrail(CELL);
498 
IsOldTrail(CELL reg)499 inline EXTERN int IsOldTrail(CELL reg)
500 {
501 	return (int) (IN_BETWEEN(OldTrailBase, reg, OldTR) );
502 }
503 
504 
505 
506 inline EXTERN int IsOldTrailPtr(CELL *);
507 
IsOldTrailPtr(CELL * ptr)508 inline EXTERN int IsOldTrailPtr(CELL * ptr)
509 {
510 	return (int) (IN_BETWEEN(OldTrailBase, ptr, OldTR) );
511 }
512 
513 
514 
515 inline EXTERN int IsOldCode(CELL);
516 
IsOldCode(CELL reg)517 inline EXTERN int IsOldCode(CELL reg)
518 {
519 	return (int) (IN_BETWEEN(OldHeapBase, reg, OldHeapTop) );
520 }
521 
522 
523 
524 inline EXTERN int IsOldCodeCellPtr(CELL *);
525 
IsOldCodeCellPtr(CELL * ptr)526 inline EXTERN int IsOldCodeCellPtr(CELL * ptr)
527 {
528 	return (int) (IN_BETWEEN(OldHeapBase, ptr, OldHeapTop) );
529 }
530 
531 
532 
533 inline EXTERN int IsGlobal(CELL);
534 
IsGlobal(CELL reg)535 inline EXTERN int IsGlobal(CELL reg)
536 {
537 	return (int) (IN_BETWEEN(GlobalBase, reg, H) );
538 }
539 
540 
541 
542 void STD_PROTO(AdjustStacksAndTrail, (void));
543 void STD_PROTO(AdjustRegs, (int));
544