brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 0e3d399 Raw
66 lines · plain
1//===-- aeabi_fcmp.S - EABI fcmp* implementation ---------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "../assembly.h"10 11// int __aeabi_fcmp{eq,lt,le,ge,gt}(float a, float b) {12//   int result = __{eq,lt,le,ge,gt}sf2(a, b);13//   if (result {==,<,<=,>=,>} 0) {14//     return 1;15//   } else {16//     return 0;17//   }18// }19 20#if defined(COMPILER_RT_ARMHF_TARGET)21#  define CONVERT_FCMP_ARGS_TO_SF2_ARGS                    \22        vmov      s0, r0                         SEPARATOR \23        vmov      s1, r124#else25#  define CONVERT_FCMP_ARGS_TO_SF2_ARGS26#endif27 28#if defined(__ARM_FEATURE_PAC_DEFAULT)29#  define PROLOGUE PACBTI_LANDING        SEPARATOR \30                   push      { r12, lr }31#  define EPILOGUE pop       { r12, lr } SEPARATOR \32                   PAC_RETURN33#elif defined(__ARM_FEATURE_BTI_DEFAULT)34#  define PROLOGUE PACBTI_LANDING        SEPARATOR \35                   push      { r4, lr }36#  define EPILOGUE pop       { r4, pc }37#else38#  define PROLOGUE push      { r4, lr }39#  define EPILOGUE pop       { r4, pc }40#endif41 42#define DEFINE_AEABI_FCMP(cond)                            \43        .syntax unified                          SEPARATOR \44        .p2align 2                               SEPARATOR \45DEFINE_COMPILERRT_FUNCTION(__aeabi_fcmp ## cond)           \46        PROLOGUE                                 SEPARATOR \47        CONVERT_FCMP_ARGS_TO_SF2_ARGS            SEPARATOR \48        bl        SYMBOL_NAME(__ ## cond ## sf2) SEPARATOR \49        cmp       r0, #0                         SEPARATOR \50        b ## cond 1f                             SEPARATOR \51        movs      r0, #0                         SEPARATOR \52        EPILOGUE                                 SEPARATOR \531:                                               SEPARATOR \54        movs      r0, #1                         SEPARATOR \55        EPILOGUE                                 SEPARATOR \56END_COMPILERRT_FUNCTION(__aeabi_fcmp ## cond)57 58DEFINE_AEABI_FCMP(eq)59DEFINE_AEABI_FCMP(lt)60DEFINE_AEABI_FCMP(le)61DEFINE_AEABI_FCMP(ge)62DEFINE_AEABI_FCMP(gt)63 64NO_EXEC_STACK_DIRECTIVE65 66