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__) */ 233