xref: /aosp_15_r20/external/XNNPACK/src/f32-velu/gen/velu-avx-rr2-lut16-p3-x40.c (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
1*4bdc9457SAndroid Build Coastguard Worker // Auto-generated file. Do not edit!
2*4bdc9457SAndroid Build Coastguard Worker //   Template: src/f32-velu/avx-rr2-lut16-p3.c.in
3*4bdc9457SAndroid Build Coastguard Worker //   Generator: tools/xngen
4*4bdc9457SAndroid Build Coastguard Worker //
5*4bdc9457SAndroid Build Coastguard Worker // Copyright 2020 Google LLC
6*4bdc9457SAndroid Build Coastguard Worker //
7*4bdc9457SAndroid Build Coastguard Worker // This source code is licensed under the BSD-style license found in the
8*4bdc9457SAndroid Build Coastguard Worker // LICENSE file in the root directory of this source tree.
9*4bdc9457SAndroid Build Coastguard Worker 
10*4bdc9457SAndroid Build Coastguard Worker #include <assert.h>
11*4bdc9457SAndroid Build Coastguard Worker 
12*4bdc9457SAndroid Build Coastguard Worker #include <immintrin.h>
13*4bdc9457SAndroid Build Coastguard Worker 
14*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/common.h>
15*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/intrinsics-polyfill.h>
16*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/vunary.h>
17*4bdc9457SAndroid Build Coastguard Worker 
18*4bdc9457SAndroid Build Coastguard Worker 
19*4bdc9457SAndroid Build Coastguard Worker extern XNN_INTERNAL const int xnn_table_exp2minus_k_over_16[16];
20*4bdc9457SAndroid Build Coastguard Worker 
xnn_f32_velu_ukernel__avx_rr2_lut16_p3_x40(size_t n,const float * x,float * y,const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS (1)])21*4bdc9457SAndroid Build Coastguard Worker void xnn_f32_velu_ukernel__avx_rr2_lut16_p3_x40(
22*4bdc9457SAndroid Build Coastguard Worker     size_t n,
23*4bdc9457SAndroid Build Coastguard Worker     const float* x,
24*4bdc9457SAndroid Build Coastguard Worker     float* y,
25*4bdc9457SAndroid Build Coastguard Worker     const union xnn_f32_elu_params params[restrict XNN_MIN_ELEMENTS(1)])
26*4bdc9457SAndroid Build Coastguard Worker {
27*4bdc9457SAndroid Build Coastguard Worker   assert(n % sizeof(float) == 0);
28*4bdc9457SAndroid Build Coastguard Worker 
29*4bdc9457SAndroid Build Coastguard Worker   const __m256 vprescale = _mm256_load_ps(params->avx_rr2_lut16_p3.prescale);
30*4bdc9457SAndroid Build Coastguard Worker   const __m256 valpha = _mm256_load_ps(params->avx_rr2_lut16_p3.alpha);
31*4bdc9457SAndroid Build Coastguard Worker   const __m256 vbeta = _mm256_load_ps(params->avx_rr2_lut16_p3.beta);
32*4bdc9457SAndroid Build Coastguard Worker   const __m256 vsat_cutoff = _mm256_load_ps(params->avx_rr2_lut16_p3.sat_cutoff);
33*4bdc9457SAndroid Build Coastguard Worker   const __m256 vmagic_bias = _mm256_load_ps(params->avx_rr2_lut16_p3.magic_bias);
34*4bdc9457SAndroid Build Coastguard Worker   const __m256 vlog2e = _mm256_load_ps(params->avx_rr2_lut16_p3.log2e);
35*4bdc9457SAndroid Build Coastguard Worker   const __m256 vindex_mask = _mm256_load_ps((const float*) params->avx_rr2_lut16_p3.index_mask);
36*4bdc9457SAndroid Build Coastguard Worker   const __m256 vminus_ln2_hi = _mm256_load_ps(params->avx_rr2_lut16_p3.minus_ln2_hi);
37*4bdc9457SAndroid Build Coastguard Worker   const __m256 vminus_ln2_lo = _mm256_load_ps(params->avx_rr2_lut16_p3.minus_ln2_lo);
38*4bdc9457SAndroid Build Coastguard Worker   const __m256 vc3 = _mm256_load_ps(params->avx_rr2_lut16_p3.c3);
39*4bdc9457SAndroid Build Coastguard Worker   const __m256 vc2 = _mm256_load_ps(params->avx_rr2_lut16_p3.c2);
40*4bdc9457SAndroid Build Coastguard Worker   const __m256 vone = _mm256_load_ps(params->avx_rr2_lut16_p3.one);
41*4bdc9457SAndroid Build Coastguard Worker 
42*4bdc9457SAndroid Build Coastguard Worker   for (; n >= 40 * sizeof(float); n -= 40 * sizeof(float)) {
43*4bdc9457SAndroid Build Coastguard Worker     __m256 vx0 = _mm256_loadu_ps(x);
44*4bdc9457SAndroid Build Coastguard Worker     __m256 vx1 = _mm256_loadu_ps(x + 8);
45*4bdc9457SAndroid Build Coastguard Worker     __m256 vx2 = _mm256_loadu_ps(x + 16);
46*4bdc9457SAndroid Build Coastguard Worker     __m256 vx3 = _mm256_loadu_ps(x + 24);
47*4bdc9457SAndroid Build Coastguard Worker     __m256 vx4 = _mm256_loadu_ps(x + 32);
48*4bdc9457SAndroid Build Coastguard Worker     x += 40;
49*4bdc9457SAndroid Build Coastguard Worker 
50*4bdc9457SAndroid Build Coastguard Worker     const __m256 vz0 = _mm256_max_ps(vsat_cutoff, _mm256_mul_ps(vx0, vprescale));
51*4bdc9457SAndroid Build Coastguard Worker     const __m256 vz1 = _mm256_max_ps(vsat_cutoff, _mm256_mul_ps(vx1, vprescale));
52*4bdc9457SAndroid Build Coastguard Worker     const __m256 vz2 = _mm256_max_ps(vsat_cutoff, _mm256_mul_ps(vx2, vprescale));
53*4bdc9457SAndroid Build Coastguard Worker     const __m256 vz3 = _mm256_max_ps(vsat_cutoff, _mm256_mul_ps(vx3, vprescale));
54*4bdc9457SAndroid Build Coastguard Worker     const __m256 vz4 = _mm256_max_ps(vsat_cutoff, _mm256_mul_ps(vx4, vprescale));
55*4bdc9457SAndroid Build Coastguard Worker 
56*4bdc9457SAndroid Build Coastguard Worker     __m256 vn0 = _mm256_add_ps(_mm256_mul_ps(vz0, vlog2e), vmagic_bias);
57*4bdc9457SAndroid Build Coastguard Worker     __m256 vn1 = _mm256_add_ps(_mm256_mul_ps(vz1, vlog2e), vmagic_bias);
58*4bdc9457SAndroid Build Coastguard Worker     __m256 vn2 = _mm256_add_ps(_mm256_mul_ps(vz2, vlog2e), vmagic_bias);
59*4bdc9457SAndroid Build Coastguard Worker     __m256 vn3 = _mm256_add_ps(_mm256_mul_ps(vz3, vlog2e), vmagic_bias);
60*4bdc9457SAndroid Build Coastguard Worker     __m256 vn4 = _mm256_add_ps(_mm256_mul_ps(vz4, vlog2e), vmagic_bias);
61*4bdc9457SAndroid Build Coastguard Worker 
62*4bdc9457SAndroid Build Coastguard Worker     const __m256 vidx0 = _mm256_and_ps(vn0, vindex_mask);
63*4bdc9457SAndroid Build Coastguard Worker 
64*4bdc9457SAndroid Build Coastguard Worker     const __m128i vidx0_lo = _mm_slli_epi32(_mm_castps_si128(_mm256_castps256_ps128(vidx0)), 2);
65*4bdc9457SAndroid Build Coastguard Worker     const __m128i vidx0_hi = _mm_slli_epi32(_mm_castps_si128(_mm256_extractf128_ps(vidx0, 1)), 2);
66*4bdc9457SAndroid Build Coastguard Worker     #if XNN_ARCH_X86_64
67*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx0_ll = (uint64_t) _mm_cvtsi128_si64(vidx0_lo);
68*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx0_lh = (uint64_t) _mm_extract_epi64(vidx0_lo, 1);
69*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx0_hl = (uint64_t) _mm_cvtsi128_si64(vidx0_hi);
70*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx0_hh = (uint64_t) _mm_extract_epi64(vidx0_hi, 1);
71*4bdc9457SAndroid Build Coastguard Worker       __m128i vl0_ll = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx0_ll)));
72*4bdc9457SAndroid Build Coastguard Worker       __m128i vl0_lh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx0_lh)));
73*4bdc9457SAndroid Build Coastguard Worker       __m128i vl0_hl = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx0_hl)));
74*4bdc9457SAndroid Build Coastguard Worker       __m128i vl0_hh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx0_hh)));
75*4bdc9457SAndroid Build Coastguard Worker       vl0_ll = _mm_insert_epi32(vl0_ll, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx0_ll >> 32))), 1);
76*4bdc9457SAndroid Build Coastguard Worker       vl0_lh = _mm_insert_epi32(vl0_lh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx0_lh >> 32))), 1);
77*4bdc9457SAndroid Build Coastguard Worker       vl0_hl = _mm_insert_epi32(vl0_hl, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx0_hl >> 32))), 1);
78*4bdc9457SAndroid Build Coastguard Worker       vl0_hh = _mm_insert_epi32(vl0_hh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx0_hh >> 32))), 1);
79*4bdc9457SAndroid Build Coastguard Worker     #else
80*4bdc9457SAndroid Build Coastguard Worker       __m128i vl0_ll = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_cvtsi128_si32(vidx0_lo))));
81*4bdc9457SAndroid Build Coastguard Worker       __m128i vl0_lh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx0_lo, 2))));
82*4bdc9457SAndroid Build Coastguard Worker       __m128i vl0_hl = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_cvtsi128_si32(vidx0_hi))));
83*4bdc9457SAndroid Build Coastguard Worker       __m128i vl0_hh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx0_hi, 2))));
84*4bdc9457SAndroid Build Coastguard Worker       vl0_ll = _mm_insert_epi32(vl0_ll, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx0_lo, 1))), 1);
85*4bdc9457SAndroid Build Coastguard Worker       vl0_lh = _mm_insert_epi32(vl0_lh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx0_lo, 3))), 1);
86*4bdc9457SAndroid Build Coastguard Worker       vl0_hl = _mm_insert_epi32(vl0_hl, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx0_hi, 1))), 1);
87*4bdc9457SAndroid Build Coastguard Worker       vl0_hh = _mm_insert_epi32(vl0_hh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx0_hi, 3))), 1);
88*4bdc9457SAndroid Build Coastguard Worker     #endif
89*4bdc9457SAndroid Build Coastguard Worker     const __m128i vl0_lo = _mm_unpacklo_epi64(vl0_ll, vl0_lh);
90*4bdc9457SAndroid Build Coastguard Worker     const __m128i vl0_hi = _mm_unpacklo_epi64(vl0_hl, vl0_hh);
91*4bdc9457SAndroid Build Coastguard Worker     const __m256 vidx1 = _mm256_and_ps(vn1, vindex_mask);
92*4bdc9457SAndroid Build Coastguard Worker 
93*4bdc9457SAndroid Build Coastguard Worker     const __m128i vidx1_lo = _mm_slli_epi32(_mm_castps_si128(_mm256_castps256_ps128(vidx1)), 2);
94*4bdc9457SAndroid Build Coastguard Worker     const __m128i vidx1_hi = _mm_slli_epi32(_mm_castps_si128(_mm256_extractf128_ps(vidx1, 1)), 2);
95*4bdc9457SAndroid Build Coastguard Worker     #if XNN_ARCH_X86_64
96*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx1_ll = (uint64_t) _mm_cvtsi128_si64(vidx1_lo);
97*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx1_lh = (uint64_t) _mm_extract_epi64(vidx1_lo, 1);
98*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx1_hl = (uint64_t) _mm_cvtsi128_si64(vidx1_hi);
99*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx1_hh = (uint64_t) _mm_extract_epi64(vidx1_hi, 1);
100*4bdc9457SAndroid Build Coastguard Worker       __m128i vl1_ll = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx1_ll)));
101*4bdc9457SAndroid Build Coastguard Worker       __m128i vl1_lh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx1_lh)));
102*4bdc9457SAndroid Build Coastguard Worker       __m128i vl1_hl = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx1_hl)));
103*4bdc9457SAndroid Build Coastguard Worker       __m128i vl1_hh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx1_hh)));
104*4bdc9457SAndroid Build Coastguard Worker       vl1_ll = _mm_insert_epi32(vl1_ll, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx1_ll >> 32))), 1);
105*4bdc9457SAndroid Build Coastguard Worker       vl1_lh = _mm_insert_epi32(vl1_lh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx1_lh >> 32))), 1);
106*4bdc9457SAndroid Build Coastguard Worker       vl1_hl = _mm_insert_epi32(vl1_hl, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx1_hl >> 32))), 1);
107*4bdc9457SAndroid Build Coastguard Worker       vl1_hh = _mm_insert_epi32(vl1_hh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx1_hh >> 32))), 1);
108*4bdc9457SAndroid Build Coastguard Worker     #else
109*4bdc9457SAndroid Build Coastguard Worker       __m128i vl1_ll = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_cvtsi128_si32(vidx1_lo))));
110*4bdc9457SAndroid Build Coastguard Worker       __m128i vl1_lh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx1_lo, 2))));
111*4bdc9457SAndroid Build Coastguard Worker       __m128i vl1_hl = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_cvtsi128_si32(vidx1_hi))));
112*4bdc9457SAndroid Build Coastguard Worker       __m128i vl1_hh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx1_hi, 2))));
113*4bdc9457SAndroid Build Coastguard Worker       vl1_ll = _mm_insert_epi32(vl1_ll, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx1_lo, 1))), 1);
114*4bdc9457SAndroid Build Coastguard Worker       vl1_lh = _mm_insert_epi32(vl1_lh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx1_lo, 3))), 1);
115*4bdc9457SAndroid Build Coastguard Worker       vl1_hl = _mm_insert_epi32(vl1_hl, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx1_hi, 1))), 1);
116*4bdc9457SAndroid Build Coastguard Worker       vl1_hh = _mm_insert_epi32(vl1_hh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx1_hi, 3))), 1);
117*4bdc9457SAndroid Build Coastguard Worker     #endif
118*4bdc9457SAndroid Build Coastguard Worker     const __m128i vl1_lo = _mm_unpacklo_epi64(vl1_ll, vl1_lh);
119*4bdc9457SAndroid Build Coastguard Worker     const __m128i vl1_hi = _mm_unpacklo_epi64(vl1_hl, vl1_hh);
120*4bdc9457SAndroid Build Coastguard Worker     const __m256 vidx2 = _mm256_and_ps(vn2, vindex_mask);
121*4bdc9457SAndroid Build Coastguard Worker 
122*4bdc9457SAndroid Build Coastguard Worker     const __m128i vidx2_lo = _mm_slli_epi32(_mm_castps_si128(_mm256_castps256_ps128(vidx2)), 2);
123*4bdc9457SAndroid Build Coastguard Worker     const __m128i vidx2_hi = _mm_slli_epi32(_mm_castps_si128(_mm256_extractf128_ps(vidx2, 1)), 2);
124*4bdc9457SAndroid Build Coastguard Worker     #if XNN_ARCH_X86_64
125*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx2_ll = (uint64_t) _mm_cvtsi128_si64(vidx2_lo);
126*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx2_lh = (uint64_t) _mm_extract_epi64(vidx2_lo, 1);
127*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx2_hl = (uint64_t) _mm_cvtsi128_si64(vidx2_hi);
128*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx2_hh = (uint64_t) _mm_extract_epi64(vidx2_hi, 1);
129*4bdc9457SAndroid Build Coastguard Worker       __m128i vl2_ll = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx2_ll)));
130*4bdc9457SAndroid Build Coastguard Worker       __m128i vl2_lh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx2_lh)));
131*4bdc9457SAndroid Build Coastguard Worker       __m128i vl2_hl = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx2_hl)));
132*4bdc9457SAndroid Build Coastguard Worker       __m128i vl2_hh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx2_hh)));
133*4bdc9457SAndroid Build Coastguard Worker       vl2_ll = _mm_insert_epi32(vl2_ll, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx2_ll >> 32))), 1);
134*4bdc9457SAndroid Build Coastguard Worker       vl2_lh = _mm_insert_epi32(vl2_lh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx2_lh >> 32))), 1);
135*4bdc9457SAndroid Build Coastguard Worker       vl2_hl = _mm_insert_epi32(vl2_hl, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx2_hl >> 32))), 1);
136*4bdc9457SAndroid Build Coastguard Worker       vl2_hh = _mm_insert_epi32(vl2_hh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx2_hh >> 32))), 1);
137*4bdc9457SAndroid Build Coastguard Worker     #else
138*4bdc9457SAndroid Build Coastguard Worker       __m128i vl2_ll = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_cvtsi128_si32(vidx2_lo))));
139*4bdc9457SAndroid Build Coastguard Worker       __m128i vl2_lh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx2_lo, 2))));
140*4bdc9457SAndroid Build Coastguard Worker       __m128i vl2_hl = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_cvtsi128_si32(vidx2_hi))));
141*4bdc9457SAndroid Build Coastguard Worker       __m128i vl2_hh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx2_hi, 2))));
142*4bdc9457SAndroid Build Coastguard Worker       vl2_ll = _mm_insert_epi32(vl2_ll, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx2_lo, 1))), 1);
143*4bdc9457SAndroid Build Coastguard Worker       vl2_lh = _mm_insert_epi32(vl2_lh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx2_lo, 3))), 1);
144*4bdc9457SAndroid Build Coastguard Worker       vl2_hl = _mm_insert_epi32(vl2_hl, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx2_hi, 1))), 1);
145*4bdc9457SAndroid Build Coastguard Worker       vl2_hh = _mm_insert_epi32(vl2_hh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx2_hi, 3))), 1);
146*4bdc9457SAndroid Build Coastguard Worker     #endif
147*4bdc9457SAndroid Build Coastguard Worker     const __m128i vl2_lo = _mm_unpacklo_epi64(vl2_ll, vl2_lh);
148*4bdc9457SAndroid Build Coastguard Worker     const __m128i vl2_hi = _mm_unpacklo_epi64(vl2_hl, vl2_hh);
149*4bdc9457SAndroid Build Coastguard Worker     const __m256 vidx3 = _mm256_and_ps(vn3, vindex_mask);
150*4bdc9457SAndroid Build Coastguard Worker 
151*4bdc9457SAndroid Build Coastguard Worker     const __m128i vidx3_lo = _mm_slli_epi32(_mm_castps_si128(_mm256_castps256_ps128(vidx3)), 2);
152*4bdc9457SAndroid Build Coastguard Worker     const __m128i vidx3_hi = _mm_slli_epi32(_mm_castps_si128(_mm256_extractf128_ps(vidx3, 1)), 2);
153*4bdc9457SAndroid Build Coastguard Worker     #if XNN_ARCH_X86_64
154*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx3_ll = (uint64_t) _mm_cvtsi128_si64(vidx3_lo);
155*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx3_lh = (uint64_t) _mm_extract_epi64(vidx3_lo, 1);
156*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx3_hl = (uint64_t) _mm_cvtsi128_si64(vidx3_hi);
157*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx3_hh = (uint64_t) _mm_extract_epi64(vidx3_hi, 1);
158*4bdc9457SAndroid Build Coastguard Worker       __m128i vl3_ll = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx3_ll)));
159*4bdc9457SAndroid Build Coastguard Worker       __m128i vl3_lh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx3_lh)));
160*4bdc9457SAndroid Build Coastguard Worker       __m128i vl3_hl = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx3_hl)));
161*4bdc9457SAndroid Build Coastguard Worker       __m128i vl3_hh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx3_hh)));
162*4bdc9457SAndroid Build Coastguard Worker       vl3_ll = _mm_insert_epi32(vl3_ll, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx3_ll >> 32))), 1);
163*4bdc9457SAndroid Build Coastguard Worker       vl3_lh = _mm_insert_epi32(vl3_lh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx3_lh >> 32))), 1);
164*4bdc9457SAndroid Build Coastguard Worker       vl3_hl = _mm_insert_epi32(vl3_hl, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx3_hl >> 32))), 1);
165*4bdc9457SAndroid Build Coastguard Worker       vl3_hh = _mm_insert_epi32(vl3_hh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx3_hh >> 32))), 1);
166*4bdc9457SAndroid Build Coastguard Worker     #else
167*4bdc9457SAndroid Build Coastguard Worker       __m128i vl3_ll = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_cvtsi128_si32(vidx3_lo))));
168*4bdc9457SAndroid Build Coastguard Worker       __m128i vl3_lh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx3_lo, 2))));
169*4bdc9457SAndroid Build Coastguard Worker       __m128i vl3_hl = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_cvtsi128_si32(vidx3_hi))));
170*4bdc9457SAndroid Build Coastguard Worker       __m128i vl3_hh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx3_hi, 2))));
171*4bdc9457SAndroid Build Coastguard Worker       vl3_ll = _mm_insert_epi32(vl3_ll, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx3_lo, 1))), 1);
172*4bdc9457SAndroid Build Coastguard Worker       vl3_lh = _mm_insert_epi32(vl3_lh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx3_lo, 3))), 1);
173*4bdc9457SAndroid Build Coastguard Worker       vl3_hl = _mm_insert_epi32(vl3_hl, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx3_hi, 1))), 1);
174*4bdc9457SAndroid Build Coastguard Worker       vl3_hh = _mm_insert_epi32(vl3_hh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx3_hi, 3))), 1);
175*4bdc9457SAndroid Build Coastguard Worker     #endif
176*4bdc9457SAndroid Build Coastguard Worker     const __m128i vl3_lo = _mm_unpacklo_epi64(vl3_ll, vl3_lh);
177*4bdc9457SAndroid Build Coastguard Worker     const __m128i vl3_hi = _mm_unpacklo_epi64(vl3_hl, vl3_hh);
178*4bdc9457SAndroid Build Coastguard Worker     const __m256 vidx4 = _mm256_and_ps(vn4, vindex_mask);
179*4bdc9457SAndroid Build Coastguard Worker 
180*4bdc9457SAndroid Build Coastguard Worker     const __m128i vidx4_lo = _mm_slli_epi32(_mm_castps_si128(_mm256_castps256_ps128(vidx4)), 2);
181*4bdc9457SAndroid Build Coastguard Worker     const __m128i vidx4_hi = _mm_slli_epi32(_mm_castps_si128(_mm256_extractf128_ps(vidx4, 1)), 2);
182*4bdc9457SAndroid Build Coastguard Worker     #if XNN_ARCH_X86_64
183*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx4_ll = (uint64_t) _mm_cvtsi128_si64(vidx4_lo);
184*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx4_lh = (uint64_t) _mm_extract_epi64(vidx4_lo, 1);
185*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx4_hl = (uint64_t) _mm_cvtsi128_si64(vidx4_hi);
186*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx4_hh = (uint64_t) _mm_extract_epi64(vidx4_hi, 1);
187*4bdc9457SAndroid Build Coastguard Worker       __m128i vl4_ll = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx4_ll)));
188*4bdc9457SAndroid Build Coastguard Worker       __m128i vl4_lh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx4_lh)));
189*4bdc9457SAndroid Build Coastguard Worker       __m128i vl4_hl = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx4_hl)));
190*4bdc9457SAndroid Build Coastguard Worker       __m128i vl4_hh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx4_hh)));
191*4bdc9457SAndroid Build Coastguard Worker       vl4_ll = _mm_insert_epi32(vl4_ll, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx4_ll >> 32))), 1);
192*4bdc9457SAndroid Build Coastguard Worker       vl4_lh = _mm_insert_epi32(vl4_lh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx4_lh >> 32))), 1);
193*4bdc9457SAndroid Build Coastguard Worker       vl4_hl = _mm_insert_epi32(vl4_hl, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx4_hl >> 32))), 1);
194*4bdc9457SAndroid Build Coastguard Worker       vl4_hh = _mm_insert_epi32(vl4_hh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx4_hh >> 32))), 1);
195*4bdc9457SAndroid Build Coastguard Worker     #else
196*4bdc9457SAndroid Build Coastguard Worker       __m128i vl4_ll = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_cvtsi128_si32(vidx4_lo))));
197*4bdc9457SAndroid Build Coastguard Worker       __m128i vl4_lh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx4_lo, 2))));
198*4bdc9457SAndroid Build Coastguard Worker       __m128i vl4_hl = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_cvtsi128_si32(vidx4_hi))));
199*4bdc9457SAndroid Build Coastguard Worker       __m128i vl4_hh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx4_hi, 2))));
200*4bdc9457SAndroid Build Coastguard Worker       vl4_ll = _mm_insert_epi32(vl4_ll, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx4_lo, 1))), 1);
201*4bdc9457SAndroid Build Coastguard Worker       vl4_lh = _mm_insert_epi32(vl4_lh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx4_lo, 3))), 1);
202*4bdc9457SAndroid Build Coastguard Worker       vl4_hl = _mm_insert_epi32(vl4_hl, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx4_hi, 1))), 1);
203*4bdc9457SAndroid Build Coastguard Worker       vl4_hh = _mm_insert_epi32(vl4_hh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx4_hi, 3))), 1);
204*4bdc9457SAndroid Build Coastguard Worker     #endif
205*4bdc9457SAndroid Build Coastguard Worker     const __m128i vl4_lo = _mm_unpacklo_epi64(vl4_ll, vl4_lh);
206*4bdc9457SAndroid Build Coastguard Worker     const __m128i vl4_hi = _mm_unpacklo_epi64(vl4_hl, vl4_hh);
207*4bdc9457SAndroid Build Coastguard Worker 
208*4bdc9457SAndroid Build Coastguard Worker     const __m128i ven0_lo = _mm_slli_epi32(_mm_castps_si128(_mm256_castps256_ps128(vn0)), 19);
209*4bdc9457SAndroid Build Coastguard Worker     const __m128i ven0_hi = _mm_slli_epi32(_mm_castps_si128(_mm256_extractf128_ps(vn0, 1)), 19);
210*4bdc9457SAndroid Build Coastguard Worker     vn0 = _mm256_sub_ps(vn0, vmagic_bias);
211*4bdc9457SAndroid Build Coastguard Worker     const __m128 vs0_lo = _mm_castsi128_ps(_mm_add_epi32(vl0_lo, ven0_lo));
212*4bdc9457SAndroid Build Coastguard Worker     const __m128 vs0_hi = _mm_castsi128_ps(_mm_add_epi32(vl0_hi, ven0_hi));
213*4bdc9457SAndroid Build Coastguard Worker     const __m128i ven1_lo = _mm_slli_epi32(_mm_castps_si128(_mm256_castps256_ps128(vn1)), 19);
214*4bdc9457SAndroid Build Coastguard Worker     const __m128i ven1_hi = _mm_slli_epi32(_mm_castps_si128(_mm256_extractf128_ps(vn1, 1)), 19);
215*4bdc9457SAndroid Build Coastguard Worker     vn1 = _mm256_sub_ps(vn1, vmagic_bias);
216*4bdc9457SAndroid Build Coastguard Worker     const __m128 vs1_lo = _mm_castsi128_ps(_mm_add_epi32(vl1_lo, ven1_lo));
217*4bdc9457SAndroid Build Coastguard Worker     const __m128 vs1_hi = _mm_castsi128_ps(_mm_add_epi32(vl1_hi, ven1_hi));
218*4bdc9457SAndroid Build Coastguard Worker     const __m128i ven2_lo = _mm_slli_epi32(_mm_castps_si128(_mm256_castps256_ps128(vn2)), 19);
219*4bdc9457SAndroid Build Coastguard Worker     const __m128i ven2_hi = _mm_slli_epi32(_mm_castps_si128(_mm256_extractf128_ps(vn2, 1)), 19);
220*4bdc9457SAndroid Build Coastguard Worker     vn2 = _mm256_sub_ps(vn2, vmagic_bias);
221*4bdc9457SAndroid Build Coastguard Worker     const __m128 vs2_lo = _mm_castsi128_ps(_mm_add_epi32(vl2_lo, ven2_lo));
222*4bdc9457SAndroid Build Coastguard Worker     const __m128 vs2_hi = _mm_castsi128_ps(_mm_add_epi32(vl2_hi, ven2_hi));
223*4bdc9457SAndroid Build Coastguard Worker     const __m128i ven3_lo = _mm_slli_epi32(_mm_castps_si128(_mm256_castps256_ps128(vn3)), 19);
224*4bdc9457SAndroid Build Coastguard Worker     const __m128i ven3_hi = _mm_slli_epi32(_mm_castps_si128(_mm256_extractf128_ps(vn3, 1)), 19);
225*4bdc9457SAndroid Build Coastguard Worker     vn3 = _mm256_sub_ps(vn3, vmagic_bias);
226*4bdc9457SAndroid Build Coastguard Worker     const __m128 vs3_lo = _mm_castsi128_ps(_mm_add_epi32(vl3_lo, ven3_lo));
227*4bdc9457SAndroid Build Coastguard Worker     const __m128 vs3_hi = _mm_castsi128_ps(_mm_add_epi32(vl3_hi, ven3_hi));
228*4bdc9457SAndroid Build Coastguard Worker     const __m128i ven4_lo = _mm_slli_epi32(_mm_castps_si128(_mm256_castps256_ps128(vn4)), 19);
229*4bdc9457SAndroid Build Coastguard Worker     const __m128i ven4_hi = _mm_slli_epi32(_mm_castps_si128(_mm256_extractf128_ps(vn4, 1)), 19);
230*4bdc9457SAndroid Build Coastguard Worker     vn4 = _mm256_sub_ps(vn4, vmagic_bias);
231*4bdc9457SAndroid Build Coastguard Worker     const __m128 vs4_lo = _mm_castsi128_ps(_mm_add_epi32(vl4_lo, ven4_lo));
232*4bdc9457SAndroid Build Coastguard Worker     const __m128 vs4_hi = _mm_castsi128_ps(_mm_add_epi32(vl4_hi, ven4_hi));
233*4bdc9457SAndroid Build Coastguard Worker 
234*4bdc9457SAndroid Build Coastguard Worker     __m256 vt0 = _mm256_add_ps(_mm256_mul_ps(vn0, vminus_ln2_hi), vz0);
235*4bdc9457SAndroid Build Coastguard Worker     __m256 vt1 = _mm256_add_ps(_mm256_mul_ps(vn1, vminus_ln2_hi), vz1);
236*4bdc9457SAndroid Build Coastguard Worker     __m256 vt2 = _mm256_add_ps(_mm256_mul_ps(vn2, vminus_ln2_hi), vz2);
237*4bdc9457SAndroid Build Coastguard Worker     __m256 vt3 = _mm256_add_ps(_mm256_mul_ps(vn3, vminus_ln2_hi), vz3);
238*4bdc9457SAndroid Build Coastguard Worker     __m256 vt4 = _mm256_add_ps(_mm256_mul_ps(vn4, vminus_ln2_hi), vz4);
239*4bdc9457SAndroid Build Coastguard Worker 
240*4bdc9457SAndroid Build Coastguard Worker     vt0 = _mm256_add_ps(_mm256_mul_ps(vn0, vminus_ln2_lo), vt0);
241*4bdc9457SAndroid Build Coastguard Worker     __m256 vs0 = _mm256_insertf128_ps(_mm256_castps128_ps256(vs0_lo), vs0_hi, 1);
242*4bdc9457SAndroid Build Coastguard Worker     vt1 = _mm256_add_ps(_mm256_mul_ps(vn1, vminus_ln2_lo), vt1);
243*4bdc9457SAndroid Build Coastguard Worker     __m256 vs1 = _mm256_insertf128_ps(_mm256_castps128_ps256(vs1_lo), vs1_hi, 1);
244*4bdc9457SAndroid Build Coastguard Worker     vt2 = _mm256_add_ps(_mm256_mul_ps(vn2, vminus_ln2_lo), vt2);
245*4bdc9457SAndroid Build Coastguard Worker     __m256 vs2 = _mm256_insertf128_ps(_mm256_castps128_ps256(vs2_lo), vs2_hi, 1);
246*4bdc9457SAndroid Build Coastguard Worker     vt3 = _mm256_add_ps(_mm256_mul_ps(vn3, vminus_ln2_lo), vt3);
247*4bdc9457SAndroid Build Coastguard Worker     __m256 vs3 = _mm256_insertf128_ps(_mm256_castps128_ps256(vs3_lo), vs3_hi, 1);
248*4bdc9457SAndroid Build Coastguard Worker     vt4 = _mm256_add_ps(_mm256_mul_ps(vn4, vminus_ln2_lo), vt4);
249*4bdc9457SAndroid Build Coastguard Worker     __m256 vs4 = _mm256_insertf128_ps(_mm256_castps128_ps256(vs4_lo), vs4_hi, 1);
250*4bdc9457SAndroid Build Coastguard Worker 
251*4bdc9457SAndroid Build Coastguard Worker     __m256 vp0 = _mm256_add_ps(_mm256_mul_ps(vc3, vt0), vc2);
252*4bdc9457SAndroid Build Coastguard Worker     __m256 vp1 = _mm256_add_ps(_mm256_mul_ps(vc3, vt1), vc2);
253*4bdc9457SAndroid Build Coastguard Worker     __m256 vp2 = _mm256_add_ps(_mm256_mul_ps(vc3, vt2), vc2);
254*4bdc9457SAndroid Build Coastguard Worker     __m256 vp3 = _mm256_add_ps(_mm256_mul_ps(vc3, vt3), vc2);
255*4bdc9457SAndroid Build Coastguard Worker     __m256 vp4 = _mm256_add_ps(_mm256_mul_ps(vc3, vt4), vc2);
256*4bdc9457SAndroid Build Coastguard Worker 
257*4bdc9457SAndroid Build Coastguard Worker     vp0 = _mm256_mul_ps(vp0, vt0);
258*4bdc9457SAndroid Build Coastguard Worker     vp1 = _mm256_mul_ps(vp1, vt1);
259*4bdc9457SAndroid Build Coastguard Worker     vp2 = _mm256_mul_ps(vp2, vt2);
260*4bdc9457SAndroid Build Coastguard Worker     vp3 = _mm256_mul_ps(vp3, vt3);
261*4bdc9457SAndroid Build Coastguard Worker     vp4 = _mm256_mul_ps(vp4, vt4);
262*4bdc9457SAndroid Build Coastguard Worker 
263*4bdc9457SAndroid Build Coastguard Worker     vt0 = _mm256_mul_ps(vt0, vs0);
264*4bdc9457SAndroid Build Coastguard Worker     vs0 = _mm256_sub_ps(vs0, vone);
265*4bdc9457SAndroid Build Coastguard Worker     vt1 = _mm256_mul_ps(vt1, vs1);
266*4bdc9457SAndroid Build Coastguard Worker     vs1 = _mm256_sub_ps(vs1, vone);
267*4bdc9457SAndroid Build Coastguard Worker     vt2 = _mm256_mul_ps(vt2, vs2);
268*4bdc9457SAndroid Build Coastguard Worker     vs2 = _mm256_sub_ps(vs2, vone);
269*4bdc9457SAndroid Build Coastguard Worker     vt3 = _mm256_mul_ps(vt3, vs3);
270*4bdc9457SAndroid Build Coastguard Worker     vs3 = _mm256_sub_ps(vs3, vone);
271*4bdc9457SAndroid Build Coastguard Worker     vt4 = _mm256_mul_ps(vt4, vs4);
272*4bdc9457SAndroid Build Coastguard Worker     vs4 = _mm256_sub_ps(vs4, vone);
273*4bdc9457SAndroid Build Coastguard Worker 
274*4bdc9457SAndroid Build Coastguard Worker     vp0 = _mm256_add_ps(_mm256_mul_ps(vp0, vt0), vt0);
275*4bdc9457SAndroid Build Coastguard Worker     vp1 = _mm256_add_ps(_mm256_mul_ps(vp1, vt1), vt1);
276*4bdc9457SAndroid Build Coastguard Worker     vp2 = _mm256_add_ps(_mm256_mul_ps(vp2, vt2), vt2);
277*4bdc9457SAndroid Build Coastguard Worker     vp3 = _mm256_add_ps(_mm256_mul_ps(vp3, vt3), vt3);
278*4bdc9457SAndroid Build Coastguard Worker     vp4 = _mm256_add_ps(_mm256_mul_ps(vp4, vt4), vt4);
279*4bdc9457SAndroid Build Coastguard Worker 
280*4bdc9457SAndroid Build Coastguard Worker     const __m256 ve0 = _mm256_mul_ps(_mm256_add_ps(vp0, vs0), valpha);
281*4bdc9457SAndroid Build Coastguard Worker     vx0 = _mm256_mul_ps(vx0, vbeta);
282*4bdc9457SAndroid Build Coastguard Worker     const __m256 ve1 = _mm256_mul_ps(_mm256_add_ps(vp1, vs1), valpha);
283*4bdc9457SAndroid Build Coastguard Worker     vx1 = _mm256_mul_ps(vx1, vbeta);
284*4bdc9457SAndroid Build Coastguard Worker     const __m256 ve2 = _mm256_mul_ps(_mm256_add_ps(vp2, vs2), valpha);
285*4bdc9457SAndroid Build Coastguard Worker     vx2 = _mm256_mul_ps(vx2, vbeta);
286*4bdc9457SAndroid Build Coastguard Worker     const __m256 ve3 = _mm256_mul_ps(_mm256_add_ps(vp3, vs3), valpha);
287*4bdc9457SAndroid Build Coastguard Worker     vx3 = _mm256_mul_ps(vx3, vbeta);
288*4bdc9457SAndroid Build Coastguard Worker     const __m256 ve4 = _mm256_mul_ps(_mm256_add_ps(vp4, vs4), valpha);
289*4bdc9457SAndroid Build Coastguard Worker     vx4 = _mm256_mul_ps(vx4, vbeta);
290*4bdc9457SAndroid Build Coastguard Worker 
291*4bdc9457SAndroid Build Coastguard Worker     const __m256 vy0 = _mm256_blendv_ps(vx0, ve0, vx0);
292*4bdc9457SAndroid Build Coastguard Worker     const __m256 vy1 = _mm256_blendv_ps(vx1, ve1, vx1);
293*4bdc9457SAndroid Build Coastguard Worker     const __m256 vy2 = _mm256_blendv_ps(vx2, ve2, vx2);
294*4bdc9457SAndroid Build Coastguard Worker     const __m256 vy3 = _mm256_blendv_ps(vx3, ve3, vx3);
295*4bdc9457SAndroid Build Coastguard Worker     const __m256 vy4 = _mm256_blendv_ps(vx4, ve4, vx4);
296*4bdc9457SAndroid Build Coastguard Worker 
297*4bdc9457SAndroid Build Coastguard Worker     _mm256_storeu_ps(y, vy0);
298*4bdc9457SAndroid Build Coastguard Worker     _mm256_storeu_ps(y + 8, vy1);
299*4bdc9457SAndroid Build Coastguard Worker     _mm256_storeu_ps(y + 16, vy2);
300*4bdc9457SAndroid Build Coastguard Worker     _mm256_storeu_ps(y + 24, vy3);
301*4bdc9457SAndroid Build Coastguard Worker     _mm256_storeu_ps(y + 32, vy4);
302*4bdc9457SAndroid Build Coastguard Worker     y += 40;
303*4bdc9457SAndroid Build Coastguard Worker   }
304*4bdc9457SAndroid Build Coastguard Worker   for (; n >= 8 * sizeof(float); n -= 8 * sizeof(float)) {
305*4bdc9457SAndroid Build Coastguard Worker     __m256 vx = _mm256_loadu_ps(x);
306*4bdc9457SAndroid Build Coastguard Worker     x += 8;
307*4bdc9457SAndroid Build Coastguard Worker 
308*4bdc9457SAndroid Build Coastguard Worker     const __m256 vz = _mm256_max_ps(vsat_cutoff, _mm256_mul_ps(vx, vprescale));
309*4bdc9457SAndroid Build Coastguard Worker 
310*4bdc9457SAndroid Build Coastguard Worker     __m256 vn = _mm256_add_ps(_mm256_mul_ps(vz, vlog2e), vmagic_bias);
311*4bdc9457SAndroid Build Coastguard Worker 
312*4bdc9457SAndroid Build Coastguard Worker     const __m256 vidx = _mm256_and_ps(vn, vindex_mask);
313*4bdc9457SAndroid Build Coastguard Worker 
314*4bdc9457SAndroid Build Coastguard Worker     const __m128i vidx_lo = _mm_slli_epi32(_mm_castps_si128(_mm256_castps256_ps128(vidx)), 2);
315*4bdc9457SAndroid Build Coastguard Worker     const __m128i vidx_hi = _mm_slli_epi32(_mm_castps_si128(_mm256_extractf128_ps(vidx, 1)), 2);
316*4bdc9457SAndroid Build Coastguard Worker     #if XNN_ARCH_X86_64
317*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx_ll = (uint64_t) _mm_cvtsi128_si64(vidx_lo);
318*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx_lh = (uint64_t) _mm_extract_epi64(vidx_lo, 1);
319*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx_hl = (uint64_t) _mm_cvtsi128_si64(vidx_hi);
320*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx_hh = (uint64_t) _mm_extract_epi64(vidx_hi, 1);
321*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_ll = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx_ll)));
322*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_lh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx_lh)));
323*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_hl = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx_hl)));
324*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_hh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx_hh)));
325*4bdc9457SAndroid Build Coastguard Worker       vl_ll = _mm_insert_epi32(vl_ll, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx_ll >> 32))), 1);
326*4bdc9457SAndroid Build Coastguard Worker       vl_lh = _mm_insert_epi32(vl_lh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx_lh >> 32))), 1);
327*4bdc9457SAndroid Build Coastguard Worker       vl_hl = _mm_insert_epi32(vl_hl, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx_hl >> 32))), 1);
328*4bdc9457SAndroid Build Coastguard Worker       vl_hh = _mm_insert_epi32(vl_hh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx_hh >> 32))), 1);
329*4bdc9457SAndroid Build Coastguard Worker     #else
330*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_ll = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_cvtsi128_si32(vidx_lo))));
331*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_lh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx_lo, 2))));
332*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_hl = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_cvtsi128_si32(vidx_hi))));
333*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_hh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx_hi, 2))));
334*4bdc9457SAndroid Build Coastguard Worker       vl_ll = _mm_insert_epi32(vl_ll, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx_lo, 1))), 1);
335*4bdc9457SAndroid Build Coastguard Worker       vl_lh = _mm_insert_epi32(vl_lh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx_lo, 3))), 1);
336*4bdc9457SAndroid Build Coastguard Worker       vl_hl = _mm_insert_epi32(vl_hl, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx_hi, 1))), 1);
337*4bdc9457SAndroid Build Coastguard Worker       vl_hh = _mm_insert_epi32(vl_hh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx_hi, 3))), 1);
338*4bdc9457SAndroid Build Coastguard Worker     #endif
339*4bdc9457SAndroid Build Coastguard Worker     const __m128i ven_lo = _mm_slli_epi32(_mm_castps_si128(_mm256_castps256_ps128(vn)), 19);
340*4bdc9457SAndroid Build Coastguard Worker     const __m128i ven_hi = _mm_slli_epi32(_mm_castps_si128(_mm256_extractf128_ps(vn, 1)), 19);
341*4bdc9457SAndroid Build Coastguard Worker 
342*4bdc9457SAndroid Build Coastguard Worker     const __m128i vl_lo = _mm_unpacklo_epi64(vl_ll, vl_lh);
343*4bdc9457SAndroid Build Coastguard Worker     const __m128i vl_hi = _mm_unpacklo_epi64(vl_hl, vl_hh);
344*4bdc9457SAndroid Build Coastguard Worker 
345*4bdc9457SAndroid Build Coastguard Worker     vn = _mm256_sub_ps(vn, vmagic_bias);
346*4bdc9457SAndroid Build Coastguard Worker     const __m128 vs_lo = _mm_castsi128_ps(_mm_add_epi32(vl_lo, ven_lo));
347*4bdc9457SAndroid Build Coastguard Worker     const __m128 vs_hi = _mm_castsi128_ps(_mm_add_epi32(vl_hi, ven_hi));
348*4bdc9457SAndroid Build Coastguard Worker 
349*4bdc9457SAndroid Build Coastguard Worker     __m256 vt = _mm256_add_ps(_mm256_mul_ps(vn, vminus_ln2_hi), vz);
350*4bdc9457SAndroid Build Coastguard Worker     vt = _mm256_add_ps(_mm256_mul_ps(vn, vminus_ln2_lo), vt);
351*4bdc9457SAndroid Build Coastguard Worker     __m256 vs = _mm256_insertf128_ps(_mm256_castps128_ps256(vs_lo), vs_hi, 1);
352*4bdc9457SAndroid Build Coastguard Worker 
353*4bdc9457SAndroid Build Coastguard Worker     __m256 vp = _mm256_add_ps(_mm256_mul_ps(vc3, vt), vc2);
354*4bdc9457SAndroid Build Coastguard Worker     vp = _mm256_mul_ps(vp, vt);
355*4bdc9457SAndroid Build Coastguard Worker 
356*4bdc9457SAndroid Build Coastguard Worker     vt = _mm256_mul_ps(vt, vs);
357*4bdc9457SAndroid Build Coastguard Worker     vs = _mm256_sub_ps(vs, vone);
358*4bdc9457SAndroid Build Coastguard Worker     vp = _mm256_add_ps(_mm256_mul_ps(vp, vt), vt);
359*4bdc9457SAndroid Build Coastguard Worker 
360*4bdc9457SAndroid Build Coastguard Worker     const __m256 ve = _mm256_mul_ps(_mm256_add_ps(vp, vs), valpha);
361*4bdc9457SAndroid Build Coastguard Worker     vx = _mm256_mul_ps(vx, vbeta);
362*4bdc9457SAndroid Build Coastguard Worker     const __m256 vy = _mm256_blendv_ps(vx, ve, vx);
363*4bdc9457SAndroid Build Coastguard Worker 
364*4bdc9457SAndroid Build Coastguard Worker     _mm256_storeu_ps(y, vy);
365*4bdc9457SAndroid Build Coastguard Worker     y += 8;
366*4bdc9457SAndroid Build Coastguard Worker   }
367*4bdc9457SAndroid Build Coastguard Worker   if XNN_UNLIKELY(n != 0) {
368*4bdc9457SAndroid Build Coastguard Worker     assert(n >= 1 * sizeof(float));
369*4bdc9457SAndroid Build Coastguard Worker     assert(n <= 7 * sizeof(float));
370*4bdc9457SAndroid Build Coastguard Worker     const __m256i vmask = _mm256_loadu_si256((const __m256i*) ((uintptr_t) &params->avx_rr2_lut16_p3.mask_table[7] - n));
371*4bdc9457SAndroid Build Coastguard Worker 
372*4bdc9457SAndroid Build Coastguard Worker     __m256 vx = _mm256_maskload_ps(x, vmask);
373*4bdc9457SAndroid Build Coastguard Worker 
374*4bdc9457SAndroid Build Coastguard Worker     const __m256 vz = _mm256_max_ps(vsat_cutoff, _mm256_mul_ps(vx, vprescale));
375*4bdc9457SAndroid Build Coastguard Worker 
376*4bdc9457SAndroid Build Coastguard Worker     __m256 vn = _mm256_add_ps(_mm256_mul_ps(vz, vlog2e), vmagic_bias);
377*4bdc9457SAndroid Build Coastguard Worker 
378*4bdc9457SAndroid Build Coastguard Worker     const __m256 vidx = _mm256_and_ps(vn, vindex_mask);
379*4bdc9457SAndroid Build Coastguard Worker 
380*4bdc9457SAndroid Build Coastguard Worker     const __m128i vidx_lo = _mm_slli_epi32(_mm_castps_si128(_mm256_castps256_ps128(vidx)), 2);
381*4bdc9457SAndroid Build Coastguard Worker     const __m128i vidx_hi = _mm_slli_epi32(_mm_castps_si128(_mm256_extractf128_ps(vidx, 1)), 2);
382*4bdc9457SAndroid Build Coastguard Worker     #if XNN_ARCH_X86_64
383*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx_ll = (uint64_t) _mm_cvtsi128_si64(vidx_lo);
384*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx_lh = (uint64_t) _mm_extract_epi64(vidx_lo, 1);
385*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx_hl = (uint64_t) _mm_cvtsi128_si64(vidx_hi);
386*4bdc9457SAndroid Build Coastguard Worker       const uint64_t vidx_hh = (uint64_t) _mm_extract_epi64(vidx_hi, 1);
387*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_ll = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx_ll)));
388*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_lh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx_lh)));
389*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_hl = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx_hl)));
390*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_hh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) vidx_hh)));
391*4bdc9457SAndroid Build Coastguard Worker       vl_ll = _mm_insert_epi32(vl_ll, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx_ll >> 32))), 1);
392*4bdc9457SAndroid Build Coastguard Worker       vl_lh = _mm_insert_epi32(vl_lh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx_lh >> 32))), 1);
393*4bdc9457SAndroid Build Coastguard Worker       vl_hl = _mm_insert_epi32(vl_hl, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx_hl >> 32))), 1);
394*4bdc9457SAndroid Build Coastguard Worker       vl_hh = _mm_insert_epi32(vl_hh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) (vidx_hh >> 32))), 1);
395*4bdc9457SAndroid Build Coastguard Worker     #else
396*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_ll = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_cvtsi128_si32(vidx_lo))));
397*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_lh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx_lo, 2))));
398*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_hl = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_cvtsi128_si32(vidx_hi))));
399*4bdc9457SAndroid Build Coastguard Worker       __m128i vl_hh = _mm_cvtsi32_si128(*((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx_hi, 2))));
400*4bdc9457SAndroid Build Coastguard Worker       vl_ll = _mm_insert_epi32(vl_ll, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx_lo, 1))), 1);
401*4bdc9457SAndroid Build Coastguard Worker       vl_lh = _mm_insert_epi32(vl_lh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx_lo, 3))), 1);
402*4bdc9457SAndroid Build Coastguard Worker       vl_hl = _mm_insert_epi32(vl_hl, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx_hi, 1))), 1);
403*4bdc9457SAndroid Build Coastguard Worker       vl_hh = _mm_insert_epi32(vl_hh, *((const int*) ((uintptr_t) xnn_table_exp2minus_k_over_16 + (uint32_t) _mm_extract_epi32(vidx_hi, 3))), 1);
404*4bdc9457SAndroid Build Coastguard Worker     #endif
405*4bdc9457SAndroid Build Coastguard Worker     const __m128i ven_lo = _mm_slli_epi32(_mm_castps_si128(_mm256_castps256_ps128(vn)), 19);
406*4bdc9457SAndroid Build Coastguard Worker     const __m128i ven_hi = _mm_slli_epi32(_mm_castps_si128(_mm256_extractf128_ps(vn, 1)), 19);
407*4bdc9457SAndroid Build Coastguard Worker 
408*4bdc9457SAndroid Build Coastguard Worker     const __m128i vl_lo = _mm_unpacklo_epi64(vl_ll, vl_lh);
409*4bdc9457SAndroid Build Coastguard Worker     const __m128i vl_hi = _mm_unpacklo_epi64(vl_hl, vl_hh);
410*4bdc9457SAndroid Build Coastguard Worker 
411*4bdc9457SAndroid Build Coastguard Worker     vn = _mm256_sub_ps(vn, vmagic_bias);
412*4bdc9457SAndroid Build Coastguard Worker     const __m128 vs_lo = _mm_castsi128_ps(_mm_add_epi32(vl_lo, ven_lo));
413*4bdc9457SAndroid Build Coastguard Worker     const __m128 vs_hi = _mm_castsi128_ps(_mm_add_epi32(vl_hi, ven_hi));
414*4bdc9457SAndroid Build Coastguard Worker 
415*4bdc9457SAndroid Build Coastguard Worker     __m256 vt = _mm256_add_ps(_mm256_mul_ps(vn, vminus_ln2_hi), vz);
416*4bdc9457SAndroid Build Coastguard Worker     vt = _mm256_add_ps(_mm256_mul_ps(vn, vminus_ln2_lo), vt);
417*4bdc9457SAndroid Build Coastguard Worker     __m256 vs = _mm256_insertf128_ps(_mm256_castps128_ps256(vs_lo), vs_hi, 1);
418*4bdc9457SAndroid Build Coastguard Worker 
419*4bdc9457SAndroid Build Coastguard Worker     __m256 vp = _mm256_add_ps(_mm256_mul_ps(vc3, vt), vc2);
420*4bdc9457SAndroid Build Coastguard Worker     vp = _mm256_mul_ps(vp, vt);
421*4bdc9457SAndroid Build Coastguard Worker 
422*4bdc9457SAndroid Build Coastguard Worker     vt = _mm256_mul_ps(vt, vs);
423*4bdc9457SAndroid Build Coastguard Worker     vs = _mm256_sub_ps(vs, vone);
424*4bdc9457SAndroid Build Coastguard Worker     vp = _mm256_add_ps(_mm256_mul_ps(vp, vt), vt);
425*4bdc9457SAndroid Build Coastguard Worker 
426*4bdc9457SAndroid Build Coastguard Worker     const __m256 ve = _mm256_mul_ps(_mm256_add_ps(vp, vs), valpha);
427*4bdc9457SAndroid Build Coastguard Worker     vx = _mm256_mul_ps(vx, vbeta);
428*4bdc9457SAndroid Build Coastguard Worker     const __m256 vy = _mm256_blendv_ps(vx, ve, vx);
429*4bdc9457SAndroid Build Coastguard Worker 
430*4bdc9457SAndroid Build Coastguard Worker     __m128 vy_lo = _mm256_castps256_ps128(vy);
431*4bdc9457SAndroid Build Coastguard Worker     if (n & (4 * sizeof(float))) {
432*4bdc9457SAndroid Build Coastguard Worker       _mm_storeu_ps(y, vy_lo);
433*4bdc9457SAndroid Build Coastguard Worker       vy_lo = _mm256_extractf128_ps(vy, 1);
434*4bdc9457SAndroid Build Coastguard Worker       y += 4;
435*4bdc9457SAndroid Build Coastguard Worker     }
436*4bdc9457SAndroid Build Coastguard Worker     if (n & (2 * sizeof(float))) {
437*4bdc9457SAndroid Build Coastguard Worker       _mm_storel_pi((__m64*) y, vy_lo);
438*4bdc9457SAndroid Build Coastguard Worker       vy_lo = _mm_movehl_ps(vy_lo, vy_lo);
439*4bdc9457SAndroid Build Coastguard Worker       y += 2;
440*4bdc9457SAndroid Build Coastguard Worker     }
441*4bdc9457SAndroid Build Coastguard Worker     if (n & (1 * sizeof(float))) {
442*4bdc9457SAndroid Build Coastguard Worker       _mm_store_ss(y, vy_lo);
443*4bdc9457SAndroid Build Coastguard Worker     }
444*4bdc9457SAndroid Build Coastguard Worker   }
445*4bdc9457SAndroid Build Coastguard Worker }
446