26#define MaxTemps (128*512)
49#if defined(_POWER) || defined(__POWERPC__)
72#define __builtin_expect(Exp, Val) (Exp)
75#include "inline-only.h"
77INLINE_ONLY
void restore_machine_regs(
void);
78INLINE_ONLY
void save_machine_regs(
void);
79INLINE_ONLY
void restore_H(
void);
80INLINE_ONLY
void save_H(
void);
81INLINE_ONLY
void restore_B(
void);
82INLINE_ONLY
void save_B(
void);
85#define REFRESH_CACHE_REGS
89#define USES_REGS1 void
91#define WORKER_REGS(WID)
99#if defined(YAPOR_SBA) || defined(TABLING)
117 tr_fr_ptr CurrentTrailTop_;
123 struct myddas_global *MYDDAS_GLOBAL_POINTER;
124#if defined(YAPOR_SBA) || defined(TABLING)
130#if defined(YAPOR) || defined(THREADS)
131 unsigned int worker_id_;
137 struct or_frame *frame_head_, *frame_tail_;
138 char *binding_array_;
155 Term XTERMS[MaxTemps];
157 yamop *ARITH_EXCEPTION_;
165#define XREGS (Yap_REGS.XTERMS)
171extern Term Yap_XREGS[MaxTemps];
173#define XREGS Yap_XREGS
179extern pthread_key_t Yap_yaamregs_key;
182#undef REFRESH_CACHE_REGS
190#define CACHE_REGS REGSTORE *regcache = ((REGSTORE *)pthread_getspecific(Yap_yaamregs_key));
191#define REFRESH_CACHE_REGS regcache = ((REGSTORE *)pthread_getspecific(Yap_yaamregs_key));
192#define INIT_REGS , ((REGSTORE *)pthread_getspecific(Yap_yaamregs_key))
193#define WORKER_REGS(WID) REGSTORE *regcache = REMOTE_ThreadHandle(WID).current_yaam_regs;
194#define PASS_REGS1 regcache
195#define PASS_REGS , regcache
196#define USES_REGS1 struct regstore_t *regcache
197#define USES_REGS , struct regstore_t *regcache
198#define Yap_regp regcache
202#define Yap_REGS ((*Yap_regp))
208#define XREGS Yap_REGS.X
215#define MinTrailGap (sizeof(CELL)*1024)
216#define MinHeapGap (sizeof(CELL)*4096)
217#define MinStackGap (sizeof(CELL)*8*1024)
220#define ENV Yap_REGS.ENV_
221#define ASP Yap_REGS.ASP_
222#define H0 Yap_REGS.H0_
223#define LCL0 Yap_REGS.LCL0_
226#define YENV_ADDRESS (&(YENV))
229#if defined(__GNUC__) && defined(__alpha)
232#define YENV Yap_REGS.YENV_
233register CELL *HR
asm (
"$9");
234register CELL *HB
asm (
"$10");
236register yamop *CP
asm (
"$12");
237register CELL *S
asm (
"$13");
238register tr_fr_ptr TR
asm (
"$14");
241#define CreepFlag Yap_REGS.CreepFlag_
243register CELL CreepFlag
asm (
"$15");
248INLINE_ONLY
inline void save_machine_regs(
void) {
254 Yap_REGS.CreepFlag_ = CreepFlag;
259INLINE_ONLY
inline void restore_machine_regs(
void) {
265 CreepFlag = Yap_REGS.CreepFlag_;
270#define BACKUP_MACHINE_REGS() \
273 choiceptr BK_B = B; \
274 CELL BK_CreepFlag = CreepFlag; \
276 tr_fr_ptr BK_TR = TR; \
277 restore_machine_regs()
279#define RECOVER_MACHINE_REGS() \
280 save_machine_regs(); \
284 CreepFlag = BK_CreepFlag; \
288INLINE_ONLY
inline void save_H(
void) {
292INLINE_ONLY
inline void restore_H(
void) {
296#define BACKUP_H() CELL *BK_H = HR; restore_H()
298#define RECOVER_H() save_H(); HR = BK_H
300INLINE_ONLY
inline void save_B(
void) {
304INLINE_ONLY
inline void restore_B(
void) {
308#define BACKUP_B() choiceptr BK_B = B; restore_B()
310#define RECOVER_B() save_B(); B = BK_B
312INLINE_ONLY
void restore_TR(
void);
313INLINE_ONLY
void save_TR(
void);
315INLINE_ONLY
inline void save_TR(
void) {
319INLINE_ONLY
inline void restore_TR(
void) {
323#elif defined(__GNUC__) && defined(hppa)
326#define YENV Yap_REGS.YENV_
327register CELL *HR
asm (
"r12");
328register CELL *HB
asm (
"r13");
330register yamop *CP
asm (
"r15");
331register CELL *S
asm (
"r16");
332register CELL CreepFlag
asm (
"r17");
333register tr_fr_ptr TR
asm (
"r18");
335INLINE_ONLY
inline void save_machine_regs(
void) {
340 Yap_REGS.CreepFlag_ = CreepFlag;
344INLINE_ONLY
inline void restore_machine_regs(
void) {
349 CreepFlag = Yap_REGS.CreepFlag_;
353#define BACKUP_MACHINE_REGS() \
356 choiceptr BK_B = B; \
357 CELL BK_CreepFlag = CreepFlag; \
359 tr_fr_ptr BK_TR = TR; \
360 restore_machine_regs()
362#define RECOVER_MACHINE_REGS() \
363 save_machine_regs(); \
367 CreepFlag = BK_CreepFlag; \
371INLINE_ONLY
inline void save_H(
void) {
375INLINE_ONLY
inline void restore_H(
void) {
379#define BACKUP_H() CELL *BK_H = HR; restore_H()
381#define RECOVER_H() save_H(); HR = BK_H
383INLINE_ONLY
inline void save_B(
void) {
387INLINE_ONLY
inline void restore_B(
void) {
391#define BACKUP_B() choiceptr BK_B = B; restore_B()
393#define RECOVER_B() save_B(); B = BK_B
395INLINE_ONLY
void restore_TR(
void);
396INLINE_ONLY
void save_TR(
void);
398INLINE_ONLY
inline void save_TR(
void) {
402INLINE_ONLY
inline void restore_TR(
void) {
406#elif defined(__GNUC__) && (defined(_POWER) || defined(__POWERPC__))
419#define CreepFlag Yap_REGS.CreepFlag_
425register tr_fr_ptr TR
asm (
"r13");
427register tr_fr_ptr TR
asm (
"r21");
429register CELL *HR
asm (
"r14");
430register CELL *HB
asm (
"r15");
432register yamop *CP
asm (
"r17");
433register CELL *S
asm (
"r18");
434register CELL *YENV
asm (
"r19");
438#undef YENV_ADDRESS (&(YENV))
441#define YENV2MEM { CELL *YENV_MEM = YENV
442#define YENV_ADDRESS (&YENV_MEM)
443#define MEM2YENV YENV = YENV_MEM; }
447INLINE_ONLY
void save_machine_regs(
void) {
452 Yap_REGS.YENV_ = YENV;
456INLINE_ONLY
void restore_machine_regs(
void) {
461 YENV = Yap_REGS.YENV_;
465#define BACKUP_MACHINE_REGS() \
468 choiceptr BK_B = B; \
470 tr_fr_ptr BK_TR = TR; \
471 restore_machine_regs()
473#define RECOVER_MACHINE_REGS() \
474 save_machine_regs(); \
481INLINE_ONLY
void save_H(
void) {
485INLINE_ONLY
void restore_H(
void) {
489#define BACKUP_H() CELL *BK_H = HR; restore_H()
491#define RECOVER_H() save_H(); HR = BK_H
493INLINE_ONLY
void save_B(
void) {
497INLINE_ONLY
void restore_B(
void) {
501#define BACKUP_B() choiceptr BK_B = B; restore_B()
503#define RECOVER_B() save_B(); B = BK_B
505INLINE_ONLY
void restore_TR(
void);
506INLINE_ONLY
void save_TR(
void);
508INLINE_ONLY
void save_TR(
void) {
512INLINE_ONLY
void restore_TR(
void) {
518#define CP (Yap_REGS.CP_)
521#define YENV (Yap_REGS).YENV_
523#define HR Yap_REGS.H_
525#define TR Yap_REGS.TR_
526#define HB Yap_REGS.HB_
527#define CreepFlag Yap_REGS.CreepFlag_
529INLINE_ONLY
void save_machine_regs(
void) {}
530INLINE_ONLY
void restore_machine_regs(
void) {}
532#define BACKUP_MACHINE_REGS() {}
534#define RECOVER_MACHINE_REGS() {}
536INLINE_ONLY
void save_H(
void) {}
538INLINE_ONLY
void restore_H(
void) {}
544INLINE_ONLY
void save_B(
void) {
547INLINE_ONLY
void restore_B(
void) {
558#define AuxBase Yap_REGS.AuxBase_
559#define AuxSp Yap_REGS.AuxSp_
560#define AuxTop Yap_REGS.AuxTop_
561#define CurrentTrailTop Yap_REGS.CurrentTrailTop_
562#define DEPTH Yap_REGS.DEPTH_
563#if defined(YAPOR_SBA) || defined(TABLING)
564#define H_FZ Yap_REGS.H_FZ_
565#define B_FZ Yap_REGS.B_FZ_
566#define TR_FZ Yap_REGS.TR_FZ_
568#define PP (Yap_REGS.PP_)
569#if defined(YAPOR) || defined(THREADS)
570#define worker_id (Yap_REGS.worker_id_)
571#define LOCAL (Yap_REGS.worker_local_)
572#define PREG_ADDR (Yap_REGS.PREG_ADDR_)
574#define binding_array Yap_REGS.binding_array_
575#define BSEG Yap_REGS.BSEG_
576#define sba_offset Yap_REGS.sba_offset_
577#define sba_end Yap_REGS.sba_end_
578#define sba_size Yap_REGS.sba_size_
579#define frame_head Yap_REGS.frame_head_
580#define frame_tail Yap_REGS.frame_tail_
584#define LOCAL (&Yap_local)
586#define CurrentModule Yap_REGS.CurrentModule_
587#define ARITH_EXCEPTION Yap_REGS.ARITH_EXCEPTION_
588#define Yap_isint Yap_REGS.isint_
589#define Yap_Floats Yap_REGS.Floats_
590#define Yap_Ints Yap_REGS.Ints_
591#define EventFlag Yap_REGS.EventFlag_
593#define REG_SIZE sizeof(REGS)/sizeof(CELL *)
604#define ARG10 XREGS[10]
605#define ARG11 XREGS[11]
606#define ARG12 XREGS[12]
607#define ARG13 XREGS[13]
608#define ARG14 XREGS[14]
609#define ARG15 XREGS[15]
610#define ARG16 XREGS[16]
616#if defined(YAPOR_SBA) || defined(TABLING)
617#define BB Yap_REGS.BB_
624#define PROTECT_FROZEN_H(CPTR) \
625 ((Unsigned((Int)((CPTR)->cp_h)-(Int)(H_FZ)) < \
626 Unsigned((Int)(B_FZ)-(Int)(H_FZ))) ? \
628#define PROTECT_FROZEN_B(CPTR) \
629 ((Unsigned((Int)(CPTR)-(Int)(H_FZ)) < \
630 Unsigned((Int)(B_FZ)-(Int)(H_FZ))) ? \
638#define PROTECT_FROZEN_B(CPTR) (YOUNGER_CP(CPTR, B_FZ) ? CPTR : B_FZ)
639#define PROTECT_FROZEN_H(CPTR) (((CPTR)->cp_h > H_FZ) ? (CPTR)->cp_h : H_FZ)
642#define PROTECT_FROZEN_B(CPTR) (CPTR)
643#define PROTECT_FROZEN_H(CPTR) (CPTR)->cp_h
649#define PRECOMPUTE_REGADDRESS 1
654#define AGGREGATE_OPS 1
665StackGap( USES_REGS1 )
667 UInt gmin = (LCL0-H0)>>2;
669 if (gmin < MinStackGap) gmin = MinStackGap;
675CalculateStackGap( USES_REGS1 )
677 CreepFlag = EventFlag = StackGap( PASS_REGS1 );
680#define AS_CELLS(S) -((S)/sizeof(CELL))
682#define SET_ASP(Y,S) SET_ASP__(Y,S PASS_REGS)
686void SET_ASP__(CELL *yreg,
size_t sz USES_REGS) {
688 if (ASP > (CELL *)PROTECT_FROZEN_B(B))
689 ASP = (CELL *)PROTECT_FROZEN_B(B);