/*
 * opcodes - opcode execution module definition
 *
 * Copyright (C) 1999-2007,2014,2021  David I. Bell
 *
 * Calc is open software; you can redistribute it and/or modify it under
 * the terms of the version 2.1 of the GNU Lesser General Public License
 * as published by the Free Software Foundation.
 *
 * Calc 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 Lesser General
 * Public License for more details.
 *
 * A copy of version 2.1 of the GNU Lesser General Public License is
 * distributed with calc under the filename COPYING-LGPL.  You should have
 * received a copy with calc; if not, write to Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 * Under source code control:	1990/02/15 01:48:35
 * File existed as early as:	before 1990
 *
 * Share and enjoy!  :-)	http://www.isthe.com/chongo/tech/comp/calc/
 */


#if !defined(INCLUDE_OPCODES_H)
#define INCLUDE_OPCODES_H


#if defined(CALC_SRC)	/* if we are building from the calc source tree */
# include "calc/decl.h"
#else
# include <calc/decl.h>
#endif


/*
 * Opcodes
 */
#define OP_NOP		0L	/* no operation */
#define OP_LOCALADDR	1L	/* load address of local variable */
#define OP_GLOBALADDR	2L	/* load address of global variable */
#define OP_PARAMADDR	3L	/* load address of parameter variable */
#define OP_LOCALVALUE	4L	/* load value of local variable */
#define OP_GLOBALVALUE	5L	/* load value of global variable */
#define OP_PARAMVALUE	6L	/* load value of parameter variable */
#define OP_NUMBER	7L	/* load constant real numeric value */
#define OP_INDEXADDR	8L	/* load array index address */
#define OP_PRINTRESULT	9L	/* print result of top-level expression */
#define OP_ASSIGN	10L	/* assign value to variable */
#define OP_ADD		11L	/* add top two values */
#define OP_SUB		12L	/* subtract top two values */
#define OP_MUL		13L	/* multiply top two values */
#define OP_DIV		14L	/* divide top two values */
#define OP_MOD		15L	/* take mod of top two values */
#define OP_SAVE		16L	/* save value for later use */
#define OP_NEGATE	17L	/* negate top value */
#define OP_INVERT	18L	/* invert top value */
#define OP_INT		19L	/* take integer part of top value */
#define OP_FRAC		20L	/* take fraction part of top value */
#define OP_NUMERATOR	21L	/* take numerator of top value */
#define OP_DENOMINATOR	22L	/* take denominator of top value */
#define OP_DUPLICATE	23L	/* duplicate top value on stack */
#define OP_POP		24L	/* pop top value from stack */
#define OP_RETURN	25L	/* return value of function */
#define OP_JUMPZ	26L	/* jump if top value is zero */
#define OP_JUMPNZ	27L	/* jump if top value is nonzero */
#define OP_JUMP		28L	/* jump unconditionally */
#define OP_USERCALL	29L	/* call a user-defined function */
#define OP_GETVALUE	30L	/* convert address to value */
#define OP_EQ		31L	/* test top two elements for equality */
#define OP_NE		32L	/* test top two elements for inequality */
#define OP_LE		33L	/* test top two elements for <= */
#define OP_GE		34L	/* test top two elements for >= */
#define OP_LT		35L	/* test top two elements for < */
#define OP_GT		36L	/* test top two elements for > */
#define OP_PREINC	37L	/* add one to variable (++x) */
#define OP_PREDEC	38L	/* subtract one from variable (--x) */
#define OP_POSTINC	39L	/* add one to variable (x++) */
#define OP_POSTDEC	40L	/* subtract one from variable (x--) */
#define OP_DEBUG	41L	/* debugging point */
#define OP_PRINT	42L	/* print value */
#define OP_ASSIGNPOP	43L	/* assign to variable and remove it */
#define OP_ZERO		44L	/* put zero on the stack */
#define OP_ONE		45L	/* put one on the stack */
#define OP_PRINTEOL	46L	/* print end of line */
#define OP_PRINTSPACE	47L	/* print a space */
#define OP_PRINTSTRING	48L	/* print constant string */
#define OP_DUPVALUE	49L	/* duplicate value of top value */
#define OP_OLDVALUE	50L	/* old calculation value */
#define OP_QUO		51L	/* integer quotient of top two values */
#define OP_POWER	52L	/* number raised to a power */
#define OP_QUIT		53L	/* quit program */
#define OP_CALL		54L	/* call built-in routine */
#define OP_GETEPSILON	55L	/* get allowed error for calculations */
#define OP_AND		56L	/* arithmetic and */
#define OP_OR		57L	/* arithmetic or */
#define OP_NOT		58L	/* logical not */
#define OP_ABS		59L	/* absolute value */
#define OP_SGN		60L	/* sign of number */
#define OP_ISINT	61L	/* whether top value is integer */
#define OP_CONDORJUMP	62L	/* conditional or jump */
#define OP_CONDANDJUMP	63L	/* conditional and jump */
#define OP_SQUARE	64L	/* square top value */
#define OP_STRING	65L	/* load constant string value */
#define OP_ISNUM	66L	/* whether top value is a number */
#define OP_UNDEF	67L	/* load undefined value on stack */
#define OP_ISNULL	68L	/* whether variable is the null value */
#define OP_ARGVALUE	69L	/* load value of argument (parameter) n */
#define OP_MATCREATE	70L	/* create matrix */
#define OP_ISMAT	71L	/* whether variable is a matrix */
#define OP_ISSTR	72L	/* whether variable is a string */
#define OP_GETCONFIG	73L	/* get value of configuration parameter */
#define OP_LEFTSHIFT	74L	/* left shift of integer */
#define OP_RIGHTSHIFT	75L	/* right shift of integer */
#define OP_CASEJUMP	76L	/* test case and jump if not matched */
#define OP_ISODD	77L	/* whether value is an odd integer */
#define OP_ISEVEN	78L	/* whether value is even integer */
#define OP_FIADDR	79L	/* 'fast index' matrix value address */
#define OP_FIVALUE	80L	/* 'fast index' matrix value */
#define OP_ISREAL	81L	/* test value for real number */
#define OP_IMAGINARY	82L	/* load imaginary numeric constant */
#define OP_RE		83L	/* real part of complex number */
#define OP_IM		84L	/* imaginary part of complex number */
#define OP_CONJUGATE	85L	/* complex conjugate of complex number */
#define OP_OBJCREATE	86L	/* create object */
#define OP_ISOBJ	87L	/* whether value is an object */
#define OP_NORM		88L	/* norm of value (square of abs) */
#define OP_ELEMADDR	89L	/* address of element of object */
#define OP_ELEMVALUE	90L	/* value of element of object */
#define OP_ISTYPE	91L	/* whether two values are the same type */
#define OP_SCALE	92L	/* scale value by a power of two */
#define OP_ISLIST	93L	/* whether value is a list */
#define OP_SWAP		94L	/* swap values of two variables */
#define OP_ISSIMPLE	95L	/* whether value is a simple type */
#define OP_CMP		96L	/* compare values returning -1, 0, or 1 */
#define OP_SETCONFIG	97L	/* set configuration parameter */
#define OP_SETEPSILON	98L	/* set allowed error for calculations */
#define OP_ISFILE	99L	/* whether value is a file */
#define OP_ISASSOC	100L	/* whether value is an association */
#define OP_INITSTATIC	101L	/* once only code for static initialization */
#define OP_ELEMINIT	102L	/* assign element of matrix or object */
#define OP_ISCONFIG	103L	/* whether value is a configuration state */
#define OP_ISHASH	104L	/* whether value is a hash state */
#define OP_ISRAND	105L	/* whether value is subtractive 100 state */
#define OP_ISRANDOM	106L	/* whether value is a Blum random state */
#define OP_SHOW		107L	/* show data about current state */
#define OP_INITFILL	108L	/* fill new matrix with copies of a value */
#define OP_ASSIGNBACK	109L	/* assign in reverse order */
#define OP_TEST		110L	/* test whether value is "nonzero" */
#define OP_ISDEFINED	111L	/* whether string names a function */
#define OP_ISOBJTYPE	112L	/* whether string names an object type */
#define OP_ISBLK	113L	/* whether value is a block */
#define OP_PTR		114L	/* octet pointer */
#define OP_DEREF	115L	/* dereference an octet pointer */
#define OP_ISOCTET	116L	/* whether value is an octet */
#define OP_ISPTR	117L	/* whether value is a pointer */
#define OP_SAVEVAL	118L	/* activate updating */
#define OP_LINKS	119L	/* return links for numbers and strings */
#define OP_BIT		120L	/* whether specified bit is set */
#define OP_COMP		121L	/* complement value */
#define OP_XOR		122L	/* xor (~) of values */
#define OP_HIGHBIT	123L	/* index of high bit of value */
#define OP_LOWBIT	124L	/* index of low bit of value */
#define OP_CONTENT	125L	/* value returned by unary # */
#define OP_HASHOP	126L	/* binary # */
#define OP_BACKSLASH	127L	/* unary backslash */
#define OP_SETMINUS	128L	/* binary backslash */
#define OP_PLUS		129L	/* unary + */
#define OP_JUMPNN	130L	/* jump if top value is non-null */
#define OP_ABORT	131L	/* abort operation */
#define MAX_OPCODE	131L	/* highest legal opcode */


/*
 * external declarations
 */
EXTERN char *funcname;		/* function being executed */
EXTERN long funcline;		/* function line being executed */


#endif /* !INCLUDE_OPCODES_H */
