1
0
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:
kr.angelov
2012-07-31 15:16:04 +00:00
parent 8da1bbd17d
commit 2844742afd
76 changed files with 23808 additions and 3 deletions

View 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