jitcraft/Opcodes.tbl
author David Anderson <dvander@alliedmods.net>
Wed Jun 27 22:02:40 2012 -0700 (2012-06-27)
changeset 7 0478c27ba82c
parent 6 172dd7799d0a
child 8 069d207a8f2a
permissions -rw-r--r--
Added support for arrays of Floats.
dvander@0
     1
/*
dvander@0
     2
 * Copyright (C) 2012 David Anderson
dvander@0
     3
 *
dvander@0
     4
 * This file is part of JITCraft.
dvander@0
     5
 *
dvander@0
     6
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@0
     7
 * the terms of the GNU General Public License as published by the Free
dvander@0
     8
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
     9
 * any later version.
dvander@0
    10
 * 
dvander@0
    11
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    12
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    14
 *
dvander@0
    15
 * You should have received a copy of the GNU General Public License along with
dvander@0
    16
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@0
    17
 */
dvander@0
    18
// Opcode macros:
dvander@0
    19
//  NAME            NUMBER      TEXT                LENGTH  USES  DEFS   
dvander@0
    20
//
dvander@0
    21
// Type suffixes:
dvander@0
    22
//  I = 32-bit integer
dvander@0
    23
//  P = reference to the UnsafeHeap or UnsafeStack
dvander@0
    24
dvander@0
    25
// No operation.
dvander@0
    26
OPDEF(OP_NOP,           0,          "nop",          1,      0,  0)
dvander@0
    27
dvander@0
    28
// Pushes a signed integer immediate onto the stack.
dvander@0
    29
OPDEF(OP_INT,           1,          "int",          5,      0,  1)    
dvander@0
    30
dvander@0
    31
// Returns from the current routine, propagating the value at the top of the
dvander@0
    32
// stack to the caller.
dvander@0
    33
OPDEF(OP_RETURN,        2,          "return",       1,      1,  0)
dvander@0
    34
dvander@0
    35
// Stack transitions for these comparison ops:
dvander@0
    36
// rhs = pop()
dvander@0
    37
// lhs = pop()
dvander@0
    38
// if (lhs COMPARE rhs)
dvander@0
    39
//    goto target (immediate, relative to the beginning of the jump instruction)
dvander@0
    40
OPDEF(OP_JL,            3,          "jl",           5,      2,  0)
dvander@0
    41
OPDEF(OP_JLE,           4,          "jle",          5,      2,  0)
dvander@0
    42
OPDEF(OP_JG,            5,          "jg",           5,      2,  0)
dvander@0
    43
OPDEF(OP_JGE,           6,          "jge",          5,      2,  0)
dvander@0
    44
OPDEF(OP_JEQ,           7,          "jeq",          5,      2,  0)
dvander@0
    45
OPDEF(OP_JNE,           8,          "jne",          5,      2,  0)
dvander@0
    46
dvander@0
    47
// value = pop()
dvander@0
    48
// if (value == [true, false])
dvander@0
    49
//    goto target
dvander@0
    50
OPDEF(OP_JT,            9,          "jt",           5,      1,  0)
dvander@0
    51
OPDEF(OP_JF,            10,         "jf",           5,      1,  0)
dvander@0
    52
dvander@0
    53
// Unconditional jump.
dvander@0
    54
OPDEF(OP_JUMP,          11,         "jump",         5,      0,  0)
dvander@0
    55
dvander@0
    56
// Gets or sets the value of a local variable onto the stack. The local
dvander@0
    57
// variable is given by an immediate index.
dvander@0
    58
OPDEF(OP_GETLOCAL,      12,         "getlocal",     5,      0,  1)
dvander@0
    59
OPDEF(OP_SETLOCAL,      13,         "setlocal",     5,      1,  1)
dvander@0
    60
dvander@0
    61
// Stack transitions for these binary operators:
dvander@0
    62
// rhs = pop()
dvander@0
    63
// lhs = pop()
dvander@0
    64
// push(lhs OP rhs)
dvander@0
    65
OPDEF(OP_ADD,           14,         "add",          1,      2,  1)
dvander@0
    66
OPDEF(OP_SUB,           15,         "sub",          1,      2,  1)
dvander@0
    67
OPDEF(OP_MUL,           16,         "mul",          1,      2,  1)
dvander@0
    68
OPDEF(OP_DIV,           17,         "div",          1,      2,  1)
dvander@0
    69
dvander@0
    70
OPDEF(OP_POP,           18,         "pop",          1,      1,  0)
dvander@0
    71
