# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Specifies the size of the assembly region in bytes
handler-style computed-goto
handler-size 64

# source for the instruction table stub
asm-stub x86-atom/stub.S

# file header, macros and definitions
import c/header.cpp
import x86-atom/header.S

# common defs for the C helper; include this before the instruction handlers
import cstubs/stubdefs.cpp
import c/opcommon.cpp

# start of opcode list; command gives default directory location of instruction files
op-start x86-atom

#op OP_ADD_DOUBLE_2ADDR c
#op OP_ADD_DOUBLE c
#op OP_ADD_FLOAT_2ADDR c
#op OP_ADD_FLOAT c
#op OP_ADD_INT_2ADDR c
#op OP_ADD_INT_LIT16 c
#op OP_ADD_INT_LIT8 c
#op OP_ADD_INT c
#op OP_ADD_LONG_2ADDR c
#op OP_ADD_LONG c
#op OP_AGET_BOOLEAN c
#op OP_AGET_BYTE c
#op OP_AGET_CHAR c
#op OP_AGET_OBJECT c
#op OP_AGET c
#op OP_AGET_SHORT c
#op OP_AGET_WIDE c
#op OP_AND_INT_2ADDR c
#op OP_AND_INT_LIT16 c
#op OP_AND_INT_LIT8 c
#op OP_AND_INT c
#op OP_AND_LONG_2ADDR c
#op OP_AND_LONG c
#op OP_APUT_BOOLEAN c
#op OP_APUT_BYTE c
#op OP_APUT_CHAR c
#op OP_APUT_OBJECT c
#op OP_APUT c
#op OP_APUT_SHORT c
#op OP_APUT_WIDE c
#op OP_ARRAY_LENGTH c
#op OP_CHECK_CAST c
#op OP_CMPG_DOUBLE c
#op OP_CMPG_FLOAT c
#op OP_CMPL_DOUBLE c
#op OP_CMPL_FLOAT c
#op OP_CMP_LONG c
#op OP_CONST_16 c
#op OP_CONST_4 c
#op OP_CONST_CLASS c
#op OP_CONST_HIGH16 c
#op OP_CONST c
#op OP_CONST_STRING_JUMBO c
#op OP_CONST_STRING c
#op OP_CONST_WIDE_16 c
#op OP_CONST_WIDE_32 c
#op OP_CONST_WIDE_HIGH16 c
#op OP_CONST_WIDE c
#op OP_DIV_DOUBLE_2ADDR c
#op OP_DIV_DOUBLE c
#op OP_DIV_FLOAT_2ADDR c
#op OP_DIV_FLOAT c
#op OP_DIV_INT_2ADDR c
#op OP_DIV_INT_LIT16 c
#op OP_DIV_INT_LIT8 c
#op OP_DIV_INT c
#op OP_DIV_LONG_2ADDR c
#op OP_DIV_LONG c
#op OP_DOUBLE_TO_FLOAT c
#op OP_DOUBLE_TO_INT c
#op OP_DOUBLE_TO_LONG c
#op OP_EXECUTE_INLINE c
#op OP_FILL_ARRAY_DATA c
#op OP_FILLED_NEW_ARRAY_RANGE c
#op OP_FILLED_NEW_ARRAY c
#op OP_FLOAT_TO_DOUBLE c
#op OP_FLOAT_TO_INT c
#op OP_FLOAT_TO_LONG c
#op OP_GOTO_16 c
#op OP_GOTO_32 c
#op OP_GOTO c
#op OP_IF_EQ c
#op OP_IF_EQZ c
#op OP_IF_GE c
#op OP_IF_GEZ c
#op OP_IF_GT c
#op OP_IF_GTZ c
#op OP_IF_LE c
#op OP_IF_LEZ c
#op OP_IF_LT c
#op OP_IF_LTZ c
#op OP_IF_NE c
#op OP_IF_NEZ c
#op OP_IGET_BOOLEAN c
#op OP_IGET_BYTE c
#op OP_IGET_CHAR c
#op OP_IGET_OBJECT_QUICK c
#op OP_IGET_OBJECT c
#op OP_IGET_QUICK c
#op OP_IGET c
#op OP_IGET_SHORT c
#op OP_IGET_WIDE_QUICK c
#op OP_IGET_WIDE c
#op OP_INSTANCE_OF c
#op OP_INT_TO_BYTE c
#op OP_INT_TO_CHAR c
#op OP_INT_TO_DOUBLE c
#op OP_INT_TO_FLOAT c
#op OP_INT_TO_LONG c
#op OP_INT_TO_SHORT c
#op OP_INVOKE_DIRECT_EMPTY c
#op OP_INVOKE_DIRECT_RANGE c
#op OP_INVOKE_DIRECT c
#op OP_INVOKE_INTERFACE_RANGE c
#op OP_INVOKE_INTERFACE c
#op OP_INVOKE_STATIC_RANGE c
#op OP_INVOKE_STATIC c
#op OP_INVOKE_SUPER_QUICK_RANGE c
#op OP_INVOKE_SUPER_QUICK c
#op OP_INVOKE_SUPER_RANGE c
#op OP_INVOKE_SUPER c
#op OP_INVOKE_VIRTUAL_QUICK_RANGE c
#op OP_INVOKE_VIRTUAL_QUICK c
#op OP_INVOKE_VIRTUAL_RANGE c
#op OP_INVOKE_VIRTUAL c
#op OP_IPUT_BOOLEAN c
#op OP_IPUT_BYTE c
#op OP_IPUT_CHAR c
#op OP_IPUT_OBJECT_QUICK c
#op OP_IPUT_OBJECT c
#op OP_IPUT_QUICK c
#op OP_IPUT c
#op OP_IPUT_SHORT c
#op OP_IPUT_WIDE_QUICK c
#op OP_IPUT_WIDE c
#op OP_LONG_TO_DOUBLE c
#op OP_LONG_TO_FLOAT c
#op OP_LONG_TO_INT c
#op OP_MONITOR_ENTER c
#op OP_MONITOR_EXIT c
#op OP_MOVE_16 c
#op OP_MOVE_EXCEPTION c
#op OP_MOVE_FROM16 c
#op OP_MOVE_OBJECT_16 c
#op OP_MOVE_OBJECT_FROM16 c
#op OP_MOVE_OBJECT c
#op OP_MOVE_RESULT_OBJECT c
#op OP_MOVE_RESULT c
#op OP_MOVE_RESULT_WIDE c
#op OP_MOVE c
#op OP_MOVE_WIDE_16 c
#op OP_MOVE_WIDE_FROM16 c
#op OP_MOVE_WIDE c
#op OP_MUL_DOUBLE_2ADDR c
#op OP_MUL_DOUBLE c
#op OP_MUL_FLOAT_2ADDR c
#op OP_MUL_FLOAT c
#op OP_MUL_INT_2ADDR c
#op OP_MUL_INT_LIT16 c
#op OP_MUL_INT_LIT8 c
#op OP_MUL_INT c
#op OP_MUL_LONG_2ADDR c
#op OP_MUL_LONG c
#op OP_NEG_DOUBLE c
#op OP_NEG_FLOAT c
#op OP_NEG_INT c
#op OP_NEG_LONG c
#op OP_NEW_ARRAY c
#op OP_NEW_INSTANCE c
#op OP_NOP c
#op OP_NOT_INT c
#op OP_NOT_LONG c
#op OP_OR_INT_2ADDR c
#op OP_OR_INT_LIT16 c
#op OP_OR_INT_LIT8 c
#op OP_OR_INT c
#op OP_OR_LONG_2ADDR c
#op OP_OR_LONG c
#op OP_PACKED_SWITCH c
#op OP_REM_DOUBLE_2ADDR c
#op OP_REM_DOUBLE c
#op OP_REM_FLOAT_2ADDR c
#op OP_REM_FLOAT c
#op OP_REM_INT_2ADDR c
#op OP_REM_INT_LIT16 c
#op OP_REM_INT_LIT8 c
#op OP_REM_INT c
#op OP_REM_LONG_2ADDR c
#op OP_REM_LONG c
#op OP_RETURN_OBJECT c
#op OP_RETURN c
#op OP_RETURN_VOID c
#op OP_RETURN_WIDE c
#op OP_RSUB_INT_LIT8 c
#op OP_RSUB_INT c
#op OP_SGET_BOOLEAN c
#op OP_SGET_BYTE c
#op OP_SGET_CHAR c
#op OP_SGET_OBJECT c
#op OP_SGET c
#op OP_SGET_SHORT c
#op OP_SGET_WIDE c
#op OP_SHL_INT_2ADDR c
#op OP_SHL_INT_LIT8 c
#op OP_SHL_INT c
#op OP_SHL_LONG_2ADDR c
#op OP_SHL_LONG c
#op OP_SHR_INT_2ADDR c
#op OP_SHR_INT_LIT8 c
#op OP_SHR_INT c
#op OP_SHR_LONG_2ADDR c
#op OP_SHR_LONG c
#op OP_SPARSE_SWITCH c
#op OP_SPUT_BOOLEAN c
#op OP_SPUT_BYTE c
#op OP_SPUT_CHAR c
#op OP_SPUT_OBJECT c
#op OP_SPUT c
#op OP_SPUT_SHORT c
#op OP_SPUT_WIDE c
#op OP_SUB_DOUBLE_2ADDR c
#op OP_SUB_DOUBLE c
#op OP_SUB_FLOAT_2ADDR c
#op OP_SUB_FLOAT c
#op OP_SUB_INT_2ADDR c
#op OP_SUB_INT c
#op OP_SUB_LONG_2ADDR c
#op OP_SUB_LONG c
#op OP_THROW c
#op OP_UNUSED_3E c
#op OP_UNUSED_3F c
#op OP_UNUSED_40 c
#op OP_UNUSED_41 c
#op OP_UNUSED_42 c
#op OP_UNUSED_43 c
#op OP_UNUSED_73 c
#op OP_UNUSED_79 c
#op OP_UNUSED_7A c
#op OP_UNUSED_F1 c
#op OP_UNUSED_FC c
#op OP_UNUSED_FD c
#op OP_UNUSED_FE c
#op OP_UNUSED_FF c
#op OP_USHR_INT_2ADDR c
#op OP_USHR_INT_LIT8 c
#op OP_USHR_INT c
#op OP_USHR_LONG_2ADDR c
#op OP_USHR_LONG c
#op OP_XOR_INT_2ADDR c
#op OP_XOR_INT_LIT16 c
#op OP_XOR_INT_LIT8 c
#op OP_XOR_INT c
#op OP_XOR_LONG_2ADDR c
#op OP_XOR_LONG c

# TODO: provide native implementations
op OP_BREAKPOINT c
op OP_EXECUTE_INLINE_RANGE c
op OP_IGET_VOLATILE c
op OP_IPUT_VOLATILE c
op OP_SGET_VOLATILE c
op OP_SPUT_VOLATILE c
op OP_IGET_OBJECT_VOLATILE c
op OP_IPUT_OBJECT_VOLATILE c
op OP_SGET_OBJECT_VOLATILE c
op OP_SPUT_OBJECT_VOLATILE c
op OP_IGET_WIDE_VOLATILE c
op OP_IPUT_WIDE_VOLATILE c
op OP_SGET_WIDE_VOLATILE c
op OP_SPUT_WIDE_VOLATILE c
op OP_RETURN_VOID_BARRIER c
op OP_INVOKE_OBJECT_INIT_RANGE c

op-end

# arch-specific entry point to interpreter
import x86-atom/entry.S

# "helper" code for C; include this after the instruction handlers
import c/gotoTargets.cpp
import cstubs/enddefs.cpp

# common subroutines for asm
import x86-atom/footer.S