diff options
author | Zonr Chang <zonr.xchg@gmail.com> | 2013-02-07 08:29:47 +0000 |
---|---|---|
committer | Zonr Chang <zonr.xchg@gmail.com> | 2013-02-07 08:29:47 +0000 |
commit | f1e4bceafeec4bfe2f501d6c6535da18d485bf08 (patch) | |
tree | 990b02b0b92ba60fecd95f618b1354d7b2fb0f11 | |
parent | 1d333c5a34d896f239001e3fe69a660e40d15301 (diff) | |
download | compiler-rt-f1e4bceafeec4bfe2f501d6c6535da18d485bf08.tar.gz compiler-rt-f1e4bceafeec4bfe2f501d6c6535da18d485bf08.tar.bz2 compiler-rt-f1e4bceafeec4bfe2f501d6c6535da18d485bf08.tar.xz |
Implement aeabi_{f,d}cmp*.
Special thanks to Anton for the review.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@174596 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/arm/aeabi_dcmp.S | 39 | ||||
-rw-r--r-- | lib/arm/aeabi_fcmp.S | 39 | ||||
-rw-r--r-- | lib/comparedf2.c | 2 | ||||
-rw-r--r-- | lib/comparesf2.c | 2 |
4 files changed, 82 insertions, 0 deletions
diff --git a/lib/arm/aeabi_dcmp.S b/lib/arm/aeabi_dcmp.S new file mode 100644 index 00000000..c4d07727 --- /dev/null +++ b/lib/arm/aeabi_dcmp.S @@ -0,0 +1,39 @@ +//===-- aeabi_dcmp.S - EABI dcmp* implementation ---------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "../assembly.h" + +// int __aeabi_dcmp{eq,lt,le,ge,gt}(double a, double b) { +// int result = __{eq,lt,le,ge,gt}df2(a, b); +// if (result {==,<,<=,>=,>} 0) { +// return 1; +// } else { +// return 0; +// } +// } + +#define DEFINE_AEABI_DCMP(cond) \ + .syntax unified SEPARATOR \ + .align 2 SEPARATOR \ +DEFINE_COMPILERRT_FUNCTION(__aeabi_dcmp ## cond) \ + push { r4, lr } SEPARATOR \ + bl SYMBOL_NAME(__ ## cond ## df2) SEPARATOR \ + cmp r0, #0 SEPARATOR \ + b ## cond 1f SEPARATOR \ + mov r0, #0 SEPARATOR \ + pop { r4, pc } SEPARATOR \ +1: SEPARATOR \ + mov r0, #1 SEPARATOR \ + pop { r4, pc } + +DEFINE_AEABI_DCMP(eq) +DEFINE_AEABI_DCMP(lt) +DEFINE_AEABI_DCMP(le) +DEFINE_AEABI_DCMP(ge) +DEFINE_AEABI_DCMP(gt) diff --git a/lib/arm/aeabi_fcmp.S b/lib/arm/aeabi_fcmp.S new file mode 100644 index 00000000..576a33f2 --- /dev/null +++ b/lib/arm/aeabi_fcmp.S @@ -0,0 +1,39 @@ +//===-- aeabi_fcmp.S - EABI fcmp* implementation ---------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "../assembly.h" + +// int __aeabi_fcmp{eq,lt,le,ge,gt}(float a, float b) { +// int result = __{eq,lt,le,ge,gt}sf2(a, b); +// if (result {==,<,<=,>=,>} 0) { +// return 1; +// } else { +// return 0; +// } +// } + +#define DEFINE_AEABI_FCMP(cond) \ + .syntax unified SEPARATOR \ + .align 2 SEPARATOR \ +DEFINE_COMPILERRT_FUNCTION(__aeabi_fcmp ## cond) \ + push { r4, lr } SEPARATOR \ + bl SYMBOL_NAME(__ ## cond ## sf2) SEPARATOR \ + cmp r0, #0 SEPARATOR \ + b ## cond 1f SEPARATOR \ + mov r0, #0 SEPARATOR \ + pop { r4, pc } SEPARATOR \ +1: SEPARATOR \ + mov r0, #1 SEPARATOR \ + pop { r4, pc } + +DEFINE_AEABI_FCMP(eq) +DEFINE_AEABI_FCMP(lt) +DEFINE_AEABI_FCMP(le) +DEFINE_AEABI_FCMP(ge) +DEFINE_AEABI_FCMP(gt) diff --git a/lib/comparedf2.c b/lib/comparedf2.c index fe35fd80..de67784d 100644 --- a/lib/comparedf2.c +++ b/lib/comparedf2.c @@ -106,6 +106,8 @@ enum GE_RESULT __gedf2(fp_t a, fp_t b) { } } +ARM_EABI_FNALIAS(dcmpun, unorddf2) + int __unorddf2(fp_t a, fp_t b) { const rep_t aAbs = toRep(a) & absMask; const rep_t bAbs = toRep(b) & absMask; diff --git a/lib/comparesf2.c b/lib/comparesf2.c index 3f2e358a..c1c3a479 100644 --- a/lib/comparesf2.c +++ b/lib/comparesf2.c @@ -106,6 +106,8 @@ enum GE_RESULT __gesf2(fp_t a, fp_t b) { } } +ARM_EABI_FNALIAS(fcmpun, unordsf2) + int __unordsf2(fp_t a, fp_t b) { const rep_t aAbs = toRep(a) & absMask; const rep_t bAbs = toRep(b) & absMask; |