/*******************************************************************************
 * Copyright (c) 2000, 2013 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Perry James - nullStatus method improvement (165346)
 *     Stephan Herrmann - Contribution for
 *								bug 383368 - [compiler][null] syntactic null analysis for field references
 *******************************************************************************/
package org.aspectj.org.eclipse.jdt.internal.compiler.ast;

import org.aspectj.org.eclipse.jdt.internal.compiler.util.Util;

public abstract class OperatorExpression extends Expression implements OperatorIds {

	public static int[][] OperatorSignatures = new int[NumberOfTables][];

	static {classInitialize();}

	/**
	 * OperatorExpression constructor comment.
	 */
	public OperatorExpression() {
		super();
	}
	public static final void classInitialize() {
		OperatorSignatures[AND] = get_AND();
		OperatorSignatures[AND_AND] = get_AND_AND();
		OperatorSignatures[DIVIDE] = get_DIVIDE();
		OperatorSignatures[EQUAL_EQUAL] = get_EQUAL_EQUAL();
		OperatorSignatures[GREATER] = get_GREATER();
		OperatorSignatures[GREATER_EQUAL] = get_GREATER_EQUAL();
		OperatorSignatures[LEFT_SHIFT] = get_LEFT_SHIFT();
		OperatorSignatures[LESS] = get_LESS();
		OperatorSignatures[LESS_EQUAL] = get_LESS_EQUAL();
		OperatorSignatures[MINUS] = get_MINUS();
		OperatorSignatures[MULTIPLY] = get_MULTIPLY();
		OperatorSignatures[OR] = get_OR();
		OperatorSignatures[OR_OR] = get_OR_OR();
		OperatorSignatures[PLUS] = get_PLUS();
		OperatorSignatures[REMAINDER] = get_REMAINDER();
		OperatorSignatures[RIGHT_SHIFT] = get_RIGHT_SHIFT();
		OperatorSignatures[UNSIGNED_RIGHT_SHIFT] = get_UNSIGNED_RIGHT_SHIFT();
		OperatorSignatures[XOR] = get_XOR();
	}

	public static final String generateTableTestCase(){
		//return a String which is a java method allowing to test
		//the non zero entries of all tables

		/*
		org.aspectj.org.eclipse.jdt.internal.compiler.ast.
		OperatorExpression.generateTableTestCase();
		*/

		int[] operators = new int[]{AND,AND_AND,DIVIDE,GREATER,GREATER_EQUAL,
				LEFT_SHIFT,LESS,LESS_EQUAL,MINUS,MULTIPLY,OR,OR_OR,PLUS,REMAINDER,
				RIGHT_SHIFT,UNSIGNED_RIGHT_SHIFT,XOR};

		class Decode {
			public  final String constant(int code){
				switch(code){
					case T_boolean 	: return "true"; //$NON-NLS-1$
					case T_byte		: return "((byte) 3)"; //$NON-NLS-1$
					case T_char		: return "'A'"; //$NON-NLS-1$
					case T_double	: return "300.0d"; //$NON-NLS-1$
					case T_float	: return "100.0f"; //$NON-NLS-1$
					case T_int		: return "1"; //$NON-NLS-1$
					case T_long		: return "7L"; //$NON-NLS-1$
					case T_JavaLangString	: return "\"hello-world\""; //$NON-NLS-1$
					case T_null		: return "null"; //$NON-NLS-1$
					case T_short	: return "((short) 5)"; //$NON-NLS-1$
					case T_JavaLangObject	: return "null";} //$NON-NLS-1$
				return Util.EMPTY_STRING;}

			public  final String type(int code){
				switch(code){
					case T_boolean 	: return "z"; //$NON-NLS-1$
					case T_byte		: return "b"; //$NON-NLS-1$
					case T_char		: return "c"; //$NON-NLS-1$
					case T_double	: return "d"; //$NON-NLS-1$
					case T_float	: return "f"; //$NON-NLS-1$
					case T_int		: return "i"; //$NON-NLS-1$
					case T_long		: return "l"; //$NON-NLS-1$
					case T_JavaLangString	: return "str"; //$NON-NLS-1$
					case T_null		: return "null"; //$NON-NLS-1$
					case T_short	: return "s"; //$NON-NLS-1$
					case T_JavaLangObject	: return "obj";} //$NON-NLS-1$
				return "xxx";} //$NON-NLS-1$

			public  final String operator(int operator){
					switch (operator) {
					case EQUAL_EQUAL :	return "=="; //$NON-NLS-1$
					case LESS_EQUAL :	return "<="; //$NON-NLS-1$
					case GREATER_EQUAL :return ">="; //$NON-NLS-1$
					case LEFT_SHIFT :	return "<<"; //$NON-NLS-1$
					case RIGHT_SHIFT :	return ">>"; //$NON-NLS-1$
					case UNSIGNED_RIGHT_SHIFT :	return ">>>"; //$NON-NLS-1$
					case OR_OR :return "||"; //$NON-NLS-1$
					case AND_AND :		return "&&"; //$NON-NLS-1$
					case PLUS :			return "+"; //$NON-NLS-1$
					case MINUS :		return "-"; //$NON-NLS-1$
					case NOT :			return "!"; //$NON-NLS-1$
					case REMAINDER :	return "%"; //$NON-NLS-1$
					case XOR :			return "^"; //$NON-NLS-1$
					case AND :			return "&"; //$NON-NLS-1$
					case MULTIPLY :		return "*"; //$NON-NLS-1$
					case OR :			return "|"; //$NON-NLS-1$
					case TWIDDLE :		return "~"; //$NON-NLS-1$
					case DIVIDE :		return "/"; //$NON-NLS-1$
					case GREATER :		return ">"; //$NON-NLS-1$
					case LESS :			return "<";	} //$NON-NLS-1$
				return "????";} //$NON-NLS-1$
		}


		Decode decode = new Decode();
		String s;

		s = "\tpublic static void binaryOperationTablesTestCase(){\n" + //$NON-NLS-1$

			"\t\t//TC test : all binary operation (described in tables)\n"+ //$NON-NLS-1$
			"\t\t//method automatically generated by\n"+ //$NON-NLS-1$
			"\t\t//org.aspectj.org.eclipse.jdt.internal.compiler.ast.OperatorExpression.generateTableTestCase();\n"+ //$NON-NLS-1$

			"\t\tString str0;\t String str\t= "+decode.constant(T_JavaLangString)+";\n"+ //$NON-NLS-1$ //$NON-NLS-2$
			"\t\tint i0;\t int i\t= "+decode.constant(T_int)+";\n"+ //$NON-NLS-1$ //$NON-NLS-2$
			"\t\tboolean z0;\t boolean z\t= "+decode.constant(T_boolean)+";\n"+ //$NON-NLS-1$ //$NON-NLS-2$
			"\t\tchar c0; \t char  c\t= "+decode.constant(T_char)+";\n"+ //$NON-NLS-1$ //$NON-NLS-2$
			"\t\tfloat f0; \t float f\t= "+decode.constant(T_float)+";\n"+ //$NON-NLS-1$ //$NON-NLS-2$
			"\t\tdouble d0;\t double d\t= "+decode.constant(T_double)+";\n"+ //$NON-NLS-1$ //$NON-NLS-2$
			"\t\tbyte b0; \t byte b\t= "+decode.constant(T_byte)+";\n"+ //$NON-NLS-1$ //$NON-NLS-2$
			"\t\tshort s0; \t short s\t= "+decode.constant(T_short)+";\n"+ //$NON-NLS-1$ //$NON-NLS-2$
			"\t\tlong l0; \t long l\t= "+decode.constant(T_long)+";\n"+ //$NON-NLS-1$ //$NON-NLS-2$
			"\t\tObject obj0; \t Object obj\t= "+decode.constant(T_JavaLangObject)+";\n"+ //$NON-NLS-1$ //$NON-NLS-2$
			"\n"; //$NON-NLS-1$

		int error = 0;
		for (int i=0; i < operators.length; i++)
		{	int operator = operators[i];
			for (int left=0; left<16;left++)
			for (int right=0; right<16;right++)
			{	int result = (OperatorSignatures[operator][(left<<4)+right]) & 0x0000F;
				if (result != T_undefined)

					//1/ First regular computation then 2/ comparaison
					//with a compile time constant (generated by the compiler)
					//	z0 = s >= s;
					//	if ( z0 != (((short) 5) >= ((short) 5)))
					//		System.out.println(155);

				{	s += "\t\t"+decode.type(result)+"0"+" = "+decode.type(left); //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-2$
					s += " "+decode.operator(operator)+" "+decode.type(right)+";\n"; //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-3$
					String begin = result == T_JavaLangString ? "\t\tif (! " : "\t\tif ( "; //$NON-NLS-2$ //$NON-NLS-1$
					String test = result == T_JavaLangString ? ".equals(" : " != ("; //$NON-NLS-2$ //$NON-NLS-1$
					s += begin	+decode.type(result)+"0"+test //$NON-NLS-1$
								+decode.constant(left)+" " //$NON-NLS-1$
								+decode.operator(operator)+" " //$NON-NLS-1$
								+decode.constant(right)+"))\n"; //$NON-NLS-1$
					s += "\t\t\tSystem.out.println("+ (++error) +");\n"; //$NON-NLS-1$ //$NON-NLS-2$

					}
				}
			}

		return s += "\n\t\tSystem.out.println(\"binary tables test : done\");}"; //$NON-NLS-1$
	}

