/*
 * Copyright (C) 2011 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.
 */

#ifndef ART_SRC_RUNTIME_SUPPORT_H_
#define ART_SRC_RUNTIME_SUPPORT_H_

#include "class_linker.h"
#include "object.h"
#include "thread_list.h"
#include "utils.h"

namespace art {

extern void CheckSuspendFromCode(Thread* thread);
extern Array* CheckAndAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t component_count,
                                         Thread* self, bool access_check);
extern void DebugMe(Method* method, uint32_t info);
extern void UpdateDebuggerFromCode(Method* method, Thread* thread , int32_t dex_pc, Method** sp);
extern Object* DecodeJObjectInThread(Thread* thread, jobject obj);
extern Field* FindFieldFromCode(uint32_t field_idx, const Method* referrer, Thread* self,
                                bool is_static, bool is_primitive, bool is_set, size_t expected_size);
extern void* FindNativeMethod(Thread* thread);
extern void ThrowAbstractMethodErrorFromCode(Method* method, Thread* thread, Method** sp);
const void* UnresolvedDirectMethodTrampolineFromCode(Method*, Method**, Thread*,
                                                     Runtime::TrampolineType);
extern Class* ResolveVerifyAndClinit(uint32_t type_idx, const Method* referrer, Thread* self,
                                     bool can_run_clinit, bool verify_access);
extern Class* InitializeTypeFromCode(uint32_t type_idx, Method* method);
uint32_t IsAssignableFromCode(const Class* klass, const Class* ref_class);
void ObjectInitFromCode(Object* o);
extern void LockObjectFromCode(Thread* thread, Object* obj);
uint32_t artTraceMethodUnwindFromCode(Thread* self);
extern int64_t D2L(double d);
extern int64_t F2L(float f);

}  // namespace art
/* Helper for both JNI and regular compiled code */
extern "C" void art_deliver_exception_from_code(void*);

extern "C" void art_proxy_invoke_handler();

#if defined(__arm__)
  /* Compiler helpers */
  extern "C" int32_t art_get32_static_from_code(uint32_t);
  extern "C" int64_t art_get64_static_from_code(uint32_t);
  extern "C" void* art_get_obj_static_from_code(uint32_t);
  extern "C" int32_t art_get32_instance_from_code(uint32_t, void*);
  extern "C" int64_t art_get64_instance_from_code(uint32_t, void*);
  extern "C" void* art_get_obj_instance_from_code(uint32_t, void*);
  extern "C" int art_set32_static_from_code(uint32_t, int32_t);
  extern "C" int art_set64_static_from_code(uint32_t, int64_t);
  extern "C" int art_set_obj_static_from_code(uint32_t, void*);
  extern "C" int art_set32_instance_from_code(uint32_t, void*, int32_t);
  extern "C" int art_set64_instance_from_code(uint32_t, void*, int64_t);
  extern "C" int art_set_obj_instance_from_code(uint32_t, void*, void*);
  extern "C" void art_can_put_array_element_from_code(void*, void*);
  extern "C" void art_check_cast_from_code(void*, void*);
  extern "C" void art_do_long_jump(uint32_t*, uint32_t*);
  extern "C" void art_handle_fill_data_from_code(void*, void*);
  extern "C" void art_invoke_direct_trampoline_with_access_check(uint32_t, void*);
  extern "C" void art_invoke_interface_trampoline(uint32_t, void*);
  extern "C" void art_invoke_interface_trampoline_with_access_check(uint32_t, void*);
  extern "C" void art_invoke_static_trampoline_with_access_check(uint32_t, void*);
  extern "C" void art_invoke_super_trampoline_with_access_check(uint32_t, void*);
  extern "C" void art_invoke_virtual_trampoline_with_access_check(uint32_t, void*);
  extern "C" void art_lock_object_from_code(void*);
  extern "C" void art_test_suspend();
  extern "C" void art_throw_array_bounds_from_code(int32_t index, int32_t limit);
  extern "C" void art_throw_div_zero_from_code();
  extern "C" void art_throw_neg_array_size_from_code(int32_t size);
  extern "C" void art_throw_no_such_method_from_code(int32_t method_idx);
  extern "C" void art_throw_null_pointer_exception_from_code();
  extern "C" void art_throw_stack_overflow_from_code(void*);
  extern "C" void art_throw_verification_error_from_code(int32_t src1, int32_t ref);
  extern "C" void art_unlock_object_from_code(void*);
  extern "C" void* art_alloc_array_from_code(uint32_t, void*, int32_t);
  extern "C" void* art_alloc_array_from_code_with_access_check(uint32_t, void*, int32_t);
  extern "C" void* art_alloc_object_from_code(uint32_t type_idx, void* method);
  extern "C" void* art_alloc_object_from_code_with_access_check(uint32_t type_idx, void* method);
  extern "C" void* art_check_and_alloc_array_from_code(uint32_t, void*, int32_t);
  extern "C" void* art_check_and_alloc_array_from_code_with_access_check(uint32_t, void*, int32_t);
  extern "C" void* art_initialize_static_storage_from_code(uint32_t, void*);
  extern "C" void* art_initialize_type_from_code(uint32_t, void*);
  extern "C" void* art_initialize_type_and_verify_access_from_code(uint32_t, void*);
  extern "C" void art_trace_entry_from_code(void*);
  extern "C" void art_trace_exit_from_code();
  extern "C" void* art_resolve_string_from_code(void*, uint32_t);
  extern "C" void art_update_debugger(void*, void*, int32_t, void*);
  extern "C" void art_work_around_app_jni_bugs();

  /* Conversions */
  extern "C" float __aeabi_i2f(int op1);             // INT_TO_FLOAT
  extern "C" int __aeabi_f2iz(float op1);            // FLOAT_TO_INT
  extern "C" float __aeabi_d2f(double op1);          // DOUBLE_TO_FLOAT
  extern "C" double __aeabi_f2d(float op1);          // FLOAT_TO_DOUBLE
  extern "C" double __aeabi_i2d(int op1);            // INT_TO_DOUBLE
  extern "C" int __aeabi_d2iz(double op1);           // DOUBLE_TO_INT
  extern "C" float __aeabi_l2f(long op1);            // LONG_TO_FLOAT
  extern "C" double __aeabi_l2d(long op1);           // LONG_TO_DOUBLE

  /* Single-precision FP arithmetics */
  extern "C" float __aeabi_fadd(float a, float b);   // ADD_FLOAT[_2ADDR]
  extern "C" float __aeabi_fsub(float a, float b);   // SUB_FLOAT[_2ADDR]
  extern "C" float __aeabi_fdiv(float a, float b);   // DIV_FLOAT[_2ADDR]
  extern "C" float __aeabi_fmul(float a, float b);   // MUL_FLOAT[_2ADDR]
  extern "C" float fmodf(float a, float b);          // REM_FLOAT[_2ADDR]

  /* Double-precision FP arithmetics */
  extern "C" double __aeabi_dadd(double a, double b); // ADD_DOUBLE[_2ADDR]
  extern "C" double __aeabi_dsub(double a, double b); // SUB_DOUBLE[_2ADDR]
  extern "C" double __aeabi_ddiv(double a, double b); // DIV_DOUBLE[_2ADDR]
  extern "C" double __aeabi_dmul(double a, double b); // MUL_DOUBLE[_2ADDR]
  extern "C" double fmod(double a, double b);         // REM_DOUBLE[_2ADDR]

  /* Integer arithmetics */
  extern "C" int __aeabi_idivmod(int op1, int op2);  // REM_INT[_2ADDR|_LIT8|_LIT16]
  extern "C" int __aeabi_idiv(int op1, int op2);     // DIV_INT[_2ADDR|_LIT8|_LIT16]

  /* Long long arithmetics - REM_LONG[_2ADDR] and DIV_LONG[_2ADDR] */
  extern "C" long long __aeabi_ldivmod(long long op1, long long op2);
  extern "C" long long __aeabi_lmul(long long op1, long long op2);
  extern "C" uint64_t art_shl_long(uint64_t, uint32_t);
  extern "C" uint64_t art_shr_long(uint64_t, uint32_t);
  extern "C" uint64_t art_ushr_long(uint64_t, uint32_t);

