summaryrefslogtreecommitdiff
path: root/src/runtime/c/teyjus/tables/instructions.h
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2012-07-31 15:16:04 +0000
committerkr.angelov <kr.angelov@gmail.com>2012-07-31 15:16:04 +0000
commit83b321d862472f31c0c9f7feca8360ad5bfe8a75 (patch)
tree0f0ef20ad78e25b320013c7bb160211a8612d4e9 /src/runtime/c/teyjus/tables/instructions.h
parent314662dd09d5d1480007faa79258b0e93cc2aa59 (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.h480
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
+