jitcraft/Opcodes.tbl
author David Anderson <dvander@alliedmods.net>
Wed Jul 04 19:39:00 2012 -0400 (2012-07-04)
changeset 47 050939c6181e
parent 46 735503e448a0
child 68 b40b0e18a918
permissions -rw-r--r--
Implemented gcmaps and stack frame tracing.
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@0
    55
// Unconditional jump.
dvander@0
    56
OPDEF(OP_JUMP,          11,         "jump",         5,      0,  0)
dvander@0
    57
dvander@0
    58
// Gets or sets the value of a local variable onto the stack. The local
dvander@0
    59
// variable is given by an immediate index.
dvander@0
    60
OPDEF(OP_GETLOCAL,      12,         "getlocal",     5,      0,  1)
dvander@0
    61
OPDEF(OP_SETLOCAL,      13,         "setlocal",     5,      1,  1)
dvander@0
    62
dvander@0
    63
// Stack transitions for these binary operators:
dvander@0
    64
// rhs = pop()
dvander@0
    65
// lhs = pop()
dvander@0
    66
// push(lhs OP rhs)
dvander@0
    67
OPDEF(OP_ADD,           14,         "add",          1,      2,  1)
dvander@0
    68
OPDEF(OP_SUB,           15,         "sub",          1,      2,  1)
dvander@0
    69
OPDEF(OP_MUL,           16,         "mul",          1,      2,  1)
dvander@0
    70
OPDEF(OP_DIV,           17,         "div",          1,      2,  1)
dvander@0
    71
dvander@0
    72
OPDEF(OP_POP,           18,         "pop",          1,      1,  0)
dvander@0
    73
dvander@0
    74
// Unconditional terminator placed at the end of code.
dvander@0
    75
OPDEF(OP_STOP,          19,         "stop",         1,      0,  0)
dvander@0
    76
dvander@46
    77
// Call a function with N arguments.
dvander@0
    78
//
dvander@0
    79
// CALLGLOBAL - followed by an extra immediate, containing the function index
dvander@0
    80
// in the code's global.
dvander@46
    81
OPDEF(OP_CALLGLOBAL,    20,         "callglobal",   5,      -1, 1)
dvander@0
    82
dvander@0
    83
// Similar to GET/LOCAL, except for arguments.
dvander@0
    84
OPDEF(OP_GETARG,        21,         "getarg",       5,      0,  1)
dvander@0
    85
OPDEF(OP_SETARG,        22,         "setarg",       5,      1,  1)
dvander@0
    86
dvander@0
    87
// Reads or writes an integer element to an unsafe array.
dvander@0
    88
//  index = pop()
dvander@0
    89
//  ref = pop()
dvander@0
    90
//  ref[index]
dvander@0
    91
//
dvander@6
    92
OPDEF(OP_GETARRAY_I,    23,         "getarray.i",   1,      2,  1)
dvander@6
    93
OPDEF(OP_SETARRAY_I,    24,         "setarray.i",   1,      3,  1)
dvander@8
    94
OPDEF(OP_GETARRAY_F,    25,         "getarray.f",   1,      2,  1)
dvander@8
    95
OPDEF(OP_SETARRAY_F,    26,         "setarray.f",   1,      3,  1)
dvander@21
    96
OPDEF(OP_GETARRAY_C,    27,         "getarray.c",   1,      2,  1)
dvander@21
    97
OPDEF(OP_SETARRAY_C,    28,         "setarray.c",   1,      3,  1)
dvander@21
    98
OPDEF(OP_GETARRAY_O,    29,         "getarray.o",   1,      2,  1)
dvander@0
    99
dvander@12
   100
// Allocate an array, info LIFO space if possible. The ArrayMap to use is
dvander@12
   101
// specified as an index into the script's Map table.
dvander@0
   102
//
dvander@0
   103
// Format:
dvander@12
   104
//  [u8 op] [u32 index]
dvander@21
   105
OPDEF(OP_NEWARRAY_LIFO, 30,         "newarray.lifo", 5,     0,  1)
dvander@0
   106
dvander@0
   107
// Performs a bounds check on an unsafe array.
dvander@0
   108
//
dvander@0
   109
// index = pop()
dvander@0
   110
// array = pop()
dvander@0
   111
// push(array)
dvander@0
   112
// push(index)
dvander@21
   113
OPDEF(OP_BOUNDS,        31,         "bounds",       1,      2,  2)
dvander@4
   114
dvander@4
   115
// Pushes a 32-bit IEEE-754 floating point immediate onto the stack.
dvander@21
   116
OPDEF(OP_FLOAT,         32,         "float",        5,      0,  1)
dvander@4
   117
dvander@4
   118
// Converts an integer to a 32-bit IEEE-754 floating point immediate.
dvander@21
   119
OPDEF(OP_CVT_I2F,       33,         "cvt.i2f",      1,      1,  1)
dvander@4
   120
dvander@4
   121
