src/Opcodes.tbl
author David Anderson <dvander@alliedmods.net>
Sun Sep 16 21:34:10 2012 -0700 (2012-09-16)
changeset 188 bab29bcec7fe
parent 187 9308d52205a0
child 194 b029d63565a2
permissions -rw-r--r--
Restructure Array so the elements vector can be replaced.
dvander@47
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@47
     2
 *
dvander@0
     3
 * Copyright (C) 2012 David Anderson
dvander@0
     4
 *
dvander@0
     5
 * This file is part of JITCraft.
dvander@0
     6
 *
dvander@0
     7
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@0
     8
 * the terms of the GNU General Public License as published by the Free
dvander@0
     9
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
    10
 * any later version.
dvander@0
    11
 * 
dvander@0
    12
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    15
 *
dvander@0
    16
 * You should have received a copy of the GNU General Public License along with
dvander@0
    17
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@0
    18
 */
dvander@0
    19
// Opcode macros:
dvander@0
    20
//  NAME            NUMBER      TEXT                LENGTH  USES  DEFS   
dvander@0
    21
//
dvander@0
    22
// Type suffixes:
dvander@0
    23
//  I = 32-bit integer
dvander@19
    24
//  F = 32-bit IEEE-754 float
dvander@19
    25
//  O = object reference
dvander@0
    26
dvander@0
    27
// No operation.
dvander@0
    28
OPDEF(OP_NOP,           0,          "nop",          1,      0,  0)
dvander@0
    29
dvander@0
    30
// Pushes a signed integer immediate onto the stack.
dvander@0
    31
OPDEF(OP_INT,           1,          "int",          5,      0,  1)    
dvander@0
    32
dvander@0
    33
// Returns from the current routine, propagating the value at the top of the
dvander@0
    34
// stack to the caller.
dvander@0
    35
OPDEF(OP_RETURN,        2,          "return",       1,      1,  0)
dvander@0
    36
dvander@0
    37
// Stack transitions for these comparison ops:
dvander@0
    38
// rhs = pop()
dvander@0
    39
// lhs = pop()
dvander@0
    40
// if (lhs COMPARE rhs)
dvander@0
    41
//    goto target (immediate, relative to the beginning of the jump instruction)
dvander@0
    42
OPDEF(OP_JL,            3,          "jl",           5,      2,  0)
dvander@0
    43
OPDEF(OP_JLE,           4,          "jle",          5,      2,  0)
dvander@0
    44
OPDEF(OP_JG,            5,          "jg",           5,      2,  0)
dvander@0
    45
OPDEF(OP_JGE,           6,          "jge",          5,      2,  0)
dvander@0
    46
OPDEF(OP_JEQ,           7,          "jeq",          5,      2,  0)
dvander@0
    47
OPDEF(OP_JNE,           8,          "jne",          5,      2,  0)
dvander@0
    48
dvander@0
    49
// value = pop()
dvander@0
    50
// if (value == [true, false])
dvander@0
    51
//    goto target
dvander@0
    52
OPDEF(OP_JT,            9,          "jt",           5,      1,  0)
dvander@0
    53
OPDEF(OP_JF,            10,         "jf",           5,      1,  0)
dvander@0
    54
dvander@74
    55
OPDEF(OP_JL_F,          11,         "jl.f",         5,      2,  0)
dvander@74
    56
OPDEF(OP_JLE_F,         12,         "jle.f",        5,      2,  0)
dvander@74
    57
OPDEF(OP_JG_F,          13,         "jg.f",         5,      2,  0)
dvander@74
    58
OPDEF(OP_JGE_F,         14,         "jge.f",        5,      2,  0)
dvander@74
    59
OPDEF(OP_JEQ_F,         15,         "jeq.f",        5,      2,  0)
dvander@74
    60
OPDEF(OP_JNE_F,         16,         "jne.f",        5,      2,  0)
dvander@74
    61