#endif

#if defined(__mips__)
  /* Conversions */
  extern "C" float __floatsisf(int op1);             // INT_TO_FLOAT
  extern "C" int __fixsfsi(float op1);               // FLOAT_TO_INT
  extern "C" float __truncdfsf2(double op1);         // DOUBLE_TO_FLOAT
  extern "C" double __extendsfdf2(float op1);        // FLOAT_TO_DOUBLE
  extern "C" double __floatsidf(int op1);            // INT_TO_DOUBLE
  extern "C" int __fixdfsi(double op1);              // DOUBLE_TO_INT
  extern "C" float __floatdisf(long long op1);       // LONG_TO_FLOAT
  extern "C" double __floatdidf(long long op1);      // LONG_TO_DOUBLE
  extern "C" long long __fixsfdi(float op1);         // FLOAT_TO_LONG
  extern "C" long long __fixdfdi(double op1);        // DOUBLE_TO_LONG

  /* Single-precision FP arithmetics */
  extern "C" float __addsf3(float a, float b);   // ADD_FLOAT[_2ADDR]
  extern "C" float __subsf3(float a, float b);   // SUB_FLOAT[_2ADDR]
  extern "C" float __divsf3(float a, float b);   // DIV_FLOAT[_2ADDR]
  extern "C" float __mulsf3(float a, float b);   // MUL_FLOAT[_2ADDR]
  extern "C" float fmodf(float a, float b);      // REM_FLOAT[_2ADDR]

  /* Double-precision FP arithmetics */
  extern "C" double __adddf3(double a, double b); // ADD_DOUBLE[_2ADDR]
  extern "C" double __subdf3(double a, double b); // SUB_DOUBLE[_2ADDR]
  extern "C" double __divdf3(double a, double b); // DIV_DOUBLE[_2ADDR]
  extern "C" double __muldf3(double a, double b); // MUL_DOUBLE[_2ADDR]
  extern "C" double fmod(double a, double b);     // REM_DOUBLE[_2ADDR]

  /* Long long arithmetics - REM_LONG[_2ADDR] and DIV_LONG[_2ADDR] */
  extern "C" long long __divdi3(long long op1, long long op2);
  extern "C" long long __moddi3(long long op1, long long op2);

  /* Float and double comparison */
  extern "C" int art_cmpl_float(float a, float b);
  extern "C" int art_cmpl_double(double a, double b);
  extern "C" int art_cmpg_float(float a, float b);
  extern "C" int art_cmpg_double(double a, double b);
#endif

#endif  // ART_SRC_RUNTIME_SUPPORT_H_