// Stack transitions for these binary operators:
dvander@4
   122
// rhs = pop()
dvander@4
   123
// lhs = pop()
dvander@4
   124
// push(lhs OP rhs)
dvander@21
   125
OPDEF(OP_ADD_F,         34,         "add.f",        1,      2,  1)
dvander@21
   126
OPDEF(OP_SUB_F,         35,         "sub.f",        1,      2,  1)
dvander@21
   127
OPDEF(OP_MUL_F,         36,         "mul.f",        1,      2,  1)
dvander@21
   128
OPDEF(OP_DIV_F,         37,         "div.f",        1,      2,  1)
dvander@4
   129
dvander@8
   130
// Bitwise operators.
dvander@21
   131
OPDEF(OP_SHL,           38,         "shl",          1,      2,  1)
dvander@21
   132
OPDEF(OP_SHR,           39,         "shr",          1,      2,  1)
dvander@21
   133
OPDEF(OP_USHR,          40,         "ushr",         1,      2,  1)
dvander@21
   134
OPDEF(OP_BITAND,        41,         "bitand",       1,      2,  1)
dvander@21
   135
OPDEF(OP_BITOR,         42,         "bitor",        1,      2,  1)
dvander@21
   136
OPDEF(OP_BITXOR,        43,         "bitxor",       1,      2,  1)
dvander@12
   137
dvander@12
   138
// Saves or restores the position of the LIFO heap to/from a local slot.
dvander@21
   139
OPDEF(OP_SAVELIFO,      44,         "savelifo",     5,      0,  0)
dvander@21
   140
OPDEF(OP_UNWINDLIFO,    45,         "unwindlifo",   5,      0,  0)
dvander@14
   141
dvander@14
   142
// Composes a variable reference to a stack slot or argument.
dvander@21
   143
OPDEF(OP_VARREF_LIFO,   46,         "varref.lifo",  5,      0,  1)
dvander@21
   144
OPDEF(OP_ARGREF_LIFO,   47,         "argref.lifo",  5,      0,  1)
dvander@21
   145
OPDEF(OP_SLOTREF_LIFO,  48,         "slotref.lifo", 1,      1,  1)
dvander@21
   146
OPDEF(OP_ARRAYREF_LIFO, 49,         "arrayref.lifo",1,      2,  1)
dvander@21
   147
OPDEF(OP_GETREF_I,      50,         "getref.i",     1,      1,  1)
dvander@21
   148
OPDEF(OP_SETREF_I,      51,         "setref.i",     1,      2,  1)
dvander@21
   149
OPDEF(OP_GETREF_F,      52,         "getref.f",     1,      1,  1)
dvander@21
   150
OPDEF(OP_SETREF_F,      53,         "setref.f",     1,      2,  1)
dvander@21
   151
dvander@21
   152
// Pushes an object reference onto the stack.
dvander@21
   153
OPDEF(OP_OBJECT,        54,         "object",       5,      0,  1)
dvander@21
   154
dvander@21
   155
// Performs an array-to-array assignment.
dvander@21
   156
//   Left = pop()
dvander@21
   157
//   Right = pop()
dvander@21
   158
//   copy(Left, Right)
dvander@21
   159
//   push(Left)
dvander@21
   160
OPDEF(OP_ARRAYCOPY,     55,         "arraycopy",    1,      2,  1)
dvander@22
   161
dvander@22
   162
// Duplicates the top item on the stack.
dvander@22
   163
OPDEF(OP_DUP,           56,         "dup",          1,      1,  2)
dvander@22
   164
dvander@22
   165
// Duplicates the top two items on the stack.
dvander@22
   166
OPDEF(OP_DUP2,          57,         "dup2",         1,      2,  4)
dvander@23
   167
dvander@23
   168
// Swaps the two items at the top of the stack.
dvander@23
   169
OPDEF(OP_SWAP,          58,         "swap",         1,      2,  2)
dvander@23
   170
dvander@23
   171
// Roll operation is the same as Forth. It steals a value on the stack,
dvander@23
   172
// shifting all stack values down, and then places the stolen value back at
dvander@23
   173
// the top of the stack.
dvander@23
   174
//
dvander@23
   175
//  p = sp[-3]
dvander@23
   176
//  sp[-3] = sp[-2]
dvander@23
   177
//  sp[-2] = sp[-1]
dvander@23
   178
//  sp[-1] = p
dvander@23
   179
OPDEF(OP_ROLL3,         59,         "roll3",        1,      3, 3)
dvander@23
   180
dvander@23
   181
// Pick operation is the same as Forth. It pushes a copy of a slot at a
dvander@23
   182
// specific depth.
dvander@23
   183
//
dvander@23
   184
// push(sp[-n])
dvander@23
   185
OPDEF(OP_PICK2,         60,         "pick2",        1,      2, 3)
dvander@23
   186
OPDEF(OP_PICK3,         61,         "pick3",        1,      3, 4)