xref: /freebsd-src/sys/contrib/openzfs/module/zfs/vdev_raidz_math_scalar.c (revision 271171e0d97b88ba2a7c3bf750c9672b484c1c13)
1eda14cbcSMatt Macy /*
2eda14cbcSMatt Macy  * CDDL HEADER START
3eda14cbcSMatt Macy  *
4eda14cbcSMatt Macy  * The contents of this file are subject to the terms of the
5eda14cbcSMatt Macy  * Common Development and Distribution License (the "License").
6eda14cbcSMatt Macy  * You may not use this file except in compliance with the License.
7eda14cbcSMatt Macy  *
8eda14cbcSMatt Macy  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*271171e0SMartin Matuska  * or https://opensource.org/licenses/CDDL-1.0.
10eda14cbcSMatt Macy  * See the License for the specific language governing permissions
11eda14cbcSMatt Macy  * and limitations under the License.
12eda14cbcSMatt Macy  *
13eda14cbcSMatt Macy  * When distributing Covered Code, include this CDDL HEADER in each
14eda14cbcSMatt Macy  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15eda14cbcSMatt Macy  * If applicable, add the following below this CDDL HEADER, with the
16eda14cbcSMatt Macy  * fields enclosed by brackets "[]" replaced with your own identifying
17eda14cbcSMatt Macy  * information: Portions Copyright [yyyy] [name of copyright owner]
18eda14cbcSMatt Macy  *
19eda14cbcSMatt Macy  * CDDL HEADER END
20eda14cbcSMatt Macy  */
21eda14cbcSMatt Macy 
22eda14cbcSMatt Macy /*
23eda14cbcSMatt Macy  * Copyright (C) 2016 Gvozden Nešković. All rights reserved.
24eda14cbcSMatt Macy  */
25eda14cbcSMatt Macy 
26eda14cbcSMatt Macy #include <sys/vdev_raidz_impl.h>
27eda14cbcSMatt Macy 
28eda14cbcSMatt Macy /*
29eda14cbcSMatt Macy  * Provide native CPU scalar routines.
30eda14cbcSMatt Macy  * Support 32bit and 64bit CPUs.
31eda14cbcSMatt Macy  */
32eda14cbcSMatt Macy #if ((~(0x0ULL)) >> 24) == 0xffULL
33eda14cbcSMatt Macy #define	ELEM_SIZE	4
34eda14cbcSMatt Macy typedef uint32_t iv_t;
35eda14cbcSMatt Macy #elif ((~(0x0ULL)) >> 56) == 0xffULL
36eda14cbcSMatt Macy #define	ELEM_SIZE	8
37eda14cbcSMatt Macy typedef uint64_t iv_t;
38eda14cbcSMatt Macy #endif
39eda14cbcSMatt Macy 
40eda14cbcSMatt Macy /*
41eda14cbcSMatt Macy  * Vector type used in scalar implementation
42eda14cbcSMatt Macy  *
43eda14cbcSMatt Macy  * The union is expected to be of native CPU register size. Since addition
44eda14cbcSMatt Macy  * uses XOR operation, it can be performed an all byte elements at once.
45eda14cbcSMatt Macy  * Multiplication requires per byte access.
46eda14cbcSMatt Macy  */
47eda14cbcSMatt Macy typedef union {
48eda14cbcSMatt Macy 	iv_t e;
49eda14cbcSMatt Macy 	uint8_t b[ELEM_SIZE];
50eda14cbcSMatt Macy } v_t;
51eda14cbcSMatt Macy 
52eda14cbcSMatt Macy /*
53eda14cbcSMatt Macy  * Precomputed lookup tables for multiplication by a constant
54eda14cbcSMatt Macy  *
55eda14cbcSMatt Macy  * Reconstruction path requires multiplication by a constant factors. Instead of
56eda14cbcSMatt Macy  * performing two step lookup (log & exp tables), a direct lookup can be used
57eda14cbcSMatt Macy  * instead. Multiplication of element 'a' by a constant 'c' is obtained as:
58eda14cbcSMatt Macy  *
59eda14cbcSMatt Macy  * 	r = vdev_raidz_mul_lt[c_log][a];
60eda14cbcSMatt Macy  *
61eda14cbcSMatt Macy  * where c_log = vdev_raidz_log2[c]. Log of coefficient factors is used because
62eda14cbcSMatt Macy  * they are faster to obtain while solving the syndrome equations.
63eda14cbcSMatt Macy  *
64eda14cbcSMatt Macy  * PERFORMANCE NOTE:
65eda14cbcSMatt Macy  * Even though the complete lookup table uses 64kiB, only relatively small
66eda14cbcSMatt Macy  * portion of it is used at the same time. Following shows number of accessed
67eda14cbcSMatt Macy  * bytes for different cases:
68eda14cbcSMatt Macy  * 	- 1 failed disk: 256B (1 mul. coefficient)
69eda14cbcSMatt Macy  * 	- 2 failed disks: 512B (2 mul. coefficients)
70eda14cbcSMatt Macy  * 	- 3 failed disks: 1536B (6 mul. coefficients)
71eda14cbcSMatt Macy  *
72eda14cbcSMatt Macy  * Size of actually accessed lookup table regions is only larger for
73eda14cbcSMatt Macy  * reconstruction of 3 failed disks, when compared to traditional log/exp
74eda14cbcSMatt Macy  * method. But since the result is obtained in one lookup step performance is
75eda14cbcSMatt Macy  * doubled.
76eda14cbcSMatt Macy  */
77eda14cbcSMatt Macy static uint8_t vdev_raidz_mul_lt[256][256] __attribute__((aligned(256)));
78eda14cbcSMatt Macy 
79eda14cbcSMatt Macy static void
raidz_init_scalar(void)80eda14cbcSMatt Macy raidz_init_scalar(void)
81eda14cbcSMatt Macy {
82eda14cbcSMatt Macy 	int c, i;
83eda14cbcSMatt Macy 	for (c = 0; c < 256; c++)
84eda14cbcSMatt Macy 		for (i = 0; i < 256; i++)
85eda14cbcSMatt Macy 			vdev_raidz_mul_lt[c][i] = gf_mul(c, i);
86eda14cbcSMatt Macy 
87eda14cbcSMatt Macy }
88eda14cbcSMatt Macy 
89eda14cbcSMatt Macy #define	PREFETCHNTA(ptr, offset)	{}
90eda14cbcSMatt Macy #define	PREFETCH(ptr, offset) 		{}
91eda14cbcSMatt Macy 
92eda14cbcSMatt Macy #define	XOR_ACC(src, acc)	acc.e ^= ((v_t *)src)[0].e
93eda14cbcSMatt Macy #define	XOR(src, acc)		acc.e ^= src.e
94eda14cbcSMatt Macy #define	ZERO(acc)		acc.e = 0
95eda14cbcSMatt Macy #define	COPY(src, dst)		dst = src
96eda14cbcSMatt Macy #define	LOAD(src, val) 		val = ((v_t *)src)[0]
97eda14cbcSMatt Macy #define	STORE(dst, val)		((v_t *)dst)[0] = val
98eda14cbcSMatt Macy 
99eda14cbcSMatt Macy /*
100eda14cbcSMatt Macy  * Constants used for optimized multiplication by 2.
101eda14cbcSMatt Macy  */
102eda14cbcSMatt Macy static const struct {
103eda14cbcSMatt Macy 	iv_t mod;
104eda14cbcSMatt Macy 	iv_t mask;
105eda14cbcSMatt Macy 	iv_t msb;
106eda14cbcSMatt Macy } scalar_mul2_consts = {
107eda14cbcSMatt Macy #if ELEM_SIZE == 8
108eda14cbcSMatt Macy 	.mod	= 0x1d1d1d1d1d1d1d1dULL,
109eda14cbcSMatt Macy 	.mask	= 0xfefefefefefefefeULL,
110eda14cbcSMatt Macy 	.msb	= 0x8080808080808080ULL,
111eda14cbcSMatt Macy #else
112eda14cbcSMatt Macy 	.mod	= 0x1d1d1d1dULL,
113eda14cbcSMatt Macy 	.mask	= 0xfefefefeULL,
114eda14cbcSMatt Macy 	.msb	= 0x80808080ULL,
115eda14cbcSMatt Macy #endif
116eda14cbcSMatt Macy };
117eda14cbcSMatt Macy 
118eda14cbcSMatt Macy #define	MUL2_SETUP() {}
119eda14cbcSMatt Macy 
120eda14cbcSMatt Macy #define	MUL2(a)								\
121eda14cbcSMatt Macy {									\
122eda14cbcSMatt Macy 	iv_t _mask;							\
123eda14cbcSMatt Macy 									\
124eda14cbcSMatt Macy 	_mask = (a).e & scalar_mul2_consts.msb;				\
125eda14cbcSMatt Macy 	_mask = (_mask << 1) - (_mask >> 7);				\
126eda14cbcSMatt Macy 	(a).e = ((a).e << 1) & scalar_mul2_consts.mask;			\
127eda14cbcSMatt Macy 	(a).e = (a).e ^ (_mask & scalar_mul2_consts.mod);		\
128eda14cbcSMatt Macy }
129eda14cbcSMatt Macy 
130eda14cbcSMatt Macy #define	MUL4(a) 							\
131eda14cbcSMatt Macy {									\
132eda14cbcSMatt Macy 	MUL2(a);							\
133eda14cbcSMatt Macy 	MUL2(a);							\
134eda14cbcSMatt Macy }
135eda14cbcSMatt Macy 
136eda14cbcSMatt Macy #define	MUL(c, a)							\
137eda14cbcSMatt Macy {									\
138eda14cbcSMatt Macy 	const uint8_t *mul_lt = vdev_raidz_mul_lt[c];			\
139eda14cbcSMatt Macy 	switch (ELEM_SIZE) {						\
140eda14cbcSMatt Macy 	case 8:								\
141eda14cbcSMatt Macy 		a.b[7] = mul_lt[a.b[7]];				\
142eda14cbcSMatt Macy 		a.b[6] = mul_lt[a.b[6]];				\
143eda14cbcSMatt Macy 		a.b[5] = mul_lt[a.b[5]];				\
144eda14cbcSMatt Macy 		a.b[4] = mul_lt[a.b[4]];				\
145c03c5b1cSMartin Matuska 		zfs_fallthrough;					\
146eda14cbcSMatt Macy 	case 4:								\
147eda14cbcSMatt Macy 		a.b[3] = mul_lt[a.b[3]];				\
148eda14cbcSMatt Macy 		a.b[2] = mul_lt[a.b[2]];				\
149eda14cbcSMatt Macy 		a.b[1] = mul_lt[a.b[1]];				\
150eda14cbcSMatt Macy 		a.b[0] = mul_lt[a.b[0]];				\
151eda14cbcSMatt Macy 		break;							\
152eda14cbcSMatt Macy 	}								\
153eda14cbcSMatt Macy }
154eda14cbcSMatt Macy 
155eda14cbcSMatt Macy #define	raidz_math_begin()	{}
156eda14cbcSMatt Macy #define	raidz_math_end()	{}
157eda14cbcSMatt Macy 
158eda14cbcSMatt Macy #define	SYN_STRIDE		1
159eda14cbcSMatt Macy 
160eda14cbcSMatt Macy #define	ZERO_DEFINE()		v_t d0
161eda14cbcSMatt Macy #define	ZERO_STRIDE		1
162eda14cbcSMatt Macy #define	ZERO_D			d0
163eda14cbcSMatt Macy 
164eda14cbcSMatt Macy #define	COPY_DEFINE()		v_t d0
165eda14cbcSMatt Macy #define	COPY_STRIDE		1
166eda14cbcSMatt Macy #define	COPY_D			d0
167eda14cbcSMatt Macy 
168eda14cbcSMatt Macy #define	ADD_DEFINE()		v_t d0
169eda14cbcSMatt Macy #define	ADD_STRIDE		1
170eda14cbcSMatt Macy #define	ADD_D			d0
171eda14cbcSMatt Macy 
172eda14cbcSMatt Macy #define	MUL_DEFINE()		v_t d0
173eda14cbcSMatt Macy #define	MUL_STRIDE		1
174eda14cbcSMatt Macy #define	MUL_D			d0
175eda14cbcSMatt Macy 
176eda14cbcSMatt Macy #define	GEN_P_STRIDE		1
177eda14cbcSMatt Macy #define	GEN_P_DEFINE()		v_t p0
178eda14cbcSMatt Macy #define	GEN_P_P			p0
179eda14cbcSMatt Macy 
180eda14cbcSMatt Macy #define	GEN_PQ_STRIDE		1
181eda14cbcSMatt Macy #define	GEN_PQ_DEFINE()		v_t d0, c0
182eda14cbcSMatt Macy #define	GEN_PQ_D		d0
183eda14cbcSMatt Macy #define	GEN_PQ_C		c0
184eda14cbcSMatt Macy 
185eda14cbcSMatt Macy #define	GEN_PQR_STRIDE		1
186eda14cbcSMatt Macy #define	GEN_PQR_DEFINE()	v_t d0, c0
187eda14cbcSMatt Macy #define	GEN_PQR_D		d0
188eda14cbcSMatt Macy #define	GEN_PQR_C		c0
189eda14cbcSMatt Macy 
190eda14cbcSMatt Macy #define	SYN_Q_DEFINE()		v_t d0, x0
191eda14cbcSMatt Macy #define	SYN_Q_D			d0
192eda14cbcSMatt Macy #define	SYN_Q_X			x0
193eda14cbcSMatt Macy 
194eda14cbcSMatt Macy 
195eda14cbcSMatt Macy #define	SYN_R_DEFINE()		v_t d0, x0
196eda14cbcSMatt Macy #define	SYN_R_D			d0
197eda14cbcSMatt Macy #define	SYN_R_X			x0
198eda14cbcSMatt Macy 
199eda14cbcSMatt Macy 
200eda14cbcSMatt Macy #define	SYN_PQ_DEFINE()		v_t d0, x0
201eda14cbcSMatt Macy #define	SYN_PQ_D		d0
202eda14cbcSMatt Macy #define	SYN_PQ_X		x0
203eda14cbcSMatt Macy 
204eda14cbcSMatt Macy 
205eda14cbcSMatt Macy #define	REC_PQ_STRIDE		1
206eda14cbcSMatt Macy #define	REC_PQ_DEFINE()		v_t x0, y0, t0
207eda14cbcSMatt Macy #define	REC_PQ_X		x0
208eda14cbcSMatt Macy #define	REC_PQ_Y		y0
209eda14cbcSMatt Macy #define	REC_PQ_T		t0
210eda14cbcSMatt Macy 
211eda14cbcSMatt Macy 
212eda14cbcSMatt Macy #define	SYN_PR_DEFINE()		v_t d0, x0
213eda14cbcSMatt Macy #define	SYN_PR_D		d0
214eda14cbcSMatt Macy #define	SYN_PR_X		x0
215eda14cbcSMatt Macy 
216eda14cbcSMatt Macy #define	REC_PR_STRIDE		1
217eda14cbcSMatt Macy #define	REC_PR_DEFINE()		v_t x0, y0, t0
218eda14cbcSMatt Macy #define	REC_PR_X		x0
219eda14cbcSMatt Macy #define	REC_PR_Y		y0
220eda14cbcSMatt Macy #define	REC_PR_T		t0
221eda14cbcSMatt Macy 
222eda14cbcSMatt Macy 
223eda14cbcSMatt Macy #define	SYN_QR_DEFINE()		v_t d0, x0
224eda14cbcSMatt Macy #define	SYN_QR_D		d0
225eda14cbcSMatt Macy #define	SYN_QR_X		x0
226eda14cbcSMatt Macy 
227eda14cbcSMatt Macy 
228eda14cbcSMatt Macy #define	REC_QR_STRIDE		1
229eda14cbcSMatt Macy #define	REC_QR_DEFINE()		v_t x0, y0, t0
230eda14cbcSMatt Macy #define	REC_QR_X		x0
231eda14cbcSMatt Macy #define	REC_QR_Y		y0
232eda14cbcSMatt Macy #define	REC_QR_T		t0
233eda14cbcSMatt Macy 
234eda14cbcSMatt Macy 
235eda14cbcSMatt Macy #define	SYN_PQR_DEFINE()	v_t d0, x0
236eda14cbcSMatt Macy #define	SYN_PQR_D		d0
237eda14cbcSMatt Macy #define	SYN_PQR_X		x0
238eda14cbcSMatt Macy 
239eda14cbcSMatt Macy #define	REC_PQR_STRIDE		1
240eda14cbcSMatt Macy #define	REC_PQR_DEFINE()	v_t x0, y0, z0, xs0, ys0
241eda14cbcSMatt Macy #define	REC_PQR_X		x0
242eda14cbcSMatt Macy #define	REC_PQR_Y		y0
243eda14cbcSMatt Macy #define	REC_PQR_Z		z0
244eda14cbcSMatt Macy #define	REC_PQR_XS		xs0
245eda14cbcSMatt Macy #define	REC_PQR_YS		ys0
246eda14cbcSMatt Macy 
247eda14cbcSMatt Macy #include "vdev_raidz_math_impl.h"
248eda14cbcSMatt Macy 
249eda14cbcSMatt Macy DEFINE_GEN_METHODS(scalar);
250eda14cbcSMatt Macy DEFINE_REC_METHODS(scalar);
251eda14cbcSMatt Macy 
252eda14cbcSMatt Macy boolean_t
raidz_will_scalar_work(void)253eda14cbcSMatt Macy raidz_will_scalar_work(void)
254eda14cbcSMatt Macy {
255eda14cbcSMatt Macy 	return (B_TRUE); /* always */
256eda14cbcSMatt Macy }
257eda14cbcSMatt Macy 
258eda14cbcSMatt Macy const raidz_impl_ops_t vdev_raidz_scalar_impl = {
259eda14cbcSMatt Macy 	.init = raidz_init_scalar,
260eda14cbcSMatt Macy 	.fini = NULL,
261eda14cbcSMatt Macy 	.gen = RAIDZ_GEN_METHODS(scalar),
262eda14cbcSMatt Macy 	.rec = RAIDZ_REC_METHODS(scalar),
263eda14cbcSMatt Macy 	.is_supported = &raidz_will_scalar_work,
264eda14cbcSMatt Macy 	.name = "scalar"
265eda14cbcSMatt Macy };
266eda14cbcSMatt Macy 
267eda14cbcSMatt Macy /* Powers of 2 in the RAID-Z Galois field. */
268eda14cbcSMatt Macy const uint8_t vdev_raidz_pow2[256] __attribute__((aligned(256))) = {
269eda14cbcSMatt Macy 	0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
270eda14cbcSMatt Macy 	0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,
271eda14cbcSMatt Macy 	0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9,
272eda14cbcSMatt Macy 	0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,
273eda14cbcSMatt Macy 	0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35,
274eda14cbcSMatt Macy 	0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,
275eda14cbcSMatt Macy 	0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0,
276eda14cbcSMatt Macy 	0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,
277eda14cbcSMatt Macy 	0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc,
278eda14cbcSMatt Macy 	0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,
279eda14cbcSMatt Macy 	0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f,
280eda14cbcSMatt Macy 	0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,
281eda14cbcSMatt Macy 	0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88,
282eda14cbcSMatt Macy 	0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,
283eda14cbcSMatt Macy 	0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93,
284eda14cbcSMatt Macy 	0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,
285eda14cbcSMatt Macy 	0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9,
286eda14cbcSMatt Macy 	0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,
287eda14cbcSMatt Macy 	0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa,
288eda14cbcSMatt Macy 	0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,
289eda14cbcSMatt Macy 	0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e,
290eda14cbcSMatt Macy 	0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,
291eda14cbcSMatt Macy 	0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4,
292eda14cbcSMatt Macy 	0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,
293eda14cbcSMatt Macy 	0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e,
294eda14cbcSMatt Macy 	0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,
295eda14cbcSMatt Macy 	0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef,
296eda14cbcSMatt Macy 	0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,
297eda14cbcSMatt Macy 	0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5,
298eda14cbcSMatt Macy 	0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,
299eda14cbcSMatt Macy 	0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83,
300eda14cbcSMatt Macy 	0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x01
301eda14cbcSMatt Macy };
302eda14cbcSMatt Macy 
303eda14cbcSMatt Macy /* Logs of 2 in the RAID-Z Galois field. */
304eda14cbcSMatt Macy const uint8_t vdev_raidz_log2[256] __attribute__((aligned(256))) = {
305eda14cbcSMatt Macy 	0x00, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6,
306eda14cbcSMatt Macy 	0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,
307eda14cbcSMatt Macy 	0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81,
308eda14cbcSMatt Macy 	0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,
309eda14cbcSMatt Macy 	0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21,
310eda14cbcSMatt Macy 	0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,
311eda14cbcSMatt Macy 	0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9,
312eda14cbcSMatt Macy 	0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,
313eda14cbcSMatt Macy 	0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd,
314eda14cbcSMatt Macy 	0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,
315eda14cbcSMatt Macy 	0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd,
316eda14cbcSMatt Macy 	0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,
317eda14cbcSMatt Macy 	0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e,
318eda14cbcSMatt Macy 	0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,
319eda14cbcSMatt Macy 	0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b,
320eda14cbcSMatt Macy 	0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,
321eda14cbcSMatt Macy 	0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d,
322eda14cbcSMatt Macy 	0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,
323eda14cbcSMatt Macy 	0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c,
324eda14cbcSMatt Macy 	0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,
325eda14cbcSMatt Macy 	0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd,
326eda14cbcSMatt Macy 	0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,
327eda14cbcSMatt Macy 	0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e,
328eda14cbcSMatt Macy 	0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,
329eda14cbcSMatt Macy 	0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76,
330eda14cbcSMatt Macy 	0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,
331eda14cbcSMatt Macy 	0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa,
332eda14cbcSMatt Macy 	0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,
333eda14cbcSMatt Macy 	0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51,
334eda14cbcSMatt Macy 	0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,
335eda14cbcSMatt Macy 	0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8,
336eda14cbcSMatt Macy 	0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf,
337eda14cbcSMatt Macy };
338