/*
 * Copyright 2010, 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.
 */

#ifdef USE_VFP_RUNTIME
#   define DEF_GENERIC_OR_VFP_RUNTIME(func) DEF_VFP_RUNTIME(func)
#   define DEF_LLVM_OR_VFP_RUNTIME(func) DEF_VFP_RUNTIME(func)
#else
#   undef DEF_VFP_RUNTIME
#   define DEF_VFP_RUNTIME(func)
#   define DEF_GENERIC_OR_VFP_RUNTIME(func) DEF_GENERIC_RUNTIME(func)
#   define DEF_LLVM_OR_VFP_RUNTIME(func) DEF_LLVM_RUNTIME(func)
#endif

// Sorted
DEF_LLVM_RUNTIME(__absvdi2)
DEF_LLVM_RUNTIME(__absvsi2)

DEF_GENERIC_OR_VFP_RUNTIME(__adddf3)
DEF_GENERIC_OR_VFP_RUNTIME(__addsf3)

DEF_LLVM_RUNTIME(__addvdi3)
DEF_LLVM_RUNTIME(__addvsi3)

#if defined(__arm__)
  // ARM Runtime ABI:
  // http://infocenter.arm.com/help/topic/com.arm.doc.ihi0043c/IHI0043C_rtabi.pdf
  // See also: external/llvm/lib/Target/ARM/ARMISelLowering.cpp

  DEF_GENERIC_RUNTIME(__aeabi_d2f)
  DEF_GENERIC_RUNTIME(__aeabi_d2iz)
  DEF_GENERIC_RUNTIME(__aeabi_d2lz)
  DEF_GENERIC_RUNTIME(__aeabi_d2uiz)
  DEF_GENERIC_RUNTIME(__aeabi_d2ulz)
  DEF_GENERIC_RUNTIME(__aeabi_dadd)
  DEF_GENERIC_RUNTIME(__aeabi_dcmpeq)
  DEF_GENERIC_RUNTIME(__aeabi_dcmpge)
  DEF_GENERIC_RUNTIME(__aeabi_dcmpgt)
  DEF_GENERIC_RUNTIME(__aeabi_dcmple)
  DEF_GENERIC_RUNTIME(__aeabi_dcmplt)
  DEF_GENERIC_RUNTIME(__aeabi_dcmpun)
  DEF_GENERIC_RUNTIME(__aeabi_ddiv)
  DEF_GENERIC_RUNTIME(__aeabi_dmul)
  DEF_GENERIC_RUNTIME(__aeabi_dsub)
  DEF_GENERIC_RUNTIME(__aeabi_f2d)
  DEF_GENERIC_RUNTIME(__aeabi_f2iz)
  DEF_GENERIC_RUNTIME(__aeabi_f2lz)
  DEF_GENERIC_RUNTIME(__aeabi_f2uiz)
  DEF_GENERIC_RUNTIME(__aeabi_f2ulz)
  DEF_GENERIC_RUNTIME(__aeabi_fadd)
  DEF_GENERIC_RUNTIME(__aeabi_fcmpeq)
  DEF_GENERIC_RUNTIME(__aeabi_fcmpge)
  DEF_GENERIC_RUNTIME(__aeabi_fcmpgt)
  DEF_GENERIC_RUNTIME(__aeabi_fcmple)
  DEF_GENERIC_RUNTIME(__aeabi_fcmplt)
  DEF_GENERIC_RUNTIME(__aeabi_fcmpun)
  DEF_GENERIC_RUNTIME(__aeabi_fdiv)
  DEF_GENERIC_RUNTIME(__aeabi_fmul)
  DEF_GENERIC_RUNTIME(__aeabi_fsub)
  DEF_GENERIC_RUNTIME(__aeabi_i2d)
  DEF_GENERIC_RUNTIME(__aeabi_i2f)
  DEF_GENERIC_RUNTIME(__aeabi_idiv)
  DEF_GENERIC_RUNTIME(__aeabi_l2d)
  DEF_GENERIC_RUNTIME(__aeabi_l2f)
  DEF_GENERIC_RUNTIME(__aeabi_lasr)
  DEF_GENERIC_RUNTIME(__aeabi_ldivmod)
  DEF_GENERIC_RUNTIME(__aeabi_llsl)
  DEF_GENERIC_RUNTIME(__aeabi_llsr)
  DEF_GENERIC_RUNTIME(__aeabi_lmul)
  DEF_GENERIC_RUNTIME(__aeabi_memcpy)
  DEF_GENERIC_RUNTIME(__aeabi_memmove)
  DEF_GENERIC_RUNTIME(__aeabi_memset)
  DEF_GENERIC_RUNTIME(__aeabi_ui2d)
  DEF_GENERIC_RUNTIME(__aeabi_ui2f)
  DEF_GENERIC_RUNTIME(__aeabi_uidiv)
  DEF_GENERIC_RUNTIME(__aeabi_ul2d)
  DEF_GENERIC_RUNTIME(__aeabi_ul2f)
  DEF_GENERIC_RUNTIME(__aeabi_uldivmod)
#endif // defined(__arm__)

#if !defined(__i386__) && !defined(__SSE2__)
    DEF_LLVM_RUNTIME(__ashldi3)
#endif
#ifndef ANDROID // has one in bionic
    DEF_LLVM_RUNTIME(__ashrdi3)
#endif

#ifdef USE_VFP_RUNTIME
//    DEF_GENERIC_RUNTIME(__bswapdi2)
//    DEF_GENERIC_RUNTIME(__bswapsi2)
#endif

DEF_LLVM_RUNTIME(__clzdi2)
DEF_LLVM_RUNTIME(__clzsi2)
DEF_LLVM_RUNTIME(__cmpdi2)
DEF_LLVM_RUNTIME(__ctzdi2)
DEF_LLVM_RUNTIME(__ctzsi2)

