summaryrefslogtreecommitdiff
path: root/src/runtime/c/teyjus/simulator/siminstr.c
diff options
context:
space:
mode:
authorkrasimir <krasimir@chalmers.se>2017-04-12 10:31:01 +0000
committerkrasimir <krasimir@chalmers.se>2017-04-12 10:31:01 +0000
commit456f0a5733a3b688ebd3f5b3db35f60400ca7abe (patch)
tree7b6a931a099ffe31402bc59690263bf34374e4c3 /src/runtime/c/teyjus/simulator/siminstr.c
parenta8eaa2f2e560547e63c7976960435e1ae23a22b1 (diff)
remove the teyjus and utils folders
Diffstat (limited to 'src/runtime/c/teyjus/simulator/siminstr.c')
-rw-r--r--src/runtime/c/teyjus/simulator/siminstr.c1846
1 files changed, 0 insertions, 1846 deletions
diff --git a/src/runtime/c/teyjus/simulator/siminstr.c b/src/runtime/c/teyjus/simulator/siminstr.c
deleted file mode 100644
index 3f66fbf04..000000000
--- a/src/runtime/c/teyjus/simulator/siminstr.c
+++ /dev/null
@@ -1,1846 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//Copyright 2008
-// Andrew Gacek, Steven Holte, Gopalan Nadathur, Xiaochu Qi, Zach Snow
-//////////////////////////////////////////////////////////////////////////////
-// This file is part of Teyjus. //
-// //
-// Teyjus is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// Teyjus is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with Teyjus. If not, see <http://www.gnu.org/licenses/>. //
-//////////////////////////////////////////////////////////////////////////////
-/*****************************************************************************/
-/* */
-/* File siminstr.c. The instruction set of the virtual machine. */
-/*****************************************************************************/
-#ifndef SIMINSTR_C
-#define SIMINSTR_C
-
-#include "siminstr.h"
-#include "dataformats.h"
-#include "abstmachine.h"
-#include "trail.h"
-#include "hnorm.h"
-#include "hopu.h"
-#include "types.h"
-#include "instraccess.h"
-#include "siminstrlocal.h"
-#include "builtins/builtins.h"
-#include "../system/error.h"
-#include "../tables/pervasives.h"
-#include "../tables/instructions.h"
-#include "../loader/searchtab.h"
-
-
-#include <stdio.h>
-#include "printterm.h"
-#include "../system/stream.h"
-
-static AM_DataTypePtr regX, regA;
-static AM_DataTypePtr envY, clenvY;
-static DF_TermPtr tmPtr, func;
-static DF_TypePtr tyPtr;
-static MemPtr nhreg, ip, ep, cp;
-static MemPtr impTab;
-static MemPtr table;
-static MemPtr bckfd;
-static MemPtr nextcl;
-static int constInd, kindInd, tablInd;
-static int n, m, l, uc, numAbs;
-static int intValue;
-static float floatValue;
-static DF_StrDataPtr str;
-static CSpacePtr label, cl;
-
-/****************************************************************************/
-/* INSTRUCTIONS FOR UNIFYING AND CREATING TERMS */
-/****************************************************************************/
-
-/**************************************************************************/
-/* PUT CLASS */
-/**************************************************************************/
-void SINSTR_put_variable_t() //put_variable Xn,Ai -- R_R_X
-{
- INSACC_RRX(regX, regA);
- nhreg = AM_hreg + DF_TM_ATOMIC_SIZE;
- AM_heapError(nhreg);
- DF_mkVar(AM_hreg, AM_ucreg);
- DF_mkRef((MemPtr)regX, (DF_TermPtr)AM_hreg);
- *regA = *regX;
- AM_hreg = nhreg;
-}
-
-void SINSTR_put_variable_te() //put_variable_te Xn,Ai -- R_R_X
-{
- INSACC_RRX(regX, regA);
- nhreg = AM_hreg + DF_TM_ATOMIC_SIZE;
- AM_heapError(nhreg);
- DF_mkVar(AM_hreg, AM_envUC());
- DF_mkRef((MemPtr)regX, (DF_TermPtr)AM_hreg);
- *regA = *regX;
- AM_hreg = nhreg;
-}
-
-void SINSTR_put_variable_p() //put_variable Yn,Ai -- E_R_X
-{
- INSACC_ERX(envY, regA);
- DF_mkVar((MemPtr)envY, AM_envUC());
- DF_mkRef((MemPtr)regA, (DF_TermPtr)envY);
-}
-
-void SINSTR_put_value_t() //put_value Xn,Ai -- R_R_X
-{
- INSACC_RRX(regX, regA);
- *regA = *regX;
-}
-
-void SINSTR_put_value_p() //put_value Yn,Ai -- E_R_X
-{
- INSACC_ERX(envY, regA);
- tmPtr = DF_termDeref((DF_TermPtr)envY);
- if ((!AM_stackAddr((MemPtr)tmPtr)) || DF_isFV(tmPtr))
- DF_mkRef((MemPtr)regA, tmPtr);
- else *regA = *((AM_DataTypePtr)tmPtr); //cons or (mono) constants on stack
-}
-
-void SINSTR_put_unsafe_value() //put_unsafe_value Yn,Ai -- E_R_X
-{
- INSACC_ERX(envY, regA);
-
- tmPtr = DF_termDeref((DF_TermPtr)envY);
- switch (DF_termTag(tmPtr)) {
- case DF_TM_TAG_NIL:
- case DF_TM_TAG_CONS:
- case DF_TM_TAG_INT:
- case DF_TM_TAG_FLOAT:
- case DF_TM_TAG_STR:
- case DF_TM_TAG_STREAM:
- {*regA = *((AM_DataTypePtr)tmPtr); break; }
- case DF_TM_TAG_CONST:
- {
- if (DF_isTConst(tmPtr)) DF_mkRef((MemPtr)regA, tmPtr);
- else *regA = *((AM_DataTypePtr)tmPtr);
- break;
- }
- case DF_TM_TAG_VAR:
- {
- if (AM_inCurEnv((MemPtr)tmPtr)) {
- AM_heapError(AM_hreg + DF_TM_ATOMIC_SIZE);
- TR_trailETerm(tmPtr);
- DF_copyAtomic(tmPtr, AM_hreg);
- DF_mkRef((MemPtr)tmPtr, (DF_TermPtr)AM_hreg);
- AM_hreg += DF_TM_ATOMIC_SIZE;
- *regA = *((AM_DataTypePtr)tmPtr);
- } else
- DF_mkRef((MemPtr)regA, tmPtr);
- break;
- }
- default: { DF_mkRef((MemPtr)regA, tmPtr); break; }
- }
-}
-
-void SINSTR_copy_value() //copy_value Yn,Ai -- E_R_X
-{
- INSACC_ERX(envY, regA);
- tmPtr = DF_termDeref((DF_TermPtr)envY);
- if (AM_stackAddr((MemPtr)tmPtr)) {
- *regA = *((AM_DataTypePtr)tmPtr);
- } else DF_mkRef((MemPtr)regA, tmPtr);
-}
-
-void SINSTR_put_m_const() //put_m_const Ai,c -- R_C_X
-{
- INSACC_RCX(regA, constInd);
- DF_mkConst((MemPtr)regA, AM_cstUnivCount(constInd), constInd);
-}
-
-void SINSTR_put_p_const() //put_p_const Ai,c -- R_C_X
-{
- INSACC_RCX(regA, constInd);
- nhreg = AM_hreg + DF_TM_TCONST_SIZE;
- AM_heapError((MemPtr)(((DF_TypePtr)nhreg) + AM_cstTyEnvSize(constInd)));
- DF_mkTConst(AM_hreg, AM_cstUnivCount(constInd), constInd,(DF_TypePtr)nhreg);
- DF_mkRef((MemPtr)regA, (DF_TermPtr)AM_hreg);
- AM_hreg = nhreg;
-}
-
-void SINSTR_put_nil() //put_nil Ai -- R_X
-{
- INSACC_RX(regA);
- DF_mkNil((MemPtr)regA);
-}
-
-void SINSTR_put_integer() //put_integer Ai,i -- R_I_X
-{
- INSACC_RIX(regA, intValue);
- DF_mkInt((MemPtr)regA, intValue);
-}
-
-void SINSTR_put_float() //put_float Ai,f -- R_F_X
-{
- INSACC_RFX(regA, floatValue);
- DF_mkFloat((MemPtr)regA, floatValue);
-}
-
-void SINSTR_put_string() //put_string Ai,str -- R_S_X
-{
- INSACC_RSX(regA, str);
- DF_mkStr((MemPtr)regA, str);
-}
-
-void SINSTR_put_index() //put_index Ai,n -- R_I1_X
-{
- INSACC_RI1X(regA, n);
- nhreg = AM_hreg + DF_TM_ATOMIC_SIZE;
- AM_heapError(nhreg);
- DF_mkBV(AM_hreg, n);
- DF_mkRef((MemPtr)regA, (DF_TermPtr)AM_hreg);
- AM_hreg = nhreg;
-}
-
-void SINSTR_put_app() //put_app Ai,Xj,n -- R_R_I1_X
-{
- INSACC_RRI1X(regA, regX, n);
- nhreg = (MemPtr)(((DF_TermPtr)(AM_hreg + DF_TM_APP_SIZE)) + n);
- if (DF_isRef((DF_TermPtr)regX)) {
- AM_heapError(nhreg);
- tmPtr = DF_refTarget((DF_TermPtr)regX);
- } else { //regX not a reference
- nhreg += DF_TM_ATOMIC_SIZE;
- AM_heapError(nhreg);
- DF_copyAtomic((DF_TermPtr)regX, AM_hreg);
- tmPtr = (DF_TermPtr)AM_hreg;
- AM_hreg += DF_TM_ATOMIC_SIZE;
- }
- AM_sreg = (DF_TermPtr)(AM_hreg + DF_TM_APP_SIZE);
- DF_mkApp(AM_hreg, n, tmPtr, AM_sreg);
- DF_mkRef((MemPtr)regA, (DF_TermPtr)AM_hreg);
- AM_hreg = nhreg;
-}
-
-void SINSTR_put_list() //put_list Ai -- R_X
-{
- INSACC_RX(regA);
- nhreg = (MemPtr)(((DF_TermPtr)AM_hreg) + DF_CONS_ARITY);
- AM_heapError(nhreg);
- AM_sreg = (DF_TermPtr)AM_hreg;
- DF_mkCons((MemPtr)regA, AM_sreg);
- AM_hreg = nhreg;
-}
-
-void SINSTR_put_lambda() //put_lambda Ai,Xj,n -- R_R_I1_X
-{
- INSACC_RRI1X(regA, regX, n);
- nhreg = AM_hreg + DF_TM_LAM_SIZE;
- if (DF_isRef((DF_TermPtr)regX)) {
- AM_heapError(nhreg);
- tmPtr = DF_refTarget((DF_TermPtr)regX);
- } else {
- nhreg += DF_TM_ATOMIC_SIZE;
- AM_heapError(nhreg);
- DF_copyAtomic((DF_TermPtr)regX, AM_hreg);
- tmPtr = (DF_TermPtr)AM_hreg;
- AM_hreg += DF_TM_ATOMIC_SIZE;
- }
- DF_mkLam(AM_hreg, n, tmPtr);
- DF_mkRef((MemPtr)regA, (DF_TermPtr)AM_hreg);
- AM_hreg = nhreg;
-}
-
-/*************************************************************************/
-/* SET CLASS */
-/*************************************************************************/
-void SINSTR_set_variable_t() //set_variable Xi -- R_X
-{
- INSACC_RX(regX);
- DF_mkVar((MemPtr)AM_sreg, AM_ucreg);
- DF_mkRef((MemPtr)regX, AM_sreg);
- AM_sreg++;
-}
-
-void SINSTR_set_variable_te() //set_variable_te Xi -- R_X
-{
- INSACC_RX(regX);
- DF_mkVar((MemPtr)AM_sreg, AM_envUC());
- DF_mkRef((MemPtr)regX, AM_sreg);
- AM_sreg++;
-}
-
-void SINSTR_set_variable_p() //set_variable_p Yi -- E_X
-{
- INSACC_EX(envY);
- DF_mkVar((MemPtr)AM_sreg, AM_envUC());
- DF_mkRef((MemPtr)envY, AM_sreg);
- AM_sreg++;
-}
-
-void SINSTR_set_value_t() //set_value Xi -- R_X
-{
- INSACC_RX(regX);
- DF_copyAtomic((DF_TermPtr)regX, (MemPtr)AM_sreg);
- AM_sreg++;
-}
-
-void SINSTR_set_value_p() //set_value Yi -- E_X
-{
- INSACC_EX(envY);
- tmPtr = DF_termDeref((DF_TermPtr)envY);
- if (AM_stackAddr((MemPtr)tmPtr)) { //needed?; in fact, what if a fv?
- //printf("set_value_p -- stack addr\n");
- DF_copyAtomic(tmPtr, (MemPtr)AM_sreg);
- } else DF_mkRef((MemPtr)AM_sreg, tmPtr);
- AM_sreg++;
-}
-
-void SINSTR_globalize_pt() //globalize_pt Yj,Xi -- E_R_X
-{
- INSACC_ERX(envY, regX);
- tmPtr = DF_termDeref((DF_TermPtr)envY);
- if (AM_stackAddr((MemPtr)tmPtr)) {
- nhreg = AM_hreg + DF_TM_ATOMIC_SIZE;
- AM_heapError(nhreg);
- DF_copyAtomic(tmPtr, AM_hreg);
- if (DF_isFV(tmPtr)) {
- TR_trailETerm(tmPtr);
- DF_mkRef((MemPtr)tmPtr, (DF_TermPtr)AM_hreg);
- }
- DF_mkRef((MemPtr)regX, (DF_TermPtr)AM_hreg);
- AM_hreg = nhreg;
- } else DF_mkRef((MemPtr)regX, tmPtr);
-}
-
-void SINSTR_globalize_t() //globalize_t Xi -- R_X
-{
- INSACC_RX(regX);
- tmPtr = DF_termDeref((DF_TermPtr)regX);
- if (AM_nHeapAddr((MemPtr)tmPtr)){
- nhreg = AM_hreg + DF_TM_ATOMIC_SIZE;
- AM_heapError(nhreg);
- DF_copyAtomic(tmPtr, AM_hreg);
- if (DF_isFV(tmPtr)) {
- TR_trailETerm(tmPtr);
- DF_mkRef((MemPtr)tmPtr, (DF_TermPtr)AM_hreg);
- }
- DF_mkRef((MemPtr)regX, (DF_TermPtr)AM_hreg);
- AM_hreg = nhreg;
- } else DF_mkRef((MemPtr)regX, tmPtr);
-}
-
-void SINSTR_set_m_const() //set_m_const c -- C_X
-{
- INSACC_CX(constInd);
- DF_mkConst((MemPtr)AM_sreg, AM_cstUnivCount(constInd), constInd);
- AM_sreg++;
-}
-
-void SINSTR_set_p_const() //set_p_const c -- C_X
-{
- INSACC_CX(constInd);
- nhreg = AM_hreg + DF_TM_TCONST_SIZE;
- AM_heapError(nhreg + AM_cstTyEnvSize(constInd) * DF_TY_ATOMIC_SIZE);
- DF_mkTConst(AM_hreg,AM_cstUnivCount(constInd),constInd,(DF_TypePtr)nhreg);
- DF_mkRef((MemPtr)AM_sreg, (DF_TermPtr)AM_hreg);
- AM_sreg++;
- AM_hreg = nhreg;
-}
-
-void SINSTR_set_nil() //set_nil -- X
-{
- INSACC_X();
- DF_mkNil((MemPtr)AM_sreg);
- AM_sreg++;
-}
-
-void SINSTR_set_integer() //set_integer i -- I_X
-{
- INSACC_IX(intValue);
- DF_mkInt((MemPtr)AM_sreg, intValue);
- AM_sreg++;
-}
-
-void SINSTR_set_float() //set_float f -- F_X
-{
- INSACC_FX(floatValue);
- DF_mkFloat((MemPtr)AM_sreg, floatValue);
- AM_sreg++;
-}
-
-void SINSTR_set_string() //set_string str -- S_X
-{
- INSACC_SX(str);
- DF_mkStr((MemPtr)AM_sreg, str);
- AM_sreg++;
-}
-
-void SINSTR_set_index() //set_index n -- I1_X
-{
- INSACC_I1X(n);
- DF_mkBV((MemPtr)AM_sreg, n);
- AM_sreg++;
-}
-
-void SINSTR_set_void() //set_void n -- I1_X
-{
- INSACC_I1X(n);
- while (n > 0) {
- DF_mkVar((MemPtr)AM_sreg, AM_ucreg);
- AM_sreg++;
- n--;
- }
-}
-
-void SINSTR_deref() //deref Xi -- R_X; needed?
-{
- INSACC_RX(regX);
- regA = (AM_DataTypePtr)(DF_termDeref((DF_TermPtr)regX));
- *regX = *regA; //assume an atomic term?
-}
-
-void SINSTR_set_lambda() //set_lambda Xi, n -- R_I1_X; needed?
-{
- INSACC_RI1X(regX, n);
- if (!DF_isRef((DF_TermPtr)regX)) {
- nhreg += DF_TM_ATOMIC_SIZE;
- AM_heapError(nhreg);
- DF_copyAtomic((DF_TermPtr)regX, AM_hreg);
- DF_mkRef((MemPtr)regX, (DF_TermPtr)AM_hreg);
- AM_hreg += DF_TM_ATOMIC_SIZE;
- }
- DF_mkLam((MemPtr)AM_sreg, n, DF_refTarget((DF_TermPtr)regX));
- AM_sreg++;
-}
-
-/*************************************************************************/
-/* GET CLASS */
-/*************************************************************************/
-
-void SINSTR_get_variable_t() //get_variable Xn,Ai -- R_R_X
-{
- INSACC_RRX(regX, regA);
- *regX = *regA;
-}
-
-void SINSTR_get_variable_p() //get_variable Yn,Ai -- E_R_X
-{
- INSACC_ERX(envY, regA);
- *envY = *regA;
-}
-
-void SINSTR_init_variable_t() //init_variable Xn,Ym -- R_CE_X
-{
- INSACC_RCEX(regA, clenvY);
- DF_mkRef((MemPtr)regA, DF_termDeref((DF_TermPtr)clenvY));
-}
-
-void SINSTR_init_variable_p() //init_variable Yn,Ym -- E_CE_X
-{
- INSACC_ECEX(envY, clenvY);
- DF_mkRef((MemPtr)envY, DF_termDeref((DF_TermPtr)clenvY));
-}
-
-void SINSTR_get_m_constant() //get_m_constant Xi,c -- R_C_X
-{
- INSACC_RCX(regX, constInd);
- tmPtr = DF_termDeref((DF_TermPtr)regX);
- SINSTRL_unifyConst(tmPtr, constInd);
-}
-
-void SINSTR_get_p_constant() //get_p_constant Xi,c,L -- R_C_L_X
-{
- INSACC_RCLX(regX, constInd, label);
- tmPtr = DF_termDeref((DF_TermPtr)regX);
- SINSTRL_unifyTConst(tmPtr, constInd, label);
-}
-
-void SINSTR_get_integer() //get_integer Xi,i -- R_I_X
-{
- INSACC_RIX(regX, intValue);
- tmPtr = DF_termDeref((DF_TermPtr)regX);
- SINSTRL_unifyInt(tmPtr, intValue);
-}
-
-void SINSTR_get_float() //get_float Xi,f -- R_F_X
-{
- INSACC_RFX(regX, floatValue);
- tmPtr = DF_termDeref((DF_TermPtr)regX);
- SINSTRL_unifyFloat(tmPtr, floatValue);
-}
-
-void SINSTR_get_string() //get_string Xi,str --R_S_X
-{
- INSACC_RSX(regX, str);
- tmPtr = DF_termDeref((DF_TermPtr)regX);
- SINSTRL_unifyString(tmPtr, str);
-}
-
-void SINSTR_get_nil() //get_nil Xi -- R_X
-{
- INSACC_RX(regX);
- tmPtr = DF_termDeref((DF_TermPtr)regX);
- SINSTRL_unifyNil(tmPtr);
-
-}
-
-void SINSTR_get_m_structure() //get_m_structure Xi,f,n--R_C_I1_X
-{
- INSACC_RCI1X(regX, constInd, n);
- tmPtr = DF_termDeref((DF_TermPtr)regX);
- switch (DF_termTag(tmPtr)) {
- case DF_TM_TAG_VAR:
- {
- if (DF_fvUnivCount(tmPtr) >= AM_cstUnivCount(constInd)) {
- SINSTRL_bindStr(tmPtr, constInd, n);
- return;
- } else {
- EM_THROW(EM_FAIL);
- }
- }
- case DF_TM_TAG_APP:
- {
- func = DF_termDeref(DF_appFunc(tmPtr));
- if (DF_isConst(func)) {
- if ((DF_constTabIndex(func)==constInd)&&(DF_appArity(tmPtr)==n)){
- AM_sreg = DF_appArgs(tmPtr); AM_writeFlag = OFF; //READ MODE
- return;
- } else EM_THROW(EM_FAIL); //diff const head
- } //otherwise continue with the next case
- }
- case DF_TM_TAG_LAM: case DF_TM_TAG_SUSP: //and other APP cases
- {
- HN_hnorm(tmPtr);
- if (AM_rigFlag) {
- if (DF_isConst(AM_head) && (DF_constTabIndex(AM_head) == constInd)){
- if (AM_numArgs == (AM_numAbs + n)){
- if (AM_numAbs == 0) {
- AM_sreg = AM_argVec; AM_writeFlag = OFF; //READ MODE
- } else SINSTRL_delayStr(tmPtr, constInd, n); //#abs > 0
- } else EM_THROW(EM_FAIL); //numArgs != numAbs + n
- } else EM_THROW(EM_FAIL); //non const rig head or diff const head
- } else { //AM_rigFlag == OFF
- if (AM_numArgs == 0) {
- if ((AM_numAbs == 0) &&
- (DF_fvUnivCount(AM_head) >= AM_cstUnivCount(constInd)))
- SINSTRL_bindStr(AM_head, constInd, n);
- else EM_THROW(EM_FAIL);
- } else SINSTRL_delayStr(tmPtr, constInd, n);
- } //AM_rigFlag == OFF
- return;
- }
- default:
- {//CONS, NIL, CONST, INT, FLOAT, STR, BV, (STREAM)
- EM_THROW(EM_FAIL);
- }
- } //switch
-}
-
-void SINSTR_get_p_structure() //get_p_structure Xi,f,n--R_C_I1_X
-{
- INSACC_RCI1X(regX, constInd, n);
- tmPtr = DF_termDeref((DF_TermPtr)regX);
- switch (DF_termTag(tmPtr)) {
- case DF_TM_TAG_VAR:
- {
- if (DF_fvUnivCount(tmPtr) >= AM_cstUnivCount(constInd)) {
- SINSTRL_bindTStr(tmPtr, constInd, n);
- return;
- } else {
- EM_THROW(EM_FAIL);
- }
- }
- case DF_TM_TAG_APP:
- {
- func = DF_termDeref(DF_appFunc(tmPtr));
- if (DF_isConst(func)) {
- if ((DF_constTabIndex(func)==constInd)&&(DF_appArity(tmPtr)==n)){
- AM_sreg = DF_appArgs(tmPtr); AM_writeFlag = OFF;
- AM_tysreg = DF_constType(func); AM_tyWriteFlag = OFF;
- return;
- } else EM_THROW(EM_FAIL); //diff const head
- } //otherwise continue with the next case
- }
- case DF_TM_TAG_LAM: case DF_TM_TAG_SUSP: //and other APP cases
- {
- HN_hnorm(tmPtr);
- if (AM_rigFlag) {
- if (DF_isConst(AM_head) && (DF_constTabIndex(AM_head) == constInd)){
- if (AM_numAbs == (AM_numArgs + n)){
- if (AM_numAbs == 0) {//first order app
- AM_sreg = AM_argVec; AM_writeFlag = OFF;
- AM_tysreg = DF_constType(AM_head);AM_tyWriteFlag = OFF;
- } else SINSTRL_delayTStr(tmPtr, constInd, n);//#abs > 0
- } else EM_THROW(EM_FAIL); //numArgs != numAbs + n
- } else EM_THROW(EM_FAIL); //non const rig head or diff const head
- } else { //AM_rigFlag == OFF
- if (AM_numArgs == 0) {
- if ((AM_numArgs == 0) &&
- (DF_fvUnivCount(AM_head) >= AM_cstUnivCount(constInd)))
- SINSTRL_bindTStr(AM_head, constInd, n);
- else EM_THROW(EM_FAIL);
- } else SINSTRL_delayTStr(tmPtr, constInd, n);
- } //AM_rigFlag == OFF
- return;
- }
- default:
- { //CONS, NIL, CONST, INT, FLOAT, STR, BV, (STREAM)
- EM_THROW(EM_FAIL);
- }
- } //switch
-}
-
-void SINSTR_get_list() //get_list Xi -- R_X
-{
- INSACC_RX(regX);
- tmPtr = DF_termDeref((DF_TermPtr)regX);
- switch (DF_termTag(tmPtr)){
- case DF_TM_TAG_VAR:{ SINSTRL_bindCons(tmPtr); return; }
- case DF_TM_TAG_CONS: {AM_sreg=DF_consArgs(tmPtr); AM_writeFlag=OFF; return; }
- case DF_TM_TAG_APP:
- {
- if (DF_isConst(DF_termDeref(DF_appFunc(tmPtr)))) EM_THROW(EM_FAIL);
- //otherwise continue with next case
- }
- case DF_TM_TAG_SUSP: //and other APP cases
- { //Note ABS cannot arise here due to well-typedness
- HN_hnorm(tmPtr);
- if (AM_consFlag) { //#abs must be 0 and #args must be 2 due to type
- AM_sreg = AM_argVec; AM_writeFlag = OFF;
- return;
- }
- if (AM_rigFlag) EM_THROW(EM_FAIL); //non cons rigid term
- //otherwise flex term with #abs being 0 (due to well-typedness)
- if (AM_numArgs == 0) SINSTRL_bindCons(AM_head); //fv
- else SINSTRL_delayCons(tmPtr); //higher-order
- return;
- }
- default: { EM_THROW(EM_FAIL); } //NIL, CONST, BV
- } //switch
-}
-
-/*************************************************************************/
-/* UNIFY CLASS */
-/*************************************************************************/
-void SINSTR_unify_variable_t() //unify_variable_t Xi -- R_X
-{
- INSACC_RX(regX);
- if (AM_writeFlag) {
- DF_mkVar((MemPtr)AM_sreg, AM_adjreg);
- DF_mkRef((MemPtr)regX, AM_sreg);
- } else { //read mode
- if (DF_isFV(AM_sreg))
- DF_mkRef((MemPtr)regX, AM_sreg);
- else *regX = *((AM_DataTypePtr)AM_sreg);
- }
- AM_sreg++;
-}
-
-void SINSTR_unify_variable_p() //unify_variable_p Yi -- E_X
-{
- INSACC_EX(envY);
- if (AM_writeFlag) {
- DF_mkVar((MemPtr)AM_sreg, AM_adjreg);
- DF_mkRef((MemPtr)envY, AM_sreg);
- } else { //read mode
- if (DF_isFV(AM_sreg))
- DF_mkRef((MemPtr)envY, AM_sreg);
- else *envY = *((AM_DataTypePtr)AM_sreg);
- }
- AM_sreg++;
-}
-
-void SINSTR_unify_value_t() //unify_value Xi -- R_X
-{
- INSACC_RX(regX);
- if (AM_writeFlag) {
- if (AM_ocFlag) SINSTRL_bindSreg(DF_termDeref((DF_TermPtr)regX));
- else *((AM_DataTypePtr)AM_sreg) = *regX;
-
- } else {
- HOPU_patternUnifyPair((DF_TermPtr)regX, AM_sreg); //read mode
- }
- AM_sreg++;
-}
-
-void SINSTR_unify_value_p() //unify_value Yi -- E_X
-{
- INSACC_EX(envY);
- if (AM_writeFlag) {
- tmPtr = DF_termDeref((DF_TermPtr)envY);
- if (AM_ocFlag) SINSTRL_bindSreg(tmPtr);
- else {// AM_ocFlag == OFF
- if (AM_stackAddr((MemPtr)tmPtr)) { //needed?; in fact, what if a fv?
- //printf("unify_value_p -- stack addr\n");
- DF_copyAtomic(tmPtr, (MemPtr)AM_sreg);
- } else DF_mkRef((MemPtr)AM_sreg, tmPtr);
- }
- } else HOPU_patternUnifyPair((DF_TermPtr)envY, AM_sreg); //read mode
- AM_sreg++;
-}
-
-void SINSTR_unify_local_value_t() //unify_local_value Xi -- R_X
-{
- INSACC_RX(regX);
- if (AM_writeFlag){
- tmPtr = DF_termDeref((DF_TermPtr)regX);
- if (DF_isCons(tmPtr)) {
- *regX = *((AM_DataTypePtr)tmPtr); //update reg Xi
- if (AM_ocFlag) SINSTRL_bindSreg(tmPtr);
- else DF_copyAtomic(tmPtr, (MemPtr)AM_sreg);
- } else { //tmPtr not cons
- if (AM_nHeapAddr((MemPtr)tmPtr)) { //then globalize and then bind
- if (DF_isConst(tmPtr)) { //must be a const without type assoc
- if (AM_ocFlag && (DF_constUnivCount(tmPtr) > AM_adjreg))
- EM_THROW(EM_FAIL);
- DF_copyAtomic(tmPtr, (MemPtr)AM_sreg);//move the cst to heap
- *regX = *((AM_DataTypePtr)tmPtr); //update reg Xi
- } else { //not const
- if (DF_isFV(tmPtr)) {
- TR_trailETerm(tmPtr);
- if (AM_ocFlag && (DF_fvUnivCount(tmPtr) > AM_adjreg)){
- DF_modVarUC(tmPtr, AM_adjreg);
- AM_bndFlag = ON;
- }
- DF_copyAtomic(tmPtr, (MemPtr)AM_sreg);//move fv to heap
- DF_mkRef((MemPtr)regX, AM_sreg); //reg Xi
- DF_mkRef((MemPtr)tmPtr, AM_sreg); //env cell
- } else {//INT, FLOAT, STR, (STREAM), NIL
- DF_copyAtomic(tmPtr, (MemPtr)AM_sreg);//move to heap
- *regX = *((AM_DataTypePtr)tmPtr); //update reg Xi
- }
- } //not const
- } else { //tmPtr is a heap address
- DF_mkRef((MemPtr)regX, tmPtr); //update reg Xi
- if (AM_ocFlag) SINSTRL_bindSregH(tmPtr);
- else DF_mkRef((MemPtr)AM_sreg, tmPtr);
- } //tmPtr is a heap address
- } //tmPtr not cons
- } else HOPU_patternUnifyPair((DF_TermPtr)regX, AM_sreg); //read mode
- AM_sreg++;
-}
-
-void SINSTR_unify_local_value_p() //unify_local_value Yi -- E_X
-{
- INSACC_EX(envY);
- if (AM_writeFlag) {
- tmPtr = DF_termDeref((DF_TermPtr)envY);
- if (DF_isCons(tmPtr))
- if (AM_ocFlag) SINSTRL_bindSreg(tmPtr);
- else DF_copyAtomic(tmPtr, (MemPtr)AM_sreg);
- else { //tmPtr not cons
- if (AM_nHeapAddr((MemPtr)tmPtr)) { //then globalize and then bind
- if (DF_isConst(tmPtr)) { //must be a const without type assoc
- if (AM_ocFlag && (DF_constUnivCount(tmPtr) > AM_adjreg))
- EM_THROW(EM_FAIL);
- DF_copyAtomic(tmPtr, (MemPtr)AM_sreg);
- } else { //not const
- if (DF_isFV(tmPtr)) {
- TR_trailETerm(tmPtr);
- if (AM_ocFlag && (DF_fvUnivCount(tmPtr) > AM_adjreg)){
- DF_modVarUC(tmPtr, AM_adjreg);
- AM_bndFlag = ON;
- }
- DF_copyAtomic(tmPtr, (MemPtr)AM_sreg);//move fv to heap
- DF_mkRef((MemPtr)tmPtr, AM_sreg); //env cell
- } else DF_copyAtomic(tmPtr, (MemPtr)AM_sreg); //I/F/STR/NIL
- } //not const
- } else { //tmPtr is a heap address
- if (AM_ocFlag) SINSTRL_bindSregH(tmPtr);
- else DF_mkRef((MemPtr)AM_sreg, tmPtr);
- } //tmPtr is a heap address
- } //tmPtr not cons
- } else //read mode
- HOPU_patternUnifyPair((DF_TermPtr)envY, AM_sreg);
- AM_sreg++;
-}
-
-void SINSTR_unify_m_constant() //unify_m_constant C -- C_X
-{
- INSACC_CX(constInd);
- if (AM_writeFlag) {
- if (AM_ocFlag && (AM_adjreg < (uc = AM_cstUnivCount(constInd))))
- EM_THROW(EM_FAIL);
- DF_mkConst((MemPtr)AM_sreg, uc, constInd);
- } else { //read mode
- tmPtr = DF_termDeref(AM_sreg);
- SINSTRL_unifyConst(tmPtr, constInd);
- }
- AM_sreg++;
-}
-
-void SINSTR_unify_p_constant() //unify_p_constant C,L -- C_L_X
-{
- INSACC_CLX(constInd, label);
- if (AM_writeFlag) {
- if (AM_ocFlag && (AM_adjreg < (uc = AM_cstUnivCount(constInd))))
- EM_THROW(EM_FAIL);
- nhreg = AM_hreg + DF_TM_TCONST_SIZE;
- AM_heapError(nhreg + AM_cstTyEnvSize(constInd) * DF_TY_ATOMIC_SIZE);
- DF_mkTConst(AM_hreg, uc, constInd, (DF_TypePtr)nhreg);
- DF_mkRef((MemPtr)AM_sreg, (DF_TermPtr)AM_hreg);
- AM_hreg = nhreg;
- AM_tyWriteFlag = ON;
- } else {// read mode
- tmPtr = DF_termDeref(AM_sreg);
- SINSTRL_unifyTConst(tmPtr, constInd, label);
- }
- AM_sreg++;
-}
-
-void SINSTR_unify_integer() //unify_integer i -- I_X
-{
- INSACC_IX(intValue);
- if (AM_writeFlag) DF_mkInt((MemPtr)AM_sreg, intValue);
- else { //read mode
- tmPtr = DF_termDeref(AM_sreg);
- SINSTRL_unifyInt(tmPtr, intValue);
- }
- AM_sreg++;
-}
-
-void SINSTR_unify_float() //unify_float f -- F_X
-{
- INSACC_FX(floatValue);
- if (AM_writeFlag) DF_mkFloat((MemPtr)AM_sreg, floatValue);
- else { //read mode
- tmPtr = DF_termDeref(AM_sreg);
- SINSTRL_unifyFloat(tmPtr, floatValue);
- }
- AM_sreg++;
-}
-
-void SINSTR_unify_string() //unify_string str -- S_X
-{
- INSACC_SX(str);
- if (AM_writeFlag) DF_mkStr((MemPtr)AM_sreg, str);
- else { //read mode
- tmPtr = DF_termDeref(AM_sreg);
- SINSTRL_unifyString(tmPtr, str);
- }
- AM_sreg++;
-}
-
-void SINSTR_unify_nil() //unify_nil -- X
-{
- INSACC_X();
- if (AM_writeFlag) DF_mkNil((MemPtr)AM_sreg);
- else { // in read mode
- tmPtr = DF_termDeref(AM_sreg);
- SINSTRL_unifyNil(tmPtr);
- }
- AM_sreg++;
-}
-
-void SINSTR_unify_void() //unify_void n -- I1_X
-{
- INSACC_I1X(n);
- if (AM_writeFlag) {
- while (n > 0) {
- DF_mkVar((MemPtr)AM_sreg, AM_adjreg);
- AM_sreg++;
- n--;
- }
- } else AM_sreg += n;
-}
-
-/*****************************************************************************/
-/* INSTRUCTIONS FOR UNIFYING AND CREATING TYPES */
-/*****************************************************************************/
-void SINSTR_put_type_variable_t() //put_type_variable Xn,Ai -- R_R_X
-{
- INSACC_RRX(regX, regA);
- nhreg = AM_hreg + DF_TY_ATOMIC_SIZE;
- AM_heapError(nhreg);
- DF_mkFreeVarType(AM_hreg);
- *regA = *regX = *((AM_DataTypePtr)AM_hreg);
- AM_hreg = nhreg;
-}
-
-void SINSTR_put_type_variable_p() //put_type_variable Yn,Ai -- E_R_X
-{
- INSACC_ERX(envY, regA);
- DF_mkFreeVarType((MemPtr)envY);
- *regA = *envY;
-}
-
-void SINSTR_put_type_value_t() //put_type_value Xn,Ai -- R_R_X
-{
- INSACC_RRX(regX, regA);
- *regA = *((AM_DataTypePtr)DF_typeDeref((DF_TypePtr)regX));
-}
-
-void SINSTR_put_type_value_p() //put_type_value Yn,Ai -- E_R_X
-{
- INSACC_ERX(envY, regA);
- *regA = *((AM_DataTypePtr)DF_typeDeref((DF_TypePtr)envY));
-}
-
-void SINSTR_put_type_unsafe_value() //put_type_unsafe_value Yn,Ai -- E_R_X
-{
- INSACC_ERX(envY, regA);
- tyPtr = DF_typeDeref((DF_TypePtr)envY);
- if (DF_isRefType(tyPtr) && AM_inCurEnv((MemPtr)tyPtr)){
- nhreg = AM_hreg + DF_TY_ATOMIC_SIZE;
- AM_heapError(nhreg);
- DF_mkFreeVarType(AM_hreg);
- TR_trailType(tyPtr);
- DF_mkRefType((MemPtr)tyPtr, (DF_TypePtr)AM_hreg);
- *regA = *((AM_DataTypePtr)tyPtr);
- AM_hreg += DF_TY_ATOMIC_SIZE;
- } else *regA = *((AM_DataTypePtr)tyPtr);
-}
-
-
-void SINSTR_put_type_const() //put_type_const Ai,k -- R_K_X
-{
- INSACC_RKX(regA, kindInd);
- DF_mkSortType((MemPtr)regA, kindInd);
-}
-
-void SINSTR_put_type_structure() //put_type_structure Ai,k -- R_K_X
-{
- INSACC_RKX(regA, kindInd);
- n = AM_kstArity(kindInd);
- nhreg = AM_hreg + DF_TY_ATOMIC_SIZE;
- AM_heapError(nhreg + n * DF_TY_ATOMIC_SIZE);
- DF_mkStrType((MemPtr)regA, (DF_TypePtr)AM_hreg);
- DF_mkStrFuncType(AM_hreg, kindInd, n);
- AM_hreg = nhreg;
-}
-
-void SINSTR_put_type_arrow() //put_type_arrow Ai -- R_X
-{
- INSACC_RX(regA);
- AM_heapError(AM_hreg + DF_TY_ATOMIC_SIZE * DF_TY_ARROW_ARITY);
- DF_mkArrowType((MemPtr)regA, (DF_TypePtr)AM_hreg);
-}
-
-/**********************************************************/
-/* SET CLASS */
-/**********************************************************/
-void SINSTR_set_type_variable_t() //set_type_variable Xi -- R_X
-{
- INSACC_RX(regX);
- DF_mkFreeVarType(AM_hreg);
- *regX = *((AM_DataTypePtr)AM_hreg);
- AM_hreg += DF_TY_ATOMIC_SIZE;
-}
-
-void SINSTR_set_type_variable_p() //set_type_variable Yi -- E_X
-{
- INSACC_EX(envY);
- DF_mkFreeVarType(AM_hreg);
- *envY = *((AM_DataTypePtr)AM_hreg);
- AM_hreg += DF_TY_ATOMIC_SIZE;
-}
-
-void SINSTR_set_type_value_t() //set_type_value Xi -- R_X
-{
- INSACC_RX(regX);
- tyPtr = DF_typeDeref((DF_TypePtr)regX);
- DF_copyAtomicType(tyPtr, AM_hreg);
- AM_hreg += DF_TY_ATOMIC_SIZE;
-}
-
-void SINSTR_set_type_value_p() //set_type_value Yi -- E_X
-{
- INSACC_EX(envY);
- tyPtr = DF_typeDeref((DF_TypePtr)envY);
- DF_copyAtomicType(tyPtr, AM_hreg);
- AM_hreg += DF_TY_ATOMIC_SIZE;
-}
-
-void SINSTR_set_type_local_value_t() //set_type_local_value Xi -- R_X
-{
- INSACC_RX(regX);
- tyPtr = DF_typeDeref((DF_TypePtr)regX);
- if (DF_isRefType(tyPtr) && AM_stackAddr((MemPtr)tyPtr)){//fv on stack
- TR_trailType(tyPtr);
- DF_mkFreeVarType(AM_hreg);
- DF_mkRefType((MemPtr)tyPtr, (DF_TypePtr)AM_hreg);
- } else DF_copyAtomicType(tyPtr, AM_hreg);
- AM_hreg += DF_TY_ATOMIC_SIZE;
-}
-
-void SINSTR_set_type_local_value_p() //set_type_local_value Yi -- E_X
-{
- INSACC_EX(envY);
- tyPtr = DF_typeDeref((DF_TypePtr)envY);
- if (DF_isRefType(tyPtr) && AM_stackAddr((MemPtr)tyPtr)) {//fv on stack
- TR_trailType(tyPtr);
- DF_mkFreeVarType(AM_hreg);
- DF_mkRefType((MemPtr)tyPtr, (DF_TypePtr)AM_hreg);
- } else DF_copyAtomicType(tyPtr, AM_hreg);
- AM_hreg += DF_TY_ATOMIC_SIZE;
-}
-
-void SINSTR_set_type_constant() //set_type_constant k -- K_X
-{
- INSACC_KX(kindInd);
- DF_mkSortType(AM_hreg, kindInd);
- AM_hreg += DF_TY_ATOMIC_SIZE;
-}
-
-/**********************************************************/
-/* GET CLASS */
-/**********************************************************/
-void SINSTR_get_type_variable_t() //get_type_variable Xn,Ai -- R_R_X
-{
- INSACC_RRX(regX, regA);
- *regX = *regA;
-}
-
-void SINSTR_get_type_variable_p() //get_type_variable Yn,Ai -- E_R_X
-{
- INSACC_ERX(envY, regA);
- *envY = *regA;
-}
-
-void SINSTR_init_type_variable_t() //init_type_variable Xn,Ym -- R_CE_X
-{
- INSACC_RCEX(regX, clenvY);
- *regX = *((AM_DataTypePtr)DF_typeDeref((DF_TypePtr)clenvY));
-}
-
-void SINSTR_init_type_variable_p() //init_type_variable Yn,Ym -- E_CE_X
-{
- INSACC_ECEX(envY, clenvY);
- *envY = *((AM_DataTypePtr)DF_typeDeref((DF_TypePtr)clenvY));
-}
-
-void SINSTR_get_type_value_t() //get_type_value Xn,Ai -- R_R_X
-{
- INSACC_RRX(regX, regA);
- AM_pdlError(2);
- AM_initTypesPDL();
- AM_pushPDL((MemPtr)regX);
- AM_pushPDL((MemPtr)regA);
- TY_typesUnify();
-}
-
-void SINSTR_get_type_value_p() //get_type_value Yn,Ai -- E_R_X
-{
- INSACC_ERX(envY, regA);
- AM_pdlError(2);
- AM_initTypesPDL();
- AM_pushPDL((MemPtr)envY);
- AM_pushPDL((MemPtr)regA);
- TY_typesUnify();
-}
-
-void SINSTR_get_type_constant() //get_type_constant Xi,k -- R_K_X
-{
- INSACC_RKX(regX, kindInd);
- tyPtr = DF_typeDeref((DF_TypePtr)regX);
- if (DF_isRefType(tyPtr)) {
- TR_trailType(tyPtr);
- DF_mkSortType((MemPtr)tyPtr, kindInd);
- return;
- }
- if (DF_isSortType(tyPtr) && (DF_typeKindTabIndex(tyPtr) == kindInd)) return;
- EM_THROW(EM_FAIL); //all other cases
-}
-
-void SINSTR_get_type_structure() //get_type_structure Xi,k -- R_K_X
-{
- INSACC_RKX(regX, kindInd);
- tyPtr = DF_typeDeref((DF_TypePtr)regX);
- if (DF_isRefType(tyPtr)) {
- nhreg = AM_hreg + DF_TY_ATOMIC_SIZE;
- n = AM_kstArity(kindInd);
- AM_heapError(nhreg + DF_TY_ATOMIC_SIZE * n);
- TR_trailType(tyPtr);
- DF_mkStrType((MemPtr)tyPtr, (DF_TypePtr)AM_hreg);
- DF_mkStrFuncType(AM_hreg, kindInd, n);
- AM_tyvbbreg = (DF_TypePtr)AM_hreg;
- AM_tyWriteFlag = ON;
-
- AM_hreg += DF_TY_ATOMIC_SIZE;
- return;
- } //else not ref
- if (DF_isStrType(tyPtr)) {
- tyPtr = DF_typeStrFuncAndArgs(tyPtr);
- if (DF_typeStrFuncInd(tyPtr) == kindInd) {
- AM_tysreg = DF_typeStrArgs(tyPtr);
- AM_tyWriteFlag = OFF;
- return;
- }
- }
- EM_THROW(EM_FAIL);
-}
-
-void SINSTR_get_type_arrow() //get_type_arrow Xi -- R_X
-{
- INSACC_RX(regX);
- tyPtr = DF_typeDeref((DF_TypePtr)regX);
- if (DF_isRefType(tyPtr)) {
- AM_heapError(nhreg + DF_TY_ATOMIC_SIZE * DF_TY_ARROW_ARITY);
- TR_trailType(tyPtr);
- DF_mkArrowType((MemPtr)tyPtr, (DF_TypePtr)AM_hreg);
- AM_tyvbbreg = (DF_TypePtr)AM_hreg;
- AM_tyWriteFlag = ON;
- return;
- } //else not ref
- if (DF_isArrowType(tyPtr)) {
- AM_tysreg = DF_typeArrowArgs(tyPtr);
- AM_tyWriteFlag = OFF;
- return;
- }
- EM_THROW(EM_FAIL);
-}
-
-/**********************************************************/
-/* UNIFY CLASS */
-/**********************************************************/
-void SINSTR_unify_type_variable_t() //unify_type_variable Xi -- R_X
-{
- INSACC_RX(regX);
- if (AM_tyWriteFlag) {
- DF_mkFreeVarType(AM_hreg);
- *regX = *((AM_DataTypePtr)AM_hreg);
- AM_hreg += DF_TY_ATOMIC_SIZE;
- } else { //read mode
- *regX = *((AM_DataTypePtr)AM_tysreg);
- AM_tysreg++;
- }
-}
-
-void SINSTR_unify_type_variable_p() //unify_type_variable Yi -- E_X
-{
- INSACC_EX(envY);
- if (AM_tyWriteFlag) {
- DF_mkFreeVarType(AM_hreg);
- *envY = *((AM_DataTypePtr)AM_hreg);
- AM_hreg += DF_TM_ATOMIC_SIZE;
- } else { //read mode
- *envY = *((AM_DataTypePtr)AM_tysreg);
- AM_tysreg++;
- }
-}
-
-void SINSTR_unify_type_value_t() //unify_type_value Xi -- R_X
-{
- INSACC_RX(regX);
- tyPtr = DF_typeDeref((DF_TypePtr)regX);
- if (AM_tyWriteFlag) {
- AM_pdlError(1);
- AM_initTypesPDL();
- AM_pushPDL((MemPtr)tyPtr);
- TY_typesOccC();
- DF_copyAtomicType(tyPtr, AM_hreg);
- AM_hreg += DF_TY_ATOMIC_SIZE;
- } else { //readmode
- AM_pdlError(2);
- AM_initTypesPDL();
- AM_pushPDL((MemPtr)tyPtr);
- AM_pushPDL((MemPtr)AM_tysreg);
- TY_typesUnify();
- AM_tysreg++;
- }
-}
-
-void SINSTR_unify_type_value_p() //unify_type_value Yi -- E_X
-{
- INSACC_EX(envY);
- tyPtr = DF_typeDeref((DF_TypePtr)envY);
- if (AM_tyWriteFlag) {
- AM_pdlError(1);
- AM_initTypesPDL();
- AM_pushPDL((MemPtr)tyPtr);
- TY_typesOccC();
- DF_copyAtomicType(tyPtr, AM_hreg);
- AM_hreg += DF_TY_ATOMIC_SIZE;
- } else { //readmode
- AM_pdlError(2);
- AM_initTypesPDL();
- AM_pushPDL((MemPtr)tyPtr);
- AM_pushPDL((MemPtr)AM_tysreg);
- TY_typesUnify();
- AM_tysreg++;
- }
-}
-
-void SINSTR_unify_envty_value_t() //unify_envty_value Xi -- R_X
-{
- INSACC_RX(regX);
- tyPtr = DF_typeDeref((DF_TypePtr)regX);
- if (AM_tyWriteFlag) {
- DF_copyAtomicType(tyPtr, AM_hreg);
- AM_hreg += DF_TY_ATOMIC_SIZE;
- } else { //readmode
- AM_pdlError(2);
- AM_initTypesPDL();
- AM_pushPDL((MemPtr)tyPtr);
- AM_pushPDL((MemPtr)AM_tysreg);
- TY_typesUnify();
- AM_tysreg++;
- }
-}
-
-void SINSTR_unify_envty_value_p() //unify_envty_value Yi -- E_X
-{
- INSACC_EX(envY);
- tyPtr = DF_typeDeref((DF_TypePtr)envY);
- if (AM_tyWriteFlag) {
- DF_copyAtomicType(tyPtr, AM_hreg);
- AM_hreg += DF_TY_ATOMIC_SIZE;
- } else { //readmode
- AM_pdlError(2);
- AM_initTypesPDL();
- AM_pushPDL((MemPtr)tyPtr);
- AM_pushPDL((MemPtr)AM_tysreg);
- TY_typesUnify();
- AM_tysreg++;
- }
-}
-
-void SINSTR_unify_type_local_value_t() //unify_type_local_value Xi -- R_X
-{
- INSACC_RX(regX);
- tyPtr = DF_typeDeref((DF_TypePtr)regX);
- if (AM_tyWriteFlag) {
- if (DF_isRefType(tyPtr)) {
- if (AM_stackAddr((MemPtr)tyPtr)) {
- TR_trailType(tyPtr);
- DF_mkFreeVarType(AM_hreg);
- DF_mkRefType((MemPtr)tyPtr, (DF_TypePtr)AM_hreg);
- *regX = *((AM_DataTypePtr)tyPtr);
- } else DF_copyAtomicType(tyPtr, AM_hreg); //a heap address
- } else { //not free var type
- AM_pdlError(1);
- AM_initTypesPDL();
- AM_pushPDL((MemPtr)tyPtr);
- TY_typesOccC();
- DF_copyAtomicType(tyPtr, AM_hreg);
- }
- AM_hreg += DF_TY_ATOMIC_SIZE;
- } else { //readmode
- AM_pdlError(2);
- AM_initTypesPDL();
- AM_pushPDL((MemPtr)tyPtr);
- AM_pushPDL((MemPtr)AM_tysreg);
- TY_typesUnify();
- AM_tysreg++;
- }
-}
-
-void SINSTR_unify_type_local_value_p() //unify_type_local_value Yi -- E_X
-{
- INSACC_EX(envY);
- tyPtr = DF_typeDeref((DF_TypePtr)envY);
- if (AM_tyWriteFlag) {
- if (DF_isRefType(tyPtr)) {
- if (AM_stackAddr((MemPtr)tyPtr)) {
- TR_trailType(tyPtr);
- DF_mkFreeVarType(AM_hreg);
- DF_mkRefType((MemPtr)tyPtr, (DF_TypePtr)AM_hreg);
- } else DF_copyAtomicType(tyPtr, AM_hreg);
- } else { //not free var type
- AM_pdlError(1);
- AM_initTypesPDL();
- AM_pushPDL((MemPtr)tyPtr);
- TY_typesOccC();
- DF_copyAtomicType(tyPtr, AM_hreg);
- }
- AM_hreg += DF_TY_ATOMIC_SIZE;
- } else { //readmode
- AM_pdlError(2);
- AM_initTypesPDL();
- AM_pushPDL((MemPtr)tyPtr);
- AM_pushPDL((MemPtr)AM_tysreg);
- TY_typesUnify();
- AM_tysreg++;
- }
-}
-
-void SINSTR_unify_envty_local_value_t() //unify_envty_local_value Xi -- R_X
-{
- INSACC_RX(regX);
- tyPtr = DF_typeDeref((DF_TypePtr)regX);
- if (AM_tyWriteFlag) {
- if (DF_isRefType(tyPtr) && (AM_stackAddr((MemPtr)tyPtr))) {
- TR_trailType(tyPtr);
- DF_mkFreeVarType(AM_hreg);
- DF_mkRefType((MemPtr)tyPtr, (DF_TypePtr)AM_hreg);
- *regX = *((AM_DataTypePtr)tyPtr);
- } else DF_copyAtomicType(tyPtr, AM_hreg);
- AM_hreg += DF_TY_ATOMIC_SIZE;
- } else { //read mode
- AM_pdlError(2);
- AM_initTypesPDL();
- AM_pushPDL((MemPtr)tyPtr);
- AM_pushPDL((MemPtr)AM_tysreg);
- TY_typesUnify();
- AM_tysreg++;
- }
-}
-
-void SINSTR_unify_envty_local_value_p() //unify_envty_local_value Yi -- E_X
-{
- INSACC_EX(envY);
- tyPtr = DF_typeDeref((DF_TypePtr)envY);
- if (AM_tyWriteFlag) {
- if (DF_isRefType(tyPtr) && (AM_stackAddr((MemPtr)tyPtr))) {
- TR_trailType(tyPtr);
- DF_mkFreeVarType(AM_hreg);
- DF_mkRefType((MemPtr)tyPtr, (DF_TypePtr)AM_hreg);
- } else DF_copyAtomicType(tyPtr, AM_hreg);
- AM_hreg += DF_TY_ATOMIC_SIZE;
- } else { //read mode
- AM_pdlError(2);
- AM_initTypesPDL();
- AM_pushPDL((MemPtr)tyPtr);
- AM_pushPDL((MemPtr)AM_tysreg);
- TY_typesUnify();
- AM_tysreg++;
- }
-}
-
-void SINSTR_unify_type_constant() //unify_type_constant k -- K_X
-{
- INSACC_KX(kindInd);
- if (AM_tyWriteFlag) {
- DF_mkSortType(AM_hreg, kindInd);
- AM_hreg += DF_TY_ATOMIC_SIZE;
- } else { //read mode
- tyPtr = DF_typeDeref(AM_tysreg);
- AM_tysreg++;
- if (DF_isRefType(tyPtr)) {
- TR_trailType(tyPtr);
- DF_mkSortType((MemPtr)tyPtr, kindInd);
- return;
- } //otherwise not ref
- if (DF_isSortType(tyPtr) && (DF_typeKindTabIndex(tyPtr) == kindInd))
- return;
- EM_THROW(EM_FAIL);
- }
-}
-
-/* init type var for implication goal */
-void SINSTR_create_type_variable() //create_type_variable Yi -- E_X
-{
- INSACC_EX(envY);
- DF_mkFreeVarType((MemPtr)envY);
-}
-
-/*****************************************************************************/
-/* HIGHER-ORDER INSTRUCTIONS */
-/*****************************************************************************/
-void SINSTR_pattern_unify_t() //pattern_unify Xi,Aj -- R_R_X
-{
- INSACC_RRX(regX, regA);
- HOPU_patternUnifyPair((DF_TermPtr)regX, (DF_TermPtr)regA);
-}
-
-void SINSTR_pattern_unify_p() //pattern_unify Yi,Aj -- E_R_X
-{
- INSACC_ERX(envY, regA);
- HOPU_patternUnifyPair((DF_TermPtr)envY, (DF_TermPtr)regA);
-}
-
-void SINSTR_finish_unify() //finish_unify -- X
-{
- INSACC_X();
- HOPU_patternUnify();
-}
-
-void SINSTR_head_normalize_t() //head_normalize Xi -- R_X
-{
- INSACC_RX(regX);
- HN_hnorm((DF_TermPtr)regX); //no need to deref (hnorm takes care of it)
-}
-
-void SINSTR_head_normalize_p() //head_normalize Yi -- E_X
-{
- INSACC_EX(envY);
- HN_hnorm((DF_TermPtr)envY); //no need to deref (hnorm takes care of it)
-}
-
-/*****************************************************************************/
-/* LOGICAL INSTRUCTIONS */
-/*****************************************************************************/
-void SINSTR_incr_universe() //incr_universe -- X
-{
- INSACC_X();
- AM_ucError(AM_ucreg);
- AM_ucreg++;
-}
-
-void SINSTR_decr_universe() //decr_universe -- X
-{
- INSACC_X();
- AM_ucreg--;
-}
-
-void SINSTR_set_univ_tag() //set_univ_tag Yi,c -- E_C_X
-{
- INSACC_ECX(envY, constInd);
- DF_mkConst((MemPtr)envY, AM_ucreg, constInd);
-}
-
-void SINSTR_tag_exists_t() //tag_exists Xi -- R_X
-{
- INSACC_RX(regX);
- nhreg = AM_hreg + DF_TM_ATOMIC_SIZE;
- AM_heapError(nhreg);
- DF_mkVar(AM_hreg, AM_ucreg);
- DF_mkRef((MemPtr)regX, (DF_TermPtr)AM_hreg);
- AM_hreg = nhreg;
-}
-
-void SINSTR_tag_exists_p() //tag_exists Yi -- E_X
-{
- INSACC_EX(envY);
- DF_mkVar((MemPtr)envY, AM_ucreg);
-}
-
-void SINSTR_tag_variable() //tag_variable Yi -- E_X
-{
- INSACC_EX(envY);
- DF_mkVar((MemPtr)envY, AM_envUC());
-}
-
-void SINSTR_push_impl_point() //put_impl_point n,t -- I1_IT_X
-{
- INSACC_I1ITX(n, impTab);
- m = MEM_implLTS(impTab);
- ip = AM_findtos(n) + AM_NCLT_ENTRY_SIZE * m;
- AM_tosreg = ip + AM_IMP_FIX_SIZE;
- AM_stackError(AM_tosreg);
- AM_mkImplRec(ip, MEM_implPST(impTab, m), MEM_implPSTS(impTab),
- MEM_implFC(impTab));
- if (m > 0) AM_mkImpNCLTab(ip, MEM_implLT(impTab), m);
- AM_ireg = ip;
-}
-
-void SINSTR_pop_impl_point() //pop_impl_point -- X
-{
- INSACC_X();
- AM_ireg = AM_curimpPIP();
- AM_settosreg();
-}
-
-void SINSTR_add_imports() //add_imports n,m,L -- SEG_I1_L_X
-{
- INSACC_SEGI1LX(n, m, label);
- bckfd = AM_cimpBCK(n);
- l = AM_impBCKNo(bckfd);
- if (AM_breg > AM_impBCKMRCP(bckfd)) TR_trailImport(bckfd);
- AM_setBCKNo(bckfd, l+1);
- AM_setBCKMRCP(bckfd, AM_breg);
- if (l > 0) AM_preg = label;
- else AM_tosreg = AM_findtos(m);
-}
-
-void SINSTR_remove_imports() //remove_imports n,L -- SEG_L_X
-{
- INSACC_SEGLX(n, label);
- bckfd = AM_cimpBCK(n);
- l = AM_impBCKNo(bckfd);
- if (AM_breg > AM_impBCKMRCP(bckfd)) TR_trailImport(bckfd);
- AM_setBCKNo(bckfd, l-1);
- AM_setBCKMRCP(bckfd, AM_breg);
- if (l > 1) AM_preg = label;
-}
-
-void SINSTR_push_import() //push_import t -- MT_X
-{
- INSACC_MTX(impTab);
- n = MEM_impNCSEG(impTab); // n = # code segs (# bc field)
- m = MEM_impLTS(impTab); // m = link tab size
- l = AM_NCLT_ENTRY_SIZE * m; // l = space for next clause table
- ip = AM_tosreg + (AM_BCKV_ENTRY_SIZE * n) + l;
- AM_tosreg = ip + AM_IMP_FIX_SIZE;
- AM_stackError(AM_tosreg);
- if (n > 0) AM_initBCKVector(ip, l, n);
- n = MEM_impNLC(impTab); // reuse n as the number of local consts
- if (n > 0) {
- AM_mkImptRecWL(ip, m, MEM_impPST(impTab, m, n), MEM_impPSTS(impTab),
- MEM_impFC(impTab));
- AM_ucError(AM_ucreg);
- AM_ucreg++;
- AM_initLocs(n, MEM_impLCT(impTab, m));
- } else AM_mkImptRecWOL(ip, m, MEM_impPST(impTab, m, n), MEM_impPSTS(impTab),
- MEM_impFC(impTab));
- if (m > 0) AM_mkImpNCLTab(ip, MEM_impLT(impTab), m);
- AM_ireg = ip;
-}
-
-void SINSTR_pop_imports() //pop_imports n -- I1_X
-{
- INSACC_I1X(n);
- for (; n > 0; n--){
- if (AM_isCurImptWL()) AM_ucreg--;
- AM_ireg = AM_curimpPIP();
- }
- AM_settosreg();
-}
-
-/*****************************************************************************/
-/* CONTROL INSTRUCTIONS */
-/*****************************************************************************/
-void SINSTR_allocate() //allocate n -- I1_X
-{
- INSACC_I1X(n);
- ep = AM_findtosEnv() + AM_ENV_FIX_SIZE;
- AM_stackError(ep + AM_DATA_SIZE * n);
- AM_ereg = AM_mkEnv(ep);
-}
-
-void SINSTR_deallocate() //deallocate -- X
-{
- INSACC_X();
- AM_cpreg = AM_envCP();
- AM_ereg = AM_envCE();
-}
-
-void SINSTR_call() //call n,L -- I1_L_X
-{
- AM_cpreg = AM_preg + INSTR_I1LX_LEN; //next instruction
- AM_cereg = AM_ereg;
- AM_b0reg = AM_breg;
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_I1LX_L));
-}
-
-void SINSTR_call_name() //call_name n,c -- I1_C_WP_X
-{
- INSACC_I1CWPX_C(constInd);
- AM_findCode(constInd, &cl, &ip);
- if (cl) {
- AM_cpreg = (AM_preg + INSTR_I1CWPX_LEN); // next instr
- AM_b0reg = AM_breg;
- AM_preg = cl;
- AM_cireg = ip;
- if (AM_isImplCI()) AM_cereg = AM_cimpCE();
- } else EM_THROW(EM_FAIL);
-}
-
-void SINSTR_execute() //execute label -- L_X
-{
- INSACC_LX(); //AM_preg has been set to label
- AM_b0reg = AM_breg;
-}
-
-void SINSTR_execute_name() //execute_name c -- C_WP_X
-{
- INSACC_CWPX(constInd);
- AM_findCode(constInd, &cl, &ip);
- if (cl) {
- AM_b0reg = AM_breg;
- AM_preg = cl;
- AM_cireg = ip;
- if (AM_isImplCI()) AM_cereg = AM_cimpCE();
- } else EM_THROW(EM_FAIL);
-}
-
-void SINSTR_proceed() //proceed -- X
-{
- /* We use a nonlocal procedure exit to get back to the toplevel
- when a query has a result. We do this so that we don't have to
- return values from instruction functions, and we don't have to
- do any checks in the simulator loop. We use the exception
- mechanism to acheive our nonlocal exit. */
- if (AM_noEnv()) EM_THROW(EM_QUERY_RESULT);
- else {
- AM_preg = AM_cpreg;
- AM_cireg = AM_envCI();
- if (AM_isImplCI()) AM_cereg = AM_cimpCE();
- }
-}
-
-/*****************************************************************************/
-/* CHOICE INSTRUCTIONS */
-/*****************************************************************************/
-void SINSTR_try_me_else() //try_me_else n,lab -- I1_L_X
-{
- INSACC_I1LX(n, label);
- AM_tosreg = (MemPtr)((AM_DataTypePtr)(AM_findtosEnv() + AM_CP_FIX_SIZE)+n);
- AM_stackError(AM_tosreg);
- cp = AM_tosreg - 1;
- AM_mkCP(cp, label, n);
- AM_breg = cp;
- AM_hbreg = AM_hreg;
-}
-
-void SINSTR_retry_me_else() //retry_me_else n,lab -- I1_L_X
-{
- INSACC_I1LX(n, label);
- AM_restoreRegs(n);
- AM_hbreg = AM_hreg;
- if (AM_isImplCI()) AM_cereg = AM_cimpCE();
- AM_setNClCP(label);
-}
-
-void SINSTR_trust_me() //trust_me n -- I1_WP_X
-{
- INSACC_I1WPX(n);
- AM_restoreRegs(n);
- if (AM_isImplCI()) AM_cereg = AM_cimpCE();
- AM_breg = AM_cpB();
- AM_hbreg = AM_cpH();
- AM_settosreg();
-}
-
-void SINSTR_try() //try n,label -- I1_L_X
-{
- INSACC_I1LX_I1(n);
- AM_tosreg = (MemPtr)((AM_DataTypePtr)(AM_findtosEnv() + AM_CP_FIX_SIZE)+n);
- AM_stackError(AM_tosreg);
- cp = AM_tosreg - 1;
- AM_mkCP(cp, (AM_preg + INSTR_I1LX_LEN), n);
- AM_breg = cp;
- AM_hbreg = AM_hreg;
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_I1LX_L));
-}
-
-void SINSTR_retry() //retry n,label -- I1_L_X
-{
- INSACC_I1LX_I1(n);
- AM_restoreRegs(n);
- AM_hbreg = AM_hreg;
- if (AM_isImplCI()) AM_cereg = AM_cimpCE();
- AM_setNClCP(AM_preg + INSTR_I1LX_LEN);
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_I1LX_L));
-}
-
-void SINSTR_trust() //trust n,label -- I1_L_WP_X
-{
- INSACC_I1LWPX_I1(n);
- AM_restoreRegs(n);
- if (AM_isImplCI()) AM_cereg = AM_cimpCE();
- AM_breg = AM_cpB();
- AM_hbreg = AM_cpH();
- AM_settosreg();
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_I1LWPX_L));
-}
-
-void SINSTR_trust_ext() //trust_ext n,m -- I1_N_X
-{
- INSACC_I1NX(n, m);
- nextcl = AM_impNCL(AM_cpCI(), m);
- AM_preg = AM_impNCLCode(nextcl);
-
- if (AM_isFailInstr(AM_preg)) {
- AM_breg = AM_cpB();
- AM_settosreg();
- EM_THROW(EM_FAIL);
- }
- AM_restoreRegsWoCI(n);
- AM_cireg = AM_impNCLIP(nextcl);
- if (AM_isImplCI()) AM_cereg = AM_cimpCE();
- AM_breg = AM_cpB();
- AM_hbreg = AM_cpH();
- AM_settosreg();
-}
-
-void SINSTR_try_else() //try_else n,lab1,lab2 -- I1_L_L_X
-{
- INSACC_I1LLX(n, label); //AM_preg has been set
- AM_tosreg = (MemPtr)((AM_DataTypePtr)(AM_findtosEnv() + AM_CP_FIX_SIZE)+n);
- AM_stackError(AM_tosreg);
- cp = AM_tosreg - 1;
- AM_mkCP(cp, label, n);
- AM_breg = cp;
- AM_hbreg = AM_hreg;
-}
-
-void SINSTR_retry_else() //retry_else n,lab1,lab2 -- I1_L_L_X
-{
- INSACC_I1LLX(n, label); //AM_preg has been set
- AM_restoreRegs(n);
- AM_hbreg = AM_hreg;
- if (AM_isImplCI()) AM_cereg = AM_cimpCE();
- AM_setNClCP(label);
-}
-
-void SINSTR_branch() //branch lab -- L_X
-{
- INSACC_LX(); //AM_preg has been set to label
-}
-
-
-/*****************************************************************************/
-/* INDEXING INSTRUCTIONS */
-/*****************************************************************************/
-void SINSTR_switch_on_term() //switch_on_term lv,lc,ll,lbv --L_L_L_L_X
-{
- regA = AM_reg(1);
- tmPtr = DF_termDeref((DF_TermPtr)regA);
- numAbs = 0;
- while (DF_isLam(tmPtr)) {
- numAbs += DF_lamNumAbs(tmPtr);
- tmPtr = DF_termDeref(DF_lamBody(tmPtr));
- }
- if (DF_isCons(tmPtr)) {
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_LLLLX_L3));
- return;
- } else {
- if (DF_isApp(tmPtr)) tmPtr = DF_termDeref(DF_appFunc(tmPtr));
- if (DF_isNAtomic(tmPtr)) {
- HN_hnorm(tmPtr);
- numAbs += AM_numAbs;
- tmPtr = AM_head;
- }
- switch (DF_termTag(tmPtr)) {
- case DF_TM_TAG_VAR: {
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_LLLLX_L1));
- return;
- }
- case DF_TM_TAG_CONST: {
- tablInd = DF_constTabIndex(tmPtr);
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_LLLLX_L2));
- return;
- }
- case DF_TM_TAG_INT: {
- tablInd = PERV_INTC_INDEX;
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_LLLLX_L2));
- return;
- }
- case DF_TM_TAG_FLOAT: {
- tablInd = PERV_REALC_INDEX;
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_LLLLX_L2));
- return;
- }
- case DF_TM_TAG_STR: {
- tablInd = PERV_STRC_INDEX;
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_LLLLX_L2));
- return;
- }
- case DF_TM_TAG_NIL: {
- tablInd = PERV_NIL_INDEX;
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_LLLLX_L2));
- return;
- }
- case DF_TM_TAG_STREAM:{ EM_THROW(EM_FAIL); }
- case DF_TM_TAG_CONS: {
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_LLLLX_L3));
- return;
- }
- case DF_TM_TAG_BVAR:
- {
- numAbs = numAbs - DF_bvIndex(tmPtr);
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_LLLLX_L4));
- return;
- }
- }
- }
-}
-
-void SINSTR_switch_on_constant() //switch_on_constant n,tab -- I1_HT_X
-{
- INSACC_I1HTX(n, table);
- cl = LD_SEARCHTAB_HashSrch(tablInd, n, table);
- if (cl) {
- AM_preg = cl;
- return;
- } else EM_THROW(EM_FAIL);
-}
-
-void SINSTR_switch_on_bvar() //switch_on_bvar n,tab -- I1_BVT_X
-{
- INSACC_I1BVTX(n, table);
- for (m = 0; m != n; m++)
- if ((numAbs = MEM_branchTabIndexVal(table, m))) break;
- if (m < n) AM_preg = MEM_branchTabCodePtr(table, m);
- else EM_THROW(EM_FAIL);
-}
-
-void SINSTR_switch_on_reg() //switch_on_reg n,SL1,FL2 -- N_L_L_X
-{
- INSACC_NLLX_N(n);
- nextcl = AM_impNCL(AM_cireg, n);
- if (AM_isFailInstr(AM_impNCLCode(nextcl))){
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_NLLX_L2));}
- else {
- AM_preg = *((INSTR_CodeLabel *)(AM_preg + INSTR_NLLX_L1));
- }
-}
-
-/*****************************************************************************/
-/* CUT INSTRUCTIONS */
-/*****************************************************************************/
-void SINSTR_neck_cut() //neck_cut -- X
-{
- INSACC_X();
- AM_breg = AM_b0reg;
- AM_hbreg = AM_cpH();
- AM_settosreg();
-}
-
-void SINSTR_get_level() //get_level Yn -- E_X
-{
- INSACC_EX(envY);
- *((MemPtr *)envY) = AM_b0reg;
-}
-
-void SINSTR_put_level() //put_level Yn -- E_X
-{
- INSACC_EX(envY);
- AM_b0reg = *((MemPtr *)envY);
-}
-
-void SINSTR_cut() //cut Yn -- E_X
-{
- INSACC_EX(envY);
- AM_breg = *((MemPtr *)envY);
- AM_hbreg = AM_cpH();
- AM_settosreg();
-}
-
-/*****************************************************************************/
-/* MISCELLANEOUS INSTRUCTIONS */
-/*****************************************************************************/
-void SINSTR_call_builtin() //call_builtin n -- I1_WP_X
-{
- INSACC_I1I1WPX(n);
- AM_cpreg = AM_preg;
- BI_dispatch(n);
-}
-
-void SINSTR_builtin() //builtin n -- I1_X
-{
- INSACC_I1X(n);
- if (!AM_noEnv()) {
- AM_cireg = AM_envCI();
- if (AM_isImplCI()) AM_cereg = AM_cimpCE();
- }
- BI_dispatch(n);
-}
-
-void SINSTR_stop() //stop -- X
-{
- EM_THROW(EM_TOP_LEVEL);
-}
-
-void SINSTR_halt() //halt -- X
-{
- EM_THROW(EM_EXIT);
-}
-
-void SINSTR_fail() //fail -- X
-{
- EM_THROW(EM_FAIL);
-}
-
-
-/**************************************************************************/
-/* linker only */
-/**************************************************************************/
-void SINSTR_execute_link_only()
-{
- EM_THROW(EM_ABORT);
-}
-
-void SINSTR_call_link_only()
-{
- EM_THROW(EM_ABORT);
-}
-
-
-#endif //SIMINSTR_C