	public static final int[] get_AND(){

		//the code is an int, only 20 bits are used, see below.
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		int[] table  = new int[16*16];

		//	table[(T_undefined<<4)+T_undefined] 	= T_undefined;
		//	table[(T_undefined<<4)+T_byte] 			= T_undefined;
		//	table[(T_undefined<<4)+T_long] 			= T_undefined;
		//	table[(T_undefined<<4)+T_short] 		= T_undefined;
		//	table[(T_undefined<<4)+T_void] 			= T_undefined;
		//	table[(T_undefined<<4)+T_String] 		= T_undefined;
		//	table[(T_undefined<<4)+T_Object] 		= T_undefined;
		//	table[(T_undefined<<4)+T_double] 		= T_undefined;
		//	table[(T_undefined<<4)+T_float] 		= T_undefined;
		//	table[(T_undefined<<4)+T_boolean] 		= T_undefined;
		//	table[(T_undefined<<4)+T_char] 			= T_undefined;
		//	table[(T_undefined<<4)+T_int] 			= T_undefined;
		//	table[(T_undefined<<4)+T_null] 			= T_undefined;

		//	table[(T_byte<<4)+T_undefined] 	= T_undefined;
		table[(T_byte<<4)+T_byte] 		= (Byte2Int<<12) +(Byte2Int<<4) +T_int;
		table[(T_byte<<4)+T_long]		= (Byte2Long<<12)+(Long2Long<<4)+T_long;
		table[(T_byte<<4)+T_short] 		= (Byte2Int<<12) +(Short2Int<<4)+T_int;
		//	table[(T_byte<<4)+T_void] 		= T_undefined;
		//	table[(T_byte<<4)+T_String] 	= T_undefined;
		//	table[(T_byte<<4)+T_Object] 	= T_undefined;
		//	table[(T_byte<<4)+T_double] 	= T_undefined;
		//	table[(T_byte<<4)+T_float] 		= T_undefined;
		//	table[(T_byte<<4)+T_boolean] 	= T_undefined;
		table[(T_byte<<4)+T_char] 		= (Byte2Int<<12) +(Char2Int<<4) +T_int;
		table[(T_byte<<4)+T_int] 		= (Byte2Int<<12) +(Int2Int<<4)  +T_int;
		//	table[(T_byte<<4)+T_null] 		= T_undefined;

		//	table[(T_long<<4)+T_undefined] 	= T_undefined;
		table[(T_long<<4)+T_byte] 		= (Long2Long<<12)+(Byte2Long<<4)+T_long;
		table[(T_long<<4)+T_long] 		= (Long2Long<<12)+(Long2Long<<4)+T_long;
		table[(T_long<<4)+T_short] 		= (Long2Long<<12)+(Short2Long<<4)+T_long;
		//	table[(T_long<<4)+T_void] 		= T_undefined;
		//	table[(T_long<<4)+T_String] 	= T_undefined;
		//	table[(T_long<<4)+T_Object] 	= T_undefined;
		//	table[(T_long<<4)+T_double] 	= T_undefined;
		//	table[(T_long<<4)+T_float] 		= T_undefined;
		//	table[(T_long<<4)+T_boolean] 	= T_undefined;
		table[(T_long<<4)+T_char] 		= (Long2Long<<12)+(Char2Long<<4)+T_long;
		table[(T_long<<4)+T_int] 		= (Long2Long<<12)+(Int2Long<<4)+T_long;
		//	table[(T_long<<4)+T_null] 		= T_undefined;

		//	table[(T_short<<4)+T_undefined] 	= T_undefined;
		table[(T_short<<4)+T_byte] 			= (Short2Int<<12)+(Byte2Int<<4)+T_int;
		table[(T_short<<4)+T_long] 			= (Short2Long<<12)+(Long2Long<<4)+T_long;
		table[(T_short<<4)+T_short] 		= (Short2Int<<12)+(Short2Int<<4)+T_int;
		//	table[(T_short<<4)+T_void] 			= T_undefined;
		//	table[(T_short<<4)+T_String] 		= T_undefined;
		//	table[(T_short<<4)+T_Object] 		= T_undefined;
		//	table[(T_short<<4)+T_double] 		= T_undefined;
		//	table[(T_short<<4)+T_float] 		= T_undefined;
		//	table[(T_short<<4)+T_boolean] 		= T_undefined;
		table[(T_short<<4)+T_char] 			= (Short2Int<<12)+(Char2Int<<4)+T_int;
		table[(T_short<<4)+T_int] 			= (Short2Int<<12)+(Int2Int<<4)+T_int;
		//	table[(T_short<<4)+T_null] 			= T_undefined;

		//	table[(T_void<<4)+T_undefined] 	= T_undefined;
		//	table[(T_void<<4)+T_byte] 		= T_undefined;
		//	table[(T_void<<4)+T_long] 		= T_undefined;
		//	table[(T_void<<4)+T_short] 		= T_undefined;
		//	table[(T_void<<4)+T_void] 		= T_undefined;
		//	table[(T_void<<4)+T_String] 	= T_undefined;
		//	table[(T_void<<4)+T_Object] 	= T_undefined;
		//	table[(T_void<<4)+T_double] 	= T_undefined;
		//	table[(T_void<<4)+T_float] 		= T_undefined;
		//	table[(T_void<<4)+T_boolean] 	= T_undefined;
		//	table[(T_void<<4)+T_char] 		= T_undefined;
		//	table[(T_void<<4)+T_int] 		= T_undefined;
		//	table[(T_void<<4)+T_null] 		= T_undefined;

		//	table[(T_String<<4)+T_undefined] 	= T_undefined;
		//	table[(T_String<<4)+T_byte] 		= T_undefined;
		//	table[(T_String<<4)+T_long] 		= T_undefined;
		//	table[(T_String<<4)+T_short] 		= T_undefined;
		//	table[(T_String<<4)+T_void] 		= T_undefined;
		//	table[(T_String<<4)+T_String] 		= T_undefined;
		//	table[(T_String<<4)+T_Object] 		= T_undefined;
		//	table[(T_String<<4)+T_double] 		= T_undefined;
		//	table[(T_String<<4)+T_float] 		= T_undefined;
		//	table[(T_String<<4)+T_boolean] 		= T_undefined;
		//	table[(T_String<<4)+T_char] 		= T_undefined;
		//	table[(T_String<<4)+T_int] 			= T_undefined;
		//	table[(T_String<<4)+T_null] 		= T_undefined;

		//	table[(T_Object<<4)+T_undefined] 	= T_undefined;
		//	table[(T_Object<<4)+T_byte] 		= T_undefined;
		//	table[(T_Object<<4)+T_long] 		= T_undefined;
		//	table[(T_Object<<4)+T_short]		= T_undefined;
		//	table[(T_Object<<4)+T_void] 		= T_undefined;
		//	table[(T_Object<<4)+T_String] 		= T_undefined;
		//	table[(T_Object<<4)+T_Object] 		= T_undefined;
		//	table[(T_Object<<4)+T_double] 		= T_undefined;
		//	table[(T_Object<<4)+T_float] 		= T_undefined;
		//	table[(T_Object<<4)+T_boolean]		= T_undefined;
		//	table[(T_Object<<4)+T_char] 		= T_undefined;
		//	table[(T_Object<<4)+T_int] 			= T_undefined;
		//	table[(T_Object<<4)+T_null] 		= T_undefined;

		//	table[(T_double<<4)+T_undefined] 	= T_undefined;
		//	table[(T_double<<4)+T_byte] 		= T_undefined;
		//	table[(T_double<<4)+T_long] 		= T_undefined;
		//	table[(T_double<<4)+T_short] 		= T_undefined;
		//	table[(T_double<<4)+T_void] 		= T_undefined;
		//	table[(T_double<<4)+T_String] 		= T_undefined;
		//	table[(T_double<<4)+T_Object] 		= T_undefined;
		//	table[(T_double<<4)+T_double] 		= T_undefined;
		//	table[(T_double<<4)+T_float] 		= T_undefined;
		//	table[(T_double<<4)+T_boolean] 		= T_undefined;
		//	table[(T_double<<4)+T_char] 		= T_undefined;
		//	table[(T_double<<4)+T_int] 			= T_undefined;
		//	table[(T_double<<4)+T_null] 		= T_undefined;

		//	table[(T_float<<4)+T_undefined] 	= T_undefined;
		//	table[(T_float<<4)+T_byte] 			= T_undefined;
		//	table[(T_float<<4)+T_long] 			= T_undefined;
		//	table[(T_float<<4)+T_short] 		= T_undefined;
		//	table[(T_float<<4)+T_void] 			= T_undefined;
		//	table[(T_float<<4)+T_String] 		= T_undefined;
		//	table[(T_float<<4)+T_Object] 		= T_undefined;
		//	table[(T_float<<4)+T_double] 		= T_undefined;
		//	table[(T_float<<4)+T_float] 		= T_undefined;
		//	table[(T_float<<4)+T_boolean] 		= T_undefined;
		//	table[(T_float<<4)+T_char] 			= T_undefined;
		//	table[(T_float<<4)+T_int] 			= T_undefined;
		//	table[(T_float<<4)+T_null] 			= T_undefined;

		//	table[(T_boolean<<4)+T_undefined] 		= T_undefined;
		//	table[(T_boolean<<4)+T_byte] 			= T_undefined;
		//	table[(T_boolean<<4)+T_long] 			= T_undefined;
		//	table[(T_boolean<<4)+T_short] 			= T_undefined;
		//	table[(T_boolean<<4)+T_void] 			= T_undefined;
		//	table[(T_boolean<<4)+T_String] 			= T_undefined;
		//	table[(T_boolean<<4)+T_Object] 			= T_undefined;
		//	table[(T_boolean<<4)+T_double] 			= T_undefined;
		//	table[(T_boolean<<4)+T_float] 			= T_undefined;
		table[(T_boolean<<4)+T_boolean] 		= (Boolean2Boolean << 12)+(Boolean2Boolean << 4)+T_boolean;
		//	table[(T_boolean<<4)+T_char] 			= T_undefined;
		//	table[(T_boolean<<4)+T_int] 			= T_undefined;
		//	table[(T_boolean<<4)+T_null] 			= T_undefined;

		//	table[(T_char<<4)+T_undefined] 		= T_undefined;
		table[(T_char<<4)+T_byte] 			= (Char2Int<<12)+(Byte2Int<<4)+T_int;
		table[(T_char<<4)+T_long] 			= (Char2Long<<12)+(Long2Long<<4)+T_long;
		table[(T_char<<4)+T_short] 			= (Char2Int<<12)+(Short2Int<<4)+T_int;
		//	table[(T_char<<4)+T_void] 			= T_undefined;
		//	table[(T_char<<4)+T_String] 		= T_undefined;
		//	table[(T_char<<4)+T_Object] 		= T_undefined;
		//	table[(T_char<<4)+T_double] 		= T_undefined;
		//	table[(T_char<<4)+T_float] 			= T_undefined;
		//	table[(T_char<<4)+T_boolean] 		= T_undefined;
		table[(T_char<<4)+T_char] 			= (Char2Int<<12)+(Char2Int<<4)+T_int;
		table[(T_char<<4)+T_int] 			= (Char2Int<<12)+(Int2Int<<4)+T_int;
		//	table[(T_char<<4)+T_null] 			= T_undefined;

		//	table[(T_int<<4)+T_undefined] 	= T_undefined;
		table[(T_int<<4)+T_byte] 		= (Int2Int<<12)+(Byte2Int<<4)+T_int;
		table[(T_int<<4)+T_long] 		= (Int2Long<<12)+(Long2Long<<4)+T_long;
		table[(T_int<<4)+T_short] 		= (Int2Int<<12)+(Short2Int<<4)+T_int;
		//	table[(T_int<<4)+T_void] 		= T_undefined;
		//	table[(T_int<<4)+T_String] 		= T_undefined;
		//	table[(T_int<<4)+T_Object] 		= T_undefined;
		//	table[(T_int<<4)+T_double] 		= T_undefined;
		//	table[(T_int<<4)+T_float] 		= T_undefined;
		//	table[(T_int<<4)+T_boolean] 	= T_undefined;
		table[(T_int<<4)+T_char] 		= (Int2Int<<12)+(Char2Int<<4)+T_int;
		table[(T_int<<4)+T_int] 		= (Int2Int<<12)+(Int2Int<<4)+T_int;
		//	table[(T_int<<4)+T_null] 		= T_undefined;

		//	table[(T_null<<4)+T_undefined] 		= T_undefined;
		//	table[(T_null<<4)+T_byte] 			= T_undefined;
		//	table[(T_null<<4)+T_long] 			= T_undefined;
		//	table[(T_null<<4)+T_short] 			= T_undefined;
		//	table[(T_null<<4)+T_void] 			= T_undefined;
		//	table[(T_null<<4)+T_String] 		= T_undefined;
		//	table[(T_null<<4)+T_Object] 		= T_undefined;
		//	table[(T_null<<4)+T_double] 		= T_undefined;
		//	table[(T_null<<4)+T_float] 			= T_undefined;
		//	table[(T_null<<4)+T_boolean] 		= T_undefined;
		//	table[(T_null<<4)+T_char] 			= T_undefined;
		//	table[(T_null<<4)+T_int] 			= T_undefined;
		//	table[(T_null<<4)+T_null] 			= T_undefined;

		return table;
	}

