/*
 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
 * Copyright (C) 2008 Cameron Zwarich <cwzwarich@uwaterloo.ca>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
 *     its contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef Opcode_h
#define Opcode_h

#include <algorithm>
#include <string.h>

#include <wtf/Assertions.h>

namespace JSC {

    #define FOR_EACH_OPCODE_ID(macro) \
        macro(op_enter, 1) \
        macro(op_enter_with_activation, 2) \
        macro(op_init_arguments, 1) \
        macro(op_create_arguments, 1) \
        macro(op_convert_this, 2) \
        \
        macro(op_new_object, 2) \
        macro(op_new_array, 4) \
        macro(op_new_regexp, 3) \
        macro(op_mov, 3) \
        \
        macro(op_not, 3) \
        macro(op_eq, 4) \
        macro(op_eq_null, 3) \
        macro(op_neq, 4) \
        macro(op_neq_null, 3) \
        macro(op_stricteq, 4) \
        macro(op_nstricteq, 4) \
        macro(op_less, 4) \
        macro(op_lesseq, 4) \
        \
        macro(op_pre_inc, 2) \
        macro(op_pre_dec, 2) \
        macro(op_post_inc, 3) \
        macro(op_post_dec, 3) \
        macro(op_to_jsnumber, 3) \
        macro(op_negate, 3) \
        macro(op_add, 5) \
        macro(op_mul, 5) \
        macro(op_div, 5) \
        macro(op_mod, 4) \
        macro(op_sub, 5) \
        \
        macro(op_lshift, 4) \
        macro(op_rshift, 4) \
        macro(op_urshift, 4) \
        macro(op_bitand, 5) \
        macro(op_bitxor, 5) \
        macro(op_bitor, 5) \
        macro(op_bitnot, 3) \
        \
        macro(op_instanceof, 5) \
        macro(op_typeof, 3) \
        macro(op_is_undefined, 3) \
        macro(op_is_boolean, 3) \
        macro(op_is_number, 3) \
        macro(op_is_string, 3) \
        macro(op_is_object, 3) \
        macro(op_is_function, 3) \
        macro(op_in, 4) \
        \
        macro(op_resolve, 3) \
        macro(op_resolve_skip, 4) \
        macro(op_resolve_global, 6) \
        macro(op_get_scoped_var, 4) \
        macro(op_put_scoped_var, 4) \
        macro(op_get_global_var, 4) \
        macro(op_put_global_var, 4) \
        macro(op_resolve_base, 3) \
        macro(op_resolve_with_base, 4) \
        macro(op_get_by_id, 8) \
        macro(op_get_by_id_self, 8) \
        macro(op_get_by_id_self_list, 8) \
        macro(op_get_by_id_proto, 8) \
        macro(op_get_by_id_proto_list, 8) \
        macro(op_get_by_id_chain, 8) \
        macro(op_get_by_id_generic, 8) \
        macro(op_get_array_length, 8) \
        macro(op_get_string_length, 8) \
        macro(op_put_by_id, 8) \
        macro(op_put_by_id_transition, 8) \
        macro(op_put_by_id_replace, 8) \
        macro(op_put_by_id_generic, 8) \
        macro(op_del_by_id, 4) \
        macro(op_get_by_val, 4) \
        macro(op_put_by_val, 4) \
        macro(op_del_by_val, 4) \
        macro(op_put_by_index, 4) \
        macro(op_put_getter, 4) \
        macro(op_put_setter, 4) \
        \
        macro(op_jmp, 2) \
        macro(op_jtrue, 3) \
        macro(op_jfalse, 3) \
        macro(op_jeq_null, 3) \
        macro(op_jneq_null, 3) \
        macro(op_jneq_ptr, 4) \
        macro(op_jnless, 4) \
        macro(op_jnlesseq, 4) \
        macro(op_jmp_scopes, 3) \
        macro(op_loop, 2) \
        macro(op_loop_if_true, 3) \
        macro(op_loop_if_less, 4) \
        macro(op_loop_if_lesseq, 4) \
        macro(op_switch_imm, 4) \
        macro(op_switch_char, 4) \
        macro(op_switch_string, 4) \
        \
        macro(op_new_func, 3) \
        macro(op_new_func_exp, 3) \
        macro(op_call, 5) \
        macro(op_call_eval, 5) \
        macro(op_call_varargs, 5) \
        macro(op_load_varargs, 3) \
        macro(op_tear_off_activation, 2) \
        macro(op_tear_off_arguments, 1) \
        macro(op_ret, 2) \
        macro(op_method_check, 1) \
        \
        macro(op_construct, 7) \
        macro(op_construct_verify, 3) \
        macro(op_strcat, 4) \
        macro(op_to_primitive, 3) \
        \
        macro(op_get_pnames, 3) \
        macro(op_next_pname, 4) \
        \
        macro(op_push_scope, 2) \
        macro(op_pop_scope, 1) \
        macro(op_push_new_scope, 4) \
        \
        macro(op_catch, 2) \
        macro(op_throw, 2) \
        macro(op_new_error, 4) \
        \
        macro(op_jsr, 3) \
        macro(op_sret, 2) \
        \
        macro(op_debug, 4) \
        macro(op_profile_will_call, 2) \
        macro(op_profile_did_call, 2) \
        \
        macro(op_end, 2) // end must be the last opcode in the list

    #define OPCODE_ID_ENUM(opcode, length) opcode,
        typedef enum { FOR_EACH_OPCODE_ID(OPCODE_ID_ENUM) } OpcodeID;
    #undef OPCODE_ID_ENUM

    const int numOpcodeIDs = op_end + 1;

    #define OPCODE_ID_LENGTHS(id, length) const int id##_length = length;
         FOR_EACH_OPCODE_ID(OPCODE_ID_LENGTHS);
    #undef OPCODE_ID_LENGTHS
    
    #define OPCODE_LENGTH(opcode) opcode##_length

    #define OPCODE_ID_LENGTH_MAP(opcode, length) length,
        const int opcodeLengths[numOpcodeIDs] = { FOR_EACH_OPCODE_ID(OPCODE_ID_LENGTH_MAP) };
    #undef OPCODE_ID_LENGTH_MAP

    #define VERIFY_OPCODE_ID(id, size) COMPILE_ASSERT(id <= op_end, ASSERT_THAT_JS_OPCODE_IDS_ARE_VALID);
        FOR_EACH_OPCODE_ID(VERIFY_OPCODE_ID);
    #undef VERIFY_OPCODE_ID

#if HAVE(COMPUTED_GOTO)
    typedef void* Opcode;
#else
    typedef OpcodeID Opcode;
#endif

#if ENABLE(OPCODE_SAMPLING) || ENABLE(CODEBLOCK_SAMPLING) || ENABLE(OPCODE_STATS)

#define PADDING_STRING "                                "
#define PADDING_STRING_LENGTH static_cast<unsigned>(strlen(PADDING_STRING))

    extern const char* const opcodeNames[];

    inline const char* padOpcodeName(OpcodeID op, unsigned width)
    {
        unsigned pad = width - strlen(opcodeNames[op]);
        pad = std::min(pad, PADDING_STRING_LENGTH);
        return PADDING_STRING + PADDING_STRING_LENGTH - pad;
    }

#undef PADDING_STRING_LENGTH
#undef PADDING_STRING

#endif

#if ENABLE(OPCODE_STATS)

    struct OpcodeStats {
        OpcodeStats();
        ~OpcodeStats();
        static long long opcodeCounts[numOpcodeIDs];
        static long long opcodePairCounts[numOpcodeIDs][numOpcodeIDs];
        static int lastOpcode;

        static void recordInstruction(int opcode);
        static void resetLastInstruction();
    };

#endif

} // namespace JSC

#endif // Opcode_h
