/*
 * This file is a part of Alchemy OS project.
 *  Copyright (C) 2011-2014, Sergey Basalaev <sbasalaev@gmail.com>
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package alchemy.evm;

/**
 * Assembler opcodes for Ether Virtual Machine v2.2
 * @author Sergey Basalaev
 */
public interface Opcodes {
	/* Library has soname. */
	int LFLAG_SONAME = 1;
	/* Library has dependencies. */
	int LFLAG_DEPS = 2;

	/* Function is shared. */
	int FFLAG_SHARED = 1;
	/* Function has relocation table. */
	int FFLAG_RELOCS = 2;
	/* Function has line number table. */
	int FFLAG_LNUM   = 4;
	/* Function has error table. */
	int FFLAG_ERRTBL = 8;

	byte NOP         = (byte)0x00;
	byte ACONST_NULL = (byte)0x01;
	byte ICONST_M1   = (byte)0x02;
	byte ICONST_0    = (byte)0x03;
	byte ICONST_1    = (byte)0x04;
	byte ICONST_2    = (byte)0x05;
	byte ICONST_3    = (byte)0x06;
	byte ICONST_4    = (byte)0x07;
	byte ICONST_5    = (byte)0x08;
	byte LCONST_0    = (byte)0x09;
	byte LCONST_1    = (byte)0x0A;
	byte FCONST_0    = (byte)0x0B;
	byte FCONST_1    = (byte)0x0C;
	byte FCONST_2    = (byte)0x0D;
	byte DCONST_0    = (byte)0x0E;
	byte DCONST_1    = (byte)0x0F;
	byte IADD        = (byte)0x10;
	byte ISUB        = (byte)0x11;
	byte IMUL        = (byte)0x12;
	byte IDIV        = (byte)0x13;
	byte IMOD        = (byte)0x14;
	byte INEG        = (byte)0x15;
	byte ICMP        = (byte)0x16;
	byte ISHL        = (byte)0x17;
	byte ISHR        = (byte)0x18;
	byte IUSHR       = (byte)0x19;
	byte IAND        = (byte)0x1A;
	byte IOR         = (byte)0x1B;
	byte IXOR        = (byte)0x1C;
	byte I2B         = (byte)0x1D;
	byte RET_NULL    = (byte)0x1E;
	byte RETURN      = (byte)0x1F;
	byte LADD        = (byte)0x20;
	byte LSUB        = (byte)0x21;
	byte LMUL        = (byte)0x22;
	byte LDIV        = (byte)0x23;
	byte LMOD        = (byte)0x24;
	byte LNEG        = (byte)0x25;
	byte LCMP        = (byte)0x26;
	byte LSHL        = (byte)0x27;
	byte LSHR        = (byte)0x28;
	byte LUSHR       = (byte)0x29;
	byte LAND        = (byte)0x2A;
	byte LOR         = (byte)0x2B;
	byte LXOR        = (byte)0x2C;
	byte DUP         = (byte)0x2D;
	byte DUP2        = (byte)0x2E;
	byte SWAP        = (byte)0x2F;
	byte FADD        = (byte)0x30;
	byte FSUB        = (byte)0x31;
	byte FMUL        = (byte)0x32;
	byte FDIV        = (byte)0x33;
	byte FMOD        = (byte)0x34;
	byte FNEG        = (byte)0x35;
	byte FCMP        = (byte)0x36;
	byte I2L         = (byte)0x37;
	byte I2F         = (byte)0x38;
	byte I2D         = (byte)0x39;
	byte L2F         = (byte)0x3A;
	byte L2D         = (byte)0x3B;
	byte L2I         = (byte)0x3C;
	byte LOAD        = (byte)0x3D;
	byte STORE       = (byte)0x3E;
	byte LDC         = (byte)0x3F;
	byte DADD        = (byte)0x40;
	byte DSUB        = (byte)0x41;
	byte DMUL        = (byte)0x42;
	byte DDIV        = (byte)0x43;
	byte DMOD        = (byte)0x44;
	byte DNEG        = (byte)0x45;
	byte DCMP        = (byte)0x46;
	byte F2D         = (byte)0x47;
	byte F2I         = (byte)0x48;
	byte F2L         = (byte)0x49;
	byte D2I         = (byte)0x4A;
	byte D2L         = (byte)0x4B;
	byte D2F         = (byte)0x4C;
	byte CALL        = (byte)0x4D;
	byte CALV        = (byte)0x4E;
	byte ACMP        = (byte)0x4F;
	byte LOAD_0      = (byte)0x50;
	byte LOAD_1      = (byte)0x51;
	byte LOAD_2      = (byte)0x52;
	byte LOAD_3      = (byte)0x53;
	byte LOAD_4      = (byte)0x54;
	byte LOAD_5      = (byte)0x55;
	byte LOAD_6      = (byte)0x56;
	byte LOAD_7      = (byte)0x57;
	byte STORE_0     = (byte)0x58;
	byte STORE_1     = (byte)0x59;
	byte STORE_2     = (byte)0x5A;
	byte STORE_3     = (byte)0x5B;
	byte STORE_4     = (byte)0x5C;
	byte STORE_5     = (byte)0x5D;
	byte STORE_6     = (byte)0x5E;
	byte STORE_7     = (byte)0x5F;
	byte POP         = (byte)0x60;
	byte IFEQ        = (byte)0x61;
	byte IFNE        = (byte)0x62;
	byte IFLT        = (byte)0x63;
	byte IFGE        = (byte)0x64;
	byte IFGT        = (byte)0x65;
	byte IFLE        = (byte)0x66;
	byte GOTO        = (byte)0x67;
	byte IFNULL      = (byte)0x68;
	byte IFNNULL     = (byte)0x69;
	byte IF_ICMPLT   = (byte)0x6A;
	byte IF_ICMPGE   = (byte)0x6B;
	byte IF_ICMPGT   = (byte)0x6C;
	byte IF_ICMPLE   = (byte)0x6D;
	byte BIPUSH      = (byte)0x6E;
	byte SIPUSH      = (byte)0x6F;
	byte CALL_0      = (byte)0x70;
	byte CALL_1      = (byte)0x71;
	byte CALL_2      = (byte)0x72;
	byte CALL_3      = (byte)0x73;
	byte CALL_4      = (byte)0x74;
	byte CALL_5      = (byte)0x75;
	byte CALL_6      = (byte)0x76;
	byte CALL_7      = (byte)0x77;
	byte CALV_0      = (byte)0x78;
	byte CALV_1      = (byte)0x79;
	byte CALV_2      = (byte)0x7A;
	byte CALV_3      = (byte)0x7B;
	byte CALV_4      = (byte)0x7C;
	byte CALV_5      = (byte)0x7D;
	byte CALV_6      = (byte)0x7E;
	byte CALV_7      = (byte)0x7F;