	public static final int[] get_AND_AND(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		int[] table  = new int[16*16];

		//     table[(T_undefined<<4)+T_undefined] 		= T_undefined;
		//     table[(T_undefined<<4)+T_byte] 			= T_undefined;
		//     table[(T_undefined<<4)+T_long] 			= T_undefined;
		//     table[(T_undefined<<4)+T_short] 			= T_undefined;
		//     table[(T_undefined<<4)+T_void] 			= T_undefined;
		//     table[(T_undefined<<4)+T_String] 		= T_undefined;
		//     table[(T_undefined<<4)+T_Object] 		= T_undefined;
		//     table[(T_undefined<<4)+T_double] 		= T_undefined;
		//     table[(T_undefined<<4)+T_float] 			= T_undefined;
		//     table[(T_undefined<<4)+T_boolean] 		= T_undefined;
		//     table[(T_undefined<<4)+T_char] 			= T_undefined;
		//     table[(T_undefined<<4)+T_int] 			= T_undefined;
		//     table[(T_undefined<<4)+T_null] 			= T_undefined;

		//     table[(T_byte<<4)+T_undefined] 	= T_undefined;
		//     table[(T_byte<<4)+T_byte] 		= T_undefined;
		//     table[(T_byte<<4)+T_long] 		= T_undefined;
		//     table[(T_byte<<4)+T_short] 		= T_undefined;
		//     table[(T_byte<<4)+T_void] 		= T_undefined;
		//     table[(T_byte<<4)+T_String] 		= T_undefined;
		//     table[(T_byte<<4)+T_Object] 		= T_undefined;
		//     table[(T_byte<<4)+T_double] 		= T_undefined;
		//     table[(T_byte<<4)+T_float] 		= T_undefined;
		//     table[(T_byte<<4)+T_boolean] 	= T_undefined;
		//     table[(T_byte<<4)+T_char] 		= T_undefined;
		//     table[(T_byte<<4)+T_int] 		= T_undefined;
		//     table[(T_byte<<4)+T_null] 		= T_undefined;

		//     table[(T_long<<4)+T_undefined] 	= T_undefined;
		//     table[(T_long<<4)+T_byte] 		= T_undefined;
		//     table[(T_long<<4)+T_long] 		= T_undefined;
		//     table[(T_long<<4)+T_short] 		= T_undefined;
		//     table[(T_long<<4)+T_void] 		= T_undefined;
		//     table[(T_long<<4)+T_String] 		= T_undefined;
		//     table[(T_long<<4)+T_Object] 		= T_undefined;
		//     table[(T_long<<4)+T_double] 		= T_undefined;
		//     table[(T_long<<4)+T_float] 		= T_undefined;
		//     table[(T_long<<4)+T_boolean] 	= T_undefined;
		//     table[(T_long<<4)+T_char] 		= T_undefined;
		//     table[(T_long<<4)+T_int] 		= T_undefined;
		//     table[(T_long<<4)+T_null] 		= T_undefined;

		//     table[(T_short<<4)+T_undefined] 	= T_undefined;
		//     table[(T_short<<4)+T_byte] 		= T_undefined;
		//     table[(T_short<<4)+T_long] 		= T_undefined;
		//     table[(T_short<<4)+T_short] 		= T_undefined;
		//     table[(T_short<<4)+T_void] 		= T_undefined;
		//     table[(T_short<<4)+T_String] 	= T_undefined;
		//     table[(T_short<<4)+T_Object] 	= T_undefined;
		//     table[(T_short<<4)+T_double] 	= T_undefined;
		//     table[(T_short<<4)+T_float] 		= T_undefined;
		//     table[(T_short<<4)+T_boolean]	= T_undefined;
		//     table[(T_short<<4)+T_char] 		= T_undefined;
		//     table[(T_short<<4)+T_int] 		= T_undefined;
		//     table[(T_short<<4)+T_null] 		= T_undefined;

		//     table[(T_void<<4)+T_undefined] 	= T_undefined;
		//     table[(T_void<<4)+T_byte] 		= T_undefined;
		//     table[(T_void<<4)+T_long] 		= T_undefined;
		//     table[(T_void<<4)+T_short] 		= T_undefined;
		//     table[(T_void<<4)+T_void] 		= T_undefined;
		//     table[(T_void<<4)+T_String] 	= T_undefined;
		//     table[(T_void<<4)+T_Object] 	= T_undefined;
		//     table[(T_void<<4)+T_double] 	= T_undefined;
		//     table[(T_void<<4)+T_float] 		= T_undefined;
		//     table[(T_void<<4)+T_boolean] 	= T_undefined;
		//     table[(T_void<<4)+T_char] 		= T_undefined;
		//     table[(T_void<<4)+T_int] 		= T_undefined;
		//     table[(T_void<<4)+T_null] 		= T_undefined;

		//     table[(T_String<<4)+T_undefined] 	= T_undefined;
		//     table[(T_String<<4)+T_byte] 		= T_undefined;
		//     table[(T_String<<4)+T_long] 		= T_undefined;
		//     table[(T_String<<4)+T_short] 		= T_undefined;
		//     table[(T_String<<4)+T_void] 		= T_undefined;
		//     table[(T_String<<4)+T_String] 		= T_undefined;
		//     table[(T_String<<4)+T_Object] 		= T_undefined;
		//     table[(T_String<<4)+T_double] 		= T_undefined;
		//     table[(T_String<<4)+T_float] 		= T_undefined;
		//     table[(T_String<<4)+T_boolean] 		= T_undefined;
		//     table[(T_String<<4)+T_char] 		= T_undefined;
		//     table[(T_String<<4)+T_int] 			= T_undefined;
		//     table[(T_String<<4)+T_null] 		= T_undefined;

		//     table[(T_Object<<4)+T_undefined] 	= T_undefined;
		//     table[(T_Object<<4)+T_byte] 		= T_undefined;
		//     table[(T_Object<<4)+T_long] 		= T_undefined;
		//     table[(T_Object<<4)+T_short]		= T_undefined;
		//     table[(T_Object<<4)+T_void] 		= T_undefined;
		//     table[(T_Object<<4)+T_String] 		= T_undefined;
		//     table[(T_Object<<4)+T_Object] 		= T_undefined;
		//     table[(T_Object<<4)+T_double] 		= T_undefined;
		//     table[(T_Object<<4)+T_float] 		= T_undefined;
		//     table[(T_Object<<4)+T_boolean]		= T_undefined;
		//     table[(T_Object<<4)+T_char] 		= T_undefined;
		//     table[(T_Object<<4)+T_int] 			= T_undefined;
		//     table[(T_Object<<4)+T_null] 		= T_undefined;

		//     table[(T_double<<4)+T_undefined] 	= T_undefined;
		//     table[(T_double<<4)+T_byte] 		= T_undefined;
		//     table[(T_double<<4)+T_long] 		= T_undefined;
		//     table[(T_double<<4)+T_short] 		= T_undefined;
		//     table[(T_double<<4)+T_void] 		= T_undefined;
		//     table[(T_double<<4)+T_String] 		= T_undefined;
		//     table[(T_double<<4)+T_Object] 		= T_undefined;
		//     table[(T_double<<4)+T_double] 		= T_undefined;
		//     table[(T_double<<4)+T_float] 		= T_undefined;
		//     table[(T_double<<4)+T_boolean] 		= T_undefined;
		//     table[(T_double<<4)+T_char] 		= T_undefined;
		//     table[(T_double<<4)+T_int] 			= T_undefined;
		//     table[(T_double<<4)+T_null] 		= T_undefined;

		//     table[(T_float<<4)+T_undefined] 	= T_undefined;
		//     table[(T_float<<4)+T_byte] 			= T_undefined;
		//     table[(T_float<<4)+T_long] 			= T_undefined;
		//     table[(T_float<<4)+T_short] 		= T_undefined;
		//     table[(T_float<<4)+T_void] 			= T_undefined;
		//     table[(T_float<<4)+T_String] 		= T_undefined;
		//     table[(T_float<<4)+T_Object] 		= T_undefined;
		//     table[(T_float<<4)+T_double] 		= T_undefined;
		//     table[(T_float<<4)+T_float] 		= T_undefined;
		//     table[(T_float<<4)+T_boolean] 		= T_undefined;
		//     table[(T_float<<4)+T_char] 			= T_undefined;
		//     table[(T_float<<4)+T_int] 			= T_undefined;
		//     table[(T_float<<4)+T_null] 			= T_undefined;

		//     table[(T_boolean<<4)+T_undefined] 		= T_undefined;
		//     table[(T_boolean<<4)+T_byte] 			= T_undefined;
		//     table[(T_boolean<<4)+T_long] 			= T_undefined;
		//     table[(T_boolean<<4)+T_short] 			= T_undefined;
		//     table[(T_boolean<<4)+T_void] 			= T_undefined;
		//     table[(T_boolean<<4)+T_String] 			= T_undefined;
		//     table[(T_boolean<<4)+T_Object] 			= T_undefined;
		//     table[(T_boolean<<4)+T_double] 			= T_undefined;
		//     table[(T_boolean<<4)+T_float] 			= T_undefined;
	   table[(T_boolean<<4)+T_boolean] 		= (Boolean2Boolean<<12)+(Boolean2Boolean<<4)+T_boolean;
		//     table[(T_boolean<<4)+T_char] 			= T_undefined;
		//     table[(T_boolean<<4)+T_int] 			= T_undefined;
		//     table[(T_boolean<<4)+T_null] 			= T_undefined;

		//     table[(T_char<<4)+T_undefined] 		= T_undefined;
		//     table[(T_char<<4)+T_byte] 			= T_undefined;
		//     table[(T_char<<4)+T_long] 			= T_undefined;
		//     table[(T_char<<4)+T_short] 			= T_undefined;
		//     table[(T_char<<4)+T_void] 			= T_undefined;
		//     table[(T_char<<4)+T_String] 		= T_undefined;
		//     table[(T_char<<4)+T_Object] 		= T_undefined;
		//     table[(T_char<<4)+T_double] 		= T_undefined;
		//     table[(T_char<<4)+T_float] 			= T_undefined;
		//     table[(T_char<<4)+T_boolean] 		= T_undefined;
		//     table[(T_char<<4)+T_char] 			= T_undefined;
		//     table[(T_char<<4)+T_int] 			= T_undefined;
		//     table[(T_char<<4)+T_null] 			= T_undefined;

		//     table[(T_int<<4)+T_undefined] 	= T_undefined;
		//     table[(T_int<<4)+T_byte] 		= T_undefined;
		//     table[(T_int<<4)+T_long] 		= T_undefined;
		//     table[(T_int<<4)+T_short] 		= T_undefined;
		//     table[(T_int<<4)+T_void] 		= T_undefined;
		//     table[(T_int<<4)+T_String] 		= T_undefined;
		//     table[(T_int<<4)+T_Object] 		= T_undefined;
		//     table[(T_int<<4)+T_double] 		= T_undefined;
		//     table[(T_int<<4)+T_float] 		= T_undefined;
		//     table[(T_int<<4)+T_boolean] 	= T_undefined;
		//     table[(T_int<<4)+T_char] 		= T_undefined;
		//     table[(T_int<<4)+T_int] 		= T_undefined;
		//     table[(T_int<<4)+T_null] 		= T_undefined;

		//     table[(T_null<<4)+T_undefined] 		= T_undefined;
		//     table[(T_null<<4)+T_byte] 			= T_undefined;
		//     table[(T_null<<4)+T_long] 			= T_undefined;
		//     table[(T_null<<4)+T_short] 			= T_undefined;
		//     table[(T_null<<4)+T_void] 			= T_undefined;
		//     table[(T_null<<4)+T_String] 		= T_undefined;
		//     table[(T_null<<4)+T_Object] 		= T_undefined;
		//     table[(T_null<<4)+T_double] 		= T_undefined;
		//     table[(T_null<<4)+T_float] 			= T_undefined;
		//     table[(T_null<<4)+T_boolean] 		= T_undefined;
		//     table[(T_null<<4)+T_char] 			= T_undefined;
		//     table[(T_null<<4)+T_int] 			= T_undefined;
		//     table[(T_null<<4)+T_null] 			= T_undefined;
		return table;
	}

	public static final int[] get_DIVIDE(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4


	//	int[] table  = new int[16*16];

		return get_MINUS();
	}