dvander@0
    72
// Unconditional terminator placed at the end of code.
dvander@0
    73
OPDEF(OP_STOP,          19,         "stop",         1,      0,  0)
dvander@0
    74
dvander@0
    75
// Call a function with N arguments. Arguments are pushed in reverse order.
dvander@0
    76
//
dvander@0
    77
// CALLGLOBAL - followed by an extra immediate, containing the function index
dvander@0
    78
// in the code's global.
dvander@0
    79
OPDEF(OP_CALLGLOBAL,    20,         "callglobal",   9,      -1, 1)
dvander@0
    80
dvander@0
    81
// Similar to GET/LOCAL, except for arguments.
dvander@0
    82
OPDEF(OP_GETARG,        21,         "getarg",       5,      0,  1)
dvander@0
    83
OPDEF(OP_SETARG,        22,         "setarg",       5,      1,  1)
dvander@0
    84
dvander@0
    85
// Reads or writes an integer element to an unsafe array.
dvander@0
    86
//  index = pop()
dvander@0
    87
//  ref = pop()
dvander@0
    88
//  ref[index]
dvander@0
    89
//
dvander@6
    90
OPDEF(OP_GETARRAY_I,    23,         "getarray.i",   1,      2,  1)
dvander@6
    91
OPDEF(OP_SETARRAY_I,    24,         "setarray.i",   1,      3,  1)
dvander@7
    92
OPDEF(OP_GETARRAY_F,    25,         "getarray.i",   1,      2,  1)
dvander@7
    93
OPDEF(OP_SETARRAY_F,    26,         "setarray.i",   1,      3,  1)
dvander@7
    94
OPDEF(OP_GETARRAY_P,    27,         "getarray.p",   1,      2,  1)
dvander@0
    95
dvander@0
    96
// Allocate an array of N dimensions into unsafe memory. Each dimension size
dvander@0
    97
// is encoded as an immediate. For the dynamic variant, they are popped off
dvander@0
    98
// the stack instead (sp[-1] == dimension 0, etc).
dvander@0
    99
//
dvander@0
   100
// Format:
dvander@0
   101
//  [u8 op] [u8 width] [u8 dims] [imm32 ...]
dvander@0
   102
//
dvander@0
   103
// if (dynamic)
dvander@0
   104
//    for (i = ndims - 1; i >= 0; i--)
dvander@0
   105
//        dims[ndims - i - 1] = pop()
dvander@0
   106
// 
dvander@0
   107
// push(array pref)
dvander@0
   108
//
dvander@7
   109
OPDEF(OP_STACKARRAY,    28,         "stackarray",   -1,     0,  1)
dvander@0
   110
dvander@0
   111
// Unwinds the stack to its position before a local slot was allocated.
dvander@7
   112
OPDEF(OP_UNWIND,        29,         "unwind",       5,      0,  0)
dvander@0
   113
dvander@0
   114
// Performs a bounds check on an unsafe array.
dvander@0
   115
//
dvander@0
   116
// index = pop()
dvander@0
   117
// array = pop()
dvander@0
   118
// push(array)
dvander@0
   119
// push(index)
dvander@7
   120
OPDEF(OP_BOUNDS_STA,    30,         "bounds.sta",   1,      2,  2)
dvander@4
   121
dvander@4
   122
// Pushes a 32-bit IEEE-754 floating point immediate onto the stack.
dvander@7
   123
OPDEF(OP_FLOAT,         31,         "float",        5,      0,  1)
dvander@4
   124
dvander@4
   125
// Converts an integer to a 32-bit IEEE-754 floating point immediate.
dvander@7
   126
OPDEF(OP_CVT_I2F,       32,         "cvt.i2f",      1,      1,  1)
dvander@4
   127
dvander@4
   128
// Stack transitions for these binary operators:
dvander@4
   129
// rhs = pop()
dvander@4
   130
// lhs = pop()
dvander@4
   131
// push(lhs OP rhs)
dvander@7
   132
OPDEF(OP_ADD_F,         33,         "add.f",        1,      2,  1)
dvander@7
   133
OPDEF(OP_SUB_F,         34,         "sub.f",        1,      2,  1)
dvander@7
   134
OPDEF(OP_MUL_F,         35,         "mul.f",        1,      2,  1)
dvander@7
   135
OPDEF(OP_DIV_F,         36,         "div.f",        1,      2,  1)
dvander@4
   136