OPDEF(OP_JT_F,          17,         "jt.f",         5,      1,  0)
dvander@74
    62
OPDEF(OP_JF_F,          18,         "jf.f",         5,      1,  0)
dvander@74
    63
dvander@0
    64
// Unconditional jump.
dvander@74
    65
OPDEF(OP_JUMP,          19,         "jump",         5,      0,  0)
dvander@0
    66
dvander@0
    67
// Gets or sets the value of a local variable onto the stack. The local
dvander@0
    68
// variable is given by an immediate index.
dvander@74
    69
OPDEF(OP_GETLOCAL,      20,         "getlocal",     5,      0,  1)
dvander@74
    70
OPDEF(OP_SETLOCAL,      21,         "setlocal",     5,      1,  1)
dvander@0
    71
dvander@0
    72
// Stack transitions for these binary operators:
dvander@0
    73
// rhs = pop()
dvander@0
    74
// lhs = pop()
dvander@0
    75
// push(lhs OP rhs)
dvander@74
    76
OPDEF(OP_ADD,           22,         "add",          1,      2,  1)
dvander@74
    77
OPDEF(OP_SUB,           23,         "sub",          1,      2,  1)
dvander@74
    78
OPDEF(OP_MUL,           24,         "mul",          1,      2,  1)
dvander@74
    79
OPDEF(OP_DIV,           25,         "div",          1,      2,  1)
dvander@82
    80
OPDEF(OP_MOD,           26,         "mod",          1,      2,  1)
dvander@0
    81
dvander@82
    82
OPDEF(OP_LT,            27,         "lt",           1,      2,  1)
dvander@82
    83
OPDEF(OP_LE,            28,         "le",           1,      2,  1)
dvander@82
    84
OPDEF(OP_GE,            29,         "ge",           1,      2,  1)
dvander@82
    85
OPDEF(OP_GT,            30,         "gt",           1,      2,  1)
dvander@82
    86
OPDEF(OP_EQ,            31,         "eq",           1,      2,  1)
dvander@82
    87
OPDEF(OP_NE,            32,         "ne",           1,      2,  1)
dvander@74
    88
dvander@82
    89
OPDEF(OP_NOT,           33,         "not",          1,      1,  1)
dvander@82
    90
OPDEF(OP_NEG,           34,         "neg",          1,      1,  1)
dvander@79
    91
dvander@82
    92
OPDEF(OP_POP,           35,         "pop",          1,      1,  0)
dvander@0
    93
dvander@72
    94
// Unconditional terminator placed at the end of code. If a function returns
dvander@72
    95
// void, this acts as a RETURNVOID. Otherwise, it must be unreachable.
dvander@82
    96
OPDEF(OP_STOP,          36,         "stop",         1,      0,  0)
dvander@0
    97
dvander@73
    98
// Call a function with N arguments. The target function must be the last item
dvander@73
    99
// on the stack.
dvander@82
   100
OPDEF(OP_CALL,          37,         "call",         1,      -1, 1)
dvander@0
   101
dvander@0
   102
// Similar to GET/LOCAL, except for arguments.
dvander@82
   103
OPDEF(OP_GETARG,        38,         "getarg",       5,      0,  1)
dvander@82
   104
OPDEF(OP_SETARG,        39,         "setarg",       5,      1,  1)
dvander@0
   105
dvander@185
   106
// Allocates either:
dvander@185
   107
//   A fixed array, 
dvander@185
   108
//   A 0-length dynamic array, or
dvander@185
   109
//   A dynamic array whose size is specified on the stack.
dvander@185
   110
//
dvander@185
   111
// The HeapTenure is stored as a byte following the pc. The ArrayMap to use
dvander@185
   112
// is specified as an index into the script's object table.
dvander@157
   113
//
dvander@157
   114
// Format:
dvander@182
   115
//  [u8 op] [u8 tenure] [u32 index]
dvander@185
   116