	public static final int[] get_EQUAL_EQUAL(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		int[] table  = new int[16*16];

		//	table[(T_undefined<<4)+T_undefined] 	= T_undefined;
		//	table[(T_undefined<<4)+T_byte] 			= T_undefined;
		//	table[(T_undefined<<4)+T_long] 			= T_undefined;
		//	table[(T_undefined<<4)+T_short] 		= T_undefined;
		//	table[(T_undefined<<4)+T_void] 			= T_undefined;
		//	table[(T_undefined<<4)+T_String] 		= T_undefined;
		//	table[(T_undefined<<4)+T_Object] 		= T_undefined;
		//	table[(T_undefined<<4)+T_double] 		= T_undefined;
		//	table[(T_undefined<<4)+T_float] 		= T_undefined;
		//	table[(T_undefined<<4)+T_boolean] 		= T_undefined;
		//	table[(T_undefined<<4)+T_char] 			= T_undefined;
		//	table[(T_undefined<<4)+T_int] 			= T_undefined;
		//	table[(T_undefined<<4)+T_null] 			= T_undefined;

		//	table[(T_byte<<4)+T_undefined] 	= T_undefined;
		table[(T_byte<<4)+T_byte] 		= (Byte2Int<<12)+(Byte2Int<<4)+T_boolean;
		table[(T_byte<<4)+T_long] 		= (Byte2Long<<12)+(Long2Long<<4)+T_boolean;
		table[(T_byte<<4)+T_short] 		= (Byte2Int<<12)+(Short2Int<<4)+T_boolean;
		//	table[(T_byte<<4)+T_void] 		= T_undefined;
		//	table[(T_byte<<4)+T_String] 	= T_undefined;
		//	table[(T_byte<<4)+T_Object] 	= T_undefined;
		table[(T_byte<<4)+T_double] 	= (Byte2Double<<12)+(Double2Double<<4)+T_boolean;
		table[(T_byte<<4)+T_float] 		= (Byte2Float<<12)+(Float2Float<<4)+T_boolean;
		//	table[(T_byte<<4)+T_boolean] 	= T_undefined;
		table[(T_byte<<4)+T_char] 		= (Byte2Int<<12)+(Char2Int<<4)+T_boolean;
		table[(T_byte<<4)+T_int] 		= (Byte2Int<<12)+(Int2Int<<4)+T_boolean;
		//	table[(T_byte<<4)+T_null] 		= T_undefined;

		//	table[(T_long<<4)+T_undefined] 	= T_undefined;
		table[(T_long<<4)+T_byte] 		= (Long2Long<<12)+(Byte2Long<<4)+T_boolean;
		table[(T_long<<4)+T_long] 		= (Long2Long<<12)+(Long2Long<<4)+T_boolean;
		table[(T_long<<4)+T_short] 		= (Long2Long<<12)+(Short2Long<<4)+T_boolean;
		//	table[(T_long<<4)+T_void] 		= T_undefined;
		//	table[(T_long<<4)+T_String] 	= T_undefined;
		//	table[(T_long<<4)+T_Object] 	= T_undefined;
		table[(T_long<<4)+T_double] 	= (Long2Double<<12)+(Double2Double<<4)+T_boolean;
		table[(T_long<<4)+T_float] 		= (Long2Float<<12)+(Float2Float<<4)+T_boolean;
		//	table[(T_long<<4)+T_boolean] 	= T_undefined;
		table[(T_long<<4)+T_char] 		= (Long2Long<<12)+(Char2Long<<4)+T_boolean;
		table[(T_long<<4)+T_int] 		= (Long2Long<<12)+(Int2Long<<4)+T_boolean;
		//	table[(T_long<<4)+T_null] 		= T_undefined;

		//	table[(T_short<<4)+T_undefined] 	= T_undefined;
		table[(T_short<<4)+T_byte] 			= (Short2Int<<12)+(Byte2Int<<4)+T_boolean;
		table[(T_short<<4)+T_long] 			= (Short2Long<<12)+(Long2Long<<4)+T_boolean;
		table[(T_short<<4)+T_short] 		= (Short2Int<<12)+(Short2Int<<4)+T_boolean;
		//	table[(T_short<<4)+T_void] 			= T_undefined;
		//	table[(T_short<<4)+T_String] 		= T_undefined;
		//	table[(T_short<<4)+T_Object] 		= T_undefined;
		table[(T_short<<4)+T_double] 		= (Short2Double<<12)+(Double2Double<<4)+T_boolean;
		table[(T_short<<4)+T_float] 		= (Short2Float<<12)+(Float2Float<<4)+T_boolean;
		//	table[(T_short<<4)+T_boolean] 		= T_undefined;
		table[(T_short<<4)+T_char] 			= (Short2Int<<12)+(Char2Int<<4)+T_boolean;
		table[(T_short<<4)+T_int] 			= (Short2Int<<12)+(Int2Int<<4)+T_boolean;
		//	table[(T_short<<4)+T_null] 			= T_undefined;

		//	table[(T_void<<4)+T_undefined] 	= T_undefined;
		//	table[(T_void<<4)+T_byte] 		= T_undefined;
		//	table[(T_void<<4)+T_long] 		= T_undefined;
		//	table[(T_void<<4)+T_short] 		= T_undefined;
		//	table[(T_void<<4)+T_void] 		= T_undefined;
		//	table[(T_void<<4)+T_String] 	= T_undefined;
		//	table[(T_void<<4)+T_Object] 	= T_undefined;
		//	table[(T_void<<4)+T_double] 	= T_undefined;
		//	table[(T_void<<4)+T_float] 		= T_undefined;
		//	table[(T_void<<4)+T_boolean] 	= T_undefined;
		//	table[(T_void<<4)+T_char] 		= T_undefined;
		//	table[(T_void<<4)+T_int] 		= T_undefined;
		//	table[(T_void<<4)+T_null] 		= T_undefined;

		//	table[(T_String<<4)+T_undefined] 	= T_undefined;
		//	table[(T_String<<4)+T_byte] 		= T_undefined;
		//	table[(T_String<<4)+T_long] 		= T_undefined;
		//	table[(T_String<<4)+T_short] 		= T_undefined;
		//	table[(T_String<<4)+T_void] 		= T_undefined;
		table[(T_JavaLangString<<4)+T_JavaLangString] 		= /*String2Object                 String2Object*/
											  (T_JavaLangObject<<16)+(T_JavaLangString<<12)+(T_JavaLangObject<<8)+(T_JavaLangString<<4)+T_boolean;
		table[(T_JavaLangString<<4)+T_JavaLangObject] 		= /*String2Object                 Object2Object*/
											  (T_JavaLangObject<<16)+(T_JavaLangString<<12)+(T_JavaLangObject<<8)+(T_JavaLangObject<<4)+T_boolean;
		//	table[(T_String<<4)+T_double] 		= T_undefined;
		//	table[(T_String<<4)+T_float] 		= T_undefined;
		//	table[(T_String<<4)+T_boolean] 		= T_undefined;
		//	table[(T_String<<4)+T_char] 		= T_undefined;
		//	table[(T_String<<4)+T_int] 			= T_undefined;
		table[(T_JavaLangString<<4)+T_null] 		= /*Object2String                null2Object */
											  (T_JavaLangObject<<16)+(T_JavaLangString<<12)+(T_JavaLangObject<<8)+(T_null<<4)+T_boolean;

		//	table[(T_Object<<4)+T_undefined] 	= T_undefined;
		//	table[(T_Object<<4)+T_byte] 		= T_undefined;
		//	table[(T_Object<<4)+T_long] 		= T_undefined;
		//	table[(T_Object<<4)+T_short]		= T_undefined;
		//	table[(T_Object<<4)+T_void] 		= T_undefined;
		table[(T_JavaLangObject<<4)+T_JavaLangString] 		= /*Object2Object                 String2Object*/
											  (T_JavaLangObject<<16)+(T_JavaLangObject<<12)+(T_JavaLangObject<<8)+(T_JavaLangString<<4)+T_boolean;
		table[(T_JavaLangObject<<4)+T_JavaLangObject] 		= /*Object2Object                 Object2Object*/
											  (T_JavaLangObject<<16)+(T_JavaLangObject<<12)+(T_JavaLangObject<<8)+(T_JavaLangObject<<4)+T_boolean;
		//	table[(T_Object<<4)+T_double] 		= T_undefined;
		//	table[(T_Object<<4)+T_float] 		= T_undefined;
		//	table[(T_Object<<4)+T_boolean]		= T_undefined;
		//	table[(T_Object<<4)+T_char] 		= T_undefined;
		//	table[(T_Object<<4)+T_int] 			= T_undefined;
		table[(T_JavaLangObject<<4)+T_null] 		= /*Object2Object                 null2Object*/
											  (T_JavaLangObject<<16)+(T_JavaLangObject<<12)+(T_JavaLangObject<<8)+(T_null<<4)+T_boolean;

		//	table[(T_double<<4)+T_undefined] 	= T_undefined;
		table[(T_double<<4)+T_byte] 		= (Double2Double<<12)+(Byte2Double<<4)+T_boolean;
		table[(T_double<<4)+T_long] 		= (Double2Double<<12)+(Long2Double<<4)+T_boolean;
		table[(T_double<<4)+T_short] 		= (Double2Double<<12)+(Short2Double<<4)+T_boolean;
		//	table[(T_double<<4)+T_void] 		= T_undefined;
		//	table[(T_double<<4)+T_String] 		= T_undefined;
		//	table[(T_double<<4)+T_Object] 		= T_undefined;
		table[(T_double<<4)+T_double] 		= (Double2Double<<12)+(Double2Double<<4)+T_boolean;
		table[(T_double<<4)+T_float] 		= (Double2Double<<12)+(Float2Double<<4)+T_boolean;
		//	table[(T_double<<4)+T_boolean] 		= T_undefined;
		table[(T_double<<4)+T_char] 		= (Double2Double<<12)+(Char2Double<<4)+T_boolean;
		table[(T_double<<4)+T_int] 			= (Double2Double<<12)+(Int2Double<<4)+T_boolean;
		//	table[(T_double<<4)+T_null] 		= T_undefined;

		//	table[(T_float<<4)+T_undefined] 	= T_undefined;
		table[(T_float<<4)+T_byte] 			= (Float2Float<<12)+(Byte2Float<<4)+T_boolean;
		table[(T_float<<4)+T_long] 			= (Float2Float<<12)+(Long2Float<<4)+T_boolean;
		table[(T_float<<4)+T_short] 		= (Float2Float<<12)+(Short2Float<<4)+T_boolean;
		//	table[(T_float<<4)+T_void] 			= T_undefined;
		//	table[(T_float<<4)+T_String] 		= T_undefined;
		//	table[(T_float<<4)+T_Object] 		= T_undefined;
		table[(T_float<<4)+T_double] 		= (Float2Double<<12)+(Double2Double<<4)+T_boolean;
		table[(T_float<<4)+T_float] 		= (Float2Float<<12)+(Float2Float<<4)+T_boolean;
		//	table[(T_float<<4)+T_boolean] 		= T_undefined;
		table[(T_float<<4)+T_char] 			= (Float2Float<<12)+(Char2Float<<4)+T_boolean;
		table[(T_float<<4)+T_int] 			= (Float2Float<<12)+(Int2Float<<4)+T_boolean;
		//	table[(T_float<<4)+T_null] 			= T_undefined;

		//	table[(T_boolean<<4)+T_undefined] 		= T_undefined;
		//	table[(T_boolean<<4)+T_byte] 			= T_undefined;
		//	table[(T_boolean<<4)+T_long] 			= T_undefined;
		//	table[(T_boolean<<4)+T_short] 			= T_undefined;
		//	table[(T_boolean<<4)+T_void] 			= T_undefined;
		//	table[(T_boolean<<4)+T_String] 			= T_undefined;
		//	table[(T_boolean<<4)+T_Object] 			= T_undefined;
		//	table[(T_boolean<<4)+T_double] 			= T_undefined;
		//	table[(T_boolean<<4)+T_float] 			= T_undefined;
		table[(T_boolean<<4)+T_boolean] 		= (Boolean2Boolean<<12)+(Boolean2Boolean<<4)+T_boolean;
		//	table[(T_boolean<<4)+T_char] 			= T_undefined;
		//	table[(T_boolean<<4)+T_int] 			= T_undefined;
		//	table[(T_boolean<<4)+T_null] 			= T_undefined;

		//	table[(T_char<<4)+T_undefined] 		= T_undefined;
		table[(T_char<<4)+T_byte] 			= (Char2Int<<12)+(Byte2Int<<4)+T_boolean;
		table[(T_char<<4)+T_long] 			= (Char2Long<<12)+(Long2Long<<4)+T_boolean;
		table[(T_char<<4)+T_short] 			= (Char2Int<<12)+(Short2Int<<4)+T_boolean;
		//	table[(T_char<<4)+T_void] 			= T_undefined;
		//	table[(T_char<<4)+T_String] 		= T_undefined;
		//	table[(T_char<<4)+T_Object] 		= T_undefined;
		table[(T_char<<4)+T_double] 		= (Char2Double<<12)+(Double2Double<<4)+T_boolean;
		table[(T_char<<4)+T_float] 			= (Char2Float<<12)+(Float2Float<<4)+T_boolean;
		//	table[(T_char<<4)+T_boolean] 		= T_undefined;
		table[(T_char<<4)+T_char] 			= (Char2Int<<12)+(Char2Int<<4)+T_boolean;
		table[(T_char<<4)+T_int] 			= (Char2Int<<12)+(Int2Int<<4)+T_boolean;
		//	table[(T_char<<4)+T_null] 			= T_undefined;

		//	table[(T_int<<4)+T_undefined] 	= T_undefined;
		table[(T_int<<4)+T_byte] 		= (Int2Int<<12)+(Byte2Int<<4)+T_boolean;
		table[(T_int<<4)+T_long] 		= (Int2Long<<12)+(Long2Long<<4)+T_boolean;
		table[(T_int<<4)+T_short] 		= (Int2Int<<12)+(Short2Int<<4)+T_boolean;
		//	table[(T_int<<4)+T_void] 		= T_undefined;
		//	table[(T_int<<4)+T_String] 		= T_undefined;
		//	table[(T_int<<4)+T_Object] 		= T_undefined;
		table[(T_int<<4)+T_double] 		= (Int2Double<<12)+(Double2Double<<4)+T_boolean;
		table[(T_int<<4)+T_float] 		= (Int2Float<<12)+(Float2Float<<4)+T_boolean;
		//	table[(T_int<<4)+T_boolean] 	= T_undefined;
		table[(T_int<<4)+T_char] 		= (Int2Int<<12)+(Char2Int<<4)+T_boolean;
		table[(T_int<<4)+T_int] 		= (Int2Int<<12)+(Int2Int<<4)+T_boolean;
		//	table[(T_int<<4)+T_null] 		= T_undefined;

		//	table[(T_null<<4)+T_undefined] 		= T_undefined;
		//	table[(T_null<<4)+T_byte] 			= T_undefined;
		//	table[(T_null<<4)+T_long] 			= T_undefined;
		//	table[(T_null<<4)+T_short] 			= T_undefined;
		//	table[(T_null<<4)+T_void] 			= T_undefined;
		table[(T_null<<4)+T_JavaLangString] 		= /*null2Object                 String2Object*/
											  (T_JavaLangObject<<16)+(T_null<<12)+(T_JavaLangObject<<8)+(T_JavaLangString<<4)+T_boolean;
		table[(T_null<<4)+T_JavaLangObject] 		= /*null2Object                 Object2Object*/
											  (T_JavaLangObject<<16)+(T_null<<12)+(T_JavaLangObject<<8)+(T_JavaLangObject<<4)+T_boolean;
		//	table[(T_null<<4)+T_double] 		= T_undefined;
		//	table[(T_null<<4)+T_float] 			= T_undefined;
		//	table[(T_null<<4)+T_boolean] 		= T_undefined;
		//	table[(T_null<<4)+T_char] 			= T_undefined;
		//	table[(T_null<<4)+T_int] 			= T_undefined;
		table[(T_null<<4)+T_null] 			= /*null2Object                 null2Object*/
											  (T_JavaLangObject<<16)+(T_null<<12)+(T_JavaLangObject<<8)+(T_null<<4)+T_boolean;
		return table;
	}

