src/Opcodes.h
author David Anderson <dvander@alliedmods.net>
Sun Sep 16 22:49:54 2012 -0700 (2012-09-16)
changeset 191 9d17f29fe16a
parent 172 48cffae8c9e0
child 195 c1ba166f3fc4
permissions -rw-r--r--
Allow returning arrays from functions.
     1 /* vim: set ts=4 sw=4 tw=99 et:
     2  *
     3  * Copyright (C) 2012 David Anderson
     4  *
     5  * This file is part of SourcePawn.
     6  *
     7  * SourcePawn is free software: you can redistribute it and/or modify it under
     8  * the terms of the GNU General Public License as published by the Free
     9  * Software Foundation, either version 3 of the License, or (at your option)
    10  * any later version.
    11  * 
    12  * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
    13  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    14  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
    15  *
    16  * You should have received a copy of the GNU General Public License along with
    17  * SourcePawn. If not, see http://www.gnu.org/licenses/.
    18  */
    19 #ifndef _include_opcodes_h_
    20 #define _include_opcodes_h_
    21 
    22 #include <assert.h>
    23 #include <stdio.h>
    24 
    25 namespace ke {
    26 
    27 enum Opcode
    28 {
    29 #define OPDEF(name, number, text, length, uses, defs)   \
    30     name = number,
    31 #include "Opcodes.tbl"
    32 #undef OPDEF
    33     OPCODES_TOTAL
    34 };
    35 
    36 #define OPDEF(name, number, text, length, uses, defs)   \
    37 static const unsigned name##_LENGTH = length;
    38 #include "Opcodes.tbl"
    39 #undef OPDEF
    40 
    41 struct OpInfo
    42 {
    43     const char *name;
    44     int length;
    45     int nuses;
    46     int ndefs;
    47 };
    48 
    49 typedef unsigned char bytecode;
    50 
    51 extern OpInfo OpcodeInfo[];
    52 
    53 static inline Opcode
    54 Invert(Opcode op)
    55 {
    56     switch (op) {
    57       case OP_JEQ:
    58         return OP_JNE;
    59       case OP_JNE:
    60         return OP_JEQ;
    61       case OP_JG:
    62         return OP_JLE;
    63       case OP_JGE:
    64         return OP_JL;
    65       case OP_JL:
    66         return OP_JGE;
    67       default:
    68         assert(op == OP_JLE);
    69         return OP_JG;
    70     }
    71 }
    72 
    73 static const unsigned MAX_TABLESWITCH_ENTRIES = 256;
    74 
    75 static inline unsigned
    76 TableSwitchEntries(int low, int high)
    77 {
    78     return unsigned(high - low) + 1;
    79 }
    80 
    81 static inline int
    82 READ_INT32(bytecode *pc)
    83 {
    84     return *reinterpret_cast<int *>(pc + 1);
    85 }
    86 static inline unsigned
    87 READ_UINT32(bytecode *pc)
    88 {
    89     return *reinterpret_cast<unsigned *>(pc + 1);
    90 }
    91 static inline float
    92 READ_FLOAT(bytecode *pc)
    93 {
    94     return *reinterpret_cast<float *>(pc + 1);
    95 }
    96 
    97 static inline int
    98 READ_TABLESWITCH_LOW(bytecode *pc)
    99 {
   100     return READ_INT32(pc);
   101 }
   102 
   103 static inline int
   104 READ_TABLESWITCH_HIGH(bytecode *pc)
   105 {
   106     return READ_INT32(pc + sizeof(int));
   107 }
   108 
   109 class Code;
   110 
   111 void Disassemble(Code *code, FILE *fp);
   112 
   113 }
   114 
   115 #endif // _include_opcodes_h_