/* File: inst_xsb.h
** Author(s): Warren, Swift, Xu, Sagonas, Freire, Johnson, Rao
** Contact: xsb-contact@cs.sunysb.edu
**
** Copyright (C) The Research Foundation of SUNY, 1986, 1993-1998
** Copyright (C) ECRC, Germany, 1990
**
** XSB is free software; you can redistribute it and/or modify it under the
** terms of the GNU Library General Public License as published by the Free
** Software Foundation; either version 2 of the License, or (at your option)
** any later version.
**
** XSB 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 Library General Public License for
** more details.
**
** You should have received a copy of the GNU Library General Public License
** along with XSB; if not, write to the Free Software Foundation,
** Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: inst_xsb.h,v 1.12 2002/10/28 15:29:48 lfcastro Exp $
**
*/
#ifndef __XSB_INSTS__
#define __XSB_INSTS__
extern void init_inst_table(void);
/************************************************************************/
/* The following are operand types of instructions. */
/************************************************************************/
#define A 1 /* a byte of integer (for arity, size, builtin-num, etc) */
#define V 2 /* variable offset */
#define R 3 /* register number */
#define S 4 /* structure symbol */
#define C 5 /* constant symbol */
#define L 6 /* label (address) */
#define G 7 /* string */
#define N 8 /* number (integer) */
#define I 9 /* 2nd & 3rd arguments of switchonbound */
#define P 10 /* pad */
#define X 11 /* not present */
#define PP 12 /* double pad */
#define PPP 13 /* triple pad */
#define PPR 14 /* = PP + R; for switchonterm and switchonbound */
#define T 15 /* tabletry */
#define RRR 16 /* = R + R + R; for switchon3bound */
#define F 17 /* floating point number */
#define B 18 /* tagged (boxed) integer number */
/************************************************************************/
/* Macros to fetch the instructions/operands. */
/************************************************************************/
#define inst_name(C) ((char *)inst_table[C][0])
#define cell_opcode(C) (*(pb)(C))
#define cell_opregaddr1(C) (rreg+((pb)(cell))[1])
#define cell_opregaddr2(C) (rreg+((pb)(cell))[2])
#define cell_opregaddr3(C) (rreg+((pb)(cell))[3])
#define cell_opregaddrn(C,N) (rreg+((pb)(cell))[N])
#define cell_opreg1(C) (cell(opregaddr1(C)))
#define cell_opreg2(C) (cell(opregaddr2(C)))
#define cell_opreg3(C) (cell(opregaddr3(C)))
#define cell_opregn(C) (cell(opregaddrn(C,N)))
#define cell_operand1(C) (((pb)(C))[1])
#define cell_operand2(C) (((pb)(C))[2])
#define cell_operand3(C) (((pb)(C))[3])
#define cell_operandn(C,N) (((pb)(C))[N])
/* Unused right now, but may come handy in future. */
/*
#define get_code_cell(pc) (*(pc)++)
*/
/* bit fields */
/*
#define get_last__8bits(cell) (((Cell)(cell))&0xff)
#define get_last_16bits(cell) (((Cell)(cell))&0xffff)
#define get_last_32bits(cell) (((Cell)(cell))&0xffffffff)
#define get_first__8bits(cell) (((Cell)(cell))>>(sizeof(Cell)*8-8))
#define get_first_16bits(cell) (((Cell)(cell))>>(sizeof(Cell)*8-16))
#define get_first_32bits(cell) (((Cell)(cell))>>(sizeof(Cell)*8-32))
#define get__8bit_field(cell, pos) \
(((Cell)(cell))>>((sizeof(Cell)-pos-1)*8)&0xff)
#define get_16bit_field(cell, pos) \
(((Cell)(cell))>>((sizeof(Cell)-pos-1)*16)&0xffff)
#define get_32bit_field(cell, pos) \
(((Cell)(cell))>>((sizeof(Cell)-pos-1)*32)&0xffffffff)
*/
/* opcode & operand fields */
/*
#ifdef BITS64
#define opquarter0(cell) (get_first_16bits(cell))
#define opquarter1(cell) (get_16bit_field(cell,1))
#define opquarter2(cell) (get_16bit_field(cell,2))
#define opquarter3(cell) (get_last_16bits(cell))
#define opquartern(cell,N) (get_16bit_field(cell,N))
#else
#define opquarter0(cell) (get_first__8bits(cell))
#define opquarter1(cell) (get__8bit_field(cell,1))
#define opquarter2(cell) (get__8bit_field(cell,2))
#define opquarter3(cell) (get_last__8bits(cell))
#define opquartern(cell,N) (get__8bit_field(cell,N))
#endif
#define opcell(cell) ((Cell)(cell))
#define opint(cell) ((Integer)(cell))
#define opcode(cell) ((short)opquarter0(cell))
#define opregaddr1(cell) (rreg+opquarter1(cell))
#define opregaddr2(cell) (rreg+opquarter2(cell))
#define opregaddr3(cell) (rreg+opquarter3(cell))
#define opregaddrn(cell,N) (rreg+opquartern(cell,N))
#define opreg1(cell) (cell(opregaddr1(cell)))
#define opreg2(cell) (cell(opregaddr2(cell)))
#define opreg3(cell) (cell(opregaddr3(cell)))
#define opregn(cell) (cell(opregaddrn(cell,N)))
#define operand1(cell) ((short)opquarter1(cell))
#define operand2(cell) ((short)opquarter2(cell))
#define operand3(cell) ((short)opquarter3(cell))
#define operandn(cell,N) ((short)opquartern(cell,N))
*/
/*
#define opvaraddr(cell) (ereg+(-(Cell)(cell)))
*/
/* 64 bit could benefit from change in compiler/loader for the V operands */
/*
#define opvaraddr1(cell) (ereg+(-(unsigned int)(opquarter1(cell))))
#define opvaraddr2(cell) (ereg+(-(unsigned int)(opquarter2(cell))))
#define opvaraddr3(cell) (ereg+(-(unsigned int)(opquarter3(cell))))
#define opvaraddrn(cell,N) (ereg+(-(unsigned int)(opquartern(cell,n))))
#define opvar1(cell) (cell(opvaraddr1(cell)))
#define opvar2(cell) (cell(opvaraddr2(cell)))
#define opvar3(cell) (cell(opvaraddr3(cell)))
#define opvarn(cell,N) (cell(opvaraddrn(cell,N)))
*/
#define BUILTIN_TBL_SZ 256
#ifdef PROFILE
extern Cell inst_table[BUILTIN_TBL_SZ][6];
extern unsigned long num_switch_envs;
extern unsigned long num_switch_envs_iter;
#else
extern Cell inst_table[BUILTIN_TBL_SZ][5];
#endif
/************************************************************************/
/* The following is the set of all instructions. */
/************************************************************************/
/* Basic term instructions */
#define getpvar 0x00
#define getpval 0x01
#define getstrv 0x02
#define gettval 0x03
#define getcon 0x04
#define getnil 0x05
#define getstr 0x06
#define getlist 0x07
#define unipvar 0x08
#define unipval 0x09
#define unitvar 0x0a
#define unitval 0x0b
#define unicon 0x0c
#define uninil 0x0d
#define getnumcon 0x0e
#define putnumcon 0x0f
#define putpvar 0x10
#define putpval 0x11
#define puttvar 0x12
#define putstrv 0x13
#define putcon 0x14
#define putnil 0x15
#define putstr 0x16
#define putlist 0x17
#define bldpvar 0x18
#define bldpval 0x19
#define bldtvar 0x1a
#define bldtval 0x1b
#define bldcon 0x1c
#define bldnil 0x1d
#define uninumcon 0x1e
#define bldnumcon 0x1f
#define no_inst 0x20
/* the above number is used for invalid opcodes in the threading engine */
#define getattv 0x30
#define putattv 0x31
#define getlist_tvar_tvar 0x48
/*----- Instructions for tries as code (Do NOT change the numbers) -----*/
#define trie_no_cp_attv 0x5c
#define trie_trust_attv 0x5d
#define trie_try_attv 0x5e
#define trie_retry_attv 0x5f
#define trie_no_cp_str 0x60
#define trie_trust_str 0x61
#define trie_try_str 0x62
#define trie_retry_str 0x63
#define trie_no_cp_list 0x64
#define trie_trust_list 0x65
#define trie_try_list 0x66
#define trie_retry_list 0x67
#define trie_no_cp_var 0x68
#define trie_trust_var 0x69
#define trie_try_var 0x6a
#define trie_retry_var 0x6b
#define trie_no_cp_val 0x6c
#define trie_trust_val 0x6d
#define trie_try_val 0x6e
#define trie_retry_val 0x6f
#define trie_no_cp_numcon 0x70
#define trie_trust_numcon 0x71
#define trie_try_numcon 0x72
#define trie_retry_numcon 0x73
#define trie_no_cp_numcon_succ 0x74
#define trie_trust_numcon_succ 0x75
#define trie_try_numcon_succ 0x76
#define trie_retry_numcon_succ 0x77
#define trie_proceed 0x78
#define hash_opcode 0x79
#define hash_handle 0x7a
#define trie_assert_inst 0x7c
#define trie_root 0x7d
/* to reclaim deleted returns at completion */
#define trie_no_cp_fail 0x90
#define trie_trust_fail 0x91
#define trie_try_fail 0x92
#define trie_retry_fail 0x93
/*----------------------------------------------------------------------*/
#define getfloat 0x80
#define putfloat 0x81
#define unifloat 0x82
#define bldfloat 0x83
/* Non-determinism instructions */
#define trymeelse 0xa0
#define retrymeelse 0xa1
#define trustmeelsefail 0xa2
#define try 0xa3
#define retry 0xa4
#define trust 0xa5
#define getpbreg 0xa6
#define gettbreg 0xa7
#define putpbreg 0xa8
#define puttbreg 0xa9
#define jumptbreg 0xaa
#define getVn 0xab /* for tabled predicates */
#define test_heap 0xac /* for heap overflow testing */
/* Indexing instructions */
#define switchonterm 0xb0
#define switchonbound 0xb3
#define switchon3bound 0xb4
/* Instructions to compile body ors */
#define trymeorelse 0xb7
#define retrymeorelse 0xb8
#define trustmeorelsefail 0xb9
#define dyntrustmeelsefail 0xba /* Dynamic trust instruction */
/* Tabling instructions --- they should really be changed to be as shown */
#define tabletrysingle 0xc0
#define tabletry 0xc1
#define tableretry 0xc2
#define tabletrust 0xc3
#define check_complete 0xc4
#define answer_return 0xc5
#define resume_compl_suspension 0xc6
#define check_interrupt 0xce
#define new_answer_dealloc 0xcf
/* Term comparison inst */
#define term_comp 0xd0
/* Numeric instructions */
#define movreg 0xd1
#define negate 0xd2
#define and 0xd3
#define or 0xd4
#define logshiftl 0xd5
#define logshiftr 0xd6
#define addreg 0xd7
#define subreg 0xd8
#define mulreg 0xd9
#define divreg 0xda
#define idivreg 0xdb
#define int_test_z 0xdc
#define int_test_nz 0xdd
/* Unsafe term instructions */
#define putdval 0xe0
#define putuval 0xe1
/* Procedure instructions */
#define call_forn 0xe5
#define load_pred 0xe6
#define allocate_gc 0xe7
#define call 0xe8
#define allocate 0xe9
#define deallocate 0xea
#define proceed 0xeb
#define execute 0xec
#define calld 0xef
/* Branching instructions */
#define jump 0xf0
#define jumpz 0xf1
#define jumpnz 0xf2
#define jumplt 0xf3
#define jumple 0xf4
#define jumpgt 0xf5
#define jumpge 0xf6
/* Miscellaneous instructions */
#define cases 0xf7
#define fail 0xf8
#define noop 0xf9
#define halt 0xfa
#define builtin 0xfb
#define unifunc 0xfc
#define endfile 0xff
/* virtual instruction, used for disassembler to link different segs */
#endif
syntax highlighted by Code2HTML, v. 0.9.1