OPDEF(OP_NEWFIXED,      40,         "newfixed",     6,      0, 1)
dvander@185
   117
OPDEF(OP_NEWEMPTY,      41,         "newempty",     6,      0, 1)
dvander@187
   118
OPDEF(OP_NEWSIZED,      42,         "newsized",     6,     -1, 1)
dvander@157
   119
dvander@157
   120
// Performs an array-to-array assignment.
dvander@157
   121
//   Left = pop()
dvander@157
   122
//   Right = pop()
dvander@157
   123
//   copy(Left, Right)
dvander@157
   124
//   push(Left)
dvander@185
   125
OPDEF(OP_COPYARRAY,     43,         "arraycopy",    1,      2,  1)
dvander@157
   126
dvander@0
   127
// Reads or writes an integer element to an unsafe array.
dvander@0
   128
//  index = pop()
dvander@0
   129
//  ref = pop()
dvander@0
   130
//  ref[index]
dvander@0
   131
//
dvander@185
   132
OPDEF(OP_GETELEM,       44,         "getelem",      1,      2,  1)
dvander@185
   133
OPDEF(OP_SETELEM,       45,         "setelem",      1,      3,  1)
dvander@0
   134
dvander@4
   135
// Pushes a 32-bit IEEE-754 floating point immediate onto the stack.
dvander@185
   136
OPDEF(OP_FLOAT,         46,         "float",        5,      0,  1)
dvander@4
   137
dvander@4
   138
// Converts an integer to a 32-bit IEEE-754 floating point immediate.
dvander@185
   139
OPDEF(OP_CVT_I2F,       47,         "cvt.i2f",      1,      1,  1)
dvander@4
   140
dvander@4
   141
// Stack transitions for these binary operators:
dvander@4
   142
// rhs = pop()
dvander@4
   143
// lhs = pop()
dvander@4
   144
// push(lhs OP rhs)
dvander@185
   145
OPDEF(OP_ADD_F,         48,         "add.f",        1,      2,  1)
dvander@185
   146
OPDEF(OP_SUB_F,         49,         "sub.f",        1,      2,  1)
dvander@185
   147
OPDEF(OP_MUL_F,         50,         "mul.f",        1,      2,  1)
dvander@185
   148
OPDEF(OP_DIV_F,         51,         "div.f",        1,      2,  1)
dvander@74
   149
dvander@185
   150
OPDEF(OP_LT_F,          52,         "lt.f",         1,      2,  1)
dvander@185
   151
OPDEF(OP_LE_F,          53,         "le.f",         1,      2,  1)
dvander@185
   152
OPDEF(OP_GE_F,          54,         "ge.f",         1,      2,  1)
dvander@185
   153
OPDEF(OP_GT_F,          55,         "gt.f",         1,      2,  1)
dvander@185
   154
OPDEF(OP_EQ_F,          56,         "eq.f",         1,      2,  1)
dvander@185
   155
OPDEF(OP_NE_F,          57,         "ne.f",         1,      2,  1)
dvander@79
   156
dvander@185
   157
OPDEF(OP_NOT_F,         58,         "not.f",        1,      1,  1)
dvander@185
   158
OPDEF(OP_NEG_F,         59,         "neg.f",        1,      1,  1)
dvander@4
   159
dvander@8
   160
// Bitwise operators.
dvander@185
   161
OPDEF(OP_SHL,           60,         "shl",          1,      2,  1)
dvander@185
   162
OPDEF(OP_SHR,           61,         "shr",          1,      2,  1)
dvander@185
   163
OPDEF(OP_USHR,          62,         "ushr",         1,      2,  1)
dvander@185
   164
OPDEF(OP_BITAND,        63,         "bitand",       1,      2,  1)
dvander@185
   165
OPDEF(OP_BITOR,         64,         "bitor",        1,      2,  1)
dvander@185
   166
OPDEF(OP_BITXOR,        65,         "bitxor",       1,      2,  1)
dvander@185
   167