#ifndef ANDROID // no complex extension
    DEF_LLVM_RUNTIME(__divdc3)
#endif

DEF_GENERIC_OR_VFP_RUNTIME(__divdf3)

#if !defined(__i386__)
    DEF_LLVM_RUNTIME(__divdi3)
#endif
DEF_LLVM_RUNTIME(__divsi3)

#ifndef ANDROID // no complex extension
    DEF_LLVM_RUNTIME(__divsc3)
#endif

DEF_GENERIC_OR_VFP_RUNTIME(__divsf3)

DEF_LLVM_RUNTIME(__eprintf)

DEF_GENERIC_OR_VFP_RUNTIME(__eqdf2)
DEF_GENERIC_OR_VFP_RUNTIME(__eqsf2)
DEF_GENERIC_OR_VFP_RUNTIME(__extendsfdf2)

DEF_LLVM_RUNTIME(__ffsdi2)
DEF_LLVM_RUNTIME(__fixdfdi)

DEF_GENERIC_OR_VFP_RUNTIME(__fixdfsi)

DEF_LLVM_RUNTIME(__fixsfdi)

DEF_GENERIC_OR_VFP_RUNTIME(__fixsfsi)

DEF_LLVM_RUNTIME(__fixunsdfdi)
DEF_LLVM_OR_VFP_RUNTIME(__fixunsdfsi)
DEF_LLVM_RUNTIME(__fixunssfdi)

DEF_LLVM_OR_VFP_RUNTIME(__fixunssfsi)

#if !defined(__i386__)
    DEF_LLVM_RUNTIME(__floatdidf)
    DEF_LLVM_RUNTIME(__floatdisf)
#endif

DEF_GENERIC_OR_VFP_RUNTIME(__floatsidf)
DEF_GENERIC_OR_VFP_RUNTIME(__floatsisf)

#if !defined(__i386__)
    DEF_LLVM_RUNTIME(__floatundidf)
    DEF_LLVM_RUNTIME(__floatundisf)
#endif

DEF_GENERIC_RUNTIME(__floatunsidf)
DEF_GENERIC_RUNTIME(__floatunsisf)

DEF_VFP_RUNTIME(__floatunssidf)
DEF_VFP_RUNTIME(__floatunssisf)

DEF_GENERIC_OR_VFP_RUNTIME(__gedf2)
DEF_GENERIC_OR_VFP_RUNTIME(__gesf2)
DEF_VFP_RUNTIME(__gtdf2)
DEF_VFP_RUNTIME(__gtsf2)

DEF_GENERIC_OR_VFP_RUNTIME(__ledf2)
DEF_GENERIC_OR_VFP_RUNTIME(__lesf2)

#if !defined(__i386__) && !defined(__SSE2__)
    DEF_LLVM_RUNTIME(__lshrdi3)
#endif

DEF_VFP_RUNTIME(__ltdf2)
DEF_VFP_RUNTIME(__ltsf2)

#if !defined(__i386__)
    DEF_LLVM_RUNTIME(__moddi3)
#endif
DEF_LLVM_RUNTIME(__modsi3)

#ifndef ANDROID // no complex extension
    DEF_LLVM_RUNTIME(__muldc3)
#endif

DEF_GENERIC_OR_VFP_RUNTIME(__muldf3)
#if !defined(__i386__)
    DEF_LLVM_RUNTIME(__muldi3)
#endif

#ifndef ANDROID // no complex extension
    DEF_LLVM_RUNTIME(__mulsc3)
#endif

DEF_GENERIC_OR_VFP_RUNTIME(__mulsf3)

DEF_LLVM_RUNTIME(__mulvdi3)
DEF_LLVM_RUNTIME(__mulvsi3)

DEF_VFP_RUNTIME(__nedf2)

DEF_GENERIC_OR_VFP_RUNTIME(__negdf2)

DEF_LLVM_RUNTIME(__negdi2)

DEF_GENERIC_OR_VFP_RUNTIME(__negsf2)

DEF_LLVM_RUNTIME(__negvdi2)
DEF_LLVM_RUNTIME(__negvsi2)

DEF_VFP_RUNTIME(__nesf2)

DEF_LLVM_RUNTIME(__paritydi2)
DEF_LLVM_RUNTIME(__paritysi2)
DEF_LLVM_RUNTIME(__popcountdi2)
DEF_LLVM_RUNTIME(__popcountsi2)
DEF_LLVM_RUNTIME(__powidf2)
DEF_LLVM_RUNTIME(__powisf2)

DEF_GENERIC_OR_VFP_RUNTIME(__subdf3)
DEF_GENERIC_OR_VFP_RUNTIME(__subsf3)

DEF_LLVM_RUNTIME(__subvdi3)
DEF_LLVM_RUNTIME(__subvsi3)

DEF_GENERIC_OR_VFP_RUNTIME(__truncdfsf2)

DEF_LLVM_RUNTIME(__ucmpdi2)
#if !defined(__i386__)
    DEF_LLVM_RUNTIME(__udivdi3)
#endif
DEF_LLVM_RUNTIME(__udivmoddi4)
DEF_LLVM_RUNTIME(__udivsi3)
#if !defined(__i386__)
    DEF_LLVM_RUNTIME(__umoddi3)
#endif
DEF_LLVM_RUNTIME(__umodsi3)

DEF_GENERIC_OR_VFP_RUNTIME(__unorddf2)
DEF_GENERIC_OR_VFP_RUNTIME(__unordsf2)

#undef DEF_GENERIC_RUNTIME
#undef DEF_LLVM_RUNTIME
#undef DEF_VFP_RUNTIME
#undef DEF_BCC_RUNTIME