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/tables/instructions.h | |
| 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/tables/instructions.h')
| -rw-r--r-- | src/runtime/c/teyjus/tables/instructions.h | 480 |
1 files changed, 480 insertions, 0 deletions
diff --git a/src/runtime/c/teyjus/tables/instructions.h b/src/runtime/c/teyjus/tables/instructions.h new file mode 100644 index 000000000..2ced4e85d --- /dev/null +++ b/src/runtime/c/teyjus/tables/instructions.h @@ -0,0 +1,480 @@ +/****************************************************************************/ +/* File instructions.h. */ +/* This file defines instruction operand types, instruction categories and */ +/* instruction opcode. */ +/****************************************************************************/ + +#ifndef INSTRUCTIONS_H +#define INSTRUCTIONS_H + +#include "../simulator/mctypes.h" //to be changed +#include "../simulator/dataformats.h" //to be changed + +/****************************************************************************/ +/* OPERAND TYPES */ +/****************************************************************************/ + +/* possible types of instruction operands */ +typedef enum INSTR_OperandType +{ + // (1 byte) padding + INSTR_P, + // (1 word) padding + INSTR_WP, + // argument register number + INSTR_R, + // environment variable number + INSTR_E, + // next clause number in impt or impl pt + INSTR_N, + // 1 byte natural number + INSTR_I1, + // closure environment variable number + INSTR_CE, + // import segment index + INSTR_SEG, + // constant symbol table index + INSTR_C, + // kind symbol table index + INSTR_K, + // code location + INSTR_L, + // integer immediate value + INSTR_I, + // floating point immediate value + INSTR_F, + // string pointer + INSTR_S, + // module table address + INSTR_MT, + // impl table address + INSTR_IT, + // hash table address + INSTR_HT, + // branch table for bound var indexing + INSTR_BVT, + // operand list terminator + INSTR_X +} INSTR_OperandType; + +/**************************************************************************/ +/* Types for instruction operants */ +/**************************************************************************/ + +typedef Byte INSTR_OpCode; +typedef Byte INSTR_RegInd; +typedef Byte INSTR_EnvInd; +typedef Byte INSTR_NextClauseInd; +typedef Byte INSTR_OneByteInt; +typedef Byte INSTR_ClEnvInd; +typedef Byte INSTR_ImpSegInd; +typedef TwoBytes INSTR_CstIndex; +typedef TwoBytes INSTR_KstIndex; +typedef CSpacePtr INSTR_CodeLabel; +typedef int INSTR_Int; +typedef float INSTR_Float; +typedef DF_StrDataPtr INSTR_Str; +typedef MemPtr INSTR_ModTab; +typedef MemPtr INSTR_ImplTab; +typedef MemPtr INSTR_HashTab; +typedef MemPtr INSTR_BranchTab; + +/***************************************************************************/ +/* INSTRUCTION CATEGORIES */ +/***************************************************************************/ + /* The names of instruction categories no longer include padding bytes. */ +/* Thus we do not need to maintain two sets of names for different machine */ +/* architectures. */ +typedef enum INSTR_InstrCategory +{ + INSTR_CAT_X = 0, + INSTR_CAT_RX = 1, + INSTR_CAT_EX = 2, + INSTR_CAT_I1X = 3, + INSTR_CAT_CX = 4, + INSTR_CAT_KX = 5, + INSTR_CAT_IX = 6, + INSTR_CAT_FX = 7, + INSTR_CAT_SX = 8, + INSTR_CAT_MTX = 9, + INSTR_CAT_LX = 10, + INSTR_CAT_RRX = 11, + INSTR_CAT_ERX = 12, + INSTR_CAT_RCX = 13, + INSTR_CAT_RIX = 14, + INSTR_CAT_RFX = 15, + INSTR_CAT_RSX = 16, + INSTR_CAT_RI1X = 17, + INSTR_CAT_RCEX = 18, + INSTR_CAT_ECEX = 19, + INSTR_CAT_CLX = 20, + INSTR_CAT_RKX = 21, + INSTR_CAT_ECX = 22, + INSTR_CAT_I1ITX = 23, + INSTR_CAT_I1LX = 24, + INSTR_CAT_SEGLX = 25, + INSTR_CAT_I1LWPX = 26, + INSTR_CAT_I1NX = 27, + INSTR_CAT_I1HTX = 28, + INSTR_CAT_I1BVTX = 29, + INSTR_CAT_CWPX = 30, + INSTR_CAT_I1WPX = 31, + INSTR_CAT_RRI1X = 32, + INSTR_CAT_RCLX = 33, + INSTR_CAT_RCI1X = 34, + INSTR_CAT_SEGI1LX = 35, + INSTR_CAT_I1LLX = 36, + INSTR_CAT_NLLX = 37, + INSTR_CAT_LLLLX = 38, + INSTR_CAT_I1CWPX = 39, + INSTR_CAT_I1I1WPX = 40 +} INSTR_InstrCategory; + +#define INSTR_NUM_INSTR_CATS 41 + +#define INSTR_CALL_I1_LEN 7 + +/**************************************************************************/ +/* Macros defines instruction lengths and distances between op code and */ +/* operands. */ +/* The assumption is that the op code occupies 1 byte. */ +/**************************************************************************/ + +//INSTR_CAT_X +#define INSTR_X_LEN 4 +//INSTR_CAT_RX +#define INSTR_RX_LEN 4 +#define INSTR_RX_R 1 +//INSTR_CAT_EX +#define INSTR_EX_LEN 4 +#define INSTR_EX_E 1 +//INSTR_CAT_I1X +#define INSTR_I1X_LEN 4 +#define INSTR_I1X_I1 1 +//INSTR_CAT_CX +#define INSTR_CX_LEN 4 +#define INSTR_CX_C 2 +//INSTR_CAT_KX +#define INSTR_KX_LEN 4 +#define INSTR_KX_K 2 +//INSTR_CAT_IX +#define INSTR_IX_LEN 8 +#define INSTR_IX_I 4 +//INSTR_CAT_FX +#define INSTR_FX_LEN 8 +#define INSTR_FX_F 4 +//INSTR_CAT_SX +#define INSTR_SX_LEN 8 +#define INSTR_SX_S 4 +//INSTR_CAT_MTX +#define INSTR_MTX_LEN 8 +#define INSTR_MTX_MT 4 +//INSTR_CAT_LX +#define INSTR_LX_LEN 8 +#define INSTR_LX_L 4 +//INSTR_CAT_RRX +#define INSTR_RRX_LEN 4 +#define INSTR_RRX_R1 1 +#define INSTR_RRX_R2 2 +//INSTR_CAT_ERX +#define INSTR_ERX_LEN 4 +#define INSTR_ERX_E 1 +#define INSTR_ERX_R 2 +//INSTR_CAT_RCX +#define INSTR_RCX_LEN 4 +#define INSTR_RCX_R 1 +#define INSTR_RCX_C 2 +//INSTR_CAT_RIX +#define INSTR_RIX_LEN 8 +#define INSTR_RIX_R 1 +#define INSTR_RIX_I 4 +//INSTR_CAT_RFX +#define INSTR_RFX_LEN 8 +#define INSTR_RFX_R 1 +#define INSTR_RFX_F 4 +//INSTR_CAT_RSX +#define INSTR_RSX_LEN 8 +#define INSTR_RSX_R 1 +#define INSTR_RSX_S 4 +//INSTR_CAT_RI1X +#define INSTR_RI1X_LEN 4 +#define INSTR_RI1X_R 1 +#define INSTR_RI1X_I1 2 +//INSTR_CAT_RCEX +#define INSTR_RCEX_LEN 4 +#define INSTR_RCEX_R 1 +#define INSTR_RCEX_CE 2 +//INSTR_CAT_ECEX +#define INSTR_ECEX_LEN 4 +#define INSTR_ECEX_E 1 +#define INSTR_ECEX_CE 2 +//INSTR_CAT_CLX +#define INSTR_CLX_LEN 8 +#define INSTR_CLX_C 2 +#define INSTR_CLX_L 4 +//INSTR_CAT_RKX +#define INSTR_RKX_LEN 4 +#define INSTR_RKX_R 1 +#define INSTR_RKX_K 2 +//INSTR_CAT_ECX +#define INSTR_ECX_LEN 4 +#define INSTR_ECX_E 1 +#define INSTR_ECX_C 2 +//INSTR_CAT_I1ITX +#define INSTR_I1ITX_LEN 8 +#define INSTR_I1ITX_I1 1 +#define INSTR_I1ITX_IT 4 +//INSTR_CAT_I1LX +#define INSTR_I1LX_LEN 8 +#define INSTR_I1LX_I1 1 +#define INSTR_I1LX_L 4 +//INSTR_CAT_SEGLX +#define INSTR_SEGLX_LEN 8 +#define INSTR_SEGLX_SEG 1 +#define INSTR_SEGLX_L 4 +//INSTR_CAT_I1LWPX +#define INSTR_I1LWPX_LEN 12 +#define INSTR_I1LWPX_I1 1 +#define INSTR_I1LWPX_L 4 +//INSTR_CAT_I1NX +#define INSTR_I1NX_LEN 4 +#define INSTR_I1NX_I1 1 +#define INSTR_I1NX_N 2 +//INSTR_CAT_I1HTX +#define INSTR_I1HTX_LEN 8 +#define INSTR_I1HTX_I1 1 +#define INSTR_I1HTX_HT 4 +//INSTR_CAT_I1BVTX +#define INSTR_I1BVTX_LEN 8 +#define INSTR_I1BVTX_I1 1 +#define INSTR_I1BVTX_BVT 4 +//INSTR_CAT_CWPX +#define INSTR_CWPX_LEN 8 +#define INSTR_CWPX_C 2 +//INSTR_CAT_I1WPX +#define INSTR_I1WPX_LEN 8 +#define INSTR_I1WPX_I1 1 +//INSTR_CAT_RRI1X +#define INSTR_RRI1X_LEN 4 +#define INSTR_RRI1X_R1 1 +#define INSTR_RRI1X_R2 2 +#define INSTR_RRI1X_I1 3 +//INSTR_CAT_RCLX +#define INSTR_RCLX_LEN 8 +#define INSTR_RCLX_R 1 +#define INSTR_RCLX_C 2 +#define INSTR_RCLX_L 4 +//INSTR_CAT_RCI1X +#define INSTR_RCI1X_LEN 8 +#define INSTR_RCI1X_R 1 +#define INSTR_RCI1X_C 2 +#define INSTR_RCI1X_I1 4 +//INSTR_CAT_SEGI1LX +#define INSTR_SEGI1LX_LEN 8 +#define INSTR_SEGI1LX_SEG 1 +#define INSTR_SEGI1LX_I1 2 +#define INSTR_SEGI1LX_L 4 +//INSTR_CAT_I1LLX +#define INSTR_I1LLX_LEN 12 +#define INSTR_I1LLX_I1 1 +#define INSTR_I1LLX_L1 4 +#define INSTR_I1LLX_L2 8 +//INSTR_CAT_NLLX +#define INSTR_NLLX_LEN 12 +#define INSTR_NLLX_N 1 +#define INSTR_NLLX_L1 4 +#define INSTR_NLLX_L2 8 +//INSTR_CAT_LLLLX +#define INSTR_LLLLX_LEN 20 +#define INSTR_LLLLX_L1 4 +#define INSTR_LLLLX_L2 8 +#define INSTR_LLLLX_L3 12 +#define INSTR_LLLLX_L4 16 +//INSTR_CAT_I1CWPX +#define INSTR_I1CWPX_LEN 8 +#define INSTR_I1CWPX_I1 1 +#define INSTR_I1CWPX_C 2 +//INSTR_CAT_I1I1WPX +#define INSTR_I1I1WPX_LEN 8 +#define INSTR_I1I1WPX_I11 1 +#define INSTR_I1I1WPX_I12 2 + +/****************************************************************************/ +/* OPERAND TYPES TABLE */ +/****************************************************************************/ + +//the operand types array in a given entry +INSTR_OperandType* INSTR_operandTypes(INSTR_InstrCategory index); + +/***************************************************************************/ +/* OPCODES OF INSTRUCTIONS */ +/***************************************************************************/ +// Instructions for term unification and creation +#define put_variable_t 0 +#define put_variable_p 1 +#define put_value_t 2 +#define put_value_p 3 +#define put_unsafe_value 4 +#define copy_value 5 +#define put_m_const 6 +#define put_p_const 7 +#define put_nil 8 +#define put_integer 9 +#define put_float 10 +#define put_string 11 +#define put_index 12 +#define put_app 13 +#define put_list 14 +#define put_lambda 15 +#define set_variable_t 16 +#define set_variable_te 17 +#define set_variable_p 18 +#define set_value_t 19 +#define set_value_p 20 +#define globalize_pt 21 +#define globalize_t 22 +#define set_m_const 23 +#define set_p_const 24 +#define set_nil 25 +#define set_integer 26 +#define set_float 27 +#define set_string 28 +#define set_index 29 +#define set_void 30 +#define deref 31 +#define set_lambda 32 +#define get_variable_t 33 +#define get_variable_p 34 +#define init_variable_t 35 +#define init_variable_p 36 +#define get_m_constant 37 +#define get_p_constant 38 +#define get_integer 39 +#define get_float 40 +#define get_string 41 +#define get_nil 42 +#define get_m_structure 43 +#define get_p_structure 44 +#define get_list 45 +#define unify_variable_t 46 +#define unify_variable_p 47 +#define unify_value_t 48 +#define unify_value_p 49 +#define unify_local_value_t 50 +#define unify_local_value_p 51 +#define unify_m_constant 52 +#define unify_p_constant 53 +#define unify_integer 54 +#define unify_float 55 +#define unify_string 56 +#define unify_nil 57 +#define unify_void 58 +// Instructions for type unification and creation +#define put_type_variable_t 59 +#define put_type_variable_p 60 +#define put_type_value_t 61 +#define put_type_value_p 62 +#define put_type_unsafe_value 63 +#define put_type_const 64 +#define put_type_structure 65 +#define put_type_arrow 66 +#define set_type_variable_t 67 +#define set_type_variable_p 68 +#define set_type_value_t 69 +#define set_type_value_p 70 +#define set_type_local_value_t 71 +#define set_type_local_value_p 72 +#define set_type_constant 73 +#define get_type_variable_t 74 +#define get_type_variable_p 75 +#define init_type_variable_t 76 +#define init_type_variable_p 77 +#define get_type_value_t 78 +#define get_type_value_p 79 +#define get_type_constant 80 +#define get_type_structure 81 +#define get_type_arrow 82 +#define unify_type_variable_t 83 +#define unify_type_variable_p 84 +#define unify_type_value_t 85 +#define unify_type_value_p 86 +#define unify_envty_value_t 87 +#define unify_envty_value_p 88 +#define unify_type_local_value_t 89 +#define unify_type_local_value_p 90 +#define unify_envty_local_value_t 91 +#define unify_envty_local_value_p 92 +#define unify_type_constant 93 +// Instructions for handling higher-order aspects +#define pattern_unify_t 94 +#define pattern_unify_p 95 +#define finish_unify 96 +#define head_normalize_t 97 +#define head_normalize_p 98 +// Instructions for handling logical aspects +#define incr_universe 99 +#define decr_universe 100 +#define set_univ_tag 101 +#define tag_exists_t 102 +#define tag_exists_p 103 +#define tag_variable 104 +#define push_impl_point 105 +#define pop_impl_point 106 +#define add_imports 107 +#define remove_imports 108 +#define push_import 109 +#define pop_imports 110 +// Control Instructions +#define allocate 111 +#define deallocate 112 +#define call 113 +#define call_name 114 +#define execute 115 +#define execute_name 116 +#define proceed 117 +// Choice Instructions +#define try_me_else 118 +#define retry_me_else 119 +#define trust_me 120 +#define try 121 +#define retry 122 +#define trust 123 +#define trust_ext 124 +#define try_else 125 +#define retry_else 126 +#define branch 127 +// Indexing Instructions +#define switch_on_term 128 +#define switch_on_constant 129 +#define switch_on_bvar 130 +#define switch_on_reg 131 +// Cut Instructions +#define neck_cut 132 +#define get_level 133 +#define put_level 134 +#define cut 135 +// Miscellaneous Instructions +#define call_builtin 136 +#define builtin 137 +#define stop 138 +#define halt 139 +#define fail 140 +// new added +#define create_type_variable 141 +// resolved by the linker +#define execute_link_only 142 +#define call_link_only 143 +#define put_variable_te 144 + + +#define INSTR_NUM_INSTRS 145 + +/***************************************************************************/ +/* INSTRUCTION INFORMATION TABLE */ +/***************************************************************************/ +INSTR_InstrCategory INSTR_instrType(int index); //instr type in a given entry +char* INSTR_instrName(int index); //instr name in a given entry +int INSTR_instrSize(int index); //instr size in a given entry + +#endif //INSTRUCTIONS_H + |