OPDEF(OP_BITNOT,        66,         "bitnot",       1,      1,  1)
dvander@12
   168
dvander@12
   169
// Saves or restores the position of the LIFO heap to/from a local slot.
dvander@185
   170
OPDEF(OP_SAVELIFO,      67,         "savelifo",     5,      0,  0)
dvander@185
   171
OPDEF(OP_UNWINDLIFO,    68,         "unwindlifo",   5,      0,  0)
dvander@14
   172
dvander@14
   173
// Composes a variable reference to a stack slot or argument.
dvander@185
   174
OPDEF(OP_VARREF_LIFO,   69,         "varref.lifo",  5,      0,  1)
dvander@185
   175
OPDEF(OP_ARGREF_LIFO,   70,         "argref.lifo",  5,      0,  1)
dvander@185
   176
OPDEF(OP_SLOTREF_LIFO,  71,         "slotref.lifo", 1,      1,  1)
dvander@188
   177
OPDEF(OP_GETREF_I,      72,         "getref.i",     1,      1,  1)
dvander@188
   178
OPDEF(OP_SETREF_I,      73,         "setref.i",     1,      2,  1)
dvander@188
   179
OPDEF(OP_GETREF_F,      74,         "getref.f",     1,      1,  1)
dvander@188
   180
OPDEF(OP_SETREF_F,      75,         "setref.f",     1,      2,  1)
dvander@21
   181
dvander@21
   182
// Pushes an object reference onto the stack.
dvander@188
   183
OPDEF(OP_OBJECT,        76,         "object",       5,      0,  1)
dvander@22
   184
dvander@22
   185
// Duplicates the top item on the stack.
dvander@188
   186
OPDEF(OP_DUP,           77,         "dup",          1,      1,  2)
dvander@22
   187
dvander@22
   188
// Duplicates the top two items on the stack.
dvander@188
   189
OPDEF(OP_DUP2,          78,         "dup2",         1,      2,  4)
dvander@23
   190
dvander@23
   191
// Swaps the two items at the top of the stack.
dvander@188
   192
OPDEF(OP_SWAP,          79,         "swap",         1,      2,  2)
dvander@23
   193
dvander@23
   194
// Roll operation is the same as Forth. It steals a value on the stack,
dvander@23
   195
// shifting all stack values down, and then places the stolen value back at
dvander@23
   196
// the top of the stack.
dvander@23
   197
//
dvander@23
   198
//  p = sp[-3]
dvander@23
   199
//  sp[-3] = sp[-2]
dvander@23
   200
//  sp[-2] = sp[-1]
dvander@23
   201
//  sp[-1] = p
dvander@188
   202
OPDEF(OP_ROLL3,         80,         "roll3",        1,      3, 3)
dvander@23
   203
dvander@23
   204
// Pick operation is the same as Forth. It pushes a copy of a slot at a
dvander@23
   205
// specific depth.
dvander@23
   206
//
dvander@23
   207
// push(sp[-n])
dvander@188
   208
OPDEF(OP_PICK2,         81,         "pick2",        1,      2, 3)
dvander@188
   209
OPDEF(OP_PICK3,         82,         "pick3",        1,      3, 4)
dvander@68
   210
dvander@68
   211
// Calls a native function. During the course of calling a native, arguments
dvander@68
   212
// on the stack are re-pushed to match the cell-based native calling
dvander@68
   213
// convention expected by ISourcePawnEngine.
dvander@68
   214
//
dvander@68
   215
// Unlike the normal CALL instruction, natives take truly variadic arguments
dvander@68
   216
// and so we must specify the number of arguments. The format is:
dvander@68
   217
//
dvander@68
   218
// [u8 Opcode] [u32 Index] [u32 ArgCount]
dvander@68
   219
//
dvander@188
   220
OPDEF(OP_CALLNATIVE,    83,         "callnative",   9,      -1, 1)
dvander@72
   221
dvander@72
   222