	public static final int[] get_GREATER(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		//	int[] table  = new int[16*16];
		return get_LESS();
	}

	public static final int[] get_GREATER_EQUAL(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		//	int[] table  = new int[16*16];
		return get_LESS();
	}

	public static final int[] get_LEFT_SHIFT(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		int[] table  = new int[16*16];

		//	table[(T_undefined<<4)+T_undefined] 	= T_undefined;
		//	table[(T_undefined<<4)+T_byte] 			= T_undefined;
		//	table[(T_undefined<<4)+T_long] 			= T_undefined;
		//	table[(T_undefined<<4)+T_short] 		= T_undefined;
		//	table[(T_undefined<<4)+T_void] 			= T_undefined;
		//	table[(T_undefined<<4)+T_String] 		= T_undefined;
		//	table[(T_undefined<<4)+T_Object] 		= T_undefined;
		//	table[(T_undefined<<4)+T_double] 		= T_undefined;
		//	table[(T_undefined<<4)+T_float] 		= T_undefined;
		//	table[(T_undefined<<4)+T_boolean] 		= T_undefined;
		//	table[(T_undefined<<4)+T_char] 			= T_undefined;
		//	table[(T_undefined<<4)+T_int] 			= T_undefined;
		//	table[(T_undefined<<4)+T_null] 			= T_undefined;

		//	table[(T_byte<<4)+T_undefined] 	= T_undefined;
		table[(T_byte<<4)+T_byte] 		= (Byte2Int<<12)+(Byte2Int<<4)+T_int;
		table[(T_byte<<4)+T_long] 		= (Byte2Int<<12)+(Long2Int<<4)+T_int;
		table[(T_byte<<4)+T_short] 		= (Byte2Int<<12)+(Short2Int<<4)+T_int;
		//	table[(T_byte<<4)+T_void] 		= T_undefined;
		//	table[(T_byte<<4)+T_String] 	= T_undefined;
		//	table[(T_byte<<4)+T_Object] 	= T_undefined;
		//	table[(T_byte<<4)+T_double] 	= T_undefined;
		//	table[(T_byte<<4)+T_float] 		= T_undefined;
		//	table[(T_byte<<4)+T_boolean] 	= T_undefined;
		table[(T_byte<<4)+T_char] 		= (Byte2Int<<12)+(Char2Int<<4)+T_int;
		table[(T_byte<<4)+T_int] 		= (Byte2Int<<12)+(Int2Int<<4)+T_int;
		//	table[(T_byte<<4)+T_null] 		= T_undefined;

		//	table[(T_long<<4)+T_undefined] 	= T_undefined;
		table[(T_long<<4)+T_byte] 		= (Long2Long<<12)+(Byte2Int<<4)+T_long;
		table[(T_long<<4)+T_long] 		= (Long2Long<<12)+(Long2Int<<4)+T_long;
		table[(T_long<<4)+T_short] 		= (Long2Long<<12)+(Short2Int<<4)+T_long;
		//	table[(T_long<<4)+T_void] 		= T_undefined;
		//	table[(T_long<<4)+T_String] 	= T_undefined;
		//	table[(T_long<<4)+T_Object] 	= T_undefined;
		//	table[(T_long<<4)+T_double] 	= T_undefined;
		//	table[(T_long<<4)+T_float] 		= T_undefined;
		//	table[(T_long<<4)+T_boolean] 	= T_undefined;
		table[(T_long<<4)+T_char] 		= (Long2Long<<12)+(Char2Int<<4)+T_long;
		table[(T_long<<4)+T_int] 		= (Long2Long<<12)+(Int2Int<<4)+T_long;
		//	table[(T_long<<4)+T_null] 		= T_undefined;

		//	table[(T_short<<4)+T_undefined] 	= T_undefined;
		table[(T_short<<4)+T_byte] 			= (Short2Int<<12)+(Byte2Int<<4)+T_int;
		table[(T_short<<4)+T_long] 			= (Short2Int<<12)+(Long2Int<<4)+T_int;
		table[(T_short<<4)+T_short] 		= (Short2Int<<12)+(Short2Int<<4)+T_int;
		//	table[(T_short<<4)+T_void] 			= T_undefined;
		//	table[(T_short<<4)+T_String] 		= T_undefined;
		//	table[(T_short<<4)+T_Object] 		= T_undefined;
		//	table[(T_short<<4)+T_double] 		= T_undefined;
		//	table[(T_short<<4)+T_float] 		= T_undefined;
		//	table[(T_short<<4)+T_boolean] 		= T_undefined;
		table[(T_short<<4)+T_char] 			= (Short2Int<<12)+(Char2Int<<4)+T_int;
		table[(T_short<<4)+T_int] 			= (Short2Int<<12)+(Int2Int<<4)+T_int;
		//	table[(T_short<<4)+T_null] 			= T_undefined;

		//	table[(T_void<<4)+T_undefined] 	= T_undefined;
		//	table[(T_void<<4)+T_byte] 		= T_undefined;
		//	table[(T_void<<4)+T_long] 		= T_undefined;
		//	table[(T_void<<4)+T_short] 		= T_undefined;
		//	table[(T_void<<4)+T_void] 		= T_undefined;
		//	table[(T_void<<4)+T_String] 	= T_undefined;
		//	table[(T_void<<4)+T_Object] 	= T_undefined;
		//	table[(T_void<<4)+T_double] 	= T_undefined;
		//	table[(T_void<<4)+T_float] 		= T_undefined;
		//	table[(T_void<<4)+T_boolean] 	= T_undefined;
		//	table[(T_void<<4)+T_char] 		= T_undefined;
		//	table[(T_void<<4)+T_int] 		= T_undefined;
		//	table[(T_void<<4)+T_null] 		= T_undefined;

		//	table[(T_String<<4)+T_undefined] 	= T_undefined;
		//	table[(T_String<<4)+T_byte] 		= T_undefined;
		//	table[(T_String<<4)+T_long] 		= T_undefined;
		//	table[(T_String<<4)+T_short] 		= T_undefined;
		//	table[(T_String<<4)+T_void] 		= T_undefined;
		//	table[(T_String<<4)+T_String] 		= T_undefined;
		//	table[(T_String<<4)+T_Object] 		= T_undefined;
		//	table[(T_String<<4)+T_double] 		= T_undefined;
		//	table[(T_String<<4)+T_float] 		= T_undefined;
		//	table[(T_String<<4)+T_boolean] 		= T_undefined;
		//	table[(T_String<<4)+T_char] 		= T_undefined;
		//	table[(T_String<<4)+T_int] 			= T_undefined;
		//	table[(T_String<<4)+T_null] 		= T_undefined;

		//	table[(T_Object<<4)+T_undefined] 	= T_undefined;
		//	table[(T_Object<<4)+T_byte] 		= T_undefined;
		//	table[(T_Object<<4)+T_long] 		= T_undefined;
		//	table[(T_Object<<4)+T_short]		= T_undefined;
		//	table[(T_Object<<4)+T_void] 		= T_undefined;
		//	table[(T_Object<<4)+T_String] 		= T_undefined;
		//	table[(T_Object<<4)+T_Object] 		= T_undefined;
		//	table[(T_Object<<4)+T_double] 		= T_undefined;
		//	table[(T_Object<<4)+T_float] 		= T_undefined;
		//	table[(T_Object<<4)+T_boolean]		= T_undefined;
		//	table[(T_Object<<4)+T_char] 		= T_undefined;
		//	table[(T_Object<<4)+T_int] 			= T_undefined;
		//	table[(T_Object<<4)+T_null] 		= T_undefined;

		//	table[(T_double<<4)+T_undefined] 	= T_undefined;
		//	table[(T_double<<4)+T_byte] 		= T_undefined;
		//	table[(T_double<<4)+T_long] 		= T_undefined;
		//	table[(T_double<<4)+T_short] 		= T_undefined;
		//	table[(T_double<<4)+T_void] 		= T_undefined;
		//	table[(T_double<<4)+T_String] 		= T_undefined;
		//	table[(T_double<<4)+T_Object] 		= T_undefined;
		//	table[(T_double<<4)+T_double] 		= T_undefined;
		//	table[(T_double<<4)+T_float] 		= T_undefined;
		//	table[(T_double<<4)+T_boolean] 		= T_undefined;
		//	table[(T_double<<4)+T_char] 		= T_undefined;
		//	table[(T_double<<4)+T_int] 			= T_undefined;
		//	table[(T_double<<4)+T_null] 		= T_undefined;

		//	table[(T_float<<4)+T_undefined] 	= T_undefined;
		//	table[(T_float<<4)+T_byte] 			= T_undefined;
		//	table[(T_float<<4)+T_long] 			= T_undefined;
		//	table[(T_float<<4)+T_short] 		= T_undefined;
		//	table[(T_float<<4)+T_void] 			= T_undefined;
		//	table[(T_float<<4)+T_String] 		= T_undefined;
		//	table[(T_float<<4)+T_Object] 		= T_undefined;
		//	table[(T_float<<4)+T_double] 		= T_undefined;
		//	table[(T_float<<4)+T_float] 		= T_undefined;
		//	table[(T_float<<4)+T_boolean] 		= T_undefined;
		//	table[(T_float<<4)+T_char] 			= T_undefined;
		//	table[(T_float<<4)+T_int] 			= T_undefined;
		//	table[(T_float<<4)+T_null] 			= T_undefined;

		//	table[(T_boolean<<4)+T_undefined] 		= T_undefined;
		//	table[(T_boolean<<4)+T_byte] 			= T_undefined;
		//	table[(T_boolean<<4)+T_long] 			= T_undefined;
		//	table[(T_boolean<<4)+T_short] 			= T_undefined;
		//	table[(T_boolean<<4)+T_void] 			= T_undefined;
		//	table[(T_boolean<<4)+T_String] 			= T_undefined;
		//	table[(T_boolean<<4)+T_Object] 			= T_undefined;
		//	table[(T_boolean<<4)+T_double] 			= T_undefined;
		//	table[(T_boolean<<4)+T_float] 			= T_undefined;
		//	table[(T_boolean<<4)+T_boolean] 		= T_undefined;
		//	table[(T_boolean<<4)+T_char] 			= T_undefined;
		//	table[(T_boolean<<4)+T_int] 			= T_undefined;
		//	table[(T_boolean<<4)+T_null] 			= T_undefined;

		//	table[(T_char<<4)+T_undefined] 		= T_undefined;
		table[(T_char<<4)+T_byte] 			= (Char2Int<<12)+(Byte2Int<<4)+T_int;
		table[(T_char<<4)+T_long] 			= (Char2Int<<12)+(Long2Int<<4)+T_int;
		table[(T_char<<4)+T_short] 			= (Char2Int<<12)+(Short2Int<<4)+T_int;
		//	table[(T_char<<4)+T_void] 			= T_undefined;
		//	table[(T_char<<4)+T_String] 		= T_undefined;
		//	table[(T_char<<4)+T_Object] 		= T_undefined;
		//	table[(T_char<<4)+T_double] 		= T_undefined;
		//	table[(T_char<<4)+T_float] 			= T_undefined;
		//	table[(T_char<<4)+T_boolean] 		= T_undefined;
		table[(T_char<<4)+T_char] 			= (Char2Int<<12)+(Char2Int<<4)+T_int;
		table[(T_char<<4)+T_int] 			= (Char2Int<<12)+(Int2Int<<4)+T_int;
		//	table[(T_char<<4)+T_null] 			= T_undefined;

		//	table[(T_int<<4)+T_undefined] 	= T_undefined;
		table[(T_int<<4)+T_byte] 		= (Int2Int<<12)+(Byte2Int<<4)+T_int;
		table[(T_int<<4)+T_long] 		= (Int2Int<<12)+(Long2Int<<4)+T_int;
		table[(T_int<<4)+T_short] 		= (Int2Int<<12)+(Short2Int<<4)+T_int;
		//	table[(T_int<<4)+T_void] 		= T_undefined;
		//	table[(T_int<<4)+T_String] 		= T_undefined;
		//	table[(T_int<<4)+T_Object] 		= T_undefined;
		//	table[(T_int<<4)+T_double] 		= T_undefined;
		//	table[(T_int<<4)+T_float] 		= T_undefined;
		//	table[(T_int<<4)+T_boolean] 	= T_undefined;
		table[(T_int<<4)+T_char] 		= (Int2Int<<12)+(Char2Int<<4)+T_int;
		table[(T_int<<4)+T_int] 		= (Int2Int<<12)+(Int2Int<<4)+T_int;
		//	table[(T_int<<4)+T_null] 		= T_undefined;

		//	table[(T_null<<4)+T_undefined] 		= T_undefined;
		//	table[(T_null<<4)+T_byte] 			= T_undefined;
		//	table[(T_null<<4)+T_long] 			= T_undefined;
		//	table[(T_null<<4)+T_short] 			= T_undefined;
		//	table[(T_null<<4)+T_void] 			= T_undefined;
		//	table[(T_null<<4)+T_String] 		= T_undefined;
		//	table[(T_null<<4)+T_Object] 		= T_undefined;
		//	table[(T_null<<4)+T_double] 		= T_undefined;
		//	table[(T_null<<4)+T_float] 			= T_undefined;
		//	table[(T_null<<4)+T_boolean] 		= T_undefined;
		//	table[(T_null<<4)+T_char] 			= T_undefined;
		//	table[(T_null<<4)+T_int] 			= T_undefined;
		//	table[(T_null<<4)+T_null] 			= T_undefined;

		return table;
	}

