Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/arm/aeabi/aeabi_asm_double.S
39507 views
1
/*
2
* Copyright (C) 2014 Andrew Turner
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
* SUCH DAMAGE.
25
*
26
*/
27
28
#include <machine/asm.h>
29
#define PCR_Z (1 << 30)
30
#define PCR_C (1 << 29)
31
32
/*
33
* These functions return the result in the CPSR register.
34
*
35
* For __aeabi_cdcmple:
36
* Z C
37
* LT 0 0
38
* EQ 1 1
39
* else 0 1
40
*
41
* __aeabi_cdrcmple is the same as __aeabi_cdcmple, however the arguments
42
* have been swapped.
43
*/
44
ENTRY(__aeabi_cdcmple)
45
push {r4, r5, r6, r7, ip, lr}
46
47
/* Backup the input registers */
48
mov r4, r0
49
mov r5, r1
50
mov r6, r2
51
mov r7, r3
52
/* Is it less than? */
53
bl __aeabi_dcmplt
54
cmp r0, #1
55
bne 1f
56
/* Yes, clear Z and C */
57
mov ip, #(0)
58
b 99f
59
60
1:
61
/* Restore the input regsters for the next function call */
62
mov r0, r4
63
mov r1, r5
64
mov r2, r6
65
mov r3, r7
66
/* Is it equal? */
67
bl __aeabi_dcmpeq
68
cmp r0, #1
69
bne 2f
70
/* Yes, set Z and C */
71
mov ip, #(PCR_Z | PCR_C)
72
b 99f
73
74
2:
75
/* Not less than or equal, set C and clear Z */
76
mov ip, #(PCR_C)
77
78
99:
79
msr cpsr_c, ip
80
pop {r4, r5, r6, r7, ip, pc}
81
END(__aeabi_cdcmple)
82
83
ENTRY(__aeabi_cdrcmple)
84
/* Swap the first half of the arguments */
85
mov ip, r0
86
mov r0, r2
87
mov r2, ip
88
89
/* And the second half */
90
mov ip, r1
91
mov r1, r3
92
mov r3, ip
93
94
b __aeabi_cdcmple
95
END(__aeabi_cdrcmple)
96
97
/*
98
* This is just like __aeabi_cdcmple except it will not throw an exception
99
* in the presence of a quiet NaN. If either argument is a signalling NaN we
100
* will still signal.
101
*/
102
ENTRY(__aeabi_cdcmpeq)
103
/* Check if we can call __aeabi_cfcmple safely */
104
push {r0, r1, r2, r3, r4, lr}
105
bl __aeabi_cdcmpeq_helper
106
cmp r0, #1
107
pop {r0, r1, r2, r3, r4, lr}
108
beq 1f
109
110
bl __aeabi_cdcmple
111
RET
112
113
1:
114
mov ip, #(PCR_C)
115
msr cpsr_c, ip
116
RET
117
END(__aeabi_cdcmpeq)
118
119
.section .note.GNU-stack,"",%progbits
120
121