dvander@0: /* dvander@0: * Copyright (C) 2012 David Anderson dvander@0: * dvander@0: * This file is part of JITCraft. dvander@0: * dvander@0: * JITCraft is free software: you can redistribute it and/or modify it under dvander@0: * the terms of the GNU General Public License as published by the Free dvander@0: * Software Foundation, either version 3 of the License, or (at your option) dvander@0: * any later version. dvander@0: * dvander@0: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@0: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@0: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@0: * dvander@0: * You should have received a copy of the GNU General Public License along with dvander@0: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@0: */ dvander@0: #ifndef _include_opcodes_h_ dvander@0: #define _include_opcodes_h_ dvander@0: dvander@0: #include dvander@0: #include dvander@0: dvander@59: namespace ke { dvander@0: dvander@0: enum Opcode dvander@0: { dvander@0: #define OPDEF(name, number, text, length, uses, defs) \ dvander@0: name = number, dvander@0: #include "Opcodes.tbl" dvander@0: #undef OPDEF dvander@0: OPCODES_TOTAL dvander@0: }; dvander@0: dvander@0: #define OPDEF(name, number, text, length, uses, defs) \ dvander@0: static const unsigned name##_LENGTH = length; dvander@0: #include "Opcodes.tbl" dvander@0: #undef OPDEF dvander@0: dvander@0: struct OpInfo dvander@0: { dvander@0: const char *name; dvander@0: int length; dvander@0: int nuses; dvander@0: int ndefs; dvander@0: }; dvander@0: dvander@0: typedef unsigned char bytecode; dvander@0: dvander@0: extern OpInfo OpcodeInfo[]; dvander@0: dvander@0: static inline Opcode dvander@0: Invert(Opcode op) dvander@0: { dvander@0: switch (op) { dvander@0: case OP_JEQ: dvander@0: return OP_JNE; dvander@0: case OP_JNE: dvander@0: return OP_JEQ; dvander@0: case OP_JG: dvander@0: return OP_JLE; dvander@0: case OP_JGE: dvander@0: return OP_JL; dvander@0: case OP_JL: dvander@0: return OP_JGE; dvander@28: default: dvander@28: assert(op == OP_JLE); dvander@0: return OP_JG; dvander@0: } dvander@0: } dvander@0: dvander@0: static inline int dvander@0: READ_INT32(bytecode *pc) dvander@0: { dvander@0: return *reinterpret_cast(pc + 1); dvander@0: } dvander@0: static inline unsigned dvander@0: READ_UINT32(bytecode *pc) dvander@0: { dvander@0: return *reinterpret_cast(pc + 1); dvander@0: } dvander@4: static inline float dvander@4: READ_FLOAT(bytecode *pc) dvander@4: { dvander@4: return *reinterpret_cast(pc + 1); dvander@4: } dvander@0: dvander@0: class Code; dvander@0: dvander@0: void Disassemble(Code *code, FILE *fp); dvander@0: dvander@0: } dvander@0: dvander@0: #endif // _include_opcodes_h_