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