267 lines
10 KiB
C++
267 lines
10 KiB
C++
// vim: set sts=2 ts=8 sw=2 tw=99 et:
|
|
// =============================================================================
|
|
// SourcePawn
|
|
// Copyright (C) 2004-2014 AlliedModders LLC. All rights reserved.
|
|
// =============================================================================
|
|
//
|
|
// This program is free software; you can redistribute it and/or modify it under
|
|
// the terms of the GNU General Public License, version 3.0, as published by the
|
|
// Free Software Foundation.
|
|
//
|
|
// This program 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
|
|
// this program. If not, see <http://www.gnu.org/licenses/>.
|
|
//
|
|
// As a special exception, AlliedModders LLC gives you permission to link the
|
|
// code of this program (as well as its derivative works) to "Half-Life 2," the
|
|
// "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
|
|
// by the Valve Corporation. You must obey the GNU General Public License in
|
|
// all respects for all other code used. Additionally, AlliedModders LLC grants
|
|
// this exception to all derivative works. AlliedModders LLC defines further
|
|
// exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
|
|
// or <http://www.sourcemod.net/license.php>.
|
|
|
|
#ifndef _INCLUDE_SPFILE_HEADERS_v1_opcodes_H
|
|
#define _INCLUDE_SPFILE_HEADERS_v1_opcodes_H
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
namespace sp {
|
|
|
|
// Opcodes labelled "UNGEN" cannot be generated by the compiler. Quite a few,
|
|
// if they could, make little sense in the context of a JIT and could not
|
|
// work anyway. Opcodes technically present in sc4.c/sc7.c (respectively,
|
|
// the code emitter and peephole optimizer) are not necessarily ever generated.
|
|
// For example, lref.pri and lref.alt would be used if a reference could be
|
|
// stored in the global scope; but they can't, so they are unreachable.
|
|
//
|
|
// Most opcodes have been manually verified. A few have not, as they are only
|
|
// produced by the peephole optimizer, or not produced at all, or eliminated
|
|
// during optimization. We generate them anyway, just in case, but they have
|
|
// not been tested.
|
|
// lref.s.alt (phopt only)
|
|
// stor.alt (never)
|
|
// stor.s.alt (never)
|
|
// sref.s.alt (never)
|
|
// lidx.b (phopt only, probably impossible)
|
|
// idxaddr.b (phopt only, looks difficult)
|
|
// move.pri (eliminated in phopt)
|
|
// shl.c.pri (eliminated in phopt)
|
|
// shl.c.alt (eliminated in phopt)
|
|
// shr.c.pri (eliminated in phopt)
|
|
// shr.c.alt (eliminated in phopt)
|
|
// eq.c.alt (never)
|
|
// inc.alt (never)
|
|
// dec.alt (never)
|
|
// sdiv (never)
|
|
// nop (never in function bodies)
|
|
//
|
|
// Additionally, some opcodes which were supported in the earlier JIT are no
|
|
// longer supported because of the above:
|
|
// lref.pri/alt
|
|
// sref.pri/alt
|
|
// sign.pri/alt
|
|
|
|
#define OPCODE_LIST(_) \
|
|
_(NONE, "none") \
|
|
_(LOAD_PRI, "load.pri") \
|
|
_(LOAD_ALT, "load.alt") \
|
|
_(LOAD_S_PRI, "load.s.pri") \
|
|
_(LOAD_S_ALT, "load.s.alt") \
|
|
_(UNGEN_LREF_PRI, "lref.pri") \
|
|
_(UNGEN_LREF_ALT, "lref.alt") \
|
|
_(LREF_S_PRI, "lref.s.pri") \
|
|
_(LREF_S_ALT, "lref.s.alt") \
|
|
_(LOAD_I, "load.i") \
|
|
_(LODB_I, "lodb.i") \
|
|
_(CONST_PRI, "const.pri") \
|
|
_(CONST_ALT, "const.alt") \
|
|
_(ADDR_PRI, "addr.pri") \
|
|
_(ADDR_ALT, "addr.alt") \
|
|
_(STOR_PRI, "stor.pri") \
|
|
_(STOR_ALT, "stor.alt") \
|
|
_(STOR_S_PRI, "stor.s.pri") \
|
|
_(STOR_S_ALT, "stor.s.alt") \
|
|
_(UNGEN_SREF_PRI, "sref.pri") \
|
|
_(UNGEN_SREF_ALT, "sref.alt") \
|
|
_(SREF_S_PRI, "sref.s.pri") \
|
|
_(SREF_S_ALT, "sref.s.alt") \
|
|
_(STOR_I, "stor.i") \
|
|
_(STRB_I, "strb.i") \
|
|
_(LIDX, "lidx") \
|
|
_(LIDX_B, "lidx.b") \
|
|
_(IDXADDR, "idxaddr") \
|
|
_(IDXADDR_B, "idxaddr.b") \
|
|
_(UNGEN_ALIGN_PRI,"align.pri") \
|
|
_(UNGEN_ALIGN_ALT,"align.alt") \
|
|
_(UNGEN_LCTRL, "lctrl") \
|
|
_(UNGEN_SCTRL, "sctrl") \
|
|
_(MOVE_PRI, "move.pri") \
|
|
_(MOVE_ALT, "move.alt") \
|
|
_(XCHG, "xchg") \
|
|
_(PUSH_PRI, "push.pri") \
|
|
_(PUSH_ALT, "push.alt") \
|
|
_(UNGEN_PUSH_R, "push.r") \
|
|
_(PUSH_C, "push.c") \
|
|
_(PUSH, "push") \
|
|
_(PUSH_S, "push.s") \
|
|
_(POP_PRI, "pop.pri") \
|
|
_(POP_ALT, "pop.alt") \
|
|
_(STACK, "stack") \
|
|
_(HEAP, "heap") \
|
|
_(PROC, "proc") \
|
|
_(UNGEN_RET, "ret") \
|
|
_(RETN, "retn") \
|
|
_(CALL, "call") \
|
|
_(UNGEN_CALL_PRI, "call.pri") \
|
|
_(JUMP, "jump") \
|
|
_(UNGEN_JREL, "jrel") \
|
|
_(JZER, "jzer") \
|
|
_(JNZ, "jnz") \
|
|
_(JEQ, "jeq") \
|
|
_(JNEQ, "jneq") \
|
|
_(UNGEN_JLESS, "jsless") \
|
|
_(UNGEN_JLEQ, "jleq") \
|
|
_(UNGEN_JGRTR, "jgrtr") \
|
|
_(UNGEN_JGEQ, "jgeq") \
|
|
_(JSLESS, "jsless") \
|
|
_(JSLEQ, "jsleq") \
|
|
_(JSGRTR, "jsgrtr") \
|
|
_(JSGEQ, "jsgeq") \
|
|
_(SHL, "shl") \
|
|
_(SHR, "shr") \
|
|
_(SSHR, "sshr") \
|
|
_(SHL_C_PRI, "shl.c.pri") \
|
|
_(SHL_C_ALT, "shl.c.alt") \
|
|
_(SHR_C_PRI, "shr.c.pri") \
|
|
_(SHR_C_ALT, "shr.c.alt") \
|
|
_(SMUL, "smul") \
|
|
_(SDIV, "sdiv") \
|
|
_(SDIV_ALT, "sdiv.alt") \
|
|
_(UNGEN_UMUL, "umul") \
|
|
_(UNGEN_UDIV, "udiv") \
|
|
_(UNGEN_UDIV_ALT, "udiv.alt") \
|
|
_(ADD, "add") \
|
|
_(SUB, "sub") \
|
|
_(SUB_ALT, "sub.alt") \
|
|
_(AND, "and") \
|
|
_(OR, "or") \
|
|
_(XOR, "xor") \
|
|
_(NOT, "not") \
|
|
_(NEG, "neg") \
|
|
_(INVERT, "invert") \
|
|
_(ADD_C, "add.c") \
|
|
_(SMUL_C, "smul.c") \
|
|
_(ZERO_PRI, "zero.pri") \
|
|
_(ZERO_ALT, "zero.alt") \
|
|
_(ZERO, "zero") \
|
|
_(ZERO_S, "zero.s") \
|
|
_(UNGEN_SIGN_PRI, "sign.pri") \
|
|
_(UNGEN_SIGN_ALT, "sign.alt") \
|
|
_(EQ, "eq") \
|
|
_(NEQ, "neq") \
|
|
_(UNGEN_LESS, "less") \
|
|
_(UNGEN_LEQ, "leq") \
|
|
_(UNGEN_GRTR, "grtr") \
|
|
_(UNGEN_GEQ, "geq") \
|
|
_(SLESS, "sless") \
|
|
_(SLEQ, "sleq") \
|
|
_(SGRTR, "sgrtr") \
|
|
_(SGEQ, "sgeq") \
|
|
_(EQ_C_PRI, "eq.c.pri") \
|
|
_(EQ_C_ALT, "eq.c.alt") \
|
|
_(INC_PRI, "inc.pri") \
|
|
_(INC_ALT, "inc.alt") \
|
|
_(INC, "inc") \
|
|
_(INC_S, "inc.s") \
|
|
_(INC_I, "inc.i") \
|
|
_(DEC_PRI, "dec.pri") \
|
|
_(DEC_ALT, "dec.alt") \
|
|
_(DEC, "dec") \
|
|
_(DEC_S, "dec.s") \
|
|
_(DEC_I, "dec.i") \
|
|
_(MOVS, "movs") \
|
|
_(UNGEN_CMPS, "cmps") \
|
|
_(FILL, "fill") \
|
|
_(HALT, "halt") \
|
|
_(BOUNDS, "bounds") \
|
|
_(UNGEN_SYSREQ_PRI,"sysreq.pri") \
|
|
_(SYSREQ_C, "sysreq.c") \
|
|
_(UNGEN_FILE, "file") \
|
|
_(UNGEN_LINE, "line") \
|
|
_(UNGEN_SYMBOL, "symbol") \
|
|
_(UNGEN_SRANGE, "srange") \
|
|
_(UNGEN_JUMP_PRI, "jump.pri") \
|
|
_(SWITCH, "switch") \
|
|
_(CASETBL, "casetbl") \
|
|
_(SWAP_PRI, "swap.pri") \
|
|
_(SWAP_ALT, "swap.alt") \
|
|
_(PUSH_ADR, "push.adr") \
|
|
_(NOP, "nop") \
|
|
_(SYSREQ_N, "sysreq.n") \
|
|
_(UNGEN_SYMTAG, "symtag") \
|
|
_(BREAK, "break") \
|
|
_(PUSH2_C, "push2.c") \
|
|
_(PUSH2, "push2") \
|
|
_(PUSH2_S, "push2.s") \
|
|
_(PUSH2_ADR, "push2.adr") \
|
|
_(PUSH3_C, "push3.c") \
|
|
_(PUSH3, "push3") \
|
|
_(PUSH3_S, "push3.s") \
|
|
_(PUSH3_ADR, "push3.adr") \
|
|
_(PUSH4_C, "push4.c") \
|
|
_(PUSH4, "push4") \
|
|
_(PUSH4_S, "push4.s") \
|
|
_(PUSH4_ADR, "push4.adr") \
|
|
_(PUSH5_C, "push5.c") \
|
|
_(PUSH5, "push5") \
|
|
_(PUSH5_S, "push5.s") \
|
|
_(PUSH5_ADR, "push5.adr") \
|
|
_(LOAD_BOTH, "load.both") \
|
|
_(LOAD_S_BOTH, "load.s.both") \
|
|
_(CONST, "const") \
|
|
_(CONST_S, "const.s") \
|
|
_(UNGEN_SYSREQ_D, "sysreq.d") \
|
|
_(UNGEB_SYSREQ_ND,"sysreq.nd") \
|
|
_(TRACKER_PUSH_C, "trk.push.c") \
|
|
_(TRACKER_POP_SETHEAP,"trk.pop") \
|
|
_(GENARRAY, "genarray") \
|
|
_(GENARRAY_Z, "genarray.z") \
|
|
_(STRADJUST_PRI, "stradjust.pri") \
|
|
_(UNGEN_STKADJUST,"stackadjust") \
|
|
_(ENDPROC, "endproc") \
|
|
_(FABS, "fabs") \
|
|
_(FLOAT, "float") \
|
|
_(FLOATADD, "float.add") \
|
|
_(FLOATSUB, "float.sub") \
|
|
_(FLOATMUL, "float.mul") \
|
|
_(FLOATDIV, "float.div") \
|
|
_(RND_TO_NEAREST, "round") \
|
|
_(RND_TO_FLOOR, "floor") \
|
|
_(RND_TO_CEIL, "ceil") \
|
|
_(RND_TO_ZERO, "rndtozero") \
|
|
_(FLOATCMP, "float.cmp") \
|
|
_(FLOAT_GT, "float.gt") \
|
|
_(FLOAT_GE, "float.ge") \
|
|
_(FLOAT_LT, "float.lt") \
|
|
_(FLOAT_LE, "float.le") \
|
|
_(FLOAT_NE, "float.ne") \
|
|
_(FLOAT_EQ, "float.eq") \
|
|
_(FLOAT_NOT, "float.not")
|
|
|
|
enum OPCODE {
|
|
#define _(op, text) OP_##op,
|
|
OPCODE_LIST(_)
|
|
#undef _
|
|
OPCODES_TOTAL
|
|
};
|
|
|
|
} // namespace sp
|
|
|
|
#endif // _INCLUDE_SPFILE_HEADERS_v1_opcodes_H
|