/*
 * Copyright (C) 2008, 2009, 2013 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 "LLIntOpcode.h"

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

#include <wtf/Assertions.h>

namespace JSC {

#define FOR_EACH_CORE_OPCODE_ID_WITH_EXTENSION(macro, extension__) \
    macro(op_enter, 1) \
    macro(op_create_activation, 2) \
    macro(op_init_lazy_reg, 2) \
    macro(op_create_arguments, 2) \
    macro(op_create_this, 4) \
    macro(op_get_callee, 3) \
    macro(op_to_this, 3) \
    \
    macro(op_new_object, 4) \
    macro(op_new_array, 5) \
    macro(op_new_array_with_size, 4) \
    macro(op_new_array_buffer, 5) \
    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_greater, 4) \
    macro(op_greatereq, 4) \
    \
    macro(op_inc, 2) \
    macro(op_dec, 2) \
    macro(op_to_number, 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_check_has_instance, 5) \
    macro(op_instanceof, 4) \
    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_get_scoped_var, 5) /* has value profiling */ \
    macro(op_put_scoped_var, 4) \
    \
    macro(op_resolve, 5) /* has value profiling */  \
    macro(op_resolve_global_property, 5) /* has value profiling */  \
    macro(op_resolve_global_var, 5) /* has value profiling */  \
    macro(op_resolve_scoped_var, 5) /* has value profiling */  \
    macro(op_resolve_scoped_var_on_top_scope, 5) /* has value profiling */  \
    macro(op_resolve_scoped_var_with_top_scope_check, 5) /* has value profiling */  \
    \
    macro(op_resolve_base_to_global, 7) /* has value profiling */ \
    macro(op_resolve_base_to_global_dynamic, 7) /* has value profiling */ \
    macro(op_resolve_base_to_scope, 7) /* has value profiling */ \
    macro(op_resolve_base_to_scope_with_top_scope_check, 7) /* has value profiling */ \
    macro(op_resolve_base, 7) /* has value profiling */ \
    \
    macro(op_resolve_with_base, 7) /* has value profiling */ \
    \
    macro(op_resolve_with_this, 6) /* has value profiling */ \
    \
    macro(op_put_to_base, 5) \
    macro(op_put_to_base_variable, 5) \
    \
    macro(op_init_global_const_nop, 5) \
    macro(op_init_global_const, 5) \
    macro(op_init_global_const_check, 5) \
    macro(op_get_by_id, 9) /* has value profiling */ \
    macro(op_get_by_id_out_of_line, 9) /* has value profiling */ \
    macro(op_get_by_id_self, 9) /* has value profiling */ \
    macro(op_get_by_id_proto, 9) /* has value profiling */ \
    macro(op_get_by_id_chain, 9) /* has value profiling */ \
    macro(op_get_by_id_getter_self, 9) /* has value profiling */ \
    macro(op_get_by_id_getter_proto, 9) /* has value profiling */ \
    macro(op_get_by_id_getter_chain, 9) /* has value profiling */ \
    macro(op_get_by_id_custom_self, 9) /* has value profiling */ \
    macro(op_get_by_id_custom_proto, 9) /* has value profiling */ \
    macro(op_get_by_id_custom_chain, 9) /* has value profiling */ \
    macro(op_get_by_id_generic, 9) /* has value profiling */ \
    macro(op_get_array_length, 9) /* has value profiling */ \
    macro(op_get_string_length, 9) /* has value profiling */ \
    macro(op_get_arguments_length, 4) \
    macro(op_put_by_id, 9) \
    macro(op_put_by_id_out_of_line, 9) \
    macro(op_put_by_id_transition, 9) \
    macro(op_put_by_id_transition_direct, 9) \
    macro(op_put_by_id_transition_direct_out_of_line, 9) \
    macro(op_put_by_id_transition_normal, 9) \
    macro(op_put_by_id_transition_normal_out_of_line, 9) \
    macro(op_put_by_id_replace, 9) \
    macro(op_put_by_id_generic, 9) \
    macro(op_del_by_id, 4) \
    macro(op_get_by_val, 6) /* has value profiling */ \
    macro(op_get_argument_by_val, 6) /* must be the same size as op_get_by_val */ \
    macro(op_get_by_pname, 7) \
    macro(op_put_by_val, 5) \
    macro(op_del_by_val, 4) \
    macro(op_put_by_index, 4) \
    macro(op_put_getter_setter, 5) \
    \
    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_jless, 4) \
    macro(op_jlesseq, 4) \
    macro(op_jgreater, 4) \
    macro(op_jgreatereq, 4) \
    macro(op_jnless, 4) \
    macro(op_jnlesseq, 4) \
    macro(op_jngreater, 4) \
    macro(op_jngreatereq, 4) \
    \
    macro(op_loop_hint, 1) \
    \
    macro(op_switch_imm, 4) \
    macro(op_switch_char, 4) \
    macro(op_switch_string, 4) \
    \
    macro(op_new_func, 4) \
    macro(op_new_func_exp, 3) \
    macro(op_call, 6) \
    macro(op_call_eval, 6) \
    macro(op_call_varargs, 6) \
    macro(op_tear_off_activation, 2) \
    macro(op_tear_off_arguments, 3) \
    macro(op_ret, 2) \
    macro(op_call_put_result, 3) /* has value profiling */ \
    macro(op_ret_object_or_this, 3) \
    \
    macro(op_construct, 6) \
    macro(op_strcat, 4) \
    macro(op_to_primitive, 3) \
    \
    macro(op_get_pnames, 6) \
    macro(op_next_pname, 7) \
    \
    macro(op_push_with_scope, 2) \
    macro(op_pop_scope, 1) \
    macro(op_push_name_scope, 4) \
    \
    macro(op_catch, 2) \
    macro(op_throw, 2) \
    macro(op_throw_static_error, 3) \
    \
    macro(op_debug, 5) \
    macro(op_profile_will_call, 2) \
    macro(op_profile_did_call, 2) \
    \
    extension__ \
    \
    macro(op_end, 2) // end must be the last opcode in the list

#define FOR_EACH_CORE_OPCODE_ID(macro) \
    FOR_EACH_CORE_OPCODE_ID_WITH_EXTENSION(macro, /* No extension */ )

#define FOR_EACH_OPCODE_ID(macro) \
    FOR_EACH_CORE_OPCODE_ID_WITH_EXTENSION( \
        macro, \
        FOR_EACH_LLINT_OPCODE_EXTENSION(macro) \
    )


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

const int maxOpcodeLength = 9;
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 ENABLE(COMPUTED_GOTO_OPCODES)
typedef void* Opcode;
#else
typedef OpcodeID Opcode;
#endif

#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

#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

inline size_t opcodeLength(OpcodeID opcode)
{
    switch (opcode) {
#define OPCODE_ID_LENGTHS(id, length) case id: return OPCODE_LENGTH(id);
         FOR_EACH_OPCODE_ID(OPCODE_ID_LENGTHS)
#undef OPCODE_ID_LENGTHS
    }
    RELEASE_ASSERT_NOT_REACHED();
    return 0;
}

} // namespace JSC

#endif // Opcode_h
