vfpdf.S revision 1.1.4.2 1 1.1.4.2 tls /*-
2 1.1.4.2 tls * Copyright (c) 2013 The NetBSD Foundation, Inc.
3 1.1.4.2 tls * All rights reserved.
4 1.1.4.2 tls *
5 1.1.4.2 tls * This code is derived from software contributed to The NetBSD Foundation
6 1.1.4.2 tls * by Matt Thomas of 3am Software Foundry.
7 1.1.4.2 tls *
8 1.1.4.2 tls * Redistribution and use in source and binary forms, with or without
9 1.1.4.2 tls * modification, are permitted provided that the following conditions
10 1.1.4.2 tls * are met:
11 1.1.4.2 tls * 1. Redistributions of source code must retain the above copyright
12 1.1.4.2 tls * notice, this list of conditions and the following disclaimer.
13 1.1.4.2 tls * 2. Redistributions in binary form must reproduce the above copyright
14 1.1.4.2 tls * notice, this list of conditions and the following disclaimer in the
15 1.1.4.2 tls * documentation and/or other materials provided with the distribution.
16 1.1.4.2 tls *
17 1.1.4.2 tls * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18 1.1.4.2 tls * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 1.1.4.2 tls * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 1.1.4.2 tls * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21 1.1.4.2 tls * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 1.1.4.2 tls * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 1.1.4.2 tls * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 1.1.4.2 tls * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 1.1.4.2 tls * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 1.1.4.2 tls * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 1.1.4.2 tls * POSSIBILITY OF SUCH DAMAGE.
28 1.1.4.2 tls */
29 1.1.4.2 tls
30 1.1.4.2 tls #include <arm/asm.h>
31 1.1.4.2 tls
32 1.1.4.2 tls RCSID("$NetBSD: vfpdf.S,v 1.1.4.2 2013/02/25 00:27:55 tls Exp $")
33 1.1.4.2 tls
34 1.1.4.2 tls /*
35 1.1.4.2 tls * This file provides softfloat compatible routines which use VFP instructions
36 1.1.4.2 tls * to do the actual work. This should give near hard-float performance while
37 1.1.4.2 tls * being compatible with soft-float code.
38 1.1.4.2 tls *
39 1.1.4.2 tls * This file implements the double precision floating point routines.
40 1.1.4.2 tls */
41 1.1.4.2 tls
42 1.1.4.2 tls #ifdef __ARMEL__
43 1.1.4.2 tls #define vmov_arg0 vmov d0, r0, r1
44 1.1.4.2 tls #define vmov_arg1 vmov d1, r2, r3
45 1.1.4.2 tls #define vmov_ret vmov r0, r1, d0
46 1.1.4.2 tls #else
47 1.1.4.2 tls #define vmov_arg0 vmov d0, r1, r0
48 1.1.4.2 tls #define vmov_arg1 vmov d1, r3, r2
49 1.1.4.2 tls #define vmov_ret vmov r1, r0, d0
50 1.1.4.2 tls #endif
51 1.1.4.2 tls #define vmov_args vmov_arg0; vmov_arg1
52 1.1.4.2 tls
53 1.1.4.2 tls ENTRY(__adddf3)
54 1.1.4.2 tls vmov_args
55 1.1.4.2 tls vadd.f64 d0, d0, d1
56 1.1.4.2 tls vmov_ret
57 1.1.4.2 tls RET
58 1.1.4.2 tls END(__adddf3)
59 1.1.4.2 tls
60 1.1.4.2 tls ENTRY(__subdf3)
61 1.1.4.2 tls vmov_args
62 1.1.4.2 tls vsub.f64 d0, d0, d1
63 1.1.4.2 tls vmov_ret
64 1.1.4.2 tls RET
65 1.1.4.2 tls END(__subdf3)
66 1.1.4.2 tls
67 1.1.4.2 tls ENTRY(__muldf3)
68 1.1.4.2 tls vmov_args
69 1.1.4.2 tls vmul.f64 d0, d0, d1
70 1.1.4.2 tls vmov_ret
71 1.1.4.2 tls RET
72 1.1.4.2 tls END(__muldf3)
73 1.1.4.2 tls
74 1.1.4.2 tls ENTRY(__divdf3)
75 1.1.4.2 tls vmov_args
76 1.1.4.2 tls vdiv.f64 d0, d0, d1
77 1.1.4.2 tls vmov_ret
78 1.1.4.2 tls RET
79 1.1.4.2 tls END(__divdf3)
80 1.1.4.2 tls
81 1.1.4.2 tls ENTRY(__negdf2)
82 1.1.4.2 tls vmov_arg0
83 1.1.4.2 tls vneg.f64 d0, d0
84 1.1.4.2 tls vmov_ret
85 1.1.4.2 tls RET
86 1.1.4.2 tls END(__negdf2)
87 1.1.4.2 tls
88 1.1.4.2 tls ENTRY(__extendsfdf2)
89 1.1.4.2 tls vmov s0, r0
90 1.1.4.2 tls vcvt.f64.f32 d0, s0
91 1.1.4.2 tls vmov_ret
92 1.1.4.2 tls RET
93 1.1.4.2 tls END(__extendsfdf2)
94 1.1.4.2 tls
95 1.1.4.2 tls ENTRY(__fixdfsi)
96 1.1.4.2 tls vmov_arg0
97 1.1.4.2 tls vcvt.s32.f64 s0, d0
98 1.1.4.2 tls vmov r0, s0
99 1.1.4.2 tls RET
100 1.1.4.2 tls END(__fixdfsi)
101 1.1.4.2 tls
102 1.1.4.2 tls ENTRY(__fixunsdfsi)
103 1.1.4.2 tls vmov_arg0
104 1.1.4.2 tls vcvt.u32.f64 s0, d0
105 1.1.4.2 tls vmov r0, s0
106 1.1.4.2 tls RET
107 1.1.4.2 tls END(__fixunsdfsi)
108 1.1.4.2 tls
109 1.1.4.2 tls ENTRY(__floatsidf)
110 1.1.4.2 tls vmov s0, r0
111 1.1.4.2 tls vcvt.f64.s32 d0, s0
112 1.1.4.2 tls vmov_ret
113 1.1.4.2 tls RET
114 1.1.4.2 tls END(__floatsidf)
115 1.1.4.2 tls
116 1.1.4.2 tls ENTRY(__floatunsidf)
117 1.1.4.2 tls vmov s0, r0
118 1.1.4.2 tls vcvt.f64.u32 d0, s0
119 1.1.4.2 tls vmov_ret
120 1.1.4.2 tls RET
121 1.1.4.2 tls END(__floatunsidf)
122 1.1.4.2 tls
123 1.1.4.2 tls /* N set if compare <= result */
124 1.1.4.2 tls /* Z set if compare = result */
125 1.1.4.2 tls /* C set if compare (=,>=,UNORD) result */
126 1.1.4.2 tls /* V set if compare UNORD result */
127 1.1.4.2 tls
128 1.1.4.2 tls STRONG_ALIAS(__eqdf2, __nedf2)
129 1.1.4.2 tls ENTRY(__nedf2)
130 1.1.4.2 tls vmov_args
131 1.1.4.2 tls vcmp.f64 d0, d1
132 1.1.4.2 tls vmrs APSR_nzcv, fpscr
133 1.1.4.2 tls moveq r0, #0 /* !(a == b) */
134 1.1.4.2 tls movne r0, #1 /* !(a == b) */
135 1.1.4.2 tls RET
136 1.1.4.2 tls END(__nedf2)
137 1.1.4.2 tls
138 1.1.4.2 tls STRONG_ALIAS(__gedf2, __ltdf2)
139 1.1.4.2 tls ENTRY(__ltdf2)
140 1.1.4.2 tls vmov_args
141 1.1.4.2 tls vcmp.f64 d0, d1
142 1.1.4.2 tls vmrs APSR_nzcv, fpscr
143 1.1.4.2 tls mvnmi r0, #0 /* -(a < b) */
144 1.1.4.2 tls movpl r0, #0 /* -(a < b) */
145 1.1.4.2 tls RET
146 1.1.4.2 tls END(__ltdf2)
147 1.1.4.2 tls
148 1.1.4.2 tls STRONG_ALIAS(__gtdf2, __ledf2)
149 1.1.4.2 tls ENTRY(__ledf2)
150 1.1.4.2 tls vmov_args
151 1.1.4.2 tls vcmp.f64 d0, d1
152 1.1.4.2 tls vmrs APSR_nzcv, fpscr
153 1.1.4.2 tls movgt r0, #1 /* (a > b) */
154 1.1.4.2 tls movle r0, #0 /* (a > b) */
155 1.1.4.2 tls RET
156 1.1.4.2 tls END(__ledf2)
157 1.1.4.2 tls
158 1.1.4.2 tls ENTRY(__unorddf2)
159 1.1.4.2 tls vmov_args
160 1.1.4.2 tls vcmp.f64 d0, d1
161 1.1.4.2 tls vmrs APSR_nzcv, fpscr
162 1.1.4.2 tls movvs r0, #1 /* isnan(a) || isnan(b) */
163 1.1.4.2 tls movvc r0, #0 /* isnan(a) || isnan(b) */
164 1.1.4.2 tls RET
165 1.1.4.2 tls END(__unorddf2)
166