	public static final int[] get_LESS(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		int[] table  = new int[16*16];

		//	table[(T_undefined<<4)+T_undefined] 	= T_undefined;
		//	table[(T_undefined<<4)+T_byte] 			= T_undefined;
		//	table[(T_undefined<<4)+T_long] 			= T_undefined;
		//	table[(T_undefined<<4)+T_short] 		= T_undefined;
		//	table[(T_undefined<<4)+T_void] 			= T_undefined;
		//	table[(T_undefined<<4)+T_String] 		= T_undefined;
		//	table[(T_undefined<<4)+T_Object] 		= T_undefined;
		//	table[(T_undefined<<4)+T_double] 		= T_undefined;
		//	table[(T_undefined<<4)+T_float] 		= T_undefined;
		//	table[(T_undefined<<4)+T_boolean] 		= T_undefined;
		//	table[(T_undefined<<4)+T_char] 			= T_undefined;
		//	table[(T_undefined<<4)+T_int] 			= T_undefined;
		//	table[(T_undefined<<4)+T_null] 			= T_undefined;

		//	table[(T_byte<<4)+T_undefined] 	= T_undefined;
		table[(T_byte<<4)+T_byte] 		= (Byte2Int<<12)+(Byte2Int<<4)+T_boolean;
		table[(T_byte<<4)+T_long] 		= (Byte2Long<<12)+(Long2Long<<4)+T_boolean;
		table[(T_byte<<4)+T_short] 		= (Byte2Int<<12)+(Short2Int<<4)+T_boolean;
		//	table[(T_byte<<4)+T_void] 		= T_undefined;
		//	table[(T_byte<<4)+T_String] 	= T_undefined;
		//	table[(T_byte<<4)+T_Object] 	= T_undefined;
		table[(T_byte<<4)+T_double] 	= (Byte2Double<<12)+(Double2Double<<4)+T_boolean;
		table[(T_byte<<4)+T_float] 		= (Byte2Float<<12)+(Float2Float<<4)+T_boolean;
		//	table[(T_byte<<4)+T_boolean] 	= T_undefined;
		table[(T_byte<<4)+T_char] 		= (Byte2Int<<12)+(Char2Int<<4)+T_boolean;
		table[(T_byte<<4)+T_int] 		= (Byte2Int<<12)+(Int2Int<<4)+T_boolean;
		//	table[(T_byte<<4)+T_null] 		= T_undefined;

		//	table[(T_long<<4)+T_undefined] 	= T_undefined;
		table[(T_long<<4)+T_byte] 		= (Long2Long<<12)+(Byte2Long<<4)+T_boolean;
		table[(T_long<<4)+T_long] 		= (Long2Long<<12)+(Long2Long<<4)+T_boolean;
		table[(T_long<<4)+T_short] 		= (Long2Long<<12)+(Short2Long<<4)+T_boolean;
		//	table[(T_long<<4)+T_void] 		= T_undefined;
		//	table[(T_long<<4)+T_String] 	= T_undefined;
		//	table[(T_long<<4)+T_Object] 	= T_undefined;
		table[(T_long<<4)+T_double] 	= (Long2Double<<12)+(Double2Double<<4)+T_boolean;
		table[(T_long<<4)+T_float] 		= (Long2Float<<12)+(Float2Float<<4)+T_boolean;
		//	table[(T_long<<4)+T_boolean] 	= T_undefined;
		table[(T_long<<4)+T_char] 		= (Long2Long<<12)+(Char2Long<<4)+T_boolean;
		table[(T_long<<4)+T_int] 		= (Long2Long<<12)+(Int2Long<<4)+T_boolean;
		//	table[(T_long<<4)+T_null] 		= T_undefined;

		//	table[(T_short<<4)+T_undefined] 	= T_undefined;
		table[(T_short<<4)+T_byte] 			= (Short2Int<<12)+(Byte2Int<<4)+T_boolean;
		table[(T_short<<4)+T_long] 			= (Short2Long<<12)+(Long2Long<<4)+T_boolean;
		table[(T_short<<4)+T_short] 		= (Short2Int<<12)+(Short2Int<<4)+T_boolean;
		//	table[(T_short<<4)+T_void] 			= T_undefined;
		//	table[(T_short<<4)+T_String] 		= T_undefined;
		//	table[(T_short<<4)+T_Object] 		= T_undefined;
		table[(T_short<<4)+T_double] 		= (Short2Double<<12)+(Double2Double<<4)+T_boolean;
		table[(T_short<<4)+T_float] 		= (Short2Float<<12)+(Float2Float<<4)+T_boolean;
		//	table[(T_short<<4)+T_boolean] 		= T_undefined;
		table[(T_short<<4)+T_char] 			= (Short2Int<<12)+(Char2Int<<4)+T_boolean;
		table[(T_short<<4)+T_int] 			= (Short2Int<<12)+(Int2Int<<4)+T_boolean;
		//	table[(T_short<<4)+T_null] 			= T_undefined;

		//	table[(T_void<<4)+T_undefined] 	= T_undefined;
		//	table[(T_void<<4)+T_byte] 		= T_undefined;
		//	table[(T_void<<4)+T_long] 		= T_undefined;
		//	table[(T_void<<4)+T_short] 		= T_undefined;
		//	table[(T_void<<4)+T_void] 		= T_undefined;
		//	table[(T_void<<4)+T_String] 	= T_undefined;
		//	table[(T_void<<4)+T_Object] 	= T_undefined;
		//	table[(T_void<<4)+T_double] 	= T_undefined;
		//	table[(T_void<<4)+T_float] 		= T_undefined;
		//	table[(T_void<<4)+T_boolean] 	= T_undefined;
		//	table[(T_void<<4)+T_char] 		= T_undefined;
		//	table[(T_void<<4)+T_int] 		= T_undefined;
		//	table[(T_void<<4)+T_null] 		= T_undefined;

		//	table[(T_String<<4)+T_undefined] 	= T_undefined;
		//	table[(T_String<<4)+T_byte] 		= T_undefined;
		//	table[(T_String<<4)+T_long] 		= T_undefined;
		//	table[(T_String<<4)+T_short] 		= T_undefined;
		//	table[(T_String<<4)+T_void] 		= T_undefined;
		//	table[(T_String<<4)+T_String] 		= T_undefined;
		//	table[(T_String<<4)+T_Object] 		= T_undefined;
		//	table[(T_String<<4)+T_double] 		= T_undefined;
		//	table[(T_String<<4)+T_float] 		= T_undefined;
		//	table[(T_String<<4)+T_boolean] 		= T_undefined;
		//	table[(T_String<<4)+T_char] 		= T_undefined;
		//	table[(T_String<<4)+T_int] 			= T_undefined;
		//	table[(T_String<<4)+T_null] 		= T_undefined;

		//	table[(T_Object<<4)+T_undefined] 	= T_undefined;
		//	table[(T_Object<<4)+T_byte] 		= T_undefined;
		//	table[(T_Object<<4)+T_long] 		= T_undefined;
		//	table[(T_Object<<4)+T_short]		= T_undefined;
		//	table[(T_Object<<4)+T_void] 		= T_undefined;
		//	table[(T_Object<<4)+T_String] 		= T_undefined;
		//	table[(T_Object<<4)+T_Object] 		= T_undefined;
		//	table[(T_Object<<4)+T_double] 		= T_undefined;
		//	table[(T_Object<<4)+T_float] 		= T_undefined;
		//	table[(T_Object<<4)+T_boolean]		= T_undefined;
		//	table[(T_Object<<4)+T_char] 		= T_undefined;
		//	table[(T_Object<<4)+T_int] 			= T_undefined;
		//	table[(T_Object<<4)+T_null] 		= T_undefined;

		//	table[(T_double<<4)+T_undefined] 	= T_undefined;
		table[(T_double<<4)+T_byte] 		= (Double2Double<<12)+(Byte2Double<<4)+T_boolean;
		table[(T_double<<4)+T_long] 		= (Double2Double<<12)+(Long2Double<<4)+T_boolean;
		table[(T_double<<4)+T_short] 		= (Double2Double<<12)+(Short2Double<<4)+T_boolean;
		//	table[(T_double<<4)+T_void] 		= T_undefined;
		//	table[(T_double<<4)+T_String] 		= T_undefined;
		//	table[(T_double<<4)+T_Object] 		= T_undefined;
		table[(T_double<<4)+T_double] 		= (Double2Double<<12)+(Double2Double<<4)+T_boolean;
		table[(T_double<<4)+T_float] 		= (Double2Double<<12)+(Float2Double<<4)+T_boolean;
		//	table[(T_double<<4)+T_boolean] 		= T_undefined;
		table[(T_double<<4)+T_char] 		= (Double2Double<<12)+(Char2Double<<4)+T_boolean;
		table[(T_double<<4)+T_int] 			= (Double2Double<<12)+(Int2Double<<4)+T_boolean;
		//	table[(T_double<<4)+T_null] 		= T_undefined;

		//	table[(T_float<<4)+T_undefined] 	= T_undefined;
		table[(T_float<<4)+T_byte] 			= (Float2Float<<12)+(Byte2Float<<4)+T_boolean;
		table[(T_float<<4)+T_long] 			= (Float2Float<<12)+(Long2Float<<4)+T_boolean;
		table[(T_float<<4)+T_short] 		= (Float2Float<<12)+(Short2Float<<4)+T_boolean;
		//	table[(T_float<<4)+T_void] 			= T_undefined;
		//	table[(T_float<<4)+T_String] 		= T_undefined;
		//	table[(T_float<<4)+T_Object] 		= T_undefined;
		table[(T_float<<4)+T_double] 		= (Float2Double<<12)+(Double2Double<<4)+T_boolean;
		table[(T_float<<4)+T_float] 		= (Float2Float<<12)+(Float2Float<<4)+T_boolean;
		//	table[(T_float<<4)+T_boolean] 		= T_undefined;
		table[(T_float<<4)+T_char] 			= (Float2Float<<12)+(Char2Float<<4)+T_boolean;
		table[(T_float<<4)+T_int] 			= (Float2Float<<12)+(Int2Float<<4)+T_boolean;
		//	table[(T_float<<4)+T_null] 			= T_undefined;

		//	table[(T_boolean<<4)+T_undefined] 		= T_undefined;
		//	table[(T_boolean<<4)+T_byte] 			= T_undefined;
		//	table[(T_boolean<<4)+T_long] 			= T_undefined;
		//	table[(T_boolean<<4)+T_short] 			= T_undefined;
		//	table[(T_boolean<<4)+T_void] 			= T_undefined;
		//	table[(T_boolean<<4)+T_String] 			= T_undefined;
		//	table[(T_boolean<<4)+T_Object] 			= T_undefined;
		//	table[(T_boolean<<4)+T_double] 			= T_undefined;
		//	table[(T_boolean<<4)+T_float] 			= T_undefined;
		//	table[(T_boolean<<4)+T_boolean] 		= T_undefined;
		//	table[(T_boolean<<4)+T_char] 			= T_undefined;
		//	table[(T_boolean<<4)+T_int] 			= T_undefined;
		//	table[(T_boolean<<4)+T_null] 			= T_undefined;

		//	table[(T_char<<4)+T_undefined] 		= T_undefined;
		table[(T_char<<4)+T_byte] 			= (Char2Int<<12)+(Byte2Int<<4)+T_boolean;
		table[(T_char<<4)+T_long] 			= (Char2Long<<12)+(Long2Long<<4)+T_boolean;
		table[(T_char<<4)+T_short] 			= (Char2Int<<12)+(Short2Int<<4)+T_boolean;
		//	table[(T_char<<4)+T_void] 			= T_undefined;
		//	table[(T_char<<4)+T_String] 		= T_undefined;
		//	table[(T_char<<4)+T_Object] 		= T_undefined;
		table[(T_char<<4)+T_double] 		= (Char2Double<<12)+(Double2Double<<4)+T_boolean;
		table[(T_char<<4)+T_float] 			= (Char2Float<<12)+(Float2Float<<4)+T_boolean;
		//	table[(T_char<<4)+T_boolean] 		= T_undefined;
		table[(T_char<<4)+T_char] 			= (Char2Int<<12)+(Char2Int<<4)+T_boolean;
		table[(T_char<<4)+T_int] 			= (Char2Int<<12)+(Int2Int<<4)+T_boolean;
		//	table[(T_char<<4)+T_null] 			= T_undefined;

		//	table[(T_int<<4)+T_undefined] 	= T_undefined;
		table[(T_int<<4)+T_byte] 		= (Int2Int<<12)+(Byte2Int<<4)+T_boolean;
		table[(T_int<<4)+T_long] 		= (Int2Long<<12)+(Long2Long<<4)+T_boolean;
		table[(T_int<<4)+T_short] 		= (Int2Int<<12)+(Short2Int<<4)+T_boolean;
		//	table[(T_int<<4)+T_void] 		= T_undefined;
		//	table[(T_int<<4)+T_String] 		= T_undefined;
		//	table[(T_int<<4)+T_Object] 		= T_undefined;
		table[(T_int<<4)+T_double] 		= (Int2Double<<12)+(Double2Double<<4)+T_boolean;
		table[(T_int<<4)+T_float] 		= (Int2Float<<12)+(Float2Float<<4)+T_boolean;
		//	table[(T_int<<4)+T_boolean] 	= T_undefined;
		table[(T_int<<4)+T_char] 		= (Int2Int<<12)+(Char2Int<<4)+T_boolean;
		table[(T_int<<4)+T_int] 		= (Int2Int<<12)+(Int2Int<<4)+T_boolean;
		//	table[(T_int<<4)+T_null] 		= T_undefined;

		//	table[(T_null<<4)+T_undefined] 		= T_undefined;
		//	table[(T_null<<4)+T_byte] 			= T_undefined;
		//	table[(T_null<<4)+T_long] 			= T_undefined;
		//	table[(T_null<<4)+T_short] 			= T_undefined;
		//	table[(T_null<<4)+T_void] 			= T_undefined;
		//	table[(T_null<<4)+T_String] 		= T_undefined;
		//	table[(T_null<<4)+T_Object] 		= T_undefined;
		//	table[(T_null<<4)+T_double] 		= T_undefined;
		//	table[(T_null<<4)+T_float] 			= T_undefined;
		//	table[(T_null<<4)+T_boolean] 		= T_undefined;
		//	table[(T_null<<4)+T_char] 			= T_undefined;
		//	table[(T_null<<4)+T_int] 			= T_undefined;
		//	table[(T_null<<4)+T_null] 			= T_undefined;

		return table;
	}

