diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2012-07-31 15:16:04 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2012-07-31 15:16:04 +0000 |
| commit | 83b321d862472f31c0c9f7feca8360ad5bfe8a75 (patch) | |
| tree | 0f0ef20ad78e25b320013c7bb160211a8612d4e9 /src/runtime/c/teyjus/simulator/siminstr.c | |
| parent | 314662dd09d5d1480007faa79258b0e93cc2aa59 (diff) | |
An initial import of the teyjus source code in the C runtime for GF. The two runtime are still not connected but the source code compiles.
Diffstat (limited to 'src/runtime/c/teyjus/simulator/siminstr.c')
| -rw-r--r-- | src/runtime/c/teyjus/simulator/siminstr.c | 1846 |
1 files changed, 1846 insertions, 0 deletions
diff --git a/src/runtime/c/teyjus/simulator/siminstr.c b/src/runtime/c/teyjus/simulator/siminstr.c new file mode 100644 index 000000000..6cb78cc38 --- /dev/null +++ b/src/runtime/c/teyjus/simulator/siminstr.c @@ -0,0 +1,1846 @@ +////////////////////////////////////////////////////////////////////////////// +//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 |
