]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/contrib/openzfs/module/zfs/vdev_raidz_math_aarch64_neonx2.c
Initial import from vendor-sys branch of openzfs
[FreeBSD/FreeBSD.git] / sys / contrib / openzfs / module / zfs / vdev_raidz_math_aarch64_neonx2.c
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (C) 2016 Romain Dolbeau. All rights reserved.
23  */
24
25 #include <sys/isa_defs.h>
26
27 #if defined(__aarch64__)
28
29 #include "vdev_raidz_math_aarch64_neon_common.h"
30
31 #define SYN_STRIDE              4
32
33 #define ZERO_STRIDE             8
34 #define ZERO_DEFINE()   \
35         GEN_X_DEFINE_0_3()      \
36         GEN_X_DEFINE_4_5()      \
37         GEN_X_DEFINE_6_7()
38 #define ZERO_D                  0, 1, 2, 3, 4, 5, 6, 7
39
40 #define COPY_STRIDE             8
41 #define COPY_DEFINE()   \
42         GEN_X_DEFINE_0_3()      \
43         GEN_X_DEFINE_4_5()      \
44         GEN_X_DEFINE_6_7()
45 #define COPY_D                  0, 1, 2, 3, 4, 5, 6, 7
46
47 #define ADD_STRIDE              8
48 #define ADD_DEFINE()    \
49         GEN_X_DEFINE_0_3()      \
50         GEN_X_DEFINE_4_5()      \
51         GEN_X_DEFINE_6_7()
52 #define ADD_D                   0, 1, 2, 3, 4, 5, 6, 7
53
54 #define MUL_STRIDE              4
55 #define MUL_DEFINE()    \
56         GEN_X_DEFINE_0_3()  \
57         GEN_X_DEFINE_33_36()
58 #define MUL_D                   0, 1, 2, 3
59
60 #define GEN_P_DEFINE() \
61         GEN_X_DEFINE_0_3() \
62         GEN_X_DEFINE_33_36()
63 #define GEN_P_STRIDE            4
64 #define GEN_P_P                 0, 1, 2, 3
65
66 #define GEN_PQ_DEFINE() \
67         GEN_X_DEFINE_0_3()      \
68         GEN_X_DEFINE_4_5()      \
69         GEN_X_DEFINE_6_7()      \
70         GEN_X_DEFINE_16()       \
71         GEN_X_DEFINE_17()       \
72         GEN_X_DEFINE_33_36()
73 #define GEN_PQ_STRIDE           4
74 #define GEN_PQ_D                0, 1, 2, 3
75 #define GEN_PQ_C                4, 5, 6, 7
76
77 #define GEN_PQR_DEFINE() \
78         GEN_X_DEFINE_0_3()      \
79         GEN_X_DEFINE_4_5()      \
80         GEN_X_DEFINE_6_7()      \
81         GEN_X_DEFINE_16()       \
82         GEN_X_DEFINE_17()       \
83         GEN_X_DEFINE_33_36()
84 #define GEN_PQR_STRIDE          4
85 #define GEN_PQR_D               0, 1, 2, 3
86 #define GEN_PQR_C               4, 5, 6, 7
87
88 #define SYN_Q_DEFINE() \
89         GEN_X_DEFINE_0_3()      \
90         GEN_X_DEFINE_4_5()      \
91         GEN_X_DEFINE_6_7()      \
92         GEN_X_DEFINE_16()       \
93         GEN_X_DEFINE_17()       \
94         GEN_X_DEFINE_33_36()
95 #define SYN_Q_STRIDE            4
96 #define SYN_Q_D                 0, 1, 2, 3
97 #define SYN_Q_X                 4, 5, 6, 7
98
99 #define SYN_R_DEFINE() \
100         GEN_X_DEFINE_0_3()      \
101         GEN_X_DEFINE_4_5()      \
102         GEN_X_DEFINE_6_7()      \
103         GEN_X_DEFINE_16()       \
104         GEN_X_DEFINE_17()       \
105         GEN_X_DEFINE_33_36()
106 #define SYN_R_STRIDE            4
107 #define SYN_R_D                 0, 1, 2, 3
108 #define SYN_R_X                 4, 5, 6, 7
109
110 #define SYN_PQ_DEFINE() \
111         GEN_X_DEFINE_0_3()      \
112         GEN_X_DEFINE_4_5()      \
113         GEN_X_DEFINE_6_7()      \
114         GEN_X_DEFINE_16()       \
115         GEN_X_DEFINE_17()       \
116         GEN_X_DEFINE_33_36()
117 #define SYN_PQ_STRIDE           4
118 #define SYN_PQ_D                0, 1, 2, 3
119 #define SYN_PQ_X                4, 5, 6, 7
120
121 #define REC_PQ_DEFINE() \
122         GEN_X_DEFINE_0_3()      \
123         GEN_X_DEFINE_4_5()      \
124         GEN_X_DEFINE_6_7()      \
125         GEN_X_DEFINE_8_9()      \
126         GEN_X_DEFINE_22_23()    \
127         GEN_X_DEFINE_33_36()
128 #define REC_PQ_STRIDE           4
129 #define REC_PQ_X                0, 1, 2, 3
130 #define REC_PQ_Y                4, 5, 6, 7
131 #define REC_PQ_T                8, 9, 22, 23
132
133 #define SYN_PR_DEFINE() \
134         GEN_X_DEFINE_0_3()      \
135         GEN_X_DEFINE_4_5()      \
136         GEN_X_DEFINE_6_7()      \
137         GEN_X_DEFINE_16()       \
138         GEN_X_DEFINE_17()       \
139         GEN_X_DEFINE_33_36()
140 #define SYN_PR_STRIDE           4
141 #define SYN_PR_D                0, 1, 2, 3
142 #define SYN_PR_X                4, 5, 6, 7
143
144 #define REC_PR_DEFINE() \
145         GEN_X_DEFINE_0_3()      \
146         GEN_X_DEFINE_4_5()      \
147         GEN_X_DEFINE_6_7()      \
148         GEN_X_DEFINE_8_9()      \
149         GEN_X_DEFINE_22_23()    \
150         GEN_X_DEFINE_33_36()
151 #define REC_PR_STRIDE           4
152 #define REC_PR_X                0, 1, 2, 3
153 #define REC_PR_Y                4, 5, 6, 7
154 #define REC_PR_T                8, 9, 22, 23
155
156 #define SYN_QR_DEFINE() \
157         GEN_X_DEFINE_0_3()      \
158         GEN_X_DEFINE_4_5()      \
159         GEN_X_DEFINE_6_7()      \
160         GEN_X_DEFINE_16()       \
161         GEN_X_DEFINE_17()       \
162         GEN_X_DEFINE_33_36()
163 #define SYN_QR_STRIDE           4
164 #define SYN_QR_D                0, 1, 2, 3
165 #define SYN_QR_X                4, 5, 6, 7
166
167 #define REC_QR_DEFINE() \
168         GEN_X_DEFINE_0_3()      \
169         GEN_X_DEFINE_4_5()      \
170         GEN_X_DEFINE_6_7()      \
171         GEN_X_DEFINE_8_9()      \
172         GEN_X_DEFINE_22_23()    \
173         GEN_X_DEFINE_33_36()
174 #define REC_QR_STRIDE           4
175 #define REC_QR_X                0, 1, 2, 3
176 #define REC_QR_Y                4, 5, 6, 7
177 #define REC_QR_T                8, 9, 22, 23
178
179 #define SYN_PQR_DEFINE() \
180         GEN_X_DEFINE_0_3()      \
181         GEN_X_DEFINE_4_5()      \
182         GEN_X_DEFINE_6_7()      \
183         GEN_X_DEFINE_16()       \
184         GEN_X_DEFINE_17()       \
185         GEN_X_DEFINE_33_36()
186 #define SYN_PQR_STRIDE           4
187 #define SYN_PQR_D                0, 1, 2, 3
188 #define SYN_PQR_X                4, 5, 6, 7
189
190 #define REC_PQR_DEFINE() \
191         GEN_X_DEFINE_0_3()      \
192         GEN_X_DEFINE_4_5()      \
193         GEN_X_DEFINE_6_7()      \
194         GEN_X_DEFINE_8_9()      \
195         GEN_X_DEFINE_31()       \
196         GEN_X_DEFINE_32()       \
197         GEN_X_DEFINE_33_36()
198 #define REC_PQR_STRIDE          2
199 #define REC_PQR_X               0, 1
200 #define REC_PQR_Y               2, 3
201 #define REC_PQR_Z               4, 5
202 #define REC_PQR_XS              6, 7
203 #define REC_PQR_YS              8, 9
204
205 #include <sys/vdev_raidz_impl.h>
206 #include "vdev_raidz_math_impl.h"
207
208 DEFINE_GEN_METHODS(aarch64_neonx2);
209 /*
210  * If compiled with -O0, gcc doesn't do any stack frame coalescing
211  * and -Wframe-larger-than=1024 is triggered in debug mode.
212  */
213 #pragma GCC diagnostic ignored "-Wframe-larger-than="
214 DEFINE_REC_METHODS(aarch64_neonx2);
215 #pragma GCC diagnostic pop
216
217 static boolean_t
218 raidz_will_aarch64_neonx2_work(void)
219 {
220         return (kfpu_allowed());
221 }
222
223 const raidz_impl_ops_t vdev_raidz_aarch64_neonx2_impl = {
224         .init = NULL,
225         .fini = NULL,
226         .gen = RAIDZ_GEN_METHODS(aarch64_neonx2),
227         .rec = RAIDZ_REC_METHODS(aarch64_neonx2),
228         .is_supported = &raidz_will_aarch64_neonx2_work,
229         .name = "aarch64_neonx2"
230 };
231
232 #endif /* defined(__aarch64__) */