forked from GitHub/gf-core
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.
This commit is contained in:
480
src/runtime/c/teyjus/tables/instructions.h
Normal file
480
src/runtime/c/teyjus/tables/instructions.h
Normal file
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user