// Returns from a function that does return a value.
dvander@188
   223
OPDEF(OP_RETURNVOID,    84,         "returnvoid",   1,      0, 0)
dvander@73
   224
dvander@73
   225
// Loads the module of the running function.
dvander@188
   226
OPDEF(OP_MODULE,        85,         "module",       1,      0, 1)
dvander@73
   227
dvander@73
   228
// Loads a function from a module object. The operand is the slot number
dvander@73
   229
// in the module.
dvander@188
   230
OPDEF(OP_GETMODULE_FN,  86,         "getmodule.fn", 5,      1, 1)
dvander@85
   231
dvander@85
   232
// Opcodes for accessing an environment slot in the global scope.
dvander@188
   233
OPDEF(OP_SETGLOBAL_I,   87,         "setglobal.i",  5,      1, 1)
dvander@188
   234
OPDEF(OP_SETGLOBAL_F,   88,         "setglobal.f",  5,      1, 1)
dvander@188
   235
OPDEF(OP_SETGLOBAL_O,   89,         "setglobal.o",  5,      1, 1)
dvander@188
   236
OPDEF(OP_GETGLOBAL_I,   90,         "getglobal.i",  5,      0, 1)
dvander@188
   237
OPDEF(OP_GETGLOBAL_F,   91,         "getglobal.f",  5,      0, 1)
dvander@188
   238
OPDEF(OP_GETGLOBAL_O,   92,         "getglobal.o",  5,      0, 1)
dvander@142
   239
dvander@142
   240
// Reinterprets a 32-bit integer as a float, or vice-versa.
dvander@188
   241
OPDEF(OP_BITS_I2F,      93,         "bits.i2f",     1,      1, 1)
dvander@188
   242
OPDEF(OP_BITS_F2I,      94,         "bits.f2i",     1,      1, 1)
dvander@142
   243
dvander@143
   244
// Pushes a boolean value.
dvander@188
   245
OPDEF(OP_TRUE,          95,         "true",         1,      0, 1)
dvander@188
   246
OPDEF(OP_FALSE,         96,         "false",        1,      0, 1)
dvander@143
   247
dvander@147
   248
// Allocate a struct. The HeapTenure is stored as a byte following pc. The
dvander@147
   249
// StructMap to use is specified as an index into the script's Map table.
dvander@147
   250
//
dvander@147
   251
// Format:
dvander@182
   252
//  [u8 op] [u8 tenure] [u32 index]
dvander@188
   253
OPDEF(OP_NEWSTRUCT,     97,         "newstruct",    6,      0, 1)
dvander@147
   254
dvander@152
   255
// Performs a struct-to-struct assignment.
dvander@152
   256
//   Left = pop()
dvander@152
   257
//   Right = pop()
dvander@152
   258
//   copy(Left, Right)
dvander@152
   259
//   push(Left)
dvander@188
   260
OPDEF(OP_COPYSTRUCT,    98,         "structcopy",   1,      2, 1)
dvander@152
   261
dvander@157
   262
// Sets or gets a property in a struct. The index of the field is specified as
dvander@157
   263
// a 32-bit integer. Note that these opcodes follow a new style of deriving
dvander@157
   264
// their types at runtime.
dvander@188
   265
OPDEF(OP_GETFIELD,      99,         "getfield",     5,      1, 1)
dvander@188
   266
OPDEF(OP_SETFIELD,      100,        "setfield",     5,      2, 1)
dvander@157
   267
dvander@188
   268
OPDEF(OP_FIELDREF_LIFO, 101,        "fieldref.lifo", 5,     1, 1)
dvander@164
   269
dvander@172
   270
// Table-based jump.
dvander@172
   271
// [u8 op] [i32 low] [i32 high] [u32 jump] [u32 jumps...]
dvander@188
   272
OPDEF(OP_TABLESWITCH,   102,        "tableswitch",  9,      1, 0)
dvander@172
   273