	public static final int[] get_LESS_EQUAL(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		//	int[] table  = new int[16*16];
		return get_LESS();
	}

	public static final int[] get_MINUS(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		int[] table = get_PLUS().clone();

		// customization
		table[(T_JavaLangString<<4)+T_byte] 		= T_undefined;
		table[(T_JavaLangString<<4)+T_long] 		= T_undefined;
		table[(T_JavaLangString<<4)+T_short] 		= T_undefined;
		table[(T_JavaLangString<<4)+T_void] 		= T_undefined;
		table[(T_JavaLangString<<4)+T_JavaLangString] 		= T_undefined;
		table[(T_JavaLangString<<4)+T_JavaLangObject] 		= T_undefined;
		table[(T_JavaLangString<<4)+T_double] 		= T_undefined;
		table[(T_JavaLangString<<4)+T_float] 		= T_undefined;
		table[(T_JavaLangString<<4)+T_boolean] 		= T_undefined;
		table[(T_JavaLangString<<4)+T_char] 		= T_undefined;
		table[(T_JavaLangString<<4)+T_int] 			= T_undefined;
		table[(T_JavaLangString<<4)+T_null] 		= T_undefined;

		table[(T_byte<<4)	+T_JavaLangString] 		= T_undefined;
		table[(T_long<<4)	+T_JavaLangString] 		= T_undefined;
		table[(T_short<<4)	+T_JavaLangString] 		= T_undefined;
		table[(T_void<<4)	+T_JavaLangString] 		= T_undefined;
		table[(T_JavaLangObject<<4)	+T_JavaLangString] 		= T_undefined;
		table[(T_double<<4)	+T_JavaLangString] 		= T_undefined;
		table[(T_float<<4)	+T_JavaLangString] 		= T_undefined;
		table[(T_boolean<<4)+T_JavaLangString] 		= T_undefined;
		table[(T_char<<4)	+T_JavaLangString] 		= T_undefined;
		table[(T_int<<4)	+T_JavaLangString] 		= T_undefined;
		table[(T_null<<4)	+T_JavaLangString] 		= T_undefined;

		table[(T_null<<4)	+T_null] 		= T_undefined;

		return table;
	}

	public static final int[] get_MULTIPLY(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		//	int[] table  = new int[16*16];
		return get_MINUS();
	}

	public static final int[] get_OR(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4


		//	int[] table  = new int[16*16];
		return get_AND();
	}

	public static final int[] get_OR_OR(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		//	int[] table  = new int[16*16];
		return get_AND_AND();
	}

