mirror of
https://github.com/intel/llvm.git
synced 2026-01-27 06:06:34 +08:00
Implement aeabi_{f,d}cmp*.
Special thanks to Anton for the review. llvm-svn: 174596
This commit is contained in:
39
compiler-rt/lib/arm/aeabi_dcmp.S
Normal file
39
compiler-rt/lib/arm/aeabi_dcmp.S
Normal file
@@ -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)
|
||||
39
compiler-rt/lib/arm/aeabi_fcmp.S
Normal file
39
compiler-rt/lib/arm/aeabi_fcmp.S
Normal file
@@ -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)
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user