/* bytecodes.h -- Constant definitions of lispmach byte-codes
Copyright (C) 1993, 1994 John Harper <john@dcs.warwick.ac.uk>
$Id: bytecodes.h,v 1.40 2000/08/27 17:57:22 john Exp $
This file is part of Jade.
Jade is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
Jade 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Jade; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifndef BYTECODES_H
#define BYTECODES_H
#define BYTECODE_MAJOR_VERSION 11
#define BYTECODE_MINOR_VERSION 0
/* Number of bits encoded in each extra opcode forming the argument. */
#define ARG_SHIFT 8
/* The bits in the opcode used to encode the argument. */
#define OP_ARG_MASK 0x07
/* The inverse of the above. */
#define OP_OP_MASK 0xf8
/* Special arg specifying that the next opcode is actually an 8-bit
argument. */
#define OP_ARG_1BYTE 6
/* Special arg meaning following two opcodes are a 16-bit argument. The
first opcode is the high bits, the second the low bits. */
#define OP_ARG_2BYTE 7
/* Opcodes which have an argument encoded in them */
#define OP_SLOT_REF 0x00
#define OP_SLOT_REF_0 0x00
#define OP_SLOT_REF_1 0x01
#define OP_SLOT_REF_2 0x02
#define OP_SLOT_REF_3 0x03
#define OP_SLOT_REF_4 0x04
#define OP_SLOT_REF_5 0x05
#define OP_SLOT_REF_6 0x06
#define OP_SLOT_REF_7 0x07
/* Call function on top of stack with following ARG parameters. Leave
result on stack. */
#define OP_CALL 0x08
/* Push const[ARG] onto the stack. */
#define OP_PUSH 0x10
/* Push the value of the symbol const[ARG] onto the stack. */
#define OP_REFG 0x18
/* Set the value of symbol const[ARG] to the value on the
stack. Pops the value off the stack. */
#define OP_SETG 0x20
/* Sets the ARG'th value in the lexical environment. Pops value */
#define OP_SETN 0x28
#define OP_SLOT_SET 0x30
#define OP_SLOT_SET_0 0x30
#define OP_SLOT_SET_1 0x31
#define OP_SLOT_SET_2 0x32
#define OP_SLOT_SET_3 0x33
#define OP_SLOT_SET_4 0x34
#define OP_SLOT_SET_5 0x35
#define OP_SLOT_SET_6 0x36
#define OP_SLOT_SET_7 0x37
/* Pushes the ARG'th value in the lexical environment */
#define OP_REFN 0x38
#define OP_REFN_0 0x38
#define OP_REFN_1 0x39
#define OP_REFN_2 0x3a
#define OP_REFN_3 0x3b
#define OP_REFN_4 0x3c
#define OP_REFN_5 0x3d
#define OP_REFN_6 0x3e
#define OP_REFN_7 0x3f
#define OP_LAST_WITH_ARGS 0x3f
/* Opcodes without arguments. */
#define OP_REF 0x40 /* push (symbol-value pop) */
#define OP__SET 0x41 /* (set stk[1] stk[0]); pop; pop */
#define OP_FLUID_REF 0x42 /* call-1 fluid-ref */
#define OP_ENCLOSE 0x43 /* push (make-closure pop[1] nil) */
#define OP_INIT_BIND 0x44 /* new-binding-set */
#define OP_UNBIND 0x45 /* rewind-binding-set */
#define OP_DUP 0x46 /* push stk[0] */
#define OP_SWAP 0x47 /* stk[0] = stk[1], stk[1] = stk[0] */
#define OP_POP 0x48 /* pop[1] */
#define OP_NIL 0x49 /* push nil */
#define OP_T 0x4a /* push t */
#define OP_CONS 0x4b /* push (cons pop[1] pop[2]) */
#define OP_CAR 0x4c /* push (car pop[1]) */
#define OP_CDR 0x4d /* push (cdr pop[2]) */
#define OP_RPLACA 0x4e /* call-2 rplaca */
#define OP_RPLACD 0x4f /* call-2 rplacd */
#define OP_NTH 0x50 /* call-2 nth */
#define OP_NTHCDR 0x51 /* call-2 nthcdr */
#define OP_ASET 0x52 /* call-3 aset */
#define OP_AREF 0x53 /* call-2 aref */
#define OP_LENGTH 0x54 /* call-1 length */
#define OP_BIND 0x55
#define OP_ADD 0x56 /* push (+ pop[1] pop[2]) */
#define OP_NEG 0x57 /* push (- pop[1]) */
#define OP_SUB 0x58 /* push (- pop[1] pop[2]) */
#define OP_MUL 0x59 /* push (* pop[1] pop[2]) */
#define OP_DIV 0x5a /* push (/ pop[1] pop[2]) */
#define OP_REM 0x5b /* push (% pop[1] pop[2]) */
#define OP_LNOT 0x5c /* push (lognot pop[1]) */
#define OP_NOT 0x5d /* push (not pop[1]) */
#define OP_LOR 0x5e /* push (logior pop[1] pop[2]) */
#define OP_LAND 0x5f /* push (logand pop[1] pop[2]) */
#define OP_EQUAL 0x60 /* push (equal pop[1] pop[2]) */
#define OP_EQ 0x61 /* push (eq pop[1] pop[2]) */
#define OP_STRUCT_REF 0x62 /* push (structure-ref pop[1] pop[2])*/
#define OP_SCM_TEST 0x63
#define OP_GT 0x64 /* push (> pop[1] pop[2]) */
#define OP_GE 0x65 /* push (>= pop[1] pop[2]) */
#define OP_LT 0x66 /* push (< pop[1] pop[2]) */
#define OP_LE 0x67 /* push (<= pop[1] pop[2]) */
#define OP_INC 0x68 /* push (1+ pop[1]) */
#define OP_DEC 0x69 /* push (1- pop[1]) */
#define OP_ASH 0x6a /* push (ash pop[1] pop[2]) */
#define OP_ZEROP 0x6b /* push (zerop pop[1]) */
#define OP_NULL 0x6c /* push (null pop[1]) */
#define OP_ATOM 0x6d /* push (atom pop[1]) */
#define OP_CONSP 0x6e /* push (consp pop[1]) */
#define OP_LISTP 0x6f /* push (listp pop[1]) */
#define OP_NUMBERP 0x70 /* push (numberp pop[1]) */
#define OP_STRINGP 0x71 /* push (stringp pop[1]) */
#define OP_VECTORP 0x72 /* push (vectorp pop[1]) */
#define OP_CATCH 0x73 /* if stk[0] == (car stk[1])
then stk[0] := nil,
stk[1] = (cdr stk[1]) */
#define OP_THROW 0x74 /* throw_val = (cons pop[1] pop[2]),
goto error-handler */
#define OP_BINDERR 0x75 /* bind (cons pop[1] SP) */
#define OP_RETURN 0x76
#define OP_UNBINDALL 0x77
#define OP_BOUNDP 0x78 /* call-1 boundp */
#define OP_SYMBOLP 0x79 /* push (symbolp pop[1]) */
#define OP_GET 0x7a /* call-2 get */
#define OP_PUT 0x7b /* call-3 put */
#define OP_ERRORPRO 0x7c /* cond = pop[1];
if match_error(stk[0], cond)
then bindsym (stk[1], cdr stk[0]),
stk[0] = nil */
#define OP_SIGNAL 0x7d /* call-2 signal */
#define OP_QUOTIENT 0x7e
#define OP_REVERSE 0x7f /* call-1 reverse */
#define OP_NREVERSE 0x80 /* call-1 nreverse */
#define OP_ASSOC 0x81 /* call-2 assoc */
#define OP_ASSQ 0x82 /* call-2 assq */
#define OP_RASSOC 0x83 /* call-2 rassoc */
#define OP_RASSQ 0x84 /* call-2 rassq */
#define OP_LAST 0x85 /* call-1 last */
#define OP_MAPCAR 0x86 /* call-2 mapcar */
#define OP_MAPC 0x87 /* call-1 mapc */
#define OP_MEMBER 0x88 /* call-2 member */
#define OP_MEMQ 0x89 /* call-2 memq */
#define OP_DELETE 0x8a /* call-2 delete */
#define OP_DELQ 0x8b /* call-2 delq */
#define OP_DELETE_IF 0x8c /* call-2 delete-if */
#define OP_DELETE_IF_NOT 0x8d /* call-2 delete-if-not */
#define OP_COPY_SEQUENCE 0x8e /* call-1 copy-sequence */
#define OP_SEQUENCEP 0x8f /* call-1 sequencep */
#define OP_FUNCTIONP 0x90 /* call-1 functionp */
#define OP_SPECIAL_FORM_P 0x91 /* call-1 special-form-p */
#define OP_SUBRP 0x92 /* call-1 subrp */
#define OP_EQL 0x93 /* push (eql pop[1] pop[2]) */
#define OP_LXOR 0x94 /* push (logxor pop[1] pop[2] */
#define OP_MAX 0x95 /* push (max pop[1] pop[2]) */
#define OP_MIN 0x96 /* push (min pop[1] pop[2]) */
#define OP_FILTER 0x97 /* call-2 filter */
#define OP_MACROP 0x98 /* call-1 macrop */
#define OP_BYTECODEP 0x99 /* call-1 bytecodep */
#define OP_PUSHI0 0x9a /* push #0 */
#define OP_PUSHI1 0x9b /* push #1 */
#define OP_PUSHI2 0x9c /* push #2 */
#define OP_PUSHIM1 0x9d /* push #-1 */
#define OP_PUSHIM2 0x9e /* push #-2 */
#define OP_PUSHI 0x9f /* push (signed) pc[0] */
#define OP_PUSHIWN 0xa0 /* push (- pc[0,1]) */
#define OP_PUSHIWP 0xa1 /* push (+ pc[0,1]) */
#define OP_CAAR 0xa2 /* push (car (car pop[1])) */
#define OP_CADR 0xa3 /* push (car (cdr pop[1])) */
#define OP_CDAR 0xa4 /* push (cdr (car pop[1])) */
#define OP_CDDR 0xa5 /* push (cdr (cdr pop[1])) */
#define OP_CADDR 0xa6
#define OP_CADDDR 0xa7
#define OP_CADDDDR 0xa8
#define OP_CADDDDDR 0xa9
#define OP_CADDDDDDR 0xaa
#define OP_CADDDDDDDR 0xab
#define OP_FLOOR 0xac
#define OP_CEILING 0xad
#define OP_TRUNCATE 0xae
#define OP_ROUND 0xaf
#define OP_APPLY 0xb0
#define OP_FORBID 0xb1
#define OP_PERMIT 0xb2
#define OP_EXP 0xb3
#define OP_LOG 0xb4
#define OP_SIN 0xb5
#define OP_COS 0xb6
#define OP_TAN 0xb7
#define OP_SQRT 0xb8
#define OP_EXPT 0xb9
#define OP_SWAP2 0xba /* stk[0] = stk[1], stk[1] = stk[2],
stk[2] = stk[0]. */
#define OP_MOD 0xbb /* push (mod pop[1] pop[2]) */
#define OP_MAKE_CLOSURE 0xbc /* push (make-closure pop[1] pop[2]) */
#define OP_UNBINDALL_0 0xbd
#define OP_CLOSUREP 0xbe /* push (closurep pop[1]) */
#define OP_POP_ALL 0xbf
#define OP_FLUID_SET 0xc0
#define OP_FLUID_BIND 0xc1
#define OP_MEMQL 0xc2 /* call-2 memql */
#define OP_NUM_EQ 0xc3
#define OP_TEST_SCM 0xc4
#define OP_TEST_SCM_F 0xc5
#define OP__DEFINE 0xc6
#define OP_SPEC_BIND 0xc7
#define OP_SET 0xc8
#define OP_REQUIRED_ARG 0xc9
#define OP_OPTIONAL_ARG 0xca
#define OP_REST_ARG 0xcb
#define OP_NOT_ZERO_P 0xcc
#define OP_KEYWORD_ARG 0xcd
#define OP_OPTIONAL_ARG_ 0xce
#define OP_KEYWORD_ARG_ 0xcf
/* Jump opcodes */
#define OP_LAST_BEFORE_JMPS 0xf7
#define OP_EJMP 0xf8 /* if (not pop[1]) jmp pc[0,1]
else throw_val = arg,
goto error-handler */
#define OP_JPN 0xf9 /* if (not stk[0]) pop; jmp pc[0,1] */
#define OP_JPT 0xfa /* if stk[0] pop; jmp pc[0,1] */
#define OP_JMP 0xfb /* jmp pc[0,1] */
#define OP_JN 0xfc /* if (not pop[1]) jmp pc[0,1] */
#define OP_JT 0xfd /* if pop[1] jmp pc[0,1] */
#define OP_JNP 0xfe /* if (not stk[0]) jmp else pop */
#define OP_JTP 0xff /* if stk[0] jmp else pop */
#endif /* BYTECODES_H */
syntax highlighted by Code2HTML, v. 0.9.1