	byte CALLC_0     = (byte)0xB0;
	byte CALLC_1     = (byte)0xB1;
	byte CALLC_2     = (byte)0xB2;
	byte CALLC_3     = (byte)0xB3;
	byte CALLC_4     = (byte)0xB4;
	byte CALLC_5     = (byte)0xB5;
	byte CALLC_6     = (byte)0xB6;
	byte CALLC_7     = (byte)0xB7;
	byte CALVC_0     = (byte)0xB8;
	byte CALVC_1     = (byte)0xB9;
	byte CALVC_2     = (byte)0xBA;
	byte CALVC_3     = (byte)0xBB;
	byte CALVC_4     = (byte)0xBC;
	byte CALVC_5     = (byte)0xBD;
	byte CALVC_6     = (byte)0xBE;
	byte CALVC_7     = (byte)0xBF;
	byte CALLC       = (byte)0xC0;
	byte CALVC       = (byte)0xC1;

	byte CONCAT      = (byte)0xCD;
	byte NEWMULTIARRAY = (byte)0xCE;
	byte SETGLOBAL   = (byte)0xCF;
	byte GETGLOBAL   = (byte)0xD0;
	byte GETGLOBALDEF= (byte)0xD1;
	byte THROW       = (byte)0xD2;
	byte IINC        = (byte)0xD3;
	byte JSR         = (byte)0xD4;
	byte RET         = (byte)0xD5;
	byte IF_ACMPEQ   = (byte)0xD6;
	byte IF_ACMPNE   = (byte)0xD7;
	byte NEWZA       = (byte)0xD8;
	byte ZALOAD      = (byte)0xD9;
	byte ZASTORE     = (byte)0xDA;
	byte ZALEN       = (byte)0xDB;
	byte NEWSA       = (byte)0xDC;
	byte SALOAD      = (byte)0xDD;
	byte SASTORE     = (byte)0xDE;
	byte SALEN       = (byte)0xDF;
	byte NEWIA       = (byte)0xE0;
	byte IALOAD      = (byte)0xE1;
	byte IASTORE     = (byte)0xE2;
	byte IALEN       = (byte)0xE3;
	byte NEWLA       = (byte)0xE4;
	byte LALOAD      = (byte)0xE5;
	byte LASTORE     = (byte)0xE6;
	byte LALEN       = (byte)0xE7;
	byte NEWFA       = (byte)0xE8;
	byte FALOAD      = (byte)0xE9;
	byte FASTORE     = (byte)0xEA;
	byte FALEN       = (byte)0xEB;
	byte NEWDA       = (byte)0xEC;
	byte DALOAD      = (byte)0xED;
	byte DASTORE     = (byte)0xEE;
	byte DALEN       = (byte)0xEF;
	byte NEWAA       = (byte)0xF0;
	byte AALOAD      = (byte)0xF1;
	byte AASTORE     = (byte)0xF2;
	byte AALEN       = (byte)0xF3;
	byte NEWBA       = (byte)0xF4;
	byte BALOAD      = (byte)0xF5;
	byte BASTORE     = (byte)0xF6;
	byte BALEN       = (byte)0xF7;
	byte NEWCA       = (byte)0xF8;
	byte CALOAD      = (byte)0xF9;
	byte CASTORE     = (byte)0xFA;
	byte CALEN       = (byte)0xFB;
	byte TABLESWITCH = (byte)0xFC;
	byte LOOKUPSWITCH= (byte)0xFD;
	byte I2C         = (byte)0xFE;
	byte I2S         = (byte)0xFF;
}
