162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * include/asm-generic/xor.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Generic optimized RAID-5 checksumming functions. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/prefetch.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cistatic void 1162306a36Sopenharmony_cixor_8regs_2(unsigned long bytes, unsigned long * __restrict p1, 1262306a36Sopenharmony_ci const unsigned long * __restrict p2) 1362306a36Sopenharmony_ci{ 1462306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci do { 1762306a36Sopenharmony_ci p1[0] ^= p2[0]; 1862306a36Sopenharmony_ci p1[1] ^= p2[1]; 1962306a36Sopenharmony_ci p1[2] ^= p2[2]; 2062306a36Sopenharmony_ci p1[3] ^= p2[3]; 2162306a36Sopenharmony_ci p1[4] ^= p2[4]; 2262306a36Sopenharmony_ci p1[5] ^= p2[5]; 2362306a36Sopenharmony_ci p1[6] ^= p2[6]; 2462306a36Sopenharmony_ci p1[7] ^= p2[7]; 2562306a36Sopenharmony_ci p1 += 8; 2662306a36Sopenharmony_ci p2 += 8; 2762306a36Sopenharmony_ci } while (--lines > 0); 2862306a36Sopenharmony_ci} 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic void 3162306a36Sopenharmony_cixor_8regs_3(unsigned long bytes, unsigned long * __restrict p1, 3262306a36Sopenharmony_ci const unsigned long * __restrict p2, 3362306a36Sopenharmony_ci const unsigned long * __restrict p3) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci do { 3862306a36Sopenharmony_ci p1[0] ^= p2[0] ^ p3[0]; 3962306a36Sopenharmony_ci p1[1] ^= p2[1] ^ p3[1]; 4062306a36Sopenharmony_ci p1[2] ^= p2[2] ^ p3[2]; 4162306a36Sopenharmony_ci p1[3] ^= p2[3] ^ p3[3]; 4262306a36Sopenharmony_ci p1[4] ^= p2[4] ^ p3[4]; 4362306a36Sopenharmony_ci p1[5] ^= p2[5] ^ p3[5]; 4462306a36Sopenharmony_ci p1[6] ^= p2[6] ^ p3[6]; 4562306a36Sopenharmony_ci p1[7] ^= p2[7] ^ p3[7]; 4662306a36Sopenharmony_ci p1 += 8; 4762306a36Sopenharmony_ci p2 += 8; 4862306a36Sopenharmony_ci p3 += 8; 4962306a36Sopenharmony_ci } while (--lines > 0); 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistatic void 5362306a36Sopenharmony_cixor_8regs_4(unsigned long bytes, unsigned long * __restrict p1, 5462306a36Sopenharmony_ci const unsigned long * __restrict p2, 5562306a36Sopenharmony_ci const unsigned long * __restrict p3, 5662306a36Sopenharmony_ci const unsigned long * __restrict p4) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci do { 6162306a36Sopenharmony_ci p1[0] ^= p2[0] ^ p3[0] ^ p4[0]; 6262306a36Sopenharmony_ci p1[1] ^= p2[1] ^ p3[1] ^ p4[1]; 6362306a36Sopenharmony_ci p1[2] ^= p2[2] ^ p3[2] ^ p4[2]; 6462306a36Sopenharmony_ci p1[3] ^= p2[3] ^ p3[3] ^ p4[3]; 6562306a36Sopenharmony_ci p1[4] ^= p2[4] ^ p3[4] ^ p4[4]; 6662306a36Sopenharmony_ci p1[5] ^= p2[5] ^ p3[5] ^ p4[5]; 6762306a36Sopenharmony_ci p1[6] ^= p2[6] ^ p3[6] ^ p4[6]; 6862306a36Sopenharmony_ci p1[7] ^= p2[7] ^ p3[7] ^ p4[7]; 6962306a36Sopenharmony_ci p1 += 8; 7062306a36Sopenharmony_ci p2 += 8; 7162306a36Sopenharmony_ci p3 += 8; 7262306a36Sopenharmony_ci p4 += 8; 7362306a36Sopenharmony_ci } while (--lines > 0); 7462306a36Sopenharmony_ci} 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistatic void 7762306a36Sopenharmony_cixor_8regs_5(unsigned long bytes, unsigned long * __restrict p1, 7862306a36Sopenharmony_ci const unsigned long * __restrict p2, 7962306a36Sopenharmony_ci const unsigned long * __restrict p3, 8062306a36Sopenharmony_ci const unsigned long * __restrict p4, 8162306a36Sopenharmony_ci const unsigned long * __restrict p5) 8262306a36Sopenharmony_ci{ 8362306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci do { 8662306a36Sopenharmony_ci p1[0] ^= p2[0] ^ p3[0] ^ p4[0] ^ p5[0]; 8762306a36Sopenharmony_ci p1[1] ^= p2[1] ^ p3[1] ^ p4[1] ^ p5[1]; 8862306a36Sopenharmony_ci p1[2] ^= p2[2] ^ p3[2] ^ p4[2] ^ p5[2]; 8962306a36Sopenharmony_ci p1[3] ^= p2[3] ^ p3[3] ^ p4[3] ^ p5[3]; 9062306a36Sopenharmony_ci p1[4] ^= p2[4] ^ p3[4] ^ p4[4] ^ p5[4]; 9162306a36Sopenharmony_ci p1[5] ^= p2[5] ^ p3[5] ^ p4[5] ^ p5[5]; 9262306a36Sopenharmony_ci p1[6] ^= p2[6] ^ p3[6] ^ p4[6] ^ p5[6]; 9362306a36Sopenharmony_ci p1[7] ^= p2[7] ^ p3[7] ^ p4[7] ^ p5[7]; 9462306a36Sopenharmony_ci p1 += 8; 9562306a36Sopenharmony_ci p2 += 8; 9662306a36Sopenharmony_ci p3 += 8; 9762306a36Sopenharmony_ci p4 += 8; 9862306a36Sopenharmony_ci p5 += 8; 9962306a36Sopenharmony_ci } while (--lines > 0); 10062306a36Sopenharmony_ci} 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cistatic void 10362306a36Sopenharmony_cixor_32regs_2(unsigned long bytes, unsigned long * __restrict p1, 10462306a36Sopenharmony_ci const unsigned long * __restrict p2) 10562306a36Sopenharmony_ci{ 10662306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci do { 10962306a36Sopenharmony_ci register long d0, d1, d2, d3, d4, d5, d6, d7; 11062306a36Sopenharmony_ci d0 = p1[0]; /* Pull the stuff into registers */ 11162306a36Sopenharmony_ci d1 = p1[1]; /* ... in bursts, if possible. */ 11262306a36Sopenharmony_ci d2 = p1[2]; 11362306a36Sopenharmony_ci d3 = p1[3]; 11462306a36Sopenharmony_ci d4 = p1[4]; 11562306a36Sopenharmony_ci d5 = p1[5]; 11662306a36Sopenharmony_ci d6 = p1[6]; 11762306a36Sopenharmony_ci d7 = p1[7]; 11862306a36Sopenharmony_ci d0 ^= p2[0]; 11962306a36Sopenharmony_ci d1 ^= p2[1]; 12062306a36Sopenharmony_ci d2 ^= p2[2]; 12162306a36Sopenharmony_ci d3 ^= p2[3]; 12262306a36Sopenharmony_ci d4 ^= p2[4]; 12362306a36Sopenharmony_ci d5 ^= p2[5]; 12462306a36Sopenharmony_ci d6 ^= p2[6]; 12562306a36Sopenharmony_ci d7 ^= p2[7]; 12662306a36Sopenharmony_ci p1[0] = d0; /* Store the result (in bursts) */ 12762306a36Sopenharmony_ci p1[1] = d1; 12862306a36Sopenharmony_ci p1[2] = d2; 12962306a36Sopenharmony_ci p1[3] = d3; 13062306a36Sopenharmony_ci p1[4] = d4; 13162306a36Sopenharmony_ci p1[5] = d5; 13262306a36Sopenharmony_ci p1[6] = d6; 13362306a36Sopenharmony_ci p1[7] = d7; 13462306a36Sopenharmony_ci p1 += 8; 13562306a36Sopenharmony_ci p2 += 8; 13662306a36Sopenharmony_ci } while (--lines > 0); 13762306a36Sopenharmony_ci} 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cistatic void 14062306a36Sopenharmony_cixor_32regs_3(unsigned long bytes, unsigned long * __restrict p1, 14162306a36Sopenharmony_ci const unsigned long * __restrict p2, 14262306a36Sopenharmony_ci const unsigned long * __restrict p3) 14362306a36Sopenharmony_ci{ 14462306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci do { 14762306a36Sopenharmony_ci register long d0, d1, d2, d3, d4, d5, d6, d7; 14862306a36Sopenharmony_ci d0 = p1[0]; /* Pull the stuff into registers */ 14962306a36Sopenharmony_ci d1 = p1[1]; /* ... in bursts, if possible. */ 15062306a36Sopenharmony_ci d2 = p1[2]; 15162306a36Sopenharmony_ci d3 = p1[3]; 15262306a36Sopenharmony_ci d4 = p1[4]; 15362306a36Sopenharmony_ci d5 = p1[5]; 15462306a36Sopenharmony_ci d6 = p1[6]; 15562306a36Sopenharmony_ci d7 = p1[7]; 15662306a36Sopenharmony_ci d0 ^= p2[0]; 15762306a36Sopenharmony_ci d1 ^= p2[1]; 15862306a36Sopenharmony_ci d2 ^= p2[2]; 15962306a36Sopenharmony_ci d3 ^= p2[3]; 16062306a36Sopenharmony_ci d4 ^= p2[4]; 16162306a36Sopenharmony_ci d5 ^= p2[5]; 16262306a36Sopenharmony_ci d6 ^= p2[6]; 16362306a36Sopenharmony_ci d7 ^= p2[7]; 16462306a36Sopenharmony_ci d0 ^= p3[0]; 16562306a36Sopenharmony_ci d1 ^= p3[1]; 16662306a36Sopenharmony_ci d2 ^= p3[2]; 16762306a36Sopenharmony_ci d3 ^= p3[3]; 16862306a36Sopenharmony_ci d4 ^= p3[4]; 16962306a36Sopenharmony_ci d5 ^= p3[5]; 17062306a36Sopenharmony_ci d6 ^= p3[6]; 17162306a36Sopenharmony_ci d7 ^= p3[7]; 17262306a36Sopenharmony_ci p1[0] = d0; /* Store the result (in bursts) */ 17362306a36Sopenharmony_ci p1[1] = d1; 17462306a36Sopenharmony_ci p1[2] = d2; 17562306a36Sopenharmony_ci p1[3] = d3; 17662306a36Sopenharmony_ci p1[4] = d4; 17762306a36Sopenharmony_ci p1[5] = d5; 17862306a36Sopenharmony_ci p1[6] = d6; 17962306a36Sopenharmony_ci p1[7] = d7; 18062306a36Sopenharmony_ci p1 += 8; 18162306a36Sopenharmony_ci p2 += 8; 18262306a36Sopenharmony_ci p3 += 8; 18362306a36Sopenharmony_ci } while (--lines > 0); 18462306a36Sopenharmony_ci} 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistatic void 18762306a36Sopenharmony_cixor_32regs_4(unsigned long bytes, unsigned long * __restrict p1, 18862306a36Sopenharmony_ci const unsigned long * __restrict p2, 18962306a36Sopenharmony_ci const unsigned long * __restrict p3, 19062306a36Sopenharmony_ci const unsigned long * __restrict p4) 19162306a36Sopenharmony_ci{ 19262306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci do { 19562306a36Sopenharmony_ci register long d0, d1, d2, d3, d4, d5, d6, d7; 19662306a36Sopenharmony_ci d0 = p1[0]; /* Pull the stuff into registers */ 19762306a36Sopenharmony_ci d1 = p1[1]; /* ... in bursts, if possible. */ 19862306a36Sopenharmony_ci d2 = p1[2]; 19962306a36Sopenharmony_ci d3 = p1[3]; 20062306a36Sopenharmony_ci d4 = p1[4]; 20162306a36Sopenharmony_ci d5 = p1[5]; 20262306a36Sopenharmony_ci d6 = p1[6]; 20362306a36Sopenharmony_ci d7 = p1[7]; 20462306a36Sopenharmony_ci d0 ^= p2[0]; 20562306a36Sopenharmony_ci d1 ^= p2[1]; 20662306a36Sopenharmony_ci d2 ^= p2[2]; 20762306a36Sopenharmony_ci d3 ^= p2[3]; 20862306a36Sopenharmony_ci d4 ^= p2[4]; 20962306a36Sopenharmony_ci d5 ^= p2[5]; 21062306a36Sopenharmony_ci d6 ^= p2[6]; 21162306a36Sopenharmony_ci d7 ^= p2[7]; 21262306a36Sopenharmony_ci d0 ^= p3[0]; 21362306a36Sopenharmony_ci d1 ^= p3[1]; 21462306a36Sopenharmony_ci d2 ^= p3[2]; 21562306a36Sopenharmony_ci d3 ^= p3[3]; 21662306a36Sopenharmony_ci d4 ^= p3[4]; 21762306a36Sopenharmony_ci d5 ^= p3[5]; 21862306a36Sopenharmony_ci d6 ^= p3[6]; 21962306a36Sopenharmony_ci d7 ^= p3[7]; 22062306a36Sopenharmony_ci d0 ^= p4[0]; 22162306a36Sopenharmony_ci d1 ^= p4[1]; 22262306a36Sopenharmony_ci d2 ^= p4[2]; 22362306a36Sopenharmony_ci d3 ^= p4[3]; 22462306a36Sopenharmony_ci d4 ^= p4[4]; 22562306a36Sopenharmony_ci d5 ^= p4[5]; 22662306a36Sopenharmony_ci d6 ^= p4[6]; 22762306a36Sopenharmony_ci d7 ^= p4[7]; 22862306a36Sopenharmony_ci p1[0] = d0; /* Store the result (in bursts) */ 22962306a36Sopenharmony_ci p1[1] = d1; 23062306a36Sopenharmony_ci p1[2] = d2; 23162306a36Sopenharmony_ci p1[3] = d3; 23262306a36Sopenharmony_ci p1[4] = d4; 23362306a36Sopenharmony_ci p1[5] = d5; 23462306a36Sopenharmony_ci p1[6] = d6; 23562306a36Sopenharmony_ci p1[7] = d7; 23662306a36Sopenharmony_ci p1 += 8; 23762306a36Sopenharmony_ci p2 += 8; 23862306a36Sopenharmony_ci p3 += 8; 23962306a36Sopenharmony_ci p4 += 8; 24062306a36Sopenharmony_ci } while (--lines > 0); 24162306a36Sopenharmony_ci} 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_cistatic void 24462306a36Sopenharmony_cixor_32regs_5(unsigned long bytes, unsigned long * __restrict p1, 24562306a36Sopenharmony_ci const unsigned long * __restrict p2, 24662306a36Sopenharmony_ci const unsigned long * __restrict p3, 24762306a36Sopenharmony_ci const unsigned long * __restrict p4, 24862306a36Sopenharmony_ci const unsigned long * __restrict p5) 24962306a36Sopenharmony_ci{ 25062306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8; 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci do { 25362306a36Sopenharmony_ci register long d0, d1, d2, d3, d4, d5, d6, d7; 25462306a36Sopenharmony_ci d0 = p1[0]; /* Pull the stuff into registers */ 25562306a36Sopenharmony_ci d1 = p1[1]; /* ... in bursts, if possible. */ 25662306a36Sopenharmony_ci d2 = p1[2]; 25762306a36Sopenharmony_ci d3 = p1[3]; 25862306a36Sopenharmony_ci d4 = p1[4]; 25962306a36Sopenharmony_ci d5 = p1[5]; 26062306a36Sopenharmony_ci d6 = p1[6]; 26162306a36Sopenharmony_ci d7 = p1[7]; 26262306a36Sopenharmony_ci d0 ^= p2[0]; 26362306a36Sopenharmony_ci d1 ^= p2[1]; 26462306a36Sopenharmony_ci d2 ^= p2[2]; 26562306a36Sopenharmony_ci d3 ^= p2[3]; 26662306a36Sopenharmony_ci d4 ^= p2[4]; 26762306a36Sopenharmony_ci d5 ^= p2[5]; 26862306a36Sopenharmony_ci d6 ^= p2[6]; 26962306a36Sopenharmony_ci d7 ^= p2[7]; 27062306a36Sopenharmony_ci d0 ^= p3[0]; 27162306a36Sopenharmony_ci d1 ^= p3[1]; 27262306a36Sopenharmony_ci d2 ^= p3[2]; 27362306a36Sopenharmony_ci d3 ^= p3[3]; 27462306a36Sopenharmony_ci d4 ^= p3[4]; 27562306a36Sopenharmony_ci d5 ^= p3[5]; 27662306a36Sopenharmony_ci d6 ^= p3[6]; 27762306a36Sopenharmony_ci d7 ^= p3[7]; 27862306a36Sopenharmony_ci d0 ^= p4[0]; 27962306a36Sopenharmony_ci d1 ^= p4[1]; 28062306a36Sopenharmony_ci d2 ^= p4[2]; 28162306a36Sopenharmony_ci d3 ^= p4[3]; 28262306a36Sopenharmony_ci d4 ^= p4[4]; 28362306a36Sopenharmony_ci d5 ^= p4[5]; 28462306a36Sopenharmony_ci d6 ^= p4[6]; 28562306a36Sopenharmony_ci d7 ^= p4[7]; 28662306a36Sopenharmony_ci d0 ^= p5[0]; 28762306a36Sopenharmony_ci d1 ^= p5[1]; 28862306a36Sopenharmony_ci d2 ^= p5[2]; 28962306a36Sopenharmony_ci d3 ^= p5[3]; 29062306a36Sopenharmony_ci d4 ^= p5[4]; 29162306a36Sopenharmony_ci d5 ^= p5[5]; 29262306a36Sopenharmony_ci d6 ^= p5[6]; 29362306a36Sopenharmony_ci d7 ^= p5[7]; 29462306a36Sopenharmony_ci p1[0] = d0; /* Store the result (in bursts) */ 29562306a36Sopenharmony_ci p1[1] = d1; 29662306a36Sopenharmony_ci p1[2] = d2; 29762306a36Sopenharmony_ci p1[3] = d3; 29862306a36Sopenharmony_ci p1[4] = d4; 29962306a36Sopenharmony_ci p1[5] = d5; 30062306a36Sopenharmony_ci p1[6] = d6; 30162306a36Sopenharmony_ci p1[7] = d7; 30262306a36Sopenharmony_ci p1 += 8; 30362306a36Sopenharmony_ci p2 += 8; 30462306a36Sopenharmony_ci p3 += 8; 30562306a36Sopenharmony_ci p4 += 8; 30662306a36Sopenharmony_ci p5 += 8; 30762306a36Sopenharmony_ci } while (--lines > 0); 30862306a36Sopenharmony_ci} 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_cistatic void 31162306a36Sopenharmony_cixor_8regs_p_2(unsigned long bytes, unsigned long * __restrict p1, 31262306a36Sopenharmony_ci const unsigned long * __restrict p2) 31362306a36Sopenharmony_ci{ 31462306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8 - 1; 31562306a36Sopenharmony_ci prefetchw(p1); 31662306a36Sopenharmony_ci prefetch(p2); 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci do { 31962306a36Sopenharmony_ci prefetchw(p1+8); 32062306a36Sopenharmony_ci prefetch(p2+8); 32162306a36Sopenharmony_ci once_more: 32262306a36Sopenharmony_ci p1[0] ^= p2[0]; 32362306a36Sopenharmony_ci p1[1] ^= p2[1]; 32462306a36Sopenharmony_ci p1[2] ^= p2[2]; 32562306a36Sopenharmony_ci p1[3] ^= p2[3]; 32662306a36Sopenharmony_ci p1[4] ^= p2[4]; 32762306a36Sopenharmony_ci p1[5] ^= p2[5]; 32862306a36Sopenharmony_ci p1[6] ^= p2[6]; 32962306a36Sopenharmony_ci p1[7] ^= p2[7]; 33062306a36Sopenharmony_ci p1 += 8; 33162306a36Sopenharmony_ci p2 += 8; 33262306a36Sopenharmony_ci } while (--lines > 0); 33362306a36Sopenharmony_ci if (lines == 0) 33462306a36Sopenharmony_ci goto once_more; 33562306a36Sopenharmony_ci} 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_cistatic void 33862306a36Sopenharmony_cixor_8regs_p_3(unsigned long bytes, unsigned long * __restrict p1, 33962306a36Sopenharmony_ci const unsigned long * __restrict p2, 34062306a36Sopenharmony_ci const unsigned long * __restrict p3) 34162306a36Sopenharmony_ci{ 34262306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8 - 1; 34362306a36Sopenharmony_ci prefetchw(p1); 34462306a36Sopenharmony_ci prefetch(p2); 34562306a36Sopenharmony_ci prefetch(p3); 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci do { 34862306a36Sopenharmony_ci prefetchw(p1+8); 34962306a36Sopenharmony_ci prefetch(p2+8); 35062306a36Sopenharmony_ci prefetch(p3+8); 35162306a36Sopenharmony_ci once_more: 35262306a36Sopenharmony_ci p1[0] ^= p2[0] ^ p3[0]; 35362306a36Sopenharmony_ci p1[1] ^= p2[1] ^ p3[1]; 35462306a36Sopenharmony_ci p1[2] ^= p2[2] ^ p3[2]; 35562306a36Sopenharmony_ci p1[3] ^= p2[3] ^ p3[3]; 35662306a36Sopenharmony_ci p1[4] ^= p2[4] ^ p3[4]; 35762306a36Sopenharmony_ci p1[5] ^= p2[5] ^ p3[5]; 35862306a36Sopenharmony_ci p1[6] ^= p2[6] ^ p3[6]; 35962306a36Sopenharmony_ci p1[7] ^= p2[7] ^ p3[7]; 36062306a36Sopenharmony_ci p1 += 8; 36162306a36Sopenharmony_ci p2 += 8; 36262306a36Sopenharmony_ci p3 += 8; 36362306a36Sopenharmony_ci } while (--lines > 0); 36462306a36Sopenharmony_ci if (lines == 0) 36562306a36Sopenharmony_ci goto once_more; 36662306a36Sopenharmony_ci} 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_cistatic void 36962306a36Sopenharmony_cixor_8regs_p_4(unsigned long bytes, unsigned long * __restrict p1, 37062306a36Sopenharmony_ci const unsigned long * __restrict p2, 37162306a36Sopenharmony_ci const unsigned long * __restrict p3, 37262306a36Sopenharmony_ci const unsigned long * __restrict p4) 37362306a36Sopenharmony_ci{ 37462306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8 - 1; 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci prefetchw(p1); 37762306a36Sopenharmony_ci prefetch(p2); 37862306a36Sopenharmony_ci prefetch(p3); 37962306a36Sopenharmony_ci prefetch(p4); 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci do { 38262306a36Sopenharmony_ci prefetchw(p1+8); 38362306a36Sopenharmony_ci prefetch(p2+8); 38462306a36Sopenharmony_ci prefetch(p3+8); 38562306a36Sopenharmony_ci prefetch(p4+8); 38662306a36Sopenharmony_ci once_more: 38762306a36Sopenharmony_ci p1[0] ^= p2[0] ^ p3[0] ^ p4[0]; 38862306a36Sopenharmony_ci p1[1] ^= p2[1] ^ p3[1] ^ p4[1]; 38962306a36Sopenharmony_ci p1[2] ^= p2[2] ^ p3[2] ^ p4[2]; 39062306a36Sopenharmony_ci p1[3] ^= p2[3] ^ p3[3] ^ p4[3]; 39162306a36Sopenharmony_ci p1[4] ^= p2[4] ^ p3[4] ^ p4[4]; 39262306a36Sopenharmony_ci p1[5] ^= p2[5] ^ p3[5] ^ p4[5]; 39362306a36Sopenharmony_ci p1[6] ^= p2[6] ^ p3[6] ^ p4[6]; 39462306a36Sopenharmony_ci p1[7] ^= p2[7] ^ p3[7] ^ p4[7]; 39562306a36Sopenharmony_ci p1 += 8; 39662306a36Sopenharmony_ci p2 += 8; 39762306a36Sopenharmony_ci p3 += 8; 39862306a36Sopenharmony_ci p4 += 8; 39962306a36Sopenharmony_ci } while (--lines > 0); 40062306a36Sopenharmony_ci if (lines == 0) 40162306a36Sopenharmony_ci goto once_more; 40262306a36Sopenharmony_ci} 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_cistatic void 40562306a36Sopenharmony_cixor_8regs_p_5(unsigned long bytes, unsigned long * __restrict p1, 40662306a36Sopenharmony_ci const unsigned long * __restrict p2, 40762306a36Sopenharmony_ci const unsigned long * __restrict p3, 40862306a36Sopenharmony_ci const unsigned long * __restrict p4, 40962306a36Sopenharmony_ci const unsigned long * __restrict p5) 41062306a36Sopenharmony_ci{ 41162306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8 - 1; 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci prefetchw(p1); 41462306a36Sopenharmony_ci prefetch(p2); 41562306a36Sopenharmony_ci prefetch(p3); 41662306a36Sopenharmony_ci prefetch(p4); 41762306a36Sopenharmony_ci prefetch(p5); 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci do { 42062306a36Sopenharmony_ci prefetchw(p1+8); 42162306a36Sopenharmony_ci prefetch(p2+8); 42262306a36Sopenharmony_ci prefetch(p3+8); 42362306a36Sopenharmony_ci prefetch(p4+8); 42462306a36Sopenharmony_ci prefetch(p5+8); 42562306a36Sopenharmony_ci once_more: 42662306a36Sopenharmony_ci p1[0] ^= p2[0] ^ p3[0] ^ p4[0] ^ p5[0]; 42762306a36Sopenharmony_ci p1[1] ^= p2[1] ^ p3[1] ^ p4[1] ^ p5[1]; 42862306a36Sopenharmony_ci p1[2] ^= p2[2] ^ p3[2] ^ p4[2] ^ p5[2]; 42962306a36Sopenharmony_ci p1[3] ^= p2[3] ^ p3[3] ^ p4[3] ^ p5[3]; 43062306a36Sopenharmony_ci p1[4] ^= p2[4] ^ p3[4] ^ p4[4] ^ p5[4]; 43162306a36Sopenharmony_ci p1[5] ^= p2[5] ^ p3[5] ^ p4[5] ^ p5[5]; 43262306a36Sopenharmony_ci p1[6] ^= p2[6] ^ p3[6] ^ p4[6] ^ p5[6]; 43362306a36Sopenharmony_ci p1[7] ^= p2[7] ^ p3[7] ^ p4[7] ^ p5[7]; 43462306a36Sopenharmony_ci p1 += 8; 43562306a36Sopenharmony_ci p2 += 8; 43662306a36Sopenharmony_ci p3 += 8; 43762306a36Sopenharmony_ci p4 += 8; 43862306a36Sopenharmony_ci p5 += 8; 43962306a36Sopenharmony_ci } while (--lines > 0); 44062306a36Sopenharmony_ci if (lines == 0) 44162306a36Sopenharmony_ci goto once_more; 44262306a36Sopenharmony_ci} 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_cistatic void 44562306a36Sopenharmony_cixor_32regs_p_2(unsigned long bytes, unsigned long * __restrict p1, 44662306a36Sopenharmony_ci const unsigned long * __restrict p2) 44762306a36Sopenharmony_ci{ 44862306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8 - 1; 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ci prefetchw(p1); 45162306a36Sopenharmony_ci prefetch(p2); 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_ci do { 45462306a36Sopenharmony_ci register long d0, d1, d2, d3, d4, d5, d6, d7; 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_ci prefetchw(p1+8); 45762306a36Sopenharmony_ci prefetch(p2+8); 45862306a36Sopenharmony_ci once_more: 45962306a36Sopenharmony_ci d0 = p1[0]; /* Pull the stuff into registers */ 46062306a36Sopenharmony_ci d1 = p1[1]; /* ... in bursts, if possible. */ 46162306a36Sopenharmony_ci d2 = p1[2]; 46262306a36Sopenharmony_ci d3 = p1[3]; 46362306a36Sopenharmony_ci d4 = p1[4]; 46462306a36Sopenharmony_ci d5 = p1[5]; 46562306a36Sopenharmony_ci d6 = p1[6]; 46662306a36Sopenharmony_ci d7 = p1[7]; 46762306a36Sopenharmony_ci d0 ^= p2[0]; 46862306a36Sopenharmony_ci d1 ^= p2[1]; 46962306a36Sopenharmony_ci d2 ^= p2[2]; 47062306a36Sopenharmony_ci d3 ^= p2[3]; 47162306a36Sopenharmony_ci d4 ^= p2[4]; 47262306a36Sopenharmony_ci d5 ^= p2[5]; 47362306a36Sopenharmony_ci d6 ^= p2[6]; 47462306a36Sopenharmony_ci d7 ^= p2[7]; 47562306a36Sopenharmony_ci p1[0] = d0; /* Store the result (in bursts) */ 47662306a36Sopenharmony_ci p1[1] = d1; 47762306a36Sopenharmony_ci p1[2] = d2; 47862306a36Sopenharmony_ci p1[3] = d3; 47962306a36Sopenharmony_ci p1[4] = d4; 48062306a36Sopenharmony_ci p1[5] = d5; 48162306a36Sopenharmony_ci p1[6] = d6; 48262306a36Sopenharmony_ci p1[7] = d7; 48362306a36Sopenharmony_ci p1 += 8; 48462306a36Sopenharmony_ci p2 += 8; 48562306a36Sopenharmony_ci } while (--lines > 0); 48662306a36Sopenharmony_ci if (lines == 0) 48762306a36Sopenharmony_ci goto once_more; 48862306a36Sopenharmony_ci} 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_cistatic void 49162306a36Sopenharmony_cixor_32regs_p_3(unsigned long bytes, unsigned long * __restrict p1, 49262306a36Sopenharmony_ci const unsigned long * __restrict p2, 49362306a36Sopenharmony_ci const unsigned long * __restrict p3) 49462306a36Sopenharmony_ci{ 49562306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8 - 1; 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_ci prefetchw(p1); 49862306a36Sopenharmony_ci prefetch(p2); 49962306a36Sopenharmony_ci prefetch(p3); 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_ci do { 50262306a36Sopenharmony_ci register long d0, d1, d2, d3, d4, d5, d6, d7; 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ci prefetchw(p1+8); 50562306a36Sopenharmony_ci prefetch(p2+8); 50662306a36Sopenharmony_ci prefetch(p3+8); 50762306a36Sopenharmony_ci once_more: 50862306a36Sopenharmony_ci d0 = p1[0]; /* Pull the stuff into registers */ 50962306a36Sopenharmony_ci d1 = p1[1]; /* ... in bursts, if possible. */ 51062306a36Sopenharmony_ci d2 = p1[2]; 51162306a36Sopenharmony_ci d3 = p1[3]; 51262306a36Sopenharmony_ci d4 = p1[4]; 51362306a36Sopenharmony_ci d5 = p1[5]; 51462306a36Sopenharmony_ci d6 = p1[6]; 51562306a36Sopenharmony_ci d7 = p1[7]; 51662306a36Sopenharmony_ci d0 ^= p2[0]; 51762306a36Sopenharmony_ci d1 ^= p2[1]; 51862306a36Sopenharmony_ci d2 ^= p2[2]; 51962306a36Sopenharmony_ci d3 ^= p2[3]; 52062306a36Sopenharmony_ci d4 ^= p2[4]; 52162306a36Sopenharmony_ci d5 ^= p2[5]; 52262306a36Sopenharmony_ci d6 ^= p2[6]; 52362306a36Sopenharmony_ci d7 ^= p2[7]; 52462306a36Sopenharmony_ci d0 ^= p3[0]; 52562306a36Sopenharmony_ci d1 ^= p3[1]; 52662306a36Sopenharmony_ci d2 ^= p3[2]; 52762306a36Sopenharmony_ci d3 ^= p3[3]; 52862306a36Sopenharmony_ci d4 ^= p3[4]; 52962306a36Sopenharmony_ci d5 ^= p3[5]; 53062306a36Sopenharmony_ci d6 ^= p3[6]; 53162306a36Sopenharmony_ci d7 ^= p3[7]; 53262306a36Sopenharmony_ci p1[0] = d0; /* Store the result (in bursts) */ 53362306a36Sopenharmony_ci p1[1] = d1; 53462306a36Sopenharmony_ci p1[2] = d2; 53562306a36Sopenharmony_ci p1[3] = d3; 53662306a36Sopenharmony_ci p1[4] = d4; 53762306a36Sopenharmony_ci p1[5] = d5; 53862306a36Sopenharmony_ci p1[6] = d6; 53962306a36Sopenharmony_ci p1[7] = d7; 54062306a36Sopenharmony_ci p1 += 8; 54162306a36Sopenharmony_ci p2 += 8; 54262306a36Sopenharmony_ci p3 += 8; 54362306a36Sopenharmony_ci } while (--lines > 0); 54462306a36Sopenharmony_ci if (lines == 0) 54562306a36Sopenharmony_ci goto once_more; 54662306a36Sopenharmony_ci} 54762306a36Sopenharmony_ci 54862306a36Sopenharmony_cistatic void 54962306a36Sopenharmony_cixor_32regs_p_4(unsigned long bytes, unsigned long * __restrict p1, 55062306a36Sopenharmony_ci const unsigned long * __restrict p2, 55162306a36Sopenharmony_ci const unsigned long * __restrict p3, 55262306a36Sopenharmony_ci const unsigned long * __restrict p4) 55362306a36Sopenharmony_ci{ 55462306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8 - 1; 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_ci prefetchw(p1); 55762306a36Sopenharmony_ci prefetch(p2); 55862306a36Sopenharmony_ci prefetch(p3); 55962306a36Sopenharmony_ci prefetch(p4); 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci do { 56262306a36Sopenharmony_ci register long d0, d1, d2, d3, d4, d5, d6, d7; 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci prefetchw(p1+8); 56562306a36Sopenharmony_ci prefetch(p2+8); 56662306a36Sopenharmony_ci prefetch(p3+8); 56762306a36Sopenharmony_ci prefetch(p4+8); 56862306a36Sopenharmony_ci once_more: 56962306a36Sopenharmony_ci d0 = p1[0]; /* Pull the stuff into registers */ 57062306a36Sopenharmony_ci d1 = p1[1]; /* ... in bursts, if possible. */ 57162306a36Sopenharmony_ci d2 = p1[2]; 57262306a36Sopenharmony_ci d3 = p1[3]; 57362306a36Sopenharmony_ci d4 = p1[4]; 57462306a36Sopenharmony_ci d5 = p1[5]; 57562306a36Sopenharmony_ci d6 = p1[6]; 57662306a36Sopenharmony_ci d7 = p1[7]; 57762306a36Sopenharmony_ci d0 ^= p2[0]; 57862306a36Sopenharmony_ci d1 ^= p2[1]; 57962306a36Sopenharmony_ci d2 ^= p2[2]; 58062306a36Sopenharmony_ci d3 ^= p2[3]; 58162306a36Sopenharmony_ci d4 ^= p2[4]; 58262306a36Sopenharmony_ci d5 ^= p2[5]; 58362306a36Sopenharmony_ci d6 ^= p2[6]; 58462306a36Sopenharmony_ci d7 ^= p2[7]; 58562306a36Sopenharmony_ci d0 ^= p3[0]; 58662306a36Sopenharmony_ci d1 ^= p3[1]; 58762306a36Sopenharmony_ci d2 ^= p3[2]; 58862306a36Sopenharmony_ci d3 ^= p3[3]; 58962306a36Sopenharmony_ci d4 ^= p3[4]; 59062306a36Sopenharmony_ci d5 ^= p3[5]; 59162306a36Sopenharmony_ci d6 ^= p3[6]; 59262306a36Sopenharmony_ci d7 ^= p3[7]; 59362306a36Sopenharmony_ci d0 ^= p4[0]; 59462306a36Sopenharmony_ci d1 ^= p4[1]; 59562306a36Sopenharmony_ci d2 ^= p4[2]; 59662306a36Sopenharmony_ci d3 ^= p4[3]; 59762306a36Sopenharmony_ci d4 ^= p4[4]; 59862306a36Sopenharmony_ci d5 ^= p4[5]; 59962306a36Sopenharmony_ci d6 ^= p4[6]; 60062306a36Sopenharmony_ci d7 ^= p4[7]; 60162306a36Sopenharmony_ci p1[0] = d0; /* Store the result (in bursts) */ 60262306a36Sopenharmony_ci p1[1] = d1; 60362306a36Sopenharmony_ci p1[2] = d2; 60462306a36Sopenharmony_ci p1[3] = d3; 60562306a36Sopenharmony_ci p1[4] = d4; 60662306a36Sopenharmony_ci p1[5] = d5; 60762306a36Sopenharmony_ci p1[6] = d6; 60862306a36Sopenharmony_ci p1[7] = d7; 60962306a36Sopenharmony_ci p1 += 8; 61062306a36Sopenharmony_ci p2 += 8; 61162306a36Sopenharmony_ci p3 += 8; 61262306a36Sopenharmony_ci p4 += 8; 61362306a36Sopenharmony_ci } while (--lines > 0); 61462306a36Sopenharmony_ci if (lines == 0) 61562306a36Sopenharmony_ci goto once_more; 61662306a36Sopenharmony_ci} 61762306a36Sopenharmony_ci 61862306a36Sopenharmony_cistatic void 61962306a36Sopenharmony_cixor_32regs_p_5(unsigned long bytes, unsigned long * __restrict p1, 62062306a36Sopenharmony_ci const unsigned long * __restrict p2, 62162306a36Sopenharmony_ci const unsigned long * __restrict p3, 62262306a36Sopenharmony_ci const unsigned long * __restrict p4, 62362306a36Sopenharmony_ci const unsigned long * __restrict p5) 62462306a36Sopenharmony_ci{ 62562306a36Sopenharmony_ci long lines = bytes / (sizeof (long)) / 8 - 1; 62662306a36Sopenharmony_ci 62762306a36Sopenharmony_ci prefetchw(p1); 62862306a36Sopenharmony_ci prefetch(p2); 62962306a36Sopenharmony_ci prefetch(p3); 63062306a36Sopenharmony_ci prefetch(p4); 63162306a36Sopenharmony_ci prefetch(p5); 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_ci do { 63462306a36Sopenharmony_ci register long d0, d1, d2, d3, d4, d5, d6, d7; 63562306a36Sopenharmony_ci 63662306a36Sopenharmony_ci prefetchw(p1+8); 63762306a36Sopenharmony_ci prefetch(p2+8); 63862306a36Sopenharmony_ci prefetch(p3+8); 63962306a36Sopenharmony_ci prefetch(p4+8); 64062306a36Sopenharmony_ci prefetch(p5+8); 64162306a36Sopenharmony_ci once_more: 64262306a36Sopenharmony_ci d0 = p1[0]; /* Pull the stuff into registers */ 64362306a36Sopenharmony_ci d1 = p1[1]; /* ... in bursts, if possible. */ 64462306a36Sopenharmony_ci d2 = p1[2]; 64562306a36Sopenharmony_ci d3 = p1[3]; 64662306a36Sopenharmony_ci d4 = p1[4]; 64762306a36Sopenharmony_ci d5 = p1[5]; 64862306a36Sopenharmony_ci d6 = p1[6]; 64962306a36Sopenharmony_ci d7 = p1[7]; 65062306a36Sopenharmony_ci d0 ^= p2[0]; 65162306a36Sopenharmony_ci d1 ^= p2[1]; 65262306a36Sopenharmony_ci d2 ^= p2[2]; 65362306a36Sopenharmony_ci d3 ^= p2[3]; 65462306a36Sopenharmony_ci d4 ^= p2[4]; 65562306a36Sopenharmony_ci d5 ^= p2[5]; 65662306a36Sopenharmony_ci d6 ^= p2[6]; 65762306a36Sopenharmony_ci d7 ^= p2[7]; 65862306a36Sopenharmony_ci d0 ^= p3[0]; 65962306a36Sopenharmony_ci d1 ^= p3[1]; 66062306a36Sopenharmony_ci d2 ^= p3[2]; 66162306a36Sopenharmony_ci d3 ^= p3[3]; 66262306a36Sopenharmony_ci d4 ^= p3[4]; 66362306a36Sopenharmony_ci d5 ^= p3[5]; 66462306a36Sopenharmony_ci d6 ^= p3[6]; 66562306a36Sopenharmony_ci d7 ^= p3[7]; 66662306a36Sopenharmony_ci d0 ^= p4[0]; 66762306a36Sopenharmony_ci d1 ^= p4[1]; 66862306a36Sopenharmony_ci d2 ^= p4[2]; 66962306a36Sopenharmony_ci d3 ^= p4[3]; 67062306a36Sopenharmony_ci d4 ^= p4[4]; 67162306a36Sopenharmony_ci d5 ^= p4[5]; 67262306a36Sopenharmony_ci d6 ^= p4[6]; 67362306a36Sopenharmony_ci d7 ^= p4[7]; 67462306a36Sopenharmony_ci d0 ^= p5[0]; 67562306a36Sopenharmony_ci d1 ^= p5[1]; 67662306a36Sopenharmony_ci d2 ^= p5[2]; 67762306a36Sopenharmony_ci d3 ^= p5[3]; 67862306a36Sopenharmony_ci d4 ^= p5[4]; 67962306a36Sopenharmony_ci d5 ^= p5[5]; 68062306a36Sopenharmony_ci d6 ^= p5[6]; 68162306a36Sopenharmony_ci d7 ^= p5[7]; 68262306a36Sopenharmony_ci p1[0] = d0; /* Store the result (in bursts) */ 68362306a36Sopenharmony_ci p1[1] = d1; 68462306a36Sopenharmony_ci p1[2] = d2; 68562306a36Sopenharmony_ci p1[3] = d3; 68662306a36Sopenharmony_ci p1[4] = d4; 68762306a36Sopenharmony_ci p1[5] = d5; 68862306a36Sopenharmony_ci p1[6] = d6; 68962306a36Sopenharmony_ci p1[7] = d7; 69062306a36Sopenharmony_ci p1 += 8; 69162306a36Sopenharmony_ci p2 += 8; 69262306a36Sopenharmony_ci p3 += 8; 69362306a36Sopenharmony_ci p4 += 8; 69462306a36Sopenharmony_ci p5 += 8; 69562306a36Sopenharmony_ci } while (--lines > 0); 69662306a36Sopenharmony_ci if (lines == 0) 69762306a36Sopenharmony_ci goto once_more; 69862306a36Sopenharmony_ci} 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_cistatic struct xor_block_template xor_block_8regs = { 70162306a36Sopenharmony_ci .name = "8regs", 70262306a36Sopenharmony_ci .do_2 = xor_8regs_2, 70362306a36Sopenharmony_ci .do_3 = xor_8regs_3, 70462306a36Sopenharmony_ci .do_4 = xor_8regs_4, 70562306a36Sopenharmony_ci .do_5 = xor_8regs_5, 70662306a36Sopenharmony_ci}; 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_cistatic struct xor_block_template xor_block_32regs = { 70962306a36Sopenharmony_ci .name = "32regs", 71062306a36Sopenharmony_ci .do_2 = xor_32regs_2, 71162306a36Sopenharmony_ci .do_3 = xor_32regs_3, 71262306a36Sopenharmony_ci .do_4 = xor_32regs_4, 71362306a36Sopenharmony_ci .do_5 = xor_32regs_5, 71462306a36Sopenharmony_ci}; 71562306a36Sopenharmony_ci 71662306a36Sopenharmony_cistatic struct xor_block_template xor_block_8regs_p __maybe_unused = { 71762306a36Sopenharmony_ci .name = "8regs_prefetch", 71862306a36Sopenharmony_ci .do_2 = xor_8regs_p_2, 71962306a36Sopenharmony_ci .do_3 = xor_8regs_p_3, 72062306a36Sopenharmony_ci .do_4 = xor_8regs_p_4, 72162306a36Sopenharmony_ci .do_5 = xor_8regs_p_5, 72262306a36Sopenharmony_ci}; 72362306a36Sopenharmony_ci 72462306a36Sopenharmony_cistatic struct xor_block_template xor_block_32regs_p __maybe_unused = { 72562306a36Sopenharmony_ci .name = "32regs_prefetch", 72662306a36Sopenharmony_ci .do_2 = xor_32regs_p_2, 72762306a36Sopenharmony_ci .do_3 = xor_32regs_p_3, 72862306a36Sopenharmony_ci .do_4 = xor_32regs_p_4, 72962306a36Sopenharmony_ci .do_5 = xor_32regs_p_5, 73062306a36Sopenharmony_ci}; 73162306a36Sopenharmony_ci 73262306a36Sopenharmony_ci#define XOR_TRY_TEMPLATES \ 73362306a36Sopenharmony_ci do { \ 73462306a36Sopenharmony_ci xor_speed(&xor_block_8regs); \ 73562306a36Sopenharmony_ci xor_speed(&xor_block_8regs_p); \ 73662306a36Sopenharmony_ci xor_speed(&xor_block_32regs); \ 73762306a36Sopenharmony_ci xor_speed(&xor_block_32regs_p); \ 73862306a36Sopenharmony_ci } while (0) 739