	public static final int[] get_PLUS(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		int[] table  = new int[16*16];

		//	table[(T_undefined<<4)+T_undefined] 	= T_undefined;
		//	table[(T_undefined<<4)+T_byte] 			= T_undefined;
		//	table[(T_undefined<<4)+T_long] 			= T_undefined;
		//	table[(T_undefined<<4)+T_short] 		= T_undefined;
		//	table[(T_undefined<<4)+T_void] 			= T_undefined;
		//	table[(T_undefined<<4)+T_String] 		= T_undefined;
		//	table[(T_undefined<<4)+T_Object] 		= T_undefined;
		//	table[(T_undefined<<4)+T_double] 		= T_undefined;
		//	table[(T_undefined<<4)+T_float] 		= T_undefined;
		//	table[(T_undefined<<4)+T_boolean] 		= T_undefined;
		//	table[(T_undefined<<4)+T_char] 			= T_undefined;
		//	table[(T_undefined<<4)+T_int] 			= T_undefined;
		//	table[(T_undefined<<4)+T_null] 			= T_undefined;

		//	table[(T_byte<<4)+T_undefined] 	= T_undefined;
		table[(T_byte<<4)+T_byte] 		= (Byte2Int<<12)+(Byte2Int<<4)+T_int;
		table[(T_byte<<4)+T_long] 		= (Byte2Long<<12)+(Long2Long<<4)+T_long;
		table[(T_byte<<4)+T_short] 		= (Byte2Int<<12)+(Short2Int<<4)+T_int;
		//	table[(T_byte<<4)+T_void] 		= T_undefined;
		table[(T_byte<<4)+T_JavaLangString] 	= (Byte2Byte<<12)+(String2String<<4)+T_JavaLangString;
		//	table[(T_byte<<4)+T_Object] 	= T_undefined;
		table[(T_byte<<4)+T_double] 	= (Byte2Double<<12)+(Double2Double<<4)+T_double;
		table[(T_byte<<4)+T_float] 		= (Byte2Float<<12)+(Float2Float<<4)+T_float;
		//	table[(T_byte<<4)+T_boolean] 	= T_undefined;
		table[(T_byte<<4)+T_char] 		= (Byte2Int<<12)+(Char2Int<<4)+T_int;
		table[(T_byte<<4)+T_int] 		= (Byte2Int<<12)+(Int2Int<<4)+T_int;
		//	table[(T_byte<<4)+T_null] 		= T_undefined;

		//	table[(T_long<<4)+T_undefined] 	= T_undefined;
		table[(T_long<<4)+T_byte] 		= (Long2Long<<12)+(Byte2Long<<4)+T_long;
		table[(T_long<<4)+T_long] 		= (Long2Long<<12)+(Long2Long<<4)+T_long;
		table[(T_long<<4)+T_short] 		= (Long2Long<<12)+(Short2Long<<4)+T_long;
		//	table[(T_long<<4)+T_void] 		= T_undefined;
		table[(T_long<<4)+T_JavaLangString] 	= (Long2Long<<12)+(String2String<<4)+T_JavaLangString;
		//	table[(T_long<<4)+T_Object] 	= T_undefined;
		table[(T_long<<4)+T_double] 	= (Long2Double<<12)+(Double2Double<<4)+T_double;
		table[(T_long<<4)+T_float] 		= (Long2Float<<12)+(Float2Float<<4)+T_float;
		//	table[(T_long<<4)+T_boolean] 	= T_undefined;
		table[(T_long<<4)+T_char] 		= (Long2Long<<12)+(Char2Long<<4)+T_long;
		table[(T_long<<4)+T_int] 		= (Long2Long<<12)+(Int2Long<<4)+T_long;
		//	table[(T_long<<4)+T_null] 		= T_undefined;

		//	table[(T_short<<4)+T_undefined] 	= T_undefined;
		table[(T_short<<4)+T_byte] 			= (Short2Int<<12)+(Byte2Int<<4)+T_int;
		table[(T_short<<4)+T_long] 			= (Short2Long<<12)+(Long2Long<<4)+T_long;
		table[(T_short<<4)+T_short] 		= (Short2Int<<12)+(Short2Int<<4)+T_int;
		//	table[(T_short<<4)+T_void] 			= T_undefined;
		table[(T_short<<4)+T_JavaLangString] 		= (Short2Short<<12)+(String2String<<4)+T_JavaLangString;
		//	table[(T_short<<4)+T_Object] 		= T_undefined;
		table[(T_short<<4)+T_double] 		= (Short2Double<<12)+(Double2Double<<4)+T_double;
		table[(T_short<<4)+T_float] 		= (Short2Float<<12)+(Float2Float<<4)+T_float;
		//	table[(T_short<<4)+T_boolean] 		= T_undefined;
		table[(T_short<<4)+T_char] 			= (Short2Int<<12)+(Char2Int<<4)+T_int;
		table[(T_short<<4)+T_int] 			= (Short2Int<<12)+(Int2Int<<4)+T_int;
		//	table[(T_short<<4)+T_null] 			= T_undefined;

		//	table[(T_void<<4)+T_undefined] 	= T_undefined;
		//	table[(T_void<<4)+T_byte] 		= T_undefined;
		//	table[(T_void<<4)+T_long] 		= T_undefined;
		//	table[(T_void<<4)+T_short] 		= T_undefined;
		//	table[(T_void<<4)+T_void] 		= T_undefined;
		//	table[(T_void<<4)+T_String] 	= T_undefined;
		//	table[(T_void<<4)+T_Object] 	= T_undefined;
		//	table[(T_void<<4)+T_double] 	= T_undefined;
		//	table[(T_void<<4)+T_float] 		= T_undefined;
		//	table[(T_void<<4)+T_boolean] 	= T_undefined;
		//	table[(T_void<<4)+T_char] 		= T_undefined;
		//	table[(T_void<<4)+T_int] 		= T_undefined;
		//	table[(T_void<<4)+T_null] 		= T_undefined;

		//	table[(T_String<<4)+T_undefined] 	= T_undefined;
		table[(T_JavaLangString<<4)+T_byte] 		= (String2String<<12)+(Byte2Byte<<4)+T_JavaLangString;
		table[(T_JavaLangString<<4)+T_long] 		= (String2String<<12)+(Long2Long<<4)+T_JavaLangString;
		table[(T_JavaLangString<<4)+T_short] 		= (String2String<<12)+(Short2Short<<4)+T_JavaLangString;
		//	table[(T_String<<4)+T_void] 		= T_undefined;
		table[(T_JavaLangString<<4)+T_JavaLangString] 		= (String2String<<12)+(String2String<<4)+T_JavaLangString;
		table[(T_JavaLangString<<4)+T_JavaLangObject] 		= (String2String<<12)+(Object2Object<<4)+T_JavaLangString;
		table[(T_JavaLangString<<4)+T_double] 		= (String2String<<12)+(Double2Double<<4)+T_JavaLangString;
		table[(T_JavaLangString<<4)+T_float] 		= (String2String<<12)+(Float2Float<<4)+T_JavaLangString;
		table[(T_JavaLangString<<4)+T_boolean] 		= (String2String<<12)+(Boolean2Boolean<<4)+T_JavaLangString;
		table[(T_JavaLangString<<4)+T_char] 		= (String2String<<12)+(Char2Char<<4)+T_JavaLangString;
		table[(T_JavaLangString<<4)+T_int] 			= (String2String<<12)+(Int2Int<<4)+T_JavaLangString;
		table[(T_JavaLangString<<4)+T_null] 		= (String2String<<12)+(T_null<<8)+(T_null<<4)+T_JavaLangString;

		//	table[(T_Object<<4)+T_undefined] 	= T_undefined;
		//	table[(T_Object<<4)+T_byte] 		= T_undefined;
		//	table[(T_Object<<4)+T_long] 		= T_undefined;
		//	table[(T_Object<<4)+T_short]		= T_undefined;
		//	table[(T_Object<<4)+T_void] 		= T_undefined;
		table[(T_JavaLangObject<<4)+T_JavaLangString] 		= (Object2Object<<12)+(String2String<<4)+T_JavaLangString;
		//	table[(T_Object<<4)+T_Object] 		= T_undefined;
		//	table[(T_Object<<4)+T_double] 		= T_undefined;
		//	table[(T_Object<<4)+T_float] 		= T_undefined;
		//	table[(T_Object<<4)+T_boolean]		= T_undefined;
		//	table[(T_Object<<4)+T_char] 		= T_undefined;
		//	table[(T_Object<<4)+T_int] 			= T_undefined;
		//	table[(T_Object<<4)+T_null] 		= T_undefined;

		//	table[(T_double<<4)+T_undefined] 	= T_undefined;
		table[(T_double<<4)+T_byte] 		= (Double2Double<<12)+(Byte2Double<<4)+T_double;
		table[(T_double<<4)+T_long] 		= (Double2Double<<12)+(Long2Double<<4)+T_double;
		table[(T_double<<4)+T_short] 		= (Double2Double<<12)+(Short2Double<<4)+T_double;
		//	table[(T_double<<4)+T_void] 		= T_undefined;
		table[(T_double<<4)+T_JavaLangString] 		= (Double2Double<<12)+(String2String<<4)+T_JavaLangString;
		//	table[(T_double<<4)+T_Object] 		= T_undefined;
		table[(T_double<<4)+T_double] 		= (Double2Double<<12)+(Double2Double<<4)+T_double;
		table[(T_double<<4)+T_float] 		= (Double2Double<<12)+(Float2Double<<4)+T_double;
		//	table[(T_double<<4)+T_boolean] 		= T_undefined;
		table[(T_double<<4)+T_char] 		= (Double2Double<<12)+(Char2Double<<4)+T_double;
		table[(T_double<<4)+T_int] 			= (Double2Double<<12)+(Int2Double<<4)+T_double;
		//	table[(T_double<<4)+T_null] 		= T_undefined;

		//	table[(T_float<<4)+T_undefined] 	= T_undefined;
		table[(T_float<<4)+T_byte] 			= (Float2Float<<12)+(Byte2Float<<4)+T_float;
		table[(T_float<<4)+T_long] 			= (Float2Float<<12)+(Long2Float<<4)+T_float;
		table[(T_float<<4)+T_short] 		= (Float2Float<<12)+(Short2Float<<4)+T_float;
		//	table[(T_float<<4)+T_void] 			= T_undefined;
		table[(T_float<<4)+T_JavaLangString] 		= (Float2Float<<12)+(String2String<<4)+T_JavaLangString;
		//	table[(T_float<<4)+T_Object] 		= T_undefined;
		table[(T_float<<4)+T_double] 		= (Float2Double<<12)+(Double2Double<<4)+T_double;
		table[(T_float<<4)+T_float] 		= (Float2Float<<12)+(Float2Float<<4)+T_float;
		//	table[(T_float<<4)+T_boolean] 		= T_undefined;
		table[(T_float<<4)+T_char] 			= (Float2Float<<12)+(Char2Float<<4)+T_float;
		table[(T_float<<4)+T_int] 			= (Float2Float<<12)+(Int2Float<<4)+T_float;
		//	table[(T_float<<4)+T_null] 			= T_undefined;

		//	table[(T_boolean<<4)+T_undefined] 		= T_undefined;
		//	table[(T_boolean<<4)+T_byte] 			= T_undefined;
		//	table[(T_boolean<<4)+T_long] 			= T_undefined;
		//	table[(T_boolean<<4)+T_short] 			= T_undefined;
		//	table[(T_boolean<<4)+T_void] 			= T_undefined;
		table[(T_boolean<<4)+T_JavaLangString] 			= (Boolean2Boolean<<12)+(String2String<<4)+T_JavaLangString;
		//	table[(T_boolean<<4)+T_Object] 			= T_undefined;
		//	table[(T_boolean<<4)+T_double] 			= T_undefined;
		//	table[(T_boolean<<4)+T_float] 			= T_undefined;
		//	table[(T_boolean<<4)+T_boolean] 		= T_undefined;
		//	table[(T_boolean<<4)+T_char] 			= T_undefined;
		//	table[(T_boolean<<4)+T_int] 			= T_undefined;
		//	table[(T_boolean<<4)+T_null] 			= T_undefined;

		//	table[(T_char<<4)+T_undefined] 		= T_undefined;
		table[(T_char<<4)+T_byte] 			= (Char2Int<<12)+(Byte2Int<<4)+T_int;
		table[(T_char<<4)+T_long] 			= (Char2Long<<12)+(Long2Long<<4)+T_long;
		table[(T_char<<4)+T_short] 			= (Char2Int<<12)+(Short2Int<<4)+T_int;
		//	table[(T_char<<4)+T_void] 			= T_undefined;
		table[(T_char<<4)+T_JavaLangString] 		= (Char2Char<<12)+(String2String<<4)+T_JavaLangString;
		//	table[(T_char<<4)+T_Object] 		= T_undefined;
		table[(T_char<<4)+T_double] 		= (Char2Double<<12)+(Double2Double<<4)+T_double;
		table[(T_char<<4)+T_float] 			= (Char2Float<<12)+(Float2Float<<4)+T_float;
		//	table[(T_char<<4)+T_boolean] 		= T_undefined;
		table[(T_char<<4)+T_char] 			= (Char2Int<<12)+(Char2Int<<4)+T_int;
		table[(T_char<<4)+T_int] 			= (Char2Int<<12)+(Int2Int<<4)+T_int;
		//	table[(T_char<<4)+T_null] 			= T_undefined;

		//	table[(T_int<<4)+T_undefined] 	= T_undefined;
		table[(T_int<<4)+T_byte] 		= (Int2Int<<12)+(Byte2Int<<4)+T_int;
		table[(T_int<<4)+T_long] 		= (Int2Long<<12)+(Long2Long<<4)+T_long;
		table[(T_int<<4)+T_short] 		= (Int2Int<<12)+(Short2Int<<4)+T_int;
		//	table[(T_int<<4)+T_void] 		= T_undefined;
		table[(T_int<<4)+T_JavaLangString] 		= (Int2Int<<12)+(String2String<<4)+T_JavaLangString;
		//	table[(T_int<<4)+T_Object] 		= T_undefined;
		table[(T_int<<4)+T_double] 		= (Int2Double<<12)+(Double2Double<<4)+T_double;
		table[(T_int<<4)+T_float] 		= (Int2Float<<12)+(Float2Float<<4)+T_float;
		//	table[(T_int<<4)+T_boolean] 	= T_undefined;
		table[(T_int<<4)+T_char] 		= (Int2Int<<12)+(Char2Int<<4)+T_int;
		table[(T_int<<4)+T_int] 		= (Int2Int<<12)+(Int2Int<<4)+T_int;
		//	table[(T_int<<4)+T_null] 		= T_undefined;

		//	table[(T_null<<4)+T_undefined] 		= T_undefined;
		//	table[(T_null<<4)+T_byte] 			= T_undefined;
		//	table[(T_null<<4)+T_long] 			= T_undefined;
		//	table[(T_null<<4)+T_short] 			= T_undefined;
		//	table[(T_null<<4)+T_void] 			= T_undefined;
		table[(T_null<<4)+T_JavaLangString] 		= (T_null<<16)+(T_null<<12)+(String2String<<4)+T_JavaLangString;
		//	table[(T_null<<4)+T_Object] 		= T_undefined;
		//	table[(T_null<<4)+T_double] 		= T_undefined;
		//	table[(T_null<<4)+T_float] 			= T_undefined;
		//	table[(T_null<<4)+T_boolean] 		= T_undefined;
		//	table[(T_null<<4)+T_char] 			= T_undefined;
		//	table[(T_null<<4)+T_int] 			= T_undefined;
		//	table[(T_null<<4)+T_null] 			= (Null2String<<12)+(Null2String<<4)+T_String;;

		return table;
	}

	public static final int[] get_REMAINDER(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		//	int[] table  = new int[16*16];
		return get_MINUS();
	}

	public static final int[] get_RIGHT_SHIFT(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		//	int[] table  = new int[16*16];
		return get_LEFT_SHIFT();
	}

	public static final int[] get_UNSIGNED_RIGHT_SHIFT(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		//	int[] table  = new int[16*16];
		return get_LEFT_SHIFT();
	}

	public static final int[] get_XOR(){

		//the code is an int
		// (cast)  left   Op (cast)  rigth --> result
		//  0000   0000       0000   0000      0000
		//  <<16   <<12       <<8    <<4

		//	int[] table  = new int[16*16];
		return get_AND();
	}

	public String operatorToString() {
		switch ((this.bits & OperatorMASK) >> OperatorSHIFT) {
			case EQUAL_EQUAL :
				return "=="; //$NON-NLS-1$
			case LESS_EQUAL :
				return "<="; //$NON-NLS-1$
			case GREATER_EQUAL :
				return ">="; //$NON-NLS-1$
			case NOT_EQUAL :
				return "!="; //$NON-NLS-1$
			case LEFT_SHIFT :
				return "<<"; //$NON-NLS-1$
			case RIGHT_SHIFT :
				return ">>"; //$NON-NLS-1$
			case UNSIGNED_RIGHT_SHIFT :
				return ">>>"; //$NON-NLS-1$
			case OR_OR :
				return "||"; //$NON-NLS-1$
			case AND_AND :
				return "&&"; //$NON-NLS-1$
			case PLUS :
				return "+"; //$NON-NLS-1$
			case MINUS :
				return "-"; //$NON-NLS-1$
			case NOT :
				return "!"; //$NON-NLS-1$
			case REMAINDER :
				return "%"; //$NON-NLS-1$
			case XOR :
				return "^"; //$NON-NLS-1$
			case AND :
				return "&"; //$NON-NLS-1$
			case MULTIPLY :
				return "*"; //$NON-NLS-1$
			case OR :
				return "|"; //$NON-NLS-1$
			case TWIDDLE :
				return "~"; //$NON-NLS-1$
			case DIVIDE :
				return "/"; //$NON-NLS-1$
			case GREATER :
				return ">"; //$NON-NLS-1$
			case LESS :
				return "<"; //$NON-NLS-1$
			case QUESTIONCOLON :
				return "?:"; //$NON-NLS-1$
			case EQUAL :
				return "="; //$NON-NLS-1$
		}
		return "unknown operator"; //$NON-NLS-1$
	}

	@Override
	public StringBuffer printExpression(int indent, StringBuffer output){

		output.append('(');
		return printExpressionNoParenthesis(0, output).append(')');
	}

	public abstract StringBuffer printExpressionNoParenthesis(int indent, StringBuffer output);
}
